/ Hex Artifact Content
Login

Artifact 357e5f1b261c601f0fef1211a040cc699056298f:


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 20 20 69 6e 74  rmation */.  int
1ce0: 20 73 7a 43 68 75 6e 6b 3b 20 20 20 20 20 20 20   szChunk;       
1cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d00: 20 2f 2a 20 43 6f 6e 66 69 67 75 72 65 64 20 62   /* Configured b
1d10: 79 20 46 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49  y FCNTL_CHUNK_SI
1d20: 5a 45 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45  ZE */.#if SQLITE
1d30: 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
1d40: 53 54 59 4c 45 0a 20 20 69 6e 74 20 6f 70 65 6e  STYLE.  int open
1d50: 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20  Flags;          
1d60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1d70: 68 65 20 66 6c 61 67 73 20 73 70 65 63 69 66 69  he flags specifi
1d80: 65 64 20 61 74 20 6f 70 65 6e 28 29 20 2a 2f 0a  ed at open() */.
1d90: 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
1da0: 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
1db0: 5f 53 54 59 4c 45 20 7c 7c 20 64 65 66 69 6e 65  _STYLE || define
1dc0: 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 75  d(__APPLE__).  u
1dd0: 6e 73 69 67 6e 65 64 20 66 73 46 6c 61 67 73 3b  nsigned fsFlags;
1de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df0: 20 20 20 2f 2a 20 63 61 63 68 65 64 20 64 65 74     /* cached det
1e00: 61 69 6c 73 20 66 72 6f 6d 20 73 74 61 74 66 73  ails from statfs
1e10: 28 29 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66  () */.#endif.#if
1e20: 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 69 6e   OS_VXWORKS.  in
1e30: 74 20 69 73 44 65 6c 65 74 65 3b 20 20 20 20 20  t isDelete;     
1e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e50: 20 20 2f 2a 20 44 65 6c 65 74 65 20 6f 6e 20 63    /* Delete on c
1e60: 6c 6f 73 65 20 69 66 20 74 72 75 65 20 2a 2f 0a  lose if true */.
1e70: 20 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73    struct vxworks
1e80: 46 69 6c 65 49 64 20 2a 70 49 64 3b 20 20 20 20  FileId *pId;    
1e90: 20 20 20 20 20 20 2f 2a 20 55 6e 69 71 75 65 20        /* Unique 
1ea0: 66 69 6c 65 20 49 44 20 2a 2f 0a 23 65 6e 64 69  file ID */.#endi
1eb0: 66 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  f.#ifndef NDEBUG
1ec0: 0a 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 67  .  /* The next g
1ed0: 72 6f 75 70 20 6f 66 20 76 61 72 69 61 62 6c 65  roup of variable
1ee0: 73 20 61 72 65 20 75 73 65 64 20 74 6f 20 74 72  s are used to tr
1ef0: 61 63 6b 20 77 68 65 74 68 65 72 20 6f 72 20 6e  ack whether or n
1f00: 6f 74 20 74 68 65 0a 20 20 2a 2a 20 74 72 61 6e  ot the.  ** tran
1f10: 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20  saction counter 
1f20: 69 6e 20 62 79 74 65 73 20 32 34 2d 32 37 20 6f  in bytes 24-27 o
1f30: 66 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73  f database files
1f40: 20 61 72 65 20 75 70 64 61 74 65 64 0a 20 20 2a   are updated.  *
1f50: 2a 20 77 68 65 6e 65 76 65 72 20 61 6e 79 20 70  * whenever any p
1f60: 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 62  art of the datab
1f70: 61 73 65 20 63 68 61 6e 67 65 73 2e 20 20 41 6e  ase changes.  An
1f80: 20 61 73 73 65 72 74 69 6f 6e 20 66 61 75 6c 74   assertion fault
1f90: 20 77 69 6c 6c 0a 20 20 2a 2a 20 6f 63 63 75 72   will.  ** occur
1fa0: 20 69 66 20 61 20 66 69 6c 65 20 69 73 20 75 70   if a file is up
1fb0: 64 61 74 65 64 20 77 69 74 68 6f 75 74 20 61 6c  dated without al
1fc0: 73 6f 20 75 70 64 61 74 69 6e 67 20 74 68 65 20  so updating the 
1fd0: 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a  transaction.  **
1fe0: 20 63 6f 75 6e 74 65 72 2e 20 20 54 68 69 73 20   counter.  This 
1ff0: 74 65 73 74 20 69 73 20 6d 61 64 65 20 74 6f 20  test is made to 
2000: 61 76 6f 69 64 20 6e 65 77 20 70 72 6f 62 6c 65  avoid new proble
2010: 6d 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 74 68  ms similar to th
2020: 65 0a 20 20 2a 2a 20 6f 6e 65 20 64 65 73 63 72  e.  ** one descr
2030: 69 62 65 64 20 62 79 20 74 69 63 6b 65 74 20 23  ibed by ticket #
2040: 33 35 38 34 2e 20 0a 20 20 2a 2f 0a 20 20 75 6e  3584. .  */.  un
2050: 73 69 67 6e 65 64 20 63 68 61 72 20 74 72 61 6e  signed char tran
2060: 73 43 6e 74 72 43 68 6e 67 3b 20 20 20 2f 2a 20  sCntrChng;   /* 
2070: 54 72 75 65 20 69 66 20 74 68 65 20 74 72 61 6e  True if the tran
2080: 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20  saction counter 
2090: 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20 75 6e 73  changed */.  uns
20a0: 69 67 6e 65 64 20 63 68 61 72 20 64 62 55 70 64  igned char dbUpd
20b0: 61 74 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  ate;        /* T
20c0: 72 75 65 20 69 66 20 61 6e 79 20 70 61 72 74 20  rue if any part 
20d0: 6f 66 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  of database file
20e0: 20 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20 75 6e   changed */.  un
20f0: 73 69 67 6e 65 64 20 63 68 61 72 20 69 6e 4e 6f  signed char inNo
2100: 72 6d 61 6c 57 72 69 74 65 3b 20 20 20 2f 2a 20  rmalWrite;   /* 
2110: 54 72 75 65 20 69 66 20 69 6e 20 61 20 6e 6f 72  True if in a nor
2120: 6d 61 6c 20 77 72 69 74 65 20 6f 70 65 72 61 74  mal write operat
2130: 69 6f 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69  ion */.#endif.#i
2140: 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
2150: 0a 20 20 2f 2a 20 49 6e 20 74 65 73 74 20 6d 6f  .  /* In test mo
2160: 64 65 2c 20 69 6e 63 72 65 61 73 65 20 74 68 65  de, increase the
2170: 20 73 69 7a 65 20 6f 66 20 74 68 69 73 20 73 74   size of this st
2180: 72 75 63 74 75 72 65 20 61 20 62 69 74 20 73 6f  ructure a bit so
2190: 20 74 68 61 74 20 0a 20 20 2a 2a 20 69 74 20 69   that .  ** it i
21a0: 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  s larger than th
21b0: 65 20 73 74 72 75 63 74 20 43 72 61 73 68 46 69  e struct CrashFi
21c0: 6c 65 20 64 65 66 69 6e 65 64 20 69 6e 20 74 65  le defined in te
21d0: 73 74 36 2e 63 2e 0a 20 20 2a 2f 0a 20 20 63 68  st6.c..  */.  ch
21e0: 61 72 20 61 50 61 64 64 69 6e 67 5b 33 32 5d 3b  ar aPadding[32];
21f0: 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a  .#endif.};../*.*
2200: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
2210: 6d 61 63 72 6f 73 20 64 65 66 69 6e 65 20 62 69  macros define bi
2220: 74 73 20 69 6e 20 75 6e 69 78 46 69 6c 65 2e 66  ts in unixFile.f
2230: 69 6c 65 46 6c 61 67 73 0a 2a 2f 0a 23 64 65 66  ileFlags.*/.#def
2240: 69 6e 65 20 53 51 4c 49 54 45 5f 57 48 4f 4c 45  ine SQLITE_WHOLE
2250: 5f 46 49 4c 45 5f 4c 4f 43 4b 49 4e 47 20 20 30  _FILE_LOCKING  0
2260: 78 30 30 30 31 20 20 20 2f 2a 20 55 73 65 20 77  x0001   /* Use w
2270: 68 6f 6c 65 2d 66 69 6c 65 20 6c 6f 63 6b 69 6e  hole-file lockin
2280: 67 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 6c  g */../*.** Incl
2290: 75 64 65 20 63 6f 64 65 20 74 68 61 74 20 69 73  ude code that is
22a0: 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6f   common to all o
22b0: 73 5f 2a 2e 63 20 66 69 6c 65 73 0a 2a 2f 0a 23  s_*.c files.*/.#
22c0: 69 6e 63 6c 75 64 65 20 22 6f 73 5f 63 6f 6d 6d  include "os_comm
22d0: 6f 6e 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 44 65 66  on.h"../*.** Def
22e0: 69 6e 65 20 76 61 72 69 6f 75 73 20 6d 61 63 72  ine various macr
22f0: 6f 73 20 74 68 61 74 20 61 72 65 20 6d 69 73 73  os that are miss
2300: 69 6e 67 20 66 72 6f 6d 20 73 6f 6d 65 20 73 79  ing from some sy
2310: 73 74 65 6d 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65  stems..*/.#ifnde
2320: 66 20 4f 5f 4c 41 52 47 45 46 49 4c 45 0a 23 20  f O_LARGEFILE.# 
2330: 64 65 66 69 6e 65 20 4f 5f 4c 41 52 47 45 46 49  define O_LARGEFI
2340: 4c 45 20 30 0a 23 65 6e 64 69 66 0a 23 69 66 64  LE 0.#endif.#ifd
2350: 65 66 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c  ef SQLITE_DISABL
2360: 45 5f 4c 46 53 0a 23 20 75 6e 64 65 66 20 4f 5f  E_LFS.# undef O_
2370: 4c 41 52 47 45 46 49 4c 45 0a 23 20 64 65 66 69  LARGEFILE.# defi
2380: 6e 65 20 4f 5f 4c 41 52 47 45 46 49 4c 45 20 30  ne O_LARGEFILE 0
2390: 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20  .#endif.#ifndef 
23a0: 4f 5f 4e 4f 46 4f 4c 4c 4f 57 0a 23 20 64 65 66  O_NOFOLLOW.# def
23b0: 69 6e 65 20 4f 5f 4e 4f 46 4f 4c 4c 4f 57 20 30  ine O_NOFOLLOW 0
23c0: 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20  .#endif.#ifndef 
23d0: 4f 5f 42 49 4e 41 52 59 0a 23 20 64 65 66 69 6e  O_BINARY.# defin
23e0: 65 20 4f 5f 42 49 4e 41 52 59 20 30 0a 23 65 6e  e O_BINARY 0.#en
23f0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 44  dif../*.** The D
2400: 4a 47 50 50 20 63 6f 6d 70 69 6c 65 72 20 65 6e  JGPP compiler en
2410: 76 69 72 6f 6e 6d 65 6e 74 20 6c 6f 6f 6b 73 20  vironment looks 
2420: 6d 6f 73 74 6c 79 20 6c 69 6b 65 20 55 6e 69 78  mostly like Unix
2430: 2c 20 62 75 74 20 69 74 0a 2a 2a 20 6c 61 63 6b  , but it.** lack
2440: 73 20 74 68 65 20 66 63 6e 74 6c 28 29 20 73 79  s the fcntl() sy
2450: 73 74 65 6d 20 63 61 6c 6c 2e 20 20 53 6f 20 72  stem call.  So r
2460: 65 64 65 66 69 6e 65 20 66 63 6e 74 6c 28 29 20  edefine fcntl() 
2470: 74 6f 20 62 65 20 73 6f 6d 65 74 68 69 6e 67 0a  to be something.
2480: 2a 2a 20 74 68 61 74 20 61 6c 77 61 79 73 20 73  ** that always s
2490: 75 63 63 65 65 64 73 2e 20 20 54 68 69 73 20 6d  ucceeds.  This m
24a0: 65 61 6e 73 20 74 68 61 74 20 6c 6f 63 6b 69 6e  eans that lockin
24b0: 67 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72  g does not occur
24c0: 20 75 6e 64 65 72 0a 2a 2a 20 44 4a 47 50 50 2e   under.** DJGPP.
24d0: 20 20 42 75 74 20 69 74 20 69 73 20 44 4f 53 20    But it is DOS 
24e0: 2d 20 77 68 61 74 20 64 69 64 20 79 6f 75 20 65  - what did you e
24f0: 78 70 65 63 74 3f 0a 2a 2f 0a 23 69 66 64 65 66  xpect?.*/.#ifdef
2500: 20 5f 5f 44 4a 47 50 50 5f 5f 0a 23 20 64 65 66   __DJGPP__.# def
2510: 69 6e 65 20 66 63 6e 74 6c 28 41 2c 42 2c 43 29  ine fcntl(A,B,C)
2520: 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a   0.#endif../*.**
2530: 20 54 68 65 20 74 68 72 65 61 64 69 64 20 6d 61   The threadid ma
2540: 63 72 6f 20 72 65 73 6f 6c 76 65 73 20 74 6f 20  cro resolves to 
2550: 74 68 65 20 74 68 72 65 61 64 2d 69 64 20 6f 72  the thread-id or
2560: 20 74 6f 20 30 2e 20 20 55 73 65 64 20 66 6f 72   to 0.  Used for
2570: 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20  .** testing and 
2580: 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a  debugging only..
2590: 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48  */.#if SQLITE_TH
25a0: 52 45 41 44 53 41 46 45 0a 23 64 65 66 69 6e 65  READSAFE.#define
25b0: 20 74 68 72 65 61 64 69 64 20 70 74 68 72 65 61   threadid pthrea
25c0: 64 5f 73 65 6c 66 28 29 0a 23 65 6c 73 65 0a 23  d_self().#else.#
25d0: 64 65 66 69 6e 65 20 74 68 72 65 61 64 69 64 20  define threadid 
25e0: 30 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  0.#endif.../*.**
25f0: 20 48 65 6c 70 65 72 20 66 75 6e 63 74 69 6f 6e   Helper function
2600: 73 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e 64 20  s to obtain and 
2610: 72 65 6c 69 6e 71 75 69 73 68 20 74 68 65 20 67  relinquish the g
2620: 6c 6f 62 61 6c 20 6d 75 74 65 78 2e 20 54 68 65  lobal mutex. The
2630: 0a 2a 2a 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78  .** global mutex
2640: 20 69 73 20 75 73 65 64 20 74 6f 20 70 72 6f 74   is used to prot
2650: 65 63 74 20 74 68 65 20 75 6e 69 78 49 6e 6f 64  ect the unixInod
2660: 65 49 6e 66 6f 20 61 6e 64 0a 2a 2a 20 76 78 77  eInfo and.** vxw
2670: 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65 63  orksFileId objec
2680: 74 73 20 75 73 65 64 20 62 79 20 74 68 69 73 20  ts used by this 
2690: 66 69 6c 65 2c 20 61 6c 6c 20 6f 66 20 77 68 69  file, all of whi
26a0: 63 68 20 6d 61 79 20 62 65 20 0a 2a 2a 20 73 68  ch may be .** sh
26b0: 61 72 65 64 20 62 79 20 6d 75 6c 74 69 70 6c 65  ared by multiple
26c0: 20 74 68 72 65 61 64 73 2e 0a 2a 2a 0a 2a 2a 20   threads..**.** 
26d0: 46 75 6e 63 74 69 6f 6e 20 75 6e 69 78 4d 75 74  Function unixMut
26e0: 65 78 48 65 6c 64 28 29 20 69 73 20 75 73 65 64  exHeld() is used
26f0: 20 74 6f 20 61 73 73 65 72 74 28 29 20 74 68 61   to assert() tha
2700: 74 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74  t the global mut
2710: 65 78 20 0a 2a 2a 20 69 73 20 68 65 6c 64 20 77  ex .** is held w
2720: 68 65 6e 20 72 65 71 75 69 72 65 64 2e 20 54 68  hen required. Th
2730: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f  is function is o
2740: 6e 6c 79 20 75 73 65 64 20 61 73 20 70 61 72 74  nly used as part
2750: 20 6f 66 20 61 73 73 65 72 74 28 29 20 0a 2a 2a   of assert() .**
2760: 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 65 2e 67   statements. e.g
2770: 2e 0a 2a 2a 0a 2a 2a 20 20 20 75 6e 69 78 45 6e  ..**.**   unixEn
2780: 74 65 72 4d 75 74 65 78 28 29 0a 2a 2a 20 20 20  terMutex().**   
2790: 20 20 61 73 73 65 72 74 28 20 75 6e 69 78 4d 75    assert( unixMu
27a0: 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 2a 2a 20  texHeld() );.** 
27b0: 20 20 75 6e 69 78 45 6e 74 65 72 4c 65 61 76 65    unixEnterLeave
27c0: 28 29 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ().*/.static voi
27d0: 64 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78  d unixEnterMutex
27e0: 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65  (void){.  sqlite
27f0: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 73 71  3_mutex_enter(sq
2800: 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
2810: 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
2820: 54 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a  TIC_MASTER));.}.
2830: 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78  static void unix
2840: 4c 65 61 76 65 4d 75 74 65 78 28 76 6f 69 64 29  LeaveMutex(void)
2850: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  {.  sqlite3_mute
2860: 78 5f 6c 65 61 76 65 28 73 71 6c 69 74 65 33 4d  x_leave(sqlite3M
2870: 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45  utexAlloc(SQLITE
2880: 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41  _MUTEX_STATIC_MA
2890: 53 54 45 52 29 29 3b 0a 7d 0a 23 69 66 64 65 66  STER));.}.#ifdef
28a0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 73 74   SQLITE_DEBUG.st
28b0: 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4d 75 74  atic int unixMut
28c0: 65 78 48 65 6c 64 28 76 6f 69 64 29 20 7b 0a 20  exHeld(void) {. 
28d0: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f   return sqlite3_
28e0: 6d 75 74 65 78 5f 68 65 6c 64 28 73 71 6c 69 74  mutex_held(sqlit
28f0: 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c  e3MutexAlloc(SQL
2900: 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
2910: 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 23 65 6e  _MASTER));.}.#en
2920: 64 69 66 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c  dif...#ifdef SQL
2930: 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20  ITE_DEBUG./*.** 
2940: 48 65 6c 70 65 72 20 66 75 6e 63 74 69 6f 6e 20  Helper function 
2950: 66 6f 72 20 70 72 69 6e 74 69 6e 67 20 6f 75 74  for printing out
2960: 20 74 72 61 63 65 20 69 6e 66 6f 72 6d 61 74 69   trace informati
2970: 6f 6e 20 66 72 6f 6d 20 64 65 62 75 67 67 69 6e  on from debuggin
2980: 67 0a 2a 2a 20 62 69 6e 61 72 69 65 73 2e 20 54  g.** binaries. T
2990: 68 69 73 20 72 65 74 75 72 6e 73 20 74 68 65 20  his returns the 
29a0: 73 74 72 69 6e 67 20 72 65 70 72 65 73 65 74 61  string represeta
29b0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 75 70 70  tion of the supp
29c0: 6c 69 65 64 0a 2a 2a 20 69 6e 74 65 67 65 72 20  lied.** integer 
29d0: 6c 6f 63 6b 2d 74 79 70 65 2e 0a 2a 2f 0a 73 74  lock-type..*/.st
29e0: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
29f0: 2a 61 7a 46 69 6c 65 4c 6f 63 6b 28 69 6e 74 20  *azFileLock(int 
2a00: 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20 73 77  eFileLock){.  sw
2a10: 69 74 63 68 28 20 65 46 69 6c 65 4c 6f 63 6b 20  itch( eFileLock 
2a20: 29 7b 0a 20 20 20 20 63 61 73 65 20 4e 4f 5f 4c  ){.    case NO_L
2a30: 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 4e 4f 4e  OCK: return "NON
2a40: 45 22 3b 0a 20 20 20 20 63 61 73 65 20 53 48 41  E";.    case SHA
2a50: 52 45 44 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e  RED_LOCK: return
2a60: 20 22 53 48 41 52 45 44 22 3b 0a 20 20 20 20 63   "SHARED";.    c
2a70: 61 73 65 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  ase RESERVED_LOC
2a80: 4b 3a 20 72 65 74 75 72 6e 20 22 52 45 53 45 52  K: return "RESER
2a90: 56 45 44 22 3b 0a 20 20 20 20 63 61 73 65 20 50  VED";.    case P
2aa0: 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3a 20 72 65 74  ENDING_LOCK: ret
2ab0: 75 72 6e 20 22 50 45 4e 44 49 4e 47 22 3b 0a 20  urn "PENDING";. 
2ac0: 20 20 20 63 61 73 65 20 45 58 43 4c 55 53 49 56     case EXCLUSIV
2ad0: 45 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22  E_LOCK: return "
2ae0: 45 58 43 4c 55 53 49 56 45 22 3b 0a 20 20 7d 0a  EXCLUSIVE";.  }.
2af0: 20 20 72 65 74 75 72 6e 20 22 45 52 52 4f 52 22    return "ERROR"
2b00: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64  ;.}.#endif..#ifd
2b10: 65 66 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54  ef SQLITE_LOCK_T
2b20: 52 41 43 45 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74  RACE./*.** Print
2b30: 20 6f 75 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   out information
2b40: 20 61 62 6f 75 74 20 61 6c 6c 20 6c 6f 63 6b 69   about all locki
2b50: 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73 2e 0a 2a  ng operations..*
2b60: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
2b70: 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 72  e is used for tr
2b80: 6f 75 62 6c 65 73 68 6f 6f 74 69 6e 67 20 6c 6f  oubleshooting lo
2b90: 63 6b 73 20 6f 6e 20 6d 75 6c 74 69 74 68 72 65  cks on multithre
2ba0: 61 64 65 64 0a 2a 2a 20 70 6c 61 74 66 6f 72 6d  aded.** platform
2bb0: 73 2e 20 20 45 6e 61 62 6c 65 20 62 79 20 63 6f  s.  Enable by co
2bc0: 6d 70 69 6c 69 6e 67 20 77 69 74 68 20 74 68 65  mpiling with the
2bd0: 20 2d 44 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54   -DSQLITE_LOCK_T
2be0: 52 41 43 45 0a 2a 2a 20 63 6f 6d 6d 61 6e 64 2d  RACE.** command-
2bf0: 6c 69 6e 65 20 6f 70 74 69 6f 6e 20 6f 6e 20 74  line option on t
2c00: 68 65 20 63 6f 6d 70 69 6c 65 72 2e 20 20 54 68  he compiler.  Th
2c10: 69 73 20 63 6f 64 65 20 69 73 20 6e 6f 72 6d 61  is code is norma
2c20: 6c 6c 79 0a 2a 2a 20 74 75 72 6e 65 64 20 6f 66  lly.** turned of
2c30: 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  f..*/.static int
2c40: 20 6c 6f 63 6b 54 72 61 63 65 28 69 6e 74 20 66   lockTrace(int f
2c50: 64 2c 20 69 6e 74 20 6f 70 2c 20 73 74 72 75 63  d, int op, struc
2c60: 74 20 66 6c 6f 63 6b 20 2a 70 29 7b 0a 20 20 63  t flock *p){.  c
2c70: 68 61 72 20 2a 7a 4f 70 4e 61 6d 65 2c 20 2a 7a  har *zOpName, *z
2c80: 54 79 70 65 3b 0a 20 20 69 6e 74 20 73 3b 0a 20  Type;.  int s;. 
2c90: 20 69 6e 74 20 73 61 76 65 64 45 72 72 6e 6f 3b   int savedErrno;
2ca0: 0a 20 20 69 66 28 20 6f 70 3d 3d 46 5f 47 45 54  .  if( op==F_GET
2cb0: 4c 4b 20 29 7b 0a 20 20 20 20 7a 4f 70 4e 61 6d  LK ){.    zOpNam
2cc0: 65 20 3d 20 22 47 45 54 4c 4b 22 3b 0a 20 20 7d  e = "GETLK";.  }
2cd0: 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 46 5f 53  else if( op==F_S
2ce0: 45 54 4c 4b 20 29 7b 0a 20 20 20 20 7a 4f 70 4e  ETLK ){.    zOpN
2cf0: 61 6d 65 20 3d 20 22 53 45 54 4c 4b 22 3b 0a 20  ame = "SETLK";. 
2d00: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 20 3d 20   }else{.    s = 
2d10: 66 63 6e 74 6c 28 66 64 2c 20 6f 70 2c 20 70 29  fcntl(fd, op, p)
2d20: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  ;.    sqlite3Deb
2d30: 75 67 50 72 69 6e 74 66 28 22 66 63 6e 74 6c 20  ugPrintf("fcntl 
2d40: 75 6e 6b 6e 6f 77 6e 20 25 64 20 25 64 20 25 64  unknown %d %d %d
2d50: 5c 6e 22 2c 20 66 64 2c 20 6f 70 2c 20 73 29 3b  \n", fd, op, s);
2d60: 0a 20 20 20 20 72 65 74 75 72 6e 20 73 3b 0a 20  .    return s;. 
2d70: 20 7d 0a 20 20 69 66 28 20 70 2d 3e 6c 5f 74 79   }.  if( p->l_ty
2d80: 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20  pe==F_RDLCK ){. 
2d90: 20 20 20 7a 54 79 70 65 20 3d 20 22 52 44 4c 43     zType = "RDLC
2da0: 4b 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  K";.  }else if( 
2db0: 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 57 52 4c  p->l_type==F_WRL
2dc0: 43 4b 20 29 7b 0a 20 20 20 20 7a 54 79 70 65 20  CK ){.    zType 
2dd0: 3d 20 22 57 52 4c 43 4b 22 3b 0a 20 20 7d 65 6c  = "WRLCK";.  }el
2de0: 73 65 20 69 66 28 20 70 2d 3e 6c 5f 74 79 70 65  se if( p->l_type
2df0: 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20  ==F_UNLCK ){.   
2e00: 20 7a 54 79 70 65 20 3d 20 22 55 4e 4c 43 4b 22   zType = "UNLCK"
2e10: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
2e20: 73 73 65 72 74 28 20 30 20 29 3b 0a 20 20 7d 0a  ssert( 0 );.  }.
2e30: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6c 5f 77    assert( p->l_w
2e40: 68 65 6e 63 65 3d 3d 53 45 45 4b 5f 53 45 54 20  hence==SEEK_SET 
2e50: 29 3b 0a 20 20 73 20 3d 20 66 63 6e 74 6c 28 66  );.  s = fcntl(f
2e60: 64 2c 20 6f 70 2c 20 70 29 3b 0a 20 20 73 61 76  d, op, p);.  sav
2e70: 65 64 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b  edErrno = errno;
2e80: 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50  .  sqlite3DebugP
2e90: 72 69 6e 74 66 28 22 66 63 6e 74 6c 20 25 64 20  rintf("fcntl %d 
2ea0: 25 64 20 25 73 20 25 73 20 25 64 20 25 64 20 25  %d %s %s %d %d %
2eb0: 64 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 74 68  d %d\n",.     th
2ec0: 72 65 61 64 69 64 2c 20 66 64 2c 20 7a 4f 70 4e  readid, fd, zOpN
2ed0: 61 6d 65 2c 20 7a 54 79 70 65 2c 20 28 69 6e 74  ame, zType, (int
2ee0: 29 70 2d 3e 6c 5f 73 74 61 72 74 2c 20 28 69 6e  )p->l_start, (in
2ef0: 74 29 70 2d 3e 6c 5f 6c 65 6e 2c 0a 20 20 20 20  t)p->l_len,.    
2f00: 20 28 69 6e 74 29 70 2d 3e 6c 5f 70 69 64 2c 20   (int)p->l_pid, 
2f10: 73 29 3b 0a 20 20 69 66 28 20 73 3d 3d 28 2d 31  s);.  if( s==(-1
2f20: 29 20 26 26 20 6f 70 3d 3d 46 5f 53 45 54 4c 4b  ) && op==F_SETLK
2f30: 20 26 26 20 28 70 2d 3e 6c 5f 74 79 70 65 3d 3d   && (p->l_type==
2f40: 46 5f 52 44 4c 43 4b 20 7c 7c 20 70 2d 3e 6c 5f  F_RDLCK || p->l_
2f50: 74 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 29 20 29  type==F_WRLCK) )
2f60: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 66 6c 6f  {.    struct flo
2f70: 63 6b 20 6c 32 3b 0a 20 20 20 20 6c 32 20 3d 20  ck l2;.    l2 = 
2f80: 2a 70 3b 0a 20 20 20 20 66 63 6e 74 6c 28 66 64  *p;.    fcntl(fd
2f90: 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 32 29 3b  , F_GETLK, &l2);
2fa0: 0a 20 20 20 20 69 66 28 20 6c 32 2e 6c 5f 74 79  .    if( l2.l_ty
2fb0: 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20  pe==F_RDLCK ){. 
2fc0: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 52 44       zType = "RD
2fd0: 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c 73 65 20  LCK";.    }else 
2fe0: 69 66 28 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46  if( l2.l_type==F
2ff0: 5f 57 52 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20  _WRLCK ){.      
3000: 7a 54 79 70 65 20 3d 20 22 57 52 4c 43 4b 22 3b  zType = "WRLCK";
3010: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c  .    }else if( l
3020: 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f 55 4e 4c 43  2.l_type==F_UNLC
3030: 4b 20 29 7b 0a 20 20 20 20 20 20 7a 54 79 70 65  K ){.      zType
3040: 20 3d 20 22 55 4e 4c 43 4b 22 3b 0a 20 20 20 20   = "UNLCK";.    
3050: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
3060: 65 72 74 28 20 30 20 29 3b 0a 20 20 20 20 7d 0a  ert( 0 );.    }.
3070: 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
3080: 50 72 69 6e 74 66 28 22 66 63 6e 74 6c 2d 66 61  Printf("fcntl-fa
3090: 69 6c 75 72 65 2d 72 65 61 73 6f 6e 3a 20 25 73  ilure-reason: %s
30a0: 20 25 64 20 25 64 20 25 64 5c 6e 22 2c 0a 20 20   %d %d %d\n",.  
30b0: 20 20 20 20 20 7a 54 79 70 65 2c 20 28 69 6e 74       zType, (int
30c0: 29 6c 32 2e 6c 5f 73 74 61 72 74 2c 20 28 69 6e  )l2.l_start, (in
30d0: 74 29 6c 32 2e 6c 5f 6c 65 6e 2c 20 28 69 6e 74  t)l2.l_len, (int
30e0: 29 6c 32 2e 6c 5f 70 69 64 29 3b 0a 20 20 7d 0a  )l2.l_pid);.  }.
30f0: 20 20 65 72 72 6e 6f 20 3d 20 73 61 76 65 64 45    errno = savedE
3100: 72 72 6e 6f 3b 0a 20 20 72 65 74 75 72 6e 20 73  rrno;.  return s
3110: 3b 0a 7d 0a 23 64 65 66 69 6e 65 20 66 63 6e 74  ;.}.#define fcnt
3120: 6c 20 6c 6f 63 6b 54 72 61 63 65 0a 23 65 6e 64  l lockTrace.#end
3130: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4c 4f 43  if /* SQLITE_LOC
3140: 4b 5f 54 52 41 43 45 20 2a 2f 0a 0a 0a 0a 2f 2a  K_TRACE */..../*
3150: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
3160: 20 74 72 61 6e 73 6c 61 74 65 73 20 61 20 73 74   translates a st
3170: 61 6e 64 61 72 64 20 50 4f 53 49 58 20 65 72 72  andard POSIX err
3180: 6e 6f 20 63 6f 64 65 20 69 6e 74 6f 20 73 6f 6d  no code into som
3190: 65 74 68 69 6e 67 0a 2a 2a 20 75 73 65 66 75 6c  ething.** useful
31a0: 20 74 6f 20 74 68 65 20 63 6c 69 65 6e 74 73 20   to the clients 
31b0: 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33 20 66  of the sqlite3 f
31c0: 75 6e 63 74 69 6f 6e 73 2e 20 20 53 70 65 63 69  unctions.  Speci
31d0: 66 69 63 61 6c 6c 79 2c 20 69 74 20 69 73 0a 2a  fically, it is.*
31e0: 2a 20 69 6e 74 65 6e 64 65 64 20 74 6f 20 74 72  * intended to tr
31f0: 61 6e 73 6c 61 74 65 20 61 20 76 61 72 69 65 74  anslate a variet
3200: 79 20 6f 66 20 22 74 72 79 20 61 67 61 69 6e 22  y of "try again"
3210: 20 65 72 72 6f 72 73 20 69 6e 74 6f 20 53 51 4c   errors into SQL
3220: 49 54 45 5f 42 55 53 59 0a 2a 2a 20 61 6e 64 20  ITE_BUSY.** and 
3230: 61 20 76 61 72 69 65 74 79 20 6f 66 20 22 70 6c  a variety of "pl
3240: 65 61 73 65 20 63 6c 6f 73 65 20 74 68 65 20 66  ease close the f
3250: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 4e  ile descriptor N
3260: 4f 57 22 20 65 72 72 6f 72 73 20 69 6e 74 6f 20  OW" errors into 
3270: 0a 2a 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  .** SQLITE_IOERR
3280: 0a 2a 2a 20 0a 2a 2a 20 45 72 72 6f 72 73 20 64  .** .** Errors d
3290: 75 72 69 6e 67 20 69 6e 69 74 69 61 6c 69 7a 61  uring initializa
32a0: 74 69 6f 6e 20 6f 66 20 6c 6f 63 6b 73 2c 20 6f  tion of locks, o
32b0: 72 20 66 69 6c 65 20 73 79 73 74 65 6d 20 73 75  r file system su
32c0: 70 70 6f 72 74 20 66 6f 72 20 6c 6f 63 6b 73 2c  pport for locks,
32d0: 0a 2a 2a 20 73 68 6f 75 6c 64 20 68 61 6e 64 6c  .** should handl
32e0: 65 20 45 4e 4f 4c 43 4b 2c 20 45 4e 4f 54 53 55  e ENOLCK, ENOTSU
32f0: 50 2c 20 45 4f 50 4e 4f 54 53 55 50 50 20 73 65  P, EOPNOTSUPP se
3300: 70 61 72 61 74 65 6c 79 2e 0a 2a 2f 0a 73 74 61  parately..*/.sta
3310: 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 45 72  tic int sqliteEr
3320: 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f  rorFromPosixErro
3330: 72 28 69 6e 74 20 70 6f 73 69 78 45 72 72 6f 72  r(int posixError
3340: 2c 20 69 6e 74 20 73 71 6c 69 74 65 49 4f 45 72  , int sqliteIOEr
3350: 72 29 20 7b 0a 20 20 73 77 69 74 63 68 20 28 70  r) {.  switch (p
3360: 6f 73 69 78 45 72 72 6f 72 29 20 7b 0a 20 20 63  osixError) {.  c
3370: 61 73 65 20 30 3a 20 0a 20 20 20 20 72 65 74 75  ase 0: .    retu
3380: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
3390: 20 20 0a 20 20 63 61 73 65 20 45 41 47 41 49 4e    .  case EAGAIN
33a0: 3a 0a 20 20 63 61 73 65 20 45 54 49 4d 45 44 4f  :.  case ETIMEDO
33b0: 55 54 3a 0a 20 20 63 61 73 65 20 45 42 55 53 59  UT:.  case EBUSY
33c0: 3a 0a 20 20 63 61 73 65 20 45 49 4e 54 52 3a 0a  :.  case EINTR:.
33d0: 20 20 63 61 73 65 20 45 4e 4f 4c 43 4b 3a 20 20    case ENOLCK:  
33e0: 0a 20 20 20 20 2f 2a 20 72 61 6e 64 6f 6d 20 4e  .    /* random N
33f0: 46 53 20 72 65 74 72 79 20 65 72 72 6f 72 2c 20  FS retry error, 
3400: 75 6e 6c 65 73 73 20 64 75 72 69 6e 67 20 66 69  unless during fi
3410: 6c 65 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72  le system suppor
3420: 74 20 0a 20 20 20 20 20 2a 20 69 6e 74 72 6f 73  t .     * intros
3430: 70 65 63 74 69 6f 6e 2c 20 69 6e 20 77 68 69 63  pection, in whic
3440: 68 20 69 74 20 61 63 74 75 61 6c 6c 79 20 6d 65  h it actually me
3450: 61 6e 73 20 77 68 61 74 20 69 74 20 73 61 79 73  ans what it says
3460: 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
3470: 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
3480: 0a 20 20 63 61 73 65 20 45 41 43 43 45 53 3a 20  .  case EACCES: 
3490: 0a 20 20 20 20 2f 2a 20 45 41 43 43 45 53 20 69  .    /* EACCES i
34a0: 73 20 6c 69 6b 65 20 45 41 47 41 49 4e 20 64 75  s like EAGAIN du
34b0: 72 69 6e 67 20 6c 6f 63 6b 69 6e 67 20 6f 70 65  ring locking ope
34c0: 72 61 74 69 6f 6e 73 2c 20 62 75 74 20 6e 6f 74  rations, but not
34d0: 20 61 6e 79 20 6f 74 68 65 72 20 74 69 6d 65 2a   any other time*
34e0: 2f 0a 20 20 20 20 69 66 28 20 28 73 71 6c 69 74  /.    if( (sqlit
34f0: 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49 54 45  eIOErr == SQLITE
3500: 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 20 7c 7c 20  _IOERR_LOCK) || 
3510: 0a 09 28 73 71 6c 69 74 65 49 4f 45 72 72 20 3d  ..(sqliteIOErr =
3520: 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  = SQLITE_IOERR_U
3530: 4e 4c 4f 43 4b 29 20 7c 7c 20 0a 09 28 73 71 6c  NLOCK) || ..(sql
3540: 69 74 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49  iteIOErr == SQLI
3550: 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 29  TE_IOERR_RDLOCK)
3560: 20 7c 7c 0a 09 28 73 71 6c 69 74 65 49 4f 45 72   ||..(sqliteIOEr
3570: 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  r == SQLITE_IOER
3580: 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c  R_CHECKRESERVEDL
3590: 4f 43 4b 29 20 29 7b 0a 20 20 20 20 20 20 72 65  OCK) ){.      re
35a0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
35b0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 65  ;.    }.    /* e
35c0: 6c 73 65 20 66 61 6c 6c 20 74 68 72 6f 75 67 68  lse fall through
35d0: 20 2a 2f 0a 20 20 63 61 73 65 20 45 50 45 52 4d   */.  case EPERM
35e0: 3a 20 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  : .    return SQ
35f0: 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20 20 20 0a  LITE_PERM;.    .
3600: 20 20 63 61 73 65 20 45 44 45 41 44 4c 4b 3a 0a    case EDEADLK:.
3610: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
3620: 45 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 3b  E_IOERR_BLOCKED;
3630: 0a 20 20 20 20 0a 23 69 66 20 45 4f 50 4e 4f 54  .    .#if EOPNOT
3640: 53 55 50 50 21 3d 45 4e 4f 54 53 55 50 0a 20 20  SUPP!=ENOTSUP.  
3650: 63 61 73 65 20 45 4f 50 4e 4f 54 53 55 50 50 3a  case EOPNOTSUPP:
3660: 20 0a 20 20 20 20 2f 2a 20 73 6f 6d 65 74 68 69   .    /* somethi
3670: 6e 67 20 77 65 6e 74 20 74 65 72 72 69 62 6c 79  ng went terribly
3680: 20 61 77 72 79 2c 20 75 6e 6c 65 73 73 20 64 75   awry, unless du
3690: 72 69 6e 67 20 66 69 6c 65 20 73 79 73 74 65 6d  ring file system
36a0: 20 73 75 70 70 6f 72 74 20 0a 20 20 20 20 20 2a   support .     *
36b0: 20 69 6e 74 72 6f 73 70 65 63 74 69 6f 6e 2c 20   introspection, 
36c0: 69 6e 20 77 68 69 63 68 20 69 74 20 61 63 74 75  in which it actu
36d0: 61 6c 6c 79 20 6d 65 61 6e 73 20 77 68 61 74 20  ally means what 
36e0: 69 74 20 73 61 79 73 20 2a 2f 0a 23 65 6e 64 69  it says */.#endi
36f0: 66 0a 23 69 66 64 65 66 20 45 4e 4f 54 53 55 50  f.#ifdef ENOTSUP
3700: 0a 20 20 63 61 73 65 20 45 4e 4f 54 53 55 50 3a  .  case ENOTSUP:
3710: 20 0a 20 20 20 20 2f 2a 20 69 6e 76 61 6c 69 64   .    /* invalid
3720: 20 66 64 2c 20 75 6e 6c 65 73 73 20 64 75 72 69   fd, unless duri
3730: 6e 67 20 66 69 6c 65 20 73 79 73 74 65 6d 20 73  ng file system s
3740: 75 70 70 6f 72 74 20 69 6e 74 72 6f 73 70 65 63  upport introspec
3750: 74 69 6f 6e 2c 20 69 6e 20 77 68 69 63 68 20 0a  tion, in which .
3760: 20 20 20 20 20 2a 20 69 74 20 61 63 74 75 61 6c       * it actual
3770: 6c 79 20 6d 65 61 6e 73 20 77 68 61 74 20 69 74  ly means what it
3780: 20 73 61 79 73 20 2a 2f 0a 23 65 6e 64 69 66 0a   says */.#endif.
3790: 20 20 63 61 73 65 20 45 49 4f 3a 0a 20 20 63 61    case EIO:.  ca
37a0: 73 65 20 45 42 41 44 46 3a 0a 20 20 63 61 73 65  se EBADF:.  case
37b0: 20 45 49 4e 56 41 4c 3a 0a 20 20 63 61 73 65 20   EINVAL:.  case 
37c0: 45 4e 4f 54 43 4f 4e 4e 3a 0a 20 20 63 61 73 65  ENOTCONN:.  case
37d0: 20 45 4e 4f 44 45 56 3a 0a 20 20 63 61 73 65 20   ENODEV:.  case 
37e0: 45 4e 58 49 4f 3a 0a 20 20 63 61 73 65 20 45 4e  ENXIO:.  case EN
37f0: 4f 45 4e 54 3a 0a 20 20 63 61 73 65 20 45 53 54  OENT:.  case EST
3800: 41 4c 45 3a 0a 20 20 63 61 73 65 20 45 4e 4f 53  ALE:.  case ENOS
3810: 59 53 3a 0a 20 20 20 20 2f 2a 20 74 68 65 73 65  YS:.    /* these
3820: 20 73 68 6f 75 6c 64 20 66 6f 72 63 65 20 74 68   should force th
3830: 65 20 63 6c 69 65 6e 74 20 74 6f 20 63 6c 6f 73  e client to clos
3840: 65 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20 72  e the file and r
3850: 65 63 6f 6e 6e 65 63 74 20 2a 2f 0a 20 20 20 20  econnect */.    
3860: 0a 20 20 64 65 66 61 75 6c 74 3a 20 0a 20 20 20  .  default: .   
3870: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 49 4f   return sqliteIO
3880: 45 72 72 3b 0a 20 20 7d 0a 7d 0a 0a 0a 0a 2f 2a  Err;.  }.}..../*
3890: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
38a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
38b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
38c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
38d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
38e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
38f0: 20 42 65 67 69 6e 20 55 6e 69 71 75 65 20 46 69   Begin Unique Fi
3900: 6c 65 20 49 44 20 55 74 69 6c 69 74 79 20 55 73  le ID Utility Us
3910: 65 64 20 42 79 20 56 78 57 6f 72 6b 73 20 2a 2a  ed By VxWorks **
3920: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
3930: 0a 2a 2a 20 4f 6e 20 6d 6f 73 74 20 76 65 72 73  .** On most vers
3940: 69 6f 6e 73 20 6f 66 20 75 6e 69 78 2c 20 77 65  ions of unix, we
3950: 20 63 61 6e 20 67 65 74 20 61 20 75 6e 69 71 75   can get a uniqu
3960: 65 20 49 44 20 66 6f 72 20 61 20 66 69 6c 65 20  e ID for a file 
3970: 62 79 20 63 6f 6e 63 61 74 65 6e 61 74 69 6e 67  by concatenating
3980: 0a 2a 2a 20 74 68 65 20 64 65 76 69 63 65 20 6e  .** the device n
3990: 75 6d 62 65 72 20 61 6e 64 20 74 68 65 20 69 6e  umber and the in
39a0: 6f 64 65 20 6e 75 6d 62 65 72 2e 20 20 42 75 74  ode number.  But
39b0: 20 74 68 69 73 20 64 6f 65 73 20 6e 6f 74 20 77   this does not w
39c0: 6f 72 6b 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a  ork on VxWorks..
39d0: 2a 2a 20 4f 6e 20 56 78 57 6f 72 6b 73 2c 20 61  ** On VxWorks, a
39e0: 20 75 6e 69 71 75 65 20 66 69 6c 65 20 69 64 20   unique file id 
39f0: 6d 75 73 74 20 62 65 20 62 61 73 65 64 20 6f 6e  must be based on
3a00: 20 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c 20 66   the canonical f
3a10: 69 6c 65 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 41  ilename..**.** A
3a20: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69   pointer to an i
3a30: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66  nstance of the f
3a40: 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75  ollowing structu
3a50: 72 65 20 63 61 6e 20 62 65 20 75 73 65 64 20 61  re can be used a
3a60: 73 20 61 0a 2a 2a 20 75 6e 69 71 75 65 20 66 69  s a.** unique fi
3a70: 6c 65 20 49 44 20 69 6e 20 56 78 57 6f 72 6b 73  le ID in VxWorks
3a80: 2e 20 20 45 61 63 68 20 69 6e 73 74 61 6e 63 65  .  Each instance
3a90: 20 6f 66 20 74 68 69 73 20 73 74 72 75 63 74 75   of this structu
3aa0: 72 65 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 61  re contains.** a
3ab0: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63 61 6e   copy of the can
3ac0: 6f 6e 69 63 61 6c 20 66 69 6c 65 6e 61 6d 65 2e  onical filename.
3ad0: 20 20 54 68 65 72 65 20 69 73 20 61 6c 73 6f 20    There is also 
3ae0: 61 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  a reference coun
3af0: 74 2e 20 20 0a 2a 2a 20 54 68 65 20 73 74 72 75  t.  .** The stru
3b00: 63 74 75 72 65 20 69 73 20 72 65 63 6c 61 69 6d  cture is reclaim
3b10: 65 64 20 77 68 65 6e 20 74 68 65 20 6e 75 6d 62  ed when the numb
3b20: 65 72 20 6f 66 20 70 6f 69 6e 74 65 72 73 20 74  er of pointers t
3b30: 6f 20 69 74 20 64 72 6f 70 73 20 74 6f 0a 2a 2a  o it drops to.**
3b40: 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   zero..**.** The
3b50: 72 65 20 61 72 65 20 6e 65 76 65 72 20 76 65 72  re are never ver
3b60: 79 20 6d 61 6e 79 20 66 69 6c 65 73 20 6f 70 65  y many files ope
3b70: 6e 20 61 74 20 6f 6e 65 20 74 69 6d 65 20 61 6e  n at one time an
3b80: 64 20 6c 6f 6f 6b 75 70 73 20 61 72 65 20 6e 6f  d lookups are no
3b90: 74 0a 2a 2a 20 61 20 70 65 72 66 6f 72 6d 61 6e  t.** a performan
3ba0: 63 65 2d 63 72 69 74 69 63 61 6c 20 70 61 74 68  ce-critical path
3bb0: 2c 20 73 6f 20 69 74 20 69 73 20 73 75 66 66 69  , so it is suffi
3bc0: 63 69 65 6e 74 20 74 6f 20 70 75 74 20 74 68 65  cient to put the
3bd0: 73 65 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 73  se.** structures
3be0: 20 6f 6e 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73   on a linked lis
3bf0: 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 76 78 77  t..*/.struct vxw
3c00: 6f 72 6b 73 46 69 6c 65 49 64 20 7b 0a 20 20 73  orksFileId {.  s
3c10: 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c  truct vxworksFil
3c20: 65 49 64 20 2a 70 4e 65 78 74 3b 20 20 2f 2a 20  eId *pNext;  /* 
3c30: 4e 65 78 74 20 69 6e 20 61 20 6c 69 73 74 20 6f  Next in a list o
3c40: 66 20 74 68 65 6d 20 61 6c 6c 20 2a 2f 0a 20 20  f them all */.  
3c50: 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20  int nRef;       
3c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3c70: 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72   Number of refer
3c80: 65 6e 63 65 73 20 74 6f 20 74 68 69 73 20 6f 6e  ences to this on
3c90: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65  e */.  int nName
3ca0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3cb0: 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f       /* Length o
3cc0: 66 20 74 68 65 20 7a 43 61 6e 6f 6e 69 63 61 6c  f the zCanonical
3cd0: 4e 61 6d 65 5b 5d 20 73 74 72 69 6e 67 20 2a 2f  Name[] string */
3ce0: 0a 20 20 63 68 61 72 20 2a 7a 43 61 6e 6f 6e 69  .  char *zCanoni
3cf0: 63 61 6c 4e 61 6d 65 3b 20 20 20 20 20 20 20 20  calName;        
3d00: 20 2f 2a 20 43 61 6e 6f 6e 69 63 61 6c 20 66 69   /* Canonical fi
3d10: 6c 65 6e 61 6d 65 20 2a 2f 0a 7d 3b 0a 0a 23 69  lename */.};..#i
3d20: 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 2f 2a 20  f OS_VXWORKS./* 
3d30: 0a 2a 2a 20 41 6c 6c 20 75 6e 69 71 75 65 20 66  .** All unique f
3d40: 69 6c 65 6e 61 6d 65 73 20 61 72 65 20 68 65 6c  ilenames are hel
3d50: 64 20 6f 6e 20 61 20 6c 69 6e 6b 65 64 20 6c 69  d on a linked li
3d60: 73 74 20 68 65 61 64 65 64 20 62 79 20 74 68 69  st headed by thi
3d70: 73 0a 2a 2a 20 76 61 72 69 61 62 6c 65 3a 0a 2a  s.** variable:.*
3d80: 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20  /.static struct 
3d90: 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 76  vxworksFileId *v
3da0: 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74 20 3d  xworksFileList =
3db0: 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 53 69 6d 70 6c   0;../*.** Simpl
3dc0: 69 66 79 20 61 20 66 69 6c 65 6e 61 6d 65 20 69  ify a filename i
3dd0: 6e 74 6f 20 69 74 73 20 63 61 6e 6f 6e 69 63 61  nto its canonica
3de0: 6c 20 66 6f 72 6d 0a 2a 2a 20 62 79 20 6d 61 6b  l form.** by mak
3df0: 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ing the followin
3e00: 67 20 63 68 61 6e 67 65 73 3a 0a 2a 2a 0a 2a 2a  g changes:.**.**
3e10: 20 20 2a 20 72 65 6d 6f 76 69 6e 67 20 61 6e 79    * removing any
3e20: 20 74 72 61 69 6c 69 6e 67 20 61 6e 64 20 64 75   trailing and du
3e30: 70 6c 69 63 61 74 65 20 2f 0a 2a 2a 20 20 2a 20  plicate /.**  * 
3e40: 63 6f 6e 76 65 72 74 20 2f 2e 2f 20 69 6e 74 6f  convert /./ into
3e50: 20 6a 75 73 74 20 2f 0a 2a 2a 20 20 2a 20 63 6f   just /.**  * co
3e60: 6e 76 65 72 74 20 2f 41 2f 2e 2e 2f 20 77 68 65  nvert /A/../ whe
3e70: 72 65 20 41 20 69 73 20 61 6e 79 20 73 69 6d 70  re A is any simp
3e80: 6c 65 20 6e 61 6d 65 20 69 6e 74 6f 20 6a 75 73  le name into jus
3e90: 74 20 2f 0a 2a 2a 0a 2a 2a 20 43 68 61 6e 67 65  t /.**.** Change
3ea0: 73 20 61 72 65 20 6d 61 64 65 20 69 6e 2d 70 6c  s are made in-pl
3eb0: 61 63 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ace.  Return the
3ec0: 20 6e 65 77 20 6e 61 6d 65 20 6c 65 6e 67 74 68   new name length
3ed0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 72 69 67  ..**.** The orig
3ee0: 69 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73  inal filename is
3ef0: 20 69 6e 20 7a 5b 30 2e 2e 6e 2d 31 5d 2e 20 20   in z[0..n-1].  
3f00: 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
3f10: 72 20 6f 66 0a 2a 2a 20 63 68 61 72 61 63 74 65  r of.** characte
3f20: 72 73 20 69 6e 20 74 68 65 20 73 69 6d 70 6c 69  rs in the simpli
3f30: 66 69 65 64 20 6e 61 6d 65 2e 0a 2a 2f 0a 73 74  fied name..*/.st
3f40: 61 74 69 63 20 69 6e 74 20 76 78 77 6f 72 6b 73  atic int vxworks
3f50: 53 69 6d 70 6c 69 66 79 4e 61 6d 65 28 63 68 61  SimplifyName(cha
3f60: 72 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20 20  r *z, int n){.  
3f70: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 77 68 69 6c  int i, j;.  whil
3f80: 65 28 20 6e 3e 31 20 26 26 20 7a 5b 6e 2d 31 5d  e( n>1 && z[n-1]
3f90: 3d 3d 27 2f 27 20 29 7b 20 6e 2d 2d 3b 20 7d 0a  =='/' ){ n--; }.
3fa0: 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e    for(i=j=0; i<n
3fb0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
3fc0: 7a 5b 69 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20  z[i]=='/' ){.   
3fd0: 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27     if( z[i+1]=='
3fe0: 2f 27 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  /' ) continue;. 
3ff0: 20 20 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3d       if( z[i+1]=
4000: 3d 27 2e 27 20 26 26 20 69 2b 32 3c 6e 20 26 26  ='.' && i+2<n &&
4010: 20 7a 5b 69 2b 32 5d 3d 3d 27 2f 27 20 29 7b 0a   z[i+2]=='/' ){.
4020: 20 20 20 20 20 20 20 20 69 20 2b 3d 20 31 3b 0a          i += 1;.
4030: 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
4040: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
4050: 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27 2e 27 20  if( z[i+1]=='.' 
4060: 26 26 20 69 2b 33 3c 6e 20 26 26 20 7a 5b 69 2b  && i+3<n && z[i+
4070: 32 5d 3d 3d 27 2e 27 20 26 26 20 7a 5b 69 2b 33  2]=='.' && z[i+3
4080: 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20  ]=='/' ){.      
4090: 20 20 77 68 69 6c 65 28 20 6a 3e 30 20 26 26 20    while( j>0 && 
40a0: 7a 5b 6a 2d 31 5d 21 3d 27 2f 27 20 29 7b 20 6a  z[j-1]!='/' ){ j
40b0: 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 20 20 69 66  --; }.        if
40c0: 28 20 6a 3e 30 20 29 7b 20 6a 2d 2d 3b 20 7d 0a  ( j>0 ){ j--; }.
40d0: 20 20 20 20 20 20 20 20 69 20 2b 3d 20 32 3b 0a          i += 2;.
40e0: 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
40f0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
4100: 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69      z[j++] = z[i
4110: 5d 3b 0a 20 20 7d 0a 20 20 7a 5b 6a 5d 20 3d 20  ];.  }.  z[j] = 
4120: 30 3b 0a 20 20 72 65 74 75 72 6e 20 6a 3b 0a 7d  0;.  return j;.}
4130: 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 20 75  ../*.** Find a u
4140: 6e 69 71 75 65 20 66 69 6c 65 20 49 44 20 66 6f  nique file ID fo
4150: 72 20 74 68 65 20 67 69 76 65 6e 20 61 62 73 6f  r the given abso
4160: 6c 75 74 65 20 70 61 74 68 6e 61 6d 65 2e 20 20  lute pathname.  
4170: 52 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e  Return.** a poin
4180: 74 65 72 20 74 6f 20 74 68 65 20 76 78 77 6f 72  ter to the vxwor
4190: 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65 63 74 2e  ksFileId object.
41a0: 20 20 54 68 69 73 20 70 6f 69 6e 74 65 72 20 69    This pointer i
41b0: 73 20 74 68 65 20 75 6e 69 71 75 65 0a 2a 2a 20  s the unique.** 
41c0: 66 69 6c 65 20 49 44 2e 0a 2a 2a 0a 2a 2a 20 54  file ID..**.** T
41d0: 68 65 20 6e 52 65 66 20 66 69 65 6c 64 20 6f 66  he nRef field of
41e0: 20 74 68 65 20 76 78 77 6f 72 6b 73 46 69 6c 65   the vxworksFile
41f0: 49 64 20 6f 62 6a 65 63 74 20 69 73 20 69 6e 63  Id object is inc
4200: 72 65 6d 65 6e 74 65 64 20 62 65 66 6f 72 65 0a  remented before.
4210: 2a 2a 20 74 68 65 20 6f 62 6a 65 63 74 20 69 73  ** the object is
4220: 20 72 65 74 75 72 6e 65 64 2e 20 20 41 20 6e 65   returned.  A ne
4230: 77 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  w vxworksFileId 
4240: 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61 74 65  object is create
4250: 64 0a 2a 2a 20 61 6e 64 20 61 64 64 65 64 20 74  d.** and added t
4260: 6f 20 74 68 65 20 67 6c 6f 62 61 6c 20 6c 69 73  o the global lis
4270: 74 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a  t if necessary..
4280: 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72  **.** If a memor
4290: 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72  y allocation err
42a0: 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72  or occurs, retur
42b0: 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69  n NULL..*/.stati
42c0: 63 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73  c struct vxworks
42d0: 46 69 6c 65 49 64 20 2a 76 78 77 6f 72 6b 73 46  FileId *vxworksF
42e0: 69 6e 64 46 69 6c 65 49 64 28 63 6f 6e 73 74 20  indFileId(const 
42f0: 63 68 61 72 20 2a 7a 41 62 73 6f 6c 75 74 65 4e  char *zAbsoluteN
4300: 61 6d 65 29 7b 0a 20 20 73 74 72 75 63 74 20 76  ame){.  struct v
4310: 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 4e  xworksFileId *pN
4320: 65 77 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 73  ew;         /* s
4330: 65 61 72 63 68 20 6b 65 79 20 61 6e 64 20 6e 65  earch key and ne
4340: 77 20 66 69 6c 65 20 49 44 20 2a 2f 0a 20 20 73  w file ID */.  s
4350: 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c  truct vxworksFil
4360: 65 49 64 20 2a 70 43 61 6e 64 69 64 61 74 65 3b  eId *pCandidate;
4370: 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e     /* For loopin
4380: 67 20 6f 76 65 72 20 65 78 69 73 74 69 6e 67 20  g over existing 
4390: 66 69 6c 65 20 49 44 73 20 2a 2f 0a 20 20 69 6e  file IDs */.  in
43a0: 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  t n;            
43b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
43c0: 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 7a    /* Length of z
43d0: 41 62 73 6f 6c 75 74 65 4e 61 6d 65 20 73 74 72  AbsoluteName str
43e0: 69 6e 67 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ing */..  assert
43f0: 28 20 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65 5b  ( zAbsoluteName[
4400: 30 5d 3d 3d 27 2f 27 20 29 3b 0a 20 20 6e 20 3d  0]=='/' );.  n =
4410: 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 41 62   (int)strlen(zAb
4420: 73 6f 6c 75 74 65 4e 61 6d 65 29 3b 0a 20 20 70  soluteName);.  p
4430: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  New = sqlite3_ma
4440: 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 4e  lloc( sizeof(*pN
4450: 65 77 29 20 2b 20 28 6e 2b 31 29 20 29 3b 0a 20  ew) + (n+1) );. 
4460: 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72   if( pNew==0 ) r
4470: 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d  eturn 0;.  pNew-
4480: 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 20  >zCanonicalName 
4490: 3d 20 28 63 68 61 72 2a 29 26 70 4e 65 77 5b 31  = (char*)&pNew[1
44a0: 5d 3b 0a 20 20 6d 65 6d 63 70 79 28 70 4e 65 77  ];.  memcpy(pNew
44b0: 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65  ->zCanonicalName
44c0: 2c 20 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65 2c  , zAbsoluteName,
44d0: 20 6e 2b 31 29 3b 0a 20 20 6e 20 3d 20 76 78 77   n+1);.  n = vxw
44e0: 6f 72 6b 73 53 69 6d 70 6c 69 66 79 4e 61 6d 65  orksSimplifyName
44f0: 28 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61  (pNew->zCanonica
4500: 6c 4e 61 6d 65 2c 20 6e 29 3b 0a 0a 20 20 2f 2a  lName, n);..  /*
4510: 20 53 65 61 72 63 68 20 66 6f 72 20 61 6e 20 65   Search for an e
4520: 78 69 73 74 69 6e 67 20 65 6e 74 72 79 20 74 68  xisting entry th
4530: 61 74 20 6d 61 74 63 68 69 6e 67 20 74 68 65 20  at matching the 
4540: 63 61 6e 6f 6e 69 63 61 6c 20 6e 61 6d 65 2e 0a  canonical name..
4550: 20 20 2a 2a 20 49 66 20 66 6f 75 6e 64 2c 20 69    ** If found, i
4560: 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66  ncrement the ref
4570: 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 61 6e 64  erence count and
4580: 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
4590: 72 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 65 78  r to.  ** the ex
45a0: 69 73 74 69 6e 67 20 66 69 6c 65 20 49 44 2e 0a  isting file ID..
45b0: 20 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72    */.  unixEnter
45c0: 4d 75 74 65 78 28 29 3b 0a 20 20 66 6f 72 28 70  Mutex();.  for(p
45d0: 43 61 6e 64 69 64 61 74 65 3d 76 78 77 6f 72 6b  Candidate=vxwork
45e0: 73 46 69 6c 65 4c 69 73 74 3b 20 70 43 61 6e 64  sFileList; pCand
45f0: 69 64 61 74 65 3b 20 70 43 61 6e 64 69 64 61 74  idate; pCandidat
4600: 65 3d 70 43 61 6e 64 69 64 61 74 65 2d 3e 70 4e  e=pCandidate->pN
4610: 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 43  ext){.    if( pC
4620: 61 6e 64 69 64 61 74 65 2d 3e 6e 4e 61 6d 65 3d  andidate->nName=
4630: 3d 6e 20 0a 20 20 20 20 20 26 26 20 6d 65 6d 63  =n .     && memc
4640: 6d 70 28 70 43 61 6e 64 69 64 61 74 65 2d 3e 7a  mp(pCandidate->z
4650: 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20 70  CanonicalName, p
4660: 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e  New->zCanonicalN
4670: 61 6d 65 2c 20 6e 29 3d 3d 30 0a 20 20 20 20 29  ame, n)==0.    )
4680: 7b 0a 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  {.       sqlite3
4690: 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 20  _free(pNew);.   
46a0: 20 20 20 20 70 43 61 6e 64 69 64 61 74 65 2d 3e      pCandidate->
46b0: 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20 75  nRef++;.       u
46c0: 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
46d0: 0a 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  .       return p
46e0: 43 61 6e 64 69 64 61 74 65 3b 0a 20 20 20 20 7d  Candidate;.    }
46f0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 20 6d 61  .  }..  /* No ma
4700: 74 63 68 20 77 61 73 20 66 6f 75 6e 64 2e 20 20  tch was found.  
4710: 57 65 20 77 69 6c 6c 20 6d 61 6b 65 20 61 20 6e  We will make a n
4720: 65 77 20 66 69 6c 65 20 49 44 20 2a 2f 0a 20 20  ew file ID */.  
4730: 70 4e 65 77 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a  pNew->nRef = 1;.
4740: 20 20 70 4e 65 77 2d 3e 6e 4e 61 6d 65 20 3d 20    pNew->nName = 
4750: 6e 3b 0a 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74  n;.  pNew->pNext
4760: 20 3d 20 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69   = vxworksFileLi
4770: 73 74 3b 0a 20 20 76 78 77 6f 72 6b 73 46 69 6c  st;.  vxworksFil
4780: 65 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20  eList = pNew;.  
4790: 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
47a0: 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  ;.  return pNew;
47b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 72 65 6d  .}../*.** Decrem
47c0: 65 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e 63  ent the referenc
47d0: 65 20 63 6f 75 6e 74 20 6f 6e 20 61 20 76 78 77  e count on a vxw
47e0: 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65 63  orksFileId objec
47f0: 74 2e 20 20 46 72 65 65 0a 2a 2a 20 74 68 65 20  t.  Free.** the 
4800: 6f 62 6a 65 63 74 20 77 68 65 6e 20 74 68 65 20  object when the 
4810: 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
4820: 72 65 61 63 68 65 73 20 7a 65 72 6f 2e 0a 2a 2f  reaches zero..*/
4830: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 78 77  .static void vxw
4840: 6f 72 6b 73 52 65 6c 65 61 73 65 46 69 6c 65 49  orksReleaseFileI
4850: 64 28 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73  d(struct vxworks
4860: 46 69 6c 65 49 64 20 2a 70 49 64 29 7b 0a 20 20  FileId *pId){.  
4870: 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
4880: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 64 2d  ;.  assert( pId-
4890: 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 70 49 64  >nRef>0 );.  pId
48a0: 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20  ->nRef--;.  if( 
48b0: 70 49 64 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a  pId->nRef==0 ){.
48c0: 20 20 20 20 73 74 72 75 63 74 20 76 78 77 6f 72      struct vxwor
48d0: 6b 73 46 69 6c 65 49 64 20 2a 2a 70 70 3b 0a 20  ksFileId **pp;. 
48e0: 20 20 20 66 6f 72 28 70 70 3d 26 76 78 77 6f 72     for(pp=&vxwor
48f0: 6b 73 46 69 6c 65 4c 69 73 74 3b 20 2a 70 70 20  ksFileList; *pp 
4900: 26 26 20 2a 70 70 21 3d 70 49 64 3b 20 70 70 20  && *pp!=pId; pp 
4910: 3d 20 26 28 28 2a 70 70 29 2d 3e 70 4e 65 78 74  = &((*pp)->pNext
4920: 29 29 7b 7d 0a 20 20 20 20 61 73 73 65 72 74 28  )){}.    assert(
4930: 20 2a 70 70 3d 3d 70 49 64 20 29 3b 0a 20 20 20   *pp==pId );.   
4940: 20 2a 70 70 20 3d 20 70 49 64 2d 3e 70 4e 65 78   *pp = pId->pNex
4950: 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  t;.    sqlite3_f
4960: 72 65 65 28 70 49 64 29 3b 0a 20 20 7d 0a 20 20  ree(pId);.  }.  
4970: 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
4980: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53  ;.}.#endif /* OS
4990: 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 2f 2a 2a 2a  _VXWORKS */./***
49a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64  ************ End
49b0: 20 6f 66 20 55 6e 69 71 75 65 20 46 69 6c 65 20   of Unique File 
49c0: 49 44 20 55 74 69 6c 69 74 79 20 55 73 65 64 20  ID Utility Used 
49d0: 42 79 20 56 78 57 6f 72 6b 73 20 2a 2a 2a 2a 2a  By VxWorks *****
49e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
49f0: 2a 2a 2a 2a 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 2f 0a 0a 0a 2f 2a  **********/.../*
4a40: 2a 2a 2a 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 2a 2a  ****************
4a60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4a70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4a80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
4a90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4aa0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 50 6f 73 69 78 20  ********* Posix 
4ab0: 41 64 76 69 73 6f 72 79 20 4c 6f 63 6b 69 6e 67  Advisory Locking
4ac0: 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
4ad0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
4ae0: 0a 2a 2a 20 50 4f 53 49 58 20 61 64 76 69 73 6f  .** POSIX adviso
4af0: 72 79 20 6c 6f 63 6b 73 20 61 72 65 20 62 72 6f  ry locks are bro
4b00: 6b 65 6e 20 62 79 20 64 65 73 69 67 6e 2e 20 20  ken by design.  
4b10: 41 4e 53 49 20 53 54 44 20 31 30 30 33 2e 31 20  ANSI STD 1003.1 
4b20: 28 31 39 39 36 29 0a 2a 2a 20 73 65 63 74 69 6f  (1996).** sectio
4b30: 6e 20 36 2e 35 2e 32 2e 32 20 6c 69 6e 65 73 20  n 6.5.2.2 lines 
4b40: 34 38 33 20 74 68 72 6f 75 67 68 20 34 39 30 20  483 through 490 
4b50: 73 70 65 63 69 66 79 20 74 68 61 74 20 77 68 65  specify that whe
4b60: 6e 20 61 20 70 72 6f 63 65 73 73 0a 2a 2a 20 73  n a process.** s
4b70: 65 74 73 20 6f 72 20 63 6c 65 61 72 73 20 61 20  ets or clears a 
4b80: 6c 6f 63 6b 2c 20 74 68 61 74 20 6f 70 65 72 61  lock, that opera
4b90: 74 69 6f 6e 20 6f 76 65 72 72 69 64 65 73 20 61  tion overrides a
4ba0: 6e 79 20 70 72 69 6f 72 20 6c 6f 63 6b 73 20 73  ny prior locks s
4bb0: 65 74 0a 2a 2a 20 62 79 20 74 68 65 20 73 61 6d  et.** by the sam
4bc0: 65 20 70 72 6f 63 65 73 73 2e 20 20 49 74 20 64  e process.  It d
4bd0: 6f 65 73 20 6e 6f 74 20 65 78 70 6c 69 63 69 74  oes not explicit
4be0: 6c 79 20 73 61 79 20 73 6f 2c 20 62 75 74 20 74  ly say so, but t
4bf0: 68 69 73 20 69 6d 70 6c 69 65 73 0a 2a 2a 20 74  his implies.** t
4c00: 68 61 74 20 69 74 20 6f 76 65 72 72 69 64 65 73  hat it overrides
4c10: 20 6c 6f 63 6b 73 20 73 65 74 20 62 79 20 74 68   locks set by th
4c20: 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 75  e same process u
4c30: 73 69 6e 67 20 61 20 64 69 66 66 65 72 65 6e 74  sing a different
4c40: 0a 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70  .** file descrip
4c50: 74 6f 72 2e 20 20 43 6f 6e 73 69 64 65 72 20 74  tor.  Consider t
4c60: 68 69 73 20 74 65 73 74 20 63 61 73 65 3a 0a 2a  his test case:.*
4c70: 2a 0a 2a 2a 20 20 20 20 20 20 20 69 6e 74 20 66  *.**       int f
4c80: 64 31 20 3d 20 6f 70 65 6e 28 22 2e 2f 66 69 6c  d1 = open("./fil
4c90: 65 31 22 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43 52  e1", O_RDWR|O_CR
4ca0: 45 41 54 2c 20 30 36 34 34 29 3b 0a 2a 2a 20 20  EAT, 0644);.**  
4cb0: 20 20 20 20 20 69 6e 74 20 66 64 32 20 3d 20 6f       int fd2 = o
4cc0: 70 65 6e 28 22 2e 2f 66 69 6c 65 32 22 2c 20 4f  pen("./file2", O
4cd0: 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 2c 20 30  _RDWR|O_CREAT, 0
4ce0: 36 34 34 29 3b 0a 2a 2a 0a 2a 2a 20 53 75 70 70  644);.**.** Supp
4cf0: 6f 73 65 20 2e 2f 66 69 6c 65 31 20 61 6e 64 20  ose ./file1 and 
4d00: 2e 2f 66 69 6c 65 32 20 61 72 65 20 72 65 61 6c  ./file2 are real
4d10: 6c 79 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65  ly the same file
4d20: 20 28 62 65 63 61 75 73 65 0a 2a 2a 20 6f 6e 65   (because.** one
4d30: 20 69 73 20 61 20 68 61 72 64 20 6f 72 20 73 79   is a hard or sy
4d40: 6d 62 6f 6c 69 63 20 6c 69 6e 6b 20 74 6f 20 74  mbolic link to t
4d50: 68 65 20 6f 74 68 65 72 29 20 74 68 65 6e 20 69  he other) then i
4d60: 66 20 79 6f 75 20 73 65 74 0a 2a 2a 20 61 6e 20  f you set.** an 
4d70: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f  exclusive lock o
4d80: 6e 20 66 64 31 2c 20 74 68 65 6e 20 74 72 79 20  n fd1, then try 
4d90: 74 6f 20 67 65 74 20 61 6e 20 65 78 63 6c 75 73  to get an exclus
4da0: 69 76 65 20 6c 6f 63 6b 0a 2a 2a 20 6f 6e 20 66  ive lock.** on f
4db0: 64 32 2c 20 69 74 20 77 6f 72 6b 73 2e 20 20 49  d2, it works.  I
4dc0: 20 77 6f 75 6c 64 20 68 61 76 65 20 65 78 70 65   would have expe
4dd0: 63 74 65 64 20 74 68 65 20 73 65 63 6f 6e 64 20  cted the second 
4de0: 6c 6f 63 6b 20 74 6f 0a 2a 2a 20 66 61 69 6c 20  lock to.** fail 
4df0: 73 69 6e 63 65 20 74 68 65 72 65 20 77 61 73 20  since there was 
4e00: 61 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f  already a lock o
4e10: 6e 20 74 68 65 20 66 69 6c 65 20 64 75 65 20 74  n the file due t
4e20: 6f 20 66 64 31 2e 0a 2a 2a 20 42 75 74 20 6e 6f  o fd1..** But no
4e30: 74 20 73 6f 2e 20 20 53 69 6e 63 65 20 62 6f 74  t so.  Since bot
4e40: 68 20 6c 6f 63 6b 73 20 63 61 6d 65 20 66 72 6f  h locks came fro
4e50: 6d 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65  m the same proce
4e60: 73 73 2c 20 74 68 65 0a 2a 2a 20 73 65 63 6f 6e  ss, the.** secon
4e70: 64 20 6f 76 65 72 72 69 64 65 73 20 74 68 65 20  d overrides the 
4e80: 66 69 72 73 74 2c 20 65 76 65 6e 20 74 68 6f 75  first, even thou
4e90: 67 68 20 74 68 65 79 20 77 65 72 65 20 6f 6e 20  gh they were on 
4ea0: 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66 69 6c  different.** fil
4eb0: 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 6f 70  e descriptors op
4ec0: 65 6e 65 64 20 6f 6e 20 64 69 66 66 65 72 65 6e  ened on differen
4ed0: 74 20 66 69 6c 65 20 6e 61 6d 65 73 2e 0a 2a 2a  t file names..**
4ee0: 0a 2a 2a 20 54 68 69 73 20 6d 65 61 6e 73 20 74  .** This means t
4ef0: 68 61 74 20 77 65 20 63 61 6e 6e 6f 74 20 75 73  hat we cannot us
4f00: 65 20 50 4f 53 49 58 20 6c 6f 63 6b 73 20 74 6f  e POSIX locks to
4f10: 20 73 79 6e 63 68 72 6f 6e 69 7a 65 20 66 69 6c   synchronize fil
4f20: 65 20 61 63 63 65 73 73 0a 2a 2a 20 61 6d 6f 6e  e access.** amon
4f30: 67 20 63 6f 6d 70 65 74 69 6e 67 20 74 68 72 65  g competing thre
4f40: 61 64 73 20 6f 66 20 74 68 65 20 73 61 6d 65 20  ads of the same 
4f50: 70 72 6f 63 65 73 73 2e 20 20 50 4f 53 49 58 20  process.  POSIX 
4f60: 6c 6f 63 6b 73 20 77 69 6c 6c 20 77 6f 72 6b 20  locks will work 
4f70: 66 69 6e 65 0a 2a 2a 20 74 6f 20 73 79 6e 63 68  fine.** to synch
4f80: 72 6f 6e 69 7a 65 20 61 63 63 65 73 73 20 66 6f  ronize access fo
4f90: 72 20 74 68 72 65 61 64 73 20 69 6e 20 73 65 70  r threads in sep
4fa0: 61 72 61 74 65 20 70 72 6f 63 65 73 73 65 73 2c  arate processes,
4fb0: 20 62 75 74 20 6e 6f 74 0a 2a 2a 20 74 68 72 65   but not.** thre
4fc0: 61 64 73 20 77 69 74 68 69 6e 20 74 68 65 20 73  ads within the s
4fd0: 61 6d 65 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a  ame process..**.
4fe0: 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e  ** To work aroun
4ff0: 64 20 74 68 65 20 70 72 6f 62 6c 65 6d 2c 20 53  d the problem, S
5000: 51 4c 69 74 65 20 68 61 73 20 74 6f 20 6d 61 6e  QLite has to man
5010: 61 67 65 20 66 69 6c 65 20 6c 6f 63 6b 73 20 69  age file locks i
5020: 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 6f 6e 20  nternally.** on 
5030: 69 74 73 20 6f 77 6e 2e 20 20 57 68 65 6e 65 76  its own.  Whenev
5040: 65 72 20 61 20 6e 65 77 20 64 61 74 61 62 61 73  er a new databas
5050: 65 20 69 73 20 6f 70 65 6e 65 64 2c 20 77 65 20  e is opened, we 
5060: 68 61 76 65 20 74 6f 20 66 69 6e 64 20 74 68 65  have to find the
5070: 0a 2a 2a 20 73 70 65 63 69 66 69 63 20 69 6e 6f  .** specific ino
5080: 64 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  de of the databa
5090: 73 65 20 66 69 6c 65 20 28 74 68 65 20 69 6e 6f  se file (the ino
50a0: 64 65 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64  de is determined
50b0: 20 62 79 20 74 68 65 0a 2a 2a 20 73 74 5f 64 65   by the.** st_de
50c0: 76 20 61 6e 64 20 73 74 5f 69 6e 6f 20 66 69 65  v and st_ino fie
50d0: 6c 64 73 20 6f 66 20 74 68 65 20 73 74 61 74 20  lds of the stat 
50e0: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 66  structure that f
50f0: 73 74 61 74 28 29 20 66 69 6c 6c 73 20 69 6e 29  stat() fills in)
5100: 0a 2a 2a 20 61 6e 64 20 63 68 65 63 6b 20 66 6f  .** and check fo
5110: 72 20 6c 6f 63 6b 73 20 61 6c 72 65 61 64 79 20  r locks already 
5120: 65 78 69 73 74 69 6e 67 20 6f 6e 20 74 68 61 74  existing on that
5130: 20 69 6e 6f 64 65 2e 20 20 57 68 65 6e 20 6c 6f   inode.  When lo
5140: 63 6b 73 20 61 72 65 0a 2a 2a 20 63 72 65 61 74  cks are.** creat
5150: 65 64 20 6f 72 20 72 65 6d 6f 76 65 64 2c 20 77  ed or removed, w
5160: 65 20 68 61 76 65 20 74 6f 20 6c 6f 6f 6b 20 61  e have to look a
5170: 74 20 6f 75 72 20 6f 77 6e 20 69 6e 74 65 72 6e  t our own intern
5180: 61 6c 20 72 65 63 6f 72 64 20 6f 66 20 74 68 65  al record of the
5190: 0a 2a 2a 20 6c 6f 63 6b 73 20 74 6f 20 73 65 65  .** locks to see
51a0: 20 69 66 20 61 6e 6f 74 68 65 72 20 74 68 72 65   if another thre
51b0: 61 64 20 68 61 73 20 70 72 65 76 69 6f 75 73 6c  ad has previousl
51c0: 79 20 73 65 74 20 61 20 6c 6f 63 6b 20 6f 6e 20  y set a lock on 
51d0: 74 68 61 74 20 73 61 6d 65 0a 2a 2a 20 69 6e 6f  that same.** ino
51e0: 64 65 2e 0a 2a 2a 0a 2a 2a 20 28 41 73 69 64 65  de..**.** (Aside
51f0: 3a 20 54 68 65 20 75 73 65 20 6f 66 20 69 6e 6f  : The use of ino
5200: 64 65 20 6e 75 6d 62 65 72 73 20 61 73 20 75 6e  de numbers as un
5210: 69 71 75 65 20 49 44 73 20 64 6f 65 73 20 6e 6f  ique IDs does no
5220: 74 20 77 6f 72 6b 20 6f 6e 20 56 78 57 6f 72 6b  t work on VxWork
5230: 73 2e 0a 2a 2a 20 46 6f 72 20 56 78 57 6f 72 6b  s..** For VxWork
5240: 73 2c 20 77 65 20 68 61 76 65 20 74 6f 20 75 73  s, we have to us
5250: 65 20 74 68 65 20 61 6c 74 65 72 6e 61 74 69 76  e the alternativ
5260: 65 20 75 6e 69 71 75 65 20 49 44 20 73 79 73 74  e unique ID syst
5270: 65 6d 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 63  em based on.** c
5280: 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65 6e 61 6d  anonical filenam
5290: 65 20 61 6e 64 20 69 6d 70 6c 65 6d 65 6e 74 65  e and implemente
52a0: 64 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75  d in the previou
52b0: 73 20 64 69 76 69 73 69 6f 6e 2e 29 0a 2a 2a 0a  s division.).**.
52c0: 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33 5f 66  ** The sqlite3_f
52d0: 69 6c 65 20 73 74 72 75 63 74 75 72 65 20 66 6f  ile structure fo
52e0: 72 20 50 4f 53 49 58 20 69 73 20 6e 6f 20 6c 6f  r POSIX is no lo
52f0: 6e 67 65 72 20 6a 75 73 74 20 61 6e 20 69 6e 74  nger just an int
5300: 65 67 65 72 20 66 69 6c 65 0a 2a 2a 20 64 65 73  eger file.** des
5310: 63 72 69 70 74 6f 72 2e 20 20 49 74 20 69 73 20  criptor.  It is 
5320: 6e 6f 77 20 61 20 73 74 72 75 63 74 75 72 65 20  now a structure 
5330: 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65 20 69  that holds the i
5340: 6e 74 65 67 65 72 20 66 69 6c 65 0a 2a 2a 20 64  nteger file.** d
5350: 65 73 63 72 69 70 74 6f 72 20 61 6e 64 20 61 20  escriptor and a 
5360: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74 72  pointer to a str
5370: 75 63 74 75 72 65 20 74 68 61 74 20 64 65 73 63  ucture that desc
5380: 72 69 62 65 73 20 74 68 65 20 69 6e 74 65 72 6e  ribes the intern
5390: 61 6c 0a 2a 2a 20 6c 6f 63 6b 73 20 6f 6e 20 74  al.** locks on t
53a0: 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
53b0: 20 69 6e 6f 64 65 2e 20 20 54 68 65 72 65 20 69   inode.  There i
53c0: 73 20 6f 6e 65 20 6c 6f 63 6b 69 6e 67 20 73 74  s one locking st
53d0: 72 75 63 74 75 72 65 0a 2a 2a 20 70 65 72 20 69  ructure.** per i
53e0: 6e 6f 64 65 2c 20 73 6f 20 69 66 20 74 68 65 20  node, so if the 
53f0: 73 61 6d 65 20 69 6e 6f 64 65 20 69 73 20 6f 70  same inode is op
5400: 65 6e 65 64 20 74 77 69 63 65 2c 20 62 6f 74 68  ened twice, both
5410: 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63 74   unixFile struct
5420: 75 72 65 73 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f  ures.** point to
5430: 20 74 68 65 20 73 61 6d 65 20 6c 6f 63 6b 69 6e   the same lockin
5440: 67 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68  g structure.  Th
5450: 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63 74  e locking struct
5460: 75 72 65 20 6b 65 65 70 73 0a 2a 2a 20 61 20 72  ure keeps.** a r
5470: 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 28  eference count (
5480: 73 6f 20 77 65 20 77 69 6c 6c 20 6b 6e 6f 77 20  so we will know 
5490: 77 68 65 6e 20 74 6f 20 64 65 6c 65 74 65 20 69  when to delete i
54a0: 74 29 20 61 6e 64 20 61 20 22 63 6e 74 22 0a 2a  t) and a "cnt".*
54b0: 2a 20 66 69 65 6c 64 20 74 68 61 74 20 74 65 6c  * field that tel
54c0: 6c 73 20 75 73 20 69 74 73 20 69 6e 74 65 72 6e  ls us its intern
54d0: 61 6c 20 6c 6f 63 6b 20 73 74 61 74 75 73 2e 20  al lock status. 
54e0: 20 63 6e 74 3d 3d 30 20 6d 65 61 6e 73 20 74 68   cnt==0 means th
54f0: 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20 75 6e 6c  e.** file is unl
5500: 6f 63 6b 65 64 2e 20 20 63 6e 74 3d 3d 2d 31 20  ocked.  cnt==-1 
5510: 6d 65 61 6e 73 20 74 68 65 20 66 69 6c 65 20 68  means the file h
5520: 61 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  as an exclusive 
5530: 6c 6f 63 6b 2e 0a 2a 2a 20 63 6e 74 3e 30 20 6d  lock..** cnt>0 m
5540: 65 61 6e 73 20 74 68 65 72 65 20 61 72 65 20 63  eans there are c
5550: 6e 74 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20  nt shared locks 
5560: 6f 6e 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a  on the file..**.
5570: 2a 2a 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74  ** Any attempt t
5580: 6f 20 6c 6f 63 6b 20 6f 72 20 75 6e 6c 6f 63 6b  o lock or unlock
5590: 20 61 20 66 69 6c 65 20 66 69 72 73 74 20 63 68   a file first ch
55a0: 65 63 6b 73 20 74 68 65 20 6c 6f 63 6b 69 6e 67  ecks the locking
55b0: 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 20 20  .** structure.  
55c0: 54 68 65 20 66 63 6e 74 6c 28 29 20 73 79 73 74  The fcntl() syst
55d0: 65 6d 20 63 61 6c 6c 20 69 73 20 6f 6e 6c 79 20  em call is only 
55e0: 69 6e 76 6f 6b 65 64 20 74 6f 20 73 65 74 20 61  invoked to set a
55f0: 20 0a 2a 2a 20 50 4f 53 49 58 20 6c 6f 63 6b 20   .** POSIX lock 
5600: 69 66 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  if the internal 
5610: 6c 6f 63 6b 20 73 74 72 75 63 74 75 72 65 20 74  lock structure t
5620: 72 61 6e 73 69 74 69 6f 6e 73 20 62 65 74 77 65  ransitions betwe
5630: 65 6e 0a 2a 2a 20 61 20 6c 6f 63 6b 65 64 20 61  en.** a locked a
5640: 6e 64 20 61 6e 20 75 6e 6c 6f 63 6b 65 64 20 73  nd an unlocked s
5650: 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 42 75 74 20  tate..**.** But 
5660: 77 61 69 74 3a 20 20 74 68 65 72 65 20 61 72 65  wait:  there are
5670: 20 79 65 74 20 6d 6f 72 65 20 70 72 6f 62 6c 65   yet more proble
5680: 6d 73 20 77 69 74 68 20 50 4f 53 49 58 20 61 64  ms with POSIX ad
5690: 76 69 73 6f 72 79 20 6c 6f 63 6b 73 2e 0a 2a 2a  visory locks..**
56a0: 0a 2a 2a 20 49 66 20 79 6f 75 20 63 6c 6f 73 65  .** If you close
56b0: 20 61 20 66 69 6c 65 20 64 65 73 63 72 69 70 74   a file descript
56c0: 6f 72 20 74 68 61 74 20 70 6f 69 6e 74 73 20 74  or that points t
56d0: 6f 20 61 20 66 69 6c 65 20 74 68 61 74 20 68 61  o a file that ha
56e0: 73 20 6c 6f 63 6b 73 2c 0a 2a 2a 20 61 6c 6c 20  s locks,.** all 
56f0: 6c 6f 63 6b 73 20 6f 6e 20 74 68 61 74 20 66 69  locks on that fi
5700: 6c 65 20 74 68 61 74 20 61 72 65 20 6f 77 6e 65  le that are owne
5710: 64 20 62 79 20 74 68 65 20 63 75 72 72 65 6e 74  d by the current
5720: 20 70 72 6f 63 65 73 73 20 61 72 65 0a 2a 2a 20   process are.** 
5730: 72 65 6c 65 61 73 65 64 2e 20 20 54 6f 20 77 6f  released.  To wo
5740: 72 6b 20 61 72 6f 75 6e 64 20 74 68 69 73 20 70  rk around this p
5750: 72 6f 62 6c 65 6d 2c 20 65 61 63 68 20 75 6e 69  roblem, each uni
5760: 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63  xInodeInfo objec
5770: 74 0a 2a 2a 20 6d 61 69 6e 74 61 69 6e 73 20 61  t.** maintains a
5780: 20 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 6e 75   count of the nu
5790: 6d 62 65 72 20 6f 66 20 70 65 6e 64 69 6e 67 20  mber of pending 
57a0: 6c 6f 63 6b 73 20 6f 6e 20 74 68 61 20 69 6e 6f  locks on tha ino
57b0: 64 65 2e 0a 2a 2a 20 57 68 65 6e 20 61 6e 20 61  de..** When an a
57c0: 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74  ttempt is made t
57d0: 6f 20 63 6c 6f 73 65 20 61 6e 20 75 6e 69 78 46  o close an unixF
57e0: 69 6c 65 2c 20 69 66 20 74 68 65 72 65 20 61 72  ile, if there ar
57f0: 65 0a 2a 2a 20 6f 74 68 65 72 20 75 6e 69 78 46  e.** other unixF
5800: 69 6c 65 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20  ile open on the 
5810: 73 61 6d 65 20 69 6e 6f 64 65 20 74 68 61 74 20  same inode that 
5820: 61 72 65 20 68 6f 6c 64 69 6e 67 20 6c 6f 63 6b  are holding lock
5830: 73 2c 20 74 68 65 20 63 61 6c 6c 0a 2a 2a 20 74  s, the call.** t
5840: 6f 20 63 6c 6f 73 65 28 29 20 74 68 65 20 66 69  o close() the fi
5850: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73  le descriptor is
5860: 20 64 65 66 65 72 72 65 64 20 75 6e 74 69 6c 20   deferred until 
5870: 61 6c 6c 20 6f 66 20 74 68 65 20 6c 6f 63 6b 73  all of the locks
5880: 20 63 6c 65 61 72 2e 0a 2a 2a 20 54 68 65 20 75   clear..** The u
5890: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 73 74 72  nixInodeInfo str
58a0: 75 63 74 75 72 65 20 6b 65 65 70 73 20 61 20 6c  ucture keeps a l
58b0: 69 73 74 20 6f 66 20 66 69 6c 65 20 64 65 73 63  ist of file desc
58c0: 72 69 70 74 6f 72 73 20 74 68 61 74 20 6e 65 65  riptors that nee
58d0: 64 20 74 6f 0a 2a 2a 20 62 65 20 63 6c 6f 73 65  d to.** be close
58e0: 64 20 61 6e 64 20 74 68 61 74 20 6c 69 73 74 20  d and that list 
58f0: 69 73 20 77 61 6c 6b 65 64 20 28 61 6e 64 20 63  is walked (and c
5900: 6c 65 61 72 65 64 29 20 77 68 65 6e 20 74 68 65  leared) when the
5910: 20 6c 61 73 74 20 6c 6f 63 6b 0a 2a 2a 20 63 6c   last lock.** cl
5920: 65 61 72 73 2e 0a 2a 2a 0a 2a 2a 20 59 65 74 20  ears..**.** Yet 
5930: 61 6e 6f 74 68 65 72 20 70 72 6f 62 6c 65 6d 3a  another problem:
5940: 20 20 4c 69 6e 75 78 54 68 72 65 61 64 73 20 64    LinuxThreads d
5950: 6f 20 6e 6f 74 20 70 6c 61 79 20 77 65 6c 6c 20  o not play well 
5960: 77 69 74 68 20 70 6f 73 69 78 20 6c 6f 63 6b 73  with posix locks
5970: 2e 0a 2a 2a 0a 2a 2a 20 4d 61 6e 79 20 6f 6c 64  ..**.** Many old
5980: 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 6c  er versions of l
5990: 69 6e 75 78 20 75 73 65 20 74 68 65 20 4c 69 6e  inux use the Lin
59a0: 75 78 54 68 72 65 61 64 73 20 6c 69 62 72 61 72  uxThreads librar
59b0: 79 20 77 68 69 63 68 20 69 73 0a 2a 2a 20 6e 6f  y which is.** no
59c0: 74 20 70 6f 73 69 78 20 63 6f 6d 70 6c 69 61 6e  t posix complian
59d0: 74 2e 20 20 55 6e 64 65 72 20 4c 69 6e 75 78 54  t.  Under LinuxT
59e0: 68 72 65 61 64 73 2c 20 61 20 6c 6f 63 6b 20 63  hreads, a lock c
59f0: 72 65 61 74 65 64 20 62 79 20 74 68 72 65 61 64  reated by thread
5a00: 0a 2a 2a 20 41 20 63 61 6e 6e 6f 74 20 62 65 20  .** A cannot be 
5a10: 6d 6f 64 69 66 69 65 64 20 6f 72 20 6f 76 65 72  modified or over
5a20: 72 69 64 64 65 6e 20 62 79 20 61 20 64 69 66 66  ridden by a diff
5a30: 65 72 65 6e 74 20 74 68 72 65 61 64 20 42 2e 0a  erent thread B..
5a40: 2a 2a 20 4f 6e 6c 79 20 74 68 72 65 61 64 20 41  ** Only thread A
5a50: 20 63 61 6e 20 6d 6f 64 69 66 79 20 74 68 65 20   can modify the 
5a60: 6c 6f 63 6b 2e 20 20 4c 6f 63 6b 69 6e 67 20 62  lock.  Locking b
5a70: 65 68 61 76 69 6f 72 20 69 73 20 63 6f 72 72 65  ehavior is corre
5a80: 63 74 0a 2a 2a 20 69 66 20 74 68 65 20 61 70 70  ct.** if the app
5a90: 6c 69 61 74 69 6f 6e 20 75 73 65 73 20 74 68 65  liation uses the
5aa0: 20 6e 65 77 65 72 20 4e 61 74 69 76 65 20 50 6f   newer Native Po
5ab0: 73 69 78 20 54 68 72 65 61 64 20 4c 69 62 72 61  six Thread Libra
5ac0: 72 79 20 28 4e 50 54 4c 29 0a 2a 2a 20 6f 6e 20  ry (NPTL).** on 
5ad0: 6c 69 6e 75 78 20 2d 20 77 69 74 68 20 4e 50 54  linux - with NPT
5ae0: 4c 20 61 20 6c 6f 63 6b 20 63 72 65 61 74 65 64  L a lock created
5af0: 20 62 79 20 74 68 72 65 61 64 20 41 20 63 61 6e   by thread A can
5b00: 20 6f 76 65 72 72 69 64 65 20 6c 6f 63 6b 73 0a   override locks.
5b10: 2a 2a 20 69 6e 20 74 68 72 65 61 64 20 42 2e 20  ** in thread B. 
5b20: 20 42 75 74 20 74 68 65 72 65 20 69 73 20 6e 6f   But there is no
5b30: 20 77 61 79 20 74 6f 20 6b 6e 6f 77 20 61 74 20   way to know at 
5b40: 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 77 68 69  compile-time whi
5b50: 63 68 0a 2a 2a 20 74 68 72 65 61 64 69 6e 67 20  ch.** threading 
5b60: 6c 69 62 72 61 72 79 20 69 73 20 62 65 69 6e 67  library is being
5b70: 20 75 73 65 64 2e 20 20 53 6f 20 74 68 65 72 65   used.  So there
5b80: 20 69 73 20 6e 6f 20 77 61 79 20 74 6f 20 6b 6e   is no way to kn
5b90: 6f 77 20 61 74 0a 2a 2a 20 63 6f 6d 70 69 6c 65  ow at.** compile
5ba0: 2d 74 69 6d 65 20 77 68 65 74 68 65 72 20 6f 72  -time whether or
5bb0: 20 6e 6f 74 20 74 68 72 65 61 64 20 41 20 63 61   not thread A ca
5bc0: 6e 20 6f 76 65 72 72 69 64 65 20 6c 6f 63 6b 73  n override locks
5bd0: 20 6f 6e 20 74 68 72 65 61 64 20 42 2e 0a 2a 2a   on thread B..**
5be0: 20 4f 6e 65 20 68 61 73 20 74 6f 20 64 6f 20 61   One has to do a
5bf0: 20 72 75 6e 2d 74 69 6d 65 20 63 68 65 63 6b 20   run-time check 
5c00: 74 6f 20 64 69 73 63 6f 76 65 72 20 74 68 65 20  to discover the 
5c10: 62 65 68 61 76 69 6f 72 20 6f 66 20 74 68 65 0a  behavior of the.
5c20: 2a 2a 20 63 75 72 72 65 6e 74 20 70 72 6f 63 65  ** current proce
5c30: 73 73 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65  ss..**.** SQLite
5c40: 20 75 73 65 64 20 74 6f 20 73 75 70 70 6f 72 74   used to support
5c50: 20 4c 69 6e 75 78 54 68 72 65 61 64 73 2e 20 20   LinuxThreads.  
5c60: 42 75 74 20 73 75 70 70 6f 72 74 20 66 6f 72 20  But support for 
5c70: 4c 69 6e 75 78 54 68 72 65 61 64 73 0a 2a 2a 20  LinuxThreads.** 
5c80: 77 61 73 20 64 72 6f 70 70 65 64 20 62 65 67 69  was dropped begi
5c90: 6e 6e 69 6e 67 20 77 69 74 68 20 76 65 72 73 69  nning with versi
5ca0: 6f 6e 20 33 2e 37 2e 30 2e 20 20 53 51 4c 69 74  on 3.7.0.  SQLit
5cb0: 65 20 77 69 6c 6c 20 73 74 69 6c 6c 20 77 6f 72  e will still wor
5cc0: 6b 20 77 69 74 68 0a 2a 2a 20 4c 69 6e 75 78 54  k with.** LinuxT
5cd0: 68 72 65 61 64 73 20 70 72 6f 76 69 64 65 64 20  hreads provided 
5ce0: 74 68 61 74 20 28 31 29 20 74 68 65 72 65 20 69  that (1) there i
5cf0: 73 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f  s no more than o
5d00: 6e 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a 2a  ne connection .*
5d10: 2a 20 70 65 72 20 64 61 74 61 62 61 73 65 20 66  * per database f
5d20: 69 6c 65 20 69 6e 20 74 68 65 20 73 61 6d 65 20  ile in the same 
5d30: 70 72 6f 63 65 73 73 20 61 6e 64 20 28 32 29 20  process and (2) 
5d40: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
5d50: 69 6f 6e 73 0a 2a 2a 20 64 6f 20 6e 6f 74 20 6d  ions.** do not m
5d60: 6f 76 65 20 61 63 72 6f 73 73 20 74 68 72 65 61  ove across threa
5d70: 64 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e  ds..*/../*.** An
5d80: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
5d90: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
5da0: 74 75 72 65 20 73 65 72 76 65 73 20 61 73 20 74  ture serves as t
5db0: 68 65 20 6b 65 79 20 75 73 65 64 0a 2a 2a 20 74  he key used.** t
5dc0: 6f 20 6c 6f 63 61 74 65 20 61 20 70 61 72 74 69  o locate a parti
5dd0: 63 75 6c 61 72 20 75 6e 69 78 49 6e 6f 64 65 49  cular unixInodeI
5de0: 6e 66 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73  nfo object..*/.s
5df0: 74 72 75 63 74 20 75 6e 69 78 46 69 6c 65 49 64  truct unixFileId
5e00: 20 7b 0a 20 20 64 65 76 5f 74 20 64 65 76 3b 20   {.  dev_t dev; 
5e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e20: 20 2f 2a 20 44 65 76 69 63 65 20 6e 75 6d 62 65   /* Device numbe
5e30: 72 20 2a 2f 0a 23 69 66 20 4f 53 5f 56 58 57 4f  r */.#if OS_VXWO
5e40: 52 4b 53 0a 20 20 73 74 72 75 63 74 20 76 78 77  RKS.  struct vxw
5e50: 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 49 64 3b  orksFileId *pId;
5e60: 20 20 2f 2a 20 55 6e 69 71 75 65 20 66 69 6c 65    /* Unique file
5e70: 20 49 44 20 66 6f 72 20 76 78 77 6f 72 6b 73 2e   ID for vxworks.
5e80: 20 2a 2f 0a 23 65 6c 73 65 0a 20 20 69 6e 6f 5f   */.#else.  ino_
5e90: 74 20 69 6e 6f 3b 20 20 20 20 20 20 20 20 20 20  t ino;          
5ea0: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 6f 64 65          /* Inode
5eb0: 20 6e 75 6d 62 65 72 20 2a 2f 0a 23 65 6e 64 69   number */.#endi
5ec0: 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69  f.};../*.** An i
5ed0: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66  nstance of the f
5ee0: 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75  ollowing structu
5ef0: 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  re is allocated 
5f00: 66 6f 72 20 65 61 63 68 20 6f 70 65 6e 0a 2a 2a  for each open.**
5f10: 20 69 6e 6f 64 65 2e 20 20 4f 72 2c 20 6f 6e 20   inode.  Or, on 
5f20: 4c 69 6e 75 78 54 68 72 65 61 64 73 2c 20 74 68  LinuxThreads, th
5f30: 65 72 65 20 69 73 20 6f 6e 65 20 6f 66 20 74 68  ere is one of th
5f40: 65 73 65 20 73 74 72 75 63 74 75 72 65 73 20 66  ese structures f
5f50: 6f 72 0a 2a 2a 20 65 61 63 68 20 69 6e 6f 64 65  or.** each inode
5f60: 20 6f 70 65 6e 65 64 20 62 79 20 65 61 63 68 20   opened by each 
5f70: 74 68 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 41 20  thread..**.** A 
5f80: 73 69 6e 67 6c 65 20 69 6e 6f 64 65 20 63 61 6e  single inode can
5f90: 20 68 61 76 65 20 6d 75 6c 74 69 70 6c 65 20 66   have multiple f
5fa0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 2c  ile descriptors,
5fb0: 20 73 6f 20 65 61 63 68 20 75 6e 69 78 46 69 6c   so each unixFil
5fc0: 65 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 63  e.** structure c
5fd0: 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65  ontains a pointe
5fe0: 72 20 74 6f 20 61 6e 20 69 6e 73 74 61 6e 63 65  r to an instance
5ff0: 20 6f 66 20 74 68 69 73 20 6f 62 6a 65 63 74 20   of this object 
6000: 61 6e 64 20 74 68 69 73 0a 2a 2a 20 6f 62 6a 65  and this.** obje
6010: 63 74 20 6b 65 65 70 73 20 61 20 63 6f 75 6e 74  ct keeps a count
6020: 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   of the number o
6030: 66 20 75 6e 69 78 46 69 6c 65 20 70 6f 69 6e 74  f unixFile point
6040: 69 6e 67 20 74 6f 20 69 74 2e 0a 2a 2f 0a 73 74  ing to it..*/.st
6050: 72 75 63 74 20 75 6e 69 78 49 6e 6f 64 65 49 6e  ruct unixInodeIn
6060: 66 6f 20 7b 0a 20 20 73 74 72 75 63 74 20 75 6e  fo {.  struct un
6070: 69 78 46 69 6c 65 49 64 20 66 69 6c 65 49 64 3b  ixFileId fileId;
6080: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f         /* The lo
6090: 6f 6b 75 70 20 6b 65 79 20 2a 2f 0a 20 20 69 6e  okup key */.  in
60a0: 74 20 6e 53 68 61 72 65 64 3b 20 20 20 20 20 20  t nShared;      
60b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
60c0: 20 4e 75 6d 62 65 72 20 6f 66 20 53 48 41 52 45   Number of SHARE
60d0: 44 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a  D locks held */.
60e0: 20 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 3b    int eFileLock;
60f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6100: 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 53 48 41 52    /* One of SHAR
6110: 45 44 5f 4c 4f 43 4b 2c 20 52 45 53 45 52 56 45  ED_LOCK, RESERVE
6120: 44 5f 4c 4f 43 4b 20 65 74 63 2e 20 2a 2f 0a 20  D_LOCK etc. */. 
6130: 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20   int nRef;      
6140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6150: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 6f   /* Number of po
6160: 69 6e 74 65 72 73 20 74 6f 20 74 68 69 73 20 73  inters to this s
6170: 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 75 6e  tructure */.  un
6180: 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e  ixShmNode *pShmN
6190: 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ode;          /*
61a0: 20 53 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 61   Shared memory a
61b0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
61c0: 68 69 73 20 69 6e 6f 64 65 20 2a 2f 0a 20 20 69  his inode */.  i
61d0: 6e 74 20 6e 4c 6f 63 6b 3b 20 20 20 20 20 20 20  nt nLock;       
61e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
61f0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f 75 74 73  * Number of outs
6200: 74 61 6e 64 69 6e 67 20 66 69 6c 65 20 6c 6f 63  tanding file loc
6210: 6b 73 20 2a 2f 0a 20 20 55 6e 69 78 55 6e 75 73  ks */.  UnixUnus
6220: 65 64 46 64 20 2a 70 55 6e 75 73 65 64 3b 20 20  edFd *pUnused;  
6230: 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 75 73 65          /* Unuse
6240: 64 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  d file descripto
6250: 72 73 20 74 6f 20 63 6c 6f 73 65 20 2a 2f 0a 20  rs to close */. 
6260: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
6270: 70 4e 65 78 74 3b 20 20 20 20 20 20 20 20 20 20  pNext;          
6280: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61 6c 6c 20   /* List of all 
6290: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62  unixInodeInfo ob
62a0: 6a 65 63 74 73 20 2a 2f 0a 20 20 75 6e 69 78 49  jects */.  unixI
62b0: 6e 6f 64 65 49 6e 66 6f 20 2a 70 50 72 65 76 3b  nodeInfo *pPrev;
62c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20             /*   
62d0: 20 2e 2e 2e 2e 20 64 6f 75 62 6c 79 20 6c 69 6e   .... doubly lin
62e0: 6b 65 64 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e  ked */.#if defin
62f0: 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
6300: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 29 0a  _LOCKING_STYLE).
6310: 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20    unsigned long 
6320: 6c 6f 6e 67 20 73 68 61 72 65 64 42 79 74 65 3b  long sharedByte;
6330: 20 20 2f 2a 20 66 6f 72 20 41 46 50 20 73 69 6d    /* for AFP sim
6340: 75 6c 61 74 65 64 20 73 68 61 72 65 64 20 6c 6f  ulated shared lo
6350: 63 6b 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66  ck */.#endif.#if
6360: 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73 65   OS_VXWORKS.  se
6370: 6d 5f 74 20 2a 70 53 65 6d 3b 20 20 20 20 20 20  m_t *pSem;      
6380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6390: 20 4e 61 6d 65 64 20 50 4f 53 49 58 20 73 65 6d   Named POSIX sem
63a0: 61 70 68 6f 72 65 20 2a 2f 0a 20 20 63 68 61 72  aphore */.  char
63b0: 20 61 53 65 6d 4e 61 6d 65 5b 4d 41 58 5f 50 41   aSemName[MAX_PA
63c0: 54 48 4e 41 4d 45 2b 32 5d 3b 20 20 2f 2a 20 4e  THNAME+2];  /* N
63d0: 61 6d 65 20 6f 66 20 74 68 61 74 20 73 65 6d 61  ame of that sema
63e0: 70 68 6f 72 65 20 2a 2f 0a 23 65 6e 64 69 66 0a  phore */.#endif.
63f0: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73 74  };../*.** A list
6400: 73 20 6f 66 20 61 6c 6c 20 75 6e 69 78 49 6e 6f  s of all unixIno
6410: 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 73 2e 0a  deInfo objects..
6420: 2a 2f 0a 73 74 61 74 69 63 20 75 6e 69 78 49 6e  */.static unixIn
6430: 6f 64 65 49 6e 66 6f 20 2a 69 6e 6f 64 65 4c 69  odeInfo *inodeLi
6440: 73 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 43  st = 0;../*.** C
6450: 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65 20 64 65  lose all file de
6460: 73 63 72 69 70 74 6f 72 73 20 61 63 63 75 6d 75  scriptors accumu
6470: 61 74 65 64 20 69 6e 20 74 68 65 20 75 6e 69 78  ated in the unix
6480: 49 6e 6f 64 65 49 6e 66 6f 2d 3e 70 55 6e 75 73  InodeInfo->pUnus
6490: 65 64 20 6c 69 73 74 2e 0a 2a 2a 20 49 66 20 61  ed list..** If a
64a0: 6c 6c 20 73 75 63 68 20 66 69 6c 65 20 64 65 73  ll such file des
64b0: 63 72 69 70 74 6f 72 73 20 61 72 65 20 63 6c 6f  criptors are clo
64c0: 73 65 64 20 77 69 74 68 6f 75 74 20 65 72 72 6f  sed without erro
64d0: 72 2c 20 74 68 65 20 6c 69 73 74 20 69 73 0a 2a  r, the list is.*
64e0: 2a 20 63 6c 65 61 72 65 64 20 61 6e 64 20 53 51  * cleared and SQ
64f0: 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
6500: 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ..**.** Otherwis
6510: 65 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f  e, if an error o
6520: 63 63 75 72 73 2c 20 74 68 65 6e 20 73 75 63 63  ccurs, then succ
6530: 65 73 73 66 75 6c 6c 79 20 63 6c 6f 73 65 64 20  essfully closed 
6540: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 0a  file descriptor.
6550: 2a 2a 20 65 6e 74 72 69 65 73 20 61 72 65 20 72  ** entries are r
6560: 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20  emoved from the 
6570: 6c 69 73 74 2c 20 61 6e 64 20 53 51 4c 49 54 45  list, and SQLITE
6580: 5f 49 4f 45 52 52 5f 43 4c 4f 53 45 20 72 65 74  _IOERR_CLOSE ret
6590: 75 72 6e 65 64 2e 20 0a 2a 2a 20 6e 6f 74 20 64  urned. .** not d
65a0: 65 6c 65 74 65 64 20 61 6e 64 20 53 51 4c 49 54  eleted and SQLIT
65b0: 45 5f 49 4f 45 52 52 5f 43 4c 4f 53 45 20 72 65  E_IOERR_CLOSE re
65c0: 74 75 72 6e 65 64 2e 0a 2a 2f 20 0a 73 74 61 74  turned..*/ .stat
65d0: 69 63 20 69 6e 74 20 63 6c 6f 73 65 50 65 6e 64  ic int closePend
65e0: 69 6e 67 46 64 73 28 75 6e 69 78 46 69 6c 65 20  ingFds(unixFile 
65f0: 2a 70 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20 72  *pFile){.  int r
6600: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
6610: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
6620: 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e  pInode = pFile->
6630: 70 49 6e 6f 64 65 3b 0a 20 20 55 6e 69 78 55 6e  pInode;.  UnixUn
6640: 75 73 65 64 46 64 20 2a 70 45 72 72 6f 72 20 3d  usedFd *pError =
6650: 20 30 3b 0a 20 20 55 6e 69 78 55 6e 75 73 65 64   0;.  UnixUnused
6660: 46 64 20 2a 70 3b 0a 20 20 55 6e 69 78 55 6e 75  Fd *p;.  UnixUnu
6670: 73 65 64 46 64 20 2a 70 4e 65 78 74 3b 0a 20 20  sedFd *pNext;.  
6680: 66 6f 72 28 70 3d 70 49 6e 6f 64 65 2d 3e 70 55  for(p=pInode->pU
6690: 6e 75 73 65 64 3b 20 70 3b 20 70 3d 70 4e 65 78  nused; p; p=pNex
66a0: 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20  t){.    pNext = 
66b0: 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 69 66  p->pNext;.    if
66c0: 28 20 63 6c 6f 73 65 28 70 2d 3e 66 64 29 20 29  ( close(p->fd) )
66d0: 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  {.      pFile->l
66e0: 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  astErrno = errno
66f0: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  ;.      rc = SQL
6700: 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53 45 3b  ITE_IOERR_CLOSE;
6710: 0a 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20  .      p->pNext 
6720: 3d 20 70 45 72 72 6f 72 3b 0a 20 20 20 20 20 20  = pError;.      
6730: 70 45 72 72 6f 72 20 3d 20 70 3b 0a 20 20 20 20  pError = p;.    
6740: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
6750: 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
6760: 20 20 7d 0a 20 20 7d 0a 20 20 70 49 6e 6f 64 65    }.  }.  pInode
6770: 2d 3e 70 55 6e 75 73 65 64 20 3d 20 70 45 72 72  ->pUnused = pErr
6780: 6f 72 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  or;.  return rc;
6790: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73  .}../*.** Releas
67a0: 65 20 61 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  e a unixInodeInf
67b0: 6f 20 73 74 72 75 63 74 75 72 65 20 70 72 65 76  o structure prev
67c0: 69 6f 75 73 6c 79 20 61 6c 6c 6f 63 61 74 65 64  iously allocated
67d0: 20 62 79 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66   by findInodeInf
67e0: 6f 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d  o()..**.** The m
67f0: 75 74 65 78 20 65 6e 74 65 72 65 64 20 75 73 69  utex entered usi
6800: 6e 67 20 74 68 65 20 75 6e 69 78 45 6e 74 65 72  ng the unixEnter
6810: 4d 75 74 65 78 28 29 20 66 75 6e 63 74 69 6f 6e  Mutex() function
6820: 20 6d 75 73 74 20 62 65 20 68 65 6c 64 0a 2a 2a   must be held.**
6830: 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
6840: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  ion is called..*
6850: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  /.static void re
6860: 6c 65 61 73 65 49 6e 6f 64 65 49 6e 66 6f 28 75  leaseInodeInfo(u
6870: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b  nixFile *pFile){
6880: 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  .  unixInodeInfo
6890: 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65   *pInode = pFile
68a0: 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 73 73 65  ->pInode;.  asse
68b0: 72 74 28 20 75 6e 69 78 4d 75 74 65 78 48 65 6c  rt( unixMutexHel
68c0: 64 28 29 20 29 3b 0a 20 20 69 66 28 20 70 49 6e  d() );.  if( pIn
68d0: 6f 64 65 20 29 7b 0a 20 20 20 20 70 49 6e 6f 64  ode ){.    pInod
68e0: 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 69  e->nRef--;.    i
68f0: 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 52 65 66 3d  f( pInode->nRef=
6900: 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  =0 ){.      asse
6910: 72 74 28 20 70 49 6e 6f 64 65 2d 3e 70 53 68 6d  rt( pInode->pShm
6920: 4e 6f 64 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Node==0 );.     
6930: 20 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64 73   closePendingFds
6940: 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 69  (pFile);.      i
6950: 66 28 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76  f( pInode->pPrev
6960: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
6970: 72 74 28 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65  rt( pInode->pPre
6980: 76 2d 3e 70 4e 65 78 74 3d 3d 70 49 6e 6f 64 65  v->pNext==pInode
6990: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 49 6e 6f   );.        pIno
69a0: 64 65 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74  de->pPrev->pNext
69b0: 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74   = pInode->pNext
69c0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
69d0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69         assert( i
69e0: 6e 6f 64 65 4c 69 73 74 3d 3d 70 49 6e 6f 64 65  nodeList==pInode
69f0: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 6f 64   );.        inod
6a00: 65 4c 69 73 74 20 3d 20 70 49 6e 6f 64 65 2d 3e  eList = pInode->
6a10: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20  pNext;.      }. 
6a20: 20 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d       if( pInode-
6a30: 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20  >pNext ){.      
6a40: 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65    assert( pInode
6a50: 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 3d 3d  ->pNext->pPrev==
6a60: 70 49 6e 6f 64 65 20 29 3b 0a 20 20 20 20 20 20  pInode );.      
6a70: 20 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 2d    pInode->pNext-
6a80: 3e 70 50 72 65 76 20 3d 20 70 49 6e 6f 64 65 2d  >pPrev = pInode-
6a90: 3e 70 50 72 65 76 3b 0a 20 20 20 20 20 20 7d 0a  >pPrev;.      }.
6aa0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
6ab0: 65 65 28 70 49 6e 6f 64 65 29 3b 0a 20 20 20 20  ee(pInode);.    
6ac0: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  }.  }.}../*.** G
6ad0: 69 76 65 6e 20 61 20 66 69 6c 65 20 64 65 73 63  iven a file desc
6ae0: 72 69 70 74 6f 72 2c 20 6c 6f 63 61 74 65 20 74  riptor, locate t
6af0: 68 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  he unixInodeInfo
6b00: 20 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a 2a 20   object that.** 
6b10: 64 65 73 63 72 69 62 65 73 20 74 68 61 74 20 66  describes that f
6b20: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20  ile descriptor. 
6b30: 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e   Create a new on
6b40: 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 20  e if necessary. 
6b50: 20 54 68 65 0a 2a 2a 20 72 65 74 75 72 6e 20 76   The.** return v
6b60: 61 6c 75 65 20 6d 69 67 68 74 20 62 65 20 75 6e  alue might be un
6b70: 69 6e 69 74 69 61 6c 69 7a 65 64 20 69 66 20 61  initialized if a
6b80: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a  n error occurs..
6b90: 2a 2a 0a 2a 2a 20 54 68 65 20 6d 75 74 65 78 20  **.** The mutex 
6ba0: 65 6e 74 65 72 65 64 20 75 73 69 6e 67 20 74 68  entered using th
6bb0: 65 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78  e unixEnterMutex
6bc0: 28 29 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74  () function must
6bd0: 20 62 65 20 68 65 6c 64 0a 2a 2a 20 77 68 65 6e   be held.** when
6be0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
6bf0: 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20  s called..**.** 
6c00: 52 65 74 75 72 6e 20 61 6e 20 61 70 70 72 6f 70  Return an approp
6c10: 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65  riate error code
6c20: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
6c30: 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 0a 20  findInodeInfo(. 
6c40: 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
6c50: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
6c60: 2f 2a 20 55 6e 69 78 20 66 69 6c 65 20 77 69 74  /* Unix file wit
6c70: 68 20 66 69 6c 65 20 64 65 73 63 20 75 73 65 64  h file desc used
6c80: 20 69 6e 20 74 68 65 20 6b 65 79 20 2a 2f 0a 20   in the key */. 
6c90: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
6ca0: 2a 70 70 49 6e 6f 64 65 20 20 20 20 20 20 20 20  *ppInode        
6cb0: 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 75 6e  /* Return the un
6cc0: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65  ixInodeInfo obje
6cd0: 63 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  ct here */.){.  
6ce0: 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
6cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
6d00: 2a 20 53 79 73 74 65 6d 20 63 61 6c 6c 20 72 65  * System call re
6d10: 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
6d20: 6e 74 20 66 64 3b 20 20 20 20 20 20 20 20 20 20  nt fd;          
6d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6d40: 20 54 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   The file descri
6d50: 70 74 6f 72 20 66 6f 72 20 70 46 69 6c 65 20 2a  ptor for pFile *
6d60: 2f 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78 46  /.  struct unixF
6d70: 69 6c 65 49 64 20 66 69 6c 65 49 64 3b 20 20 20  ileId fileId;   
6d80: 20 20 20 2f 2a 20 4c 6f 6f 6b 75 70 20 6b 65 79     /* Lookup key
6d90: 20 66 6f 72 20 74 68 65 20 75 6e 69 78 49 6e 6f   for the unixIno
6da0: 64 65 49 6e 66 6f 20 2a 2f 0a 20 20 73 74 72 75  deInfo */.  stru
6db0: 63 74 20 73 74 61 74 20 73 74 61 74 62 75 66 3b  ct stat statbuf;
6dc0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
6dd0: 77 2d 6c 65 76 65 6c 20 66 69 6c 65 20 69 6e 66  w-level file inf
6de0: 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 75 6e  ormation */.  un
6df0: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e  ixInodeInfo *pIn
6e00: 6f 64 65 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20  ode = 0;     /* 
6e10: 43 61 6e 64 69 64 61 74 65 20 75 6e 69 78 49 6e  Candidate unixIn
6e20: 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 20 2a  odeInfo object *
6e30: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 75 6e 69  /..  assert( uni
6e40: 78 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a  xMutexHeld() );.
6e50: 0a 20 20 2f 2a 20 47 65 74 20 6c 6f 77 2d 6c 65  .  /* Get low-le
6e60: 76 65 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  vel information 
6e70: 61 62 6f 75 74 20 74 68 65 20 66 69 6c 65 20 74  about the file t
6e80: 68 61 74 20 77 65 20 63 61 6e 20 75 73 65 64 20  hat we can used 
6e90: 74 6f 0a 20 20 2a 2a 20 63 72 65 61 74 65 20 61  to.  ** create a
6ea0: 20 75 6e 69 71 75 65 20 6e 61 6d 65 20 66 6f 72   unique name for
6eb0: 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a   the file..  */.
6ec0: 20 20 66 64 20 3d 20 70 46 69 6c 65 2d 3e 68 3b    fd = pFile->h;
6ed0: 0a 20 20 72 63 20 3d 20 66 73 74 61 74 28 66 64  .  rc = fstat(fd
6ee0: 2c 20 26 73 74 61 74 62 75 66 29 3b 0a 20 20 69  , &statbuf);.  i
6ef0: 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20  f( rc!=0 ){.    
6f00: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
6f10: 20 3d 20 65 72 72 6e 6f 3b 0a 23 69 66 64 65 66   = errno;.#ifdef
6f20: 20 45 4f 56 45 52 46 4c 4f 57 0a 20 20 20 20 69   EOVERFLOW.    i
6f30: 66 28 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72  f( pFile->lastEr
6f40: 72 6e 6f 3d 3d 45 4f 56 45 52 46 4c 4f 57 20 29  rno==EOVERFLOW )
6f50: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
6f60: 4f 4c 46 53 3b 0a 23 65 6e 64 69 66 0a 20 20 20  OLFS;.#endif.   
6f70: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
6f80: 4f 45 52 52 3b 0a 20 20 7d 0a 0a 23 69 66 64 65  OERR;.  }..#ifde
6f90: 66 20 5f 5f 41 50 50 4c 45 5f 5f 0a 20 20 2f 2a  f __APPLE__.  /*
6fa0: 20 4f 6e 20 4f 53 20 58 20 6f 6e 20 61 6e 20 6d   On OS X on an m
6fb0: 73 64 6f 73 20 66 69 6c 65 73 79 73 74 65 6d 2c  sdos filesystem,
6fc0: 20 74 68 65 20 69 6e 6f 64 65 20 6e 75 6d 62 65   the inode numbe
6fd0: 72 20 69 73 20 72 65 70 6f 72 74 65 64 0a 20 20  r is reported.  
6fe0: 2a 2a 20 69 6e 63 6f 72 72 65 63 74 6c 79 20 66  ** incorrectly f
6ff0: 6f 72 20 7a 65 72 6f 2d 73 69 7a 65 20 66 69 6c  or zero-size fil
7000: 65 73 2e 20 20 53 65 65 20 74 69 63 6b 65 74 20  es.  See ticket 
7010: 23 33 32 36 30 2e 20 20 54 6f 20 77 6f 72 6b 0a  #3260.  To work.
7020: 20 20 2a 2a 20 61 72 6f 75 6e 64 20 74 68 69 73    ** around this
7030: 20 70 72 6f 62 6c 65 6d 20 28 77 65 20 63 6f 6e   problem (we con
7040: 73 69 64 65 72 20 69 74 20 61 20 62 75 67 20 69  sider it a bug i
7050: 6e 20 4f 53 20 58 2c 20 6e 6f 74 20 53 51 4c 69  n OS X, not SQLi
7060: 74 65 29 0a 20 20 2a 2a 20 77 65 20 61 6c 77 61  te).  ** we alwa
7070: 79 73 20 69 6e 63 72 65 61 73 65 20 74 68 65 20  ys increase the 
7080: 66 69 6c 65 20 73 69 7a 65 20 74 6f 20 31 20 62  file size to 1 b
7090: 79 20 77 72 69 74 69 6e 67 20 61 20 73 69 6e 67  y writing a sing
70a0: 6c 65 20 62 79 74 65 0a 20 20 2a 2a 20 70 72 69  le byte.  ** pri
70b0: 6f 72 20 74 6f 20 61 63 63 65 73 73 69 6e 67 20  or to accessing 
70c0: 74 68 65 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72  the inode number
70d0: 2e 20 20 54 68 65 20 6f 6e 65 20 62 79 74 65 20  .  The one byte 
70e0: 77 72 69 74 74 65 6e 20 69 73 0a 20 20 2a 2a 20  written is.  ** 
70f0: 61 6e 20 41 53 43 49 49 20 27 53 27 20 63 68 61  an ASCII 'S' cha
7100: 72 61 63 74 65 72 20 77 68 69 63 68 20 61 6c 73  racter which als
7110: 6f 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20  o happens to be 
7120: 74 68 65 20 66 69 72 73 74 20 62 79 74 65 0a 20  the first byte. 
7130: 20 2a 2a 20 69 6e 20 74 68 65 20 68 65 61 64 65   ** in the heade
7140: 72 20 6f 66 20 65 76 65 72 79 20 53 51 4c 69 74  r of every SQLit
7150: 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 6e 20  e database.  In 
7160: 74 68 69 73 20 77 61 79 2c 20 69 66 20 74 68 65  this way, if the
7170: 72 65 0a 20 20 2a 2a 20 69 73 20 61 20 72 61 63  re.  ** is a rac
7180: 65 20 63 6f 6e 64 69 74 69 6f 6e 20 73 75 63 68  e condition such
7190: 20 74 68 61 74 20 61 6e 6f 74 68 65 72 20 74 68   that another th
71a0: 72 65 61 64 20 68 61 73 20 61 6c 72 65 61 64 79  read has already
71b0: 20 70 6f 70 75 6c 61 74 65 64 0a 20 20 2a 2a 20   populated.  ** 
71c0: 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f  the first page o
71d0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20  f the database, 
71e0: 6e 6f 20 64 61 6d 61 67 65 20 69 73 20 64 6f 6e  no damage is don
71f0: 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 74  e..  */.  if( st
7200: 61 74 62 75 66 2e 73 74 5f 73 69 7a 65 3d 3d 30  atbuf.st_size==0
7210: 20 26 26 20 28 70 46 69 6c 65 2d 3e 66 73 46 6c   && (pFile->fsFl
7220: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 53 46  ags & SQLITE_FSF
7230: 4c 41 47 53 5f 49 53 5f 4d 53 44 4f 53 29 21 3d  LAGS_IS_MSDOS)!=
7240: 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 77 72  0 ){.    rc = wr
7250: 69 74 65 28 66 64 2c 20 22 53 22 2c 20 31 29 3b  ite(fd, "S", 1);
7260: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 31 20 29  .    if( rc!=1 )
7270: 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  {.      pFile->l
7280: 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  astErrno = errno
7290: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
72a0: 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20  QLITE_IOERR;.   
72b0: 20 7d 0a 20 20 20 20 72 63 20 3d 20 66 73 74 61   }.    rc = fsta
72c0: 74 28 66 64 2c 20 26 73 74 61 74 62 75 66 29 3b  t(fd, &statbuf);
72d0: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29  .    if( rc!=0 )
72e0: 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  {.      pFile->l
72f0: 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  astErrno = errno
7300: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
7310: 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20  QLITE_IOERR;.   
7320: 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
7330: 20 6d 65 6d 73 65 74 28 26 66 69 6c 65 49 64 2c   memset(&fileId,
7340: 20 30 2c 20 73 69 7a 65 6f 66 28 66 69 6c 65 49   0, sizeof(fileI
7350: 64 29 29 3b 0a 20 20 66 69 6c 65 49 64 2e 64 65  d));.  fileId.de
7360: 76 20 3d 20 73 74 61 74 62 75 66 2e 73 74 5f 64  v = statbuf.st_d
7370: 65 76 3b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52  ev;.#if OS_VXWOR
7380: 4b 53 0a 20 20 66 69 6c 65 49 64 2e 70 49 64 20  KS.  fileId.pId 
7390: 3d 20 70 46 69 6c 65 2d 3e 70 49 64 3b 0a 23 65  = pFile->pId;.#e
73a0: 6c 73 65 0a 20 20 66 69 6c 65 49 64 2e 69 6e 6f  lse.  fileId.ino
73b0: 20 3d 20 73 74 61 74 62 75 66 2e 73 74 5f 69 6e   = statbuf.st_in
73c0: 6f 3b 0a 23 65 6e 64 69 66 0a 20 20 70 49 6e 6f  o;.#endif.  pIno
73d0: 64 65 20 3d 20 69 6e 6f 64 65 4c 69 73 74 3b 0a  de = inodeList;.
73e0: 20 20 77 68 69 6c 65 28 20 70 49 6e 6f 64 65 20    while( pInode 
73f0: 26 26 20 6d 65 6d 63 6d 70 28 26 66 69 6c 65 49  && memcmp(&fileI
7400: 64 2c 20 26 70 49 6e 6f 64 65 2d 3e 66 69 6c 65  d, &pInode->file
7410: 49 64 2c 20 73 69 7a 65 6f 66 28 66 69 6c 65 49  Id, sizeof(fileI
7420: 64 29 29 20 29 7b 0a 20 20 20 20 70 49 6e 6f 64  d)) ){.    pInod
7430: 65 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78  e = pInode->pNex
7440: 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 6e  t;.  }.  if( pIn
7450: 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 70 49  ode==0 ){.    pI
7460: 6e 6f 64 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d  node = sqlite3_m
7470: 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70  alloc( sizeof(*p
7480: 49 6e 6f 64 65 29 20 29 3b 0a 20 20 20 20 69 66  Inode) );.    if
7490: 28 20 70 49 6e 6f 64 65 3d 3d 30 20 29 7b 0a 20  ( pInode==0 ){. 
74a0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
74b0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
74c0: 20 20 20 20 6d 65 6d 73 65 74 28 70 49 6e 6f 64      memset(pInod
74d0: 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49  e, 0, sizeof(*pI
74e0: 6e 6f 64 65 29 29 3b 0a 20 20 20 20 6d 65 6d 63  node));.    memc
74f0: 70 79 28 26 70 49 6e 6f 64 65 2d 3e 66 69 6c 65  py(&pInode->file
7500: 49 64 2c 20 26 66 69 6c 65 49 64 2c 20 73 69 7a  Id, &fileId, siz
7510: 65 6f 66 28 66 69 6c 65 49 64 29 29 3b 0a 20 20  eof(fileId));.  
7520: 20 20 70 49 6e 6f 64 65 2d 3e 6e 52 65 66 20 3d    pInode->nRef =
7530: 20 31 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e   1;.    pInode->
7540: 70 4e 65 78 74 20 3d 20 69 6e 6f 64 65 4c 69 73  pNext = inodeLis
7550: 74 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70  t;.    pInode->p
7560: 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 69 66  Prev = 0;.    if
7570: 28 20 69 6e 6f 64 65 4c 69 73 74 20 29 20 69 6e  ( inodeList ) in
7580: 6f 64 65 4c 69 73 74 2d 3e 70 50 72 65 76 20 3d  odeList->pPrev =
7590: 20 70 49 6e 6f 64 65 3b 0a 20 20 20 20 69 6e 6f   pInode;.    ino
75a0: 64 65 4c 69 73 74 20 3d 20 70 49 6e 6f 64 65 3b  deList = pInode;
75b0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49  .  }else{.    pI
75c0: 6e 6f 64 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20  node->nRef++;.  
75d0: 7d 0a 20 20 2a 70 70 49 6e 6f 64 65 20 3d 20 70  }.  *ppInode = p
75e0: 49 6e 6f 64 65 3b 0a 20 20 72 65 74 75 72 6e 20  Inode;.  return 
75f0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f  SQLITE_OK;.}.../
7600: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
7610: 65 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 72  e checks if ther
7620: 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20  e is a RESERVED 
7630: 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65  lock held on the
7640: 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69   specified.** fi
7650: 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e  le by this or an
7660: 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e  y other process.
7670: 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20   If such a lock 
7680: 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52  is held, set *pR
7690: 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f  esOut.** to a no
76a0: 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68  n-zero value oth
76b0: 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20  erwise *pResOut 
76c0: 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20  is set to zero. 
76d0: 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
76e0: 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53  e.** is set to S
76f0: 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20  QLITE_OK unless 
7700: 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63  an I/O error occ
7710: 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20  urs during lock 
7720: 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61  checking..*/.sta
7730: 74 69 63 20 69 6e 74 20 75 6e 69 78 43 68 65 63  tic int unixChec
7740: 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71  kReservedLock(sq
7750: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
7760: 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20  int *pResOut){. 
7770: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
7780: 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65 72  _OK;.  int reser
7790: 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46  ved = 0;.  unixF
77a0: 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
77b0: 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53  ixFile*)id;..  S
77c0: 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
77d0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
77e0: 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45  ERR_CHECKRESERVE
77f0: 44 4c 4f 43 4b 3b 20 29 3b 0a 0a 20 20 61 73 73  DLOCK; );..  ass
7800: 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
7810: 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
7820: 3b 20 2f 2a 20 42 65 63 61 75 73 65 20 70 46 69  ; /* Because pFi
7830: 6c 65 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73 68  le->pInode is sh
7840: 61 72 65 64 20 61 63 72 6f 73 73 20 74 68 72 65  ared across thre
7850: 61 64 73 20 2a 2f 0a 0a 20 20 2f 2a 20 43 68 65  ads */..  /* Che
7860: 63 6b 20 69 66 20 61 20 74 68 72 65 61 64 20 69  ck if a thread i
7870: 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 68  n this process h
7880: 6f 6c 64 73 20 73 75 63 68 20 61 20 6c 6f 63 6b  olds such a lock
7890: 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
78a0: 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f  >pInode->eFileLo
78b0: 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  ck>SHARED_LOCK )
78c0: 7b 0a 20 20 20 20 72 65 73 65 72 76 65 64 20 3d  {.    reserved =
78d0: 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 74   1;.  }..  /* Ot
78e0: 68 65 72 77 69 73 65 20 73 65 65 20 69 66 20 73  herwise see if s
78f0: 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73  ome other proces
7900: 73 20 68 6f 6c 64 73 20 69 74 2e 0a 20 20 2a 2f  s holds it..  */
7910: 0a 23 69 66 6e 64 65 66 20 5f 5f 44 4a 47 50 50  .#ifndef __DJGPP
7920: 5f 5f 0a 20 20 69 66 28 20 21 72 65 73 65 72 76  __.  if( !reserv
7930: 65 64 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  ed ){.    struct
7940: 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 20   flock lock;.   
7950: 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d   lock.l_whence =
7960: 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 6c   SEEK_SET;.    l
7970: 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 52 45  ock.l_start = RE
7980: 53 45 52 56 45 44 5f 42 59 54 45 3b 0a 20 20 20  SERVED_BYTE;.   
7990: 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 3b   lock.l_len = 1;
79a0: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65  .    lock.l_type
79b0: 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20 20 20 20   = F_WRLCK;.    
79c0: 69 66 20 28 2d 31 20 3d 3d 20 66 63 6e 74 6c 28  if (-1 == fcntl(
79d0: 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 47 45 54 4c  pFile->h, F_GETL
79e0: 4b 2c 20 26 6c 6f 63 6b 29 29 20 7b 0a 20 20 20  K, &lock)) {.   
79f0: 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20     int tErrno = 
7a00: 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20  errno;.      rc 
7a10: 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  = sqliteErrorFro
7a20: 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72  mPosixError(tErr
7a30: 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  no, SQLITE_IOERR
7a40: 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f  _CHECKRESERVEDLO
7a50: 43 4b 29 3b 0a 20 20 20 20 20 20 70 46 69 6c 65  CK);.      pFile
7a60: 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45  ->lastErrno = tE
7a70: 72 72 6e 6f 3b 0a 20 20 20 20 7d 20 65 6c 73 65  rrno;.    } else
7a80: 20 69 66 28 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65   if( lock.l_type
7a90: 21 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20  !=F_UNLCK ){.   
7aa0: 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b     reserved = 1;
7ab0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
7ac0: 66 0a 20 20 0a 20 20 75 6e 69 78 4c 65 61 76 65  f.  .  unixLeave
7ad0: 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53 54 52 41  Mutex();.  OSTRA
7ae0: 43 45 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43  CE(("TEST WR-LOC
7af0: 4b 20 25 64 20 25 64 20 25 64 20 28 75 6e 69 78  K %d %d %d (unix
7b00: 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
7b10: 72 63 2c 20 72 65 73 65 72 76 65 64 29 29 3b 0a  rc, reserved));.
7b20: 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65  .  *pResOut = re
7b30: 73 65 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e  served;.  return
7b40: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f   rc;.}../*.** Lo
7b50: 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74 68  ck the file with
7b60: 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66   the lock specif
7b70: 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72  ied by parameter
7b80: 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65   eFileLock - one
7b90: 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  .** of the follo
7ba0: 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  wing:.**.**     
7bb0: 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a  (1) SHARED_LOCK.
7bc0: 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53 45 52  **     (2) RESER
7bd0: 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  VED_LOCK.**     
7be0: 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  (3) PENDING_LOCK
7bf0: 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c  .**     (4) EXCL
7c00: 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a  USIVE_LOCK.**.**
7c10: 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20   Sometimes when 
7c20: 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c  requesting one l
7c30: 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74  ock state, addit
7c40: 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65  ional lock state
7c50: 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65  s.** are inserte
7c60: 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54  d in between.  T
7c70: 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74  he locking might
7c80: 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20   fail on one of 
7c90: 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61  the later.** tra
7ca0: 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67  nsitions leaving
7cb0: 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20   the lock state 
7cc0: 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77  different from w
7cd0: 68 61 74 20 69 74 20 73 74 61 72 74 65 64 20 62  hat it started b
7ce0: 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72  ut.** still shor
7cf0: 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20  t of its goal.  
7d00: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68  The following ch
7d10: 61 72 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c  art shows the al
7d20: 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74  lowed.** transit
7d30: 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73  ions and the ins
7d40: 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61  erted intermedia
7d50: 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a  te states:.**.**
7d60: 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20      UNLOCKED -> 
7d70: 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41  SHARED.**    SHA
7d80: 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a  RED -> RESERVED.
7d90: 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20  **    SHARED -> 
7da0: 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43  (PENDING) -> EXC
7db0: 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53  LUSIVE.**    RES
7dc0: 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e  ERVED -> (PENDIN
7dd0: 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  G) -> EXCLUSIVE.
7de0: 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e  **    PENDING ->
7df0: 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a   EXCLUSIVE.**.**
7e00: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   This routine wi
7e10: 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65  ll only increase
7e20: 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68   a lock.  Use th
7e30: 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63  e sqlite3OsUnloc
7e40: 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74  k().** routine t
7e50: 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e  o lower a lockin
7e60: 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74  g level..*/.stat
7e70: 69 63 20 69 6e 74 20 75 6e 69 78 4c 6f 63 6b 28  ic int unixLock(
7e80: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
7e90: 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29  , int eFileLock)
7ea0: 7b 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f  {.  /* The follo
7eb0: 77 69 6e 67 20 64 65 73 63 72 69 62 65 73 20 74  wing describes t
7ec0: 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
7ed0: 6e 20 6f 66 20 74 68 65 20 76 61 72 69 6f 75 73  n of the various
7ee0: 20 6c 6f 63 6b 73 20 61 6e 64 0a 20 20 2a 2a 20   locks and.  ** 
7ef0: 6c 6f 63 6b 20 74 72 61 6e 73 69 74 69 6f 6e 73  lock transitions
7f00: 20 69 6e 20 74 65 72 6d 73 20 6f 66 20 74 68 65   in terms of the
7f10: 20 50 4f 53 49 58 20 61 64 76 69 73 6f 72 79 20   POSIX advisory 
7f20: 73 68 61 72 65 64 20 61 6e 64 20 65 78 63 6c 75  shared and exclu
7f30: 73 69 76 65 0a 20 20 2a 2a 20 6c 6f 63 6b 20 70  sive.  ** lock p
7f40: 72 69 6d 69 74 69 76 65 73 20 28 63 61 6c 6c 65  rimitives (calle
7f50: 64 20 72 65 61 64 2d 6c 6f 63 6b 73 20 61 6e 64  d read-locks and
7f60: 20 77 72 69 74 65 2d 6c 6f 63 6b 73 20 62 65 6c   write-locks bel
7f70: 6f 77 2c 20 74 6f 20 61 76 6f 69 64 0a 20 20 2a  ow, to avoid.  *
7f80: 2a 20 63 6f 6e 66 75 73 69 6f 6e 20 77 69 74 68  * confusion with
7f90: 20 53 51 4c 69 74 65 20 6c 6f 63 6b 20 6e 61 6d   SQLite lock nam
7fa0: 65 73 29 2e 20 54 68 65 20 61 6c 67 6f 72 69 74  es). The algorit
7fb0: 68 6d 73 20 61 72 65 20 63 6f 6d 70 6c 69 63 61  hms are complica
7fc0: 74 65 64 0a 20 20 2a 2a 20 73 6c 69 67 68 74 6c  ted.  ** slightl
7fd0: 79 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 62 65  y in order to be
7fe0: 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68   compatible with
7ff0: 20 77 69 6e 64 6f 77 73 20 73 79 73 74 65 6d 73   windows systems
8000: 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73 6c 79 0a   simultaneously.
8010: 20 20 2a 2a 20 61 63 63 65 73 73 69 6e 67 20 74    ** accessing t
8020: 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65  he same database
8030: 20 66 69 6c 65 2c 20 69 6e 20 63 61 73 65 20 74   file, in case t
8040: 68 61 74 20 69 73 20 65 76 65 72 20 72 65 71 75  hat is ever requ
8050: 69 72 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ired..  **.  ** 
8060: 53 79 6d 62 6f 6c 73 20 64 65 66 69 6e 65 64 20  Symbols defined 
8070: 69 6e 20 6f 73 2e 68 20 69 6e 64 65 6e 74 69 66  in os.h indentif
8080: 79 20 74 68 65 20 27 70 65 6e 64 69 6e 67 20 62  y the 'pending b
8090: 79 74 65 27 20 61 6e 64 20 74 68 65 20 27 72 65  yte' and the 're
80a0: 73 65 72 76 65 64 0a 20 20 2a 2a 20 62 79 74 65  served.  ** byte
80b0: 27 2c 20 65 61 63 68 20 73 69 6e 67 6c 65 20 62  ', each single b
80c0: 79 74 65 73 20 61 74 20 77 65 6c 6c 20 6b 6e 6f  ytes at well kno
80d0: 77 6e 20 6f 66 66 73 65 74 73 2c 20 61 6e 64 20  wn offsets, and 
80e0: 74 68 65 20 27 73 68 61 72 65 64 20 62 79 74 65  the 'shared byte
80f0: 0a 20 20 2a 2a 20 72 61 6e 67 65 27 2c 20 61 20  .  ** range', a 
8100: 72 61 6e 67 65 20 6f 66 20 35 31 30 20 62 79 74  range of 510 byt
8110: 65 73 20 61 74 20 61 20 77 65 6c 6c 20 6b 6e 6f  es at a well kno
8120: 77 6e 20 6f 66 66 73 65 74 2e 0a 20 20 2a 2a 0a  wn offset..  **.
8130: 20 20 2a 2a 20 54 6f 20 6f 62 74 61 69 6e 20 61    ** To obtain a
8140: 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 61 20   SHARED lock, a 
8150: 72 65 61 64 2d 6c 6f 63 6b 20 69 73 20 6f 62 74  read-lock is obt
8160: 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 27 70 65  ained on the 'pe
8170: 6e 64 69 6e 67 0a 20 20 2a 2a 20 62 79 74 65 27  nding.  ** byte'
8180: 2e 20 20 49 66 20 74 68 69 73 20 69 73 20 73 75  .  If this is su
8190: 63 63 65 73 73 66 75 6c 2c 20 61 20 72 61 6e 64  ccessful, a rand
81a0: 6f 6d 20 62 79 74 65 20 66 72 6f 6d 20 74 68 65  om byte from the
81b0: 20 27 73 68 61 72 65 64 20 62 79 74 65 0a 20 20   'shared byte.  
81c0: 2a 2a 20 72 61 6e 67 65 27 20 69 73 20 72 65 61  ** range' is rea
81d0: 64 2d 6c 6f 63 6b 65 64 20 61 6e 64 20 74 68 65  d-locked and the
81e0: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 27 70 65   lock on the 'pe
81f0: 6e 64 69 6e 67 20 62 79 74 65 27 20 72 65 6c 65  nding byte' rele
8200: 61 73 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ased..  **.  ** 
8210: 41 20 70 72 6f 63 65 73 73 20 6d 61 79 20 6f 6e  A process may on
8220: 6c 79 20 6f 62 74 61 69 6e 20 61 20 52 45 53 45  ly obtain a RESE
8230: 52 56 45 44 20 6c 6f 63 6b 20 61 66 74 65 72 20  RVED lock after 
8240: 69 74 20 68 61 73 20 61 20 53 48 41 52 45 44 20  it has a SHARED 
8250: 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 41 20 52 45 53  lock..  ** A RES
8260: 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 69 6d  ERVED lock is im
8270: 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 67 72 61  plemented by gra
8280: 62 62 69 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f  bbing a write-lo
8290: 63 6b 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 27  ck on the.  ** '
82a0: 72 65 73 65 72 76 65 64 20 62 79 74 65 27 2e 20  reserved byte'. 
82b0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 70 72 6f  .  **.  ** A pro
82c0: 63 65 73 73 20 6d 61 79 20 6f 6e 6c 79 20 6f 62  cess may only ob
82d0: 74 61 69 6e 20 61 20 50 45 4e 44 49 4e 47 20 6c  tain a PENDING l
82e0: 6f 63 6b 20 61 66 74 65 72 20 69 74 20 68 61 73  ock after it has
82f0: 20 6f 62 74 61 69 6e 65 64 20 61 0a 20 20 2a 2a   obtained a.  **
8300: 20 53 48 41 52 45 44 20 6c 6f 63 6b 2e 20 41 20   SHARED lock. A 
8310: 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20  PENDING lock is 
8320: 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 6f  implemented by o
8330: 62 74 61 69 6e 69 6e 67 20 61 20 77 72 69 74 65  btaining a write
8340: 2d 6c 6f 63 6b 0a 20 20 2a 2a 20 6f 6e 20 74 68  -lock.  ** on th
8350: 65 20 27 70 65 6e 64 69 6e 67 20 62 79 74 65 27  e 'pending byte'
8360: 2e 20 54 68 69 73 20 65 6e 73 75 72 65 73 20 74  . This ensures t
8370: 68 61 74 20 6e 6f 20 6e 65 77 20 53 48 41 52 45  hat no new SHARE
8380: 44 20 6c 6f 63 6b 73 20 63 61 6e 20 62 65 0a 20  D locks can be. 
8390: 20 2a 2a 20 6f 62 74 61 69 6e 65 64 2c 20 62 75   ** obtained, bu
83a0: 74 20 65 78 69 73 74 69 6e 67 20 53 48 41 52 45  t existing SHARE
83b0: 44 20 6c 6f 63 6b 73 20 61 72 65 20 61 6c 6c 6f  D locks are allo
83c0: 77 65 64 20 74 6f 20 70 65 72 73 69 73 74 2e 20  wed to persist. 
83d0: 41 20 70 72 6f 63 65 73 73 0a 20 20 2a 2a 20 64  A process.  ** d
83e0: 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 74 6f 20  oes not have to 
83f0: 6f 62 74 61 69 6e 20 61 20 52 45 53 45 52 56 45  obtain a RESERVE
8400: 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 77 61  D lock on the wa
8410: 79 20 74 6f 20 61 20 50 45 4e 44 49 4e 47 20 6c  y to a PENDING l
8420: 6f 63 6b 2e 0a 20 20 2a 2a 20 54 68 69 73 20 70  ock..  ** This p
8430: 72 6f 70 65 72 74 79 20 69 73 20 75 73 65 64 20  roperty is used 
8440: 62 79 20 74 68 65 20 61 6c 67 6f 72 69 74 68 6d  by the algorithm
8450: 20 66 6f 72 20 72 6f 6c 6c 69 6e 67 20 62 61 63   for rolling bac
8460: 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  k a journal file
8470: 0a 20 20 2a 2a 20 61 66 74 65 72 20 61 20 63 72  .  ** after a cr
8480: 61 73 68 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41  ash..  **.  ** A
8490: 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
84a0: 2c 20 6f 62 74 61 69 6e 65 64 20 61 66 74 65 72  , obtained after
84b0: 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20   a PENDING lock 
84c0: 69 73 20 68 65 6c 64 2c 20 69 73 0a 20 20 2a 2a  is held, is.  **
84d0: 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20   implemented by 
84e0: 6f 62 74 61 69 6e 69 6e 67 20 61 20 77 72 69 74  obtaining a writ
84f0: 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 65 6e  e-lock on the en
8500: 74 69 72 65 20 27 73 68 61 72 65 64 20 62 79 74  tire 'shared byt
8510: 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27 2e 20 53  e.  ** range'. S
8520: 69 6e 63 65 20 61 6c 6c 20 6f 74 68 65 72 20 6c  ince all other l
8530: 6f 63 6b 73 20 72 65 71 75 69 72 65 20 61 20 72  ocks require a r
8540: 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 6f 6e 65 20  ead-lock on one 
8550: 6f 66 20 74 68 65 20 62 79 74 65 73 0a 20 20 2a  of the bytes.  *
8560: 2a 20 77 69 74 68 69 6e 20 74 68 69 73 20 72 61  * within this ra
8570: 6e 67 65 2c 20 74 68 69 73 20 65 6e 73 75 72 65  nge, this ensure
8580: 73 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20  s that no other 
8590: 6c 6f 63 6b 73 20 61 72 65 20 68 65 6c 64 20 6f  locks are held o
85a0: 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62  n the.  ** datab
85b0: 61 73 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ase. .  **.  ** 
85c0: 54 68 65 20 72 65 61 73 6f 6e 20 61 20 73 69 6e  The reason a sin
85d0: 67 6c 65 20 62 79 74 65 20 63 61 6e 6e 6f 74 20  gle byte cannot 
85e0: 62 65 20 75 73 65 64 20 69 6e 73 74 65 61 64 20  be used instead 
85f0: 6f 66 20 74 68 65 20 27 73 68 61 72 65 64 20 62  of the 'shared b
8600: 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27 20  yte.  ** range' 
8610: 69 73 20 74 68 61 74 20 73 6f 6d 65 20 76 65 72  is that some ver
8620: 73 69 6f 6e 73 20 6f 66 20 77 69 6e 64 6f 77 73  sions of windows
8630: 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72 74 20   do not support 
8640: 72 65 61 64 2d 6c 6f 63 6b 73 2e 20 42 79 0a 20  read-locks. By. 
8650: 20 2a 2a 20 6c 6f 63 6b 69 6e 67 20 61 20 72 61   ** locking a ra
8660: 6e 64 6f 6d 20 62 79 74 65 20 66 72 6f 6d 20 61  ndom byte from a
8670: 20 72 61 6e 67 65 2c 20 63 6f 6e 63 75 72 72 65   range, concurre
8680: 6e 74 20 53 48 41 52 45 44 20 6c 6f 63 6b 73 20  nt SHARED locks 
8690: 6d 61 79 20 65 78 69 73 74 0a 20 20 2a 2a 20 65  may exist.  ** e
86a0: 76 65 6e 20 69 66 20 74 68 65 20 6c 6f 63 6b 69  ven if the locki
86b0: 6e 67 20 70 72 69 6d 69 74 69 76 65 20 75 73 65  ng primitive use
86c0: 64 20 69 73 20 61 6c 77 61 79 73 20 61 20 77 72  d is always a wr
86d0: 69 74 65 2d 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20  ite-lock..  */. 
86e0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
86f0: 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20  _OK;.  unixFile 
8700: 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
8710: 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78 49 6e  le*)id;.  unixIn
8720: 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20  odeInfo *pInode 
8730: 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b  = pFile->pInode;
8740: 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20  .  struct flock 
8750: 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20 73 20 3d 20  lock;.  int s = 
8760: 30 3b 0a 20 20 69 6e 74 20 74 45 72 72 6e 6f 20  0;.  int tErrno 
8770: 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
8780: 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41  pFile );.  OSTRA
8790: 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20  CE(("LOCK    %d 
87a0: 25 73 20 77 61 73 20 25 73 28 25 73 2c 25 64 29  %s was %s(%s,%d)
87b0: 20 70 69 64 3d 25 64 20 28 75 6e 69 78 29 5c 6e   pid=%d (unix)\n
87c0: 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20  ", pFile->h,.   
87d0: 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46     azFileLock(eF
87e0: 69 6c 65 4c 6f 63 6b 29 2c 20 61 7a 46 69 6c 65  ileLock), azFile
87f0: 4c 6f 63 6b 28 70 46 69 6c 65 2d 3e 65 46 69 6c  Lock(pFile->eFil
8800: 65 4c 6f 63 6b 29 2c 0a 20 20 20 20 20 20 61 7a  eLock),.      az
8810: 46 69 6c 65 4c 6f 63 6b 28 70 49 6e 6f 64 65 2d  FileLock(pInode-
8820: 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 70 49 6e  >eFileLock), pIn
8830: 6f 64 65 2d 3e 6e 53 68 61 72 65 64 20 2c 20 67  ode->nShared , g
8840: 65 74 70 69 64 28 29 29 29 3b 0a 0a 20 20 2f 2a  etpid()));..  /*
8850: 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6c 72   If there is alr
8860: 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20 74  eady a lock of t
8870: 68 69 73 20 74 79 70 65 20 6f 72 20 6d 6f 72 65  his type or more
8880: 20 72 65 73 74 72 69 63 74 69 76 65 20 6f 6e 20   restrictive on 
8890: 74 68 65 0a 20 20 2a 2a 20 75 6e 69 78 46 69 6c  the.  ** unixFil
88a0: 65 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44  e, do nothing. D
88b0: 6f 6e 27 74 20 75 73 65 20 74 68 65 20 65 6e 64  on't use the end
88c0: 5f 6c 6f 63 6b 3a 20 65 78 69 74 20 70 61 74 68  _lock: exit path
88d0: 2c 20 61 73 0a 20 20 2a 2a 20 75 6e 69 78 45 6e  , as.  ** unixEn
88e0: 74 65 72 4d 75 74 65 78 28 29 20 68 61 73 6e 27  terMutex() hasn'
88f0: 74 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 79 65  t been called ye
8900: 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46  t..  */.  if( pF
8910: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d  ile->eFileLock>=
8920: 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20  eFileLock ){.   
8930: 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20   OSTRACE(("LOCK 
8940: 20 20 20 25 64 20 25 73 20 6f 6b 20 28 61 6c 72     %d %s ok (alr
8950: 65 61 64 79 20 68 65 6c 64 29 20 28 75 6e 69 78  eady held) (unix
8960: 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a  )\n", pFile->h,.
8970: 20 20 20 20 20 20 20 20 20 20 20 20 61 7a 46 69              azFi
8980: 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b  leLock(eFileLock
8990: 29 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  )));.    return 
89a0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
89b0: 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
89c0: 68 65 20 6c 6f 63 6b 69 6e 67 20 73 65 71 75 65  he locking seque
89d0: 6e 63 65 20 69 73 20 63 6f 72 72 65 63 74 2e 0a  nce is correct..
89e0: 20 20 2a 2a 20 20 28 31 29 20 57 65 20 6e 65 76    **  (1) We nev
89f0: 65 72 20 6d 6f 76 65 20 66 72 6f 6d 20 75 6e 6c  er move from unl
8a00: 6f 63 6b 65 64 20 74 6f 20 61 6e 79 74 68 69 6e  ocked to anythin
8a10: 67 20 68 69 67 68 65 72 20 74 68 61 6e 20 73 68  g higher than sh
8a20: 61 72 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20  ared lock..  ** 
8a30: 20 28 32 29 20 53 51 4c 69 74 65 20 6e 65 76 65   (2) SQLite neve
8a40: 72 20 65 78 70 6c 69 63 69 74 6c 79 20 72 65 71  r explicitly req
8a50: 75 65 73 74 73 20 61 20 70 65 6e 64 69 67 20 6c  uests a pendig l
8a60: 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28 33 29 20 41  ock..  **  (3) A
8a70: 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 69 73 20   shared lock is 
8a80: 61 6c 77 61 79 73 20 68 65 6c 64 20 77 68 65 6e  always held when
8a90: 20 61 20 72 65 73 65 72 76 65 20 6c 6f 63 6b 20   a reserve lock 
8aa0: 69 73 20 72 65 71 75 65 73 74 65 64 2e 0a 20 20  is requested..  
8ab0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  */.  assert( pFi
8ac0: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 4e  le->eFileLock!=N
8ad0: 4f 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c  O_LOCK || eFileL
8ae0: 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
8af0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46   );.  assert( eF
8b00: 69 6c 65 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e 47  ileLock!=PENDING
8b10: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
8b20: 74 28 20 65 46 69 6c 65 4c 6f 63 6b 21 3d 52 45  t( eFileLock!=RE
8b30: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70  SERVED_LOCK || p
8b40: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  File->eFileLock=
8b50: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
8b60: 0a 20 20 2f 2a 20 54 68 69 73 20 6d 75 74 65 78  .  /* This mutex
8b70: 20 69 73 20 6e 65 65 64 65 64 20 62 65 63 61 75   is needed becau
8b80: 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  se pFile->pInode
8b90: 20 69 73 20 73 68 61 72 65 64 20 61 63 72 6f 73   is shared acros
8ba0: 73 20 74 68 72 65 61 64 73 0a 20 20 2a 2f 0a 20  s threads.  */. 
8bb0: 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
8bc0: 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70 46  );.  pInode = pF
8bd0: 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 0a 20 20  ile->pInode;..  
8be0: 2f 2a 20 49 66 20 73 6f 6d 65 20 74 68 72 65 61  /* If some threa
8bf0: 64 20 75 73 69 6e 67 20 74 68 69 73 20 50 49 44  d using this PID
8c00: 20 68 61 73 20 61 20 6c 6f 63 6b 20 76 69 61 20   has a lock via 
8c10: 61 20 64 69 66 66 65 72 65 6e 74 20 75 6e 69 78  a different unix
8c20: 46 69 6c 65 2a 0a 20 20 2a 2a 20 68 61 6e 64 6c  File*.  ** handl
8c30: 65 20 74 68 61 74 20 70 72 65 63 6c 75 64 65 73  e that precludes
8c40: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
8c50: 6f 63 6b 2c 20 72 65 74 75 72 6e 20 42 55 53 59  ock, return BUSY
8c60: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 46  ..  */.  if( (pF
8c70: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d  ile->eFileLock!=
8c80: 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
8c90: 6b 20 26 26 20 0a 20 20 20 20 20 20 20 20 20 20  k && .          
8ca0: 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f  (pInode->eFileLo
8cb0: 63 6b 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  ck>=PENDING_LOCK
8cc0: 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3e 53 48   || eFileLock>SH
8cd0: 41 52 45 44 5f 4c 4f 43 4b 29 29 0a 20 20 29 7b  ARED_LOCK)).  ){
8ce0: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
8cf0: 5f 42 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20  _BUSY;.    goto 
8d00: 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20  end_lock;.  }.. 
8d10: 20 2f 2a 20 49 66 20 61 20 53 48 41 52 45 44 20   /* If a SHARED 
8d20: 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74 65  lock is requeste
8d30: 64 2c 20 61 6e 64 20 73 6f 6d 65 20 74 68 72 65  d, and some thre
8d40: 61 64 20 75 73 69 6e 67 20 74 68 69 73 20 50 49  ad using this PI
8d50: 44 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 68  D already.  ** h
8d60: 61 73 20 61 20 53 48 41 52 45 44 20 6f 72 20 52  as a SHARED or R
8d70: 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 74 68  ESERVED lock, th
8d80: 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 72 65 66  en increment ref
8d90: 65 72 65 6e 63 65 20 63 6f 75 6e 74 73 20 61 6e  erence counts an
8da0: 64 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 53 51  d.  ** return SQ
8db0: 4c 49 54 45 5f 4f 4b 2e 0a 20 20 2a 2f 0a 20 20  LITE_OK..  */.  
8dc0: 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  if( eFileLock==S
8dd0: 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20 0a 20  HARED_LOCK && . 
8de0: 20 20 20 20 20 28 70 49 6e 6f 64 65 2d 3e 65 46       (pInode->eF
8df0: 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
8e00: 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e  LOCK || pInode->
8e10: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52  eFileLock==RESER
8e20: 56 45 44 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20  VED_LOCK) ){.   
8e30: 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f   assert( eFileLo
8e40: 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
8e50: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
8e60: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  File->eFileLock=
8e70: 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
8e80: 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  ( pInode->nShare
8e90: 64 3e 30 20 29 3b 0a 20 20 20 20 70 46 69 6c 65  d>0 );.    pFile
8ea0: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48  ->eFileLock = SH
8eb0: 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70  ARED_LOCK;.    p
8ec0: 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2b 2b  Inode->nShared++
8ed0: 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c  ;.    pInode->nL
8ee0: 6f 63 6b 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20  ock++;.    goto 
8ef0: 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 0a  end_lock;.  }...
8f00: 20 20 2f 2a 20 41 20 50 45 4e 44 49 4e 47 20 6c    /* A PENDING l
8f10: 6f 63 6b 20 69 73 20 6e 65 65 64 65 64 20 62 65  ock is needed be
8f20: 66 6f 72 65 20 61 63 71 75 69 72 69 6e 67 20 61  fore acquiring a
8f30: 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 61 6e 64   SHARED lock and
8f40: 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20 61 63 71   before.  ** acq
8f50: 75 69 72 69 6e 67 20 61 6e 20 45 58 43 4c 55 53  uiring an EXCLUS
8f60: 49 56 45 20 6c 6f 63 6b 2e 20 20 46 6f 72 20 74  IVE lock.  For t
8f70: 68 65 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20  he SHARED lock, 
8f80: 74 68 65 20 50 45 4e 44 49 4e 47 20 77 69 6c 6c  the PENDING will
8f90: 0a 20 20 2a 2a 20 62 65 20 72 65 6c 65 61 73 65  .  ** be release
8fa0: 64 2e 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b 2e 6c  d..  */.  lock.l
8fb0: 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 20 20 6c 6f 63  _len = 1L;.  loc
8fc0: 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45  k.l_whence = SEE
8fd0: 4b 5f 53 45 54 3b 0a 20 20 69 66 28 20 65 46 69  K_SET;.  if( eFi
8fe0: 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
8ff0: 4f 43 4b 20 0a 20 20 20 20 20 20 7c 7c 20 28 65  OCK .      || (e
9000: 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  FileLock==EXCLUS
9010: 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c  IVE_LOCK && pFil
9020: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 50 45 4e  e->eFileLock<PEN
9030: 44 49 4e 47 5f 4c 4f 43 4b 29 0a 20 20 29 7b 0a  DING_LOCK).  ){.
9040: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20      lock.l_type 
9050: 3d 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  = (eFileLock==SH
9060: 41 52 45 44 5f 4c 4f 43 4b 3f 46 5f 52 44 4c 43  ARED_LOCK?F_RDLC
9070: 4b 3a 46 5f 57 52 4c 43 4b 29 3b 0a 20 20 20 20  K:F_WRLCK);.    
9080: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50  lock.l_start = P
9090: 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20  ENDING_BYTE;.   
90a0: 20 73 20 3d 20 66 63 6e 74 6c 28 70 46 69 6c 65   s = fcntl(pFile
90b0: 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c  ->h, F_SETLK, &l
90c0: 6f 63 6b 29 3b 0a 20 20 20 20 69 66 28 20 73 3d  ock);.    if( s=
90d0: 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 74  =(-1) ){.      t
90e0: 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
90f0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
9100: 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
9110: 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49  ror(tErrno, SQLI
9120: 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a  TE_IOERR_LOCK);.
9130: 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43        if( IS_LOC
9140: 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20  K_ERROR(rc) ){. 
9150: 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61         pFile->la
9160: 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f  stErrno = tErrno
9170: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
9180: 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20  goto end_lock;. 
9190: 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20     }.  }...  /* 
91a0: 49 66 20 63 6f 6e 74 72 6f 6c 20 67 65 74 73 20  If control gets 
91b0: 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74  to this point, t
91c0: 68 65 6e 20 61 63 74 75 61 6c 6c 79 20 67 6f 20  hen actually go 
91d0: 61 68 65 61 64 20 61 6e 64 20 6d 61 6b 65 0a 20  ahead and make. 
91e0: 20 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 73 79   ** operating sy
91f0: 73 74 65 6d 20 63 61 6c 6c 73 20 66 6f 72 20 74  stem calls for t
9200: 68 65 20 73 70 65 63 69 66 69 65 64 20 6c 6f 63  he specified loc
9210: 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 46  k..  */.  if( eF
9220: 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
9230: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73 73 65  LOCK ){.    asse
9240: 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61  rt( pInode->nSha
9250: 72 65 64 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  red==0 );.    as
9260: 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 65 46  sert( pInode->eF
9270: 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 0a 20  ileLock==0 );.. 
9280: 20 20 20 2f 2a 20 4e 6f 77 20 67 65 74 20 74 68     /* Now get th
9290: 65 20 72 65 61 64 2d 6c 6f 63 6b 20 2a 2f 0a 20  e read-lock */. 
92a0: 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20     lock.l_start 
92b0: 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a  = SHARED_FIRST;.
92c0: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d      lock.l_len =
92d0: 20 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20   SHARED_SIZE;.  
92e0: 20 20 69 66 28 20 28 73 20 3d 20 66 63 6e 74 6c    if( (s = fcntl
92f0: 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54  (pFile->h, F_SET
9300: 4c 4b 2c 20 26 6c 6f 63 6b 29 29 3d 3d 28 2d 31  LK, &lock))==(-1
9310: 29 20 29 7b 0a 20 20 20 20 20 20 74 45 72 72 6e  ) ){.      tErrn
9320: 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 7d  o = errno;.    }
9330: 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 74 68 65  .    /* Drop the
9340: 20 74 65 6d 70 6f 72 61 72 79 20 50 45 4e 44 49   temporary PENDI
9350: 4e 47 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c  NG lock */.    l
9360: 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50 45  ock.l_start = PE
9370: 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20 20  NDING_BYTE;.    
9380: 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c 3b  lock.l_len = 1L;
9390: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65  .    lock.l_type
93a0: 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20   = F_UNLCK;.    
93b0: 69 66 28 20 66 63 6e 74 6c 28 70 46 69 6c 65 2d  if( fcntl(pFile-
93c0: 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f  >h, F_SETLK, &lo
93d0: 63 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ck)!=0 ){.      
93e0: 69 66 28 20 73 20 21 3d 20 2d 31 20 29 7b 0a 20  if( s != -1 ){. 
93f0: 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63         /* This c
9400: 6f 75 6c 64 20 68 61 70 70 65 6e 20 77 69 74 68  ould happen with
9410: 20 61 20 6e 65 74 77 6f 72 6b 20 6d 6f 75 6e 74   a network mount
9420: 20 2a 2f 0a 20 20 20 20 20 20 20 20 74 45 72 72   */.        tErr
9430: 6e 6f 20 3d 20 65 72 72 6e 6f 3b 20 0a 20 20 20  no = errno; .   
9440: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
9450: 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
9460: 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49  ror(tErrno, SQLI
9470: 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29  TE_IOERR_UNLOCK)
9480: 3b 20 0a 20 20 20 20 20 20 20 20 69 66 28 20 49  ; .        if( I
9490: 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29  S_LOCK_ERROR(rc)
94a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46   ){.          pF
94b0: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
94c0: 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20   tErrno;.       
94d0: 20 7d 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20   }.        goto 
94e0: 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 20 20  end_lock;.      
94f0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
9500: 73 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20  s==(-1) ){.     
9510: 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f   rc = sqliteErro
9520: 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28  rFromPosixError(
9530: 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49  tErrno, SQLITE_I
9540: 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  OERR_LOCK);.    
9550: 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52    if( IS_LOCK_ER
9560: 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20  ROR(rc) ){.     
9570: 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
9580: 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20  rno = tErrno;.  
9590: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
95a0: 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46  .      pFile->eF
95b0: 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44  ileLock = SHARED
95c0: 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 70 49 6e  _LOCK;.      pIn
95d0: 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20  ode->nLock++;.  
95e0: 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61      pInode->nSha
95f0: 72 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  red = 1;.    }. 
9600: 20 7d 65 6c 73 65 20 69 66 28 20 65 46 69 6c 65   }else if( eFile
9610: 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
9620: 4c 4f 43 4b 20 26 26 20 70 49 6e 6f 64 65 2d 3e  LOCK && pInode->
9630: 6e 53 68 61 72 65 64 3e 31 20 29 7b 0a 20 20 20  nShared>1 ){.   
9640: 20 2f 2a 20 57 65 20 61 72 65 20 74 72 79 69 6e   /* We are tryin
9650: 67 20 66 6f 72 20 61 6e 20 65 78 63 6c 75 73 69  g for an exclusi
9660: 76 65 20 6c 6f 63 6b 20 62 75 74 20 61 6e 6f 74  ve lock but anot
9670: 68 65 72 20 74 68 72 65 61 64 20 69 6e 20 74 68  her thread in th
9680: 69 73 0a 20 20 20 20 2a 2a 20 73 61 6d 65 20 70  is.    ** same p
9690: 72 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20  rocess is still 
96a0: 68 6f 6c 64 69 6e 67 20 61 20 73 68 61 72 65 64  holding a shared
96b0: 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 20 20 72 63   lock. */.    rc
96c0: 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
96d0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
96e0: 54 68 65 20 72 65 71 75 65 73 74 20 77 61 73 20  The request was 
96f0: 66 6f 72 20 61 20 52 45 53 45 52 56 45 44 20 6f  for a RESERVED o
9700: 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  r EXCLUSIVE lock
9710: 2e 20 20 49 74 20 69 73 0a 20 20 20 20 2a 2a 20  .  It is.    ** 
9720: 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65  assumed that the
9730: 72 65 20 69 73 20 61 20 53 48 41 52 45 44 20 6f  re is a SHARED o
9740: 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f  r greater lock o
9750: 6e 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a  n the file.    *
9760: 2a 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a  * already..    *
9770: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 30 21  /.    assert( 0!
9780: 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63  =pFile->eFileLoc
9790: 6b 20 29 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  k );.    lock.l_
97a0: 74 79 70 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a  type = F_WRLCK;.
97b0: 20 20 20 20 73 77 69 74 63 68 28 20 65 46 69 6c      switch( eFil
97c0: 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 63  eLock ){.      c
97d0: 61 73 65 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  ase RESERVED_LOC
97e0: 4b 3a 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e  K:.        lock.
97f0: 6c 5f 73 74 61 72 74 20 3d 20 52 45 53 45 52 56  l_start = RESERV
9800: 45 44 5f 42 59 54 45 3b 0a 20 20 20 20 20 20 20  ED_BYTE;.       
9810: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
9820: 73 65 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  se EXCLUSIVE_LOC
9830: 4b 3a 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e  K:.        lock.
9840: 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45 44  l_start = SHARED
9850: 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20 20 20  _FIRST;.        
9860: 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41  lock.l_len = SHA
9870: 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20  RED_SIZE;.      
9880: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 64    break;.      d
9890: 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 20 20  efault:.        
98a0: 61 73 73 65 72 74 28 30 29 3b 0a 20 20 20 20 7d  assert(0);.    }
98b0: 0a 20 20 20 20 73 20 3d 20 66 63 6e 74 6c 28 70  .    s = fcntl(p
98c0: 46 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b  File->h, F_SETLK
98d0: 2c 20 26 6c 6f 63 6b 29 3b 0a 20 20 20 20 69 66  , &lock);.    if
98e0: 28 20 73 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20  ( s==(-1) ){.   
98f0: 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e     tErrno = errn
9900: 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  o;.      rc = sq
9910: 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73  liteErrorFromPos
9920: 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20  ixError(tErrno, 
9930: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43  SQLITE_IOERR_LOC
9940: 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 49 53  K);.      if( IS
9950: 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20  _LOCK_ERROR(rc) 
9960: 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65  ){.        pFile
9970: 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45  ->lastErrno = tE
9980: 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rrno;.      }.  
9990: 20 20 7d 0a 20 20 7d 0a 20 20 0a 0a 23 69 66 6e    }.  }.  ..#ifn
99a0: 64 65 66 20 4e 44 45 42 55 47 0a 20 20 2f 2a 20  def NDEBUG.  /* 
99b0: 53 65 74 20 75 70 20 74 68 65 20 74 72 61 6e 73  Set up the trans
99c0: 61 63 74 69 6f 6e 2d 63 6f 75 6e 74 65 72 20 63  action-counter c
99d0: 68 61 6e 67 65 20 63 68 65 63 6b 69 6e 67 20 66  hange checking f
99e0: 6c 61 67 73 20 77 68 65 6e 0a 20 20 2a 2a 20 74  lags when.  ** t
99f0: 72 61 6e 73 69 74 69 6f 6e 69 6e 67 20 66 72 6f  ransitioning fro
9a00: 6d 20 61 20 53 48 41 52 45 44 20 74 6f 20 61 20  m a SHARED to a 
9a10: 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2e 20 20  RESERVED lock.  
9a20: 54 68 65 20 63 68 61 6e 67 65 0a 20 20 2a 2a 20  The change.  ** 
9a30: 66 72 6f 6d 20 53 48 41 52 45 44 20 74 6f 20 52  from SHARED to R
9a40: 45 53 45 52 56 45 44 20 6d 61 72 6b 73 20 74 68  ESERVED marks th
9a50: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61  e beginning of a
9a60: 20 6e 6f 72 6d 61 6c 0a 20 20 2a 2a 20 77 72 69   normal.  ** wri
9a70: 74 65 20 6f 70 65 72 61 74 69 6f 6e 20 28 6e 6f  te operation (no
9a80: 74 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20  t a hot journal 
9a90: 72 6f 6c 6c 62 61 63 6b 29 2e 0a 20 20 2a 2f 0a  rollback)..  */.
9aa0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
9ab0: 5f 4f 4b 0a 20 20 20 26 26 20 70 46 69 6c 65 2d  _OK.   && pFile-
9ac0: 3e 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52  >eFileLock<=SHAR
9ad0: 45 44 5f 4c 4f 43 4b 0a 20 20 20 26 26 20 65 46  ED_LOCK.   && eF
9ae0: 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45  ileLock==RESERVE
9af0: 44 5f 4c 4f 43 4b 0a 20 20 29 7b 0a 20 20 20 20  D_LOCK.  ){.    
9b00: 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72  pFile->transCntr
9b10: 43 68 6e 67 20 3d 20 30 3b 0a 20 20 20 20 70 46  Chng = 0;.    pF
9b20: 69 6c 65 2d 3e 64 62 55 70 64 61 74 65 20 3d 20  ile->dbUpdate = 
9b30: 30 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 69 6e  0;.    pFile->in
9b40: 4e 6f 72 6d 61 6c 57 72 69 74 65 20 3d 20 31 3b  NormalWrite = 1;
9b50: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 0a 20 20  .  }.#endif...  
9b60: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
9b70: 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  K ){.    pFile->
9b80: 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c  eFileLock = eFil
9b90: 65 4c 6f 63 6b 3b 0a 20 20 20 20 70 49 6e 6f 64  eLock;.    pInod
9ba0: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65  e->eFileLock = e
9bb0: 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 7d 65 6c 73  FileLock;.  }els
9bc0: 65 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d  e if( eFileLock=
9bd0: 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
9be0: 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46  ){.    pFile->eF
9bf0: 69 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e 44 49 4e  ileLock = PENDIN
9c00: 47 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 49 6e 6f  G_LOCK;.    pIno
9c10: 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  de->eFileLock = 
9c20: 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20  PENDING_LOCK;.  
9c30: 7d 0a 0a 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 75  }..end_lock:.  u
9c40: 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
9c50: 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43  .  OSTRACE(("LOC
9c60: 4b 20 20 20 20 25 64 20 25 73 20 25 73 20 28 75  K    %d %s %s (u
9c70: 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  nix)\n", pFile->
9c80: 68 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46  h, azFileLock(eF
9c90: 69 6c 65 4c 6f 63 6b 29 2c 20 0a 20 20 20 20 20  ileLock), .     
9ca0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f   rc==SQLITE_OK ?
9cb0: 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22   "ok" : "failed"
9cc0: 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ));.  return rc;
9cd0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74 68  .}../*.** Add th
9ce0: 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
9cf0: 72 20 75 73 65 64 20 62 79 20 66 69 6c 65 20 68  r used by file h
9d00: 61 6e 64 6c 65 20 70 46 69 6c 65 20 74 6f 20 74  andle pFile to t
9d10: 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
9d20: 0a 2a 2a 20 70 55 6e 75 73 65 64 20 6c 69 73 74  .** pUnused list
9d30: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
9d40: 20 73 65 74 50 65 6e 64 69 6e 67 46 64 28 75 6e   setPendingFd(un
9d50: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a  ixFile *pFile){.
9d60: 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20    unixInodeInfo 
9d70: 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d  *pInode = pFile-
9d80: 3e 70 49 6e 6f 64 65 3b 0a 20 20 55 6e 69 78 55  >pInode;.  UnixU
9d90: 6e 75 73 65 64 46 64 20 2a 70 20 3d 20 70 46 69  nusedFd *p = pFi
9da0: 6c 65 2d 3e 70 55 6e 75 73 65 64 3b 0a 20 20 70  le->pUnused;.  p
9db0: 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 6f 64 65  ->pNext = pInode
9dc0: 2d 3e 70 55 6e 75 73 65 64 3b 0a 20 20 70 49 6e  ->pUnused;.  pIn
9dd0: 6f 64 65 2d 3e 70 55 6e 75 73 65 64 20 3d 20 70  ode->pUnused = p
9de0: 3b 0a 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 2d  ;.  pFile->h = -
9df0: 31 3b 0a 20 20 70 46 69 6c 65 2d 3e 70 55 6e 75  1;.  pFile->pUnu
9e00: 73 65 64 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  sed = 0;.}../*.*
9e10: 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b  * Lower the lock
9e20: 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c  ing level on fil
9e30: 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69  e descriptor pFi
9e40: 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e  le to eFileLock.
9e50: 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d    eFileLock.** m
9e60: 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f  ust be either NO
9e70: 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f  _LOCK or SHARED_
9e80: 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  LOCK..**.** If t
9e90: 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
9ea0: 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73   of the file des
9eb0: 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61  criptor is alrea
9ec0: 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a  dy at or below.*
9ed0: 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  * the requested 
9ee0: 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74  locking level, t
9ef0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
9f00: 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 0a 2a 2a 20 49   no-op..** .** I
9f10: 66 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63  f handleNFSUnloc
9f20: 6b 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  k is true, then 
9f30: 6f 6e 20 64 6f 77 6e 67 72 61 64 69 6e 67 20 61  on downgrading a
9f40: 6e 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  n EXCLUSIVE_LOCK
9f50: 20 74 6f 20 53 48 41 52 45 44 0a 2a 2a 20 74 68   to SHARED.** th
9f60: 65 20 62 79 74 65 20 72 61 6e 67 65 20 69 73 20  e byte range is 
9f70: 64 69 76 69 64 65 64 20 69 6e 74 6f 20 32 20 70  divided into 2 p
9f80: 61 72 74 73 20 61 6e 64 20 74 68 65 20 66 69 72  arts and the fir
9f90: 73 74 20 70 61 72 74 20 69 73 20 75 6e 6c 6f 63  st part is unloc
9fa0: 6b 65 64 20 74 68 65 6e 0a 2a 2a 20 73 65 74 20  ked then.** set 
9fb0: 74 6f 20 61 20 72 65 61 64 20 6c 6f 63 6b 2c 20  to a read lock, 
9fc0: 74 68 65 6e 20 74 68 65 20 6f 74 68 65 72 20 70  then the other p
9fd0: 61 72 74 20 69 73 20 73 69 6d 70 6c 79 20 75 6e  art is simply un
9fe0: 6c 6f 63 6b 65 64 2e 20 20 54 68 69 73 20 77 6f  locked.  This wo
9ff0: 72 6b 73 20 0a 2a 2a 20 61 72 6f 75 6e 64 20 61  rks .** around a
a000: 20 62 75 67 20 69 6e 20 42 53 44 20 4e 46 53 20   bug in BSD NFS 
a010: 6c 6f 63 6b 64 20 28 61 6c 73 6f 20 73 65 65 6e  lockd (also seen
a020: 20 6f 6e 20 4d 61 63 4f 53 58 20 31 30 2e 33 2b   on MacOSX 10.3+
a030: 29 20 74 68 61 74 20 66 61 69 6c 73 20 74 6f 20  ) that fails to 
a040: 0a 2a 2a 20 72 65 6d 6f 76 65 20 74 68 65 20 77  .** remove the w
a050: 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 61 20 72  rite lock on a r
a060: 65 67 69 6f 6e 20 77 68 65 6e 20 61 20 72 65 61  egion when a rea
a070: 64 20 6c 6f 63 6b 20 69 73 20 73 65 74 2e 0a 2a  d lock is set..*
a080: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 5f 70 6f  /.static int _po
a090: 73 69 78 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65  sixUnlock(sqlite
a0a0: 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
a0b0: 65 46 69 6c 65 4c 6f 63 6b 2c 20 69 6e 74 20 68  eFileLock, int h
a0c0: 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 29 7b  andleNFSUnlock){
a0d0: 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
a0e0: 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
a0f0: 69 64 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49  id;.  unixInodeI
a100: 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a 20 20 73  nfo *pInode;.  s
a110: 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b  truct flock lock
a120: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
a130: 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 68 3b  ITE_OK;.  int h;
a140: 0a 20 20 69 6e 74 20 74 45 72 72 6e 6f 3b 20 20  .  int tErrno;  
a150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a160: 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64      /* Error cod
a170: 65 20 66 72 6f 6d 20 73 79 73 74 65 6d 20 63 61  e from system ca
a180: 6c 6c 20 65 72 72 6f 72 73 20 2a 2f 0a 0a 20 20  ll errors */..  
a190: 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
a1a0: 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c  .  OSTRACE(("UNL
a1b0: 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73 20 25  OCK  %d %d was %
a1c0: 64 28 25 64 2c 25 64 29 20 70 69 64 3d 25 64 20  d(%d,%d) pid=%d 
a1d0: 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65  (unix)\n", pFile
a1e0: 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a  ->h, eFileLock,.
a1f0: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69        pFile->eFi
a200: 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e 70  leLock, pFile->p
a210: 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
a220: 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  , pFile->pInode-
a230: 3e 6e 53 68 61 72 65 64 2c 0a 20 20 20 20 20 20  >nShared,.      
a240: 67 65 74 70 69 64 28 29 29 29 3b 0a 0a 20 20 61  getpid()));..  a
a250: 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b  ssert( eFileLock
a260: 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  <=SHARED_LOCK );
a270: 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46  .  if( pFile->eF
a280: 69 6c 65 4c 6f 63 6b 3c 3d 65 46 69 6c 65 4c 6f  ileLock<=eFileLo
a290: 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ck ){.    return
a2a0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
a2b0: 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
a2c0: 28 29 3b 0a 20 20 68 20 3d 20 70 46 69 6c 65 2d  ();.  h = pFile-
a2d0: 3e 68 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70  >h;.  pInode = p
a2e0: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20  File->pInode;.  
a2f0: 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e  assert( pInode->
a300: 6e 53 68 61 72 65 64 21 3d 30 20 29 3b 0a 20 20  nShared!=0 );.  
a310: 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  if( pFile->eFile
a320: 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b  Lock>SHARED_LOCK
a330: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
a340: 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
a350: 6b 3d 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  k==pFile->eFileL
a360: 6f 63 6b 20 29 3b 0a 20 20 20 20 53 69 6d 75 6c  ock );.    Simul
a370: 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e  ateIOErrorBenign
a380: 28 31 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74  (1);.    Simulat
a390: 65 49 4f 45 72 72 6f 72 28 20 68 3d 28 2d 31 29  eIOError( h=(-1)
a3a0: 20 29 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49   ).    SimulateI
a3b0: 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b  OErrorBenign(0);
a3c0: 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  ..#ifndef NDEBUG
a3d0: 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 72 65 64  .    /* When red
a3e0: 75 63 69 6e 67 20 61 20 6c 6f 63 6b 20 73 75 63  ucing a lock suc
a3f0: 68 20 74 68 61 74 20 6f 74 68 65 72 20 70 72 6f  h that other pro
a400: 63 65 73 73 65 73 20 63 61 6e 20 73 74 61 72 74  cesses can start
a410: 0a 20 20 20 20 2a 2a 20 72 65 61 64 69 6e 67 20  .    ** reading 
a420: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
a430: 65 20 61 67 61 69 6e 2c 20 6d 61 6b 65 20 73 75  e again, make su
a440: 72 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20  re that the.    
a450: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  ** transaction c
a460: 6f 75 6e 74 65 72 20 77 61 73 20 75 70 64 61 74  ounter was updat
a470: 65 64 20 69 66 20 61 6e 79 20 70 61 72 74 20 6f  ed if any part o
a480: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20  f the database. 
a490: 20 20 20 2a 2a 20 66 69 6c 65 20 63 68 61 6e 67     ** file chang
a4a0: 65 64 2e 20 20 49 66 20 74 68 65 20 74 72 61 6e  ed.  If the tran
a4b0: 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20  saction counter 
a4c0: 69 73 20 6e 6f 74 20 75 70 64 61 74 65 64 2c 0a  is not updated,.
a4d0: 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 63 6f 6e      ** other con
a4e0: 6e 65 63 74 69 6f 6e 73 20 74 6f 20 74 68 65 20  nections to the 
a4f0: 73 61 6d 65 20 66 69 6c 65 20 6d 69 67 68 74 20  same file might 
a500: 6e 6f 74 20 72 65 61 6c 69 7a 65 20 74 68 61 74  not realize that
a510: 0a 20 20 20 20 2a 2a 20 74 68 65 20 66 69 6c 65  .    ** the file
a520: 20 68 61 73 20 63 68 61 6e 67 65 64 20 61 6e 64   has changed and
a530: 20 68 65 6e 63 65 20 6d 69 67 68 74 20 6e 6f 74   hence might not
a540: 20 6b 6e 6f 77 20 74 6f 20 66 6c 75 73 68 20 74   know to flush t
a550: 68 65 69 72 0a 20 20 20 20 2a 2a 20 63 61 63 68  heir.    ** cach
a560: 65 2e 20 20 54 68 65 20 75 73 65 20 6f 66 20 61  e.  The use of a
a570: 20 73 74 61 6c 65 20 63 61 63 68 65 20 63 61 6e   stale cache can
a580: 20 6c 65 61 64 20 74 6f 20 64 61 74 61 62 61 73   lead to databas
a590: 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20  e corruption..  
a5a0: 20 20 2a 2f 0a 23 69 66 20 30 0a 20 20 20 20 61    */.#if 0.    a
a5b0: 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 69 6e  ssert( pFile->in
a5c0: 4e 6f 72 6d 61 6c 57 72 69 74 65 3d 3d 30 0a 20  NormalWrite==0. 
a5d0: 20 20 20 20 20 20 20 20 7c 7c 20 70 46 69 6c 65          || pFile
a5e0: 2d 3e 64 62 55 70 64 61 74 65 3d 3d 30 0a 20 20  ->dbUpdate==0.  
a5f0: 20 20 20 20 20 20 20 7c 7c 20 70 46 69 6c 65 2d         || pFile-
a600: 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 3d 3d  >transCntrChng==
a610: 31 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  1 );.#endif.    
a620: 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57  pFile->inNormalW
a630: 72 69 74 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66  rite = 0;.#endif
a640: 0a 0a 20 20 20 20 2f 2a 20 64 6f 77 6e 67 72 61  ..    /* downgra
a650: 64 69 6e 67 20 74 6f 20 61 20 73 68 61 72 65 64  ding to a shared
a660: 20 6c 6f 63 6b 20 6f 6e 20 4e 46 53 20 69 6e 76   lock on NFS inv
a670: 6f 6c 76 65 73 20 63 6c 65 61 72 69 6e 67 20 74  olves clearing t
a680: 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 0a 20 20  he write lock.  
a690: 20 20 2a 2a 20 62 65 66 6f 72 65 20 65 73 74 61    ** before esta
a6a0: 62 6c 69 73 68 69 6e 67 20 74 68 65 20 72 65 61  blishing the rea
a6b0: 64 6c 6f 63 6b 20 2d 20 74 6f 20 61 76 6f 69 64  dlock - to avoid
a6c0: 20 61 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f   a race conditio
a6d0: 6e 20 77 65 20 64 6f 77 6e 67 72 61 64 65 0a 20  n we downgrade. 
a6e0: 20 20 20 2a 2a 20 74 68 65 20 6c 6f 63 6b 20 69     ** the lock i
a6f0: 6e 20 32 20 62 6c 6f 63 6b 73 2c 20 73 6f 20 74  n 2 blocks, so t
a700: 68 61 74 20 70 61 72 74 20 6f 66 20 74 68 65 20  hat part of the 
a710: 72 61 6e 67 65 20 77 69 6c 6c 20 62 65 20 63 6f  range will be co
a720: 76 65 72 65 64 20 62 79 20 61 20 0a 20 20 20 20  vered by a .    
a730: 2a 2a 20 77 72 69 74 65 20 6c 6f 63 6b 20 75 6e  ** write lock un
a740: 74 69 6c 20 74 68 65 20 72 65 73 74 20 69 73 20  til the rest is 
a750: 63 6f 76 65 72 65 64 20 62 79 20 61 20 72 65 61  covered by a rea
a760: 64 20 6c 6f 63 6b 3a 0a 20 20 20 20 2a 2a 20 20  d lock:.    **  
a770: 31 3a 20 20 20 5b 57 57 57 57 57 5d 0a 20 20 20  1:   [WWWWW].   
a780: 20 2a 2a 20 20 32 3a 20 20 20 5b 2e 2e 2e 2e 57   **  2:   [....W
a790: 5d 0a 20 20 20 20 2a 2a 20 20 33 3a 20 20 20 5b  ].    **  3:   [
a7a0: 52 52 52 52 57 5d 0a 20 20 20 20 2a 2a 20 20 34  RRRRW].    **  4
a7b0: 3a 20 20 20 5b 52 52 52 52 2e 5d 0a 20 20 20 20  :   [RRRR.].    
a7c0: 2a 2f 0a 20 20 20 20 69 66 28 20 65 46 69 6c 65  */.    if( eFile
a7d0: 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
a7e0: 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 68  K ){.      if( h
a7f0: 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 20 29  andleNFSUnlock )
a800: 7b 0a 20 20 20 20 20 20 20 20 6f 66 66 5f 74 20  {.        off_t 
a810: 64 69 76 53 69 7a 65 20 3d 20 53 48 41 52 45 44  divSize = SHARED
a820: 5f 53 49 5a 45 20 2d 20 31 3b 0a 20 20 20 20 20  _SIZE - 1;.     
a830: 20 20 20 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b     .        lock
a840: 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43  .l_type = F_UNLC
a850: 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e  K;.        lock.
a860: 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f  l_whence = SEEK_
a870: 53 45 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63  SET;.        loc
a880: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52  k.l_start = SHAR
a890: 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20  ED_FIRST;.      
a8a0: 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 64    lock.l_len = d
a8b0: 69 76 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20  ivSize;.        
a8c0: 69 66 28 20 66 63 6e 74 6c 28 68 2c 20 46 5f 53  if( fcntl(h, F_S
a8d0: 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3d 3d 28 2d  ETLK, &lock)==(-
a8e0: 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  1) ){.          
a8f0: 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
a900: 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
a910: 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
a920: 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c  sixError(tErrno,
a930: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e   SQLITE_IOERR_UN
a940: 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 20  LOCK);.         
a950: 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
a960: 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20  OR(rc) ){.      
a970: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
a980: 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b  tErrno = tErrno;
a990: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
a9a0: 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
a9b0: 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20  unlock;.        
a9c0: 7d 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  }.        lock.l
a9d0: 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b  _type = F_RDLCK;
a9e0: 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  .        lock.l_
a9f0: 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45  whence = SEEK_SE
aa00: 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e  T;.        lock.
aa10: 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45 44  l_start = SHARED
aa20: 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20 20 20  _FIRST;.        
aa30: 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 64 69 76  lock.l_len = div
aa40: 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69 66  Size;.        if
aa50: 28 20 66 63 6e 74 6c 28 68 2c 20 46 5f 53 45 54  ( fcntl(h, F_SET
aa60: 4c 4b 2c 20 26 6c 6f 63 6b 29 3d 3d 28 2d 31 29  LK, &lock)==(-1)
aa70: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74 45   ){.          tE
aa80: 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
aa90: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
aaa0: 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
aab0: 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53  xError(tErrno, S
aac0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f  QLITE_IOERR_RDLO
aad0: 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  CK);.          i
aae0: 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
aaf0: 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20  (rc) ){.        
ab00: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
ab10: 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20  rrno = tErrno;. 
ab20: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
ab30: 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e       goto end_un
ab40: 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  lock;.        }.
ab50: 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74          lock.l_t
ab60: 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20  ype = F_UNLCK;. 
ab70: 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68         lock.l_wh
ab80: 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b  ence = SEEK_SET;
ab90: 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  .        lock.l_
aba0: 73 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46  start = SHARED_F
abb0: 49 52 53 54 2b 64 69 76 53 69 7a 65 3b 0a 20 20  IRST+divSize;.  
abc0: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e        lock.l_len
abd0: 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 2d 64   = SHARED_SIZE-d
abe0: 69 76 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20  ivSize;.        
abf0: 69 66 28 20 66 63 6e 74 6c 28 68 2c 20 46 5f 53  if( fcntl(h, F_S
ac00: 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3d 3d 28 2d  ETLK, &lock)==(-
ac10: 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  1) ){.          
ac20: 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
ac30: 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
ac40: 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
ac50: 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c  sixError(tErrno,
ac60: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e   SQLITE_IOERR_UN
ac70: 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 20  LOCK);.         
ac80: 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
ac90: 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20  OR(rc) ){.      
aca0: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
acb0: 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b  tErrno = tErrno;
acc0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
acd0: 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
ace0: 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20  unlock;.        
acf0: 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
ad00: 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79         lock.l_ty
ad10: 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20  pe = F_RDLCK;.  
ad20: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65        lock.l_whe
ad30: 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a  nce = SEEK_SET;.
ad40: 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73          lock.l_s
ad50: 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49  tart = SHARED_FI
ad60: 52 53 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63  RST;.        loc
ad70: 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44  k.l_len = SHARED
ad80: 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20 20 20 69  _SIZE;.        i
ad90: 66 28 20 66 63 6e 74 6c 28 68 2c 20 46 5f 53 45  f( fcntl(h, F_SE
ada0: 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3d 3d 28 2d 31  TLK, &lock)==(-1
adb0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74  ) ){.          t
adc0: 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
add0: 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
ade0: 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73  liteErrorFromPos
adf0: 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20  ixError(tErrno, 
ae00: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c  SQLITE_IOERR_RDL
ae10: 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  OCK);.          
ae20: 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  if( IS_LOCK_ERRO
ae30: 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20  R(rc) ){.       
ae40: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
ae50: 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a  Errno = tErrno;.
ae60: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
ae70: 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75        goto end_u
ae80: 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d  nlock;.        }
ae90: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
aea0: 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d     lock.l_type =
aeb0: 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 6c 6f   F_UNLCK;.    lo
aec0: 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45  ck.l_whence = SE
aed0: 45 4b 5f 53 45 54 3b 0a 20 20 20 20 6c 6f 63 6b  EK_SET;.    lock
aee0: 2e 6c 5f 73 74 61 72 74 20 3d 20 50 45 4e 44 49  .l_start = PENDI
aef0: 4e 47 5f 42 59 54 45 3b 0a 20 20 20 20 6c 6f 63  NG_BYTE;.    loc
af00: 6b 2e 6c 5f 6c 65 6e 20 3d 20 32 4c 3b 20 20 61  k.l_len = 2L;  a
af10: 73 73 65 72 74 28 20 50 45 4e 44 49 4e 47 5f 42  ssert( PENDING_B
af20: 59 54 45 2b 31 3d 3d 52 45 53 45 52 56 45 44 5f  YTE+1==RESERVED_
af30: 42 59 54 45 20 29 3b 0a 20 20 20 20 69 66 28 20  BYTE );.    if( 
af40: 66 63 6e 74 6c 28 68 2c 20 46 5f 53 45 54 4c 4b  fcntl(h, F_SETLK
af50: 2c 20 26 6c 6f 63 6b 29 21 3d 28 2d 31 29 20 29  , &lock)!=(-1) )
af60: 7b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e  {.      pInode->
af70: 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52  eFileLock = SHAR
af80: 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c  ED_LOCK;.    }el
af90: 73 65 7b 0a 20 20 20 20 20 20 74 45 72 72 6e 6f  se{.      tErrno
afa0: 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
afb0: 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72  rc = sqliteError
afc0: 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74  FromPosixError(t
afd0: 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f  Errno, SQLITE_IO
afe0: 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20  ERR_UNLOCK);.   
aff0: 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
b000: 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20  RROR(rc) ){.    
b010: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
b020: 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20  rrno = tErrno;. 
b030: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74       }.      got
b040: 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20  o end_unlock;.  
b050: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 65 46    }.  }.  if( eF
b060: 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b  ileLock==NO_LOCK
b070: 20 29 7b 0a 20 20 20 20 2f 2a 20 44 65 63 72 65   ){.    /* Decre
b080: 6d 65 6e 74 20 74 68 65 20 73 68 61 72 65 64 20  ment the shared 
b090: 6c 6f 63 6b 20 63 6f 75 6e 74 65 72 2e 20 20 52  lock counter.  R
b0a0: 65 6c 65 61 73 65 20 74 68 65 20 6c 6f 63 6b 20  elease the lock 
b0b0: 75 73 69 6e 67 20 61 6e 0a 20 20 20 20 2a 2a 20  using an.    ** 
b0c0: 4f 53 20 63 61 6c 6c 20 6f 6e 6c 79 20 77 68 65  OS call only whe
b0d0: 6e 20 61 6c 6c 20 74 68 72 65 61 64 73 20 69 6e  n all threads in
b0e0: 20 74 68 69 73 20 73 61 6d 65 20 70 72 6f 63 65   this same proce
b0f0: 73 73 20 68 61 76 65 20 72 65 6c 65 61 73 65 64  ss have released
b100: 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c 6f 63 6b  .    ** the lock
b110: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49 6e  ..    */.    pIn
b120: 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2d 2d 3b 0a  ode->nShared--;.
b130: 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e      if( pInode->
b140: 6e 53 68 61 72 65 64 3d 3d 30 20 29 7b 0a 20 20  nShared==0 ){.  
b150: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20      lock.l_type 
b160: 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 20  = F_UNLCK;.     
b170: 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d   lock.l_whence =
b180: 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20   SEEK_SET;.     
b190: 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
b1a0: 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 30 4c 3b  lock.l_len = 0L;
b1b0: 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49  .      SimulateI
b1c0: 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b  OErrorBenign(1);
b1d0: 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49  .      SimulateI
b1e0: 4f 45 72 72 6f 72 28 20 68 3d 28 2d 31 29 20 29  OError( h=(-1) )
b1f0: 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49  .      SimulateI
b200: 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b  OErrorBenign(0);
b210: 0a 20 20 20 20 20 20 69 66 28 20 66 63 6e 74 6c  .      if( fcntl
b220: 28 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f  (h, F_SETLK, &lo
b230: 63 6b 29 21 3d 28 2d 31 29 20 29 7b 0a 20 20 20  ck)!=(-1) ){.   
b240: 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69       pInode->eFi
b250: 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b  leLock = NO_LOCK
b260: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
b270: 20 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20         tErrno = 
b280: 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 72  errno;.        r
b290: 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  c = sqliteErrorF
b2a0: 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
b2b0: 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45  rrno, SQLITE_IOE
b2c0: 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20  RR_UNLOCK);.    
b2d0: 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
b2e0: 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20  ERROR(rc) ){.   
b2f0: 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61         pFile->la
b300: 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f  stErrno = tErrno
b310: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
b320: 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c      pInode->eFil
b330: 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b  eLock = NO_LOCK;
b340: 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  .        pFile->
b350: 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c  eFileLock = NO_L
b360: 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  OCK;.      }.   
b370: 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72 65   }..    /* Decre
b380: 6d 65 6e 74 20 74 68 65 20 63 6f 75 6e 74 20 6f  ment the count o
b390: 66 20 6c 6f 63 6b 73 20 61 67 61 69 6e 73 74 20  f locks against 
b3a0: 74 68 69 73 20 73 61 6d 65 20 66 69 6c 65 2e 20  this same file. 
b3b0: 20 57 68 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a   When the.    **
b3c0: 20 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20 7a   count reaches z
b3d0: 65 72 6f 2c 20 63 6c 6f 73 65 20 61 6e 79 20 6f  ero, close any o
b3e0: 74 68 65 72 20 66 69 6c 65 20 64 65 73 63 72 69  ther file descri
b3f0: 70 74 6f 72 73 20 77 68 6f 73 65 20 63 6c 6f 73  ptors whose clos
b400: 65 0a 20 20 20 20 2a 2a 20 77 61 73 20 64 65 66  e.    ** was def
b410: 65 72 72 65 64 20 62 65 63 61 75 73 65 20 6f 66  erred because of
b420: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63   outstanding loc
b430: 6b 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  ks..    */.    p
b440: 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2d 2d 3b 0a  Inode->nLock--;.
b450: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f      assert( pIno
b460: 64 65 2d 3e 6e 4c 6f 63 6b 3e 3d 30 20 29 3b 0a  de->nLock>=0 );.
b470: 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e      if( pInode->
b480: 6e 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20  nLock==0 ){.    
b490: 20 20 69 6e 74 20 72 63 32 20 3d 20 63 6c 6f 73    int rc2 = clos
b4a0: 65 50 65 6e 64 69 6e 67 46 64 73 28 70 46 69 6c  ePendingFds(pFil
b4b0: 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
b4c0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
b4d0: 20 20 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b         rc = rc2;
b4e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
b4f0: 20 7d 0a 09 0a 65 6e 64 5f 75 6e 6c 6f 63 6b 3a   }...end_unlock:
b500: 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65  .  unixLeaveMute
b510: 78 28 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  x();.  if( rc==S
b520: 51 4c 49 54 45 5f 4f 4b 20 29 20 70 46 69 6c 65  QLITE_OK ) pFile
b530: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46  ->eFileLock = eF
b540: 69 6c 65 4c 6f 63 6b 3b 0a 20 20 72 65 74 75 72  ileLock;.  retur
b550: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  n rc;.}../*.** L
b560: 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67  ower the locking
b570: 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64   level on file d
b580: 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20  escriptor pFile 
b590: 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65  to eFileLock.  e
b5a0: 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74  FileLock.** must
b5b0: 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f   be either NO_LO
b5c0: 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43  CK or SHARED_LOC
b5d0: 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  K..**.** If the 
b5e0: 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66  locking level of
b5f0: 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
b600: 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20  ptor is already 
b610: 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74  at or below.** t
b620: 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63  he requested loc
b630: 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73  king level, this
b640: 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
b650: 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  -op..*/.static i
b660: 6e 74 20 75 6e 69 78 55 6e 6c 6f 63 6b 28 73 71  nt unixUnlock(sq
b670: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
b680: 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a  int eFileLock){.
b690: 20 20 72 65 74 75 72 6e 20 5f 70 6f 73 69 78 55    return _posixU
b6a0: 6e 6c 6f 63 6b 28 69 64 2c 20 65 46 69 6c 65 4c  nlock(id, eFileL
b6b0: 6f 63 6b 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ock, 0);.}../*.*
b6c0: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
b6d0: 70 65 72 66 6f 72 6d 73 20 74 68 65 20 70 61 72  performs the par
b6e0: 74 73 20 6f 66 20 74 68 65 20 22 63 6c 6f 73 65  ts of the "close
b6f0: 20 66 69 6c 65 22 20 6f 70 65 72 61 74 69 6f 6e   file" operation
b700: 20 0a 2a 2a 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61   .** common to a
b710: 6c 6c 20 6c 6f 63 6b 69 6e 67 20 73 63 68 65 6d  ll locking schem
b720: 65 73 2e 20 49 74 20 63 6c 6f 73 65 73 20 74 68  es. It closes th
b730: 65 20 64 69 72 65 63 74 6f 72 79 20 61 6e 64 20  e directory and 
b740: 66 69 6c 65 0a 2a 2a 20 68 61 6e 64 6c 65 73 2c  file.** handles,
b750: 20 69 66 20 74 68 65 79 20 61 72 65 20 76 61 6c   if they are val
b760: 69 64 2c 20 61 6e 64 20 73 65 74 73 20 61 6c 6c  id, and sets all
b770: 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 75   fields of the u
b780: 6e 69 78 46 69 6c 65 0a 2a 2a 20 73 74 72 75 63  nixFile.** struc
b790: 74 75 72 65 20 74 6f 20 30 2e 0a 2a 2a 0a 2a 2a  ture to 0..**.**
b7a0: 20 49 74 20 69 73 20 2a 6e 6f 74 2a 20 6e 65 63   It is *not* nec
b7b0: 65 73 73 61 72 79 20 74 6f 20 68 6f 6c 64 20 74  essary to hold t
b7c0: 68 65 20 6d 75 74 65 78 20 77 68 65 6e 20 74 68  he mutex when th
b7d0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
b7e0: 6c 6c 65 64 2c 0a 2a 2a 20 65 76 65 6e 20 6f 6e  lled,.** even on
b7f0: 20 56 78 57 6f 72 6b 73 2e 20 20 41 20 6d 75 74   VxWorks.  A mut
b800: 65 78 20 77 69 6c 6c 20 62 65 20 61 63 71 75 69  ex will be acqui
b810: 72 65 64 20 6f 6e 20 56 78 57 6f 72 6b 73 20 62  red on VxWorks b
b820: 79 20 74 68 65 0a 2a 2a 20 76 78 77 6f 72 6b 73  y the.** vxworks
b830: 52 65 6c 65 61 73 65 46 69 6c 65 49 64 28 29 20  ReleaseFileId() 
b840: 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74  routine..*/.stat
b850: 69 63 20 69 6e 74 20 63 6c 6f 73 65 55 6e 69 78  ic int closeUnix
b860: 46 69 6c 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  File(sqlite3_fil
b870: 65 20 2a 69 64 29 7b 0a 20 20 75 6e 69 78 46 69  e *id){.  unixFi
b880: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
b890: 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 66 28  xFile*)id;.  if(
b8a0: 20 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 69 66   pFile ){.    if
b8b0: 28 20 70 46 69 6c 65 2d 3e 64 69 72 66 64 3e 3d  ( pFile->dirfd>=
b8c0: 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 65  0 ){.      int e
b8d0: 72 72 20 3d 20 63 6c 6f 73 65 28 70 46 69 6c 65  rr = close(pFile
b8e0: 2d 3e 64 69 72 66 64 29 3b 0a 20 20 20 20 20 20  ->dirfd);.      
b8f0: 69 66 28 20 65 72 72 20 29 7b 0a 20 20 20 20 20  if( err ){.     
b900: 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
b910: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
b920: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
b930: 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f 43 4c 4f  TE_IOERR_DIR_CLO
b940: 53 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  SE;.      }else{
b950: 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  .        pFile->
b960: 64 69 72 66 64 3d 2d 31 3b 0a 20 20 20 20 20 20  dirfd=-1;.      
b970: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
b980: 70 46 69 6c 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20  pFile->h>=0 ){. 
b990: 20 20 20 20 20 69 6e 74 20 65 72 72 20 3d 20 63       int err = c
b9a0: 6c 6f 73 65 28 70 46 69 6c 65 2d 3e 68 29 3b 0a  lose(pFile->h);.
b9b0: 20 20 20 20 20 20 69 66 28 20 65 72 72 20 29 7b        if( err ){
b9c0: 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  .        pFile->
b9d0: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  lastErrno = errn
b9e0: 6f 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  o;.        retur
b9f0: 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43  n SQLITE_IOERR_C
ba00: 4c 4f 53 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20  LOSE;.      }.  
ba10: 20 20 7d 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52    }.#if OS_VXWOR
ba20: 4b 53 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65  KS.    if( pFile
ba30: 2d 3e 70 49 64 20 29 7b 0a 20 20 20 20 20 20 69  ->pId ){.      i
ba40: 66 28 20 70 46 69 6c 65 2d 3e 69 73 44 65 6c 65  f( pFile->isDele
ba50: 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 75 6e  te ){.        un
ba60: 6c 69 6e 6b 28 70 46 69 6c 65 2d 3e 70 49 64 2d  link(pFile->pId-
ba70: 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 29  >zCanonicalName)
ba80: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
ba90: 76 78 77 6f 72 6b 73 52 65 6c 65 61 73 65 46 69  vxworksReleaseFi
baa0: 6c 65 49 64 28 70 46 69 6c 65 2d 3e 70 49 64 29  leId(pFile->pId)
bab0: 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 70  ;.      pFile->p
bac0: 49 64 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 23 65  Id = 0;.    }.#e
bad0: 6e 64 69 66 0a 20 20 20 20 4f 53 54 52 41 43 45  ndif.    OSTRACE
bae0: 28 28 22 43 4c 4f 53 45 20 20 20 25 2d 33 64 5c  (("CLOSE   %-3d\
baf0: 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a  n", pFile->h));.
bb00: 20 20 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28      OpenCounter(
bb10: 2d 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  -1);.    sqlite3
bb20: 5f 66 72 65 65 28 70 46 69 6c 65 2d 3e 70 55 6e  _free(pFile->pUn
bb30: 75 73 65 64 29 3b 0a 20 20 20 20 6d 65 6d 73 65  used);.    memse
bb40: 74 28 70 46 69 6c 65 2c 20 30 2c 20 73 69 7a 65  t(pFile, 0, size
bb50: 6f 66 28 75 6e 69 78 46 69 6c 65 29 29 3b 0a 20  of(unixFile));. 
bb60: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
bb70: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
bb80: 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 2a 2f  Close a file..*/
bb90: 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
bba0: 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69  Close(sqlite3_fi
bbb0: 6c 65 20 2a 69 64 29 7b 0a 20 20 69 6e 74 20 72  le *id){.  int r
bbc0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
bbd0: 20 69 66 28 20 69 64 20 29 7b 0a 20 20 20 20 75   if( id ){.    u
bbe0: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
bbf0: 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 69 64 3b   (unixFile *)id;
bc00: 0a 20 20 20 20 75 6e 69 78 55 6e 6c 6f 63 6b 28  .    unixUnlock(
bc10: 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20  id, NO_LOCK);.  
bc20: 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
bc30: 28 29 3b 0a 20 20 20 20 69 66 28 20 70 46 69 6c  ();.    if( pFil
bc40: 65 2d 3e 70 49 6e 6f 64 65 20 26 26 20 70 46 69  e->pInode && pFi
bc50: 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63  le->pInode->nLoc
bc60: 6b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  k ){.      /* If
bc70: 20 74 68 65 72 65 20 61 72 65 20 6f 75 74 73 74   there are outst
bc80: 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 2c 20 64 6f  anding locks, do
bc90: 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 63 6c   not actually cl
bca0: 6f 73 65 20 74 68 65 20 66 69 6c 65 20 6a 75 73  ose the file jus
bcb0: 74 0a 20 20 20 20 20 20 2a 2a 20 79 65 74 20 62  t.      ** yet b
bcc0: 65 63 61 75 73 65 20 74 68 61 74 20 77 6f 75 6c  ecause that woul
bcd0: 64 20 63 6c 65 61 72 20 74 68 6f 73 65 20 6c 6f  d clear those lo
bce0: 63 6b 73 2e 20 20 49 6e 73 74 65 61 64 2c 20 61  cks.  Instead, a
bcf0: 64 64 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20  dd the file.    
bd00: 20 20 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20    ** descriptor 
bd10: 74 6f 20 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73  to pInode->pUnus
bd20: 65 64 20 6c 69 73 74 2e 20 20 49 74 20 77 69 6c  ed list.  It wil
bd30: 6c 20 62 65 20 61 75 74 6f 6d 61 74 69 63 61 6c  l be automatical
bd40: 6c 79 20 63 6c 6f 73 65 64 20 0a 20 20 20 20 20  ly closed .     
bd50: 20 2a 2a 20 77 68 65 6e 20 74 68 65 20 6c 61 73   ** when the las
bd60: 74 20 6c 6f 63 6b 20 69 73 20 63 6c 65 61 72 65  t lock is cleare
bd70: 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
bd80: 20 20 73 65 74 50 65 6e 64 69 6e 67 46 64 28 70    setPendingFd(p
bd90: 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  File);.    }.   
bda0: 20 72 65 6c 65 61 73 65 49 6e 6f 64 65 49 6e 66   releaseInodeInf
bdb0: 6f 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 72 63  o(pFile);.    rc
bdc0: 20 3d 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65   = closeUnixFile
bdd0: 28 69 64 29 3b 0a 20 20 20 20 75 6e 69 78 4c 65  (id);.    unixLe
bde0: 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a  aveMutex();.  }.
bdf0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
be00: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  /************** 
be10: 45 6e 64 20 6f 66 20 74 68 65 20 70 6f 73 69 78  End of the posix
be20: 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 20 69   advisory lock i
be30: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a  mplementation **
be40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
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 2a 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 2a 2a 2a 2a 2a  ****************
be90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
bea0: 0a 2f 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 2a 2a 2a 2a  ****************
bec0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
bed0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
bee0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
bef0: 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
bf00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
bf10: 4e 6f 2d 6f 70 20 4c 6f 63 6b 69 6e 67 20 2a 2a  No-op Locking **
bf20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
bf30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
bf40: 0a 2a 2a 0a 2a 2a 20 4f 66 20 74 68 65 20 76 61  .**.** Of the va
bf50: 72 69 6f 75 73 20 6c 6f 63 6b 69 6e 67 20 69 6d  rious locking im
bf60: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 61 76  plementations av
bf70: 61 69 6c 61 62 6c 65 2c 20 74 68 69 73 20 69 73  ailable, this is
bf80: 20 62 79 20 66 61 72 20 74 68 65 0a 2a 2a 20 73   by far the.** s
bf90: 69 6d 70 6c 65 73 74 3a 20 20 6c 6f 63 6b 69 6e  implest:  lockin
bfa0: 67 20 69 73 20 69 67 6e 6f 72 65 64 2e 20 20 4e  g is ignored.  N
bfb0: 6f 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64  o attempt is mad
bfc0: 65 20 74 6f 20 6c 6f 63 6b 20 74 68 65 20 64 61  e to lock the da
bfd0: 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 66  tabase.** file f
bfe0: 6f 72 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72  or reading or wr
bff0: 69 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  iting..**.** Thi
c000: 73 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 69  s locking mode i
c010: 73 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f  s appropriate fo
c020: 72 20 75 73 65 20 6f 6e 20 72 65 61 64 2d 6f 6e  r use on read-on
c030: 6c 79 20 64 61 74 61 62 61 73 65 73 0a 2a 2a 20  ly databases.** 
c040: 28 65 78 3a 20 64 61 74 61 62 61 73 65 73 20 74  (ex: databases t
c050: 68 61 74 20 61 72 65 20 62 75 72 6e 65 64 20 69  hat are burned i
c060: 6e 74 6f 20 43 44 2d 52 4f 4d 2c 20 66 6f 72 20  nto CD-ROM, for 
c070: 65 78 61 6d 70 6c 65 2e 29 20 20 49 74 20 63 61  example.)  It ca
c080: 6e 0a 2a 2a 20 61 6c 73 6f 20 62 65 20 75 73 65  n.** also be use
c090: 64 20 69 66 20 74 68 65 20 61 70 70 6c 69 63 61  d if the applica
c0a0: 74 69 6f 6e 20 65 6d 70 6c 6f 79 73 20 73 6f 6d  tion employs som
c0b0: 65 20 65 78 74 65 72 6e 61 6c 20 6d 65 63 68 61  e external mecha
c0c0: 6e 69 73 6d 20 74 6f 0a 2a 2a 20 70 72 65 76 65  nism to.** preve
c0d0: 6e 74 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73 20  nt simultaneous 
c0e0: 61 63 63 65 73 73 20 6f 66 20 74 68 65 20 73 61  access of the sa
c0f0: 6d 65 20 64 61 74 61 62 61 73 65 20 62 79 20 74  me database by t
c100: 77 6f 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 64 61  wo or more.** da
c110: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
c120: 6e 73 2e 20 20 42 75 74 20 74 68 65 72 65 20 69  ns.  But there i
c130: 73 20 61 20 73 65 72 69 6f 75 73 20 72 69 73 6b  s a serious risk
c140: 20 6f 66 20 64 61 74 61 62 61 73 65 0a 2a 2a 20   of database.** 
c150: 63 6f 72 72 75 70 74 69 6f 6e 20 69 66 20 74 68  corruption if th
c160: 69 73 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20  is locking mode 
c170: 69 73 20 75 73 65 64 20 69 6e 20 73 69 74 75 61  is used in situa
c180: 74 69 6f 6e 73 20 77 68 65 72 65 20 6d 75 6c 74  tions where mult
c190: 69 70 6c 65 0a 2a 2a 20 64 61 74 61 62 61 73 65  iple.** database
c1a0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72 65   connections are
c1b0: 20 61 63 63 65 73 73 69 6e 67 20 74 68 65 20 73   accessing the s
c1c0: 61 6d 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  ame database fil
c1d0: 65 20 61 74 20 74 68 65 20 73 61 6d 65 0a 2a 2a  e at the same.**
c1e0: 20 74 69 6d 65 20 61 6e 64 20 6f 6e 65 20 6f 72   time and one or
c1f0: 20 6d 6f 72 65 20 6f 66 20 74 68 6f 73 65 20 63   more of those c
c200: 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72 65 20 77  onnections are w
c210: 72 69 74 69 6e 67 2e 0a 2a 2f 0a 0a 73 74 61 74  riting..*/..stat
c220: 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 43 68 65  ic int nolockChe
c230: 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73  ckReservedLock(s
c240: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74  qlite3_file *Not
c250: 55 73 65 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f  Used, int *pResO
c260: 75 74 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  ut){.  UNUSED_PA
c270: 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
c280: 3b 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 30  ;.  *pResOut = 0
c290: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
c2a0: 45 5f 4f 4b 3b 0a 7d 0a 73 74 61 74 69 63 20 69  E_OK;.}.static i
c2b0: 6e 74 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b 28 73 71  nt nolockLock(sq
c2c0: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55  lite3_file *NotU
c2d0: 73 65 64 2c 20 69 6e 74 20 4e 6f 74 55 73 65 64  sed, int NotUsed
c2e0: 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  2){.  UNUSED_PAR
c2f0: 41 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c  AMETER2(NotUsed,
c300: 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 72 65   NotUsed2);.  re
c310: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
c320: 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c  }.static int nol
c330: 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65  ockUnlock(sqlite
c340: 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64 2c  3_file *NotUsed,
c350: 20 69 6e 74 20 4e 6f 74 55 73 65 64 32 29 7b 0a   int NotUsed2){.
c360: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
c370: 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74  ER2(NotUsed, Not
c380: 55 73 65 64 32 29 3b 0a 20 20 72 65 74 75 72 6e  Used2);.  return
c390: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
c3a0: 2a 0a 2a 2a 20 43 6c 6f 73 65 20 74 68 65 20 66  *.** Close the f
c3b0: 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
c3c0: 6e 74 20 6e 6f 6c 6f 63 6b 43 6c 6f 73 65 28 73  nt nolockClose(s
c3d0: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29  qlite3_file *id)
c3e0: 20 7b 0a 20 20 72 65 74 75 72 6e 20 63 6c 6f 73   {.  return clos
c3f0: 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 7d  eUnixFile(id);.}
c400: 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
c410: 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68  ****** End of th
c420: 65 20 6e 6f 2d 6f 70 20 6c 6f 63 6b 20 69 6d 70  e no-op lock imp
c430: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a  lementation ****
c440: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c450: 2a 0a 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 2a 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 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c490: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c4a0: 2f 0a 0a 2f 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 2a 2a  ****************
c4c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c4d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c4e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c4f0: 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
c500: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67  ************ Beg
c510: 69 6e 20 64 6f 74 2d 66 69 6c 65 20 4c 6f 63 6b  in dot-file Lock
c520: 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ing ************
c530: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c540: 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 6f 74  **.**.** The dot
c550: 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 6d 70  file locking imp
c560: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 75 73 65 73  lementation uses
c570: 20 74 68 65 20 65 78 69 73 74 61 6e 63 65 20 6f   the existance o
c580: 66 20 73 65 70 61 72 61 74 65 20 6c 6f 63 6b 0a  f separate lock.
c590: 2a 2a 20 66 69 6c 65 73 20 69 6e 20 6f 72 64 65  ** files in orde
c5a0: 72 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 61 63 63  r to control acc
c5b0: 65 73 73 20 74 6f 20 74 68 65 20 64 61 74 61 62  ess to the datab
c5c0: 61 73 65 2e 20 20 54 68 69 73 20 77 6f 72 6b 73  ase.  This works
c5d0: 20 6f 6e 20 6a 75 73 74 0a 2a 2a 20 61 62 6f 75   on just.** abou
c5e0: 74 20 65 76 65 72 79 20 66 69 6c 65 73 79 73 74  t every filesyst
c5f0: 65 6d 20 69 6d 61 67 69 6e 61 62 6c 65 2e 20 20  em imaginable.  
c600: 42 75 74 20 74 68 65 72 65 20 61 72 65 20 73 65  But there are se
c610: 72 69 6f 75 73 20 64 6f 77 6e 73 69 64 65 73 3a  rious downsides:
c620: 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20 54  .**.**    (1)  T
c630: 68 65 72 65 20 69 73 20 7a 65 72 6f 20 63 6f 6e  here is zero con
c640: 63 75 72 72 65 6e 63 79 2e 20 20 41 20 73 69 6e  currency.  A sin
c650: 67 6c 65 20 72 65 61 64 65 72 20 62 6c 6f 63 6b  gle reader block
c660: 73 20 61 6c 6c 20 6f 74 68 65 72 0a 2a 2a 20 20  s all other.**  
c670: 20 20 20 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f         connectio
c680: 6e 73 20 66 72 6f 6d 20 72 65 61 64 69 6e 67 20  ns from reading 
c690: 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65 20 64  or writing the d
c6a0: 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 20  atabase..**.**  
c6b0: 20 20 28 32 29 20 20 41 6e 20 61 70 70 6c 69 63    (2)  An applic
c6c0: 61 74 69 6f 6e 20 63 72 61 73 68 20 6f 72 20 70  ation crash or p
c6d0: 6f 77 65 72 20 6c 6f 73 73 20 63 61 6e 20 6c 65  ower loss can le
c6e0: 61 76 65 20 73 74 61 6c 65 20 6c 6f 63 6b 20 66  ave stale lock f
c6f0: 69 6c 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 20  iles.**         
c700: 73 69 74 74 69 6e 67 20 61 72 6f 75 6e 64 20 74  sitting around t
c710: 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20 63  hat need to be c
c720: 6c 65 61 72 65 64 20 6d 61 6e 75 61 6c 6c 79 2e  leared manually.
c730: 0a 2a 2a 0a 2a 2a 20 4e 65 76 65 72 74 68 65 6c  .**.** Neverthel
c740: 65 73 73 2c 20 61 20 64 6f 74 6c 6f 63 6b 20 69  ess, a dotlock i
c750: 73 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65  s an appropriate
c760: 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 66 6f   locking mode fo
c770: 72 20 75 73 65 20 69 66 20 6e 6f 0a 2a 2a 20 6f  r use if no.** o
c780: 74 68 65 72 20 6c 6f 63 6b 69 6e 67 20 73 74 72  ther locking str
c790: 61 74 65 67 79 20 69 73 20 61 76 61 69 6c 61 62  ategy is availab
c7a0: 6c 65 2e 0a 2a 2a 0a 2a 2a 20 44 6f 74 66 69 6c  le..**.** Dotfil
c7b0: 65 20 6c 6f 63 6b 69 6e 67 20 77 6f 72 6b 73 20  e locking works 
c7c0: 62 79 20 63 72 65 61 74 69 6e 67 20 61 20 66 69  by creating a fi
c7d0: 6c 65 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64  le in the same d
c7e0: 69 72 65 63 74 6f 72 79 20 61 73 20 74 68 65 0a  irectory as the.
c7f0: 2a 2a 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  ** database and 
c800: 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61  with the same na
c810: 6d 65 20 62 75 74 20 77 69 74 68 20 61 20 22 2e  me but with a ".
c820: 6c 6f 63 6b 22 20 65 78 74 65 6e 73 69 6f 6e 20  lock" extension 
c830: 61 64 64 65 64 2e 0a 2a 2a 20 54 68 65 20 65 78  added..** The ex
c840: 69 73 74 61 6e 63 65 20 6f 66 20 61 20 6c 6f 63  istance of a loc
c850: 6b 20 66 69 6c 65 20 69 6d 70 6c 69 65 73 20 61  k file implies a
c860: 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
c870: 2e 20 20 41 6c 6c 20 6f 74 68 65 72 20 6c 6f 63  .  All other loc
c880: 6b 0a 2a 2a 20 74 79 70 65 73 20 28 53 48 41 52  k.** types (SHAR
c890: 45 44 2c 20 52 45 53 45 52 56 45 44 2c 20 50 45  ED, RESERVED, PE
c8a0: 4e 44 49 4e 47 29 20 61 72 65 20 6d 61 70 70 65  NDING) are mappe
c8b0: 64 20 69 6e 74 6f 20 45 58 43 4c 55 53 49 56 45  d into EXCLUSIVE
c8c0: 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ..*/../*.** The 
c8d0: 66 69 6c 65 20 73 75 66 66 69 78 20 61 64 64 65  file suffix adde
c8e0: 64 20 74 6f 20 74 68 65 20 64 61 74 61 20 62 61  d to the data ba
c8f0: 73 65 20 66 69 6c 65 6e 61 6d 65 20 69 6e 20 6f  se filename in o
c900: 72 64 65 72 20 74 6f 20 63 72 65 61 74 65 20 74  rder to create t
c910: 68 65 0a 2a 2a 20 6c 6f 63 6b 20 66 69 6c 65 2e  he.** lock file.
c920: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 44 4f 54 4c  .*/.#define DOTL
c930: 4f 43 4b 5f 53 55 46 46 49 58 20 22 2e 6c 6f 63  OCK_SUFFIX ".loc
c940: 6b 22 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  k"../*.** This r
c950: 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66  outine checks if
c960: 20 74 68 65 72 65 20 69 73 20 61 20 52 45 53 45   there is a RESE
c970: 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f  RVED lock held o
c980: 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64 0a  n the specified.
c990: 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73 20  ** file by this 
c9a0: 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f  or any other pro
c9b0: 63 65 73 73 2e 20 49 66 20 73 75 63 68 20 61 20  cess. If such a 
c9c0: 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65  lock is held, se
c9d0: 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f  t *pResOut.** to
c9e0: 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75   a non-zero valu
c9f0: 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65  e otherwise *pRe
ca00: 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a  sOut is set to z
ca10: 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e  ero.  The return
ca20: 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74   value.** is set
ca30: 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e   to SQLITE_OK un
ca40: 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f  less an I/O erro
ca50: 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20  r occurs during 
ca60: 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a  lock checking..*
ca70: 2a 0a 2a 2a 20 49 6e 20 64 6f 74 66 69 6c 65 20  *.** In dotfile 
ca80: 6c 6f 63 6b 69 6e 67 2c 20 65 69 74 68 65 72 20  locking, either 
ca90: 61 20 6c 6f 63 6b 20 65 78 69 73 74 73 20 6f 72  a lock exists or
caa0: 20 69 74 20 64 6f 65 73 20 6e 6f 74 2e 20 20 53   it does not.  S
cab0: 6f 20 69 6e 20 74 68 69 73 0a 2a 2a 20 76 61 72  o in this.** var
cac0: 69 61 74 69 6f 6e 20 6f 66 20 43 68 65 63 6b 52  iation of CheckR
cad0: 65 73 65 72 76 65 64 4c 6f 63 6b 28 29 2c 20 2a  eservedLock(), *
cae0: 70 52 65 73 4f 75 74 20 69 73 20 73 65 74 20 74  pResOut is set t
caf0: 6f 20 74 72 75 65 20 69 66 20 61 6e 79 20 6c 6f  o true if any lo
cb00: 63 6b 0a 2a 2a 20 69 73 20 68 65 6c 64 20 6f 6e  ck.** is held on
cb10: 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20 66 61   the file and fa
cb20: 6c 73 65 20 69 66 20 74 68 65 20 66 69 6c 65 20  lse if the file 
cb30: 69 73 20 75 6e 6c 6f 63 6b 65 64 2e 0a 2a 2f 0a  is unlocked..*/.
cb40: 73 74 61 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f  static int dotlo
cb50: 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  ckCheckReservedL
cb60: 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
cb70: 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f   *id, int *pResO
cb80: 75 74 29 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ut) {.  int rc =
cb90: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
cba0: 74 20 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a  t reserved = 0;.
cbb0: 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
cbc0: 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
cbd0: 64 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  d;..  SimulateIO
cbe0: 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51  Error( return SQ
cbf0: 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b  LITE_IOERR_CHECK
cc00: 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b  RESERVEDLOCK; );
cc10: 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 70 46  .  .  assert( pF
cc20: 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65  ile );..  /* Che
cc30: 63 6b 20 69 66 20 61 20 74 68 72 65 61 64 20 69  ck if a thread i
cc40: 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 68  n this process h
cc50: 6f 6c 64 73 20 73 75 63 68 20 61 20 6c 6f 63 6b  olds such a lock
cc60: 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
cc70: 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45  >eFileLock>SHARE
cc80: 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 2f 2a  D_LOCK ){.    /*
cc90: 20 45 69 74 68 65 72 20 74 68 69 73 20 63 6f 6e   Either this con
cca0: 6e 65 63 74 69 6f 6e 20 6f 72 20 73 6f 6d 65 20  nection or some 
ccb0: 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
ccc0: 20 69 6e 20 74 68 65 20 73 61 6d 65 20 70 72 6f   in the same pro
ccd0: 63 65 73 73 0a 20 20 20 20 2a 2a 20 68 6f 6c 64  cess.    ** hold
cce0: 73 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  s a lock on the 
ccf0: 66 69 6c 65 2e 20 20 4e 6f 20 6e 65 65 64 20 74  file.  No need t
cd00: 6f 20 63 68 65 63 6b 20 66 75 72 74 68 65 72 2e  o check further.
cd10: 20 2a 2f 0a 20 20 20 20 72 65 73 65 72 76 65 64   */.    reserved
cd20: 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 1;.  }else{. 
cd30: 20 20 20 2f 2a 20 54 68 65 20 6c 6f 63 6b 20 69     /* The lock i
cd40: 73 20 68 65 6c 64 20 69 66 20 61 6e 64 20 6f 6e  s held if and on
cd50: 6c 79 20 69 66 20 74 68 65 20 6c 6f 63 6b 66 69  ly if the lockfi
cd60: 6c 65 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 20  le exists */.   
cd70: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c 6f   const char *zLo
cd80: 63 6b 46 69 6c 65 20 3d 20 28 63 6f 6e 73 74 20  ckFile = (const 
cd90: 63 68 61 72 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63  char*)pFile->loc
cda0: 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20  kingContext;.   
cdb0: 20 72 65 73 65 72 76 65 64 20 3d 20 61 63 63 65   reserved = acce
cdc0: 73 73 28 7a 4c 6f 63 6b 46 69 6c 65 2c 20 30 29  ss(zLockFile, 0)
cdd0: 3d 3d 30 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41  ==0;.  }.  OSTRA
cde0: 43 45 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43  CE(("TEST WR-LOC
cdf0: 4b 20 25 64 20 25 64 20 25 64 20 28 64 6f 74 6c  K %d %d %d (dotl
ce00: 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  ock)\n", pFile->
ce10: 68 2c 20 72 63 2c 20 72 65 73 65 72 76 65 64 29  h, rc, reserved)
ce20: 29 3b 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20  );.  *pResOut = 
ce30: 72 65 73 65 72 76 65 64 3b 0a 20 20 72 65 74 75  reserved;.  retu
ce40: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
ce50: 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69  Lock the file wi
ce60: 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63  th the lock spec
ce70: 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74  ified by paramet
ce80: 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f  er eFileLock - o
ce90: 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c  ne.** of the fol
cea0: 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20  lowing:.**.**   
ceb0: 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43    (1) SHARED_LOC
cec0: 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53  K.**     (2) RES
ced0: 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  ERVED_LOCK.**   
cee0: 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f    (3) PENDING_LO
cef0: 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58  CK.**     (4) EX
cf00: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a  CLUSIVE_LOCK.**.
cf10: 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65  ** Sometimes whe
cf20: 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65  n requesting one
cf30: 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64   lock state, add
cf40: 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61  itional lock sta
cf50: 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72  tes.** are inser
cf60: 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20  ted in between. 
cf70: 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67   The locking mig
cf80: 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f  ht fail on one o
cf90: 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74  f the later.** t
cfa0: 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69  ransitions leavi
cfb0: 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74  ng the lock stat
cfc0: 65 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d  e different from
cfd0: 20 77 68 61 74 20 69 74 20 73 74 61 72 74 65 64   what it started
cfe0: 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68   but.** still sh
cff0: 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e  ort of its goal.
d000: 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
d010: 63 68 61 72 74 20 73 68 6f 77 73 20 74 68 65 20  chart shows the 
d020: 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73  allowed.** trans
d030: 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69  itions and the i
d040: 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64  nserted intermed
d050: 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a  iate states:.**.
d060: 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d  **    UNLOCKED -
d070: 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53  > SHARED.**    S
d080: 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45  HARED -> RESERVE
d090: 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d  D.**    SHARED -
d0a0: 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45  > (PENDING) -> E
d0b0: 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52  XCLUSIVE.**    R
d0c0: 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44  ESERVED -> (PEND
d0d0: 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56  ING) -> EXCLUSIV
d0e0: 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20  E.**    PENDING 
d0f0: 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a  -> EXCLUSIVE.**.
d100: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
d110: 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61  will only increa
d120: 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20  se a lock.  Use 
d130: 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c  the sqlite3OsUnl
d140: 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65  ock().** routine
d150: 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b   to lower a lock
d160: 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2a 0a 2a 2a  ing level..**.**
d170: 20 57 69 74 68 20 64 6f 74 66 69 6c 65 20 6c 6f   With dotfile lo
d180: 63 6b 69 6e 67 2c 20 77 65 20 72 65 61 6c 6c 79  cking, we really
d190: 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 20 73 74   only support st
d1a0: 61 74 65 20 28 34 29 3a 20 45 58 43 4c 55 53 49  ate (4): EXCLUSI
d1b0: 56 45 2e 0a 2a 2a 20 42 75 74 20 77 65 20 74 72  VE..** But we tr
d1c0: 61 63 6b 20 74 68 65 20 6f 74 68 65 72 20 6c 6f  ack the other lo
d1d0: 63 6b 69 6e 67 20 6c 65 76 65 6c 73 20 69 6e 74  cking levels int
d1e0: 65 72 6e 61 6c 6c 79 2e 0a 2a 2f 0a 73 74 61 74  ernally..*/.stat
d1f0: 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 4c 6f  ic int dotlockLo
d200: 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
d210: 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f  *id, int eFileLo
d220: 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65  ck) {.  unixFile
d230: 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
d240: 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20 66  ile*)id;.  int f
d250: 64 3b 0a 20 20 63 68 61 72 20 2a 7a 4c 6f 63 6b  d;.  char *zLock
d260: 46 69 6c 65 20 3d 20 28 63 68 61 72 20 2a 29 70  File = (char *)p
d270: 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
d280: 74 65 78 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d  text;.  int rc =
d290: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 0a 20 20   SQLITE_OK;...  
d2a0: 2f 2a 20 49 66 20 77 65 20 68 61 76 65 20 61 6e  /* If we have an
d2b0: 79 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 74 68 65  y lock, then the
d2c0: 20 6c 6f 63 6b 20 66 69 6c 65 20 61 6c 72 65 61   lock file alrea
d2d0: 64 79 20 65 78 69 73 74 73 2e 20 20 41 6c 6c 20  dy exists.  All 
d2e0: 77 65 20 68 61 76 65 0a 20 20 2a 2a 20 74 6f 20  we have.  ** to 
d2f0: 64 6f 20 69 73 20 61 64 6a 75 73 74 20 6f 75 72  do is adjust our
d300: 20 69 6e 74 65 72 6e 61 6c 20 72 65 63 6f 72 64   internal record
d310: 20 6f 66 20 74 68 65 20 6c 6f 63 6b 20 6c 65 76   of the lock lev
d320: 65 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  el..  */.  if( p
d330: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
d340: 3e 20 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  > NO_LOCK ){.   
d350: 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
d360: 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 23  k = eFileLock;.#
d370: 69 66 20 21 4f 53 5f 56 58 57 4f 52 4b 53 0a 20  if !OS_VXWORKS. 
d380: 20 20 20 2f 2a 20 41 6c 77 61 79 73 20 75 70 64     /* Always upd
d390: 61 74 65 20 74 68 65 20 74 69 6d 65 73 74 61 6d  ate the timestam
d3a0: 70 20 6f 6e 20 74 68 65 20 6f 6c 64 20 66 69 6c  p on the old fil
d3b0: 65 20 2a 2f 0a 20 20 20 20 75 74 69 6d 65 73 28  e */.    utimes(
d3c0: 7a 4c 6f 63 6b 46 69 6c 65 2c 20 4e 55 4c 4c 29  zLockFile, NULL)
d3d0: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74  ;.#endif.    ret
d3e0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
d3f0: 20 7d 0a 20 20 0a 20 20 2f 2a 20 67 72 61 62 20   }.  .  /* grab 
d400: 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
d410: 6b 20 2a 2f 0a 20 20 66 64 20 3d 20 6f 70 65 6e  k */.  fd = open
d420: 28 7a 4c 6f 63 6b 46 69 6c 65 2c 4f 5f 52 44 4f  (zLockFile,O_RDO
d430: 4e 4c 59 7c 4f 5f 43 52 45 41 54 7c 4f 5f 45 58  NLY|O_CREAT|O_EX
d440: 43 4c 2c 30 36 30 30 29 3b 0a 20 20 69 66 28 20  CL,0600);.  if( 
d450: 66 64 3c 30 20 29 7b 0a 20 20 20 20 2f 2a 20 66  fd<0 ){.    /* f
d460: 61 69 6c 65 64 20 74 6f 20 6f 70 65 6e 2f 63 72  ailed to open/cr
d470: 65 61 74 65 20 74 68 65 20 66 69 6c 65 2c 20 73  eate the file, s
d480: 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 6d 61 79 20  omeone else may 
d490: 68 61 76 65 20 73 74 6f 6c 65 6e 20 74 68 65 20  have stolen the 
d4a0: 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 69 6e 74 20  lock */.    int 
d4b0: 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
d4c0: 20 20 20 20 69 66 28 20 45 45 58 49 53 54 20 3d      if( EEXIST =
d4d0: 3d 20 74 45 72 72 6e 6f 20 29 7b 0a 20 20 20 20  = tErrno ){.    
d4e0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
d4f0: 53 59 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  SY;.    } else {
d500: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
d510: 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78  teErrorFromPosix
d520: 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51  Error(tErrno, SQ
d530: 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29  LITE_IOERR_LOCK)
d540: 3b 0a 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c  ;.      if( IS_L
d550: 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b  OCK_ERROR(rc) ){
d560: 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  .        pFile->
d570: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72  lastErrno = tErr
d580: 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  no;.      }.    
d590: 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  }.    return rc;
d5a0: 0a 20 20 7d 20 0a 20 20 69 66 28 20 63 6c 6f 73  .  } .  if( clos
d5b0: 65 28 66 64 29 20 29 7b 0a 20 20 20 20 70 46 69  e(fd) ){.    pFi
d5c0: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
d5d0: 65 72 72 6e 6f 3b 0a 20 20 20 20 72 63 20 3d 20  errno;.    rc = 
d5e0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f  SQLITE_IOERR_CLO
d5f0: 53 45 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  SE;.  }.  .  /* 
d600: 67 6f 74 20 69 74 2c 20 73 65 74 20 74 68 65 20  got it, set the 
d610: 74 79 70 65 20 61 6e 64 20 72 65 74 75 72 6e 20  type and return 
d620: 6f 6b 20 2a 2f 0a 20 20 70 46 69 6c 65 2d 3e 65  ok */.  pFile->e
d630: 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65  FileLock = eFile
d640: 4c 6f 63 6b 3b 0a 20 20 72 65 74 75 72 6e 20 72  Lock;.  return r
d650: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65  c;.}../*.** Lowe
d660: 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  r the locking le
d670: 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63  vel on file desc
d680: 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20  riptor pFile to 
d690: 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c  eFileLock.  eFil
d6a0: 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65  eLock.** must be
d6b0: 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20   either NO_LOCK 
d6c0: 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a  or SHARED_LOCK..
d6d0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63  **.** If the loc
d6e0: 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68  king level of th
d6f0: 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
d700: 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20  r is already at 
d710: 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20  or below.** the 
d720: 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e  requested lockin
d730: 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f  g level, this ro
d740: 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
d750: 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 65  ..**.** When the
d760: 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 72   locking level r
d770: 65 61 63 68 65 73 20 4e 4f 5f 4c 4f 43 4b 2c 20  eaches NO_LOCK, 
d780: 64 65 6c 65 74 65 20 74 68 65 20 6c 6f 63 6b 20  delete the lock 
d790: 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
d7a0: 69 6e 74 20 64 6f 74 6c 6f 63 6b 55 6e 6c 6f 63  int dotlockUnloc
d7b0: 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
d7c0: 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63  id, int eFileLoc
d7d0: 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  k) {.  unixFile 
d7e0: 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
d7f0: 6c 65 2a 29 69 64 3b 0a 20 20 63 68 61 72 20 2a  le*)id;.  char *
d800: 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63 68 61  zLockFile = (cha
d810: 72 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69  r *)pFile->locki
d820: 6e 67 43 6f 6e 74 65 78 74 3b 0a 0a 20 20 61 73  ngContext;..  as
d830: 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
d840: 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c 4f 43   OSTRACE(("UNLOC
d850: 4b 20 20 25 64 20 25 64 20 77 61 73 20 25 64 20  K  %d %d was %d 
d860: 70 69 64 3d 25 64 20 28 64 6f 74 6c 6f 63 6b 29  pid=%d (dotlock)
d870: 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65  \n", pFile->h, e
d880: 46 69 6c 65 4c 6f 63 6b 2c 0a 09 20 20 20 70 46  FileLock,..   pF
d890: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20  ile->eFileLock, 
d8a0: 67 65 74 70 69 64 28 29 29 29 3b 0a 20 20 61 73  getpid()));.  as
d8b0: 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c  sert( eFileLock<
d8c0: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
d8d0: 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66    .  /* no-op if
d8e0: 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 20 20 69   possible */.  i
d8f0: 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  f( pFile->eFileL
d900: 6f 63 6b 3d 3d 65 46 69 6c 65 4c 6f 63 6b 20 29  ock==eFileLock )
d910: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
d920: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f  ITE_OK;.  }..  /
d930: 2a 20 54 6f 20 64 6f 77 6e 67 72 61 64 65 20 74  * To downgrade t
d940: 6f 20 73 68 61 72 65 64 2c 20 73 69 6d 70 6c 79  o shared, simply
d950: 20 75 70 64 61 74 65 20 6f 75 72 20 69 6e 74 65   update our inte
d960: 72 6e 61 6c 20 6e 6f 74 69 6f 6e 20 6f 66 20 74  rnal notion of t
d970: 68 65 0a 20 20 2a 2a 20 6c 6f 63 6b 20 73 74 61  he.  ** lock sta
d980: 74 65 2e 20 20 4e 6f 20 6e 65 65 64 20 74 6f 20  te.  No need to 
d990: 6d 65 73 73 20 77 69 74 68 20 74 68 65 20 66 69  mess with the fi
d9a0: 6c 65 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f  le on disk..  */
d9b0: 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b  .  if( eFileLock
d9c0: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b  ==SHARED_LOCK ){
d9d0: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c  .    pFile->eFil
d9e0: 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c  eLock = SHARED_L
d9f0: 4f 43 4b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  OCK;.    return 
da00: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
da10: 20 0a 20 20 2f 2a 20 54 6f 20 66 75 6c 6c 79 20   .  /* To fully 
da20: 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62  unlock the datab
da30: 61 73 65 2c 20 64 65 6c 65 74 65 20 74 68 65 20  ase, delete the 
da40: 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a 20 20 61  lock file */.  a
da50: 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b  ssert( eFileLock
da60: 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69  ==NO_LOCK );.  i
da70: 66 28 20 75 6e 6c 69 6e 6b 28 7a 4c 6f 63 6b 46  f( unlink(zLockF
da80: 69 6c 65 29 20 29 7b 0a 20 20 20 20 69 6e 74 20  ile) ){.    int 
da90: 72 63 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  rc = 0;.    int 
daa0: 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
dab0: 20 20 20 20 69 66 28 20 45 4e 4f 45 4e 54 20 21      if( ENOENT !
dac0: 3d 20 74 45 72 72 6e 6f 20 29 7b 0a 20 20 20 20  = tErrno ){.    
dad0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72    rc = sqliteErr
dae0: 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72  orFromPosixError
daf0: 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f  (tErrno, SQLITE_
db00: 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20  IOERR_UNLOCK);. 
db10: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 49 53 5f     }.    if( IS_
db20: 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29  LOCK_ERROR(rc) )
db30: 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  {.      pFile->l
db40: 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e  astErrno = tErrn
db50: 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  o;.    }.    ret
db60: 75 72 6e 20 72 63 3b 20 0a 20 20 7d 0a 20 20 70  urn rc; .  }.  p
db70: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
db80: 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 72 65 74  = NO_LOCK;.  ret
db90: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
dba0: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20  ../*.** Close a 
dbb0: 66 69 6c 65 2e 20 20 4d 61 6b 65 20 73 75 72 65  file.  Make sure
dbc0: 20 74 68 65 20 6c 6f 63 6b 20 68 61 73 20 62 65   the lock has be
dbd0: 65 6e 20 72 65 6c 65 61 73 65 64 20 62 65 66 6f  en released befo
dbe0: 72 65 20 63 6c 6f 73 69 6e 67 2e 0a 2a 2f 0a 73  re closing..*/.s
dbf0: 74 61 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63  tatic int dotloc
dc00: 6b 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66  kClose(sqlite3_f
dc10: 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69 6e 74  ile *id) {.  int
dc20: 20 72 63 3b 0a 20 20 69 66 28 20 69 64 20 29 7b   rc;.  if( id ){
dc30: 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  .    unixFile *p
dc40: 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
dc50: 2a 29 69 64 3b 0a 20 20 20 20 64 6f 74 6c 6f 63  *)id;.    dotloc
dc60: 6b 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c  kUnlock(id, NO_L
dc70: 4f 43 4b 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  OCK);.    sqlite
dc80: 33 5f 66 72 65 65 28 70 46 69 6c 65 2d 3e 6c 6f  3_free(pFile->lo
dc90: 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3b 0a 20  ckingContext);. 
dca0: 20 7d 0a 20 20 72 63 20 3d 20 63 6c 6f 73 65 55   }.  rc = closeU
dcb0: 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 20 20 72  nixFile(id);.  r
dcc0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 2f 2a 2a 2a  eturn rc;.}./***
dcd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
dce0: 45 6e 64 20 6f 66 20 74 68 65 20 64 6f 74 2d 66  End of the dot-f
dcf0: 69 6c 65 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65  ile lock impleme
dd00: 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a  ntation ********
dd10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 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 2a 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 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
dd60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a  **********/../**
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 2a 2a 2a 2a 2a 2a 2a 2a  ****************
dd90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
dda0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ddb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
ddc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ddd0: 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 66 6c  ******* Begin fl
dde0: 6f 63 6b 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a  ock Locking ****
ddf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
de00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a  ************.**.
de10: 2a 2a 20 55 73 65 20 74 68 65 20 66 6c 6f 63 6b  ** Use the flock
de20: 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 74  () system call t
de30: 6f 20 64 6f 20 66 69 6c 65 20 6c 6f 63 6b 69 6e  o do file lockin
de40: 67 2e 0a 2a 2a 0a 2a 2a 20 66 6c 6f 63 6b 28 29  g..**.** flock()
de50: 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6c 69 6b 65   locking is like
de60: 20 64 6f 74 2d 66 69 6c 65 20 6c 6f 63 6b 69 6e   dot-file lockin
de70: 67 20 69 6e 20 74 68 61 74 20 74 68 65 20 76 61  g in that the va
de80: 72 69 6f 75 73 0a 2a 2a 20 66 69 6e 65 2d 67 72  rious.** fine-gr
de90: 61 69 6e 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  ain locking leve
dea0: 6c 73 20 73 75 70 70 6f 72 74 65 64 20 62 79 20  ls supported by 
deb0: 53 51 4c 69 74 65 20 61 72 65 20 63 6f 6c 6c 61  SQLite are colla
dec0: 70 73 65 64 20 69 6e 74 6f 0a 2a 2a 20 61 20 73  psed into.** a s
ded0: 69 6e 67 6c 65 20 65 78 63 6c 75 73 69 76 65 20  ingle exclusive 
dee0: 6c 6f 63 6b 2e 20 20 49 6e 20 6f 74 68 65 72 20  lock.  In other 
def0: 77 6f 72 64 73 2c 20 53 48 41 52 45 44 2c 20 52  words, SHARED, R
df00: 45 53 45 52 56 45 44 2c 20 61 6e 64 0a 2a 2a 20  ESERVED, and.** 
df10: 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 73 20 61 72  PENDING locks ar
df20: 65 20 74 68 65 20 73 61 6d 65 20 74 68 69 6e 67  e the same thing
df30: 20 61 73 20 61 6e 20 45 58 43 4c 55 53 49 56 45   as an EXCLUSIVE
df40: 20 6c 6f 63 6b 2e 20 20 53 51 4c 69 74 65 0a 2a   lock.  SQLite.*
df50: 2a 20 73 74 69 6c 6c 20 77 6f 72 6b 73 20 77 68  * still works wh
df60: 65 6e 20 79 6f 75 20 64 6f 20 74 68 69 73 2c 20  en you do this, 
df70: 62 75 74 20 63 6f 6e 63 75 72 72 65 6e 63 79 20  but concurrency 
df80: 69 73 20 72 65 64 75 63 65 64 20 73 69 6e 63 65  is reduced since
df90: 0a 2a 2a 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c  .** only a singl
dfa0: 65 20 70 72 6f 63 65 73 73 20 63 61 6e 20 62 65  e process can be
dfb0: 20 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74   reading the dat
dfc0: 61 62 61 73 65 20 61 74 20 61 20 74 69 6d 65 2e  abase at a time.
dfd0: 0a 2a 2a 0a 2a 2a 20 4f 6d 69 74 20 74 68 69 73  .**.** Omit this
dfe0: 20 73 65 63 74 69 6f 6e 20 69 66 20 53 51 4c 49   section if SQLI
dff0: 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
e000: 47 5f 53 54 59 4c 45 20 69 73 20 74 75 72 6e 65  G_STYLE is turne
e010: 64 20 6f 66 66 20 6f 72 20 69 66 0a 2a 2a 20 63  d off or if.** c
e020: 6f 6d 70 69 6c 69 6e 67 20 66 6f 72 20 56 58 57  ompiling for VXW
e030: 4f 52 4b 53 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c  ORKS..*/.#if SQL
e040: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
e050: 4e 47 5f 53 54 59 4c 45 20 26 26 20 21 4f 53 5f  NG_STYLE && !OS_
e060: 56 58 57 4f 52 4b 53 0a 0a 2f 2a 0a 2a 2a 20 54  VXWORKS../*.** T
e070: 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63  his routine chec
e080: 6b 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61  ks if there is a
e090: 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68   RESERVED lock h
e0a0: 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69  eld on the speci
e0b0: 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20  fied.** file by 
e0c0: 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65  this or any othe
e0d0: 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75  r process. If su
e0e0: 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c  ch a lock is hel
e0f0: 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a  d, set *pResOut.
e100: 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f  ** to a non-zero
e110: 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65   value otherwise
e120: 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65 74   *pResOut is set
e130: 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72   to zero.  The r
e140: 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69  eturn value.** i
e150: 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f  s set to SQLITE_
e160: 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f  OK unless an I/O
e170: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75   error occurs du
e180: 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69  ring lock checki
e190: 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
e1a0: 74 20 66 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65  t flockCheckRese
e1b0: 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33  rvedLock(sqlite3
e1c0: 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a  _file *id, int *
e1d0: 70 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e 74 20  pResOut){.  int 
e1e0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
e1f0: 20 20 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d    int reserved =
e200: 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a   0;.  unixFile *
e210: 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
e220: 65 2a 29 69 64 3b 0a 20 20 0a 20 20 53 69 6d 75  e*)id;.  .  Simu
e230: 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74  lateIOError( ret
e240: 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
e250: 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f  _CHECKRESERVEDLO
e260: 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73 65  CK; );.  .  asse
e270: 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 0a  rt( pFile );.  .
e280: 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20    /* Check if a 
e290: 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 20 70  thread in this p
e2a0: 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63  rocess holds suc
e2b0: 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66  h a lock */.  if
e2c0: 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ( pFile->eFileLo
e2d0: 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  ck>SHARED_LOCK )
e2e0: 7b 0a 20 20 20 20 72 65 73 65 72 76 65 64 20 3d  {.    reserved =
e2f0: 20 31 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20   1;.  }.  .  /* 
e300: 4f 74 68 65 72 77 69 73 65 20 73 65 65 20 69 66  Otherwise see if
e310: 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63   some other proc
e320: 65 73 73 20 68 6f 6c 64 73 20 69 74 2e 20 2a 2f  ess holds it. */
e330: 0a 20 20 69 66 28 20 21 72 65 73 65 72 76 65 64  .  if( !reserved
e340: 20 29 7b 0a 20 20 20 20 2f 2a 20 61 74 74 65 6d   ){.    /* attem
e350: 70 74 20 74 6f 20 67 65 74 20 74 68 65 20 6c 6f  pt to get the lo
e360: 63 6b 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6c 72  ck */.    int lr
e370: 63 20 3d 20 66 6c 6f 63 6b 28 70 46 69 6c 65 2d  c = flock(pFile-
e380: 3e 68 2c 20 4c 4f 43 4b 5f 45 58 20 7c 20 4c 4f  >h, LOCK_EX | LO
e390: 43 4b 5f 4e 42 29 3b 0a 20 20 20 20 69 66 28 20  CK_NB);.    if( 
e3a0: 21 6c 72 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a  !lrc ){.      /*
e3b0: 20 67 6f 74 20 74 68 65 20 6c 6f 63 6b 2c 20 75   got the lock, u
e3c0: 6e 6c 6f 63 6b 20 69 74 20 2a 2f 0a 20 20 20 20  nlock it */.    
e3d0: 20 20 6c 72 63 20 3d 20 66 6c 6f 63 6b 28 70 46    lrc = flock(pF
e3e0: 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 55 4e 29  ile->h, LOCK_UN)
e3f0: 3b 0a 20 20 20 20 20 20 69 66 20 28 20 6c 72 63  ;.      if ( lrc
e400: 20 29 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74   ) {.        int
e410: 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
e420: 0a 20 20 20 20 20 20 20 20 2f 2a 20 75 6e 6c 6f  .        /* unlo
e430: 63 6b 20 66 61 69 6c 65 64 20 77 69 74 68 20 61  ck failed with a
e440: 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20  n error */.     
e450: 20 20 20 6c 72 63 20 3d 20 73 71 6c 69 74 65 45     lrc = sqliteE
e460: 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
e470: 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54  or(tErrno, SQLIT
e480: 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b  E_IOERR_UNLOCK);
e490: 20 0a 20 20 20 20 20 20 20 20 69 66 28 20 49 53   .        if( IS
e4a0: 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 29  _LOCK_ERROR(lrc)
e4b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46   ){.          pF
e4c0: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
e4d0: 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20   tErrno;.       
e4e0: 20 20 20 72 63 20 3d 20 6c 72 63 3b 0a 20 20 20     rc = lrc;.   
e4f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
e500: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
e510: 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65    int tErrno = e
e520: 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 65 73 65  rrno;.      rese
e530: 72 76 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  rved = 1;.      
e540: 2f 2a 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20  /* someone else 
e550: 6d 69 67 68 74 20 68 61 76 65 20 69 74 20 72 65  might have it re
e560: 73 65 72 76 65 64 20 2a 2f 0a 20 20 20 20 20 20  served */.      
e570: 6c 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f  lrc = sqliteErro
e580: 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28  rFromPosixError(
e590: 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49  tErrno, SQLITE_I
e5a0: 4f 45 52 52 5f 4c 4f 43 4b 29 3b 20 0a 20 20 20  OERR_LOCK); .   
e5b0: 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
e5c0: 52 52 4f 52 28 6c 72 63 29 20 29 7b 0a 20 20 20  RROR(lrc) ){.   
e5d0: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
e5e0: 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a  Errno = tErrno;.
e5f0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63          rc = lrc
e600: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
e610: 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22    }.  OSTRACE(("
e620: 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20  TEST WR-LOCK %d 
e630: 25 64 20 25 64 20 28 66 6c 6f 63 6b 29 5c 6e 22  %d %d (flock)\n"
e640: 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20  , pFile->h, rc, 
e650: 72 65 73 65 72 76 65 64 29 29 3b 0a 0a 23 69 66  reserved));..#if
e660: 64 65 66 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52  def SQLITE_IGNOR
e670: 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52  E_FLOCK_LOCK_ERR
e680: 4f 52 53 0a 20 20 69 66 28 20 28 72 63 20 26 20  ORS.  if( (rc & 
e690: 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 20 3d 3d  SQLITE_IOERR) ==
e6a0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b   SQLITE_IOERR ){
e6b0: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
e6c0: 5f 4f 4b 3b 0a 20 20 20 20 72 65 73 65 72 76 65  _OK;.    reserve
e6d0: 64 3d 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20  d=1;.  }.#endif 
e6e0: 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45  /* SQLITE_IGNORE
e6f0: 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f  _FLOCK_LOCK_ERRO
e700: 52 53 20 2a 2f 0a 20 20 2a 70 52 65 73 4f 75 74  RS */.  *pResOut
e710: 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20 20 72   = reserved;.  r
e720: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
e730: 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65  ** Lock the file
e740: 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73   with the lock s
e750: 70 65 63 69 66 69 65 64 20 62 79 20 70 61 72 61  pecified by para
e760: 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20  meter eFileLock 
e770: 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20  - one.** of the 
e780: 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
e790: 20 20 20 20 20 28 31 29 20 53 48 41 52 45 44 5f       (1) SHARED_
e7a0: 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20  LOCK.**     (2) 
e7b0: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a  RESERVED_LOCK.**
e7c0: 20 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47       (3) PENDING
e7d0: 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29  _LOCK.**     (4)
e7e0: 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a   EXCLUSIVE_LOCK.
e7f0: 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20  **.** Sometimes 
e800: 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20  when requesting 
e810: 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20  one lock state, 
e820: 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20  additional lock 
e830: 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e  states.** are in
e840: 73 65 72 74 65 64 20 69 6e 20 62 65 74 77 65 65  serted in betwee
e850: 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20  n.  The locking 
e860: 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e  might fail on on
e870: 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a  e of the later.*
e880: 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65  * transitions le
e890: 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73  aving the lock s
e8a0: 74 61 74 65 20 64 69 66 66 65 72 65 6e 74 20 66  tate different f
e8b0: 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61 72  rom what it star
e8c0: 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c  ted but.** still
e8d0: 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f   short of its go
e8e0: 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  al.  The followi
e8f0: 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73 20 74  ng chart shows t
e900: 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72  he allowed.** tr
e910: 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68  ansitions and th
e920: 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72  e inserted inter
e930: 6d 65 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a  mediate states:.
e940: 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45  **.**    UNLOCKE
e950: 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20  D -> SHARED.**  
e960: 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45    SHARED -> RESE
e970: 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  RVED.**    SHARE
e980: 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d  D -> (PENDING) -
e990: 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  > EXCLUSIVE.**  
e9a0: 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50    RESERVED -> (P
e9b0: 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
e9c0: 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49  SIVE.**    PENDI
e9d0: 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  NG -> EXCLUSIVE.
e9e0: 2a 2a 0a 2a 2a 20 66 6c 6f 63 6b 28 29 20 6f 6e  **.** flock() on
e9f0: 6c 79 20 72 65 61 6c 6c 79 20 73 75 70 70 6f 72  ly really suppor
ea00: 74 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  t EXCLUSIVE lock
ea10: 73 2e 20 20 57 65 20 74 72 61 63 6b 20 69 6e 74  s.  We track int
ea20: 65 72 6d 65 64 69 61 74 65 0a 2a 2a 20 6c 6f 63  ermediate.** loc
ea30: 6b 20 73 74 61 74 65 73 20 69 6e 20 74 68 65 20  k states in the 
ea40: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 73 74 72  sqlite3_file str
ea50: 75 63 74 75 72 65 2c 20 62 75 74 20 61 6c 6c 20  ucture, but all 
ea60: 6c 6f 63 6b 73 20 53 48 41 52 45 44 20 6f 72 0a  locks SHARED or.
ea70: 2a 2a 20 61 62 6f 76 65 20 61 72 65 20 72 65 61  ** above are rea
ea80: 6c 6c 79 20 45 58 43 4c 55 53 49 56 45 20 6c 6f  lly EXCLUSIVE lo
ea90: 63 6b 73 20 61 6e 64 20 65 78 63 6c 75 64 65 20  cks and exclude 
eaa0: 61 6c 6c 20 6f 74 68 65 72 20 70 72 6f 63 65 73  all other proces
eab0: 73 65 73 20 66 72 6f 6d 0a 2a 2a 20 61 63 63 65  ses from.** acce
eac0: 73 73 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a  ss the file..**.
ead0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
eae0: 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61  will only increa
eaf0: 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20  se a lock.  Use 
eb00: 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c  the sqlite3OsUnl
eb10: 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65  ock().** routine
eb20: 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b   to lower a lock
eb30: 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74  ing level..*/.st
eb40: 61 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b 4c 6f  atic int flockLo
eb50: 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
eb60: 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f  *id, int eFileLo
eb70: 63 6b 29 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ck) {.  int rc =
eb80: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e   SQLITE_OK;.  un
eb90: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
eba0: 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a  (unixFile*)id;..
ebb0: 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
ebc0: 29 3b 0a 0a 20 20 2f 2a 20 69 66 20 77 65 20 61  );..  /* if we a
ebd0: 6c 72 65 61 64 79 20 68 61 76 65 20 61 20 6c 6f  lready have a lo
ebe0: 63 6b 2c 20 69 74 20 69 73 20 65 78 63 6c 75 73  ck, it is exclus
ebf0: 69 76 65 2e 20 20 0a 20 20 2a 2a 20 4a 75 73 74  ive.  .  ** Just
ec00: 20 61 64 6a 75 73 74 20 6c 65 76 65 6c 20 61 6e   adjust level an
ec10: 64 20 70 75 6e 74 20 6f 6e 20 6f 75 74 74 61 20  d punt on outta 
ec20: 68 65 72 65 2e 20 2a 2f 0a 20 20 69 66 20 28 70  here. */.  if (p
ec30: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
ec40: 3e 20 4e 4f 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20  > NO_LOCK) {.   
ec50: 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
ec60: 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20  k = eFileLock;. 
ec70: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
ec80: 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  _OK;.  }.  .  /*
ec90: 20 67 72 61 62 20 61 6e 20 65 78 63 6c 75 73 69   grab an exclusi
eca0: 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 0a 20 20  ve lock */.  .  
ecb0: 69 66 20 28 66 6c 6f 63 6b 28 70 46 69 6c 65 2d  if (flock(pFile-
ecc0: 3e 68 2c 20 4c 4f 43 4b 5f 45 58 20 7c 20 4c 4f  >h, LOCK_EX | LO
ecd0: 43 4b 5f 4e 42 29 29 20 7b 0a 20 20 20 20 69 6e  CK_NB)) {.    in
ece0: 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  t tErrno = errno
ecf0: 3b 0a 20 20 20 20 2f 2a 20 64 69 64 6e 27 74 20  ;.    /* didn't 
ed00: 67 65 74 2c 20 6d 75 73 74 20 62 65 20 62 75 73  get, must be bus
ed10: 79 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71  y */.    rc = sq
ed20: 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73  liteErrorFromPos
ed30: 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20  ixError(tErrno, 
ed40: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43  SQLITE_IOERR_LOC
ed50: 4b 29 3b 0a 20 20 20 20 69 66 28 20 49 53 5f 4c  K);.    if( IS_L
ed60: 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b  OCK_ERROR(rc) ){
ed70: 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  .      pFile->la
ed80: 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f  stErrno = tErrno
ed90: 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 65 6c 73 65  ;.    }.  } else
eda0: 20 7b 0a 20 20 20 20 2f 2a 20 67 6f 74 20 69 74   {.    /* got it
edb0: 2c 20 73 65 74 20 74 68 65 20 74 79 70 65 20 61  , set the type a
edc0: 6e 64 20 72 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a  nd return ok */.
edd0: 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
ede0: 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b  Lock = eFileLock
edf0: 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28  ;.  }.  OSTRACE(
ee00: 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20  ("LOCK    %d %s 
ee10: 25 73 20 28 66 6c 6f 63 6b 29 5c 6e 22 2c 20 70  %s (flock)\n", p
ee20: 46 69 6c 65 2d 3e 68 2c 20 61 7a 46 69 6c 65 4c  File->h, azFileL
ee30: 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20  ock(eFileLock), 
ee40: 0a 20 20 20 20 20 20 20 20 20 20 20 72 63 3d 3d  .           rc==
ee50: 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22  SQLITE_OK ? "ok"
ee60: 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 23   : "failed"));.#
ee70: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 49 47 4e  ifdef SQLITE_IGN
ee80: 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45  ORE_FLOCK_LOCK_E
ee90: 52 52 4f 52 53 0a 20 20 69 66 28 20 28 72 63 20  RRORS.  if( (rc 
eea0: 26 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 20  & SQLITE_IOERR) 
eeb0: 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20  == SQLITE_IOERR 
eec0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
eed0: 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 23 65 6e  TE_BUSY;.  }.#en
eee0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47  dif /* SQLITE_IG
eef0: 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f  NORE_FLOCK_LOCK_
ef00: 45 52 52 4f 52 53 20 2a 2f 0a 20 20 72 65 74 75  ERRORS */.  retu
ef10: 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
ef20: 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69   Lower the locki
ef30: 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65  ng level on file
ef40: 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c   descriptor pFil
ef50: 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20  e to eFileLock. 
ef60: 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75   eFileLock.** mu
ef70: 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f  st be either NO_
ef80: 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c  LOCK or SHARED_L
ef90: 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  OCK..**.** If th
efa0: 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
efb0: 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  of the file desc
efc0: 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64  riptor is alread
efd0: 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a  y at or below.**
efe0: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
eff0: 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68  ocking level, th
f000: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
f010: 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
f020: 20 69 6e 74 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b   int flockUnlock
f030: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
f040: 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b  d, int eFileLock
f050: 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  ) {.  unixFile *
f060: 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
f070: 65 2a 29 69 64 3b 0a 20 20 0a 20 20 61 73 73 65  e*)id;.  .  asse
f080: 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f  rt( pFile );.  O
f090: 53 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20  STRACE(("UNLOCK 
f0a0: 20 25 64 20 25 64 20 77 61 73 20 25 64 20 70 69   %d %d was %d pi
f0b0: 64 3d 25 64 20 28 66 6c 6f 63 6b 29 5c 6e 22 2c  d=%d (flock)\n",
f0c0: 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65   pFile->h, eFile
f0d0: 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20 20 20  Lock,.          
f0e0: 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
f0f0: 6b 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a 20  k, getpid()));. 
f100: 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f   assert( eFileLo
f110: 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck<=SHARED_LOCK 
f120: 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70  );.  .  /* no-op
f130: 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a   if possible */.
f140: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69    if( pFile->eFi
f150: 6c 65 4c 6f 63 6b 3d 3d 65 46 69 6c 65 4c 6f 63  leLock==eFileLoc
f160: 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  k ){.    return 
f170: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
f180: 20 0a 20 20 2f 2a 20 73 68 61 72 65 64 20 63 61   .  /* shared ca
f190: 6e 20 6a 75 73 74 20 62 65 20 73 65 74 20 62 65  n just be set be
f1a0: 63 61 75 73 65 20 77 65 20 61 6c 77 61 79 73 20  cause we always 
f1b0: 68 61 76 65 20 61 6e 20 65 78 63 6c 75 73 69 76  have an exclusiv
f1c0: 65 20 2a 2f 0a 20 20 69 66 20 28 65 46 69 6c 65  e */.  if (eFile
f1d0: 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
f1e0: 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  K) {.    pFile->
f1f0: 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c  eFileLock = eFil
f200: 65 4c 6f 63 6b 3b 0a 20 20 20 20 72 65 74 75 72  eLock;.    retur
f210: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
f220: 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2c 20 72 65 61  .  .  /* no, rea
f230: 6c 6c 79 2c 20 75 6e 6c 6f 63 6b 2e 20 2a 2f 0a  lly, unlock. */.
f240: 20 20 69 6e 74 20 72 63 20 3d 20 66 6c 6f 63 6b    int rc = flock
f250: 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f  (pFile->h, LOCK_
f260: 55 4e 29 3b 0a 20 20 69 66 20 28 72 63 29 20 7b  UN);.  if (rc) {
f270: 0a 20 20 20 20 69 6e 74 20 72 2c 20 74 45 72 72  .    int r, tErr
f280: 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
f290: 72 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  r = sqliteErrorF
f2a0: 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
f2b0: 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45  rrno, SQLITE_IOE
f2c0: 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20  RR_UNLOCK);.    
f2d0: 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  if( IS_LOCK_ERRO
f2e0: 52 28 72 29 20 29 7b 0a 20 20 20 20 20 20 70 46  R(r) ){.      pF
f2f0: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
f300: 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 23   tErrno;.    }.#
f310: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 49 47 4e  ifdef SQLITE_IGN
f320: 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45  ORE_FLOCK_LOCK_E
f330: 52 52 4f 52 53 0a 20 20 20 20 69 66 28 20 28 72  RRORS.    if( (r
f340: 20 26 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29   & SQLITE_IOERR)
f350: 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52   == SQLITE_IOERR
f360: 20 29 7b 0a 20 20 20 20 20 20 72 20 3d 20 53 51   ){.      r = SQ
f370: 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d  LITE_BUSY;.    }
f380: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
f390: 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c  E_IGNORE_FLOCK_L
f3a0: 4f 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20  OCK_ERRORS */.  
f3b0: 20 20 0a 20 20 20 20 72 65 74 75 72 6e 20 72 3b    .    return r;
f3c0: 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20  .  } else {.    
f3d0: 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
f3e0: 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20   = NO_LOCK;.    
f3f0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
f400: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ;.  }.}../*.** C
f410: 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a  lose a file..*/.
f420: 73 74 61 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b  static int flock
f430: 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69  Close(sqlite3_fi
f440: 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69 66 28 20  le *id) {.  if( 
f450: 69 64 20 29 7b 0a 20 20 20 20 66 6c 6f 63 6b 55  id ){.    flockU
f460: 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43  nlock(id, NO_LOC
f470: 4b 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  K);.  }.  return
f480: 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69   closeUnixFile(i
f490: 64 29 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a  d);.}..#endif /*
f4a0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
f4b0: 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20  OCKING_STYLE && 
f4c0: 21 4f 53 5f 56 58 57 4f 52 4b 20 2a 2f 0a 0a 2f  !OS_VXWORK */../
f4d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f4e0: 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 66  *** End of the f
f4f0: 6c 6f 63 6b 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d  lock lock implem
f500: 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a  entation *******
f510: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 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 2a 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 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f560: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
f570: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
f580: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f590: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f5a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f5b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
f5c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f5d0: 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 4e  ******** Begin N
f5e0: 61 6d 65 64 20 53 65 6d 61 70 68 6f 72 65 20 4c  amed Semaphore L
f5f0: 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ocking *********
f600: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
f610: 2a 2a 0a 2a 2a 20 4e 61 6d 65 64 20 73 65 6d 61  **.** Named sema
f620: 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 69 73  phore locking is
f630: 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 65 64 20   only supported 
f640: 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a 0a 2a  on VxWorks..**.*
f650: 2a 20 53 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b  * Semaphore lock
f660: 69 6e 67 20 69 73 20 6c 69 6b 65 20 64 6f 74 2d  ing is like dot-
f670: 6c 6f 63 6b 20 61 6e 64 20 66 6c 6f 63 6b 20 69  lock and flock i
f680: 6e 20 74 68 61 74 20 69 74 20 72 65 61 6c 6c 79  n that it really
f690: 20 6f 6e 6c 79 0a 2a 2a 20 73 75 70 70 6f 72 74   only.** support
f6a0: 73 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  s EXCLUSIVE lock
f6b0: 69 6e 67 2e 20 20 4f 6e 6c 79 20 61 20 73 69 6e  ing.  Only a sin
f6c0: 67 6c 65 20 70 72 6f 63 65 73 73 20 63 61 6e 20  gle process can 
f6d0: 72 65 61 64 20 6f 72 20 77 72 69 74 65 0a 2a 2a  read or write.**
f6e0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
f6f0: 6c 65 20 61 74 20 61 20 74 69 6d 65 2e 20 20 54  le at a time.  T
f700: 68 69 73 20 72 65 64 75 63 65 73 20 70 6f 74 65  his reduces pote
f710: 6e 74 69 61 6c 20 63 6f 6e 63 75 72 72 65 6e 63  ntial concurrenc
f720: 79 2c 20 62 75 74 0a 2a 2a 20 6d 61 6b 65 73 20  y, but.** makes 
f730: 74 68 65 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65  the lock impleme
f740: 6e 74 61 74 69 6f 6e 20 6d 75 63 68 20 65 61 73  ntation much eas
f750: 69 65 72 2e 0a 2a 2f 0a 23 69 66 20 4f 53 5f 56  ier..*/.#if OS_V
f760: 58 57 4f 52 4b 53 0a 0a 2f 2a 0a 2a 2a 20 54 68  XWORKS../*.** Th
f770: 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b  is routine check
f780: 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20  s if there is a 
f790: 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65  RESERVED lock he
f7a0: 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66  ld on the specif
f7b0: 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74  ied.** file by t
f7c0: 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72  his or any other
f7d0: 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63   process. If suc
f7e0: 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  h a lock is held
f7f0: 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a  , set *pResOut.*
f800: 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20  * to a non-zero 
f810: 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20  value otherwise 
f820: 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65 74 20  *pResOut is set 
f830: 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65  to zero.  The re
f840: 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73  turn value.** is
f850: 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f   set to SQLITE_O
f860: 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20  K unless an I/O 
f870: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72  error occurs dur
f880: 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e  ing lock checkin
f890: 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
f8a0: 20 73 65 6d 43 68 65 63 6b 52 65 73 65 72 76 65   semCheckReserve
f8b0: 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  dLock(sqlite3_fi
f8c0: 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65  le *id, int *pRe
f8d0: 73 4f 75 74 29 20 7b 0a 20 20 69 6e 74 20 72 63  sOut) {.  int rc
f8e0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
f8f0: 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d 20 30  int reserved = 0
f900: 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  ;.  unixFile *pF
f910: 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
f920: 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65  )id;..  Simulate
f930: 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  IOError( return 
f940: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45  SQLITE_IOERR_CHE
f950: 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20  CKRESERVEDLOCK; 
f960: 29 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20  );.  .  assert( 
f970: 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 43  pFile );..  /* C
f980: 68 65 63 6b 20 69 66 20 61 20 74 68 72 65 61 64  heck if a thread
f990: 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73   in this process
f9a0: 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c 6f   holds such a lo
f9b0: 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  ck */.  if( pFil
f9c0: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41  e->eFileLock>SHA
f9d0: 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RED_LOCK ){.    
f9e0: 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20  reserved = 1;.  
f9f0: 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74 68 65 72 77  }.  .  /* Otherw
fa00: 69 73 65 20 73 65 65 20 69 66 20 73 6f 6d 65 20  ise see if some 
fa10: 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 68 6f  other process ho
fa20: 6c 64 73 20 69 74 2e 20 2a 2f 0a 20 20 69 66 28  lds it. */.  if(
fa30: 20 21 72 65 73 65 72 76 65 64 20 29 7b 0a 20 20   !reserved ){.  
fa40: 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d 20 3d 20    sem_t *pSem = 
fa50: 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70  pFile->pInode->p
fa60: 53 65 6d 3b 0a 20 20 20 20 73 74 72 75 63 74 20  Sem;.    struct 
fa70: 73 74 61 74 20 73 74 61 74 42 75 66 3b 0a 0a 20  stat statBuf;.. 
fa80: 20 20 20 69 66 28 20 73 65 6d 5f 74 72 79 77 61     if( sem_trywa
fa90: 69 74 28 70 53 65 6d 29 3d 3d 2d 31 20 29 7b 0a  it(pSem)==-1 ){.
faa0: 20 20 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f        int tErrno
fab0: 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
fac0: 69 66 28 20 45 41 47 41 49 4e 20 21 3d 20 74 45  if( EAGAIN != tE
fad0: 72 72 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20  rrno ){.        
fae0: 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72  rc = sqliteError
faf0: 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74  FromPosixError(t
fb00: 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f  Errno, SQLITE_IO
fb10: 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45  ERR_CHECKRESERVE
fb20: 44 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20  DLOCK);.        
fb30: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
fb40: 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20   = tErrno;.     
fb50: 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
fb60: 20 20 2f 2a 20 73 6f 6d 65 6f 6e 65 20 65 6c 73    /* someone els
fb70: 65 20 68 61 73 20 74 68 65 20 6c 6f 63 6b 20 77  e has the lock w
fb80: 68 65 6e 20 77 65 20 61 72 65 20 69 6e 20 4e 4f  hen we are in NO
fb90: 5f 4c 4f 43 4b 20 2a 2f 0a 20 20 20 20 20 20 20  _LOCK */.       
fba0: 20 72 65 73 65 72 76 65 64 20 3d 20 28 70 46 69   reserved = (pFi
fbb0: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3c 20  le->eFileLock < 
fbc0: 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20  SHARED_LOCK);.  
fbd0: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
fbe0: 0a 20 20 20 20 20 20 2f 2a 20 77 65 20 63 6f 75  .      /* we cou
fbf0: 6c 64 20 68 61 76 65 20 69 74 20 69 66 20 77 65  ld have it if we
fc00: 20 77 61 6e 74 20 69 74 20 2a 2f 0a 20 20 20 20   want it */.    
fc10: 20 20 73 65 6d 5f 70 6f 73 74 28 70 53 65 6d 29    sem_post(pSem)
fc20: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 4f 53  ;.    }.  }.  OS
fc30: 54 52 41 43 45 28 28 22 54 45 53 54 20 57 52 2d  TRACE(("TEST WR-
fc40: 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 20 28 73  LOCK %d %d %d (s
fc50: 65 6d 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  em)\n", pFile->h
fc60: 2c 20 72 63 2c 20 72 65 73 65 72 76 65 64 29 29  , rc, reserved))
fc70: 3b 0a 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20  ;..  *pResOut = 
fc80: 72 65 73 65 72 76 65 64 3b 0a 20 20 72 65 74 75  reserved;.  retu
fc90: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
fca0: 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69  Lock the file wi
fcb0: 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63  th the lock spec
fcc0: 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74  ified by paramet
fcd0: 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f  er eFileLock - o
fce0: 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c  ne.** of the fol
fcf0: 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20  lowing:.**.**   
fd00: 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43    (1) SHARED_LOC
fd10: 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53  K.**     (2) RES
fd20: 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  ERVED_LOCK.**   
fd30: 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f    (3) PENDING_LO
fd40: 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58  CK.**     (4) EX
fd50: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a  CLUSIVE_LOCK.**.
fd60: 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65  ** Sometimes whe
fd70: 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65  n requesting one
fd80: 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64   lock state, add
fd90: 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61  itional lock sta
fda0: 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72  tes.** are inser
fdb0: 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20  ted in between. 
fdc0: 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67   The locking mig
fdd0: 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f  ht fail on one o
fde0: 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74  f the later.** t
fdf0: 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69  ransitions leavi
fe00: 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74  ng the lock stat
fe10: 65 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d  e different from
fe20: 20 77 68 61 74 20 69 74 20 73 74 61 72 74 65 64   what it started
fe30: 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68   but.** still sh
fe40: 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e  ort of its goal.
fe50: 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
fe60: 63 68 61 72 74 20 73 68 6f 77 73 20 74 68 65 20  chart shows the 
fe70: 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73  allowed.** trans
fe80: 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69  itions and the i
fe90: 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64  nserted intermed
fea0: 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a  iate states:.**.
feb0: 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d  **    UNLOCKED -
fec0: 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53  > SHARED.**    S
fed0: 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45  HARED -> RESERVE
fee0: 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d  D.**    SHARED -
fef0: 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45  > (PENDING) -> E
ff00: 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52  XCLUSIVE.**    R
ff10: 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44  ESERVED -> (PEND
ff20: 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56  ING) -> EXCLUSIV
ff30: 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20  E.**    PENDING 
ff40: 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a  -> EXCLUSIVE.**.
ff50: 2a 2a 20 53 65 6d 61 70 68 6f 72 65 20 6c 6f 63  ** Semaphore loc
ff60: 6b 73 20 6f 6e 6c 79 20 72 65 61 6c 6c 79 20 73  ks only really s
ff70: 75 70 70 6f 72 74 20 45 58 43 4c 55 53 49 56 45  upport EXCLUSIVE
ff80: 20 6c 6f 63 6b 73 2e 20 20 57 65 20 74 72 61 63   locks.  We trac
ff90: 6b 20 69 6e 74 65 72 6d 65 64 69 61 74 65 0a 2a  k intermediate.*
ffa0: 2a 20 6c 6f 63 6b 20 73 74 61 74 65 73 20 69 6e  * lock states in
ffb0: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c   the sqlite3_fil
ffc0: 65 20 73 74 72 75 63 74 75 72 65 2c 20 62 75 74  e structure, but
ffd0: 20 61 6c 6c 20 6c 6f 63 6b 73 20 53 48 41 52 45   all locks SHARE
ffe0: 44 20 6f 72 0a 2a 2a 20 61 62 6f 76 65 20 61 72  D or.** above ar
fff0: 65 20 72 65 61 6c 6c 79 20 45 58 43 4c 55 53 49  e really EXCLUSI
10000 56 45 20 6c 6f 63 6b 73 20 61 6e 64 20 65 78 63  VE locks and exc
10010 6c 75 64 65 20 61 6c 6c 20 6f 74 68 65 72 20 70  lude all other p
10020 72 6f 63 65 73 73 65 73 20 66 72 6f 6d 0a 2a 2a  rocesses from.**
10030 20 61 63 63 65 73 73 20 74 68 65 20 66 69 6c 65   access the file
10040 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
10050 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69  tine will only i
10060 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20  ncrease a lock. 
10070 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33   Use the sqlite3
10080 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f  OsUnlock().** ro
10090 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61  utine to lower a
100a0 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a   locking level..
100b0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
100c0 6d 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  mLock(sqlite3_fi
100d0 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c  le *id, int eFil
100e0 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46  eLock) {.  unixF
100f0 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
10100 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e  ixFile*)id;.  in
10110 74 20 66 64 3b 0a 20 20 73 65 6d 5f 74 20 2a 70  t fd;.  sem_t *p
10120 53 65 6d 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e  Sem = pFile->pIn
10130 6f 64 65 2d 3e 70 53 65 6d 3b 0a 20 20 69 6e 74  ode->pSem;.  int
10140 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
10150 0a 0a 20 20 2f 2a 20 69 66 20 77 65 20 61 6c 72  ..  /* if we alr
10160 65 61 64 79 20 68 61 76 65 20 61 20 6c 6f 63 6b  eady have a lock
10170 2c 20 69 74 20 69 73 20 65 78 63 6c 75 73 69 76  , it is exclusiv
10180 65 2e 20 20 0a 20 20 2a 2a 20 4a 75 73 74 20 61  e.  .  ** Just a
10190 64 6a 75 73 74 20 6c 65 76 65 6c 20 61 6e 64 20  djust level and 
101a0 70 75 6e 74 20 6f 6e 20 6f 75 74 74 61 20 68 65  punt on outta he
101b0 72 65 2e 20 2a 2f 0a 20 20 69 66 20 28 70 46 69  re. */.  if (pFi
101c0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3e 20  le->eFileLock > 
101d0 4e 4f 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70  NO_LOCK) {.    p
101e0 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
101f0 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20  = eFileLock;.   
10200 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
10210 0a 20 20 20 20 67 6f 74 6f 20 73 65 6d 5f 65 6e  .    goto sem_en
10220 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 0a 20  d_lock;.  }.  . 
10230 20 2f 2a 20 6c 6f 63 6b 20 73 65 6d 61 70 68 6f   /* lock semapho
10240 72 65 20 6e 6f 77 20 62 75 74 20 62 61 69 6c 20  re now but bail 
10250 6f 75 74 20 77 68 65 6e 20 61 6c 72 65 61 64 79  out when already
10260 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20 69 66   locked. */.  if
10270 28 20 73 65 6d 5f 74 72 79 77 61 69 74 28 70 53  ( sem_trywait(pS
10280 65 6d 29 3d 3d 2d 31 20 29 7b 0a 20 20 20 20 72  em)==-1 ){.    r
10290 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
102a0 0a 20 20 20 20 67 6f 74 6f 20 73 65 6d 5f 65 6e  .    goto sem_en
102b0 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f  d_lock;.  }..  /
102c0 2a 20 67 6f 74 20 69 74 2c 20 73 65 74 20 74 68  * got it, set th
102d0 65 20 74 79 70 65 20 61 6e 64 20 72 65 74 75 72  e type and retur
102e0 6e 20 6f 6b 20 2a 2f 0a 20 20 70 46 69 6c 65 2d  n ok */.  pFile-
102f0 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69  >eFileLock = eFi
10300 6c 65 4c 6f 63 6b 3b 0a 0a 20 73 65 6d 5f 65 6e  leLock;.. sem_en
10310 64 5f 6c 6f 63 6b 3a 0a 20 20 72 65 74 75 72 6e  d_lock:.  return
10320 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f   rc;.}../*.** Lo
10330 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  wer the locking 
10340 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65  level on file de
10350 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74  scriptor pFile t
10360 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46  o eFileLock.  eF
10370 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20  ileLock.** must 
10380 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43  be either NO_LOC
10390 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b  K or SHARED_LOCK
103a0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c  ..**.** If the l
103b0 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20  ocking level of 
103c0 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
103d0 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61  tor is already a
103e0 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68  t or below.** th
103f0 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
10400 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20  ing level, this 
10410 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
10420 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  op..*/.static in
10430 74 20 73 65 6d 55 6e 6c 6f 63 6b 28 73 71 6c 69  t semUnlock(sqli
10440 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
10450 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20  t eFileLock) {. 
10460 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
10470 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
10480 3b 0a 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d 20  ;.  sem_t *pSem 
10490 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  = pFile->pInode-
104a0 3e 70 53 65 6d 3b 0a 0a 20 20 61 73 73 65 72 74  >pSem;..  assert
104b0 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 61 73 73  ( pFile );.  ass
104c0 65 72 74 28 20 70 53 65 6d 20 29 3b 0a 20 20 4f  ert( pSem );.  O
104d0 53 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20  STRACE(("UNLOCK 
104e0 20 25 64 20 25 64 20 77 61 73 20 25 64 20 70 69   %d %d was %d pi
104f0 64 3d 25 64 20 28 73 65 6d 29 5c 6e 22 2c 20 70  d=%d (sem)\n", p
10500 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f  File->h, eFileLo
10510 63 6b 2c 0a 09 20 20 20 70 46 69 6c 65 2d 3e 65  ck,..   pFile->e
10520 46 69 6c 65 4c 6f 63 6b 2c 20 67 65 74 70 69 64  FileLock, getpid
10530 28 29 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ()));.  assert( 
10540 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45  eFileLock<=SHARE
10550 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f  D_LOCK );.  .  /
10560 2a 20 6e 6f 2d 6f 70 20 69 66 20 70 6f 73 73 69  * no-op if possi
10570 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ble */.  if( pFi
10580 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 65  le->eFileLock==e
10590 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  FileLock ){.    
105a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
105b0 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 73 68  ;.  }.  .  /* sh
105c0 61 72 65 64 20 63 61 6e 20 6a 75 73 74 20 62 65  ared can just be
105d0 20 73 65 74 20 62 65 63 61 75 73 65 20 77 65 20   set because we 
105e0 61 6c 77 61 79 73 20 68 61 76 65 20 61 6e 20 65  always have an e
105f0 78 63 6c 75 73 69 76 65 20 2a 2f 0a 20 20 69 66  xclusive */.  if
10600 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41   (eFileLock==SHA
10610 52 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20  RED_LOCK) {.    
10620 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
10630 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20   = eFileLock;.  
10640 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10650 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  OK;.  }.  .  /* 
10660 6e 6f 2c 20 72 65 61 6c 6c 79 20 75 6e 6c 6f 63  no, really unloc
10670 6b 2e 20 2a 2f 0a 20 20 69 66 20 28 20 73 65 6d  k. */.  if ( sem
10680 5f 70 6f 73 74 28 70 53 65 6d 29 3d 3d 2d 31 20  _post(pSem)==-1 
10690 29 20 7b 0a 20 20 20 20 69 6e 74 20 72 63 2c 20  ) {.    int rc, 
106a0 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
106b0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45      rc = sqliteE
106c0 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
106d0 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54  or(tErrno, SQLIT
106e0 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b  E_IOERR_UNLOCK);
106f0 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b  .    if( IS_LOCK
10700 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20  _ERROR(rc) ){.  
10710 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
10720 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20  rrno = tErrno;. 
10730 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
10740 72 63 3b 20 0a 20 20 7d 0a 20 20 70 46 69 6c 65  rc; .  }.  pFile
10750 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f  ->eFileLock = NO
10760 5f 4c 4f 43 4b 3b 0a 20 20 72 65 74 75 72 6e 20  _LOCK;.  return 
10770 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
10780 0a 20 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c  . ** Close a fil
10790 65 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  e.. */.static in
107a0 74 20 73 65 6d 43 6c 6f 73 65 28 73 71 6c 69 74  t semClose(sqlit
107b0 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20  e3_file *id) {. 
107c0 20 69 66 28 20 69 64 20 29 7b 0a 20 20 20 20 75   if( id ){.    u
107d0 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
107e0 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
107f0 20 20 20 20 73 65 6d 55 6e 6c 6f 63 6b 28 69 64      semUnlock(id
10800 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  , NO_LOCK);.    
10810 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
10820 0a 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75  .    unixEnterMu
10830 74 65 78 28 29 3b 0a 20 20 20 20 72 65 6c 65 61  tex();.    relea
10840 73 65 49 6e 6f 64 65 49 6e 66 6f 28 70 46 69 6c  seInodeInfo(pFil
10850 65 29 3b 0a 20 20 20 20 75 6e 69 78 4c 65 61 76  e);.    unixLeav
10860 65 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 63 6c  eMutex();.    cl
10870 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b  oseUnixFile(id);
10880 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
10890 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64  LITE_OK;.}..#end
108a0 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53  if /* OS_VXWORKS
108b0 20 2a 2f 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65 64 20   */./*.** Named 
108c0 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e  semaphore lockin
108d0 67 20 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61  g is only availa
108e0 62 6c 65 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a  ble on VxWorks..
108f0 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
10900 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6e 61  ** End of the na
10910 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f  med semaphore lo
10920 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ck implementatio
10930 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  n **************
10940 2a 2a 0a 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 2a 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 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10990 2a 2f 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  */.../**********
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 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
109c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
109d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
109e0 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
109f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10a00 20 42 65 67 69 6e 20 41 46 50 20 4c 6f 63 6b 69   Begin AFP Locki
10a10 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ng *************
10a20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10a30 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 41 46 50 20 69  ****.**.** AFP i
10a40 73 20 74 68 65 20 41 70 70 6c 65 20 46 69 6c 69  s the Apple Fili
10a50 6e 67 20 50 72 6f 74 6f 63 6f 6c 2e 20 20 41 46  ng Protocol.  AF
10a60 50 20 69 73 20 61 20 6e 65 74 77 6f 72 6b 20 66  P is a network f
10a70 69 6c 65 73 79 73 74 65 6d 20 66 6f 75 6e 64 0a  ilesystem found.
10a80 2a 2a 20 6f 6e 20 41 70 70 6c 65 20 4d 61 63 69  ** on Apple Maci
10a90 6e 74 6f 73 68 20 63 6f 6d 70 75 74 65 72 73 20  ntosh computers 
10aa0 2d 20 62 6f 74 68 20 4f 53 39 20 61 6e 64 20 4f  - both OS9 and O
10ab0 53 58 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 72 64 2d  SX..**.** Third-
10ac0 70 61 72 74 79 20 69 6d 70 6c 65 6d 65 6e 74 61  party implementa
10ad0 74 69 6f 6e 73 20 6f 66 20 41 46 50 20 61 72 65  tions of AFP are
10ae0 20 61 76 61 69 6c 61 62 6c 65 2e 20 20 42 75 74   available.  But
10af0 20 74 68 69 73 20 63 6f 64 65 20 68 65 72 65 0a   this code here.
10b00 2a 2a 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 6f 6e  ** only works on
10b10 20 4f 53 58 2e 0a 2a 2f 0a 0a 23 69 66 20 64 65   OSX..*/..#if de
10b20 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
10b30 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
10b40 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
10b50 2f 2a 0a 2a 2a 20 54 68 65 20 61 66 70 4c 6f 63  /*.** The afpLoc
10b60 6b 69 6e 67 43 6f 6e 74 65 78 74 20 73 74 72 75  kingContext stru
10b70 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 20 61  cture contains a
10b80 6c 6c 20 61 66 70 20 6c 6f 63 6b 20 73 70 65 63  ll afp lock spec
10b90 69 66 69 63 20 73 74 61 74 65 0a 2a 2f 0a 74 79  ific state.*/.ty
10ba0 70 65 64 65 66 20 73 74 72 75 63 74 20 61 66 70  pedef struct afp
10bb0 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 61  LockingContext a
10bc0 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
10bd0 3b 0a 73 74 72 75 63 74 20 61 66 70 4c 6f 63 6b  ;.struct afpLock
10be0 69 6e 67 43 6f 6e 74 65 78 74 20 7b 0a 20 20 69  ingContext {.  i
10bf0 6e 74 20 72 65 73 65 72 76 65 64 3b 0a 20 20 63  nt reserved;.  c
10c00 6f 6e 73 74 20 63 68 61 72 20 2a 64 62 50 61 74  onst char *dbPat
10c10 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  h;             /
10c20 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f 70  * Name of the op
10c30 65 6e 20 66 69 6c 65 20 2a 2f 0a 7d 3b 0a 0a 73  en file */.};..s
10c40 74 72 75 63 74 20 42 79 74 65 52 61 6e 67 65 4c  truct ByteRangeL
10c50 6f 63 6b 50 42 32 0a 7b 0a 20 20 75 6e 73 69 67  ockPB2.{.  unsig
10c60 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6f 66  ned long long of
10c70 66 73 65 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  fset;        /* 
10c80 6f 66 66 73 65 74 20 74 6f 20 66 69 72 73 74 20  offset to first 
10c90 62 79 74 65 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a  byte to lock */.
10ca0 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20    unsigned long 
10cb0 6c 6f 6e 67 20 6c 65 6e 67 74 68 3b 20 20 20 20  long length;    
10cc0 20 20 20 20 2f 2a 20 6e 62 72 20 6f 66 20 62 79      /* nbr of by
10cd0 74 65 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20  tes to lock */. 
10ce0 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c   unsigned long l
10cf0 6f 6e 67 20 72 65 74 52 61 6e 67 65 53 74 61 72  ong retRangeStar
10d00 74 3b 20 2f 2a 20 6e 62 72 20 6f 66 20 31 73 74  t; /* nbr of 1st
10d10 20 62 79 74 65 20 6c 6f 63 6b 65 64 20 69 66 20   byte locked if 
10d20 73 75 63 63 65 73 73 66 75 6c 20 2a 2f 0a 20 20  successful */.  
10d30 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 75 6e  unsigned char un
10d40 4c 6f 63 6b 46 6c 61 67 3b 20 20 20 20 20 20 20  LockFlag;       
10d50 20 20 2f 2a 20 31 20 3d 20 75 6e 6c 6f 63 6b 2c    /* 1 = unlock,
10d60 20 30 20 3d 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75   0 = lock */.  u
10d70 6e 73 69 67 6e 65 64 20 63 68 61 72 20 73 74 61  nsigned char sta
10d80 72 74 45 6e 64 46 6c 61 67 3b 20 20 20 20 20 20  rtEndFlag;      
10d90 20 2f 2a 20 31 3d 72 65 6c 20 74 6f 20 65 6e 64   /* 1=rel to end
10da0 20 6f 66 20 66 6f 72 6b 2c 20 30 3d 72 65 6c 20   of fork, 0=rel 
10db0 74 6f 20 73 74 61 72 74 20 2a 2f 0a 20 20 69 6e  to start */.  in
10dc0 74 20 66 64 3b 20 20 20 20 20 20 20 20 20 20 20  t fd;           
10dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10de0 2f 2a 20 66 69 6c 65 20 64 65 73 63 20 74 6f 20  /* file desc to 
10df0 61 73 73 6f 63 20 74 68 69 73 20 6c 6f 63 6b 20  assoc this lock 
10e00 77 69 74 68 20 2a 2f 0a 7d 3b 0a 0a 23 64 65 66  with */.};..#def
10e10 69 6e 65 20 61 66 70 66 73 42 79 74 65 52 61 6e  ine afpfsByteRan
10e20 67 65 4c 6f 63 6b 32 46 53 43 54 4c 20 20 20 20  geLock2FSCTL    
10e30 20 20 20 20 5f 49 4f 57 52 28 27 7a 27 2c 20 32      _IOWR('z', 2
10e40 33 2c 20 73 74 72 75 63 74 20 42 79 74 65 52 61  3, struct ByteRa
10e50 6e 67 65 4c 6f 63 6b 50 42 32 29 0a 0a 2f 2a 0a  ngeLockPB2)../*.
10e60 2a 2a 20 54 68 69 73 20 69 73 20 61 20 75 74 69  ** This is a uti
10e70 6c 69 74 79 20 66 6f 72 20 73 65 74 74 69 6e 67  lity for setting
10e80 20 6f 72 20 63 6c 65 61 72 69 6e 67 20 61 20 62   or clearing a b
10e90 69 74 2d 72 61 6e 67 65 20 6c 6f 63 6b 20 6f 6e  it-range lock on
10ea0 20 61 6e 0a 2a 2a 20 41 46 50 20 66 69 6c 65 73   an.** AFP files
10eb0 79 73 74 65 6d 2e 0a 2a 2a 20 0a 2a 2a 20 52 65  ystem..** .** Re
10ec0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
10ed0 6e 20 73 75 63 63 65 73 73 2c 20 53 51 4c 49 54  n success, SQLIT
10ee0 45 5f 42 55 53 59 20 6f 6e 20 66 61 69 6c 75 72  E_BUSY on failur
10ef0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
10f00 20 61 66 70 53 65 74 4c 6f 63 6b 28 0a 20 20 63   afpSetLock(.  c
10f10 6f 6e 73 74 20 63 68 61 72 20 2a 70 61 74 68 2c  onst char *path,
10f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10f30 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c   Name of the fil
10f40 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20 6f  e to be locked o
10f50 72 20 75 6e 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20  r unlocked */.  
10f60 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c  unixFile *pFile,
10f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10f80 2a 20 4f 70 65 6e 20 66 69 6c 65 20 64 65 73 63  * Open file desc
10f90 72 69 70 74 6f 72 20 6f 6e 20 70 61 74 68 20 2a  riptor on path *
10fa0 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  /.  unsigned lon
10fb0 67 20 6c 6f 6e 67 20 6f 66 66 73 65 74 2c 20 20  g long offset,  
10fc0 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65     /* First byte
10fd0 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20 2a 2f   to be locked */
10fe0 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  .  unsigned long
10ff0 20 6c 6f 6e 67 20 6c 65 6e 67 74 68 2c 20 20 20   long length,   
11000 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
11010 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a  ytes to lock */.
11020 20 20 69 6e 74 20 73 65 74 4c 6f 63 6b 46 6c 61    int setLockFla
11030 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g               
11040 20 2f 2a 20 54 72 75 65 20 74 6f 20 73 65 74 20   /* True to set 
11050 6c 6f 63 6b 2e 20 20 46 61 6c 73 65 20 74 6f 20  lock.  False to 
11060 63 6c 65 61 72 20 6c 6f 63 6b 20 2a 2f 0a 29 7b  clear lock */.){
11070 0a 20 20 73 74 72 75 63 74 20 42 79 74 65 52 61  .  struct ByteRa
11080 6e 67 65 4c 6f 63 6b 50 42 32 20 70 62 3b 0a 20  ngeLockPB2 pb;. 
11090 20 69 6e 74 20 65 72 72 3b 0a 20 20 0a 20 20 70   int err;.  .  p
110a0 62 2e 75 6e 4c 6f 63 6b 46 6c 61 67 20 3d 20 73  b.unLockFlag = s
110b0 65 74 4c 6f 63 6b 46 6c 61 67 20 3f 20 30 20 3a  etLockFlag ? 0 :
110c0 20 31 3b 0a 20 20 70 62 2e 73 74 61 72 74 45 6e   1;.  pb.startEn
110d0 64 46 6c 61 67 20 3d 20 30 3b 0a 20 20 70 62 2e  dFlag = 0;.  pb.
110e0 6f 66 66 73 65 74 20 3d 20 6f 66 66 73 65 74 3b  offset = offset;
110f0 0a 20 20 70 62 2e 6c 65 6e 67 74 68 20 3d 20 6c  .  pb.length = l
11100 65 6e 67 74 68 3b 20 0a 20 20 70 62 2e 66 64 20  ength; .  pb.fd 
11110 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 20 20 0a 20  = pFile->h;.  . 
11120 20 4f 53 54 52 41 43 45 28 28 22 41 46 50 53 45   OSTRACE(("AFPSE
11130 54 4c 4f 43 4b 20 5b 25 73 5d 20 66 6f 72 20 25  TLOCK [%s] for %
11140 64 25 73 20 69 6e 20 72 61 6e 67 65 20 25 6c 6c  d%s in range %ll
11150 78 3a 25 6c 6c 78 5c 6e 22 2c 20 0a 20 20 20 20  x:%llx\n", .    
11160 28 73 65 74 4c 6f 63 6b 46 6c 61 67 3f 22 4f 4e  (setLockFlag?"ON
11170 22 3a 22 4f 46 46 22 29 2c 20 70 46 69 6c 65 2d  ":"OFF"), pFile-
11180 3e 68 2c 20 28 70 62 2e 66 64 3d 3d 2d 31 3f 22  >h, (pb.fd==-1?"
11190 5b 74 65 73 74 76 61 6c 2d 31 5d 22 3a 22 22 29  [testval-1]":"")
111a0 2c 0a 20 20 20 20 6f 66 66 73 65 74 2c 20 6c 65  ,.    offset, le
111b0 6e 67 74 68 29 29 3b 0a 20 20 65 72 72 20 3d 20  ngth));.  err = 
111c0 66 73 63 74 6c 28 70 61 74 68 2c 20 61 66 70 66  fsctl(path, afpf
111d0 73 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 32 46  sByteRangeLock2F
111e0 53 43 54 4c 2c 20 26 70 62 2c 20 30 29 3b 0a 20  SCTL, &pb, 0);. 
111f0 20 69 66 20 28 20 65 72 72 3d 3d 2d 31 20 29 20   if ( err==-1 ) 
11200 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20  {.    int rc;.  
11210 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65    int tErrno = e
11220 72 72 6e 6f 3b 0a 20 20 20 20 4f 53 54 52 41 43  rrno;.    OSTRAC
11230 45 28 28 22 41 46 50 53 45 54 4c 4f 43 4b 20 66  E(("AFPSETLOCK f
11240 61 69 6c 65 64 20 74 6f 20 66 73 63 74 6c 28 29  ailed to fsctl()
11250 20 27 25 73 27 20 25 64 20 25 73 5c 6e 22 2c 0a   '%s' %d %s\n",.
11260 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61 74               pat
11270 68 2c 20 74 45 72 72 6e 6f 2c 20 73 74 72 65 72  h, tErrno, strer
11280 72 6f 72 28 74 45 72 72 6e 6f 29 29 29 3b 0a 23  ror(tErrno)));.#
11290 69 66 64 65 66 20 53 51 4c 49 54 45 5f 49 47 4e  ifdef SQLITE_IGN
112a0 4f 52 45 5f 41 46 50 5f 4c 4f 43 4b 5f 45 52 52  ORE_AFP_LOCK_ERR
112b0 4f 52 53 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  ORS.    rc = SQL
112c0 49 54 45 5f 42 55 53 59 3b 0a 23 65 6c 73 65 0a  ITE_BUSY;.#else.
112d0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45      rc = sqliteE
112e0 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
112f0 6f 72 28 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20  or(tErrno,.     
11300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
11310 65 74 4c 6f 63 6b 46 6c 61 67 20 3f 20 53 51 4c  etLockFlag ? SQL
11320 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 20 3a  ITE_IOERR_LOCK :
11330 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e   SQLITE_IOERR_UN
11340 4c 4f 43 4b 29 3b 0a 23 65 6e 64 69 66 20 2f 2a  LOCK);.#endif /*
11350 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 41   SQLITE_IGNORE_A
11360 46 50 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20 2a  FP_LOCK_ERRORS *
11370 2f 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43  /.    if( IS_LOC
11380 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20  K_ERROR(rc) ){. 
11390 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
113a0 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a  Errno = tErrno;.
113b0 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
113c0 20 72 63 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a   rc;.  } else {.
113d0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
113e0 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  E_OK;.  }.}../*.
113f0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
11400 63 68 65 63 6b 73 20 69 66 20 74 68 65 72 65 20  checks if there 
11410 69 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  is a RESERVED lo
11420 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73  ck held on the s
11430 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65  pecified.** file
11440 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20   by this or any 
11450 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49  other process. I
11460 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73  f such a lock is
11470 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73   held, set *pRes
11480 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d  Out.** to a non-
11490 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72  zero value other
114a0 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73  wise *pResOut is
114b0 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54   set to zero.  T
114c0 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a  he return value.
114d0 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c  ** is set to SQL
114e0 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e  ITE_OK unless an
114f0 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72   I/O error occur
11500 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68  s during lock ch
11510 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  ecking..*/.stati
11520 63 20 69 6e 74 20 61 66 70 43 68 65 63 6b 52 65  c int afpCheckRe
11530 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74  servedLock(sqlit
11540 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
11550 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e   *pResOut){.  in
11560 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
11570 3b 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65 64  ;.  int reserved
11580 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65   = 0;.  unixFile
11590 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
115a0 69 6c 65 2a 29 69 64 3b 0a 20 20 0a 20 20 53 69  ile*)id;.  .  Si
115b0 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
115c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
115d0 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44  RR_CHECKRESERVED
115e0 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73  LOCK; );.  .  as
115f0 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
11600 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65   afpLockingConte
11610 78 74 20 2a 63 6f 6e 74 65 78 74 20 3d 20 28 61  xt *context = (a
11620 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
11630 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69   *) pFile->locki
11640 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 69 66 28  ngContext;.  if(
11650 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73 65 72 76   context->reserv
11660 65 64 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 4f  ed ){.    *pResO
11670 75 74 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75  ut = 1;.    retu
11680 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
11690 7d 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74  }.  unixEnterMut
116a0 65 78 28 29 3b 20 2f 2a 20 42 65 63 61 75 73 65  ex(); /* Because
116b0 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 69   pFile->pInode i
116c0 73 20 73 68 61 72 65 64 20 61 63 72 6f 73 73 20  s shared across 
116d0 74 68 72 65 61 64 73 20 2a 2f 0a 20 20 0a 20 20  threads */.  .  
116e0 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20 74 68  /* Check if a th
116f0 72 65 61 64 20 69 6e 20 74 68 69 73 20 70 72 6f  read in this pro
11700 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63 68 20  cess holds such 
11710 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20  a lock */.  if( 
11720 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65  pFile->pInode->e
11730 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f  FileLock>SHARED_
11740 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 73 65  LOCK ){.    rese
11750 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  rved = 1;.  }.  
11760 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 20  .  /* Otherwise 
11770 73 65 65 20 69 66 20 73 6f 6d 65 20 6f 74 68 65  see if some othe
11780 72 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20  r process holds 
11790 69 74 2e 0a 20 20 20 2a 2f 0a 20 20 69 66 28 20  it..   */.  if( 
117a0 21 72 65 73 65 72 76 65 64 20 29 7b 0a 20 20 20  !reserved ){.   
117b0 20 2f 2a 20 6c 6f 63 6b 20 74 68 65 20 52 45 53   /* lock the RES
117c0 45 52 56 45 44 20 62 79 74 65 20 2a 2f 0a 20 20  ERVED byte */.  
117d0 20 20 69 6e 74 20 6c 72 63 20 3d 20 61 66 70 53    int lrc = afpS
117e0 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
117f0 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 52  dbPath, pFile, R
11800 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 31 2c  ESERVED_BYTE, 1,
11810 31 29 3b 20 20 0a 20 20 20 20 69 66 28 20 53 51  1);  .    if( SQ
11820 4c 49 54 45 5f 4f 4b 3d 3d 6c 72 63 20 29 7b 0a  LITE_OK==lrc ){.
11830 20 20 20 20 20 20 2f 2a 20 69 66 20 77 65 20 73        /* if we s
11840 75 63 63 65 65 64 65 64 20 69 6e 20 74 61 6b 69  ucceeded in taki
11850 6e 67 20 74 68 65 20 72 65 73 65 72 76 65 64 20  ng the reserved 
11860 6c 6f 63 6b 2c 20 75 6e 6c 6f 63 6b 20 69 74 20  lock, unlock it 
11870 74 6f 20 72 65 73 74 6f 72 65 0a 20 20 20 20 20  to restore.     
11880 20 2a 2a 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   ** the original
11890 20 73 74 61 74 65 20 2a 2f 0a 20 20 20 20 20 20   state */.      
118a0 6c 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b  lrc = afpSetLock
118b0 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
118c0 2c 20 70 46 69 6c 65 2c 20 52 45 53 45 52 56 45  , pFile, RESERVE
118d0 44 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20  D_BYTE, 1, 0);. 
118e0 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
118f0 20 20 2f 2a 20 69 66 20 77 65 20 66 61 69 6c 65    /* if we faile
11900 64 20 74 6f 20 67 65 74 20 74 68 65 20 6c 6f 63  d to get the loc
11910 6b 20 74 68 65 6e 20 73 6f 6d 65 6f 6e 65 20 65  k then someone e
11920 6c 73 65 20 6d 75 73 74 20 68 61 76 65 20 69 74  lse must have it
11930 20 2a 2f 0a 20 20 20 20 20 20 72 65 73 65 72 76   */.      reserv
11940 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ed = 1;.    }.  
11950 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52    if( IS_LOCK_ER
11960 52 4f 52 28 6c 72 63 29 20 29 7b 0a 20 20 20 20  ROR(lrc) ){.    
11970 20 20 72 63 3d 6c 72 63 3b 0a 20 20 20 20 7d 0a    rc=lrc;.    }.
11980 20 20 7d 0a 20 20 0a 20 20 75 6e 69 78 4c 65 61    }.  .  unixLea
11990 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53 54  veMutex();.  OST
119a0 52 41 43 45 28 28 22 54 45 53 54 20 57 52 2d 4c  RACE(("TEST WR-L
119b0 4f 43 4b 20 25 64 20 25 64 20 25 64 20 28 61 66  OCK %d %d %d (af
119c0 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  p)\n", pFile->h,
119d0 20 72 63 2c 20 72 65 73 65 72 76 65 64 29 29 3b   rc, reserved));
119e0 0a 20 20 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d  .  .  *pResOut =
119f0 20 72 65 73 65 72 76 65 64 3b 0a 20 20 72 65 74   reserved;.  ret
11a00 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
11a10 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77   Lock the file w
11a20 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65  ith the lock spe
11a30 63 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65  cified by parame
11a40 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20  ter eFileLock - 
11a50 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f  one.** of the fo
11a60 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
11a70 20 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f     (1) SHARED_LO
11a80 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45  CK.**     (2) RE
11a90 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20  SERVED_LOCK.**  
11aa0 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c     (3) PENDING_L
11ab0 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45  OCK.**     (4) E
11ac0 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a  XCLUSIVE_LOCK.**
11ad0 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68  .** Sometimes wh
11ae0 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e  en requesting on
11af0 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64  e lock state, ad
11b00 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74  ditional lock st
11b10 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65  ates.** are inse
11b20 72 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e  rted in between.
11b30 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69    The locking mi
11b40 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20  ght fail on one 
11b50 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20  of the later.** 
11b60 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76  transitions leav
11b70 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61  ing the lock sta
11b80 74 65 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f  te different fro
11b90 6d 20 77 68 61 74 20 69 74 20 73 74 61 72 74 65  m what it starte
11ba0 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73  d but.** still s
11bb0 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c  hort of its goal
11bc0 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  The following
11bd0 20 63 68 61 72 74 20 73 68 6f 77 73 20 74 68 65   chart shows the
11be0 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e   allowed.** tran
11bf0 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20  sitions and the 
11c00 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65  inserted interme
11c10 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a  diate states:.**
11c20 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20  .**    UNLOCKED 
11c30 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20  -> SHARED.**    
11c40 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56  SHARED -> RESERV
11c50 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20  ED.**    SHARED 
11c60 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20  -> (PENDING) -> 
11c70 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20  EXCLUSIVE.**    
11c80 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e  RESERVED -> (PEN
11c90 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49  DING) -> EXCLUSI
11ca0 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47  VE.**    PENDING
11cb0 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
11cc0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
11cd0 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65   will only incre
11ce0 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65  ase a lock.  Use
11cf0 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e   the sqlite3OsUn
11d00 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e  lock().** routin
11d10 65 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63  e to lower a loc
11d20 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73  king level..*/.s
11d30 74 61 74 69 63 20 69 6e 74 20 61 66 70 4c 6f 63  tatic int afpLoc
11d40 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
11d50 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63  id, int eFileLoc
11d60 6b 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  k){.  int rc = S
11d70 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78  QLITE_OK;.  unix
11d80 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
11d90 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 75  nixFile*)id;.  u
11da0 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49  nixInodeInfo *pI
11db0 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49  node = pFile->pI
11dc0 6e 6f 64 65 3b 0a 20 20 61 66 70 4c 6f 63 6b 69  node;.  afpLocki
11dd0 6e 67 43 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  ngContext *conte
11de0 78 74 20 3d 20 28 61 66 70 4c 6f 63 6b 69 6e 67  xt = (afpLocking
11df0 43 6f 6e 74 65 78 74 20 2a 29 20 70 46 69 6c 65  Context *) pFile
11e00 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
11e10 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 70  ;.  .  assert( p
11e20 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43  File );.  OSTRAC
11e30 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25  E(("LOCK    %d %
11e40 73 20 77 61 73 20 25 73 28 25 73 2c 25 64 29 20  s was %s(%s,%d) 
11e50 70 69 64 3d 25 64 20 28 61 66 70 29 5c 6e 22 2c  pid=%d (afp)\n",
11e60 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20   pFile->h,.     
11e70 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b        azFileLock
11e80 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 61 7a 46  (eFileLock), azF
11e90 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2d 3e 65  ileLock(pFile->e
11ea0 46 69 6c 65 4c 6f 63 6b 29 2c 0a 20 20 20 20 20  FileLock),.     
11eb0 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b        azFileLock
11ec0 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f  (pInode->eFileLo
11ed0 63 6b 29 2c 20 70 49 6e 6f 64 65 2d 3e 6e 53 68  ck), pInode->nSh
11ee0 61 72 65 64 20 2c 20 67 65 74 70 69 64 28 29 29  ared , getpid())
11ef0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  );..  /* If ther
11f00 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 6c  e is already a l
11f10 6f 63 6b 20 6f 66 20 74 68 69 73 20 74 79 70 65  ock of this type
11f20 20 6f 72 20 6d 6f 72 65 20 72 65 73 74 72 69 63   or more restric
11f30 74 69 76 65 20 6f 6e 20 74 68 65 0a 20 20 2a 2a  tive on the.  **
11f40 20 75 6e 69 78 46 69 6c 65 2c 20 64 6f 20 6e 6f   unixFile, do no
11f50 74 68 69 6e 67 2e 20 44 6f 6e 27 74 20 75 73 65  thing. Don't use
11f60 20 74 68 65 20 61 66 70 5f 65 6e 64 5f 6c 6f 63   the afp_end_loc
11f70 6b 3a 20 65 78 69 74 20 70 61 74 68 2c 20 61 73  k: exit path, as
11f80 0a 20 20 2a 2a 20 75 6e 69 78 45 6e 74 65 72 4d  .  ** unixEnterM
11f90 75 74 65 78 28 29 20 68 61 73 6e 27 74 20 62 65  utex() hasn't be
11fa0 65 6e 20 63 61 6c 6c 65 64 20 79 65 74 2e 0a 20  en called yet.. 
11fb0 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
11fc0 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 65 46 69 6c  >eFileLock>=eFil
11fd0 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 4f 53 54  eLock ){.    OST
11fe0 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25  RACE(("LOCK    %
11ff0 64 20 25 73 20 6f 6b 20 28 61 6c 72 65 61 64 79  d %s ok (already
12000 20 68 65 6c 64 29 20 28 61 66 70 29 5c 6e 22 2c   held) (afp)\n",
12010 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20   pFile->h,.     
12020 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b        azFileLock
12030 28 65 46 69 6c 65 4c 6f 63 6b 29 29 29 3b 0a 20  (eFileLock)));. 
12040 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
12050 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d  _OK;.  }..  /* M
12060 61 6b 65 20 73 75 72 65 20 74 68 65 20 6c 6f 63  ake sure the loc
12070 6b 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73  king sequence is
12080 20 63 6f 72 72 65 63 74 0a 20 20 2a 2a 20 20 28   correct.  **  (
12090 31 29 20 57 65 20 6e 65 76 65 72 20 6d 6f 76 65  1) We never move
120a0 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64 20 74   from unlocked t
120b0 6f 20 61 6e 79 74 68 69 6e 67 20 68 69 67 68 65  o anything highe
120c0 72 20 74 68 61 6e 20 73 68 61 72 65 64 20 6c 6f  r than shared lo
120d0 63 6b 2e 0a 20 20 2a 2a 20 20 28 32 29 20 53 51  ck..  **  (2) SQ
120e0 4c 69 74 65 20 6e 65 76 65 72 20 65 78 70 6c 69  Lite never expli
120f0 63 69 74 6c 79 20 72 65 71 75 65 73 74 73 20 61  citly requests a
12100 20 70 65 6e 64 69 67 20 6c 6f 63 6b 2e 0a 20 20   pendig lock..  
12110 2a 2a 20 20 28 33 29 20 41 20 73 68 61 72 65 64  **  (3) A shared
12120 20 6c 6f 63 6b 20 69 73 20 61 6c 77 61 79 73 20   lock is always 
12130 68 65 6c 64 20 77 68 65 6e 20 61 20 72 65 73 65  held when a rese
12140 72 76 65 20 6c 6f 63 6b 20 69 73 20 72 65 71 75  rve lock is requ
12150 65 73 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73  ested..  */.  as
12160 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 65 46 69  sert( pFile->eFi
12170 6c 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20  leLock!=NO_LOCK 
12180 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  || eFileLock==SH
12190 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61  ARED_LOCK );.  a
121a0 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b  ssert( eFileLock
121b0 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29  !=PENDING_LOCK )
121c0 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c  ;.  assert( eFil
121d0 65 4c 6f 63 6b 21 3d 52 45 53 45 52 56 45 44 5f  eLock!=RESERVED_
121e0 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 65  LOCK || pFile->e
121f0 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
12200 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a  _LOCK );.  .  /*
12210 20 54 68 69 73 20 6d 75 74 65 78 20 69 73 20 6e   This mutex is n
12220 65 65 64 65 64 20 62 65 63 61 75 73 65 20 70 46  eeded because pF
12230 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73  ile->pInode is s
12240 68 61 72 65 64 20 61 63 72 6f 73 73 20 74 68 72  hared across thr
12250 65 61 64 73 0a 20 20 2a 2f 0a 20 20 75 6e 69 78  eads.  */.  unix
12260 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
12270 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e  pInode = pFile->
12280 70 49 6e 6f 64 65 3b 0a 0a 20 20 2f 2a 20 49 66  pInode;..  /* If
12290 20 73 6f 6d 65 20 74 68 72 65 61 64 20 75 73 69   some thread usi
122a0 6e 67 20 74 68 69 73 20 50 49 44 20 68 61 73 20  ng this PID has 
122b0 61 20 6c 6f 63 6b 20 76 69 61 20 61 20 64 69 66  a lock via a dif
122c0 66 65 72 65 6e 74 20 75 6e 69 78 46 69 6c 65 2a  ferent unixFile*
122d0 0a 20 20 2a 2a 20 68 61 6e 64 6c 65 20 74 68 61  .  ** handle tha
122e0 74 20 70 72 65 63 6c 75 64 65 73 20 74 68 65 20  t precludes the 
122f0 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 2c 20  requested lock, 
12300 72 65 74 75 72 6e 20 42 55 53 59 2e 0a 20 20 2a  return BUSY..  *
12310 2f 0a 20 20 69 66 28 20 28 70 46 69 6c 65 2d 3e  /.  if( (pFile->
12320 65 46 69 6c 65 4c 6f 63 6b 21 3d 70 49 6e 6f 64  eFileLock!=pInod
12330 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 26 26 20  e->eFileLock && 
12340 0a 20 20 20 20 20 20 20 28 70 49 6e 6f 64 65 2d  .       (pInode-
12350 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 50 45 4e 44  >eFileLock>=PEND
12360 49 4e 47 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c  ING_LOCK || eFil
12370 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43  eLock>SHARED_LOC
12380 4b 29 29 0a 20 20 20 20 20 29 7b 0a 20 20 20 20  K)).     ){.    
12390 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
123a0 3b 0a 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65  ;.    goto afp_e
123b0 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 0a  nd_lock;.  }.  .
123c0 20 20 2f 2a 20 49 66 20 61 20 53 48 41 52 45 44    /* If a SHARED
123d0 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74   lock is request
123e0 65 64 2c 20 61 6e 64 20 73 6f 6d 65 20 74 68 72  ed, and some thr
123f0 65 61 64 20 75 73 69 6e 67 20 74 68 69 73 20 50  ead using this P
12400 49 44 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20  ID already.  ** 
12410 68 61 73 20 61 20 53 48 41 52 45 44 20 6f 72 20  has a SHARED or 
12420 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 74  RESERVED lock, t
12430 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 72 65  hen increment re
12440 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 73 20 61  ference counts a
12450 6e 64 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 53  nd.  ** return S
12460 51 4c 49 54 45 5f 4f 4b 2e 0a 20 20 2a 2f 0a 20  QLITE_OK..  */. 
12470 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d   if( eFileLock==
12480 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20 0a  SHARED_LOCK && .
12490 20 20 20 20 20 28 70 49 6e 6f 64 65 2d 3e 65 46       (pInode->eF
124a0 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
124b0 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e  LOCK || pInode->
124c0 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52  eFileLock==RESER
124d0 56 45 44 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20  VED_LOCK) ){.   
124e0 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f   assert( eFileLo
124f0 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
12500 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
12510 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  File->eFileLock=
12520 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
12530 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  ( pInode->nShare
12540 64 3e 30 20 29 3b 0a 20 20 20 20 70 46 69 6c 65  d>0 );.    pFile
12550 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48  ->eFileLock = SH
12560 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70  ARED_LOCK;.    p
12570 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2b 2b  Inode->nShared++
12580 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c  ;.    pInode->nL
12590 6f 63 6b 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20  ock++;.    goto 
125a0 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20  afp_end_lock;.  
125b0 7d 0a 20 20 20 20 0a 20 20 2f 2a 20 41 20 50 45  }.    .  /* A PE
125c0 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 6e 65  NDING lock is ne
125d0 65 64 65 64 20 62 65 66 6f 72 65 20 61 63 71 75  eded before acqu
125e0 69 72 69 6e 67 20 61 20 53 48 41 52 45 44 20 6c  iring a SHARED l
125f0 6f 63 6b 20 61 6e 64 20 62 65 66 6f 72 65 0a 20  ock and before. 
12600 20 2a 2a 20 61 63 71 75 69 72 69 6e 67 20 61 6e   ** acquiring an
12610 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
12620 20 20 46 6f 72 20 74 68 65 20 53 48 41 52 45 44    For the SHARED
12630 20 6c 6f 63 6b 2c 20 74 68 65 20 50 45 4e 44 49   lock, the PENDI
12640 4e 47 20 77 69 6c 6c 0a 20 20 2a 2a 20 62 65 20  NG will.  ** be 
12650 72 65 6c 65 61 73 65 64 2e 0a 20 20 2a 2f 0a 20  released..  */. 
12660 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d   if( eFileLock==
12670 53 48 41 52 45 44 5f 4c 4f 43 4b 20 0a 20 20 20  SHARED_LOCK .   
12680 20 20 20 7c 7c 20 28 65 46 69 6c 65 4c 6f 63 6b     || (eFileLock
12690 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
126a0 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65   && pFile->eFile
126b0 4c 6f 63 6b 3c 50 45 4e 44 49 4e 47 5f 4c 4f 43  Lock<PENDING_LOC
126c0 4b 29 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74 20  K).  ){.    int 
126d0 66 61 69 6c 65 64 3b 0a 20 20 20 20 66 61 69 6c  failed;.    fail
126e0 65 64 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28  ed = afpSetLock(
126f0 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c  context->dbPath,
12700 20 70 46 69 6c 65 2c 20 50 45 4e 44 49 4e 47 5f   pFile, PENDING_
12710 42 59 54 45 2c 20 31 2c 20 31 29 3b 0a 20 20 20  BYTE, 1, 1);.   
12720 20 69 66 20 28 66 61 69 6c 65 64 29 20 7b 0a 20   if (failed) {. 
12730 20 20 20 20 20 72 63 20 3d 20 66 61 69 6c 65 64       rc = failed
12740 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70  ;.      goto afp
12750 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d  _end_lock;.    }
12760 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 49 66 20  .  }.  .  /* If 
12770 63 6f 6e 74 72 6f 6c 20 67 65 74 73 20 74 6f 20  control gets to 
12780 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e  this point, then
12790 20 61 63 74 75 61 6c 6c 79 20 67 6f 20 61 68 65   actually go ahe
127a0 61 64 20 61 6e 64 20 6d 61 6b 65 0a 20 20 2a 2a  ad and make.  **
127b0 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
127c0 6d 20 63 61 6c 6c 73 20 66 6f 72 20 74 68 65 20  m calls for the 
127d0 73 70 65 63 69 66 69 65 64 20 6c 6f 63 6b 2e 0a  specified lock..
127e0 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65    */.  if( eFile
127f0 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
12800 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 6c 72 63  K ){.    int lrc
12810 31 2c 20 6c 72 63 32 2c 20 6c 72 63 31 45 72 72  1, lrc2, lrc1Err
12820 6e 6f 3b 0a 20 20 20 20 6c 6f 6e 67 20 6c 6b 2c  no;.    long lk,
12830 20 6d 61 73 6b 3b 0a 20 20 20 20 0a 20 20 20 20   mask;.    .    
12840 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e  assert( pInode->
12850 6e 53 68 61 72 65 64 3d 3d 30 20 29 3b 0a 20 20  nShared==0 );.  
12860 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65    assert( pInode
12870 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29  ->eFileLock==0 )
12880 3b 0a 20 20 20 20 20 20 20 20 0a 20 20 20 20 6d  ;.        .    m
12890 61 73 6b 20 3d 20 28 73 69 7a 65 6f 66 28 6c 6f  ask = (sizeof(lo
128a0 6e 67 29 3d 3d 38 29 20 3f 20 4c 41 52 47 45 53  ng)==8) ? LARGES
128b0 54 5f 49 4e 54 36 34 20 3a 20 30 78 37 66 66 66  T_INT64 : 0x7fff
128c0 66 66 66 66 3b 0a 20 20 20 20 2f 2a 20 4e 6f 77  ffff;.    /* Now
128d0 20 67 65 74 20 74 68 65 20 72 65 61 64 2d 6c 6f   get the read-lo
128e0 63 6b 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 2a  ck SHARED_LOCK *
128f0 2f 0a 20 20 20 20 2f 2a 20 6e 6f 74 65 20 74 68  /.    /* note th
12900 61 74 20 74 68 65 20 71 75 61 6c 69 74 79 20 6f  at the quality o
12910 66 20 74 68 65 20 72 61 6e 64 6f 6d 6e 65 73 73  f the randomness
12920 20 64 6f 65 73 6e 27 74 20 6d 61 74 74 65 72 20   doesn't matter 
12930 74 68 61 74 20 6d 75 63 68 20 2a 2f 0a 20 20 20  that much */.   
12940 20 6c 6b 20 3d 20 72 61 6e 64 6f 6d 28 29 3b 20   lk = random(); 
12950 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 73 68 61  .    pInode->sha
12960 72 65 64 42 79 74 65 20 3d 20 28 6c 6b 20 26 20  redByte = (lk & 
12970 6d 61 73 6b 29 25 28 53 48 41 52 45 44 5f 53 49  mask)%(SHARED_SI
12980 5a 45 20 2d 20 31 29 3b 0a 20 20 20 20 6c 72 63  ZE - 1);.    lrc
12990 31 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63  1 = afpSetLock(c
129a0 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20  ontext->dbPath, 
129b0 70 46 69 6c 65 2c 20 0a 20 20 20 20 20 20 20 20  pFile, .        
129c0 20 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b 70    SHARED_FIRST+p
129d0 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79 74  Inode->sharedByt
129e0 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 69 66  e, 1, 1);.    if
129f0 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  ( IS_LOCK_ERROR(
12a00 6c 72 63 31 29 20 29 7b 0a 20 20 20 20 20 20 6c  lrc1) ){.      l
12a10 72 63 31 45 72 72 6e 6f 20 3d 20 70 46 69 6c 65  rc1Errno = pFile
12a20 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20  ->lastErrno;.   
12a30 20 7d 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 74   }.    /* Drop t
12a40 68 65 20 74 65 6d 70 6f 72 61 72 79 20 50 45 4e  he temporary PEN
12a50 44 49 4e 47 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20  DING lock */.   
12a60 20 6c 72 63 32 20 3d 20 61 66 70 53 65 74 4c 6f   lrc2 = afpSetLo
12a70 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61  ck(context->dbPa
12a80 74 68 2c 20 70 46 69 6c 65 2c 20 50 45 4e 44 49  th, pFile, PENDI
12a90 4e 47 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b 0a  NG_BYTE, 1, 0);.
12aa0 20 20 20 20 0a 20 20 20 20 69 66 28 20 49 53 5f      .    if( IS_
12ab0 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 31 29  LOCK_ERROR(lrc1)
12ac0 20 29 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65   ) {.      pFile
12ad0 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 72  ->lastErrno = lr
12ae0 63 31 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72  c1Errno;.      r
12af0 63 20 3d 20 6c 72 63 31 3b 0a 20 20 20 20 20 20  c = lrc1;.      
12b00 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63  goto afp_end_loc
12b10 6b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66  k;.    } else if
12b20 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  ( IS_LOCK_ERROR(
12b30 6c 72 63 32 29 20 29 7b 0a 20 20 20 20 20 20 72  lrc2) ){.      r
12b40 63 20 3d 20 6c 72 63 32 3b 0a 20 20 20 20 20 20  c = lrc2;.      
12b50 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63  goto afp_end_loc
12b60 6b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66  k;.    } else if
12b70 28 20 6c 72 63 31 20 21 3d 20 53 51 4c 49 54 45  ( lrc1 != SQLITE
12b80 5f 4f 4b 20 29 20 7b 0a 20 20 20 20 20 20 72 63  _OK ) {.      rc
12b90 20 3d 20 6c 72 63 31 3b 0a 20 20 20 20 7d 20 65   = lrc1;.    } e
12ba0 6c 73 65 20 7b 0a 20 20 20 20 20 20 70 46 69 6c  lse {.      pFil
12bb0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53  e->eFileLock = S
12bc0 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20  HARED_LOCK;.    
12bd0 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b    pInode->nLock+
12be0 2b 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d  +;.      pInode-
12bf0 3e 6e 53 68 61 72 65 64 20 3d 20 31 3b 0a 20 20  >nShared = 1;.  
12c00 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
12c10 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55  eFileLock==EXCLU
12c20 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70 49 6e  SIVE_LOCK && pIn
12c30 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 31 20 29  ode->nShared>1 )
12c40 7b 0a 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20  {.    /* We are 
12c50 74 72 79 69 6e 67 20 66 6f 72 20 61 6e 20 65 78  trying for an ex
12c60 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 62 75 74  clusive lock but
12c70 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64 20   another thread 
12c80 69 6e 20 74 68 69 73 0a 20 20 20 20 20 2a 2a 20  in this.     ** 
12c90 73 61 6d 65 20 70 72 6f 63 65 73 73 20 69 73 20  same process is 
12ca0 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 20  still holding a 
12cb0 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a  shared lock. */.
12cc0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
12cd0 42 55 53 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  BUSY;.  }else{. 
12ce0 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73     /* The reques
12cf0 74 20 77 61 73 20 66 6f 72 20 61 20 52 45 53 45  t was for a RESE
12d00 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56  RVED or EXCLUSIV
12d10 45 20 6c 6f 63 6b 2e 20 20 49 74 20 69 73 0a 20  E lock.  It is. 
12d20 20 20 20 2a 2a 20 61 73 73 75 6d 65 64 20 74 68     ** assumed th
12d30 61 74 20 74 68 65 72 65 20 69 73 20 61 20 53 48  at there is a SH
12d40 41 52 45 44 20 6f 72 20 67 72 65 61 74 65 72 20  ARED or greater 
12d50 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65  lock on the file
12d60 0a 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79 2e  .    ** already.
12d70 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20  .    */.    int 
12d80 66 61 69 6c 65 64 20 3d 20 30 3b 0a 20 20 20 20  failed = 0;.    
12d90 61 73 73 65 72 74 28 20 30 21 3d 70 46 69 6c 65  assert( 0!=pFile
12da0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a 20  ->eFileLock );. 
12db0 20 20 20 69 66 20 28 65 46 69 6c 65 4c 6f 63 6b     if (eFileLock
12dc0 20 3e 3d 20 52 45 53 45 52 56 45 44 5f 4c 4f 43   >= RESERVED_LOC
12dd0 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c  K && pFile->eFil
12de0 65 4c 6f 63 6b 20 3c 20 52 45 53 45 52 56 45 44  eLock < RESERVED
12df0 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 20 20 20  _LOCK) {.       
12e00 20 2f 2a 20 41 63 71 75 69 72 65 20 61 20 52 45   /* Acquire a RE
12e10 53 45 52 56 45 44 20 6c 6f 63 6b 20 2a 2f 0a 20  SERVED lock */. 
12e20 20 20 20 20 20 20 20 66 61 69 6c 65 64 20 3d 20         failed = 
12e30 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  afpSetLock(conte
12e40 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  xt->dbPath, pFil
12e50 65 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45  e, RESERVED_BYTE
12e60 2c 20 31 2c 31 29 3b 0a 20 20 20 20 20 20 69 66  , 1,1);.      if
12e70 28 20 21 66 61 69 6c 65 64 20 29 7b 0a 20 20 20  ( !failed ){.   
12e80 20 20 20 20 20 63 6f 6e 74 65 78 74 2d 3e 72 65       context->re
12e90 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 20 20  served = 1;.    
12ea0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
12eb0 20 28 21 66 61 69 6c 65 64 20 26 26 20 65 46 69   (!failed && eFi
12ec0 6c 65 4c 6f 63 6b 20 3d 3d 20 45 58 43 4c 55 53  leLock == EXCLUS
12ed0 49 56 45 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20  IVE_LOCK) {.    
12ee0 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61 6e 20    /* Acquire an 
12ef0 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 2a  EXCLUSIVE lock *
12f00 2f 0a 20 20 20 20 20 20 20 20 0a 20 20 20 20 20  /.        .     
12f10 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 73   /* Remove the s
12f20 68 61 72 65 64 20 6c 6f 63 6b 20 62 65 66 6f 72  hared lock befor
12f30 65 20 74 72 79 69 6e 67 20 74 68 65 20 72 61 6e  e trying the ran
12f40 67 65 2e 20 20 77 65 27 6c 6c 20 6e 65 65 64 20  ge.  we'll need 
12f50 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 72 65 65  to .      ** ree
12f60 73 74 61 62 6c 69 73 68 20 74 68 65 20 73 68 61  stablish the sha
12f70 72 65 64 20 6c 6f 63 6b 20 69 66 20 77 65 20 63  red lock if we c
12f80 61 6e 27 74 20 67 65 74 20 74 68 65 20 20 61 66  an't get the  af
12f90 70 55 6e 6c 6f 63 6b 0a 20 20 20 20 20 20 2a 2f  pUnlock.      */
12fa0 0a 20 20 20 20 20 20 69 66 28 20 21 28 66 61 69  .      if( !(fai
12fb0 6c 65 64 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b  led = afpSetLock
12fc0 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
12fd0 2c 20 70 46 69 6c 65 2c 20 53 48 41 52 45 44 5f  , pFile, SHARED_
12fe0 46 49 52 53 54 20 2b 0a 20 20 20 20 20 20 20 20  FIRST +.        
12ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13000 20 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42   pInode->sharedB
13010 79 74 65 2c 20 31 2c 20 30 29 29 20 29 7b 0a 20  yte, 1, 0)) ){. 
13020 20 20 20 20 20 20 20 69 6e 74 20 66 61 69 6c 65         int faile
13030 64 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  d2 = SQLITE_OK;.
13040 20 20 20 20 20 20 20 20 2f 2a 20 6e 6f 77 20 61          /* now a
13050 74 74 65 6d 6d 70 74 20 74 6f 20 67 65 74 20 74  ttemmpt to get t
13060 68 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  he exclusive loc
13070 6b 20 72 61 6e 67 65 20 2a 2f 0a 20 20 20 20 20  k range */.     
13080 20 20 20 66 61 69 6c 65 64 20 3d 20 61 66 70 53     failed = afpS
13090 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
130a0 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 53  dbPath, pFile, S
130b0 48 41 52 45 44 5f 46 49 52 53 54 2c 20 0a 20 20  HARED_FIRST, .  
130c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
130d0 20 20 20 20 20 20 20 20 20 20 20 20 20 53 48 41               SHA
130e0 52 45 44 5f 53 49 5a 45 2c 20 31 29 3b 0a 20 20  RED_SIZE, 1);.  
130f0 20 20 20 20 20 20 69 66 28 20 66 61 69 6c 65 64        if( failed
13100 20 26 26 20 28 66 61 69 6c 65 64 32 20 3d 20 61   && (failed2 = a
13110 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78  fpSetLock(contex
13120 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65  t->dbPath, pFile
13130 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
13140 20 20 20 20 20 20 20 20 20 20 53 48 41 52 45 44            SHARED
13150 5f 46 49 52 53 54 20 2b 20 70 49 6e 6f 64 65 2d  _FIRST + pInode-
13160 3e 73 68 61 72 65 64 42 79 74 65 2c 20 31 2c 20  >sharedByte, 1, 
13170 31 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  1)) ){.         
13180 20 2f 2a 20 43 61 6e 27 74 20 72 65 65 73 74 61   /* Can't reesta
13190 62 6c 69 73 68 20 74 68 65 20 73 68 61 72 65 64  blish the shared
131a0 20 6c 6f 63 6b 2e 20 20 53 71 6c 69 74 65 20 63   lock.  Sqlite c
131b0 61 6e 27 74 20 64 65 61 6c 2c 20 74 68 69 73 20  an't deal, this 
131c0 69 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  is.          ** 
131d0 61 20 63 72 69 74 69 63 61 6c 20 49 2f 4f 20 65  a critical I/O e
131e0 72 72 6f 72 0a 20 20 20 20 20 20 20 20 20 20 2a  rror.          *
131f0 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  /.          rc =
13200 20 28 28 66 61 69 6c 65 64 20 26 20 53 51 4c 49   ((failed & SQLI
13210 54 45 5f 49 4f 45 52 52 29 20 3d 3d 20 53 51 4c  TE_IOERR) == SQL
13220 49 54 45 5f 49 4f 45 52 52 29 20 3f 20 66 61 69  ITE_IOERR) ? fai
13230 6c 65 64 32 20 3a 20 0a 20 20 20 20 20 20 20 20  led2 : .        
13240 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f         SQLITE_IO
13250 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20  ERR_LOCK;.      
13260 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64      goto afp_end
13270 5f 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d  _lock;.        }
13280 20 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20   .      }else{. 
13290 20 20 20 20 20 20 20 72 63 20 3d 20 66 61 69 6c         rc = fail
132a0 65 64 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20  ed; .      }.   
132b0 20 7d 0a 20 20 20 20 69 66 28 20 66 61 69 6c 65   }.    if( faile
132c0 64 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  d ){.      rc = 
132d0 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20  failed;.    }.  
132e0 7d 0a 20 20 0a 20 20 69 66 28 20 72 63 3d 3d 53  }.  .  if( rc==S
132f0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
13300 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
13310 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20   = eFileLock;.  
13320 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c    pInode->eFileL
13330 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b  ock = eFileLock;
13340 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 46 69  .  }else if( eFi
13350 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  leLock==EXCLUSIV
13360 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46  E_LOCK ){.    pF
13370 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
13380 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20   PENDING_LOCK;. 
13390 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65     pInode->eFile
133a0 4c 6f 63 6b 20 3d 20 50 45 4e 44 49 4e 47 5f 4c  Lock = PENDING_L
133b0 4f 43 4b 3b 0a 20 20 7d 0a 20 20 0a 61 66 70 5f  OCK;.  }.  .afp_
133c0 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 75 6e 69 78  end_lock:.  unix
133d0 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
133e0 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20  OSTRACE(("LOCK  
133f0 20 20 25 64 20 25 73 20 25 73 20 28 61 66 70 29    %d %s %s (afp)
13400 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 61  \n", pFile->h, a
13410 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c  zFileLock(eFileL
13420 6f 63 6b 29 2c 20 0a 20 20 20 20 20 20 20 20 20  ock), .         
13430 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20  rc==SQLITE_OK ? 
13440 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29  "ok" : "failed")
13450 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
13460 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74  }../*.** Lower t
13470 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
13480 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70   on file descrip
13490 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69  tor pFile to eFi
134a0 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f  leLock.  eFileLo
134b0 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69  ck.** must be ei
134c0 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20  ther NO_LOCK or 
134d0 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a  SHARED_LOCK..**.
134e0 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e  ** If the lockin
134f0 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66  g level of the f
13500 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
13510 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20  s already at or 
13520 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71  below.** the req
13530 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c  uested locking l
13540 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69  evel, this routi
13550 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
13560 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66 70  /.static int afp
13570 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  Unlock(sqlite3_f
13580 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69  ile *id, int eFi
13590 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 69 6e 74 20  leLock) {.  int 
135a0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
135b0 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
135c0 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
135d0 64 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e  d;.  unixInodeIn
135e0 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a 20 20 61 66  fo *pInode;.  af
135f0 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  pLockingContext 
13600 2a 63 6f 6e 74 65 78 74 20 3d 20 28 61 66 70 4c  *context = (afpL
13610 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29  ockingContext *)
13620 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43   pFile->lockingC
13630 6f 6e 74 65 78 74 3b 0a 20 20 69 6e 74 20 73 6b  ontext;.  int sk
13640 69 70 53 68 61 72 65 64 20 3d 20 30 3b 0a 23 69  ipShared = 0;.#i
13650 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
13660 0a 20 20 69 6e 74 20 68 20 3d 20 70 46 69 6c 65  .  int h = pFile
13670 2d 3e 68 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61  ->h;.#endif..  a
13680 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
13690 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c 4f    OSTRACE(("UNLO
136a0 43 4b 20 20 25 64 20 25 64 20 77 61 73 20 25 64  CK  %d %d was %d
136b0 28 25 64 2c 25 64 29 20 70 69 64 3d 25 64 20 28  (%d,%d) pid=%d (
136c0 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  afp)\n", pFile->
136d0 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20  h, eFileLock,.  
136e0 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e           pFile->
136f0 65 46 69 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c 65  eFileLock, pFile
13700 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c  ->pInode->eFileL
13710 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  ock, pFile->pIno
13720 64 65 2d 3e 6e 53 68 61 72 65 64 2c 0a 20 20 20  de->nShared,.   
13730 20 20 20 20 20 20 20 20 67 65 74 70 69 64 28 29          getpid()
13740 29 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 65  ));..  assert( e
13750 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44  FileLock<=SHARED
13760 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70  _LOCK );.  if( p
13770 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c  File->eFileLock<
13780 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20  =eFileLock ){.  
13790 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
137a0 4f 4b 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 45 6e  OK;.  }.  unixEn
137b0 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 70 49  terMutex();.  pI
137c0 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49  node = pFile->pI
137d0 6e 6f 64 65 3b 0a 20 20 61 73 73 65 72 74 28 20  node;.  assert( 
137e0 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 21  pInode->nShared!
137f0 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c  =0 );.  if( pFil
13800 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41  e->eFileLock>SHA
13810 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RED_LOCK ){.    
13820 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e  assert( pInode->
13830 65 46 69 6c 65 4c 6f 63 6b 3d 3d 70 46 69 6c 65  eFileLock==pFile
13840 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a 20  ->eFileLock );. 
13850 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
13860 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20  orBenign(1);.   
13870 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
13880 28 20 68 3d 28 2d 31 29 20 29 0a 20 20 20 20 53  ( h=(-1) ).    S
13890 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65  imulateIOErrorBe
138a0 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 0a 23 69  nign(0);.    .#i
138b0 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20  fndef NDEBUG.   
138c0 20 2f 2a 20 57 68 65 6e 20 72 65 64 75 63 69 6e   /* When reducin
138d0 67 20 61 20 6c 6f 63 6b 20 73 75 63 68 20 74 68  g a lock such th
138e0 61 74 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  at other process
138f0 65 73 20 63 61 6e 20 73 74 61 72 74 0a 20 20 20  es can start.   
13900 20 2a 2a 20 72 65 61 64 69 6e 67 20 74 68 65 20   ** reading the 
13910 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 67  database file ag
13920 61 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74  ain, make sure t
13930 68 61 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 74  hat the.    ** t
13940 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74  ransaction count
13950 65 72 20 77 61 73 20 75 70 64 61 74 65 64 20 69  er was updated i
13960 66 20 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68  f any part of th
13970 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a  e database.    *
13980 2a 20 66 69 6c 65 20 63 68 61 6e 67 65 64 2e 20  * file changed. 
13990 20 49 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   If the transact
139a0 69 6f 6e 20 63 6f 75 6e 74 65 72 20 69 73 20 6e  ion counter is n
139b0 6f 74 20 75 70 64 61 74 65 64 2c 0a 20 20 20 20  ot updated,.    
139c0 2a 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74  ** other connect
139d0 69 6f 6e 73 20 74 6f 20 74 68 65 20 73 61 6d 65  ions to the same
139e0 20 66 69 6c 65 20 6d 69 67 68 74 20 6e 6f 74 20   file might not 
139f0 72 65 61 6c 69 7a 65 20 74 68 61 74 0a 20 20 20  realize that.   
13a00 20 2a 2a 20 74 68 65 20 66 69 6c 65 20 68 61 73   ** the file has
13a10 20 63 68 61 6e 67 65 64 20 61 6e 64 20 68 65 6e   changed and hen
13a20 63 65 20 6d 69 67 68 74 20 6e 6f 74 20 6b 6e 6f  ce might not kno
13a30 77 20 74 6f 20 66 6c 75 73 68 20 74 68 65 69 72  w to flush their
13a40 0a 20 20 20 20 2a 2a 20 63 61 63 68 65 2e 20 20  .    ** cache.  
13a50 54 68 65 20 75 73 65 20 6f 66 20 61 20 73 74 61  The use of a sta
13a60 6c 65 20 63 61 63 68 65 20 63 61 6e 20 6c 65 61  le cache can lea
13a70 64 20 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f  d to database co
13a80 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f  rruption..    */
13a90 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69  .    assert( pFi
13aa0 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74  le->inNormalWrit
13ab0 65 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  e==0.           
13ac0 7c 7c 20 70 46 69 6c 65 2d 3e 64 62 55 70 64 61  || pFile->dbUpda
13ad0 74 65 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20  te==0.          
13ae0 20 7c 7c 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73   || pFile->trans
13af0 43 6e 74 72 43 68 6e 67 3d 3d 31 20 29 3b 0a 20  CntrChng==1 );. 
13b00 20 20 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d     pFile->inNorm
13b10 61 6c 57 72 69 74 65 20 3d 20 30 3b 0a 23 65 6e  alWrite = 0;.#en
13b20 64 69 66 0a 20 20 20 20 0a 20 20 20 20 69 66 28  dif.    .    if(
13b30 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
13b40 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
13b50 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
13b60 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  afpSetLock(conte
13b70 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  xt->dbPath, pFil
13b80 65 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c  e, SHARED_FIRST,
13b90 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 29   SHARED_SIZE, 0)
13ba0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
13bb0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 65 46  SQLITE_OK && (eF
13bc0 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
13bd0 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e  LOCK || pInode->
13be0 6e 53 68 61 72 65 64 3e 31 29 20 29 7b 0a 20 20  nShared>1) ){.  
13bf0 20 20 20 20 20 20 2f 2a 20 6f 6e 6c 79 20 72 65        /* only re
13c00 2d 65 73 74 61 62 6c 69 73 68 20 74 68 65 20 73  -establish the s
13c10 68 61 72 65 64 20 6c 6f 63 6b 20 69 66 20 6e 65  hared lock if ne
13c20 63 65 73 73 61 72 79 20 2a 2f 0a 20 20 20 20 20  cessary */.     
13c30 20 20 20 69 6e 74 20 73 68 61 72 65 64 4c 6f 63     int sharedLoc
13c40 6b 42 79 74 65 20 3d 20 53 48 41 52 45 44 5f 46  kByte = SHARED_F
13c50 49 52 53 54 2b 70 49 6e 6f 64 65 2d 3e 73 68 61  IRST+pInode->sha
13c60 72 65 64 42 79 74 65 3b 0a 20 20 20 20 20 20 20  redByte;.       
13c70 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b   rc = afpSetLock
13c80 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
13c90 2c 20 70 46 69 6c 65 2c 20 73 68 61 72 65 64 4c  , pFile, sharedL
13ca0 6f 63 6b 42 79 74 65 2c 20 31 2c 20 31 29 3b 0a  ockByte, 1, 1);.
13cb0 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20        } else {. 
13cc0 20 20 20 20 20 20 20 73 6b 69 70 53 68 61 72 65         skipShare
13cd0 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  d = 1;.      }. 
13ce0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
13cf0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 46  =SQLITE_OK && pF
13d00 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d  ile->eFileLock>=
13d10 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 7b 0a  PENDING_LOCK ){.
13d20 20 20 20 20 20 20 72 63 20 3d 20 61 66 70 53 65        rc = afpSe
13d30 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64  tLock(context->d
13d40 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 50 45  bPath, pFile, PE
13d50 4e 44 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20 30  NDING_BYTE, 1, 0
13d60 29 3b 0a 20 20 20 20 7d 20 0a 20 20 20 20 69 66  );.    } .    if
13d70 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
13d80 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  && pFile->eFileL
13d90 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ock>=RESERVED_LO
13da0 43 4b 20 26 26 20 63 6f 6e 74 65 78 74 2d 3e 72  CK && context->r
13db0 65 73 65 72 76 65 64 20 29 7b 0a 20 20 20 20 20  eserved ){.     
13dc0 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b   rc = afpSetLock
13dd0 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
13de0 2c 20 70 46 69 6c 65 2c 20 52 45 53 45 52 56 45  , pFile, RESERVE
13df0 44 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20  D_BYTE, 1, 0);. 
13e00 20 20 20 20 20 69 66 28 20 21 72 63 20 29 7b 20       if( !rc ){ 
13e10 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 65 78 74  .        context
13e20 2d 3e 72 65 73 65 72 76 65 64 20 3d 20 30 3b 20  ->reserved = 0; 
13e30 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
13e40 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
13e50 45 5f 4f 4b 20 26 26 20 28 65 46 69 6c 65 4c 6f  E_OK && (eFileLo
13e60 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
13e70 7c 7c 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72  || pInode->nShar
13e80 65 64 3e 31 29 29 7b 0a 20 20 20 20 20 20 70 49  ed>1)){.      pI
13e90 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  node->eFileLock 
13ea0 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20  = SHARED_LOCK;. 
13eb0 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72     }.  }.  if( r
13ec0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
13ed0 65 46 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f  eFileLock==NO_LO
13ee0 43 4b 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 44 65  CK ){..    /* De
13ef0 63 72 65 6d 65 6e 74 20 74 68 65 20 73 68 61 72  crement the shar
13f00 65 64 20 6c 6f 63 6b 20 63 6f 75 6e 74 65 72 2e  ed lock counter.
13f10 20 20 52 65 6c 65 61 73 65 20 74 68 65 20 6c 6f    Release the lo
13f20 63 6b 20 75 73 69 6e 67 20 61 6e 0a 20 20 20 20  ck using an.    
13f30 2a 2a 20 4f 53 20 63 61 6c 6c 20 6f 6e 6c 79 20  ** OS call only 
13f40 77 68 65 6e 20 61 6c 6c 20 74 68 72 65 61 64 73  when all threads
13f50 20 69 6e 20 74 68 69 73 20 73 61 6d 65 20 70 72   in this same pr
13f60 6f 63 65 73 73 20 68 61 76 65 20 72 65 6c 65 61  ocess have relea
13f70 73 65 64 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c  sed.    ** the l
13f80 6f 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ock..    */.    
13f90 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f  unsigned long lo
13fa0 6e 67 20 73 68 61 72 65 64 4c 6f 63 6b 42 79 74  ng sharedLockByt
13fb0 65 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54  e = SHARED_FIRST
13fc0 2b 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42  +pInode->sharedB
13fd0 79 74 65 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d  yte;.    pInode-
13fe0 3e 6e 53 68 61 72 65 64 2d 2d 3b 0a 20 20 20 20  >nShared--;.    
13ff0 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61  if( pInode->nSha
14000 72 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  red==0 ){.      
14010 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42  SimulateIOErrorB
14020 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20  enign(1);.      
14030 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
14040 20 68 3d 28 2d 31 29 20 29 0a 20 20 20 20 20 20   h=(-1) ).      
14050 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42  SimulateIOErrorB
14060 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20  enign(0);.      
14070 69 66 28 20 21 73 6b 69 70 53 68 61 72 65 64 20  if( !skipShared 
14080 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
14090 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  afpSetLock(conte
140a0 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  xt->dbPath, pFil
140b0 65 2c 20 73 68 61 72 65 64 4c 6f 63 6b 42 79 74  e, sharedLockByt
140c0 65 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  e, 1, 0);.      
140d0 7d 0a 20 20 20 20 20 20 69 66 28 20 21 72 63 20  }.      if( !rc 
140e0 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 6f 64  ){.        pInod
140f0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e  e->eFileLock = N
14100 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20  O_LOCK;.        
14110 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
14120 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20   = NO_LOCK;.    
14130 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
14140 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
14150 29 7b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d  ){.      pInode-
14160 3e 6e 4c 6f 63 6b 2d 2d 3b 0a 20 20 20 20 20 20  >nLock--;.      
14170 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e  assert( pInode->
14180 6e 4c 6f 63 6b 3e 3d 30 20 29 3b 0a 20 20 20 20  nLock>=0 );.    
14190 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c    if( pInode->nL
141a0 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ock==0 ){.      
141b0 20 20 72 63 20 3d 20 63 6c 6f 73 65 50 65 6e 64    rc = closePend
141c0 69 6e 67 46 64 73 28 70 46 69 6c 65 29 3b 0a 20  ingFds(pFile);. 
141d0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
141e0 0a 20 20 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d  .  .  unixLeaveM
141f0 75 74 65 78 28 29 3b 0a 20 20 69 66 28 20 72 63  utex();.  if( rc
14200 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70 46  ==SQLITE_OK ) pF
14210 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
14220 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 72 65   eFileLock;.  re
14230 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
14240 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 20 26  * Close a file &
14250 20 63 6c 65 61 6e 75 70 20 41 46 50 20 73 70 65   cleanup AFP spe
14260 63 69 66 69 63 20 6c 6f 63 6b 69 6e 67 20 63 6f  cific locking co
14270 6e 74 65 78 74 20 0a 2a 2f 0a 73 74 61 74 69 63  ntext .*/.static
14280 20 69 6e 74 20 61 66 70 43 6c 6f 73 65 28 73 71   int afpClose(sq
14290 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20  lite3_file *id) 
142a0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
142b0 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 69 64  ITE_OK;.  if( id
142c0 20 29 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65   ){.    unixFile
142d0 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
142e0 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20 61 66 70  ile*)id;.    afp
142f0 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f  Unlock(id, NO_LO
14300 43 4b 29 3b 0a 20 20 20 20 75 6e 69 78 45 6e 74  CK);.    unixEnt
14310 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 69  erMutex();.    i
14320 66 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  f( pFile->pInode
14330 20 26 26 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64   && pFile->pInod
14340 65 2d 3e 6e 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  e->nLock ){.    
14350 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72    /* If there ar
14360 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f  e outstanding lo
14370 63 6b 73 2c 20 64 6f 20 6e 6f 74 20 61 63 74 75  cks, do not actu
14380 61 6c 6c 79 20 63 6c 6f 73 65 20 74 68 65 20 66  ally close the f
14390 69 6c 65 20 6a 75 73 74 0a 20 20 20 20 20 20 2a  ile just.      *
143a0 2a 20 79 65 74 20 62 65 63 61 75 73 65 20 74 68  * yet because th
143b0 61 74 20 77 6f 75 6c 64 20 63 6c 65 61 72 20 74  at would clear t
143c0 68 6f 73 65 20 6c 6f 63 6b 73 2e 20 20 49 6e 73  hose locks.  Ins
143d0 74 65 61 64 2c 20 61 64 64 20 74 68 65 20 66 69  tead, add the fi
143e0 6c 65 0a 20 20 20 20 20 20 2a 2a 20 64 65 73 63  le.      ** desc
143f0 72 69 70 74 6f 72 20 74 6f 20 70 49 6e 6f 64 65  riptor to pInode
14400 2d 3e 61 50 65 6e 64 69 6e 67 2e 20 20 49 74 20  ->aPending.  It 
14410 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74 69  will be automati
14420 63 61 6c 6c 79 20 63 6c 6f 73 65 64 20 77 68 65  cally closed whe
14430 6e 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6c  n.      ** the l
14440 61 73 74 20 6c 6f 63 6b 20 69 73 20 63 6c 65 61  ast lock is clea
14450 72 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  red..      */.  
14460 20 20 20 20 73 65 74 50 65 6e 64 69 6e 67 46 64      setPendingFd
14470 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20  (pFile);.    }. 
14480 20 20 20 72 65 6c 65 61 73 65 49 6e 6f 64 65 49     releaseInodeI
14490 6e 66 6f 28 70 46 69 6c 65 29 3b 0a 20 20 20 20  nfo(pFile);.    
144a0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 46 69  sqlite3_free(pFi
144b0 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
144c0 78 74 29 3b 0a 20 20 20 20 72 63 20 3d 20 63 6c  xt);.    rc = cl
144d0 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b  oseUnixFile(id);
144e0 0a 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75  .    unixLeaveMu
144f0 74 65 78 28 29 3b 0a 20 20 7d 0a 20 20 72 65 74  tex();.  }.  ret
14500 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6e 64 69  urn rc;.}..#endi
14510 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41  f /* defined(__A
14520 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
14530 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
14540 5f 53 54 59 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a 20  _STYLE */./*.** 
14550 54 68 65 20 63 6f 64 65 20 61 62 6f 76 65 20 69  The code above i
14560 73 20 74 68 65 20 41 46 50 20 6c 6f 63 6b 20 69  s the AFP lock i
14570 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 20  mplementation.  
14580 54 68 65 20 63 6f 64 65 20 69 73 20 73 70 65 63  The code is spec
14590 69 66 69 63 0a 2a 2a 20 74 6f 20 4d 61 63 4f 53  ific.** to MacOS
145a0 58 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 77  X and does not w
145b0 6f 72 6b 20 6f 6e 20 6f 74 68 65 72 20 75 6e 69  ork on other uni
145c0 78 20 70 6c 61 74 66 6f 72 6d 73 2e 20 20 4e 6f  x platforms.  No
145d0 20 61 6c 74 65 72 6e 61 74 69 76 65 0a 2a 2a 20   alternative.** 
145e0 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 20 20 49  is available.  I
145f0 66 20 79 6f 75 20 64 6f 6e 27 74 20 63 6f 6d 70  f you don't comp
14600 69 6c 65 20 66 6f 72 20 61 20 6d 61 63 2c 20 74  ile for a mac, t
14610 68 65 6e 20 74 68 65 20 22 75 6e 69 78 2d 61 66  hen the "unix-af
14620 70 22 0a 2a 2a 20 56 46 53 20 69 73 20 6e 6f 74  p".** VFS is not
14630 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a   available..**.*
14640 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14650 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20  **** End of the 
14660 41 46 50 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65  AFP lock impleme
14670 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a  ntation ********
14680 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 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 2a 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 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
146e0 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
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 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14710 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14720 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
14730 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14740 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69  *********** Begi
14750 6e 20 4e 46 53 20 4c 6f 63 6b 69 6e 67 20 2a 2a  n NFS Locking **
14760 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14770 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
14780 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  .#if defined(__A
14790 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
147a0 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
147b0 5f 53 54 59 4c 45 0a 2f 2a 0a 20 2a 2a 20 4c 6f  _STYLE./*. ** Lo
147c0 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  wer the locking 
147d0 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65  level on file de
147e0 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74  scriptor pFile t
147f0 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46  o eFileLock.  eF
14800 69 6c 65 4c 6f 63 6b 0a 20 2a 2a 20 6d 75 73 74  ileLock. ** must
14810 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f   be either NO_LO
14820 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43  CK or SHARED_LOC
14830 4b 2e 0a 20 2a 2a 0a 20 2a 2a 20 49 66 20 74 68  K.. **. ** If th
14840 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
14850 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  of the file desc
14860 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64  riptor is alread
14870 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 20 2a  y at or below. *
14880 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  * the requested 
14890 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74  locking level, t
148a0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
148b0 20 6e 6f 2d 6f 70 2e 0a 20 2a 2f 0a 73 74 61 74   no-op.. */.stat
148c0 69 63 20 69 6e 74 20 6e 66 73 55 6e 6c 6f 63 6b  ic int nfsUnlock
148d0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
148e0 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b  d, int eFileLock
148f0 29 7b 0a 20 20 72 65 74 75 72 6e 20 5f 70 6f 73  ){.  return _pos
14900 69 78 55 6e 6c 6f 63 6b 28 69 64 2c 20 65 46 69  ixUnlock(id, eFi
14910 6c 65 4c 6f 63 6b 2c 20 31 29 3b 0a 7d 0a 0a 23  leLock, 1);.}..#
14920 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64  endif /* defined
14930 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53  (__APPLE__) && S
14940 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
14950 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 2f 2a  KING_STYLE */./*
14960 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 61 62 6f  .** The code abo
14970 76 65 20 69 73 20 74 68 65 20 4e 46 53 20 6c 6f  ve is the NFS lo
14980 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ck implementatio
14990 6e 2e 20 20 54 68 65 20 63 6f 64 65 20 69 73 20  n.  The code is 
149a0 73 70 65 63 69 66 69 63 0a 2a 2a 20 74 6f 20 4d  specific.** to M
149b0 61 63 4f 53 58 20 61 6e 64 20 64 6f 65 73 20 6e  acOSX and does n
149c0 6f 74 20 77 6f 72 6b 20 6f 6e 20 6f 74 68 65 72  ot work on other
149d0 20 75 6e 69 78 20 70 6c 61 74 66 6f 72 6d 73 2e   unix platforms.
149e0 20 20 4e 6f 20 61 6c 74 65 72 6e 61 74 69 76 65    No alternative
149f0 0a 2a 2a 20 69 73 20 61 76 61 69 6c 61 62 6c 65  .** is available
14a00 2e 20 20 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .  .**.*********
14a10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64  ************ End
14a20 20 6f 66 20 74 68 65 20 4e 46 53 20 6c 6f 63 6b   of the NFS lock
14a30 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
14a40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14a50 2a 2a 2a 2a 2a 2a 0a 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 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14a90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14aa0 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  *****/../*******
14ab0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14ac0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14ad0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14ae0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14af0 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
14b00 2a 2a 2a 2a 2a 2a 2a 2a 20 4e 6f 6e 2d 6c 6f 63  ******** Non-loc
14b10 6b 69 6e 67 20 73 71 6c 69 74 65 33 5f 66 69 6c  king sqlite3_fil
14b20 65 20 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a  e methods ******
14b30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14b40 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68  *******.**.** Th
14b50 65 20 6e 65 78 74 20 64 69 76 69 73 69 6f 6e 20  e next division 
14b60 63 6f 6e 74 61 69 6e 73 20 69 6d 70 6c 65 6d 65  contains impleme
14b70 6e 74 61 74 69 6f 6e 73 20 66 6f 72 20 61 6c 6c  ntations for all
14b80 20 6d 65 74 68 6f 64 73 20 6f 66 20 74 68 65 20   methods of the 
14b90 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  .** sqlite3_file
14ba0 20 6f 62 6a 65 63 74 20 6f 74 68 65 72 20 74 68   object other th
14bb0 61 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6d  an the locking m
14bc0 65 74 68 6f 64 73 2e 20 20 54 68 65 20 6c 6f 63  ethods.  The loc
14bd0 6b 69 6e 67 0a 2a 2a 20 6d 65 74 68 6f 64 73 20  king.** methods 
14be0 77 65 72 65 20 64 65 66 69 6e 65 64 20 69 6e 20  were defined in 
14bf0 64 69 76 69 73 69 6f 6e 73 20 61 62 6f 76 65 20  divisions above 
14c00 28 6f 6e 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74  (one locking met
14c10 68 6f 64 20 70 65 72 0a 2a 2a 20 64 69 76 69 73  hod per.** divis
14c20 69 6f 6e 29 2e 20 20 54 68 6f 73 65 20 6d 65 74  ion).  Those met
14c30 68 6f 64 73 20 74 68 61 74 20 61 72 65 20 63 6f  hods that are co
14c40 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6c 6f 63 6b  mmon to all lock
14c50 69 6e 67 20 6d 6f 64 65 73 0a 2a 2a 20 61 72 65  ing modes.** are
14c60 20 67 61 74 68 65 72 20 74 6f 67 65 74 68 65 72   gather together
14c70 20 69 6e 74 6f 20 74 68 69 73 20 64 69 76 69 73   into this divis
14c80 69 6f 6e 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53  ion..*/../*.** S
14c90 65 65 6b 20 74 6f 20 74 68 65 20 6f 66 66 73 65  eek to the offse
14ca0 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  t passed as the 
14cb0 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c  second argument,
14cc0 20 74 68 65 6e 20 72 65 61 64 20 63 6e 74 20 0a   then read cnt .
14cd0 2a 2a 20 62 79 74 65 73 20 69 6e 74 6f 20 70 42  ** bytes into pB
14ce0 75 66 2e 20 52 65 74 75 72 6e 20 74 68 65 20 6e  uf. Return the n
14cf0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61  umber of bytes a
14d00 63 74 75 61 6c 6c 79 20 72 65 61 64 2e 0a 2a 2a  ctually read..**
14d10 0a 2a 2a 20 4e 42 3a 20 20 49 66 20 79 6f 75 20  .** NB:  If you 
14d20 64 65 66 69 6e 65 20 55 53 45 5f 50 52 45 41 44  define USE_PREAD
14d30 20 6f 72 20 55 53 45 5f 50 52 45 41 44 36 34 2c   or USE_PREAD64,
14d40 20 74 68 65 6e 20 69 74 20 6d 69 67 68 74 20 61   then it might a
14d50 6c 73 6f 0a 2a 2a 20 62 65 20 6e 65 63 65 73 73  lso.** be necess
14d60 61 72 79 20 74 6f 20 64 65 66 69 6e 65 20 5f 58  ary to define _X
14d70 4f 50 45 4e 5f 53 4f 55 52 43 45 20 74 6f 20 62  OPEN_SOURCE to b
14d80 65 20 35 30 30 2e 20 20 54 68 69 73 20 76 61 72  e 500.  This var
14d90 69 65 73 20 66 72 6f 6d 0a 2a 2a 20 6f 6e 65 20  ies from.** one 
14da0 73 79 73 74 65 6d 20 74 6f 20 61 6e 6f 74 68 65  system to anothe
14db0 72 2e 20 20 53 69 6e 63 65 20 53 51 4c 69 74 65  r.  Since SQLite
14dc0 20 64 6f 65 73 20 6e 6f 74 20 64 65 66 69 6e 65   does not define
14dd0 20 55 53 45 5f 50 52 45 41 44 0a 2a 2a 20 61 6e   USE_PREAD.** an
14de0 79 20 61 6e 79 20 66 6f 72 6d 20 62 79 20 64 65  y any form by de
14df0 66 61 75 6c 74 2c 20 77 65 20 77 69 6c 6c 20 6e  fault, we will n
14e00 6f 74 20 61 74 74 65 6d 70 74 20 74 6f 20 64 65  ot attempt to de
14e10 66 69 6e 65 20 5f 58 4f 50 45 4e 5f 53 4f 55 52  fine _XOPEN_SOUR
14e20 43 45 2e 0a 2a 2a 20 53 65 65 20 74 69 63 6b 65  CE..** See ticke
14e30 74 73 20 23 32 37 34 31 20 61 6e 64 20 23 32 36  ts #2741 and #26
14e40 38 31 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 76 6f  81..**.** To avo
14e50 69 64 20 73 74 6f 6d 70 69 6e 67 20 74 68 65 20  id stomping the 
14e60 65 72 72 6e 6f 20 76 61 6c 75 65 20 6f 6e 20 61  errno value on a
14e70 20 66 61 69 6c 65 64 20 72 65 61 64 20 74 68 65   failed read the
14e80 20 6c 61 73 74 45 72 72 6e 6f 20 76 61 6c 75 65   lastErrno value
14e90 0a 2a 2a 20 69 73 20 73 65 74 20 62 65 66 6f 72  .** is set befor
14ea0 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a  e returning..*/.
14eb0 73 74 61 74 69 63 20 69 6e 74 20 73 65 65 6b 41  static int seekA
14ec0 6e 64 52 65 61 64 28 75 6e 69 78 46 69 6c 65 20  ndRead(unixFile 
14ed0 2a 69 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74  *id, sqlite3_int
14ee0 36 34 20 6f 66 66 73 65 74 2c 20 76 6f 69 64 20  64 offset, void 
14ef0 2a 70 42 75 66 2c 20 69 6e 74 20 63 6e 74 29 7b  *pBuf, int cnt){
14f00 0a 20 20 69 6e 74 20 67 6f 74 3b 0a 23 69 66 20  .  int got;.#if 
14f10 28 21 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52  (!defined(USE_PR
14f20 45 41 44 29 20 26 26 20 21 64 65 66 69 6e 65 64  EAD) && !defined
14f30 28 55 53 45 5f 50 52 45 41 44 36 34 29 29 0a 20  (USE_PREAD64)). 
14f40 20 69 36 34 20 6e 65 77 4f 66 66 73 65 74 3b 0a   i64 newOffset;.
14f50 23 65 6e 64 69 66 0a 20 20 54 49 4d 45 52 5f 53  #endif.  TIMER_S
14f60 54 41 52 54 3b 0a 23 69 66 20 64 65 66 69 6e 65  TART;.#if define
14f70 64 28 55 53 45 5f 50 52 45 41 44 29 0a 20 20 67  d(USE_PREAD).  g
14f80 6f 74 20 3d 20 70 72 65 61 64 28 69 64 2d 3e 68  ot = pread(id->h
14f90 2c 20 70 42 75 66 2c 20 63 6e 74 2c 20 6f 66 66  , pBuf, cnt, off
14fa0 73 65 74 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65  set);.  Simulate
14fb0 49 4f 45 72 72 6f 72 28 20 67 6f 74 20 3d 20 2d  IOError( got = -
14fc0 31 20 29 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e  1 );.#elif defin
14fd0 65 64 28 55 53 45 5f 50 52 45 41 44 36 34 29 0a  ed(USE_PREAD64).
14fe0 20 20 67 6f 74 20 3d 20 70 72 65 61 64 36 34 28    got = pread64(
14ff0 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74  id->h, pBuf, cnt
15000 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 53 69 6d  , offset);.  Sim
15010 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 67 6f  ulateIOError( go
15020 74 20 3d 20 2d 31 20 29 3b 0a 23 65 6c 73 65 0a  t = -1 );.#else.
15030 20 20 6e 65 77 4f 66 66 73 65 74 20 3d 20 6c 73    newOffset = ls
15040 65 65 6b 28 69 64 2d 3e 68 2c 20 6f 66 66 73 65  eek(id->h, offse
15050 74 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20 20  t, SEEK_SET);.  
15060 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
15070 20 6e 65 77 4f 66 66 73 65 74 2d 2d 20 29 3b 0a   newOffset-- );.
15080 20 20 69 66 28 20 6e 65 77 4f 66 66 73 65 74 21    if( newOffset!
15090 3d 6f 66 66 73 65 74 20 29 7b 0a 20 20 20 20 69  =offset ){.    i
150a0 66 28 20 6e 65 77 4f 66 66 73 65 74 20 3d 3d 20  f( newOffset == 
150b0 2d 31 20 29 7b 0a 20 20 20 20 20 20 28 28 75 6e  -1 ){.      ((un
150c0 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73  ixFile*)id)->las
150d0 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
150e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
150f0 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29   ((unixFile*)id)
15100 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b  ->lastErrno = 0;
15110 09 09 09 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  ....    }.    re
15120 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20 20 67  turn -1;.  }.  g
15130 6f 74 20 3d 20 72 65 61 64 28 69 64 2d 3e 68 2c  ot = read(id->h,
15140 20 70 42 75 66 2c 20 63 6e 74 29 3b 0a 23 65 6e   pBuf, cnt);.#en
15150 64 69 66 0a 20 20 54 49 4d 45 52 5f 45 4e 44 3b  dif.  TIMER_END;
15160 0a 20 20 69 66 28 20 67 6f 74 3c 30 20 29 7b 0a  .  if( got<0 ){.
15170 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29      ((unixFile*)
15180 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  id)->lastErrno =
15190 20 65 72 72 6e 6f 3b 0a 20 20 7d 0a 20 20 4f 53   errno;.  }.  OS
151a0 54 52 41 43 45 28 28 22 52 45 41 44 20 20 20 20  TRACE(("READ    
151b0 25 2d 33 64 20 25 35 64 20 25 37 6c 6c 64 20 25  %-3d %5d %7lld %
151c0 6c 6c 75 5c 6e 22 2c 20 69 64 2d 3e 68 2c 20 67  llu\n", id->h, g
151d0 6f 74 2c 20 6f 66 66 73 65 74 2c 20 54 49 4d 45  ot, offset, TIME
151e0 52 5f 45 4c 41 50 53 45 44 29 29 3b 0a 20 20 72  R_ELAPSED));.  r
151f0 65 74 75 72 6e 20 67 6f 74 3b 0a 7d 0a 0a 2f 2a  eturn got;.}../*
15200 0a 2a 2a 20 52 65 61 64 20 64 61 74 61 20 66 72  .** Read data fr
15210 6f 6d 20 61 20 66 69 6c 65 20 69 6e 74 6f 20 61  om a file into a
15220 20 62 75 66 66 65 72 2e 20 20 52 65 74 75 72 6e   buffer.  Return
15230 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 61 6c   SQLITE_OK if al
15240 6c 0a 2a 2a 20 62 79 74 65 73 20 77 65 72 65 20  l.** bytes were 
15250 72 65 61 64 20 73 75 63 63 65 73 73 66 75 6c 6c  read successfull
15260 79 20 61 6e 64 20 53 51 4c 49 54 45 5f 49 4f 45  y and SQLITE_IOE
15270 52 52 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67  RR if anything g
15280 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 0a 2a 2f  oes.** wrong..*/
15290 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
152a0 52 65 61 64 28 0a 20 20 73 71 6c 69 74 65 33 5f  Read(.  sqlite3_
152b0 66 69 6c 65 20 2a 69 64 2c 20 0a 20 20 76 6f 69  file *id, .  voi
152c0 64 20 2a 70 42 75 66 2c 20 0a 20 20 69 6e 74 20  d *pBuf, .  int 
152d0 61 6d 74 2c 0a 20 20 73 71 6c 69 74 65 33 5f 69  amt,.  sqlite3_i
152e0 6e 74 36 34 20 6f 66 66 73 65 74 0a 29 7b 0a 20  nt64 offset.){. 
152f0 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
15300 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 69   = (unixFile *)i
15310 64 3b 0a 20 20 69 6e 74 20 67 6f 74 3b 0a 20 20  d;.  int got;.  
15320 61 73 73 65 72 74 28 20 69 64 20 29 3b 0a 0a 20  assert( id );.. 
15330 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
15340 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28   database file (
15350 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 2c 20 6d  not a journal, m
15360 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6f 72  aster-journal or
15370 20 74 65 6d 70 0a 20 20 2a 2a 20 66 69 6c 65 29   temp.  ** file)
15380 2c 20 74 68 65 20 62 79 74 65 73 20 69 6e 20 74  , the bytes in t
15390 68 65 20 6c 6f 63 6b 69 6e 67 20 72 61 6e 67 65  he locking range
153a0 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 62 65   should never be
153b0 20 72 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e   read or written
153c0 2e 20 2a 2f 0a 23 69 66 20 30 0a 20 20 61 73 73  . */.#if 0.  ass
153d0 65 72 74 28 20 70 46 69 6c 65 2d 3e 70 55 6e 75  ert( pFile->pUnu
153e0 73 65 64 3d 3d 30 0a 20 20 20 20 20 20 20 7c 7c  sed==0.       ||
153f0 20 6f 66 66 73 65 74 3e 3d 50 45 4e 44 49 4e 47   offset>=PENDING
15400 5f 42 59 54 45 2b 35 31 32 0a 20 20 20 20 20 20  _BYTE+512.      
15410 20 7c 7c 20 6f 66 66 73 65 74 2b 61 6d 74 3c 3d   || offset+amt<=
15420 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 0a 20 20  PENDING_BYTE .  
15430 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 67 6f 74  );.#endif..  got
15440 20 3d 20 73 65 65 6b 41 6e 64 52 65 61 64 28 70   = seekAndRead(p
15450 46 69 6c 65 2c 20 6f 66 66 73 65 74 2c 20 70 42  File, offset, pB
15460 75 66 2c 20 61 6d 74 29 3b 0a 20 20 69 66 28 20  uf, amt);.  if( 
15470 67 6f 74 3d 3d 61 6d 74 20 29 7b 0a 20 20 20 20  got==amt ){.    
15480 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
15490 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 67 6f  ;.  }else if( go
154a0 74 3c 30 20 29 7b 0a 20 20 20 20 2f 2a 20 6c 61  t<0 ){.    /* la
154b0 73 74 45 72 72 6e 6f 20 73 65 74 20 62 79 20 73  stErrno set by s
154c0 65 65 6b 41 6e 64 52 65 61 64 20 2a 2f 0a 20 20  eekAndRead */.  
154d0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
154e0 49 4f 45 52 52 5f 52 45 41 44 3b 0a 20 20 7d 65  IOERR_READ;.  }e
154f0 6c 73 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  lse{.    pFile->
15500 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b 20 2f  lastErrno = 0; /
15510 2a 20 6e 6f 74 20 61 20 73 79 73 74 65 6d 20 65  * not a system e
15520 72 72 6f 72 20 2a 2f 0a 20 20 20 20 2f 2a 20 55  rror */.    /* U
15530 6e 72 65 61 64 20 70 61 72 74 73 20 6f 66 20 74  nread parts of t
15540 68 65 20 62 75 66 66 65 72 20 6d 75 73 74 20 62  he buffer must b
15550 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 2a 2f  e zero-filled */
15560 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 28 28 63  .    memset(&((c
15570 68 61 72 2a 29 70 42 75 66 29 5b 67 6f 74 5d 2c  har*)pBuf)[got],
15580 20 30 2c 20 61 6d 74 2d 67 6f 74 29 3b 0a 20 20   0, amt-got);.  
15590 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
155a0 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44  IOERR_SHORT_READ
155b0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  ;.  }.}../*.** S
155c0 65 65 6b 20 74 6f 20 74 68 65 20 6f 66 66 73 65  eek to the offse
155d0 74 20 69 6e 20 69 64 2d 3e 6f 66 66 73 65 74 20  t in id->offset 
155e0 74 68 65 6e 20 72 65 61 64 20 63 6e 74 20 62 79  then read cnt by
155f0 74 65 73 20 69 6e 74 6f 20 70 42 75 66 2e 0a 2a  tes into pBuf..*
15600 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
15610 62 65 72 20 6f 66 20 62 79 74 65 73 20 61 63 74  ber of bytes act
15620 75 61 6c 6c 79 20 72 65 61 64 2e 20 20 55 70 64  ually read.  Upd
15630 61 74 65 20 74 68 65 20 6f 66 66 73 65 74 2e 0a  ate the offset..
15640 2a 2a 0a 2a 2a 20 54 6f 20 61 76 6f 69 64 20 73  **.** To avoid s
15650 74 6f 6d 70 69 6e 67 20 74 68 65 20 65 72 72 6e  tomping the errn
15660 6f 20 76 61 6c 75 65 20 6f 6e 20 61 20 66 61 69  o value on a fai
15670 6c 65 64 20 77 72 69 74 65 20 74 68 65 20 6c 61  led write the la
15680 73 74 45 72 72 6e 6f 20 76 61 6c 75 65 0a 2a 2a  stErrno value.**
15690 20 69 73 20 73 65 74 20 62 65 66 6f 72 65 20 72   is set before r
156a0 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61  eturning..*/.sta
156b0 74 69 63 20 69 6e 74 20 73 65 65 6b 41 6e 64 57  tic int seekAndW
156c0 72 69 74 65 28 75 6e 69 78 46 69 6c 65 20 2a 69  rite(unixFile *i
156d0 64 2c 20 69 36 34 20 6f 66 66 73 65 74 2c 20 63  d, i64 offset, c
156e0 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 75 66 2c  onst void *pBuf,
156f0 20 69 6e 74 20 63 6e 74 29 7b 0a 20 20 69 6e 74   int cnt){.  int
15700 20 67 6f 74 3b 0a 23 69 66 20 28 21 64 65 66 69   got;.#if (!defi
15710 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29 20 26  ned(USE_PREAD) &
15720 26 20 21 64 65 66 69 6e 65 64 28 55 53 45 5f 50  & !defined(USE_P
15730 52 45 41 44 36 34 29 29 0a 20 20 69 36 34 20 6e  READ64)).  i64 n
15740 65 77 4f 66 66 73 65 74 3b 0a 23 65 6e 64 69 66  ewOffset;.#endif
15750 0a 20 20 54 49 4d 45 52 5f 53 54 41 52 54 3b 0a  .  TIMER_START;.
15760 23 69 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f  #if defined(USE_
15770 50 52 45 41 44 29 0a 20 20 67 6f 74 20 3d 20 70  PREAD).  got = p
15780 77 72 69 74 65 28 69 64 2d 3e 68 2c 20 70 42 75  write(id->h, pBu
15790 66 2c 20 63 6e 74 2c 20 6f 66 66 73 65 74 29 3b  f, cnt, offset);
157a0 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 55  .#elif defined(U
157b0 53 45 5f 50 52 45 41 44 36 34 29 0a 20 20 67 6f  SE_PREAD64).  go
157c0 74 20 3d 20 70 77 72 69 74 65 36 34 28 69 64 2d  t = pwrite64(id-
157d0 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 2c 20 6f  >h, pBuf, cnt, o
157e0 66 66 73 65 74 29 3b 0a 23 65 6c 73 65 0a 20 20  ffset);.#else.  
157f0 6e 65 77 4f 66 66 73 65 74 20 3d 20 6c 73 65 65  newOffset = lsee
15800 6b 28 69 64 2d 3e 68 2c 20 6f 66 66 73 65 74 2c  k(id->h, offset,
15810 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20 20 69 66   SEEK_SET);.  if
15820 28 20 6e 65 77 4f 66 66 73 65 74 21 3d 6f 66 66  ( newOffset!=off
15830 73 65 74 20 29 7b 0a 20 20 20 20 69 66 28 20 6e  set ){.    if( n
15840 65 77 4f 66 66 73 65 74 20 3d 3d 20 2d 31 20 29  ewOffset == -1 )
15850 7b 0a 20 20 20 20 20 20 28 28 75 6e 69 78 46 69  {.      ((unixFi
15860 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72 72  le*)id)->lastErr
15870 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
15880 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 28 28 75  }else{.      ((u
15890 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61  nixFile*)id)->la
158a0 73 74 45 72 72 6e 6f 20 3d 20 30 3b 09 09 09 0a  stErrno = 0;....
158b0 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
158c0 20 2d 31 3b 0a 20 20 7d 0a 20 20 67 6f 74 20 3d   -1;.  }.  got =
158d0 20 77 72 69 74 65 28 69 64 2d 3e 68 2c 20 70 42   write(id->h, pB
158e0 75 66 2c 20 63 6e 74 29 3b 0a 23 65 6e 64 69 66  uf, cnt);.#endif
158f0 0a 20 20 54 49 4d 45 52 5f 45 4e 44 3b 0a 20 20  .  TIMER_END;.  
15900 69 66 28 20 67 6f 74 3c 30 20 29 7b 0a 20 20 20  if( got<0 ){.   
15910 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29   ((unixFile*)id)
15920 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72  ->lastErrno = er
15930 72 6e 6f 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54 52  rno;.  }..  OSTR
15940 41 43 45 28 28 22 57 52 49 54 45 20 20 20 25 2d  ACE(("WRITE   %-
15950 33 64 20 25 35 64 20 25 37 6c 6c 64 20 25 6c 6c  3d %5d %7lld %ll
15960 75 5c 6e 22 2c 20 69 64 2d 3e 68 2c 20 67 6f 74  u\n", id->h, got
15970 2c 20 6f 66 66 73 65 74 2c 20 54 49 4d 45 52 5f  , offset, TIMER_
15980 45 4c 41 50 53 45 44 29 29 3b 0a 20 20 72 65 74  ELAPSED));.  ret
15990 75 72 6e 20 67 6f 74 3b 0a 7d 0a 0a 0a 2f 2a 0a  urn got;.}.../*.
159a0 2a 2a 20 57 72 69 74 65 20 64 61 74 61 20 66 72  ** Write data fr
159b0 6f 6d 20 61 20 62 75 66 66 65 72 20 69 6e 74 6f  om a buffer into
159c0 20 61 20 66 69 6c 65 2e 20 20 52 65 74 75 72 6e   a file.  Return
159d0 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
159e0 63 63 65 73 73 0a 2a 2a 20 6f 72 20 73 6f 6d 65  ccess.** or some
159f0 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64   other error cod
15a00 65 20 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a 2f  e on failure..*/
15a10 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
15a20 57 72 69 74 65 28 0a 20 20 73 71 6c 69 74 65 33  Write(.  sqlite3
15a30 5f 66 69 6c 65 20 2a 69 64 2c 20 0a 20 20 63 6f  _file *id, .  co
15a40 6e 73 74 20 76 6f 69 64 20 2a 70 42 75 66 2c 20  nst void *pBuf, 
15a50 0a 20 20 69 6e 74 20 61 6d 74 2c 0a 20 20 73 71  .  int amt,.  sq
15a60 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66 73  lite3_int64 offs
15a70 65 74 20 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c  et .){.  unixFil
15a80 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
15a90 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20  File*)id;.  int 
15aa0 77 72 6f 74 65 20 3d 20 30 3b 0a 20 20 61 73 73  wrote = 0;.  ass
15ab0 65 72 74 28 20 69 64 20 29 3b 0a 20 20 61 73 73  ert( id );.  ass
15ac0 65 72 74 28 20 61 6d 74 3e 30 20 29 3b 0a 0a 20  ert( amt>0 );.. 
15ad0 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
15ae0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28   database file (
15af0 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 2c 20 6d  not a journal, m
15b00 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6f 72  aster-journal or
15b10 20 74 65 6d 70 0a 20 20 2a 2a 20 66 69 6c 65 29   temp.  ** file)
15b20 2c 20 74 68 65 20 62 79 74 65 73 20 69 6e 20 74  , the bytes in t
15b30 68 65 20 6c 6f 63 6b 69 6e 67 20 72 61 6e 67 65  he locking range
15b40 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 62 65   should never be
15b50 20 72 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e   read or written
15b60 2e 20 2a 2f 0a 23 69 66 20 30 0a 20 20 61 73 73  . */.#if 0.  ass
15b70 65 72 74 28 20 70 46 69 6c 65 2d 3e 70 55 6e 75  ert( pFile->pUnu
15b80 73 65 64 3d 3d 30 0a 20 20 20 20 20 20 20 7c 7c  sed==0.       ||
15b90 20 6f 66 66 73 65 74 3e 3d 50 45 4e 44 49 4e 47   offset>=PENDING
15ba0 5f 42 59 54 45 2b 35 31 32 0a 20 20 20 20 20 20  _BYTE+512.      
15bb0 20 7c 7c 20 6f 66 66 73 65 74 2b 61 6d 74 3c 3d   || offset+amt<=
15bc0 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 0a 20 20  PENDING_BYTE .  
15bd0 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  );.#endif..#ifnd
15be0 65 66 20 4e 44 45 42 55 47 0a 20 20 2f 2a 20 49  ef NDEBUG.  /* I
15bf0 66 20 77 65 20 61 72 65 20 64 6f 69 6e 67 20 61  f we are doing a
15c00 20 6e 6f 72 6d 61 6c 20 77 72 69 74 65 20 74 6f   normal write to
15c10 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65   a database file
15c20 20 28 61 73 20 6f 70 70 6f 73 65 64 20 74 6f 0a   (as opposed to.
15c30 20 20 2a 2a 20 64 6f 69 6e 67 20 61 20 68 6f 74    ** doing a hot
15c40 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63  -journal rollbac
15c50 6b 20 6f 72 20 61 20 77 72 69 74 65 20 74 6f 20  k or a write to 
15c60 73 6f 6d 65 20 66 69 6c 65 20 6f 74 68 65 72 20  some file other 
15c70 74 68 61 6e 20 61 0a 20 20 2a 2a 20 6e 6f 72 6d  than a.  ** norm
15c80 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  al database file
15c90 29 20 74 68 65 6e 20 72 65 63 6f 72 64 20 74 68  ) then record th
15ca0 65 20 66 61 63 74 20 74 68 61 74 20 74 68 65 20  e fact that the 
15cb0 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 68 61  database.  ** ha
15cc0 73 20 63 68 61 6e 67 65 64 2e 20 20 49 66 20 74  s changed.  If t
15cd0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  he transaction c
15ce0 6f 75 6e 74 65 72 20 69 73 20 6d 6f 64 69 66 69  ounter is modifi
15cf0 65 64 2c 20 72 65 63 6f 72 64 20 74 68 61 74 0a  ed, record that.
15d00 20 20 2a 2a 20 66 61 63 74 20 74 6f 6f 2e 0a 20    ** fact too.. 
15d10 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
15d20 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 29  >inNormalWrite )
15d30 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 64 62 55  {.    pFile->dbU
15d40 70 64 61 74 65 20 3d 20 31 3b 20 20 2f 2a 20 54  pdate = 1;  /* T
15d50 68 65 20 64 61 74 61 62 61 73 65 20 68 61 73 20  he database has 
15d60 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 2a 2f  been modified */
15d70 0a 20 20 20 20 69 66 28 20 6f 66 66 73 65 74 3c  .    if( offset<
15d80 3d 32 34 20 26 26 20 6f 66 66 73 65 74 2b 61 6d  =24 && offset+am
15d90 74 3e 3d 32 37 20 29 7b 0a 20 20 20 20 20 20 69  t>=27 ){.      i
15da0 6e 74 20 72 63 3b 0a 20 20 20 20 20 20 63 68 61  nt rc;.      cha
15db0 72 20 6f 6c 64 43 6e 74 72 5b 34 5d 3b 0a 20 20  r oldCntr[4];.  
15dc0 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72      SimulateIOEr
15dd0 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20  rorBenign(1);.  
15de0 20 20 20 20 72 63 20 3d 20 73 65 65 6b 41 6e 64      rc = seekAnd
15df0 52 65 61 64 28 70 46 69 6c 65 2c 20 32 34 2c 20  Read(pFile, 24, 
15e00 6f 6c 64 43 6e 74 72 2c 20 34 29 3b 0a 20 20 20  oldCntr, 4);.   
15e10 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
15e20 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20  orBenign(0);.   
15e30 20 20 20 69 66 28 20 72 63 21 3d 34 20 7c 7c 20     if( rc!=4 || 
15e40 6d 65 6d 63 6d 70 28 6f 6c 64 43 6e 74 72 2c 20  memcmp(oldCntr, 
15e50 26 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b 32  &((char*)pBuf)[2
15e60 34 2d 6f 66 66 73 65 74 5d 2c 20 34 29 21 3d 30  4-offset], 4)!=0
15e70 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c   ){.        pFil
15e80 65 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e 67  e->transCntrChng
15e90 20 3d 20 31 3b 20 20 2f 2a 20 54 68 65 20 74 72   = 1;  /* The tr
15ea0 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65  ansaction counte
15eb0 72 20 68 61 73 20 63 68 61 6e 67 65 64 20 2a 2f  r has changed */
15ec0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
15ed0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 77 68 69   }.#endif..  whi
15ee0 6c 65 28 20 61 6d 74 3e 30 20 26 26 20 28 77 72  le( amt>0 && (wr
15ef0 6f 74 65 20 3d 20 73 65 65 6b 41 6e 64 57 72 69  ote = seekAndWri
15f00 74 65 28 70 46 69 6c 65 2c 20 6f 66 66 73 65 74  te(pFile, offset
15f10 2c 20 70 42 75 66 2c 20 61 6d 74 29 29 3e 30 20  , pBuf, amt))>0 
15f20 29 7b 0a 20 20 20 20 61 6d 74 20 2d 3d 20 77 72  ){.    amt -= wr
15f30 6f 74 65 3b 0a 20 20 20 20 6f 66 66 73 65 74 20  ote;.    offset 
15f40 2b 3d 20 77 72 6f 74 65 3b 0a 20 20 20 20 70 42  += wrote;.    pB
15f50 75 66 20 3d 20 26 28 28 63 68 61 72 2a 29 70 42  uf = &((char*)pB
15f60 75 66 29 5b 77 72 6f 74 65 5d 3b 0a 20 20 7d 0a  uf)[wrote];.  }.
15f70 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
15f80 72 28 28 20 77 72 6f 74 65 3d 28 2d 31 29 2c 20  r(( wrote=(-1), 
15f90 61 6d 74 3d 31 20 29 29 3b 0a 20 20 53 69 6d 75  amt=1 ));.  Simu
15fa0 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f  lateDiskfullErro
15fb0 72 28 28 20 77 72 6f 74 65 3d 30 2c 20 61 6d 74  r(( wrote=0, amt
15fc0 3d 31 20 29 29 3b 0a 0a 20 20 69 66 28 20 61 6d  =1 ));..  if( am
15fd0 74 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20 77  t>0 ){.    if( w
15fe0 72 6f 74 65 3c 30 20 29 7b 0a 20 20 20 20 20 20  rote<0 ){.      
15ff0 2f 2a 20 6c 61 73 74 45 72 72 6e 6f 20 73 65 74  /* lastErrno set
16000 20 62 79 20 73 65 65 6b 41 6e 64 57 72 69 74 65   by seekAndWrite
16010 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
16020 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52   SQLITE_IOERR_WR
16030 49 54 45 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ITE;.    }else{.
16040 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
16050 74 45 72 72 6e 6f 20 3d 20 30 3b 20 2f 2a 20 6e  tErrno = 0; /* n
16060 6f 74 20 61 20 73 79 73 74 65 6d 20 65 72 72 6f  ot a system erro
16070 72 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  r */.      retur
16080 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20  n SQLITE_FULL;. 
16090 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
160a0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
160b0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
160c0 45 53 54 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20  EST./*.** Count 
160d0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 75  the number of fu
160e0 6c 6c 73 79 6e 63 73 20 61 6e 64 20 6e 6f 72 6d  llsyncs and norm
160f0 61 6c 20 73 79 6e 63 73 2e 20 20 54 68 69 73 20  al syncs.  This 
16100 69 73 20 75 73 65 64 20 74 6f 20 74 65 73 74 0a  is used to test.
16110 2a 2a 20 74 68 61 74 20 73 79 6e 63 73 20 61 6e  ** that syncs an
16120 64 20 66 75 6c 6c 73 79 6e 63 73 20 61 72 65 20  d fullsyncs are 
16130 6f 63 63 75 72 72 69 6e 67 20 61 74 20 74 68 65  occurring at the
16140 20 72 69 67 68 74 20 74 69 6d 65 73 2e 0a 2a 2f   right times..*/
16150 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 79 6e  .int sqlite3_syn
16160 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 69 6e 74  c_count = 0;.int
16170 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e   sqlite3_fullsyn
16180 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e  c_count = 0;.#en
16190 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 65 20 64 6f  dif../*.** We do
161a0 20 6e 6f 74 20 74 72 75 73 74 20 73 79 73 74 65   not trust syste
161b0 6d 73 20 74 6f 20 70 72 6f 76 69 64 65 20 61 20  ms to provide a 
161c0 77 6f 72 6b 69 6e 67 20 66 64 61 74 61 73 79 6e  working fdatasyn
161d0 63 28 29 2e 20 20 53 6f 6d 65 20 64 6f 2e 0a 2a  c().  Some do..*
161e0 2a 20 4f 74 68 65 72 73 20 64 6f 20 6e 6f 2e 20  * Others do no. 
161f0 20 54 6f 20 62 65 20 73 61 66 65 2c 20 77 65 20   To be safe, we 
16200 77 69 6c 6c 20 73 74 69 63 6b 20 77 69 74 68 20  will stick with 
16210 74 68 65 20 28 73 6c 6f 77 65 72 29 20 66 73 79  the (slower) fsy
16220 6e 63 28 29 2e 0a 2a 2a 20 49 66 20 79 6f 75 20  nc()..** If you 
16230 6b 6e 6f 77 20 74 68 61 74 20 79 6f 75 72 20 73  know that your s
16240 79 73 74 65 6d 20 64 6f 65 73 20 73 75 70 70 6f  ystem does suppo
16250 72 74 20 66 64 61 74 61 73 79 6e 63 28 29 20 63  rt fdatasync() c
16260 6f 72 72 65 63 74 6c 79 2c 0a 2a 2a 20 74 68 65  orrectly,.** the
16270 6e 20 73 69 6d 70 6c 79 20 63 6f 6d 70 69 6c 65  n simply compile
16280 20 77 69 74 68 20 2d 44 66 64 61 74 61 73 79 6e   with -Dfdatasyn
16290 63 3d 66 64 61 74 61 73 79 6e 63 0a 2a 2f 0a 23  c=fdatasync.*/.#
162a0 69 66 20 21 64 65 66 69 6e 65 64 28 66 64 61 74  if !defined(fdat
162b0 61 73 79 6e 63 29 20 26 26 20 21 64 65 66 69 6e  async) && !defin
162c0 65 64 28 5f 5f 6c 69 6e 75 78 5f 5f 29 0a 23 20  ed(__linux__).# 
162d0 64 65 66 69 6e 65 20 66 64 61 74 61 73 79 6e 63  define fdatasync
162e0 20 66 73 79 6e 63 0a 23 65 6e 64 69 66 0a 0a 2f   fsync.#endif../
162f0 2a 0a 2a 2a 20 44 65 66 69 6e 65 20 48 41 56 45  *.** Define HAVE
16300 5f 46 55 4c 4c 46 53 59 4e 43 20 74 6f 20 30 20  _FULLFSYNC to 0 
16310 6f 72 20 31 20 64 65 70 65 6e 64 69 6e 67 20 6f  or 1 depending o
16320 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  n whether or not
16330 0a 2a 2a 20 74 68 65 20 46 5f 46 55 4c 4c 46 53  .** the F_FULLFS
16340 59 4e 43 20 6d 61 63 72 6f 20 69 73 20 64 65 66  YNC macro is def
16350 69 6e 65 64 2e 20 20 46 5f 46 55 4c 4c 46 53 59  ined.  F_FULLFSY
16360 4e 43 20 69 73 20 63 75 72 72 65 6e 74 6c 79 0a  NC is currently.
16370 2a 2a 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c  ** only availabl
16380 65 20 6f 6e 20 4d 61 63 20 4f 53 20 58 2e 20 20  e on Mac OS X.  
16390 42 75 74 20 74 68 61 74 20 63 6f 75 6c 64 20 63  But that could c
163a0 68 61 6e 67 65 2e 0a 2a 2f 0a 23 69 66 64 65 66  hange..*/.#ifdef
163b0 20 46 5f 46 55 4c 4c 46 53 59 4e 43 0a 23 20 64   F_FULLFSYNC.# d
163c0 65 66 69 6e 65 20 48 41 56 45 5f 46 55 4c 4c 46  efine HAVE_FULLF
163d0 53 59 4e 43 20 31 0a 23 65 6c 73 65 0a 23 20 64  SYNC 1.#else.# d
163e0 65 66 69 6e 65 20 48 41 56 45 5f 46 55 4c 4c 46  efine HAVE_FULLF
163f0 53 59 4e 43 20 30 0a 23 65 6e 64 69 66 0a 0a 23  SYNC 0.#endif..#
16400 69 66 64 65 66 20 53 51 4c 49 54 45 5f 55 53 45  ifdef SQLITE_USE
16410 5f 52 45 51 55 45 53 54 5f 46 55 4c 4c 46 53 59  _REQUEST_FULLFSY
16420 4e 43 0a 23 69 6d 70 6f 72 74 20 3c 6e 6f 74 69  NC.#import <noti
16430 66 79 2e 68 3e 0a 23 69 6d 70 6f 72 74 20 3c 6c  fy.h>.#import <l
16440 69 62 6b 65 72 6e 2f 4f 53 41 74 6f 6d 69 63 2e  ibkern/OSAtomic.
16450 68 3e 0a 73 74 61 74 69 63 20 4f 53 53 70 69 6e  h>.static OSSpin
16460 4c 6f 63 6b 20 6e 6f 74 69 66 79 5f 6c 6f 63 6b  Lock notify_lock
16470 20 3d 20 30 3b 0a 23 64 65 66 69 6e 65 20 52 45   = 0;.#define RE
16480 51 55 45 53 54 5f 46 55 4c 4c 53 59 4e 43 5f 4e  QUEST_FULLSYNC_N
16490 4f 54 49 46 49 43 41 54 49 4f 4e 20 20 20 20 22  OTIFICATION    "
164a0 63 6f 6d 2e 61 70 70 6c 65 2e 72 65 71 73 79 6e  com.apple.reqsyn
164b0 63 22 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  c".#endif../*.**
164c0 20 54 68 65 20 66 73 79 6e 63 28 29 20 73 79 73   The fsync() sys
164d0 74 65 6d 20 63 61 6c 6c 20 64 6f 65 73 20 6e 6f  tem call does no
164e0 74 20 77 6f 72 6b 20 61 73 20 61 64 76 65 72 74  t work as advert
164f0 69 73 65 64 20 6f 6e 20 6d 61 6e 79 0a 2a 2a 20  ised on many.** 
16500 75 6e 69 78 20 73 79 73 74 65 6d 73 2e 20 20 54  unix systems.  T
16510 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 72 6f  he following pro
16520 63 65 64 75 72 65 20 69 73 20 61 6e 20 61 74 74  cedure is an att
16530 65 6d 70 74 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20  empt to make.** 
16540 69 74 20 77 6f 72 6b 20 62 65 74 74 65 72 2e 0a  it work better..
16550 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54 45  **.** The SQLITE
16560 5f 4e 4f 5f 53 59 4e 43 20 6d 61 63 72 6f 20 64  _NO_SYNC macro d
16570 69 73 61 62 6c 65 73 20 61 6c 6c 20 66 73 79 6e  isables all fsyn
16580 63 28 29 73 2e 20 20 54 68 69 73 20 69 73 20 75  c()s.  This is u
16590 73 65 66 75 6c 0a 2a 2a 20 66 6f 72 20 74 65 73  seful.** for tes
165a0 74 69 6e 67 20 77 68 65 6e 20 77 65 20 77 61 6e  ting when we wan
165b0 74 20 74 6f 20 72 75 6e 20 74 68 72 6f 75 67 68  t to run through
165c0 20 74 68 65 20 74 65 73 74 20 73 75 69 74 65 20   the test suite 
165d0 71 75 69 63 6b 6c 79 2e 0a 2a 2a 20 59 6f 75 20  quickly..** You 
165e0 61 72 65 20 73 74 72 6f 6e 67 6c 79 20 61 64 76  are strongly adv
165f0 69 73 65 64 20 2a 6e 6f 74 2a 20 74 6f 20 64 65  ised *not* to de
16600 70 6c 6f 79 20 77 69 74 68 20 53 51 4c 49 54 45  ploy with SQLITE
16610 5f 4e 4f 5f 53 59 4e 43 0a 2a 2a 20 65 6e 61 62  _NO_SYNC.** enab
16620 6c 65 64 2c 20 68 6f 77 65 76 65 72 2c 20 73 69  led, however, si
16630 6e 63 65 20 77 69 74 68 20 53 51 4c 49 54 45 5f  nce with SQLITE_
16640 4e 4f 5f 53 59 4e 43 20 65 6e 61 62 6c 65 64 2c  NO_SYNC enabled,
16650 20 61 6e 20 4f 53 20 63 72 61 73 68 0a 2a 2a 20   an OS crash.** 
16660 6f 72 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65  or power failure
16670 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 63 6f 72   will likely cor
16680 72 75 70 74 20 74 68 65 20 64 61 74 61 62 61 73  rupt the databas
16690 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51  e file..**.** SQ
166a0 4c 69 74 65 20 73 65 74 73 20 74 68 65 20 64 61  Lite sets the da
166b0 74 61 4f 6e 6c 79 20 66 6c 61 67 20 69 66 20 74  taOnly flag if t
166c0 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66  he size of the f
166d0 69 6c 65 20 69 73 20 75 6e 63 68 61 6e 67 65 64  ile is unchanged
166e0 2e 0a 2a 2a 20 54 68 65 20 69 64 65 61 20 62 65  ..** The idea be
166f0 68 69 6e 64 20 64 61 74 61 4f 6e 6c 79 20 69 73  hind dataOnly is
16700 20 74 68 61 74 20 69 74 20 73 68 6f 75 6c 64 20   that it should 
16710 6f 6e 6c 79 20 77 72 69 74 65 20 74 68 65 20 66  only write the f
16720 69 6c 65 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20 74  ile content.** t
16730 6f 20 64 69 73 6b 2c 20 6e 6f 74 20 74 68 65 20  o disk, not the 
16740 69 6e 6f 64 65 2e 20 20 57 65 20 6f 6e 6c 79 20  inode.  We only 
16750 73 65 74 20 64 61 74 61 4f 6e 6c 79 20 69 66 20  set dataOnly if 
16760 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20 69 73  the file size is
16770 20 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20 73   .** unchanged s
16780 69 6e 63 65 20 74 68 65 20 66 69 6c 65 20 73 69  ince the file si
16790 7a 65 20 69 73 20 70 61 72 74 20 6f 66 20 74 68  ze is part of th
167a0 65 20 69 6e 6f 64 65 2e 20 20 48 6f 77 65 76 65  e inode.  Howeve
167b0 72 2c 20 0a 2a 2a 20 54 65 64 20 54 73 27 6f 20  r, .** Ted Ts'o 
167c0 74 65 6c 6c 73 20 75 73 20 74 68 61 74 20 66 64  tells us that fd
167d0 61 74 61 73 79 6e 63 28 29 20 77 69 6c 6c 20 61  atasync() will a
167e0 6c 73 6f 20 77 72 69 74 65 20 74 68 65 20 69 6e  lso write the in
167f0 6f 64 65 20 69 66 20 74 68 65 0a 2a 2a 20 66 69  ode if the.** fi
16800 6c 65 20 73 69 7a 65 20 68 61 73 20 63 68 61 6e  le size has chan
16810 67 65 64 2e 20 20 54 68 65 20 6f 6e 6c 79 20 72  ged.  The only r
16820 65 61 6c 20 64 69 66 66 65 72 65 6e 63 65 20 62  eal difference b
16830 65 74 77 65 65 6e 20 66 64 61 74 61 73 79 6e 63  etween fdatasync
16840 28 29 0a 2a 2a 20 61 6e 64 20 66 73 79 6e 63 28  ().** and fsync(
16850 29 2c 20 54 65 64 20 74 65 6c 6c 73 20 75 73 2c  ), Ted tells us,
16860 20 69 73 20 74 68 61 74 20 66 64 61 74 61 73 79   is that fdatasy
16870 6e 63 28 29 20 77 69 6c 6c 20 6e 6f 74 20 66 6c  nc() will not fl
16880 75 73 68 20 74 68 65 0a 2a 2a 20 69 6e 6f 64 65  ush the.** inode
16890 20 69 66 20 74 68 65 20 6d 74 69 6d 65 20 6f 72   if the mtime or
168a0 20 6f 77 6e 65 72 20 6f 72 20 6f 74 68 65 72 20   owner or other 
168b0 69 6e 6f 64 65 20 61 74 74 72 69 62 75 74 65 73  inode attributes
168c0 20 68 61 76 65 20 63 68 61 6e 67 65 64 2e 0a 2a   have changed..*
168d0 2a 20 57 65 20 6f 6e 6c 79 20 63 61 72 65 20 61  * We only care a
168e0 62 6f 75 74 20 74 68 65 20 66 69 6c 65 20 73 69  bout the file si
168f0 7a 65 2c 20 6e 6f 74 20 74 68 65 20 6f 74 68 65  ze, not the othe
16900 72 20 66 69 6c 65 20 61 74 74 72 69 62 75 74 65  r file attribute
16910 73 2c 20 73 6f 0a 2a 2a 20 61 73 20 66 61 72 20  s, so.** as far 
16920 61 73 20 53 51 4c 69 74 65 20 69 73 20 63 6f 6e  as SQLite is con
16930 63 65 72 6e 65 64 2c 20 61 6e 20 66 64 61 74 61  cerned, an fdata
16940 73 79 6e 63 28 29 20 69 73 20 61 6c 77 61 79 73  sync() is always
16950 20 61 64 65 71 75 61 74 65 2e 0a 2a 2a 20 53 6f   adequate..** So
16960 2c 20 77 65 20 61 6c 77 61 79 73 20 75 73 65 20  , we always use 
16970 66 64 61 74 61 73 79 6e 63 28 29 20 69 66 20 69  fdatasync() if i
16980 74 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20  t is available, 
16990 72 65 67 61 72 64 6c 65 73 73 20 6f 66 0a 2a 2a  regardless of.**
169a0 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
169b0 65 20 64 61 74 61 4f 6e 6c 79 20 66 6c 61 67 2e  e dataOnly flag.
169c0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
169d0 75 6c 6c 5f 66 73 79 6e 63 28 69 6e 74 20 66 64  ull_fsync(int fd
169e0 2c 20 69 6e 74 20 66 75 6c 6c 53 79 6e 63 2c 20  , int fullSync, 
169f0 69 6e 74 20 64 61 74 61 4f 6e 6c 79 29 7b 0a 20  int dataOnly){. 
16a00 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 54   int rc;..  /* T
16a10 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 22 69 66  he following "if
16a20 64 65 66 2f 65 6c 69 66 2f 65 6c 73 65 2f 22 20  def/elif/else/" 
16a30 62 6c 6f 63 6b 20 68 61 73 20 74 68 65 20 73 61  block has the sa
16a40 6d 65 20 73 74 72 75 63 74 75 72 65 20 61 73 0a  me structure as.
16a50 20 20 2a 2a 20 74 68 65 20 6f 6e 65 20 62 65 6c    ** the one bel
16a60 6f 77 2e 20 49 74 20 69 73 20 72 65 70 6c 69 63  ow. It is replic
16a70 61 74 65 64 20 68 65 72 65 20 73 6f 6c 65 6c 79  ated here solely
16a80 20 74 6f 20 61 76 6f 69 64 20 63 6c 75 74 74 65   to avoid clutte
16a90 72 69 6e 67 20 0a 20 20 2a 2a 20 75 70 20 74 68  ring .  ** up th
16aa0 65 20 72 65 61 6c 20 63 6f 64 65 20 77 69 74 68  e real code with
16ab0 20 74 68 65 20 55 4e 55 53 45 44 5f 50 41 52 41   the UNUSED_PARA
16ac0 4d 45 54 45 52 28 29 20 6d 61 63 72 6f 73 2e 0a  METER() macros..
16ad0 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49    */.#ifdef SQLI
16ae0 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20 55 4e 55  TE_NO_SYNC.  UNU
16af0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66 64  SED_PARAMETER(fd
16b00 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
16b10 4d 45 54 45 52 28 66 75 6c 6c 53 79 6e 63 29 3b  METER(fullSync);
16b20 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
16b30 54 45 52 28 64 61 74 61 4f 6e 6c 79 29 3b 0a 23  TER(dataOnly);.#
16b40 65 6c 69 66 20 48 41 56 45 5f 46 55 4c 4c 46 53  elif HAVE_FULLFS
16b50 59 4e 43 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  YNC.  UNUSED_PAR
16b60 41 4d 45 54 45 52 28 64 61 74 61 4f 6e 6c 79 29  AMETER(dataOnly)
16b70 3b 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44  ;.#else.  UNUSED
16b80 5f 50 41 52 41 4d 45 54 45 52 28 66 75 6c 6c 53  _PARAMETER(fullS
16b90 79 6e 63 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  ync);.  UNUSED_P
16ba0 41 52 41 4d 45 54 45 52 28 64 61 74 61 4f 6e 6c  ARAMETER(dataOnl
16bb0 79 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a  y);.#endif..  /*
16bc0 20 52 65 63 6f 72 64 20 74 68 65 20 6e 75 6d 62   Record the numb
16bd0 65 72 20 6f 66 20 74 69 6d 65 73 20 74 68 61 74  er of times that
16be0 20 77 65 20 64 6f 20 61 20 6e 6f 72 6d 61 6c 20   we do a normal 
16bf0 66 73 79 6e 63 28 29 20 61 6e 64 20 0a 20 20 2a  fsync() and .  *
16c00 2a 20 46 55 4c 4c 53 59 4e 43 2e 20 20 54 68 69  * FULLSYNC.  Thi
16c10 73 20 69 73 20 75 73 65 64 20 64 75 72 69 6e 67  s is used during
16c20 20 74 65 73 74 69 6e 67 20 74 6f 20 76 65 72 69   testing to veri
16c30 66 79 20 74 68 61 74 20 74 68 69 73 20 70 72 6f  fy that this pro
16c40 63 65 64 75 72 65 0a 20 20 2a 2a 20 67 65 74 73  cedure.  ** gets
16c50 20 63 61 6c 6c 65 64 20 77 69 74 68 20 74 68 65   called with the
16c60 20 63 6f 72 72 65 63 74 20 61 72 67 75 6d 65 6e   correct argumen
16c70 74 73 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20  ts..  */.#ifdef 
16c80 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 66  SQLITE_TEST.  if
16c90 28 20 66 75 6c 6c 53 79 6e 63 20 29 20 73 71 6c  ( fullSync ) sql
16ca0 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f  ite3_fullsync_co
16cb0 75 6e 74 2b 2b 3b 0a 20 20 73 71 6c 69 74 65 33  unt++;.  sqlite3
16cc0 5f 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 23  _sync_count++;.#
16cd0 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 77  endif..  /* If w
16ce0 65 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20  e compiled with 
16cf0 74 68 65 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59  the SQLITE_NO_SY
16d00 4e 43 20 66 6c 61 67 2c 20 74 68 65 6e 20 73 79  NC flag, then sy
16d10 6e 63 69 6e 67 20 69 73 20 61 0a 20 20 2a 2a 20  ncing is a.  ** 
16d20 6e 6f 2d 6f 70 0a 20 20 2a 2f 0a 23 69 66 64 65  no-op.  */.#ifde
16d30 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43  f SQLITE_NO_SYNC
16d40 0a 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  .  rc = SQLITE_O
16d50 4b 3b 0a 23 65 6c 69 66 20 48 41 56 45 5f 46 55  K;.#elif HAVE_FU
16d60 4c 4c 46 53 59 4e 43 0a 20 20 69 66 28 20 66 75  LLFSYNC.  if( fu
16d70 6c 6c 53 79 6e 63 20 29 7b 0a 23 69 66 64 65 66  llSync ){.#ifdef
16d80 20 53 51 4c 49 54 45 5f 55 53 45 5f 52 45 51 55   SQLITE_USE_REQU
16d90 45 53 54 5f 46 55 4c 4c 46 53 59 4e 43 0a 20 20  EST_FULLFSYNC.  
16da0 20 20 72 63 20 3d 20 66 73 79 6e 63 28 66 64 29    rc = fsync(fd)
16db0 3b 0a 20 20 20 20 69 66 20 28 21 72 63 29 20 7b  ;.    if (!rc) {
16dc0 0a 20 20 20 20 20 20 4f 53 53 70 69 6e 4c 6f 63  .      OSSpinLoc
16dd0 6b 4c 6f 63 6b 28 26 6e 6f 74 69 66 79 5f 6c 6f  kLock(&notify_lo
16de0 63 6b 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  ck);.      rc = 
16df0 6e 6f 74 69 66 79 5f 70 6f 73 74 28 52 45 51 55  notify_post(REQU
16e00 45 53 54 5f 46 55 4c 4c 53 59 4e 43 5f 4e 4f 54  EST_FULLSYNC_NOT
16e10 49 46 49 43 41 54 49 4f 4e 29 3b 0a 20 20 20 20  IFICATION);.    
16e20 20 20 4f 53 53 70 69 6e 4c 6f 63 6b 55 6e 6c 6f    OSSpinLockUnlo
16e30 63 6b 28 26 6e 6f 74 69 66 79 5f 6c 6f 63 6b 29  ck(&notify_lock)
16e40 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20  ;.    }.#else.  
16e50 20 20 72 63 20 3d 20 66 63 6e 74 6c 28 66 64 2c    rc = fcntl(fd,
16e60 20 46 5f 46 55 4c 4c 46 53 59 4e 43 2c 20 30 29   F_FULLFSYNC, 0)
16e70 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65  ;.#endif.  }else
16e80 7b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20  {.    rc = 1;.  
16e90 7d 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 46 55  }.  /* If the FU
16ea0 4c 4c 46 53 59 4e 43 20 66 61 69 6c 65 64 2c 20  LLFSYNC failed, 
16eb0 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 61 74 74  fall back to att
16ec0 65 6d 70 74 69 6e 67 20 61 6e 20 66 73 79 6e 63  empting an fsync
16ed0 28 29 2e 0a 20 20 2a 2a 20 49 74 20 73 68 6f 75  ()..  ** It shou
16ee0 6c 64 6e 27 74 20 62 65 20 70 6f 73 73 69 62 6c  ldn't be possibl
16ef0 65 20 66 6f 72 20 66 75 6c 6c 66 73 79 6e 63 20  e for fullfsync 
16f00 74 6f 20 66 61 69 6c 20 6f 6e 20 74 68 65 20 6c  to fail on the l
16f10 6f 63 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20  ocal .  ** file 
16f20 73 79 73 74 65 6d 20 28 6f 6e 20 4f 53 58 29 2c  system (on OSX),
16f30 20 73 6f 20 66 61 69 6c 75 72 65 20 69 6e 64 69   so failure indi
16f40 63 61 74 65 73 20 74 68 61 74 20 46 55 4c 4c 46  cates that FULLF
16f50 53 59 4e 43 0a 20 20 2a 2a 20 69 73 6e 27 74 20  SYNC.  ** isn't 
16f60 73 75 70 70 6f 72 74 65 64 20 66 6f 72 20 74 68  supported for th
16f70 69 73 20 66 69 6c 65 20 73 79 73 74 65 6d 2e 20  is file system. 
16f80 53 6f 2c 20 61 74 74 65 6d 70 74 20 61 6e 20 66  So, attempt an f
16f90 73 79 6e 63 20 0a 20 20 2a 2a 20 61 6e 64 20 28  sync .  ** and (
16fa0 66 6f 72 20 6e 6f 77 29 20 69 67 6e 6f 72 65 20  for now) ignore 
16fb0 74 68 65 20 6f 76 65 72 68 65 61 64 20 6f 66 20  the overhead of 
16fc0 61 20 73 75 70 65 72 66 6c 75 6f 75 73 20 66 63  a superfluous fc
16fd0 6e 74 6c 20 63 61 6c 6c 2e 20 20 0a 20 20 2a 2a  ntl call.  .  **
16fe0 20 49 74 27 64 20 62 65 20 62 65 74 74 65 72 20   It'd be better 
16ff0 74 6f 20 64 65 74 65 63 74 20 66 75 6c 6c 66 73  to detect fullfs
17000 79 6e 63 20 73 75 70 70 6f 72 74 20 6f 6e 63 65  ync support once
17010 20 61 6e 64 20 61 76 6f 69 64 20 0a 20 20 2a 2a   and avoid .  **
17020 20 74 68 65 20 66 63 6e 74 6c 20 63 61 6c 6c 20   the fcntl call 
17030 65 76 65 72 79 20 74 69 6d 65 20 73 79 6e 63 20  every time sync 
17040 69 73 20 63 61 6c 6c 65 64 2e 0a 20 20 2a 2f 0a  is called..  */.
17050 20 20 69 66 28 20 72 63 20 29 20 72 63 20 3d 20    if( rc ) rc = 
17060 66 73 79 6e 63 28 66 64 29 3b 0a 0a 23 65 6c 69  fsync(fd);..#eli
17070 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
17080 45 5f 5f 29 0a 20 20 2f 2a 20 66 64 61 74 61 73  E__).  /* fdatas
17090 79 6e 63 28 29 20 6f 6e 20 48 46 53 2b 20 64 6f  ync() on HFS+ do
170a0 65 73 6e 27 74 20 79 65 74 20 66 6c 75 73 68 20  esn't yet flush 
170b0 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20 69 66  the file size if
170c0 20 69 74 20 63 68 61 6e 67 65 64 20 63 6f 72 72   it changed corr
170d0 65 63 74 6c 79 0a 20 20 2a 2a 20 73 6f 20 63 75  ectly.  ** so cu
170e0 72 72 65 6e 74 6c 79 20 77 65 20 64 65 66 61 75  rrently we defau
170f0 6c 74 20 74 6f 20 74 68 65 20 6d 61 63 72 6f 20  lt to the macro 
17100 74 68 61 74 20 72 65 64 65 66 69 6e 65 73 20 66  that redefines f
17110 64 61 74 61 73 79 6e 63 20 74 6f 20 66 73 79 6e  datasync to fsyn
17120 63 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 66 73  c.  */.  rc = fs
17130 79 6e 63 28 66 64 29 3b 0a 23 65 6c 73 65 20 0a  ync(fd);.#else .
17140 20 20 72 63 20 3d 20 66 64 61 74 61 73 79 6e 63    rc = fdatasync
17150 28 66 64 29 3b 0a 23 69 66 20 4f 53 5f 56 58 57  (fd);.#if OS_VXW
17160 4f 52 4b 53 0a 20 20 69 66 28 20 72 63 3d 3d 2d  ORKS.  if( rc==-
17170 31 20 26 26 20 65 72 72 6e 6f 3d 3d 45 4e 4f 54  1 && errno==ENOT
17180 53 55 50 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  SUP ){.    rc = 
17190 66 73 79 6e 63 28 66 64 29 3b 0a 20 20 7d 0a 23  fsync(fd);.  }.#
171a0 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f  endif /* OS_VXWO
171b0 52 4b 53 20 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a  RKS */.#endif /*
171c0 20 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f   ifdef SQLITE_NO
171d0 5f 53 59 4e 43 20 65 6c 69 66 20 48 41 56 45 5f  _SYNC elif HAVE_
171e0 46 55 4c 4c 46 53 59 4e 43 20 2a 2f 0a 0a 20 20  FULLFSYNC */..  
171f0 69 66 28 20 4f 53 5f 56 58 57 4f 52 4b 53 20 26  if( OS_VXWORKS &
17200 26 20 72 63 21 3d 20 2d 31 20 29 7b 0a 20 20 20  & rc!= -1 ){.   
17210 20 72 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72   rc = 0;.  }.  r
17220 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
17230 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c  ** Make sure all
17240 20 77 72 69 74 65 73 20 74 6f 20 61 20 70 61 72   writes to a par
17250 74 69 63 75 6c 61 72 20 66 69 6c 65 20 61 72 65  ticular file are
17260 20 63 6f 6d 6d 69 74 74 65 64 20 74 6f 20 64 69   committed to di
17270 73 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 61 74  sk..**.** If dat
17280 61 4f 6e 6c 79 3d 3d 30 20 74 68 65 6e 20 62 6f  aOnly==0 then bo
17290 74 68 20 74 68 65 20 66 69 6c 65 20 69 74 73 65  th the file itse
172a0 6c 66 20 61 6e 64 20 69 74 73 20 6d 65 74 61 64  lf and its metad
172b0 61 74 61 20 28 66 69 6c 65 0a 2a 2a 20 73 69 7a  ata (file.** siz
172c0 65 2c 20 61 63 63 65 73 73 20 74 69 6d 65 2c 20  e, access time, 
172d0 65 74 63 29 20 61 72 65 20 73 79 6e 63 65 64 2e  etc) are synced.
172e0 20 20 49 66 20 64 61 74 61 4f 6e 6c 79 21 3d 30    If dataOnly!=0
172f0 20 74 68 65 6e 20 6f 6e 6c 79 20 74 68 65 0a 2a   then only the.*
17300 2a 20 66 69 6c 65 20 64 61 74 61 20 69 73 20 73  * file data is s
17310 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 55 6e 64  ynced..**.** Und
17320 65 72 20 55 6e 69 78 2c 20 61 6c 73 6f 20 6d 61  er Unix, also ma
17330 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65  ke sure that the
17340 20 64 69 72 65 63 74 6f 72 79 20 65 6e 74 72 79   directory entry
17350 20 66 6f 72 20 74 68 65 20 66 69 6c 65 0a 2a 2a   for the file.**
17360 20 68 61 73 20 62 65 65 6e 20 63 72 65 61 74 65   has been create
17370 64 20 62 79 20 66 73 79 6e 63 2d 69 6e 67 20 74  d by fsync-ing t
17380 68 65 20 64 69 72 65 63 74 6f 72 79 20 74 68 61  he directory tha
17390 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 66  t contains the f
173a0 69 6c 65 2e 0a 2a 2a 20 49 66 20 77 65 20 64 6f  ile..** If we do
173b0 20 6e 6f 74 20 64 6f 20 74 68 69 73 20 61 6e 64   not do this and
173c0 20 77 65 20 65 6e 63 6f 75 6e 74 65 72 20 61 20   we encounter a 
173d0 70 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20 74  power failure, t
173e0 68 65 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20  he directory.** 
173f0 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 6a 6f  entry for the jo
17400 75 72 6e 61 6c 20 6d 69 67 68 74 20 6e 6f 74 20  urnal might not 
17410 65 78 69 73 74 20 61 66 74 65 72 20 77 65 20 72  exist after we r
17420 65 62 6f 6f 74 2e 20 20 54 68 65 20 6e 65 78 74  eboot.  The next
17430 0a 2a 2a 20 53 51 4c 69 74 65 20 74 6f 20 61 63  .** SQLite to ac
17440 63 65 73 73 20 74 68 65 20 66 69 6c 65 20 77 69  cess the file wi
17450 6c 6c 20 6e 6f 74 20 6b 6e 6f 77 20 74 68 61 74  ll not know that
17460 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 65 78 69   the journal exi
17470 73 74 73 20 28 62 65 63 61 75 73 65 0a 2a 2a 20  sts (because.** 
17480 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 65 6e  the directory en
17490 74 72 79 20 66 6f 72 20 74 68 65 20 6a 6f 75 72  try for the jour
174a0 6e 61 6c 20 77 61 73 20 6e 65 76 65 72 20 63 72  nal was never cr
174b0 65 61 74 65 64 29 20 61 6e 64 20 74 68 65 20 74  eated) and the t
174c0 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 77 69  ransaction.** wi
174d0 6c 6c 20 6e 6f 74 20 72 6f 6c 6c 20 62 61 63 6b  ll not roll back
174e0 20 2d 20 70 6f 73 73 69 62 6c 79 20 6c 65 61 64   - possibly lead
174f0 69 6e 67 20 74 6f 20 64 61 74 61 62 61 73 65 20  ing to database 
17500 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73  corruption..*/.s
17510 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 79  tatic int unixSy
17520 6e 63 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  nc(sqlite3_file 
17530 2a 69 64 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b  *id, int flags){
17540 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e 69  .  int rc;.  uni
17550 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
17560 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20  unixFile*)id;.. 
17570 20 69 6e 74 20 69 73 44 61 74 61 4f 6e 6c 79 20   int isDataOnly 
17580 3d 20 28 66 6c 61 67 73 26 53 51 4c 49 54 45 5f  = (flags&SQLITE_
17590 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 29 3b 0a  SYNC_DATAONLY);.
175a0 20 20 69 6e 74 20 69 73 46 75 6c 6c 73 79 6e 63    int isFullsync
175b0 20 3d 20 28 66 6c 61 67 73 26 30 78 30 46 29 3d   = (flags&0x0F)=
175c0 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c  =SQLITE_SYNC_FUL
175d0 4c 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  L;..  /* Check t
175e0 68 61 74 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54  hat one of SQLIT
175f0 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72  E_SYNC_NORMAL or
17600 20 46 55 4c 4c 20 77 61 73 20 70 61 73 73 65 64   FULL was passed
17610 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 28 66 6c   */.  assert((fl
17620 61 67 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54  ags&0x0F)==SQLIT
17630 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 0a 20 20  E_SYNC_NORMAL.  
17640 20 20 20 20 7c 7c 20 28 66 6c 61 67 73 26 30 78      || (flags&0x
17650 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43  0F)==SQLITE_SYNC
17660 5f 46 55 4c 4c 0a 20 20 29 3b 0a 0a 20 20 2f 2a  _FULL.  );..  /*
17670 20 55 6e 69 78 20 63 61 6e 6e 6f 74 2c 20 62 75   Unix cannot, bu
17680 74 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 20 6d  t some systems m
17690 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ay return SQLITE
176a0 5f 46 55 4c 4c 20 66 72 6f 6d 20 68 65 72 65 2e  _FULL from here.
176b0 20 54 68 69 73 0a 20 20 2a 2a 20 6c 69 6e 65 20   This.  ** line 
176c0 69 73 20 74 6f 20 74 65 73 74 20 74 68 61 74 20  is to test that 
176d0 64 6f 69 6e 67 20 73 6f 20 64 6f 65 73 20 6e 6f  doing so does no
176e0 74 20 63 61 75 73 65 20 61 6e 79 20 70 72 6f 62  t cause any prob
176f0 6c 65 6d 73 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d  lems..  */.  Sim
17700 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45 72 72  ulateDiskfullErr
17710 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54  or( return SQLIT
17720 45 5f 46 55 4c 4c 20 29 3b 0a 0a 20 20 61 73 73  E_FULL );..  ass
17730 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
17740 4f 53 54 52 41 43 45 28 28 22 53 59 4e 43 20 20  OSTRACE(("SYNC  
17750 20 20 25 2d 33 64 5c 6e 22 2c 20 70 46 69 6c 65    %-3d\n", pFile
17760 2d 3e 68 29 29 3b 0a 20 20 72 63 20 3d 20 66 75  ->h));.  rc = fu
17770 6c 6c 5f 66 73 79 6e 63 28 70 46 69 6c 65 2d 3e  ll_fsync(pFile->
17780 68 2c 20 69 73 46 75 6c 6c 73 79 6e 63 2c 20 69  h, isFullsync, i
17790 73 44 61 74 61 4f 6e 6c 79 29 3b 0a 20 20 53 69  sDataOnly);.  Si
177a0 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
177b0 63 3d 31 20 29 3b 0a 20 20 69 66 28 20 72 63 20  c=1 );.  if( rc 
177c0 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  ){.    pFile->la
177d0 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b  stErrno = errno;
177e0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
177f0 54 45 5f 49 4f 45 52 52 5f 46 53 59 4e 43 3b 0a  TE_IOERR_FSYNC;.
17800 20 20 7d 0a 20 20 69 66 28 20 70 46 69 6c 65 2d    }.  if( pFile-
17810 3e 64 69 72 66 64 3e 3d 30 20 29 7b 0a 20 20 20  >dirfd>=0 ){.   
17820 20 69 6e 74 20 65 72 72 3b 0a 20 20 20 20 4f 53   int err;.    OS
17830 54 52 41 43 45 28 28 22 44 49 52 53 59 4e 43 20  TRACE(("DIRSYNC 
17840 25 2d 33 64 20 28 68 61 76 65 5f 66 75 6c 6c 66  %-3d (have_fullf
17850 73 79 6e 63 3d 25 64 20 66 75 6c 6c 73 79 6e 63  sync=%d fullsync
17860 3d 25 64 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  =%d)\n", pFile->
17870 64 69 72 66 64 2c 0a 20 20 20 20 20 20 20 20 20  dirfd,.         
17880 20 20 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e     HAVE_FULLFSYN
17890 43 2c 20 69 73 46 75 6c 6c 73 79 6e 63 29 29 3b  C, isFullsync));
178a0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
178b0 44 49 53 41 42 4c 45 5f 44 49 52 53 59 4e 43 0a  DISABLE_DIRSYNC.
178c0 20 20 20 20 2f 2a 20 54 68 65 20 64 69 72 65 63      /* The direc
178d0 74 6f 72 79 20 73 79 6e 63 20 69 73 20 6f 6e 6c  tory sync is onl
178e0 79 20 61 74 74 65 6d 70 74 65 64 20 69 66 20 66  y attempted if f
178f0 75 6c 6c 5f 66 73 79 6e 63 20 69 73 0a 20 20 20  ull_fsync is.   
17900 20 2a 2a 20 74 75 72 6e 65 64 20 6f 66 66 20 6f   ** turned off o
17910 72 20 75 6e 61 76 61 69 6c 61 62 6c 65 2e 20 20  r unavailable.  
17920 49 66 20 61 20 66 75 6c 6c 5f 66 73 79 6e 63 20  If a full_fsync 
17930 6f 63 63 75 72 72 65 64 20 61 62 6f 76 65 2c 0a  occurred above,.
17940 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20      ** then the 
17950 64 69 72 65 63 74 6f 72 79 20 73 79 6e 63 20 69  directory sync i
17960 73 20 73 75 70 65 72 66 6c 75 6f 75 73 2e 0a 20  s superfluous.. 
17970 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 21     */.    if( (!
17980 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 7c  HAVE_FULLFSYNC |
17990 7c 20 21 69 73 46 75 6c 6c 73 79 6e 63 29 20 26  | !isFullsync) &
179a0 26 20 66 75 6c 6c 5f 66 73 79 6e 63 28 70 46 69  & full_fsync(pFi
179b0 6c 65 2d 3e 64 69 72 66 64 2c 30 2c 30 29 20 29  le->dirfd,0,0) )
179c0 7b 0a 20 20 20 20 20 20 20 2f 2a 0a 20 20 20 20  {.       /*.    
179d0 20 20 20 2a 2a 20 57 65 20 68 61 76 65 20 72 65     ** We have re
179e0 63 65 69 76 65 64 20 6d 75 6c 74 69 70 6c 65 20  ceived multiple 
179f0 72 65 70 6f 72 74 73 20 6f 66 20 66 73 79 6e 63  reports of fsync
17a00 28 29 20 72 65 74 75 72 6e 69 6e 67 0a 20 20 20  () returning.   
17a10 20 20 20 20 2a 2a 20 65 72 72 6f 72 73 20 77 68      ** errors wh
17a20 65 6e 20 61 70 70 6c 69 65 64 20 74 6f 20 64 69  en applied to di
17a30 72 65 63 74 6f 72 69 65 73 20 6f 6e 20 63 65 72  rectories on cer
17a40 74 61 69 6e 20 66 69 6c 65 20 73 79 73 74 65 6d  tain file system
17a50 73 2e 0a 20 20 20 20 20 20 20 2a 2a 20 41 20 66  s..       ** A f
17a60 61 69 6c 65 64 20 64 69 72 65 63 74 6f 72 79 20  ailed directory 
17a70 73 79 6e 63 20 69 73 20 6e 6f 74 20 61 20 62 69  sync is not a bi
17a80 67 20 64 65 61 6c 2e 20 20 53 6f 20 69 74 20 73  g deal.  So it s
17a90 65 65 6d 73 0a 20 20 20 20 20 20 20 2a 2a 20 62  eems.       ** b
17aa0 65 74 74 65 72 20 74 6f 20 69 67 6e 6f 72 65 20  etter to ignore 
17ab0 74 68 65 20 65 72 72 6f 72 2e 20 20 54 69 63 6b  the error.  Tick
17ac0 65 74 20 23 31 36 35 37 0a 20 20 20 20 20 20 20  et #1657.       
17ad0 2a 2f 0a 20 20 20 20 20 20 20 2f 2a 20 70 46 69  */.       /* pFi
17ae0 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
17af0 65 72 72 6e 6f 3b 20 2a 2f 0a 20 20 20 20 20 20  errno; */.      
17b00 20 2f 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54   /* return SQLIT
17b10 45 5f 49 4f 45 52 52 3b 20 2a 2f 0a 20 20 20 20  E_IOERR; */.    
17b20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 65 72 72  }.#endif.    err
17b30 20 3d 20 63 6c 6f 73 65 28 70 46 69 6c 65 2d 3e   = close(pFile->
17b40 64 69 72 66 64 29 3b 20 2f 2a 20 4f 6e 6c 79 20  dirfd); /* Only 
17b50 6e 65 65 64 20 74 6f 20 73 79 6e 63 20 6f 6e 63  need to sync onc
17b60 65 2c 20 73 6f 20 63 6c 6f 73 65 20 74 68 65 20  e, so close the 
17b70 2a 2f 0a 20 20 20 20 69 66 28 20 65 72 72 3d 3d  */.    if( err==
17b80 30 20 29 7b 20 20 20 20 20 20 20 20 20 20 20 20  0 ){            
17b90 20 20 2f 2a 20 64 69 72 65 63 74 6f 72 79 20 77    /* directory w
17ba0 68 65 6e 20 77 65 20 61 72 65 20 64 6f 6e 65 20  hen we are done 
17bb0 2a 2f 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  */.      pFile->
17bc0 64 69 72 66 64 20 3d 20 2d 31 3b 0a 20 20 20 20  dirfd = -1;.    
17bd0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 46 69  }else{.      pFi
17be0 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
17bf0 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20  errno;.      rc 
17c00 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44  = SQLITE_IOERR_D
17c10 49 52 5f 43 4c 4f 53 45 3b 0a 20 20 20 20 7d 0a  IR_CLOSE;.    }.
17c20 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
17c30 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61  .}../*.** Trunca
17c40 74 65 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20  te an open file 
17c50 74 6f 20 61 20 73 70 65 63 69 66 69 65 64 20 73  to a specified s
17c60 69 7a 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ize.*/.static in
17c70 74 20 75 6e 69 78 54 72 75 6e 63 61 74 65 28 73  t unixTruncate(s
17c80 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
17c90 20 69 36 34 20 6e 42 79 74 65 29 7b 0a 20 20 75   i64 nByte){.  u
17ca0 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
17cb0 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 69 64 3b   (unixFile *)id;
17cc0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73  .  int rc;.  ass
17cd0 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
17ce0 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
17cf0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
17d00 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 20 29 3b  OERR_TRUNCATE );
17d10 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 75 73  ..  /* If the us
17d20 65 72 20 68 61 73 20 63 6f 6e 66 69 67 75 72 65  er has configure
17d30 64 20 61 20 63 68 75 6e 6b 2d 73 69 7a 65 20 66  d a chunk-size f
17d40 6f 72 20 74 68 69 73 20 66 69 6c 65 2c 20 74 72  or this file, tr
17d50 75 6e 63 61 74 65 20 74 68 65 0a 20 20 2a 2a 20  uncate the.  ** 
17d60 66 69 6c 65 20 73 6f 20 74 68 61 74 20 69 74 20  file so that it 
17d70 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 6e 20 69  consists of an i
17d80 6e 74 65 67 65 72 20 6e 75 6d 62 65 72 20 6f 66  nteger number of
17d90 20 63 68 75 6e 6b 73 20 28 69 2e 65 2e 20 74 68   chunks (i.e. th
17da0 65 0a 20 20 2a 2a 20 61 63 74 75 61 6c 20 66 69  e.  ** actual fi
17db0 6c 65 20 73 69 7a 65 20 61 66 74 65 72 20 74 68  le size after th
17dc0 65 20 6f 70 65 72 61 74 69 6f 6e 20 6d 61 79 20  e operation may 
17dd0 62 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  be larger than t
17de0 68 65 20 72 65 71 75 65 73 74 65 64 0a 20 20 2a  he requested.  *
17df0 2a 20 73 69 7a 65 29 2e 0a 20 20 2a 2f 0a 20 20  * size)..  */.  
17e00 69 66 28 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75  if( pFile->szChu
17e10 6e 6b 20 29 7b 0a 20 20 20 20 6e 42 79 74 65 20  nk ){.    nByte 
17e20 3d 20 28 28 6e 42 79 74 65 20 2b 20 70 46 69 6c  = ((nByte + pFil
17e30 65 2d 3e 73 7a 43 68 75 6e 6b 20 2d 20 31 29 2f  e->szChunk - 1)/
17e40 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 29 20  pFile->szChunk) 
17e50 2a 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b  * pFile->szChunk
17e60 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 66 74  ;.  }..  rc = ft
17e70 72 75 6e 63 61 74 65 28 70 46 69 6c 65 2d 3e 68  runcate(pFile->h
17e80 2c 20 28 6f 66 66 5f 74 29 6e 42 79 74 65 29 3b  , (off_t)nByte);
17e90 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
17ea0 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
17eb0 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 72  o = errno;.    r
17ec0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
17ed0 52 52 5f 54 52 55 4e 43 41 54 45 3b 0a 20 20 7d  RR_TRUNCATE;.  }
17ee0 65 6c 73 65 7b 0a 23 69 66 6e 64 65 66 20 4e 44  else{.#ifndef ND
17ef0 45 42 55 47 0a 20 20 20 20 2f 2a 20 49 66 20 77  EBUG.    /* If w
17f00 65 20 61 72 65 20 64 6f 69 6e 67 20 61 20 6e 6f  e are doing a no
17f10 72 6d 61 6c 20 77 72 69 74 65 20 74 6f 20 61 20  rmal write to a 
17f20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 61  database file (a
17f30 73 20 6f 70 70 6f 73 65 64 20 74 6f 0a 20 20 20  s opposed to.   
17f40 20 2a 2a 20 64 6f 69 6e 67 20 61 20 68 6f 74 2d   ** doing a hot-
17f50 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b  journal rollback
17f60 20 6f 72 20 61 20 77 72 69 74 65 20 74 6f 20 73   or a write to s
17f70 6f 6d 65 20 66 69 6c 65 20 6f 74 68 65 72 20 74  ome file other t
17f80 68 61 6e 20 61 0a 20 20 20 20 2a 2a 20 6e 6f 72  han a.    ** nor
17f90 6d 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c  mal database fil
17fa0 65 29 20 61 6e 64 20 77 65 20 74 72 75 6e 63 61  e) and we trunca
17fb0 74 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20 7a  te the file to z
17fc0 65 72 6f 20 6c 65 6e 67 74 68 2c 0a 20 20 20 20  ero length,.    
17fd0 2a 2a 20 74 68 61 74 20 65 66 66 65 63 74 69 76  ** that effectiv
17fe0 65 6c 79 20 75 70 64 61 74 65 73 20 74 68 65 20  ely updates the 
17ff0 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 2e 20  change counter. 
18000 20 54 68 69 73 20 6d 69 67 68 74 20 68 61 70 70   This might happ
18010 65 6e 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 72  en.    ** when r
18020 65 73 74 6f 72 69 6e 67 20 61 20 64 61 74 61 62  estoring a datab
18030 61 73 65 20 75 73 69 6e 67 20 74 68 65 20 62 61  ase using the ba
18040 63 6b 75 70 20 41 50 49 20 66 72 6f 6d 20 61 20  ckup API from a 
18050 7a 65 72 6f 2d 6c 65 6e 67 74 68 0a 20 20 20 20  zero-length.    
18060 2a 2a 20 73 6f 75 72 63 65 2e 0a 20 20 20 20 2a  ** source..    *
18070 2f 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d  /.    if( pFile-
18080 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 26  >inNormalWrite &
18090 26 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20  & nByte==0 ){.  
180a0 20 20 20 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73      pFile->trans
180b0 43 6e 74 72 43 68 6e 67 20 3d 20 31 3b 0a 20 20  CntrChng = 1;.  
180c0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
180d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
180e0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  ;.  }.}../*.** D
180f0 65 74 65 72 6d 69 6e 65 20 74 68 65 20 63 75 72  etermine the cur
18100 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 61 20 66  rent size of a f
18110 69 6c 65 20 69 6e 20 62 79 74 65 73 0a 2a 2f 0a  ile in bytes.*/.
18120 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 46  static int unixF
18130 69 6c 65 53 69 7a 65 28 73 71 6c 69 74 65 33 5f  ileSize(sqlite3_
18140 66 69 6c 65 20 2a 69 64 2c 20 69 36 34 20 2a 70  file *id, i64 *p
18150 53 69 7a 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b  Size){.  int rc;
18160 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 20 62  .  struct stat b
18170 75 66 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64  uf;.  assert( id
18180 20 29 3b 0a 20 20 72 63 20 3d 20 66 73 74 61 74   );.  rc = fstat
18190 28 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29  (((unixFile*)id)
181a0 2d 3e 68 2c 20 26 62 75 66 29 3b 0a 20 20 53 69  ->h, &buf);.  Si
181b0 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
181c0 63 3d 31 20 29 3b 0a 20 20 69 66 28 20 72 63 21  c=1 );.  if( rc!
181d0 3d 30 20 29 7b 0a 20 20 20 20 28 28 75 6e 69 78  =0 ){.    ((unix
181e0 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45  File*)id)->lastE
181f0 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
18200 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
18210 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a 20 20 7d  IOERR_FSTAT;.  }
18220 0a 20 20 2a 70 53 69 7a 65 20 3d 20 62 75 66 2e  .  *pSize = buf.
18230 73 74 5f 73 69 7a 65 3b 0a 0a 20 20 2f 2a 20 57  st_size;..  /* W
18240 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61 20 7a 65  hen opening a ze
18250 72 6f 2d 73 69 7a 65 20 64 61 74 61 62 61 73 65  ro-size database
18260 2c 20 74 68 65 20 66 69 6e 64 49 6e 6f 64 65 49  , the findInodeI
18270 6e 66 6f 28 29 20 70 72 6f 63 65 64 75 72 65 0a  nfo() procedure.
18280 20 20 2a 2a 20 77 72 69 74 65 73 20 61 20 73 69    ** writes a si
18290 6e 67 6c 65 20 62 79 74 65 20 69 6e 74 6f 20 74  ngle byte into t
182a0 68 61 74 20 66 69 6c 65 20 69 6e 20 6f 72 64 65  hat file in orde
182b0 72 20 74 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64  r to work around
182c0 20 61 20 62 75 67 0a 20 20 2a 2a 20 69 6e 20 74   a bug.  ** in t
182d0 68 65 20 4f 53 2d 58 20 6d 73 64 6f 73 20 66 69  he OS-X msdos fi
182e0 6c 65 73 79 73 74 65 6d 2e 20 20 49 6e 20 6f 72  lesystem.  In or
182f0 64 65 72 20 74 6f 20 61 76 6f 69 64 20 70 72 6f  der to avoid pro
18300 62 6c 65 6d 73 20 77 69 74 68 20 75 70 70 65 72  blems with upper
18310 0a 20 20 2a 2a 20 6c 61 79 65 72 73 2c 20 77 65  .  ** layers, we
18320 20 6e 65 65 64 20 74 6f 20 72 65 70 6f 72 74 20   need to report 
18330 74 68 69 73 20 66 69 6c 65 20 73 69 7a 65 20 61  this file size a
18340 73 20 7a 65 72 6f 20 65 76 65 6e 20 74 68 6f 75  s zero even thou
18350 67 68 20 69 74 20 69 73 0a 20 20 2a 2a 20 72 65  gh it is.  ** re
18360 61 6c 6c 79 20 31 2e 20 20 20 54 69 63 6b 65 74  ally 1.   Ticket
18370 20 23 33 32 36 30 2e 0a 20 20 2a 2f 0a 20 20 69   #3260..  */.  i
18380 66 28 20 2a 70 53 69 7a 65 3d 3d 31 20 29 20 2a  f( *pSize==1 ) *
18390 70 53 69 7a 65 20 3d 20 30 3b 0a 0a 0a 20 20 72  pSize = 0;...  r
183a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
183b0 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 45  .}..#if SQLITE_E
183c0 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
183d0 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f  YLE && defined(_
183e0 5f 41 50 50 4c 45 5f 5f 29 0a 2f 2a 0a 2a 2a 20  _APPLE__)./*.** 
183f0 48 61 6e 64 6c 65 72 20 66 6f 72 20 70 72 6f 78  Handler for prox
18400 79 2d 6c 6f 63 6b 69 6e 67 20 66 69 6c 65 2d 63  y-locking file-c
18410 6f 6e 74 72 6f 6c 20 76 65 72 62 73 2e 20 20 44  ontrol verbs.  D
18420 65 66 69 6e 65 64 20 62 65 6c 6f 77 20 69 6e 20  efined below in 
18430 74 68 65 0a 2a 2a 20 70 72 6f 78 79 69 6e 67 20  the.** proxying 
18440 6c 6f 63 6b 69 6e 67 20 64 69 76 69 73 69 6f 6e  locking division
18450 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
18460 70 72 6f 78 79 46 69 6c 65 43 6f 6e 74 72 6f 6c  proxyFileControl
18470 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 69  (sqlite3_file*,i
18480 6e 74 2c 76 6f 69 64 2a 29 3b 0a 23 65 6e 64 69  nt,void*);.#endi
18490 66 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 66  f../* .** This f
184a0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
184b0 64 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20  d to handle the 
184c0 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a  SQLITE_FCNTL_SIZ
184d0 45 5f 48 49 4e 54 20 0a 2a 2a 20 66 69 6c 65 2d  E_HINT .** file-
184e0 63 6f 6e 74 72 6f 6c 20 6f 70 65 72 61 74 69 6f  control operatio
184f0 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  n..**.** If the 
18500 75 73 65 72 20 68 61 73 20 63 6f 6e 66 69 67 75  user has configu
18510 72 65 64 20 61 20 63 68 75 6e 6b 2d 73 69 7a 65  red a chunk-size
18520 20 66 6f 72 20 74 68 69 73 20 66 69 6c 65 2c 20   for this file, 
18530 69 74 20 63 6f 75 6c 64 20 62 65 0a 2a 2a 20 74  it could be.** t
18540 68 61 74 20 74 68 65 20 66 69 6c 65 20 6e 65 65  hat the file nee
18550 64 73 20 74 6f 20 62 65 20 65 78 74 65 6e 64 65  ds to be extende
18560 64 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2e  d at this point.
18570 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 0a   Otherwise, the.
18580 2a 2a 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  ** SQLITE_FCNTL_
18590 53 49 5a 45 5f 48 49 4e 54 20 6f 70 65 72 61 74  SIZE_HINT operat
185a0 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66  ion is a no-op f
185b0 6f 72 20 55 6e 69 78 2e 0a 2a 2f 0a 73 74 61 74  or Unix..*/.stat
185c0 69 63 20 69 6e 74 20 66 63 6e 74 6c 53 69 7a 65  ic int fcntlSize
185d0 48 69 6e 74 28 75 6e 69 78 46 69 6c 65 20 2a 70  Hint(unixFile *p
185e0 46 69 6c 65 2c 20 69 36 34 20 6e 42 79 74 65 29  File, i64 nByte)
185f0 7b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 73  {.  if( pFile->s
18600 7a 43 68 75 6e 6b 20 29 7b 0a 20 20 20 20 69 36  zChunk ){.    i6
18610 34 20 6e 53 69 7a 65 3b 20 20 20 20 20 20 20 20  4 nSize;        
18620 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
18630 65 71 75 69 72 65 64 20 66 69 6c 65 20 73 69 7a  equired file siz
18640 65 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20  e */.    struct 
18650 73 74 61 74 20 62 75 66 3b 20 20 20 20 20 20 20  stat buf;       
18660 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74         /* Used t
18670 6f 20 68 6f 6c 64 20 72 65 74 75 72 6e 20 76 61  o hold return va
18680 6c 75 65 73 20 6f 66 20 66 73 74 61 74 28 29 20  lues of fstat() 
18690 2a 2f 0a 20 20 20 0a 20 20 20 20 69 66 28 20 66  */.   .    if( f
186a0 73 74 61 74 28 70 46 69 6c 65 2d 3e 68 2c 20 26  stat(pFile->h, &
186b0 62 75 66 29 20 29 20 72 65 74 75 72 6e 20 53 51  buf) ) return SQ
186c0 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54  LITE_IOERR_FSTAT
186d0 3b 0a 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20 28  ;..    nSize = (
186e0 28 6e 42 79 74 65 2b 70 46 69 6c 65 2d 3e 73 7a  (nByte+pFile->sz
186f0 43 68 75 6e 6b 2d 31 29 20 2f 20 70 46 69 6c 65  Chunk-1) / pFile
18700 2d 3e 73 7a 43 68 75 6e 6b 29 20 2a 20 70 46 69  ->szChunk) * pFi
18710 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3b 0a 20 20 20  le->szChunk;.   
18720 20 69 66 28 20 6e 53 69 7a 65 3e 28 69 36 34 29   if( nSize>(i64)
18730 62 75 66 2e 73 74 5f 73 69 7a 65 20 29 7b 0a 23  buf.st_size ){.#
18740 69 66 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f  if defined(HAVE_
18750 50 4f 53 49 58 5f 46 41 4c 4c 4f 43 41 54 45 29  POSIX_FALLOCATE)
18760 20 26 26 20 48 41 56 45 5f 50 4f 53 49 58 5f 46   && HAVE_POSIX_F
18770 41 4c 4c 4f 43 41 54 45 0a 20 20 20 20 20 20 69  ALLOCATE.      i
18780 66 28 20 70 6f 73 69 78 5f 66 61 6c 6c 6f 63 61  f( posix_falloca
18790 74 65 28 70 46 69 6c 65 2d 3e 68 2c 20 62 75 66  te(pFile->h, buf
187a0 2e 73 74 5f 73 69 7a 65 2c 20 6e 53 69 7a 65 2d  .st_size, nSize-
187b0 62 75 66 2e 73 74 5f 73 69 7a 65 29 20 29 7b 0a  buf.st_size) ){.
187c0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
187d0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54  QLITE_IOERR_WRIT
187e0 45 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6c 73 65  E;.      }.#else
187f0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
18800 20 4f 53 20 64 6f 65 73 20 6e 6f 74 20 68 61 76   OS does not hav
18810 65 20 70 6f 73 69 78 5f 66 61 6c 6c 6f 63 61 74  e posix_fallocat
18820 65 28 29 2c 20 66 61 6b 65 20 69 74 2e 20 46 69  e(), fake it. Fi
18830 72 73 74 20 75 73 65 0a 20 20 20 20 20 20 2a 2a  rst use.      **
18840 20 66 74 72 75 6e 63 61 74 65 28 29 20 74 6f 20   ftruncate() to 
18850 73 65 74 20 74 68 65 20 66 69 6c 65 20 73 69 7a  set the file siz
18860 65 2c 20 74 68 65 6e 20 77 72 69 74 65 20 61 20  e, then write a 
18870 73 69 6e 67 6c 65 20 62 79 74 65 20 74 6f 0a 20  single byte to. 
18880 20 20 20 20 20 2a 2a 20 74 68 65 20 6c 61 73 74       ** the last
18890 20 62 79 74 65 20 69 6e 20 65 61 63 68 20 62 6c   byte in each bl
188a0 6f 63 6b 20 77 69 74 68 69 6e 20 74 68 65 20 65  ock within the e
188b0 78 74 65 6e 64 65 64 20 72 65 67 69 6f 6e 2e 20  xtended region. 
188c0 54 68 69 73 0a 20 20 20 20 20 20 2a 2a 20 69 73  This.      ** is
188d0 20 74 68 65 20 73 61 6d 65 20 74 65 63 68 6e 69   the same techni
188e0 71 75 65 20 75 73 65 64 20 62 79 20 67 6c 69 62  que used by glib
188f0 63 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 70  c to implement p
18900 6f 73 69 78 5f 66 61 6c 6c 6f 63 61 74 65 28 29  osix_fallocate()
18910 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20 73 79 73  .      ** on sys
18920 74 65 6d 73 20 74 68 61 74 20 64 6f 20 6e 6f 74  tems that do not
18930 20 68 61 76 65 20 61 20 72 65 61 6c 20 66 61 6c   have a real fal
18940 6c 6f 63 61 74 65 28 29 20 73 79 73 74 65 6d 20  locate() system 
18950 63 61 6c 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  call..      */. 
18960 20 20 20 20 20 69 6e 74 20 6e 42 6c 6b 20 3d 20       int nBlk = 
18970 62 75 66 2e 73 74 5f 62 6c 6b 73 69 7a 65 3b 20  buf.st_blksize; 
18980 20 2f 2a 20 46 69 6c 65 2d 73 79 73 74 65 6d 20   /* File-system 
18990 62 6c 6f 63 6b 20 73 69 7a 65 20 2a 2f 0a 20 20  block size */.  
189a0 20 20 20 20 69 36 34 20 69 57 72 69 74 65 3b 20      i64 iWrite; 
189b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
189c0 2f 2a 20 4e 65 78 74 20 6f 66 66 73 65 74 20 74  /* Next offset t
189d0 6f 20 77 72 69 74 65 20 74 6f 20 2a 2f 0a 20 20  o write to */.  
189e0 20 20 20 20 69 6e 74 20 6e 57 72 69 74 65 3b 20      int nWrite; 
189f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18a00 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65 20  /* Return value 
18a10 66 72 6f 6d 20 73 65 65 6b 41 6e 64 57 72 69 74  from seekAndWrit
18a20 65 28 29 20 2a 2f 0a 0a 20 20 20 20 20 20 69 66  e() */..      if
18a30 28 20 66 74 72 75 6e 63 61 74 65 28 70 46 69 6c  ( ftruncate(pFil
18a40 65 2d 3e 68 2c 20 6e 53 69 7a 65 29 20 29 7b 0a  e->h, nSize) ){.
18a50 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c          pFile->l
18a60 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  astErrno = errno
18a70 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
18a80 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52   SQLITE_IOERR_TR
18a90 55 4e 43 41 54 45 3b 0a 20 20 20 20 20 20 7d 0a  UNCATE;.      }.
18aa0 20 20 20 20 20 20 69 57 72 69 74 65 20 3d 20 28        iWrite = (
18ab0 28 62 75 66 2e 73 74 5f 73 69 7a 65 20 2b 20 32  (buf.st_size + 2
18ac0 2a 6e 42 6c 6b 20 2d 20 31 29 2f 6e 42 6c 6b 29  *nBlk - 1)/nBlk)
18ad0 2a 6e 42 6c 6b 2d 31 3b 0a 20 20 20 20 20 20 64  *nBlk-1;.      d
18ae0 6f 20 7b 0a 20 20 20 20 20 20 20 20 6e 57 72 69  o {.        nWri
18af0 74 65 20 3d 20 73 65 65 6b 41 6e 64 57 72 69 74  te = seekAndWrit
18b00 65 28 70 46 69 6c 65 2c 20 69 57 72 69 74 65 2c  e(pFile, iWrite,
18b10 20 22 22 2c 20 31 29 3b 0a 20 20 20 20 20 20 20   "", 1);.       
18b20 20 69 57 72 69 74 65 20 2b 3d 20 6e 42 6c 6b 3b   iWrite += nBlk;
18b30 0a 20 20 20 20 20 20 7d 20 77 68 69 6c 65 28 20  .      } while( 
18b40 6e 57 72 69 74 65 3d 3d 31 20 26 26 20 69 57 72  nWrite==1 && iWr
18b50 69 74 65 3c 6e 53 69 7a 65 20 29 3b 0a 20 20 20  ite<nSize );.   
18b60 20 20 20 69 66 28 20 6e 57 72 69 74 65 21 3d 31     if( nWrite!=1
18b70 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
18b80 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b 0a 23 65  _IOERR_WRITE;.#e
18b90 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ndif.    }.  }..
18ba0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
18bb0 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 28 53 51 4c 49  OK;.}..#if (SQLI
18bc0 54 45 5f 45 4e 41 42 4c 45 5f 41 50 50 4c 45 5f  TE_ENABLE_APPLE_
18bd0 53 50 49 3e 30 29 20 26 26 20 64 65 66 69 6e 65  SPI>0) && define
18be0 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 23 69 6e  d(__APPLE__).#in
18bf0 63 6c 75 64 65 20 22 73 71 6c 69 74 65 33 5f 70  clude "sqlite3_p
18c00 72 69 76 61 74 65 2e 68 22 0a 23 69 6e 63 6c 75  rivate.h".#inclu
18c10 64 65 20 3c 63 6f 70 79 66 69 6c 65 2e 68 3e 0a  de <copyfile.h>.
18c20 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 44 62  static int getDb
18c30 50 61 74 68 46 6f 72 55 6e 69 78 46 69 6c 65 28  PathForUnixFile(
18c40 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c  unixFile *pFile,
18c50 20 63 68 61 72 20 2a 64 62 50 61 74 68 29 3b 0a   char *dbPath);.
18c60 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e  #endif../*.** In
18c70 66 6f 72 6d 61 74 69 6f 6e 20 61 6e 64 20 63 6f  formation and co
18c80 6e 74 72 6f 6c 20 6f 66 20 61 6e 20 6f 70 65 6e  ntrol of an open
18c90 20 66 69 6c 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f   file handle..*/
18ca0 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
18cb0 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 73 71 6c 69  FileControl(sqli
18cc0 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
18cd0 74 20 6f 70 2c 20 76 6f 69 64 20 2a 70 41 72 67  t op, void *pArg
18ce0 29 7b 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20  ){.  switch( op 
18cf0 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  ){.    case SQLI
18d00 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b 53 54 41  TE_FCNTL_LOCKSTA
18d10 54 45 3a 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e  TE: {.      *(in
18d20 74 2a 29 70 41 72 67 20 3d 20 28 28 75 6e 69 78  t*)pArg = ((unix
18d30 46 69 6c 65 2a 29 69 64 29 2d 3e 65 46 69 6c 65  File*)id)->eFile
18d40 4c 6f 63 6b 3b 0a 20 20 20 20 20 20 72 65 74 75  Lock;.      retu
18d50 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
18d60 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
18d70 49 54 45 5f 4c 41 53 54 5f 45 52 52 4e 4f 3a 20  ITE_LAST_ERRNO: 
18d80 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a 29 70  {.      *(int*)p
18d90 41 72 67 20 3d 20 28 28 75 6e 69 78 46 69 6c 65  Arg = ((unixFile
18da0 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f  *)id)->lastErrno
18db0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
18dc0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
18dd0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
18de0 46 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a 45  FCNTL_CHUNK_SIZE
18df0 3a 20 7b 0a 20 20 20 20 20 20 28 28 75 6e 69 78  : {.      ((unix
18e00 46 69 6c 65 2a 29 69 64 29 2d 3e 73 7a 43 68 75  File*)id)->szChu
18e10 6e 6b 20 3d 20 2a 28 69 6e 74 20 2a 29 70 41 72  nk = *(int *)pAr
18e20 67 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  g;.      return 
18e30 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
18e40 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
18e50 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54  _FCNTL_SIZE_HINT
18e60 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  : {.      return
18e70 20 66 63 6e 74 6c 53 69 7a 65 48 69 6e 74 28 28   fcntlSizeHint((
18e80 75 6e 69 78 46 69 6c 65 20 2a 29 69 64 2c 20 2a  unixFile *)id, *
18e90 28 69 36 34 20 2a 29 70 41 72 67 29 3b 0a 20 20  (i64 *)pArg);.  
18ea0 20 20 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42    }.#ifndef NDEB
18eb0 55 47 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61  UG.    /* The pa
18ec0 67 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20 6d  ger calls this m
18ed0 65 74 68 6f 64 20 74 6f 20 73 69 67 6e 61 6c 20  ethod to signal 
18ee0 74 68 61 74 20 69 74 20 68 61 73 20 64 6f 6e 65  that it has done
18ef0 0a 20 20 20 20 2a 2a 20 61 20 72 6f 6c 6c 62 61  .    ** a rollba
18f00 63 6b 20 61 6e 64 20 74 68 61 74 20 74 68 65 20  ck and that the 
18f10 64 61 74 61 62 61 73 65 20 69 73 20 74 68 65 72  database is ther
18f20 65 66 6f 72 65 20 75 6e 63 68 61 6e 67 65 64 20  efore unchanged 
18f30 61 6e 64 0a 20 20 20 20 2a 2a 20 69 74 20 68 65  and.    ** it he
18f40 6e 63 65 20 69 74 20 69 73 20 4f 4b 20 66 6f 72  nce it is OK for
18f50 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
18f60 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20   change counter 
18f70 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20 75 6e 63  to be.    ** unc
18f80 68 61 6e 67 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  hanged..    */. 
18f90 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
18fa0 43 4e 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45  CNTL_DB_UNCHANGE
18fb0 44 3a 20 7b 0a 20 20 20 20 20 20 28 28 75 6e 69  D: {.      ((uni
18fc0 78 46 69 6c 65 2a 29 69 64 29 2d 3e 64 62 55 70  xFile*)id)->dbUp
18fd0 64 61 74 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  date = 0;.      
18fe0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
18ff0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23  ;.    }.#endif.#
19000 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
19010 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26  _LOCKING_STYLE &
19020 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  & defined(__APPL
19030 45 5f 5f 29 0a 20 20 20 20 63 61 73 65 20 53 51  E__).    case SQ
19040 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f  LITE_SET_LOCKPRO
19050 58 59 46 49 4c 45 3a 0a 20 20 20 20 63 61 73 65  XYFILE:.    case
19060 20 53 51 4c 49 54 45 5f 47 45 54 5f 4c 4f 43 4b   SQLITE_GET_LOCK
19070 50 52 4f 58 59 46 49 4c 45 3a 20 7b 0a 20 20 20  PROXYFILE: {.   
19080 20 20 20 72 65 74 75 72 6e 20 70 72 6f 78 79 46     return proxyF
19090 69 6c 65 43 6f 6e 74 72 6f 6c 28 69 64 2c 6f 70  ileControl(id,op
190a0 2c 70 41 72 67 29 3b 0a 20 20 20 20 7d 0a 23 65  ,pArg);.    }.#e
190b0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45  ndif /* SQLITE_E
190c0 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
190d0 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f  YLE && defined(_
190e0 5f 41 50 50 4c 45 5f 5f 29 20 2a 2f 0a 23 69 66  _APPLE__) */.#if
190f0 20 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f   (SQLITE_ENABLE_
19100 41 50 50 4c 45 5f 53 50 49 3e 30 29 20 26 26 20  APPLE_SPI>0) && 
19110 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
19120 5f 29 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  _).    case SQLI
19130 54 45 5f 54 52 55 4e 43 41 54 45 5f 44 41 54 41  TE_TRUNCATE_DATA
19140 42 41 53 45 3a 20 7b 0a 20 20 20 20 20 20 75 6e  BASE: {.      un
19150 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
19160 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
19170 20 20 20 20 20 69 6e 74 20 74 72 63 20 3d 20 53       int trc = S
19180 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
19190 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  int eFileLock = 
191a0 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
191b0 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d  ;.      int rc =
191c0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
191d0 20 20 63 68 61 72 20 6a 50 61 74 68 5b 4d 41 58    char jPath[MAX
191e0 50 41 54 48 4c 45 4e 2b 39 5d 3b 0a 20 20 20 20  PATHLEN+9];.    
191f0 20 20 73 69 7a 65 5f 74 20 6a 4c 65 6e 3b 0a 20    size_t jLen;. 
19200 20 20 20 20 20 0a 20 20 20 20 20 20 69 66 28 20       .      if( 
19210 65 46 69 6c 65 4c 6f 63 6b 3c 53 51 4c 49 54 45  eFileLock<SQLITE
19220 5f 4c 4f 43 4b 5f 53 48 41 52 45 44 20 29 7b 0a  _LOCK_SHARED ){.
19230 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 46 69          rc = pFi
19240 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f  le->pMethod->xLo
19250 63 6b 28 69 64 2c 20 53 51 4c 49 54 45 5f 4c 4f  ck(id, SQLITE_LO
19260 43 4b 5f 53 48 41 52 45 44 29 3b 0a 20 20 20 20  CK_SHARED);.    
19270 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 72    }.      if( !r
19280 63 20 26 26 20 65 46 69 6c 65 4c 6f 63 6b 3c 53  c && eFileLock<S
19290 51 4c 49 54 45 5f 4c 4f 43 4b 5f 45 58 43 4c 55  QLITE_LOCK_EXCLU
192a0 53 49 56 45 20 29 7b 0a 20 20 20 20 20 20 20 20  SIVE ){.        
192b0 72 63 20 3d 20 70 46 69 6c 65 2d 3e 70 4d 65 74  rc = pFile->pMet
192c0 68 6f 64 2d 3e 78 4c 6f 63 6b 28 69 64 2c 20 53  hod->xLock(id, S
192d0 51 4c 49 54 45 5f 4c 4f 43 4b 5f 45 58 43 4c 55  QLITE_LOCK_EXCLU
192e0 53 49 56 45 29 3b 0a 20 20 20 20 20 20 7d 0a 20  SIVE);.      }. 
192f0 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
19300 20 20 20 20 20 20 20 69 66 28 20 70 46 69 6c 65         if( pFile
19310 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3e 20 65 46  ->eFileLock > eF
19320 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20  ileLock ){.     
19330 20 20 20 20 20 70 46 69 6c 65 2d 3e 70 4d 65 74       pFile->pMet
19340 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28 69 64 2c  hod->xUnlock(id,
19350 20 65 46 69 6c 65 4c 6f 63 6b 29 3b 0a 20 20 20   eFileLock);.   
19360 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
19370 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
19380 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 70 46 69  }.      rc = pFi
19390 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 54 72  le->pMethod->xTr
193a0 75 6e 63 61 74 65 28 69 64 2c 20 28 28 70 46 69  uncate(id, ((pFi
193b0 6c 65 2d 3e 66 73 46 6c 61 67 73 20 26 20 53 51  le->fsFlags & SQ
193c0 4c 49 54 45 5f 46 53 46 4c 41 47 53 5f 49 53 5f  LITE_FSFLAGS_IS_
193d0 4d 53 44 4f 53 29 20 21 3d 20 30 29 20 3f 20 31  MSDOS) != 0) ? 1
193e0 4c 20 3a 20 30 4c 29 3b 0a 20 20 20 20 20 20 69  L : 0L);.      i
193f0 66 28 20 21 72 63 20 26 26 20 28 53 51 4c 49 54  f( !rc && (SQLIT
19400 45 5f 4f 4b 3d 3d 67 65 74 44 62 50 61 74 68 46  E_OK==getDbPathF
19410 6f 72 55 6e 69 78 46 69 6c 65 28 70 46 69 6c 65  orUnixFile(pFile
19420 2c 20 6a 50 61 74 68 29 29 20 29 7b 0a 20 20 20  , jPath)) ){.   
19430 20 20 20 20 20 6a 4c 65 6e 20 3d 20 73 74 72 6c       jLen = strl
19440 63 61 74 28 6a 50 61 74 68 2c 20 22 2d 6a 6f 75  cat(jPath, "-jou
19450 72 6e 61 6c 22 2c 20 4d 41 58 50 41 54 48 4c 45  rnal", MAXPATHLE
19460 4e 2b 39 29 3b 0a 20 20 20 20 20 20 20 20 69 66  N+9);.        if
19470 28 20 6a 4c 65 6e 20 3c 20 4d 41 58 50 41 54 48  ( jLen < MAXPATH
19480 4c 45 4e 2b 39 20 29 7b 0a 20 20 20 20 20 20 20  LEN+9 ){.       
19490 20 20 20 69 6e 74 20 6a 66 64 20 3d 20 6f 70 65     int jfd = ope
194a0 6e 28 6a 50 61 74 68 2c 20 4f 5f 54 52 55 4e 43  n(jPath, O_TRUNC
194b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
194c0 20 28 6a 66 64 20 3d 3d 20 2d 31 29 20 29 7b 0a   (jfd == -1) ){.
194d0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
194e0 20 65 72 72 6e 6f 21 3d 45 4e 4f 45 4e 54 20 29   errno!=ENOENT )
194f0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
19500 70 65 72 72 6f 72 28 6a 50 61 74 68 29 3b 0a 20  perror(jPath);. 
19510 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
19520 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a         } else {.
19530 20 20 20 20 20 20 20 20 20 20 20 20 66 73 79 6e              fsyn
19540 63 28 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20  c(jfd);.        
19550 20 20 20 20 63 6c 6f 73 65 28 6a 66 64 29 3b 0a      close(jfd);.
19560 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
19570 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
19580 65 7b 0a 20 20 20 20 20 20 20 20 74 72 63 3d 72  e{.        trc=r
19590 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  c;.      }.     
195a0 20 69 66 28 20 21 74 72 63 20 29 7b 0a 20 20 20   if( !trc ){.   
195b0 20 20 20 20 20 74 72 63 20 3d 20 70 46 69 6c 65       trc = pFile
195c0 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 53 79 6e 63  ->pMethod->xSync
195d0 28 69 64 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43  (id, SQLITE_SYNC
195e0 5f 46 55 4c 4c 29 3b 0a 20 20 20 20 20 20 7d 0a  _FULL);.      }.
195f0 20 20 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d        if( pFile-
19600 3e 65 46 69 6c 65 4c 6f 63 6b 20 3e 20 65 46 69  >eFileLock > eFi
19610 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20  leLock ){.      
19620 20 20 69 6e 74 20 75 6e 6c 6f 63 6b 52 43 20 3d    int unlockRC =
19630 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d   pFile->pMethod-
19640 3e 78 55 6e 6c 6f 63 6b 28 69 64 2c 20 53 51 4c  >xUnlock(id, SQL
19650 49 54 45 5f 4c 4f 43 4b 5f 53 48 41 52 45 44 29  ITE_LOCK_SHARED)
19660 3b 0a 20 20 20 20 20 20 20 20 69 66 20 28 21 72  ;.        if (!r
19670 63 29 20 72 63 20 3d 20 75 6e 6c 6f 63 6b 52 43  c) rc = unlockRC
19680 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
19690 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  if( pFile->eFile
196a0 4c 6f 63 6b 20 3e 20 65 46 69 6c 65 4c 6f 63 6b  Lock > eFileLock
196b0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
196c0 75 6e 6c 6f 63 6b 52 43 20 3d 20 70 46 69 6c 65  unlockRC = pFile
196d0 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f  ->pMethod->xUnlo
196e0 63 6b 28 69 64 2c 20 53 51 4c 49 54 45 5f 4c 4f  ck(id, SQLITE_LO
196f0 43 4b 5f 4e 4f 4e 45 29 3b 0a 20 20 20 20 20 20  CK_NONE);.      
19700 20 20 69 66 20 28 21 72 63 29 20 72 63 20 3d 20    if (!rc) rc = 
19710 75 6e 6c 6f 63 6b 52 43 3b 0a 20 20 20 20 20 20  unlockRC;.      
19720 7d 0a 20 20 20 20 20 20 69 66 28 20 74 72 63 20  }.      if( trc 
19730 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
19740 6e 20 74 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  n trc;.      }. 
19750 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
19760 20 20 20 20 7d 0a 20 20 20 20 20 20 0a 20 20 20      }.      .   
19770 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52 45 50   case SQLITE_REP
19780 4c 41 43 45 5f 44 41 54 41 42 41 53 45 3a 20 7b  LACE_DATABASE: {
19790 0a 20 20 20 20 20 20 75 6e 69 78 46 69 6c 65 20  .      unixFile 
197a0 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
197b0 6c 65 2a 29 69 64 3b 0a 20 20 20 20 20 20 69 6e  le*)id;.      in
197c0 74 20 74 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  t trc = SQLITE_O
197d0 4b 3b 0a 20 20 20 20 20 20 69 6e 74 20 65 46 69  K;.      int eFi
197e0 6c 65 4c 6f 63 6b 20 3d 20 70 46 69 6c 65 2d 3e  leLock = pFile->
197f0 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 20  eFileLock;.     
19800 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
19810 5f 4f 4b 3b 0a 20 20 20 20 20 20 63 68 61 72 20  _OK;.      char 
19820 6a 50 61 74 68 5b 4d 41 58 50 41 54 48 4c 45 4e  jPath[MAXPATHLEN
19830 2b 39 5d 3b 0a 20 20 20 20 20 20 73 69 7a 65 5f  +9];.      size_
19840 74 20 6a 4c 65 6e 3b 0a 20 20 20 20 20 20 73 71  t jLen;.      sq
19850 6c 69 74 65 33 20 2a 73 72 63 64 62 20 3d 20 28  lite3 *srcdb = (
19860 73 71 6c 69 74 65 33 20 2a 29 70 41 72 67 3b 0a  sqlite3 *)pArg;.
19870 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 53 72        Btree *pSr
19880 63 42 74 72 65 65 20 3d 20 4e 55 4c 4c 3b 0a 20  cBtree = NULL;. 
19890 20 20 20 20 20 69 6e 74 20 65 53 72 63 46 69 6c       int eSrcFil
198a0 65 4c 6f 63 6b 20 3d 20 53 51 4c 49 54 45 5f 4c  eLock = SQLITE_L
198b0 4f 43 4b 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20  OCK_NONE;.      
198c0 69 6e 74 20 73 72 63 4c 6f 63 6b 52 43 20 3d 20  int srcLockRC = 
198d0 2d 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  -1;.      sqlite
198e0 33 5f 66 69 6c 65 20 2a 73 72 63 5f 66 69 6c 65  3_file *src_file
198f0 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 75   = NULL;.      u
19900 6e 69 78 46 69 6c 65 20 2a 70 53 72 63 46 69 6c  nixFile *pSrcFil
19910 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 20 20  e = NULL;.      
19920 0a 20 20 20 20 20 20 69 66 28 20 21 73 71 6c 69  .      if( !sqli
19930 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b  te3SafetyCheckOk
19940 28 73 72 63 64 62 29 20 29 7b 0a 20 20 20 20 20  (srcdb) ){.     
19950 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
19960 5f 4d 49 53 55 53 45 3b 0a 20 20 20 20 20 20 7d  _MISUSE;.      }
19970 0a 20 20 20 20 20 20 69 66 28 20 65 46 69 6c 65  .      if( eFile
19980 4c 6f 63 6b 3c 53 51 4c 49 54 45 5f 4c 4f 43 4b  Lock<SQLITE_LOCK
19990 5f 53 48 41 52 45 44 20 29 7b 0a 20 20 20 20 20  _SHARED ){.     
199a0 20 20 20 72 63 20 3d 20 70 46 69 6c 65 2d 3e 70     rc = pFile->p
199b0 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 69 64  Method->xLock(id
199c0 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 53 48  , SQLITE_LOCK_SH
199d0 41 52 45 44 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ARED);.      }. 
199e0 20 20 20 20 20 69 66 28 20 21 72 63 20 26 26 20       if( !rc && 
199f0 65 46 69 6c 65 4c 6f 63 6b 3c 53 51 4c 49 54 45  eFileLock<SQLITE
19a00 5f 4c 4f 43 4b 5f 45 58 43 4c 55 53 49 56 45 20  _LOCK_EXCLUSIVE 
19a10 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
19a20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e  pFile->pMethod->
19a30 78 4c 6f 63 6b 28 69 64 2c 20 53 51 4c 49 54 45  xLock(id, SQLITE
19a40 5f 4c 4f 43 4b 5f 45 58 43 4c 55 53 49 56 45 29  _LOCK_EXCLUSIVE)
19a50 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
19a60 69 66 28 20 21 72 63 20 29 7b 0a 20 20 20 20 20  if( !rc ){.     
19a70 20 20 20 2f 2a 20 67 65 74 20 74 68 65 20 73 72     /* get the sr
19a80 63 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  c file descripto
19a90 72 20 61 64 68 65 72 69 6e 67 20 74 6f 20 74 68  r adhering to th
19aa0 65 20 64 62 20 73 74 72 75 63 74 20 61 63 63 65  e db struct acce
19ab0 73 73 20 72 75 6c 65 73 20 0a 20 20 20 20 20 20  ss rules .      
19ac0 20 20 20 2a 2a 20 74 68 69 73 20 63 6f 64 65 20     ** this code 
19ad0 69 73 20 6d 6f 64 65 6c 65 64 20 61 66 74 65 72  is modeled after
19ae0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f   sqlite3_file_co
19af0 6e 74 72 6f 6c 28 29 20 69 6e 20 6d 61 69 6e 2e  ntrol() in main.
19b00 63 0a 20 20 20 20 20 20 20 20 20 2a 2f 20 0a 20  c.         */ . 
19b10 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d         sqlite3_m
19b20 75 74 65 78 5f 65 6e 74 65 72 28 73 72 63 64 62  utex_enter(srcdb
19b30 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20  ->mutex);.      
19b40 20 20 69 66 28 20 73 72 63 64 62 2d 3e 6e 44 62    if( srcdb->nDb
19b50 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >0 ){.          
19b60 70 53 72 63 42 74 72 65 65 20 3d 20 73 72 63 64  pSrcBtree = srcd
19b70 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 3b 0a 20  b->aDb[0].pBt;. 
19b80 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
19b90 20 69 66 28 20 70 53 72 63 42 74 72 65 65 20 29   if( pSrcBtree )
19ba0 7b 0a 20 20 20 20 20 20 20 20 20 20 50 61 67 65  {.          Page
19bb0 72 20 2a 70 53 72 63 50 61 67 65 72 3b 0a 20 20  r *pSrcPager;.  
19bc0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42          sqlite3B
19bd0 74 72 65 65 45 6e 74 65 72 28 70 53 72 63 42 74  treeEnter(pSrcBt
19be0 72 65 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ree);.          
19bf0 70 53 72 63 50 61 67 65 72 20 3d 20 73 71 6c 69  pSrcPager = sqli
19c00 74 65 33 42 74 72 65 65 50 61 67 65 72 28 70 53  te3BtreePager(pS
19c10 72 63 42 74 72 65 65 29 3b 0a 20 20 20 20 20 20  rcBtree);.      
19c20 20 20 20 20 61 73 73 65 72 74 28 20 70 53 72 63      assert( pSrc
19c30 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 20 20  Pager!=0 );.    
19c40 20 20 20 20 20 20 73 72 63 5f 66 69 6c 65 20 3d        src_file =
19c50 20 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c   sqlite3PagerFil
19c60 65 28 70 53 72 63 50 61 67 65 72 29 3b 0a 20 20  e(pSrcPager);.  
19c70 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
19c80 73 72 63 5f 66 69 6c 65 21 3d 30 20 29 3b 0a 20  src_file!=0 );. 
19c90 20 20 20 20 20 20 20 20 20 69 66 28 20 73 72 63           if( src
19ca0 5f 66 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 73 20  _file->pMethods 
19cb0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
19cc0 53 72 63 46 69 6c 65 20 3d 20 28 75 6e 69 78 46  SrcFile = (unixF
19cd0 69 6c 65 20 2a 29 73 72 63 5f 66 69 6c 65 3b 0a  ile *)src_file;.
19ce0 20 20 20 20 20 20 20 20 20 20 20 20 65 53 72 63              eSrc
19cf0 46 69 6c 65 4c 6f 63 6b 20 3d 20 70 53 72 63 46  FileLock = pSrcF
19d00 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3b 0a  ile->eFileLock;.
19d10 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
19d20 65 53 72 63 46 69 6c 65 4c 6f 63 6b 3c 53 51 4c  eSrcFileLock<SQL
19d30 49 54 45 5f 4c 4f 43 4b 5f 53 48 41 52 45 44 20  ITE_LOCK_SHARED 
19d40 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
19d50 20 72 63 20 3d 20 70 53 72 63 46 69 6c 65 2d 3e   rc = pSrcFile->
19d60 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 73  pMethod->xLock(s
19d70 72 63 5f 66 69 6c 65 2c 20 53 51 4c 49 54 45 5f  rc_file, SQLITE_
19d80 4c 4f 43 4b 5f 53 48 41 52 45 44 29 3b 0a 20 20  LOCK_SHARED);.  
19d90 20 20 20 20 20 20 20 20 20 20 20 20 73 72 63 4c              srcL
19da0 6f 63 6b 52 43 20 3d 20 72 63 3b 20 2f 2a 20 53  ockRC = rc; /* S
19db0 51 4c 49 54 45 5f 4f 4b 20 6d 65 61 6e 73 20 77  QLITE_OK means w
19dc0 65 20 6e 65 65 64 20 74 6f 20 75 6e 6c 6f 63 6b  e need to unlock
19dd0 20 6c 61 74 65 72 20 2a 2f 0a 20 20 20 20 20 20   later */.      
19de0 20 20 20 20 20 20 7d 20 65 6c 73 65 20 69 66 28        } else if(
19df0 20 65 53 72 63 46 69 6c 65 4c 6f 63 6b 3d 3d 53   eSrcFileLock==S
19e00 51 4c 49 54 45 5f 4c 4f 43 4b 5f 45 58 43 4c 55  QLITE_LOCK_EXCLU
19e10 53 49 56 45 20 29 7b 0a 20 20 20 20 20 20 20 20  SIVE ){.        
19e20 20 20 20 20 20 20 2f 2a 20 69 66 20 74 68 65 20        /* if the 
19e30 73 72 63 20 64 61 74 61 62 61 73 65 20 68 61 73  src database has
19e40 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
19e50 63 6b 2c 20 76 65 72 69 66 79 20 74 68 61 74 20  ck, verify that 
19e60 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  the.            
19e70 20 20 20 2a 2a 20 69 74 20 64 6f 65 73 6e 27 74     ** it doesn't
19e80 20 68 61 76 65 20 61 20 6a 6f 75 72 6e 61 6c 20   have a journal 
19e90 66 69 6c 65 20 77 69 74 68 20 6f 70 65 6e 20 74  file with open t
19ea0 72 61 6e 73 61 63 74 69 6f 6e 73 20 0a 20 20 20  ransactions .   
19eb0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20              */. 
19ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
19ed0 20 67 65 74 44 62 50 61 74 68 46 6f 72 55 6e 69   getDbPathForUni
19ee0 78 46 69 6c 65 28 70 53 72 63 46 69 6c 65 2c 20  xFile(pSrcFile, 
19ef0 6a 50 61 74 68 29 20 29 7b 0a 20 20 20 20 20 20  jPath) ){.      
19f00 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
19f10 51 4c 49 54 45 5f 49 4e 54 45 52 4e 41 4c 3b 0a  QLITE_INTERNAL;.
19f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 65                }e
19f30 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
19f40 20 20 20 20 20 6a 4c 65 6e 20 3d 20 73 74 72 6c       jLen = strl
19f50 63 61 74 28 6a 50 61 74 68 2c 20 22 2d 6a 6f 75  cat(jPath, "-jou
19f60 72 6e 61 6c 22 2c 20 4d 41 58 50 41 54 48 4c 45  rnal", MAXPATHLE
19f70 4e 2b 39 29 3b 0a 20 20 20 20 20 20 20 20 20 20  N+9);.          
19f80 20 20 20 20 20 20 69 66 28 20 6a 4c 65 6e 20 3c        if( jLen <
19f90 20 4d 41 58 50 41 54 48 4c 45 4e 2b 39 20 29 7b   MAXPATHLEN+9 ){
19fa0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19fb0 20 20 20 69 6e 74 20 6a 66 64 20 3d 20 6f 70 65     int jfd = ope
19fc0 6e 28 6a 50 61 74 68 2c 20 4f 5f 52 44 4f 4e 4c  n(jPath, O_RDONL
19fd0 59 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  Y);.            
19fe0 20 20 20 20 20 20 69 66 28 20 6a 66 64 3d 3d 2d        if( jfd==-
19ff0 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  1 ){.           
1a000 20 20 20 20 20 20 20 20 20 69 66 28 20 65 72 72           if( err
1a010 6e 6f 21 3d 45 4e 4f 45 4e 54 20 29 7b 0a 20 20  no!=ENOENT ){.  
1a020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a030 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
1a040 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
1a050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a060 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1a070 49 4f 45 52 52 3b 0a 20 20 20 20 20 20 20 20 20  IOERR;.         
1a080 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
1a090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
1a0a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1a0b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 66 20            /* if 
1a0c0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73  the journal exis
1a0d0 74 73 20 65 6e 73 75 72 65 20 74 68 65 72 65 27  ts ensure there'
1a0e0 73 20 6e 6f 20 70 65 6e 64 69 6e 67 20 0a 20 20  s no pending .  
1a0f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a100 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
1a110 6e 20 62 79 20 63 68 65 63 6b 69 6e 67 20 74 68  n by checking th
1a120 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
1a130 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
1a140 20 20 20 20 20 20 20 20 63 68 61 72 20 6d 61 67          char mag
1a150 69 63 5b 38 5d 3b 0a 20 20 20 20 20 20 20 20 20  ic[8];.         
1a160 20 20 20 20 20 20 20 20 20 20 20 73 73 69 7a 65             ssize
1a170 5f 74 20 72 6c 65 6e 20 3d 20 70 72 65 61 64 28  _t rlen = pread(
1a180 6a 66 64 2c 20 6d 61 67 69 63 2c 20 38 2c 20 30  jfd, magic, 8, 0
1a190 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
1a1a0 20 20 20 20 20 20 20 69 66 28 20 72 6c 65 6e 3c         if( rlen<
1a1b0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
1a1c0 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
1a1d0 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72  ->lastErrno = er
1a1e0 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 20  rno;.           
1a1f0 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
1a200 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20  SQLITE_IOERR;.  
1a210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a220 20 20 7d 65 6c 73 65 20 69 66 28 20 72 6c 65 6e    }else if( rlen
1a230 3d 3d 38 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==8 ){.         
1a240 20 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61               cha
1a250 72 20 74 65 73 74 5b 38 5d 20 3d 20 7b 27 5c 30  r test[8] = {'\0
1a260 27 2c 27 5c 30 27 2c 27 5c 30 27 2c 27 5c 30 27  ','\0','\0','\0'
1a270 2c 27 5c 30 27 2c 27 5c 30 27 2c 27 5c 30 27 2c  ,'\0','\0','\0',
1a280 27 5c 30 27 7d 3b 0a 20 20 20 20 20 20 20 20 20  '\0'};.         
1a290 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
1a2a0 20 6d 65 6d 63 6d 70 28 6d 61 67 69 63 2c 74 65   memcmp(magic,te
1a2b0 73 74 2c 38 29 20 29 7b 0a 20 20 20 20 20 20 20  st,8) ){.       
1a2c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a2d0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4c 4f 43   rc = SQLITE_LOC
1a2e0 4b 45 44 3b 0a 20 20 20 20 20 20 20 20 20 20 20  KED;.           
1a2f0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
1a300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a310 20 7d 65 6c 73 65 20 69 66 28 20 72 6c 65 6e 21   }else if( rlen!
1a320 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
1a330 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
1a340 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e 41 4c   SQLITE_INTERNAL
1a350 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1a360 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1a370 20 20 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73              clos
1a380 65 28 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20  e(jfd);.        
1a390 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1a3a0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
1a3b0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
1a3c0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1a3d0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1a3e0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
1a3f0 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20 20  LITE_MISUSE;.   
1a400 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1a410 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
1a420 20 20 20 20 20 20 20 20 20 69 66 28 20 73 72 63           if( src
1a430 4c 6f 63 6b 52 43 3d 3d 53 51 4c 49 54 45 5f 4f  LockRC==SQLITE_O
1a440 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
1a450 20 20 20 70 53 72 63 46 69 6c 65 2d 3e 70 4d 65     pSrcFile->pMe
1a460 74 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28 73 72  thod->xUnlock(sr
1a470 63 5f 66 69 6c 65 2c 20 65 53 72 63 46 69 6c 65  c_file, eSrcFile
1a480 4c 6f 63 6b 29 3b 0a 20 20 20 20 20 20 20 20 20  Lock);.         
1a490 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
1a4a0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
1a4b0 76 65 28 70 53 72 63 42 74 72 65 65 29 3b 0a 20  ve(pSrcBtree);. 
1a4c0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1a4d0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
1a4e0 20 70 53 72 63 46 69 6c 65 3d 3d 4e 55 4c 4c 20   pSrcFile==NULL 
1a4f0 7c 7c 20 28 70 53 72 63 46 69 6c 65 2d 3e 68 3c  || (pSrcFile->h<
1a500 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  0) ){.          
1a510 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45  rc = SQLITE_INTE
1a520 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20 20 20  RNAL;.          
1a530 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
1a540 61 76 65 28 73 72 63 64 62 2d 3e 6d 75 74 65 78  ave(srcdb->mutex
1a550 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1a560 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
1a570 63 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  c ){.        /* 
1a580 75 6e 72 6f 6c 6c 20 73 74 61 74 65 20 63 68 61  unroll state cha
1a590 6e 67 65 73 20 61 6e 64 20 72 65 74 75 72 6e 20  nges and return 
1a5a0 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20  error code */.  
1a5b0 20 20 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d        if( pFile-
1a5c0 3e 65 46 69 6c 65 4c 6f 63 6b 20 3e 20 65 46 69  >eFileLock > eFi
1a5d0 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20  leLock ){.      
1a5e0 20 20 20 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68      pFile->pMeth
1a5f0 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28 69 64 2c 20  od->xUnlock(id, 
1a600 65 46 69 6c 65 4c 6f 63 6b 29 3b 0a 20 20 20 20  eFileLock);.    
1a610 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65      }.        re
1a620 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
1a630 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
1a640 20 62 6f 74 68 20 64 61 74 61 62 61 73 65 73 20   both databases 
1a650 61 72 65 20 6c 6f 63 6b 65 64 20 61 70 70 72 6f  are locked appro
1a660 70 72 69 61 74 65 6c 79 2c 20 63 6f 70 79 20 66  priately, copy f
1a670 69 6c 65 20 64 61 74 61 0a 20 20 20 20 20 20 20  ile data.       
1a680 20 20 2a 2a 20 61 6e 64 20 74 68 65 6e 20 75 6e    ** and then un
1a690 72 6f 6c 6c 20 74 68 65 20 6c 6f 63 6b 73 20 77  roll the locks w
1a6a0 65 20 61 64 64 65 64 2e 20 0a 20 20 20 20 20 20  e added. .      
1a6b0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f     */.        co
1a6c0 70 79 66 69 6c 65 5f 73 74 61 74 65 5f 74 20 73  pyfile_state_t s
1a6d0 3b 0a 20 20 20 20 20 20 20 20 0a 20 20 20 20 20  ;.        .     
1a6e0 20 20 20 73 20 3d 20 63 6f 70 79 66 69 6c 65 5f     s = copyfile_
1a6f0 73 74 61 74 65 5f 61 6c 6c 6f 63 28 29 3b 0a 20  state_alloc();. 
1a700 20 20 20 20 20 20 20 69 66 28 20 66 63 6f 70 79         if( fcopy
1a710 66 69 6c 65 28 70 53 72 63 46 69 6c 65 2d 3e 68  file(pSrcFile->h
1a720 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 73 2c 20 43  , pFile->h, s, C
1a730 4f 50 59 46 49 4c 45 5f 41 4c 4c 29 20 29 7b 0a  OPYFILE_ALL) ){.
1a740 20 20 20 20 20 20 20 20 20 20 73 77 69 74 63 68            switch
1a750 28 65 72 72 6e 6f 29 20 7b 0a 20 20 20 20 20 20  (errno) {.      
1a760 20 20 20 20 20 20 63 61 73 65 20 45 4e 4f 4d 45        case ENOME
1a770 4d 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  M:.             
1a780 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
1a790 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  EM;.            
1a7a0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
1a7b0 20 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20       default:.  
1a7c0 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
1a7d0 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e 41 4c   SQLITE_INTERNAL
1a7e0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1a7f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1a800 63 6f 70 79 66 69 6c 65 5f 73 74 61 74 65 5f 66  copyfile_state_f
1a810 72 65 65 28 73 29 3b 0a 20 20 20 20 20 20 20 20  ree(s);.        
1a820 69 66 28 20 73 72 63 4c 6f 63 6b 52 43 3d 3d 53  if( srcLockRC==S
1a830 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1a840 20 20 20 20 20 20 70 53 72 63 46 69 6c 65 2d 3e        pSrcFile->
1a850 70 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b  pMethod->xUnlock
1a860 28 73 72 63 5f 66 69 6c 65 2c 20 65 53 72 63 46  (src_file, eSrcF
1a870 69 6c 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 20 20  ileLock);.      
1a880 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
1a890 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 53  te3BtreeLeave(pS
1a8a0 72 63 42 74 72 65 65 29 3b 0a 20 20 20 20 20 20  rcBtree);.      
1a8b0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
1a8c0 6c 65 61 76 65 28 73 72 63 64 62 2d 3e 6d 75 74  leave(srcdb->mut
1a8d0 65 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ex);.      }.   
1a8e0 20 20 20 0a 20 20 20 20 20 20 69 66 28 20 21 72     .      if( !r
1a8f0 63 20 26 26 20 28 53 51 4c 49 54 45 5f 4f 4b 3d  c && (SQLITE_OK=
1a900 3d 67 65 74 44 62 50 61 74 68 46 6f 72 55 6e 69  =getDbPathForUni
1a910 78 46 69 6c 65 28 70 46 69 6c 65 2c 20 6a 50 61  xFile(pFile, jPa
1a920 74 68 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20  th)) ){.        
1a930 6a 4c 65 6e 20 3d 20 73 74 72 6c 63 61 74 28 6a  jLen = strlcat(j
1a940 50 61 74 68 2c 20 22 2d 6a 6f 75 72 6e 61 6c 22  Path, "-journal"
1a950 2c 20 4d 41 58 50 41 54 48 4c 45 4e 2b 39 29 3b  , MAXPATHLEN+9);
1a960 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 4c 65  .        if( jLe
1a970 6e 20 3c 20 4d 41 58 50 41 54 48 4c 45 4e 2b 39  n < MAXPATHLEN+9
1a980 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
1a990 74 20 6a 66 64 20 3d 20 6f 70 65 6e 28 6a 50 61  t jfd = open(jPa
1a9a0 74 68 2c 20 4f 5f 54 52 55 4e 43 29 3b 0a 20 20  th, O_TRUNC);.  
1a9b0 20 20 20 20 20 20 20 20 69 66 28 20 28 6a 66 64          if( (jfd
1a9c0 20 3d 3d 20 2d 31 29 20 29 7b 0a 20 20 20 20 20   == -1) ){.     
1a9d0 20 20 20 20 20 20 20 69 66 20 28 20 65 72 72 6e         if ( errn
1a9e0 6f 21 3d 45 4e 4f 45 4e 54 20 29 7b 0a 20 20 20  o!=ENOENT ){.   
1a9f0 20 20 20 20 20 20 20 20 20 20 20 70 65 72 72 6f             perro
1aa00 72 28 6a 50 61 74 68 29 3b 0a 20 20 20 20 20 20  r(jPath);.      
1aa10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1aa20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
1aa30 20 20 20 20 20 20 20 66 73 79 6e 63 28 6a 66 64         fsync(jfd
1aa40 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  );.            c
1aa50 6c 6f 73 65 28 6a 66 64 29 3b 0a 20 20 20 20 20  lose(jfd);.     
1aa60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
1aa70 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1aa80 20 20 20 20 20 20 74 72 63 3d 72 63 3b 0a 20 20        trc=rc;.  
1aa90 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
1aaa0 21 74 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  !trc ){.        
1aab0 74 72 63 20 3d 20 70 46 69 6c 65 2d 3e 70 4d 65  trc = pFile->pMe
1aac0 74 68 6f 64 2d 3e 78 53 79 6e 63 28 69 64 2c 20  thod->xSync(id, 
1aad0 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c  SQLITE_SYNC_FULL
1aae0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1aaf0 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c   if( pFile->eFil
1ab00 65 4c 6f 63 6b 20 3e 20 65 46 69 6c 65 4c 6f 63  eLock > eFileLoc
1ab10 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  k ){.        int
1ab20 20 75 6e 6c 6f 63 6b 52 43 20 3d 20 70 46 69 6c   unlockRC = pFil
1ab30 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c  e->pMethod->xUnl
1ab40 6f 63 6b 28 69 64 2c 20 53 51 4c 49 54 45 5f 4c  ock(id, SQLITE_L
1ab50 4f 43 4b 5f 53 48 41 52 45 44 29 3b 0a 20 20 20  OCK_SHARED);.   
1ab60 20 20 20 20 20 69 66 20 28 21 72 63 29 20 72 63       if (!rc) rc
1ab70 20 3d 20 75 6e 6c 6f 63 6b 52 43 3b 0a 20 20 20   = unlockRC;.   
1ab80 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
1ab90 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
1aba0 3e 20 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20  > eFileLock ){. 
1abb0 20 20 20 20 20 20 20 69 6e 74 20 75 6e 6c 6f 63         int unloc
1abc0 6b 52 43 20 3d 20 70 46 69 6c 65 2d 3e 70 4d 65  kRC = pFile->pMe
1abd0 74 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28 69 64  thod->xUnlock(id
1abe0 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 4e 4f  , SQLITE_LOCK_NO
1abf0 4e 45 29 3b 0a 20 20 20 20 20 20 20 20 69 66 20  NE);.        if 
1ac00 28 21 72 63 29 20 72 63 20 3d 20 75 6e 6c 6f 63  (!rc) rc = unloc
1ac10 6b 52 43 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  kRC;.      }.   
1ac20 20 20 20 69 66 28 20 74 72 63 20 29 7b 0a 20 20     if( trc ){.  
1ac30 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 72 63        return trc
1ac40 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1ac50 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
1ac60 0a 23 65 6e 64 69 66 20 2f 2a 20 28 53 51 4c 49  .#endif /* (SQLI
1ac70 54 45 5f 45 4e 41 42 4c 45 5f 41 50 50 4c 45 5f  TE_ENABLE_APPLE_
1ac80 53 50 49 3e 30 29 20 26 26 20 64 65 66 69 6e 65  SPI>0) && define
1ac90 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 2a 2f 0a  d(__APPLE__) */.
1aca0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
1acb0 49 54 45 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a  ITE_ERROR;.}../*
1acc0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73  .** Return the s
1acd0 65 63 74 6f 72 20 73 69 7a 65 20 69 6e 20 62 79  ector size in by
1ace0 74 65 73 20 6f 66 20 74 68 65 20 75 6e 64 65 72  tes of the under
1acf0 6c 79 69 6e 67 20 62 6c 6f 63 6b 20 64 65 76 69  lying block devi
1ad00 63 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73 70  ce for.** the sp
1ad10 65 63 69 66 69 65 64 20 66 69 6c 65 2e 20 54 68  ecified file. Th
1ad20 69 73 20 69 73 20 61 6c 6d 6f 73 74 20 61 6c 77  is is almost alw
1ad30 61 79 73 20 35 31 32 20 62 79 74 65 73 2c 20 62  ays 512 bytes, b
1ad40 75 74 20 6d 61 79 20 62 65 0a 2a 2a 20 6c 61 72  ut may be.** lar
1ad50 67 65 72 20 66 6f 72 20 73 6f 6d 65 20 64 65 76  ger for some dev
1ad60 69 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69  ices..**.** SQLi
1ad70 74 65 20 63 6f 64 65 20 61 73 73 75 6d 65 73 20  te code assumes 
1ad80 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 61  this function ca
1ad90 6e 6e 6f 74 20 66 61 69 6c 2e 20 49 74 20 61 6c  nnot fail. It al
1ada0 73 6f 20 61 73 73 75 6d 65 73 20 74 68 61 74 0a  so assumes that.
1adb0 2a 2a 20 69 66 20 74 77 6f 20 66 69 6c 65 73 20  ** if two files 
1adc0 61 72 65 20 63 72 65 61 74 65 64 20 69 6e 20 74  are created in t
1add0 68 65 20 73 61 6d 65 20 66 69 6c 65 2d 73 79 73  he same file-sys
1ade0 74 65 6d 20 64 69 72 65 63 74 6f 72 79 20 28 69  tem directory (i
1adf0 2e 65 2e 0a 2a 2a 20 61 20 64 61 74 61 62 61 73  .e..** a databas
1ae00 65 20 61 6e 64 20 69 74 73 20 6a 6f 75 72 6e 61  e and its journa
1ae10 6c 20 66 69 6c 65 29 20 74 68 61 74 20 74 68 65  l file) that the
1ae20 20 73 65 63 74 6f 72 20 73 69 7a 65 20 77 69 6c   sector size wil
1ae30 6c 20 62 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65  l be the.** same
1ae40 20 66 6f 72 20 62 6f 74 68 2e 0a 2a 2f 0a 73 74   for both..*/.st
1ae50 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 65 63  atic int unixSec
1ae60 74 6f 72 53 69 7a 65 28 73 71 6c 69 74 65 33 5f  torSize(sqlite3_
1ae70 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64 29 7b 0a  file *NotUsed){.
1ae80 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
1ae90 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72  ER(NotUsed);.  r
1aea0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 45 46  eturn SQLITE_DEF
1aeb0 41 55 4c 54 5f 53 45 43 54 4f 52 5f 53 49 5a 45  AULT_SECTOR_SIZE
1aec0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
1aed0 6e 20 74 68 65 20 64 65 76 69 63 65 20 63 68 61  n the device cha
1aee0 72 61 63 74 65 72 69 73 74 69 63 73 20 66 6f 72  racteristics for
1aef0 20 74 68 65 20 66 69 6c 65 2e 20 54 68 69 73 20   the file. This 
1af00 69 73 20 61 6c 77 61 79 73 20 30 20 66 6f 72 20  is always 0 for 
1af10 75 6e 69 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  unix..*/.static 
1af20 69 6e 74 20 75 6e 69 78 44 65 76 69 63 65 43 68  int unixDeviceCh
1af30 61 72 61 63 74 65 72 69 73 74 69 63 73 28 73 71  aracteristics(sq
1af40 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55  lite3_file *NotU
1af50 73 65 64 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  sed){.  UNUSED_P
1af60 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
1af70 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  );.  return 0;.}
1af80 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
1af90 5f 4f 4d 49 54 5f 57 41 4c 0a 0a 0a 2f 2a 0a 2a  _OMIT_WAL.../*.*
1afa0 2a 20 4f 62 6a 65 63 74 20 75 73 65 64 20 74 6f  * Object used to
1afb0 20 72 65 70 72 65 73 65 6e 74 20 61 6e 20 73 68   represent an sh
1afc0 61 72 65 64 20 6d 65 6d 6f 72 79 20 62 75 66 66  ared memory buff
1afd0 65 72 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  er.  .**.** When
1afe0 20 6d 75 6c 74 69 70 6c 65 20 74 68 72 65 61 64   multiple thread
1aff0 73 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65 20  s all reference 
1b000 74 68 65 20 73 61 6d 65 20 77 61 6c 2d 69 6e 64  the same wal-ind
1b010 65 78 2c 20 65 61 63 68 20 74 68 72 65 61 64 0a  ex, each thread.
1b020 2a 2a 20 68 61 73 20 69 74 73 20 6f 77 6e 20 75  ** has its own u
1b030 6e 69 78 53 68 6d 20 6f 62 6a 65 63 74 2c 20 62  nixShm object, b
1b040 75 74 20 74 68 65 79 20 61 6c 6c 20 70 6f 69 6e  ut they all poin
1b050 74 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 69 6e  t to a single in
1b060 73 74 61 6e 63 65 0a 2a 2a 20 6f 66 20 74 68 69  stance.** of thi
1b070 73 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62  s unixShmNode ob
1b080 6a 65 63 74 2e 20 20 49 6e 20 6f 74 68 65 72 20  ject.  In other 
1b090 77 6f 72 64 73 2c 20 65 61 63 68 20 77 61 6c 2d  words, each wal-
1b0a0 69 6e 64 65 78 20 69 73 20 6f 70 65 6e 65 64 0a  index is opened.
1b0b0 2a 2a 20 6f 6e 6c 79 20 6f 6e 63 65 20 70 65 72  ** only once per
1b0c0 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20   process..**.** 
1b0d0 45 61 63 68 20 75 6e 69 78 53 68 6d 4e 6f 64 65  Each unixShmNode
1b0e0 20 6f 62 6a 65 63 74 20 69 73 20 63 6f 6e 6e 65   object is conne
1b0f0 63 74 65 64 20 74 6f 20 61 20 73 69 6e 67 6c 65  cted to a single
1b100 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f   unixInodeInfo o
1b110 62 6a 65 63 74 2e 0a 2a 2a 20 57 65 20 63 6f 75  bject..** We cou
1b120 6c 64 20 63 6f 61 6c 65 73 63 65 20 74 68 69 73  ld coalesce this
1b130 20 6f 62 6a 65 63 74 20 69 6e 74 6f 20 75 6e 69   object into uni
1b140 78 49 6e 6f 64 65 49 6e 66 6f 2c 20 62 75 74 20  xInodeInfo, but 
1b150 74 68 61 74 20 77 6f 75 6c 64 20 6d 65 61 6e 0a  that would mean.
1b160 2a 2a 20 65 76 65 72 79 20 6f 70 65 6e 20 66 69  ** every open fi
1b170 6c 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  le that does not
1b180 20 75 73 65 20 73 68 61 72 65 64 20 6d 65 6d 6f   use shared memo
1b190 72 79 20 28 69 6e 20 6f 74 68 65 72 20 77 6f 72  ry (in other wor
1b1a0 64 73 2c 20 6d 6f 73 74 0a 2a 2a 20 6f 70 65 6e  ds, most.** open
1b1b0 20 66 69 6c 65 73 29 20 77 6f 75 6c 64 20 68 61   files) would ha
1b1c0 76 65 20 74 6f 20 63 61 72 72 79 20 61 72 6f 75  ve to carry arou
1b1d0 6e 64 20 74 68 69 73 20 65 78 74 72 61 20 69 6e  nd this extra in
1b1e0 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 53 6f 0a 2a  formation.  So.*
1b1f0 2a 20 74 68 65 20 75 6e 69 78 49 6e 6f 64 65 49  * the unixInodeI
1b200 6e 66 6f 20 6f 62 6a 65 63 74 20 63 6f 6e 74 61  nfo object conta
1b210 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ins a pointer to
1b220 20 74 68 69 73 20 75 6e 69 78 53 68 6d 4e 6f 64   this unixShmNod
1b230 65 20 6f 62 6a 65 63 74 0a 2a 2a 20 61 6e 64 20  e object.** and 
1b240 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  the unixShmNode 
1b250 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61 74 65  object is create
1b260 64 20 6f 6e 6c 79 20 77 68 65 6e 20 6e 65 65 64  d only when need
1b270 65 64 2e 0a 2a 2a 0a 2a 2a 20 75 6e 69 78 4d 75  ed..**.** unixMu
1b280 74 65 78 48 65 6c 64 28 29 20 6d 75 73 74 20 62  texHeld() must b
1b290 65 20 74 72 75 65 20 77 68 65 6e 20 63 72 65 61  e true when crea
1b2a0 74 69 6e 67 20 6f 72 20 64 65 73 74 72 6f 79 69  ting or destroyi
1b2b0 6e 67 0a 2a 2a 20 74 68 69 73 20 6f 62 6a 65 63  ng.** this objec
1b2c0 74 20 6f 72 20 77 68 69 6c 65 20 72 65 61 64 69  t or while readi
1b2d0 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68  ng or writing th
1b2e0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c  e following fiel
1b2f0 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 6e  ds:.**.**      n
1b300 52 65 66 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f  Ref.**.** The fo
1b310 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 20 61  llowing fields a
1b320 72 65 20 72 65 61 64 2d 6f 6e 6c 79 20 61 66 74  re read-only aft
1b330 65 72 20 74 68 65 20 6f 62 6a 65 63 74 20 69 73  er the object is
1b340 20 63 72 65 61 74 65 64 3a 0a 2a 2a 20 0a 2a 2a   created:.** .**
1b350 20 20 20 20 20 20 66 69 64 0a 2a 2a 20 20 20 20        fid.**    
1b360 20 20 7a 46 69 6c 65 6e 61 6d 65 0a 2a 2a 0a 2a    zFilename.**.*
1b370 2a 20 45 69 74 68 65 72 20 75 6e 69 78 53 68 6d  * Either unixShm
1b380 4e 6f 64 65 2e 6d 75 74 65 78 20 6d 75 73 74 20  Node.mutex must 
1b390 62 65 20 68 65 6c 64 20 6f 72 20 75 6e 69 78 53  be held or unixS
1b3a0 68 6d 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30 20 61  hmNode.nRef==0 a
1b3b0 6e 64 0a 2a 2a 20 75 6e 69 78 4d 75 74 65 78 48  nd.** unixMutexH
1b3c0 65 6c 64 28 29 20 69 73 20 74 72 75 65 20 77 68  eld() is true wh
1b3d0 65 6e 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72  en reading or wr
1b3e0 69 74 69 6e 67 20 61 6e 79 20 6f 74 68 65 72 20  iting any other 
1b3f0 66 69 65 6c 64 0a 2a 2a 20 69 6e 20 74 68 69 73  field.** in this
1b400 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73   structure..*/.s
1b410 74 72 75 63 74 20 75 6e 69 78 53 68 6d 4e 6f 64  truct unixShmNod
1b420 65 20 7b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49  e {.  unixInodeI
1b430 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 20 20 20 20  nfo *pInode;    
1b440 20 2f 2a 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66   /* unixInodeInf
1b450 6f 20 74 68 61 74 20 6f 77 6e 73 20 74 68 69 73  o that owns this
1b460 20 53 48 4d 20 6e 6f 64 65 20 2a 2f 0a 20 20 73   SHM node */.  s
1b470 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75  qlite3_mutex *mu
1b480 74 65 78 3b 20 20 20 20 20 20 2f 2a 20 4d 75 74  tex;      /* Mut
1b490 65 78 20 74 6f 20 61 63 63 65 73 73 20 74 68 69  ex to access thi
1b4a0 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 68  s object */.  ch
1b4b0 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20  ar *zFilename;  
1b4c0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
1b4d0 20 6f 66 20 74 68 65 20 6d 6d 61 70 70 65 64 20   of the mmapped 
1b4e0 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 68 3b  file */.  int h;
1b4f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b500 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 66 69 6c       /* Open fil
1b510 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a  e descriptor */.
1b520 20 20 69 6e 74 20 73 7a 52 65 67 69 6f 6e 3b 20    int szRegion; 
1b530 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b540 53 69 7a 65 20 6f 66 20 73 68 61 72 65 64 2d 6d  Size of shared-m
1b550 65 6d 6f 72 79 20 72 65 67 69 6f 6e 73 20 2a 2f  emory regions */
1b560 0a 20 20 69 6e 74 20 6e 52 65 67 69 6f 6e 3b 20  .  int nRegion; 
1b570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b580 20 53 69 7a 65 20 6f 66 20 61 72 72 61 79 20 61   Size of array a
1b590 70 52 65 67 69 6f 6e 20 2a 2f 0a 20 20 63 68 61  pRegion */.  cha
1b5a0 72 20 2a 2a 61 70 52 65 67 69 6f 6e 3b 20 20 20  r **apRegion;   
1b5b0 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79          /* Array
1b5c0 20 6f 66 20 6d 61 70 70 65 64 20 73 68 61 72 65   of mapped share
1b5d0 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 73  d-memory regions
1b5e0 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20   */.  int nRef; 
1b5f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b600 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e   /* Number of un
1b610 69 78 53 68 6d 20 6f 62 6a 65 63 74 73 20 70 6f  ixShm objects po
1b620 69 6e 74 69 6e 67 20 74 6f 20 74 68 69 73 20 2a  inting to this *
1b630 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 46 69  /.  unixShm *pFi
1b640 72 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f  rst;           /
1b650 2a 20 41 6c 6c 20 75 6e 69 78 53 68 6d 20 6f 62  * All unixShm ob
1b660 6a 65 63 74 73 20 70 6f 69 6e 74 69 6e 67 20 74  jects pointing t
1b670 6f 20 74 68 69 73 20 2a 2f 0a 23 69 66 64 65 66  o this */.#ifdef
1b680 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
1b690 75 38 20 65 78 63 6c 4d 61 73 6b 3b 20 20 20 20  u8 exclMask;    
1b6a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
1b6b0 73 6b 20 6f 66 20 65 78 63 6c 75 73 69 76 65 20  sk of exclusive 
1b6c0 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20  locks held */.  
1b6d0 75 38 20 73 68 61 72 65 64 4d 61 73 6b 3b 20 20  u8 sharedMask;  
1b6e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
1b6f0 73 6b 20 6f 66 20 73 68 61 72 65 64 20 6c 6f 63  sk of shared loc
1b700 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75 38 20  ks held */.  u8 
1b710 6e 65 78 74 53 68 6d 49 64 3b 20 20 20 20 20 20  nextShmId;      
1b720 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20          /* Next 
1b730 61 76 61 69 6c 61 62 6c 65 20 75 6e 69 78 53 68  available unixSh
1b740 6d 2e 69 64 20 76 61 6c 75 65 20 2a 2f 0a 23 65  m.id value */.#e
1b750 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 53  ndif.};../*.** S
1b760 74 72 75 63 74 75 72 65 20 75 73 65 64 20 69 6e  tructure used in
1b770 74 65 72 6e 61 6c 6c 79 20 62 79 20 74 68 69 73  ternally by this
1b780 20 56 46 53 20 74 6f 20 72 65 63 6f 72 64 20 74   VFS to record t
1b790 68 65 20 73 74 61 74 65 20 6f 66 20 61 6e 0a 2a  he state of an.*
1b7a0 2a 20 6f 70 65 6e 20 73 68 61 72 65 64 20 6d 65  * open shared me
1b7b0 6d 6f 72 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  mory connection.
1b7c0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  .**.** The follo
1b7d0 77 69 6e 67 20 66 69 65 6c 64 73 20 61 72 65 20  wing fields are 
1b7e0 69 6e 69 74 69 61 6c 69 7a 65 64 20 77 68 65 6e  initialized when
1b7f0 20 74 68 69 73 20 6f 62 6a 65 63 74 20 69 73 20   this object is 
1b800 63 72 65 61 74 65 64 20 61 6e 64 0a 2a 2a 20 61  created and.** a
1b810 72 65 20 72 65 61 64 2d 6f 6e 6c 79 20 74 68 65  re read-only the
1b820 72 65 61 66 74 65 72 3a 0a 2a 2a 0a 2a 2a 20 20  reafter:.**.**  
1b830 20 20 75 6e 69 78 53 68 6d 2e 70 46 69 6c 65 0a    unixShm.pFile.
1b840 2a 2a 20 20 20 20 75 6e 69 78 53 68 6d 2e 69 64  **    unixShm.id
1b850 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 74 68 65 72  .**.** All other
1b860 20 66 69 65 6c 64 73 20 61 72 65 20 72 65 61 64   fields are read
1b870 2f 77 72 69 74 65 2e 20 20 54 68 65 20 75 6e 69  /write.  The uni
1b880 78 53 68 6d 2e 70 46 69 6c 65 2d 3e 6d 75 74 65  xShm.pFile->mute
1b890 78 20 6d 75 73 74 20 62 65 20 68 65 6c 64 0a 2a  x must be held.*
1b8a0 2a 20 77 68 69 6c 65 20 61 63 63 65 73 73 69 6e  * while accessin
1b8b0 67 20 61 6e 79 20 72 65 61 64 2f 77 72 69 74 65  g any read/write
1b8c0 20 66 69 65 6c 64 73 2e 0a 2a 2f 0a 73 74 72 75   fields..*/.stru
1b8d0 63 74 20 75 6e 69 78 53 68 6d 20 7b 0a 20 20 75  ct unixShm {.  u
1b8e0 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d  nixShmNode *pShm
1b8f0 4e 6f 64 65 3b 20 20 20 20 20 2f 2a 20 54 68 65  Node;     /* The
1b900 20 75 6e 64 65 72 6c 79 69 6e 67 20 75 6e 69 78   underlying unix
1b910 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 2a  ShmNode object *
1b920 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 4e 65  /.  unixShm *pNe
1b930 78 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  xt;            /
1b940 2a 20 4e 65 78 74 20 75 6e 69 78 53 68 6d 20 77  * Next unixShm w
1b950 69 74 68 20 74 68 65 20 73 61 6d 65 20 75 6e 69  ith the same uni
1b960 78 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 75 38  xShmNode */.  u8
1b970 20 68 61 73 4d 75 74 65 78 3b 20 20 20 20 20 20   hasMutex;      
1b980 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
1b990 20 69 66 20 68 6f 6c 64 69 6e 67 20 74 68 65 20   if holding the 
1b9a0 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6d 75 74 65  unixShmNode mute
1b9b0 78 20 2a 2f 0a 20 20 75 31 36 20 73 68 61 72 65  x */.  u16 share
1b9c0 64 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20  dMask;          
1b9d0 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 73 68 61    /* Mask of sha
1b9e0 72 65 64 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a  red locks held *
1b9f0 2f 0a 20 20 75 31 36 20 65 78 63 6c 4d 61 73 6b  /.  u16 exclMask
1ba00 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
1ba10 2a 20 4d 61 73 6b 20 6f 66 20 65 78 63 6c 75 73  * Mask of exclus
1ba20 69 76 65 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a  ive locks held *
1ba30 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
1ba40 44 45 42 55 47 0a 20 20 75 38 20 69 64 3b 20 20  DEBUG.  u8 id;  
1ba50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba60 20 20 20 2f 2a 20 49 64 20 6f 66 20 74 68 69 73     /* Id of this
1ba70 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68   connection with
1ba80 69 6e 20 69 74 73 20 75 6e 69 78 53 68 6d 4e 6f  in its unixShmNo
1ba90 64 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a  de */.#endif.};.
1baa0 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 61 6e 74 73  ./*.** Constants
1bab0 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e   used for lockin
1bac0 67 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49  g.*/.#define UNI
1bad0 58 5f 53 48 4d 5f 42 41 53 45 20 20 20 28 28 32  X_SHM_BASE   ((2
1bae0 32 2b 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f  2+SQLITE_SHM_NLO
1baf0 43 4b 29 2a 34 29 20 20 20 20 20 20 20 20 20 2f  CK)*4)         /
1bb00 2a 20 66 69 72 73 74 20 6c 6f 63 6b 20 62 79 74  * first lock byt
1bb10 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49  e */.#define UNI
1bb20 58 5f 53 48 4d 5f 44 4d 53 20 20 20 20 28 55 4e  X_SHM_DMS    (UN
1bb30 49 58 5f 53 48 4d 5f 42 41 53 45 2b 53 51 4c 49  IX_SHM_BASE+SQLI
1bb40 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 29 20 20 2f  TE_SHM_NLOCK)  /
1bb50 2a 20 64 65 61 64 6d 61 6e 20 73 77 69 74 63 68  * deadman switch
1bb60 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 6c 79   */../*.** Apply
1bb70 20 70 6f 73 69 78 20 61 64 76 69 73 6f 72 79 20   posix advisory 
1bb80 6c 6f 63 6b 73 20 66 6f 72 20 61 6c 6c 20 62 79  locks for all by
1bb90 74 65 73 20 66 72 6f 6d 20 6f 66 73 74 20 74 68  tes from ofst th
1bba0 72 6f 75 67 68 20 6f 66 73 74 2b 6e 2d 31 2e 0a  rough ofst+n-1..
1bbb0 2a 2a 0a 2a 2a 20 4c 6f 63 6b 73 20 62 6c 6f 63  **.** Locks bloc
1bbc0 6b 20 69 66 20 74 68 65 20 6d 61 73 6b 20 69 73  k if the mask is
1bbd0 20 65 78 61 63 74 6c 79 20 55 4e 49 58 5f 53 48   exactly UNIX_SH
1bbe0 4d 5f 43 20 61 6e 64 20 61 72 65 20 6e 6f 6e 2d  M_C and are non-
1bbf0 62 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 6f 74 68 65  blocking.** othe
1bc00 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  rwise..*/.static
1bc10 20 69 6e 74 20 75 6e 69 78 53 68 6d 53 79 73 74   int unixShmSyst
1bc20 65 6d 4c 6f 63 6b 28 0a 20 20 75 6e 69 78 53 68  emLock(.  unixSh
1bc30 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 2c  mNode *pShmNode,
1bc40 20 2f 2a 20 41 70 70 6c 79 20 6c 6f 63 6b 73 20   /* Apply locks 
1bc50 74 6f 20 74 68 69 73 20 6f 70 65 6e 20 73 68 61  to this open sha
1bc60 72 65 64 2d 6d 65 6d 6f 72 79 20 73 65 67 6d 65  red-memory segme
1bc70 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 6f 63 6b  nt */.  int lock
1bc80 54 79 70 65 2c 20 20 20 20 20 20 20 20 20 20 2f  Type,          /
1bc90 2a 20 46 5f 55 4e 4c 43 4b 2c 20 46 5f 52 44 4c  * F_UNLCK, F_RDL
1bca0 43 4b 2c 20 6f 72 20 46 5f 57 52 4c 43 4b 20 2a  CK, or F_WRLCK *
1bcb0 2f 0a 20 20 69 6e 74 20 6f 66 73 74 2c 20 20 20  /.  int ofst,   
1bcc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
1bcd0 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20  rst byte of the 
1bce0 6c 6f 63 6b 69 6e 67 20 72 61 6e 67 65 20 2a 2f  locking range */
1bcf0 0a 20 20 69 6e 74 20 6e 20 20 20 20 20 20 20 20  .  int n        
1bd00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1bd10 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20  ber of bytes to 
1bd20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 73 74 72  lock */.){.  str
1bd30 75 63 74 20 66 6c 6f 63 6b 20 66 3b 20 20 20 20  uct flock f;    
1bd40 20 20 20 2f 2a 20 54 68 65 20 70 6f 73 69 78 20     /* The posix 
1bd50 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 69 6e 67  advisory locking
1bd60 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20   structure */.  
1bd70 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1bd80 4f 4b 3b 20 20 20 2f 2a 20 52 65 73 75 6c 74 20  OK;   /* Result 
1bd90 63 6f 64 65 20 66 6f 72 6d 20 66 63 6e 74 6c 28  code form fcntl(
1bda0 29 20 2a 2f 0a 0a 20 20 2f 2a 20 41 63 63 65 73  ) */..  /* Acces
1bdb0 73 20 74 6f 20 74 68 65 20 75 6e 69 78 53 68 6d  s to the unixShm
1bdc0 4e 6f 64 65 20 6f 62 6a 65 63 74 20 69 73 20 73  Node object is s
1bdd0 65 72 69 61 6c 69 7a 65 64 20 62 79 20 74 68 65  erialized by the
1bde0 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 61 73 73   caller */.  ass
1bdf0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
1be00 65 78 5f 68 65 6c 64 28 70 53 68 6d 4e 6f 64 65  ex_held(pShmNode
1be10 2d 3e 6d 75 74 65 78 29 20 7c 7c 20 70 53 68 6d  ->mutex) || pShm
1be20 4e 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b  Node->nRef==0 );
1be30 0a 0a 20 20 2f 2a 20 53 68 61 72 65 64 20 6c 6f  ..  /* Shared lo
1be40 63 6b 73 20 6e 65 76 65 72 20 73 70 61 6e 20 6d  cks never span m
1be50 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 62 79 74  ore than one byt
1be60 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e  e */.  assert( n
1be70 3d 3d 31 20 7c 7c 20 6c 6f 63 6b 54 79 70 65 21  ==1 || lockType!
1be80 3d 46 5f 52 44 4c 43 4b 20 29 3b 0a 0a 20 20 2f  =F_RDLCK );..  /
1be90 2a 20 4c 6f 63 6b 73 20 61 72 65 20 77 69 74 68  * Locks are with
1bea0 69 6e 20 72 61 6e 67 65 20 2a 2f 0a 20 20 61 73  in range */.  as
1beb0 73 65 72 74 28 20 6e 3e 3d 31 20 26 26 20 6e 3c  sert( n>=1 && n<
1bec0 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b  SQLITE_SHM_NLOCK
1bed0 20 29 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61   );..  /* Initia
1bee0 6c 69 7a 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67  lize the locking
1bef0 20 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20   parameters */. 
1bf00 20 6d 65 6d 73 65 74 28 26 66 2c 20 30 2c 20 73   memset(&f, 0, s
1bf10 69 7a 65 6f 66 28 66 29 29 3b 0a 20 20 66 2e 6c  izeof(f));.  f.l
1bf20 5f 74 79 70 65 20 3d 20 6c 6f 63 6b 54 79 70 65  _type = lockType
1bf30 3b 0a 20 20 66 2e 6c 5f 77 68 65 6e 63 65 20 3d  ;.  f.l_whence =
1bf40 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 66 2e 6c   SEEK_SET;.  f.l
1bf50 5f 73 74 61 72 74 20 3d 20 6f 66 73 74 3b 0a 20  _start = ofst;. 
1bf60 20 66 2e 6c 5f 6c 65 6e 20 3d 20 6e 3b 0a 0a 20   f.l_len = n;.. 
1bf70 20 72 63 20 3d 20 66 63 6e 74 6c 28 70 53 68 6d   rc = fcntl(pShm
1bf80 4e 6f 64 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b  Node->h, F_SETLK
1bf90 2c 20 26 66 29 3b 0a 20 20 72 63 20 3d 20 28 72  , &f);.  rc = (r
1bfa0 63 21 3d 28 2d 31 29 29 20 3f 20 53 51 4c 49 54  c!=(-1)) ? SQLIT
1bfb0 45 5f 4f 4b 20 3a 20 53 51 4c 49 54 45 5f 42 55  E_OK : SQLITE_BU
1bfc0 53 59 3b 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65  SY;..  /* Update
1bfd0 20 74 68 65 20 67 6c 6f 62 61 6c 20 6c 6f 63 6b   the global lock
1bfe0 20 73 74 61 74 65 20 61 6e 64 20 64 6f 20 64 65   state and do de
1bff0 62 75 67 20 74 72 61 63 69 6e 67 20 2a 2f 0a 23  bug tracing */.#
1c000 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
1c010 55 47 0a 20 20 7b 20 75 31 36 20 6d 61 73 6b 3b  UG.  { u16 mask;
1c020 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d  .  OSTRACE(("SHM
1c030 2d 4c 4f 43 4b 20 22 29 29 3b 0a 20 20 6d 61 73  -LOCK "));.  mas
1c040 6b 20 3d 20 28 31 3c 3c 28 6f 66 73 74 2b 6e 29  k = (1<<(ofst+n)
1c050 29 20 2d 20 28 31 3c 3c 6f 66 73 74 29 3b 0a 20  ) - (1<<ofst);. 
1c060 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1c070 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 6c 6f  OK ){.    if( lo
1c080 63 6b 54 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20  ckType==F_UNLCK 
1c090 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  ){.      OSTRACE
1c0a0 28 28 22 75 6e 6c 6f 63 6b 20 25 64 20 6f 6b 22  (("unlock %d ok"
1c0b0 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20 20 20 20  , ofst));.      
1c0c0 70 53 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61  pShmNode->exclMa
1c0d0 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20  sk &= ~mask;.   
1c0e0 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 68 61     pShmNode->sha
1c0f0 72 65 64 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b  redMask &= ~mask
1c100 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
1c110 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 52 44 4c 43  lockType==F_RDLC
1c120 4b 20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41  K ){.      OSTRA
1c130 43 45 28 28 22 72 65 61 64 2d 6c 6f 63 6b 20 25  CE(("read-lock %
1c140 64 20 6f 6b 22 2c 20 6f 66 73 74 29 29 3b 0a 20  d ok", ofst));. 
1c150 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 65       pShmNode->e
1c160 78 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b  xclMask &= ~mask
1c170 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65  ;.      pShmNode
1c180 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 7c 3d 20  ->sharedMask |= 
1c190 6d 61 73 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  mask;.    }else{
1c1a0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c  .      assert( l
1c1b0 6f 63 6b 54 79 70 65 3d 3d 46 5f 57 52 4c 43 4b  ockType==F_WRLCK
1c1c0 20 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43   );.      OSTRAC
1c1d0 45 28 28 22 77 72 69 74 65 2d 6c 6f 63 6b 20 25  E(("write-lock %
1c1e0 64 20 6f 6b 22 2c 20 6f 66 73 74 29 29 3b 0a 20  d ok", ofst));. 
1c1f0 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 65       pShmNode->e
1c200 78 63 6c 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b  xclMask |= mask;
1c210 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  .      pShmNode-
1c220 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 3d 20 7e  >sharedMask &= ~
1c230 6d 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  mask;.    }.  }e
1c240 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 6c 6f 63  lse{.    if( loc
1c250 6b 54 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29  kType==F_UNLCK )
1c260 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  {.      OSTRACE(
1c270 28 22 75 6e 6c 6f 63 6b 20 25 64 20 66 61 69 6c  ("unlock %d fail
1c280 65 64 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20  ed", ofst));.   
1c290 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b 54   }else if( lockT
1c2a0 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a  ype==F_RDLCK ){.
1c2b0 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
1c2c0 72 65 61 64 2d 6c 6f 63 6b 20 66 61 69 6c 65 64  read-lock failed
1c2d0 22 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  "));.    }else{.
1c2e0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 6f        assert( lo
1c2f0 63 6b 54 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20  ckType==F_WRLCK 
1c300 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  );.      OSTRACE
1c310 28 28 22 77 72 69 74 65 2d 6c 6f 63 6b 20 25 64  (("write-lock %d
1c320 20 66 61 69 6c 65 64 22 2c 20 6f 66 73 74 29 29   failed", ofst))
1c330 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 4f 53  ;.    }.  }.  OS
1c340 54 52 41 43 45 28 28 22 20 2d 20 61 66 74 65 72  TRACE((" - after
1c350 77 61 72 64 73 20 25 30 33 78 2c 25 30 33 78 5c  wards %03x,%03x\
1c360 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  n",.           p
1c370 53 68 6d 4e 6f 64 65 2d 3e 73 68 61 72 65 64 4d  ShmNode->sharedM
1c380 61 73 6b 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 65  ask, pShmNode->e
1c390 78 63 6c 4d 61 73 6b 29 29 3b 0a 20 20 7d 0a 23  xclMask));.  }.#
1c3a0 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20  endif..  return 
1c3b0 72 63 3b 20 20 20 20 20 20 20 20 0a 7d 0a 0a 0a  rc;        .}...
1c3c0 2f 2a 0a 2a 2a 20 50 75 72 67 65 20 74 68 65 20  /*.** Purge the 
1c3d0 75 6e 69 78 53 68 6d 4e 6f 64 65 4c 69 73 74 20  unixShmNodeList 
1c3e0 6c 69 73 74 20 6f 66 20 61 6c 6c 20 65 6e 74 72  list of all entr
1c3f0 69 65 73 20 77 69 74 68 20 75 6e 69 78 53 68 6d  ies with unixShm
1c400 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30 2e 0a 2a 2a  Node.nRef==0..**
1c410 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20  .** This is not 
1c420 61 20 56 46 53 20 73 68 61 72 65 64 2d 6d 65 6d  a VFS shared-mem
1c430 6f 72 79 20 6d 65 74 68 6f 64 3b 20 69 74 20 69  ory method; it i
1c440 73 20 61 20 75 74 69 6c 69 74 79 20 66 75 6e 63  s a utility func
1c450 74 69 6f 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20 62  tion called.** b
1c460 79 20 56 46 53 20 73 68 61 72 65 64 2d 6d 65 6d  y VFS shared-mem
1c470 6f 72 79 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a  ory methods..*/.
1c480 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78  static void unix
1c490 53 68 6d 50 75 72 67 65 28 75 6e 69 78 46 69 6c  ShmPurge(unixFil
1c4a0 65 20 2a 70 46 64 29 7b 0a 20 20 75 6e 69 78 53  e *pFd){.  unixS
1c4b0 68 6d 4e 6f 64 65 20 2a 70 20 3d 20 70 46 64 2d  hmNode *p = pFd-
1c4c0 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64  >pInode->pShmNod
1c4d0 65 3b 0a 20 20 61 73 73 65 72 74 28 20 75 6e 69  e;.  assert( uni
1c4e0 78 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a  xMutexHeld() );.
1c4f0 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e 6e 52    if( p && p->nR
1c500 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  ef==0 ){.    int
1c510 20 69 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   i;.    assert( 
1c520 70 2d 3e 70 49 6e 6f 64 65 3d 3d 70 46 64 2d 3e  p->pInode==pFd->
1c530 70 49 6e 6f 64 65 20 29 3b 0a 20 20 20 20 69 66  pInode );.    if
1c540 28 20 70 2d 3e 6d 75 74 65 78 20 29 20 73 71 6c  ( p->mutex ) sql
1c550 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28  ite3_mutex_free(
1c560 70 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 66  p->mutex);.    f
1c570 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 52 65  or(i=0; i<p->nRe
1c580 67 69 6f 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  gion; i++){.    
1c590 20 20 6d 75 6e 6d 61 70 28 70 2d 3e 61 70 52 65    munmap(p->apRe
1c5a0 67 69 6f 6e 5b 69 5d 2c 20 70 2d 3e 73 7a 52 65  gion[i], p->szRe
1c5b0 67 69 6f 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20  gion);.    }.   
1c5c0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d   sqlite3_free(p-
1c5d0 3e 61 70 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20  >apRegion);.    
1c5e0 69 66 28 20 70 2d 3e 68 3e 3d 30 20 29 20 63 6c  if( p->h>=0 ) cl
1c5f0 6f 73 65 28 70 2d 3e 68 29 3b 0a 20 20 20 20 70  ose(p->h);.    p
1c600 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f  ->pInode->pShmNo
1c610 64 65 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69  de = 0;.    sqli
1c620 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 7d  te3_free(p);.  }
1c630 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 69  .}..static int i
1c640 73 50 72 6f 78 79 4c 6f 63 6b 69 6e 67 4d 6f 64  sProxyLockingMod
1c650 65 28 75 6e 69 78 46 69 6c 65 20 2a 29 3b 0a 73  e(unixFile *);.s
1c660 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
1c670 20 2a 70 72 6f 78 79 53 68 61 72 65 64 4d 65 6d   *proxySharedMem
1c680 6f 72 79 42 61 73 65 50 61 74 68 28 75 6e 69 78  oryBasePath(unix
1c690 46 69 6c 65 20 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20  File *);../*.** 
1c6a0 4f 70 65 6e 20 61 20 73 68 61 72 65 64 2d 6d 65  Open a shared-me
1c6b0 6d 6f 72 79 20 61 72 65 61 20 61 73 73 6f 63 69  mory area associ
1c6c0 61 74 65 64 20 77 69 74 68 20 6f 70 65 6e 20 64  ated with open d
1c6d0 61 74 61 62 61 73 65 20 66 69 6c 65 20 70 44 62  atabase file pDb
1c6e0 46 64 2e 20 20 0a 2a 2a 20 54 68 69 73 20 70 61  Fd.  .** This pa
1c6f0 72 74 69 63 75 6c 61 72 20 69 6d 70 6c 65 6d 65  rticular impleme
1c700 6e 74 61 74 69 6f 6e 20 75 73 65 73 20 6d 6d 61  ntation uses mma
1c710 70 70 65 64 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a  pped files..**.*
1c720 2a 20 54 68 65 20 66 69 6c 65 20 75 73 65 64 20  * The file used 
1c730 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 73 68 61  to implement sha
1c740 72 65 64 2d 6d 65 6d 6f 72 79 20 69 73 20 69 6e  red-memory is in
1c750 20 74 68 65 20 73 61 6d 65 20 64 69 72 65 63 74   the same direct
1c760 6f 72 79 0a 2a 2a 20 61 73 20 74 68 65 20 6f 70  ory.** as the op
1c770 65 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  en database file
1c780 20 61 6e 64 20 68 61 73 20 74 68 65 20 73 61 6d   and has the sam
1c790 65 20 6e 61 6d 65 20 61 73 20 74 68 65 20 6f 70  e name as the op
1c7a0 65 6e 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66  en database.** f
1c7b0 69 6c 65 20 77 69 74 68 20 74 68 65 20 22 2d 73  ile with the "-s
1c7c0 68 6d 22 20 73 75 66 66 69 78 20 61 64 64 65 64  hm" suffix added
1c7d0 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  .  For example, 
1c7e0 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
1c7f0 66 69 6c 65 0a 2a 2a 20 69 73 20 22 2f 68 6f 6d  file.** is "/hom
1c800 65 2f 75 73 65 72 31 2f 63 6f 6e 66 69 67 2e 64  e/user1/config.d
1c810 62 22 20 74 68 65 6e 20 74 68 65 20 66 69 6c 65  b" then the file
1c820 20 74 68 61 74 20 69 73 20 63 72 65 61 74 65 64   that is created
1c830 20 61 6e 64 20 6d 6d 61 70 70 65 64 0a 2a 2a 20   and mmapped.** 
1c840 66 6f 72 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  for shared memor
1c850 79 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64  y will be called
1c860 20 22 2f 68 6f 6d 65 2f 75 73 65 72 31 2f 63 6f   "/home/user1/co
1c870 6e 66 69 67 2e 64 62 2d 73 68 6d 22 2e 20 20 0a  nfig.db-shm".  .
1c880 2a 2a 0a 2a 2a 20 41 6e 6f 74 68 65 72 20 61 70  **.** Another ap
1c890 70 72 6f 61 63 68 20 74 6f 20 69 73 20 74 6f 20  proach to is to 
1c8a0 75 73 65 20 66 69 6c 65 73 20 69 6e 20 2f 64 65  use files in /de
1c8b0 76 2f 73 68 6d 20 6f 72 20 2f 64 65 76 2f 74 6d  v/shm or /dev/tm
1c8c0 70 20 6f 72 20 61 6e 0a 2a 2a 20 73 6f 6d 65 20  p or an.** some 
1c8d0 6f 74 68 65 72 20 74 6d 70 66 73 20 6d 6f 75 6e  other tmpfs moun
1c8e0 74 2e 20 42 75 74 20 69 66 20 61 20 66 69 6c 65  t. But if a file
1c8f0 20 69 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20   in a different 
1c900 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20 66 72 6f  directory.** fro
1c910 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  m the database f
1c920 69 6c 65 20 69 73 20 75 73 65 64 2c 20 74 68 65  ile is used, the
1c930 6e 20 64 69 66 66 65 72 69 6e 67 20 61 63 63 65  n differing acce
1c940 73 73 20 70 65 72 6d 69 73 73 69 6f 6e 73 0a 2a  ss permissions.*
1c950 2a 20 6f 72 20 61 20 63 68 72 6f 6f 74 28 29 20  * or a chroot() 
1c960 6d 69 67 68 74 20 63 61 75 73 65 20 74 77 6f 20  might cause two 
1c970 64 69 66 66 65 72 65 6e 74 20 70 72 6f 63 65 73  different proces
1c980 73 65 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 0a  ses on the same.
1c990 2a 2a 20 64 61 74 61 62 61 73 65 20 74 6f 20 65  ** database to e
1c9a0 6e 64 20 75 70 20 75 73 69 6e 67 20 64 69 66 66  nd up using diff
1c9b0 65 72 65 6e 74 20 66 69 6c 65 73 20 66 6f 72 20  erent files for 
1c9c0 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2d 20  shared memory - 
1c9d0 0a 2a 2a 20 6d 65 61 6e 69 6e 67 20 74 68 61 74  .** meaning that
1c9e0 20 74 68 65 69 72 20 6d 65 6d 6f 72 79 20 77 6f   their memory wo
1c9f0 75 6c 64 20 6e 6f 74 20 72 65 61 6c 6c 79 20 62  uld not really b
1ca00 65 20 73 68 61 72 65 64 20 2d 20 72 65 73 75 6c  e shared - resul
1ca10 74 69 6e 67 0a 2a 2a 20 69 6e 20 64 61 74 61 62  ting.** in datab
1ca20 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20  ase corruption. 
1ca30 20 4e 65 76 65 72 74 68 65 6c 65 73 73 2c 20 74   Nevertheless, t
1ca40 68 69 73 20 74 6d 70 66 73 20 66 69 6c 65 20 75  his tmpfs file u
1ca50 73 61 67 65 0a 2a 2a 20 63 61 6e 20 62 65 20 65  sage.** can be e
1ca60 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c  nabled at compil
1ca70 65 2d 74 69 6d 65 20 75 73 69 6e 67 20 2d 44 53  e-time using -DS
1ca80 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54  QLITE_SHM_DIRECT
1ca90 4f 52 59 3d 22 2f 64 65 76 2f 73 68 6d 22 0a 2a  ORY="/dev/shm".*
1caa0 2a 20 6f 72 20 74 68 65 20 65 71 75 69 76 61 6c  * or the equival
1cab0 65 6e 74 2e 20 20 54 68 65 20 75 73 65 20 6f 66  ent.  The use of
1cac0 20 74 68 65 20 53 51 4c 49 54 45 5f 53 48 4d 5f   the SQLITE_SHM_
1cad0 44 49 52 45 43 54 4f 52 59 20 63 6f 6d 70 69 6c  DIRECTORY compil
1cae0 65 2d 74 69 6d 65 0a 2a 2a 20 6f 70 74 69 6f 6e  e-time.** option
1caf0 20 72 65 73 75 6c 74 73 20 69 6e 20 61 6e 20 69   results in an i
1cb00 6e 63 6f 6d 70 61 74 69 62 6c 65 20 62 75 69 6c  ncompatible buil
1cb10 64 20 6f 66 20 53 51 4c 69 74 65 3b 20 20 62 75  d of SQLite;  bu
1cb20 69 6c 64 73 20 6f 66 20 53 51 4c 69 74 65 0a 2a  ilds of SQLite.*
1cb30 2a 20 74 68 61 74 20 77 69 74 68 20 64 69 66 66  * that with diff
1cb40 65 72 69 6e 67 20 53 51 4c 49 54 45 5f 53 48 4d  ering SQLITE_SHM
1cb50 5f 44 49 52 45 43 54 4f 52 59 20 73 65 74 74 69  _DIRECTORY setti
1cb60 6e 67 73 20 61 74 74 65 6d 70 74 20 74 6f 20 75  ngs attempt to u
1cb70 73 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 64  se the.** same d
1cb80 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20  atabase file at 
1cb90 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2c 20 64  the same time, d
1cba0 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
1cbb0 6f 6e 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a  on will likely.*
1cbc0 2a 20 72 65 73 75 6c 74 2e 20 54 68 65 20 53 51  * result. The SQ
1cbd0 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f  LITE_SHM_DIRECTO
1cbe0 52 59 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  RY compile-time 
1cbf0 6f 70 74 69 6f 6e 20 69 73 20 63 6f 6e 73 69 64  option is consid
1cc00 65 72 65 64 0a 2a 2a 20 22 75 6e 73 75 70 70 6f  ered.** "unsuppo
1cc10 72 74 65 64 22 20 61 6e 64 20 6d 61 79 20 67 6f  rted" and may go
1cc20 20 61 77 61 79 20 69 6e 20 61 20 66 75 74 75 72   away in a futur
1cc30 65 20 53 51 4c 69 74 65 20 72 65 6c 65 61 73 65  e SQLite release
1cc40 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 6f 70 65  ..**.** When ope
1cc50 6e 69 6e 67 20 61 20 6e 65 77 20 73 68 61 72 65  ning a new share
1cc60 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2c 20 69  d-memory file, i
1cc70 66 20 6e 6f 20 6f 74 68 65 72 20 69 6e 73 74 61  f no other insta
1cc80 6e 63 65 73 20 6f 66 20 74 68 61 74 0a 2a 2a 20  nces of that.** 
1cc90 66 69 6c 65 20 61 72 65 20 63 75 72 72 65 6e 74  file are current
1cca0 6c 79 20 6f 70 65 6e 2c 20 69 6e 20 74 68 69 73  ly open, in this
1ccb0 20 70 72 6f 63 65 73 73 20 6f 72 20 69 6e 20 6f   process or in o
1ccc0 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 2c 20  ther processes, 
1ccd0 74 68 65 6e 0a 2a 2a 20 74 68 65 20 66 69 6c 65  then.** the file
1cce0 20 6d 75 73 74 20 62 65 20 74 72 75 6e 63 61 74   must be truncat
1ccf0 65 64 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74  ed to zero lengt
1cd00 68 20 6f 72 20 68 61 76 65 20 69 74 73 20 68 65  h or have its he
1cd10 61 64 65 72 20 63 6c 65 61 72 65 64 2e 0a 2a 2f  ader cleared..*/
1cd20 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
1cd30 4f 70 65 6e 53 68 61 72 65 64 4d 65 6d 6f 72 79  OpenSharedMemory
1cd40 28 75 6e 69 78 46 69 6c 65 20 2a 70 44 62 46 64  (unixFile *pDbFd
1cd50 29 7b 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78  ){.  struct unix
1cd60 53 68 6d 20 2a 70 20 3d 20 30 3b 20 20 20 20 20  Shm *p = 0;     
1cd70 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 6e       /* The conn
1cd80 65 63 74 69 6f 6e 20 74 6f 20 62 65 20 6f 70 65  ection to be ope
1cd90 6e 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ned */.  struct 
1cda0 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68  unixShmNode *pSh
1cdb0 6d 4e 6f 64 65 3b 20 20 20 2f 2a 20 54 68 65 20  mNode;   /* The 
1cdc0 75 6e 64 65 72 6c 79 69 6e 67 20 6d 6d 61 70 70  underlying mmapp
1cdd0 65 64 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  ed file */.  int
1cde0 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
1cdf0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ce00 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20  Result code */. 
1ce10 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
1ce20 70 49 6e 6f 64 65 3b 20 20 20 20 20 20 20 20 20  pInode;         
1ce30 20 2f 2a 20 54 68 65 20 69 6e 6f 64 65 20 6f 66   /* The inode of
1ce40 20 66 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a   fd */.  char *z
1ce50 53 68 6d 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20  ShmFilename;    
1ce60 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
1ce70 20 6f 66 20 74 68 65 20 66 69 6c 65 20 75 73 65   of the file use
1ce80 64 20 66 6f 72 20 53 48 4d 20 2a 2f 0a 20 20 69  d for SHM */.  i
1ce90 6e 74 20 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 3b  nt nShmFilename;
1cea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ceb0 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 53 48  * Size of the SH
1cec0 4d 20 66 69 6c 65 6e 61 6d 65 20 69 6e 20 62 79  M filename in by
1ced0 74 65 73 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c  tes */..  /* All
1cee0 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20  ocate space for 
1cef0 74 68 65 20 6e 65 77 20 75 6e 69 78 53 68 6d 20  the new unixShm 
1cf00 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20 20 70 20 3d  object. */.  p =
1cf10 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
1cf20 20 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20   sizeof(*p) );. 
1cf30 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
1cf40 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
1cf50 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20  .  memset(p, 0, 
1cf60 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 61  sizeof(*p));.  a
1cf70 73 73 65 72 74 28 20 70 44 62 46 64 2d 3e 70 53  ssert( pDbFd->pS
1cf80 68 6d 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 43  hm==0 );..  /* C
1cf90 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 61  heck to see if a
1cfa0 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a   unixShmNode obj
1cfb0 65 63 74 20 61 6c 72 65 61 64 79 20 65 78 69 73  ect already exis
1cfc0 74 73 2e 20 52 65 75 73 65 20 61 6e 20 65 78 69  ts. Reuse an exi
1cfd0 73 74 69 6e 67 0a 20 20 2a 2a 20 6f 6e 65 20 69  sting.  ** one i
1cfe0 66 20 70 72 65 73 65 6e 74 2e 20 43 72 65 61 74  f present. Creat
1cff0 65 20 61 20 6e 65 77 20 6f 6e 65 20 69 66 20 6e  e a new one if n
1d000 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20  ecessary..  */. 
1d010 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
1d020 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70 44  );.  pInode = pD
1d030 62 46 64 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 70  bFd->pInode;.  p
1d040 53 68 6d 4e 6f 64 65 20 3d 20 70 49 6e 6f 64 65  ShmNode = pInode
1d050 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 69 66  ->pShmNode;.  if
1d060 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 30 20 29 7b  ( pShmNode==0 ){
1d070 0a 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74  .    struct stat
1d080 20 73 53 74 61 74 3b 20 20 20 20 20 20 20 20 20   sStat;         
1d090 20 20 20 20 20 20 20 20 2f 2a 20 66 73 74 61 74          /* fstat
1d0a0 28 29 20 69 6e 66 6f 20 66 6f 72 20 64 61 74 61  () info for data
1d0b0 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20  base file */..  
1d0c0 20 20 2f 2a 20 43 61 6c 6c 20 66 73 74 61 74 28    /* Call fstat(
1d0d0 29 20 74 6f 20 66 69 67 75 72 65 20 6f 75 74 20  ) to figure out 
1d0e0 74 68 65 20 70 65 72 6d 69 73 73 69 6f 6e 73 20  the permissions 
1d0f0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
1d100 66 69 6c 65 2e 20 49 66 0a 20 20 20 20 2a 2a 20  file. If.    ** 
1d110 61 20 6e 65 77 20 2a 2d 73 68 6d 20 66 69 6c 65  a new *-shm file
1d120 20 69 73 20 63 72 65 61 74 65 64 2c 20 61 6e 20   is created, an 
1d130 61 74 74 65 6d 70 74 20 77 69 6c 6c 20 62 65 20  attempt will be 
1d140 6d 61 64 65 20 74 6f 20 63 72 65 61 74 65 20 69  made to create i
1d150 74 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 74 68  t.    ** with th
1d160 65 20 73 61 6d 65 20 70 65 72 6d 69 73 73 69 6f  e same permissio
1d170 6e 73 2e 20 54 68 65 20 61 63 74 75 61 6c 20 70  ns. The actual p
1d180 65 72 6d 69 73 73 69 6f 6e 73 20 74 68 65 20 66  ermissions the f
1d190 69 6c 65 20 69 73 20 63 72 65 61 74 65 64 0a 20  ile is created. 
1d1a0 20 20 20 2a 2a 20 77 69 74 68 20 61 72 65 20 73     ** with are s
1d1b0 75 62 6a 65 63 74 20 74 6f 20 74 68 65 20 63 75  ubject to the cu
1d1c0 72 72 65 6e 74 20 75 6d 61 73 6b 20 73 65 74 74  rrent umask sett
1d1d0 69 6e 67 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ing..    */.    
1d1e0 69 66 28 20 66 73 74 61 74 28 70 44 62 46 64 2d  if( fstat(pDbFd-
1d1f0 3e 68 2c 20 26 73 53 74 61 74 29 20 29 7b 0a 20  >h, &sStat) ){. 
1d200 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1d210 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a 20 20  _IOERR_FSTAT;.  
1d220 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65      goto shm_ope
1d230 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20  n_err;.    }..  
1d240 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 42    const char *zB
1d250 61 73 65 50 61 74 68 20 3d 20 70 44 62 46 64 2d  asePath = pDbFd-
1d260 3e 7a 50 61 74 68 3b 0a 23 69 66 20 64 65 66 69  >zPath;.#if defi
1d270 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26  ned(__APPLE__) &
1d280 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  & SQLITE_ENABLE_
1d290 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20  LOCKING_STYLE.  
1d2a0 20 20 2f 2a 20 49 66 20 70 44 62 46 64 20 69 73    /* If pDbFd is
1d2b0 20 63 6f 6e 66 69 67 75 72 65 64 20 77 69 74 68   configured with
1d2c0 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 6d   proxy locking m
1d2d0 6f 64 65 2c 20 75 73 65 20 74 68 65 20 6c 6f 63  ode, use the loc
1d2e0 61 6c 20 0a 20 20 20 20 20 2a 2a 20 6c 6f 63 6b  al .     ** lock
1d2f0 20 66 69 6c 65 20 70 61 74 68 20 74 6f 20 64 65   file path to de
1d300 74 65 72 6d 69 6e 65 20 74 68 65 20 2d 73 68 6d  termine the -shm
1d310 20 66 69 6c 65 20 70 61 74 68 0a 20 20 20 20 20   file path.     
1d320 2a 2f 0a 20 20 20 20 69 66 28 20 69 73 50 72 6f  */.    if( isPro
1d330 78 79 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28 70 44  xyLockingMode(pD
1d340 62 46 64 29 20 29 7b 0a 20 20 20 20 20 20 7a 42  bFd) ){.      zB
1d350 61 73 65 50 61 74 68 20 3d 20 70 72 6f 78 79 53  asePath = proxyS
1d360 68 61 72 65 64 4d 65 6d 6f 72 79 42 61 73 65 50  haredMemoryBaseP
1d370 61 74 68 28 70 44 62 46 64 29 3b 0a 20 20 20 20  ath(pDbFd);.    
1d380 20 20 69 66 28 20 21 7a 42 61 73 65 50 61 74 68    if( !zBasePath
1d390 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1d3a0 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
1d3b0 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 67  _BKPT;.        g
1d3c0 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72  oto shm_open_err
1d3d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1d3e0 23 65 6e 64 69 66 0a 20 20 20 20 0a 23 69 66 64  #endif.    .#ifd
1d3f0 65 66 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49  ef SQLITE_SHM_DI
1d400 52 45 43 54 4f 52 59 0a 20 20 20 20 6e 53 68 6d  RECTORY.    nShm
1d410 46 69 6c 65 6e 61 6d 65 20 3d 20 73 69 7a 65 6f  Filename = sizeo
1d420 66 28 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52  f(SQLITE_SHM_DIR
1d430 45 43 54 4f 52 59 29 20 2b 20 33 30 3b 0a 23 65  ECTORY) + 30;.#e
1d440 6c 73 65 0a 20 20 20 20 6e 53 68 6d 46 69 6c 65  lse.    nShmFile
1d450 6e 61 6d 65 20 3d 20 35 20 2b 20 28 69 6e 74 29  name = 5 + (int)
1d460 73 74 72 6c 65 6e 28 7a 42 61 73 65 50 61 74 68  strlen(zBasePath
1d470 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 53  );.#endif.    pS
1d480 68 6d 4e 6f 64 65 20 3d 20 73 71 6c 69 74 65 33  hmNode = sqlite3
1d490 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  _malloc( sizeof(
1d4a0 2a 70 53 68 6d 4e 6f 64 65 29 20 2b 20 6e 53 68  *pShmNode) + nSh
1d4b0 6d 46 69 6c 65 6e 61 6d 65 20 29 3b 0a 20 20 20  mFilename );.   
1d4c0 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 30   if( pShmNode==0
1d4d0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
1d4e0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
1d4f0 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e     goto shm_open
1d500 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _err;.    }.    
1d510 6d 65 6d 73 65 74 28 70 53 68 6d 4e 6f 64 65 2c  memset(pShmNode,
1d520 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 53 68 6d   0, sizeof(*pShm
1d530 4e 6f 64 65 29 29 3b 0a 20 20 20 20 7a 53 68 6d  Node));.    zShm
1d540 46 69 6c 65 6e 61 6d 65 20 3d 20 70 53 68 6d 4e  Filename = pShmN
1d550 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d  ode->zFilename =
1d560 20 28 63 68 61 72 2a 29 26 70 53 68 6d 4e 6f 64   (char*)&pShmNod
1d570 65 5b 31 5d 3b 0a 23 69 66 64 65 66 20 53 51 4c  e[1];.#ifdef SQL
1d580 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52  ITE_SHM_DIRECTOR
1d590 59 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  Y.    sqlite3_sn
1d5a0 70 72 69 6e 74 66 28 6e 53 68 6d 46 69 6c 65 6e  printf(nShmFilen
1d5b0 61 6d 65 2c 20 7a 53 68 6d 46 69 6c 65 6e 61 6d  ame, zShmFilenam
1d5c0 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  e, .            
1d5d0 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
1d5e0 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 20 22 2f  SHM_DIRECTORY "/
1d5f0 73 71 6c 69 74 65 2d 73 68 6d 2d 25 78 2d 25 78  sqlite-shm-%x-%x
1d600 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
1d610 20 20 20 20 20 20 20 20 28 75 33 32 29 73 53 74          (u32)sSt
1d620 61 74 2e 73 74 5f 69 6e 6f 2c 20 28 75 33 32 29  at.st_ino, (u32)
1d630 73 53 74 61 74 2e 73 74 5f 64 65 76 29 3b 0a 23  sStat.st_dev);.#
1d640 65 6c 73 65 0a 20 20 20 20 73 71 6c 69 74 65 33  else.    sqlite3
1d650 5f 73 6e 70 72 69 6e 74 66 28 6e 53 68 6d 46 69  _snprintf(nShmFi
1d660 6c 65 6e 61 6d 65 2c 20 7a 53 68 6d 46 69 6c 65  lename, zShmFile
1d670 6e 61 6d 65 2c 20 22 25 73 2d 73 68 6d 22 2c 20  name, "%s-shm", 
1d680 7a 42 61 73 65 50 61 74 68 29 3b 0a 23 65 6e 64  zBasePath);.#end
1d690 69 66 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  if.    pShmNode-
1d6a0 3e 68 20 3d 20 2d 31 3b 0a 20 20 20 20 70 44 62  >h = -1;.    pDb
1d6b0 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d  Fd->pInode->pShm
1d6c0 4e 6f 64 65 20 3d 20 70 53 68 6d 4e 6f 64 65 3b  Node = pShmNode;
1d6d0 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 70  .    pShmNode->p
1d6e0 49 6e 6f 64 65 20 3d 20 70 44 62 46 64 2d 3e 70  Inode = pDbFd->p
1d6f0 49 6e 6f 64 65 3b 0a 20 20 20 20 70 53 68 6d 4e  Inode;.    pShmN
1d700 6f 64 65 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c  ode->mutex = sql
1d710 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63  ite3_mutex_alloc
1d720 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41  (SQLITE_MUTEX_FA
1d730 53 54 29 3b 0a 20 20 20 20 69 66 28 20 70 53 68  ST);.    if( pSh
1d740 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 3d 3d 30 20  mNode->mutex==0 
1d750 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
1d760 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
1d770 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f    goto shm_open_
1d780 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  err;.    }..    
1d790 70 53 68 6d 4e 6f 64 65 2d 3e 68 20 3d 20 6f 70  pShmNode->h = op
1d7a0 65 6e 28 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 2c  en(zShmFilename,
1d7b0 20 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 2c   O_RDWR|O_CREAT,
1d7c0 20 28 73 53 74 61 74 2e 73 74 5f 6d 6f 64 65 20   (sStat.st_mode 
1d7d0 26 20 30 37 37 37 29 29 3b 0a 20 20 20 20 69 66  & 0777));.    if
1d7e0 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3c 30 20  ( pShmNode->h<0 
1d7f0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
1d800 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b  LITE_CANTOPEN_BK
1d810 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73  PT;.      goto s
1d820 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20  hm_open_err;.   
1d830 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b   }..    /* Check
1d840 20 74 6f 20 73 65 65 20 69 66 20 61 6e 6f 74 68   to see if anoth
1d850 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 68 6f  er process is ho
1d860 6c 64 69 6e 67 20 74 68 65 20 64 65 61 64 2d 6d  lding the dead-m
1d870 61 6e 20 73 77 69 74 63 68 2e 0a 20 20 20 20 2a  an switch..    *
1d880 2a 20 49 66 20 6e 6f 74 2c 20 74 72 75 6e 63 61  * If not, trunca
1d890 74 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20 7a  te the file to z
1d8a0 65 72 6f 20 6c 65 6e 67 74 68 2e 20 0a 20 20 20  ero length. .   
1d8b0 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   */.    rc = SQL
1d8c0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 69 66 28 20  ITE_OK;.    if( 
1d8d0 75 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63  unixShmSystemLoc
1d8e0 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 46 5f 57 52  k(pShmNode, F_WR
1d8f0 4c 43 4b 2c 20 55 4e 49 58 5f 53 48 4d 5f 44 4d  LCK, UNIX_SHM_DM
1d900 53 2c 20 31 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b  S, 1)==SQLITE_OK
1d910 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 66 74   ){.      if( ft
1d920 72 75 6e 63 61 74 65 28 70 53 68 6d 4e 6f 64 65  runcate(pShmNode
1d930 2d 3e 68 2c 20 30 29 20 29 7b 0a 20 20 20 20 20  ->h, 0) ){.     
1d940 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
1d950 4f 45 52 52 5f 53 48 4d 4f 50 45 4e 3b 0a 20 20  OERR_SHMOPEN;.  
1d960 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1d970 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1d980 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
1d990 75 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63  unixShmSystemLoc
1d9a0 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 46 5f 52 44  k(pShmNode, F_RD
1d9b0 4c 43 4b 2c 20 55 4e 49 58 5f 53 48 4d 5f 44 4d  LCK, UNIX_SHM_DM
1d9c0 53 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  S, 1);.    }.   
1d9d0 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 73   if( rc ) goto s
1d9e0 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 7d  hm_open_err;.  }
1d9f0 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 74 68 65 20  ..  /* Make the 
1da00 6e 65 77 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61  new connection a
1da10 20 63 68 69 6c 64 20 6f 66 20 74 68 65 20 75 6e   child of the un
1da20 69 78 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 70  ixShmNode */.  p
1da30 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d 20 70 53 68  ->pShmNode = pSh
1da40 6d 4e 6f 64 65 3b 0a 23 69 66 64 65 66 20 53 51  mNode;.#ifdef SQ
1da50 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 70 2d 3e  LITE_DEBUG.  p->
1da60 69 64 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e  id = pShmNode->n
1da70 65 78 74 53 68 6d 49 64 2b 2b 3b 0a 23 65 6e 64  extShmId++;.#end
1da80 69 66 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e  if.  pShmNode->n
1da90 52 65 66 2b 2b 3b 0a 20 20 70 44 62 46 64 2d 3e  Ref++;.  pDbFd->
1daa0 70 53 68 6d 20 3d 20 70 3b 0a 20 20 75 6e 69 78  pShm = p;.  unix
1dab0 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 0a 20  LeaveMutex();.. 
1dac0 20 2f 2a 20 54 68 65 20 72 65 66 65 72 65 6e 63   /* The referenc
1dad0 65 20 63 6f 75 6e 74 20 6f 6e 20 70 53 68 6d 4e  e count on pShmN
1dae0 6f 64 65 20 68 61 73 20 61 6c 72 65 61 64 79 20  ode has already 
1daf0 62 65 65 6e 20 69 6e 63 72 65 6d 65 6e 74 65 64  been incremented
1db00 20 75 6e 64 65 72 0a 20 20 2a 2a 20 74 68 65 20   under.  ** the 
1db10 63 6f 76 65 72 20 6f 66 20 74 68 65 20 75 6e 69  cover of the uni
1db20 78 45 6e 74 65 72 4d 75 74 65 78 28 29 20 6d 75  xEnterMutex() mu
1db30 74 65 78 20 61 6e 64 20 74 68 65 20 70 6f 69 6e  tex and the poin
1db40 74 65 72 20 66 72 6f 6d 20 74 68 65 0a 20 20 2a  ter from the.  *
1db50 2a 20 6e 65 77 20 28 73 74 72 75 63 74 20 75 6e  * new (struct un
1db60 69 78 53 68 6d 29 20 6f 62 6a 65 63 74 20 74 6f  ixShm) object to
1db70 20 74 68 65 20 70 53 68 6d 4e 6f 64 65 20 68 61   the pShmNode ha
1db80 73 20 62 65 65 6e 20 73 65 74 2e 20 41 6c 6c 20  s been set. All 
1db90 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 6c 65 66  that is.  ** lef
1dba0 74 20 74 6f 20 64 6f 20 69 73 20 74 6f 20 6c 69  t to do is to li
1dbb0 6e 6b 20 74 68 65 20 6e 65 77 20 6f 62 6a 65 63  nk the new objec
1dbc0 74 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e 6b 65  t into the linke
1dbd0 64 20 6c 69 73 74 20 73 74 61 72 74 69 6e 67 0a  d list starting.
1dbe0 20 20 2a 2a 20 61 74 20 70 53 68 6d 4e 6f 64 65    ** at pShmNode
1dbf0 2d 3e 70 46 69 72 73 74 2e 20 54 68 69 73 20 6d  ->pFirst. This m
1dc00 75 73 74 20 62 65 20 64 6f 6e 65 20 77 68 69 6c  ust be done whil
1dc10 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 70 53  e holding the pS
1dc20 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 20 0a 20  hmNode->mutex . 
1dc30 20 2a 2a 20 6d 75 74 65 78 2e 0a 20 20 2a 2f 0a   ** mutex..  */.
1dc40 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
1dc50 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e  enter(pShmNode->
1dc60 6d 75 74 65 78 29 3b 0a 20 20 70 2d 3e 70 4e 65  mutex);.  p->pNe
1dc70 78 74 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 70  xt = pShmNode->p
1dc80 46 69 72 73 74 3b 0a 20 20 70 53 68 6d 4e 6f 64  First;.  pShmNod
1dc90 65 2d 3e 70 46 69 72 73 74 20 3d 20 70 3b 0a 20  e->pFirst = p;. 
1dca0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
1dcb0 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d  eave(pShmNode->m
1dcc0 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
1dcd0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a  SQLITE_OK;..  /*
1dce0 20 4a 75 6d 70 20 68 65 72 65 20 6f 6e 20 61 6e   Jump here on an
1dcf0 79 20 65 72 72 6f 72 20 2a 2f 0a 73 68 6d 5f 6f  y error */.shm_o
1dd00 70 65 6e 5f 65 72 72 3a 0a 20 20 75 6e 69 78 53  pen_err:.  unixS
1dd10 68 6d 50 75 72 67 65 28 70 44 62 46 64 29 3b 20  hmPurge(pDbFd); 
1dd20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61        /* This ca
1dd30 6c 6c 20 66 72 65 65 73 20 70 53 68 6d 4e 6f 64  ll frees pShmNod
1dd40 65 20 69 66 20 72 65 71 75 69 72 65 64 20 2a 2f  e if required */
1dd50 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
1dd60 70 29 3b 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d  p);.  unixLeaveM
1dd70 75 74 65 78 28 29 3b 0a 20 20 72 65 74 75 72 6e  utex();.  return
1dd80 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
1dd90 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
1dda0 61 6c 6c 65 64 20 74 6f 20 6f 62 74 61 69 6e 20  alled to obtain 
1ddb0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 72 65 67  a pointer to reg
1ddc0 69 6f 6e 20 69 52 65 67 69 6f 6e 20 6f 66 20 74  ion iRegion of t
1ddd0 68 65 20 0a 2a 2a 20 73 68 61 72 65 64 2d 6d 65  he .** shared-me
1dde0 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20  mory associated 
1ddf0 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73  with the databas
1de00 65 20 66 69 6c 65 20 66 64 2e 20 53 68 61 72 65  e file fd. Share
1de10 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 73  d-memory regions
1de20 20 0a 2a 2a 20 61 72 65 20 6e 75 6d 62 65 72 65   .** are numbere
1de30 64 20 73 74 61 72 74 69 6e 67 20 66 72 6f 6d 20  d starting from 
1de40 7a 65 72 6f 2e 20 45 61 63 68 20 73 68 61 72 65  zero. Each share
1de50 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20  d-memory region 
1de60 69 73 20 73 7a 52 65 67 69 6f 6e 20 0a 2a 2a 20  is szRegion .** 
1de70 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a  bytes in size..*
1de80 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
1de90 20 6f 63 63 75 72 73 2c 20 61 6e 20 65 72 72 6f   occurs, an erro
1dea0 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
1deb0 65 64 20 61 6e 64 20 2a 70 70 20 69 73 20 73 65  ed and *pp is se
1dec0 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  t to NULL..**.**
1ded0 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74   Otherwise, if t
1dee0 68 65 20 62 45 78 74 65 6e 64 20 70 61 72 61 6d  he bExtend param
1def0 65 74 65 72 20 69 73 20 30 20 61 6e 64 20 74 68  eter is 0 and th
1df00 65 20 72 65 71 75 65 73 74 65 64 20 73 68 61 72  e requested shar
1df10 65 64 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 72 65 67  ed-memory.** reg
1df20 69 6f 6e 20 68 61 73 20 6e 6f 74 20 62 65 65 6e  ion has not been
1df30 20 61 6c 6c 6f 63 61 74 65 64 20 28 62 79 20 61   allocated (by a
1df40 6e 79 20 63 6c 69 65 6e 74 2c 20 69 6e 63 6c 75  ny client, inclu
1df50 64 69 6e 67 20 6f 6e 65 20 72 75 6e 6e 69 6e 67  ding one running
1df60 20 69 6e 20 61 0a 2a 2a 20 73 65 70 61 72 61 74   in a.** separat
1df70 65 20 70 72 6f 63 65 73 73 29 2c 20 74 68 65 6e  e process), then
1df80 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f 20 4e   *pp is set to N
1df90 55 4c 4c 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  ULL and SQLITE_O
1dfa0 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 0a  K returned. If .
1dfb0 2a 2a 20 62 45 78 74 65 6e 64 20 69 73 20 6e 6f  ** bExtend is no
1dfc0 6e 2d 7a 65 72 6f 20 61 6e 64 20 74 68 65 20 72  n-zero and the r
1dfd0 65 71 75 65 73 74 65 64 20 73 68 61 72 65 64 2d  equested shared-
1dfe0 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 68 61  memory region ha
1dff0 73 20 6e 6f 74 20 79 65 74 20 0a 2a 2a 20 62 65  s not yet .** be
1e000 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 69 74  en allocated, it
1e010 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79   is allocated by
1e020 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
1e030 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 68 61  **.** If the sha
1e040 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f  red-memory regio
1e050 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  n has already be
1e060 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 6f 72 20  en allocated or 
1e070 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 0a  is allocated by.
1e080 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20 61 73 20  ** this call as 
1e090 64 65 73 63 72 69 62 65 64 20 61 62 6f 76 65 2c  described above,
1e0a0 20 74 68 65 6e 20 69 74 20 69 73 20 6d 61 70 70   then it is mapp
1e0b0 65 64 20 69 6e 74 6f 20 74 68 69 73 20 70 72 6f  ed into this pro
1e0c0 63 65 73 73 65 73 20 0a 2a 2a 20 61 64 64 72 65  cesses .** addre
1e0d0 73 73 20 73 70 61 63 65 20 28 69 66 20 69 74 20  ss space (if it 
1e0e0 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 29 2c  is not already),
1e0f0 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f 20 70   *pp is set to p
1e100 6f 69 6e 74 20 74 6f 20 74 68 65 20 6d 61 70 70  oint to the mapp
1e110 65 64 20 0a 2a 2a 20 6d 65 6d 6f 72 79 20 61 6e  ed .** memory an
1e120 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  d SQLITE_OK retu
1e130 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
1e140 69 6e 74 20 75 6e 69 78 53 68 6d 4d 61 70 28 0a  int unixShmMap(.
1e150 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
1e160 66 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  fd,             
1e170 20 20 2f 2a 20 48 61 6e 64 6c 65 20 6f 70 65 6e    /* Handle open
1e180 20 6f 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c   on database fil
1e190 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65 67 69  e */.  int iRegi
1e1a0 6f 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  on,             
1e1b0 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 6f 6e         /* Region
1e1c0 20 74 6f 20 72 65 74 72 69 65 76 65 20 2a 2f 0a   to retrieve */.
1e1d0 20 20 69 6e 74 20 73 7a 52 65 67 69 6f 6e 2c 20    int szRegion, 
1e1e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e1f0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 72 65 67    /* Size of reg
1e200 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 62 45  ions */.  int bE
1e210 78 74 65 6e 64 2c 20 20 20 20 20 20 20 20 20 20  xtend,          
1e220 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
1e230 65 20 74 6f 20 65 78 74 65 6e 64 20 66 69 6c 65  e to extend file
1e240 20 69 66 20 6e 65 63 65 73 73 61 72 79 20 2a 2f   if necessary */
1e250 0a 20 20 76 6f 69 64 20 76 6f 6c 61 74 69 6c 65  .  void volatile
1e260 20 2a 2a 70 70 20 20 20 20 20 20 20 20 20 20 20   **pp           
1e270 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 61 70 70 65     /* OUT: Mappe
1e280 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 29 7b 0a 20  d memory */.){. 
1e290 20 75 6e 69 78 46 69 6c 65 20 2a 70 44 62 46 64   unixFile *pDbFd
1e2a0 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 66 64   = (unixFile*)fd
1e2b0 3b 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 3b 0a  ;.  unixShm *p;.
1e2c0 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70    unixShmNode *p
1e2d0 53 68 6d 4e 6f 64 65 3b 0a 20 20 69 6e 74 20 72  ShmNode;.  int r
1e2e0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
1e2f0 20 20 2f 2a 20 49 66 20 74 68 65 20 73 68 61 72    /* If the shar
1e300 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20 68  ed-memory file h
1e310 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20  as not yet been 
1e320 6f 70 65 6e 65 64 2c 20 6f 70 65 6e 20 69 74 20  opened, open it 
1e330 6e 6f 77 2e 20 2a 2f 0a 20 20 69 66 28 20 70 44  now. */.  if( pD
1e340 62 46 64 2d 3e 70 53 68 6d 3d 3d 30 20 29 7b 0a  bFd->pShm==0 ){.
1e350 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4f 70 65      rc = unixOpe
1e360 6e 53 68 61 72 65 64 4d 65 6d 6f 72 79 28 70 44  nSharedMemory(pD
1e370 62 46 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63  bFd);.    if( rc
1e380 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
1e390 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
1e3a0 70 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b  p = pDbFd->pShm;
1e3b0 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d  .  pShmNode = p-
1e3c0 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 73 71 6c  >pShmNode;.  sql
1e3d0 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
1e3e0 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78  (pShmNode->mutex
1e3f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a 52  );.  assert( szR
1e400 65 67 69 6f 6e 3d 3d 70 53 68 6d 4e 6f 64 65 2d  egion==pShmNode-
1e410 3e 73 7a 52 65 67 69 6f 6e 20 7c 7c 20 70 53 68  >szRegion || pSh
1e420 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3d 3d  mNode->nRegion==
1e430 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 53 68 6d  0 );..  if( pShm
1e440 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c 3d 69  Node->nRegion<=i
1e450 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 63 68  Region ){.    ch
1e460 61 72 20 2a 2a 61 70 4e 65 77 3b 20 20 20 20 20  ar **apNew;     
1e470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e480 20 2f 2a 20 4e 65 77 20 61 70 52 65 67 69 6f 6e   /* New apRegion
1e490 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20  [] array */.    
1e4a0 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 69 52 65  int nByte = (iRe
1e4b0 67 69 6f 6e 2b 31 29 2a 73 7a 52 65 67 69 6f 6e  gion+1)*szRegion
1e4c0 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 72 65  ;  /* Minimum re
1e4d0 71 75 69 72 65 64 20 66 69 6c 65 20 73 69 7a 65  quired file size
1e4e0 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20 73   */.    struct s
1e4f0 74 61 74 20 73 53 74 61 74 3b 20 20 20 20 20 20  tat sStat;      
1e500 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73             /* Us
1e510 65 64 20 62 79 20 66 73 74 61 74 28 29 20 2a 2f  ed by fstat() */
1e520 0a 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e  ..    pShmNode->
1e530 73 7a 52 65 67 69 6f 6e 20 3d 20 73 7a 52 65 67  szRegion = szReg
1e540 69 6f 6e 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65  ion;..    /* The
1e550 20 72 65 71 75 65 73 74 65 64 20 72 65 67 69 6f   requested regio
1e560 6e 20 69 73 20 6e 6f 74 20 6d 61 70 70 65 64 20  n is not mapped 
1e570 69 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73  into this proces
1e580 73 65 73 20 61 64 64 72 65 73 73 20 73 70 61 63  ses address spac
1e590 65 2e 0a 20 20 20 20 2a 2a 20 43 68 65 63 6b 20  e..    ** Check 
1e5a0 74 6f 20 73 65 65 20 69 66 20 69 74 20 68 61 73  to see if it has
1e5b0 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20   been allocated 
1e5c0 28 69 2e 65 2e 20 69 66 20 74 68 65 20 77 61 6c  (i.e. if the wal
1e5d0 2d 69 6e 64 65 78 20 66 69 6c 65 20 69 73 0a 20  -index file is. 
1e5e0 20 20 20 2a 2a 20 6c 61 72 67 65 20 65 6e 6f 75     ** large enou
1e5f0 67 68 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68  gh to contain th
1e600 65 20 72 65 71 75 65 73 74 65 64 20 72 65 67 69  e requested regi
1e610 6f 6e 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  on)..    */.    
1e620 69 66 28 20 66 73 74 61 74 28 70 53 68 6d 4e 6f  if( fstat(pShmNo
1e630 64 65 2d 3e 68 2c 20 26 73 53 74 61 74 29 20 29  de->h, &sStat) )
1e640 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
1e650 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a  ITE_IOERR_SHMSIZ
1e660 45 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68  E;.      goto sh
1e670 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d  mpage_out;.    }
1e680 0a 0a 20 20 20 20 69 66 28 20 73 53 74 61 74 2e  ..    if( sStat.
1e690 73 74 5f 73 69 7a 65 3c 6e 42 79 74 65 20 29 7b  st_size<nByte ){
1e6a0 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65  .      /* The re
1e6b0 71 75 65 73 74 65 64 20 6d 65 6d 6f 72 79 20 72  quested memory r
1e6c0 65 67 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 65  egion does not e
1e6d0 78 69 73 74 2e 20 49 66 20 62 45 78 74 65 6e 64  xist. If bExtend
1e6e0 20 69 73 20 73 65 74 20 74 6f 0a 20 20 20 20 20   is set to.     
1e6f0 20 2a 2a 20 66 61 6c 73 65 2c 20 65 78 69 74 20   ** false, exit 
1e700 65 61 72 6c 79 2e 20 2a 70 70 20 77 69 6c 6c 20  early. *pp will 
1e710 62 65 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61  be set to NULL a
1e720 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  nd SQLITE_OK ret
1e730 75 72 6e 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a  urned..      **.
1e740 20 20 20 20 20 20 2a 2a 20 41 6c 74 65 72 6e 61        ** Alterna
1e750 74 69 76 65 6c 79 2c 20 69 66 20 62 45 78 74 65  tively, if bExte
1e760 6e 64 20 69 73 20 74 72 75 65 2c 20 75 73 65 20  nd is true, use 
1e770 66 74 72 75 6e 63 61 74 65 28 29 20 74 6f 20 61  ftruncate() to a
1e780 6c 6c 6f 63 61 74 65 0a 20 20 20 20 20 20 2a 2a  llocate.      **
1e790 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6d   the requested m
1e7a0 65 6d 6f 72 79 20 72 65 67 69 6f 6e 2e 0a 20 20  emory region..  
1e7b0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
1e7c0 20 21 62 45 78 74 65 6e 64 20 29 20 67 6f 74 6f   !bExtend ) goto
1e7d0 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20   shmpage_out;.  
1e7e0 20 20 20 20 69 66 28 20 66 74 72 75 6e 63 61 74      if( ftruncat
1e7f0 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 6e  e(pShmNode->h, n
1e800 42 79 74 65 29 20 29 7b 0a 20 20 20 20 20 20 20  Byte) ){.       
1e810 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
1e820 52 52 5f 53 48 4d 53 49 5a 45 3b 0a 20 20 20 20  RR_SHMSIZE;.    
1e830 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65      goto shmpage
1e840 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _out;.      }.  
1e850 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 70 20    }..    /* Map 
1e860 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6d 65  the requested me
1e870 6d 6f 72 79 20 72 65 67 69 6f 6e 20 69 6e 74 6f  mory region into
1e880 20 74 68 69 73 20 70 72 6f 63 65 73 73 65 73 20   this processes 
1e890 61 64 64 72 65 73 73 20 73 70 61 63 65 2e 20 2a  address space. *
1e8a0 2f 0a 20 20 20 20 61 70 4e 65 77 20 3d 20 28 63  /.    apNew = (c
1e8b0 68 61 72 20 2a 2a 29 73 71 6c 69 74 65 33 5f 72  har **)sqlite3_r
1e8c0 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20 20  ealloc(.        
1e8d0 70 53 68 6d 4e 6f 64 65 2d 3e 61 70 52 65 67 69  pShmNode->apRegi
1e8e0 6f 6e 2c 20 28 69 52 65 67 69 6f 6e 2b 31 29 2a  on, (iRegion+1)*
1e8f0 73 69 7a 65 6f 66 28 63 68 61 72 20 2a 29 0a 20  sizeof(char *). 
1e900 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 21 61     );.    if( !a
1e910 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 72 63  pNew ){.      rc
1e920 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
1e930 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74  NOMEM;.      got
1e940 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20  o shmpage_out;. 
1e950 20 20 20 7d 0a 20 20 20 20 70 53 68 6d 4e 6f 64     }.    pShmNod
1e960 65 2d 3e 61 70 52 65 67 69 6f 6e 20 3d 20 61 70  e->apRegion = ap
1e970 4e 65 77 3b 0a 20 20 20 20 77 68 69 6c 65 28 70  New;.    while(p
1e980 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e  ShmNode->nRegion
1e990 3c 3d 69 52 65 67 69 6f 6e 29 7b 0a 20 20 20 20  <=iRegion){.    
1e9a0 20 20 76 6f 69 64 20 2a 70 4d 65 6d 20 3d 20 6d    void *pMem = m
1e9b0 6d 61 70 28 30 2c 20 73 7a 52 65 67 69 6f 6e 2c  map(0, szRegion,
1e9c0 20 50 52 4f 54 5f 52 45 41 44 7c 50 52 4f 54 5f   PROT_READ|PROT_
1e9d0 57 52 49 54 45 2c 20 0a 20 20 20 20 20 20 20 20  WRITE, .        
1e9e0 20 20 4d 41 50 5f 53 48 41 52 45 44 2c 20 70 53    MAP_SHARED, pS
1e9f0 68 6d 4e 6f 64 65 2d 3e 68 2c 20 70 53 68 6d 4e  hmNode->h, pShmN
1ea00 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 2a 73 7a 52  ode->nRegion*szR
1ea10 65 67 69 6f 6e 0a 20 20 20 20 20 20 29 3b 0a 20  egion.      );. 
1ea20 20 20 20 20 20 69 66 28 20 70 4d 65 6d 3d 3d 4d       if( pMem==M
1ea30 41 50 5f 46 41 49 4c 45 44 20 29 7b 0a 20 20 20  AP_FAILED ){.   
1ea40 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1ea50 5f 49 4f 45 52 52 3b 0a 20 20 20 20 20 20 20 20  _IOERR;.        
1ea60 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74  goto shmpage_out
1ea70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1ea80 70 53 68 6d 4e 6f 64 65 2d 3e 61 70 52 65 67 69  pShmNode->apRegi
1ea90 6f 6e 5b 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  on[pShmNode->nRe
1eaa0 67 69 6f 6e 5d 20 3d 20 70 4d 65 6d 3b 0a 20 20  gion] = pMem;.  
1eab0 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52      pShmNode->nR
1eac0 65 67 69 6f 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20  egion++;.    }. 
1ead0 20 7d 0a 0a 73 68 6d 70 61 67 65 5f 6f 75 74 3a   }..shmpage_out:
1eae0 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d  .  if( pShmNode-
1eaf0 3e 6e 52 65 67 69 6f 6e 3e 69 52 65 67 69 6f 6e  >nRegion>iRegion
1eb00 20 29 7b 0a 20 20 20 20 2a 70 70 20 3d 20 70 53   ){.    *pp = pS
1eb10 68 6d 4e 6f 64 65 2d 3e 61 70 52 65 67 69 6f 6e  hmNode->apRegion
1eb20 5b 69 52 65 67 69 6f 6e 5d 3b 0a 20 20 7d 65 6c  [iRegion];.  }el
1eb30 73 65 7b 0a 20 20 20 20 2a 70 70 20 3d 20 30 3b  se{.    *pp = 0;
1eb40 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d  .  }.  sqlite3_m
1eb50 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e  utex_leave(pShmN
1eb60 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  ode->mutex);.  r
1eb70 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1eb80 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6c 6f  ** Change the lo
1eb90 63 6b 20 73 74 61 74 65 20 66 6f 72 20 61 20 73  ck state for a s
1eba0 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 73 65 67  hared-memory seg
1ebb0 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  ment..**.** Note
1ebc0 20 74 68 61 74 20 74 68 65 20 72 65 6c 61 74 69   that the relati
1ebd0 6f 6e 73 68 69 70 20 62 65 74 77 65 65 6e 20 53  onship between S
1ebe0 48 41 52 45 64 20 61 6e 64 20 45 58 43 4c 55 53  HAREd and EXCLUS
1ebf0 49 56 45 20 6c 6f 63 6b 73 20 69 73 20 61 20 6c  IVE locks is a l
1ec00 69 74 74 6c 65 0a 2a 2a 20 64 69 66 66 65 72 65  ittle.** differe
1ec10 6e 74 20 68 65 72 65 20 74 68 61 6e 20 69 6e 20  nt here than in 
1ec20 70 6f 73 69 78 2e 20 20 49 6e 20 78 53 68 6d 4c  posix.  In xShmL
1ec30 6f 63 6b 28 29 2c 20 6f 6e 65 20 63 61 6e 20 67  ock(), one can g
1ec40 6f 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64 0a  o from unlocked.
1ec50 2a 2a 20 74 6f 20 73 68 61 72 65 64 20 61 6e 64  ** to shared and
1ec60 20 62 61 63 6b 20 6f 72 20 66 72 6f 6d 20 75 6e   back or from un
1ec70 6c 6f 63 6b 65 64 20 74 6f 20 65 78 63 6c 75 73  locked to exclus
1ec80 69 76 65 20 61 6e 64 20 62 61 63 6b 2e 20 20 42  ive and back.  B
1ec90 75 74 20 6f 6e 65 20 6d 61 79 0a 2a 2a 20 6e 6f  ut one may.** no
1eca0 74 20 67 6f 20 66 72 6f 6d 20 73 68 61 72 65 64  t go from shared
1ecb0 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20 6f 72   to exclusive or
1ecc0 20 66 72 6f 6d 20 65 78 63 6c 75 73 69 76 65 20   from exclusive 
1ecd0 74 6f 20 73 68 61 72 65 64 2e 0a 2a 2f 0a 73 74  to shared..*/.st
1ece0 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 68 6d  atic int unixShm
1ecf0 4c 6f 63 6b 28 0a 20 20 73 71 6c 69 74 65 33 5f  Lock(.  sqlite3_
1ed00 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20  file *fd,       
1ed10 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66     /* Database f
1ed20 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20  ile holding the 
1ed30 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f  shared memory */
1ed40 0a 20 20 69 6e 74 20 6f 66 73 74 2c 20 20 20 20  .  int ofst,    
1ed50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ed60 20 46 69 72 73 74 20 6c 6f 63 6b 20 74 6f 20 61   First lock to a
1ed70 63 71 75 69 72 65 20 6f 72 20 72 65 6c 65 61 73  cquire or releas
1ed80 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 2c 20 20 20  e */.  int n,   
1ed90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eda0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c    /* Number of l
1edb0 6f 63 6b 73 20 74 6f 20 61 63 71 75 69 72 65 20  ocks to acquire 
1edc0 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20  or release */.  
1edd0 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20 20  int flags       
1ede0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68             /* Wh
1edf0 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 74 68  at to do with th
1ee00 65 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 75  e lock */.){.  u
1ee10 6e 69 78 46 69 6c 65 20 2a 70 44 62 46 64 20 3d  nixFile *pDbFd =
1ee20 20 28 75 6e 69 78 46 69 6c 65 2a 29 66 64 3b 20   (unixFile*)fd; 
1ee30 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69       /* Connecti
1ee40 6f 6e 20 68 6f 6c 64 69 6e 67 20 73 68 61 72 65  on holding share
1ee50 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 75 6e  d memory */.  un
1ee60 69 78 53 68 6d 20 2a 70 20 3d 20 70 44 62 46 64  ixShm *p = pDbFd
1ee70 2d 3e 70 53 68 6d 3b 20 20 20 20 20 20 20 20 20  ->pShm;         
1ee80 20 20 20 20 2f 2a 20 54 68 65 20 73 68 61 72 65      /* The share
1ee90 64 20 6d 65 6d 6f 72 79 20 62 65 69 6e 67 20 6c  d memory being l
1eea0 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 6e 69 78 53  ocked */.  unixS
1eeb0 68 6d 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20  hm *pX;         
1eec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eed0 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
1eee0 6f 76 65 72 20 61 6c 6c 20 73 69 62 6c 69 6e 67  over all sibling
1eef0 73 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 4e 6f  s */.  unixShmNo
1ef00 64 65 20 2a 70 53 68 6d 4e 6f 64 65 20 3d 20 70  de *pShmNode = p
1ef10 2d 3e 70 53 68 6d 4e 6f 64 65 3b 20 20 2f 2a 20  ->pShmNode;  /* 
1ef20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 66  The underlying f
1ef30 69 6c 65 20 69 4e 6f 64 65 20 2a 2f 0a 20 20 69  ile iNode */.  i
1ef40 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1ef50 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K;              
1ef60 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63       /* Result c
1ef70 6f 64 65 20 2a 2f 0a 20 20 75 31 36 20 6d 61 73  ode */.  u16 mas
1ef80 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
1ef90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1efa0 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b 73 20  * Mask of locks 
1efb0 74 6f 20 74 61 6b 65 20 6f 72 20 72 65 6c 65 61  to take or relea
1efc0 73 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  se */..  assert(
1efd0 20 70 53 68 6d 4e 6f 64 65 3d 3d 70 44 62 46 64   pShmNode==pDbFd
1efe0 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f  ->pInode->pShmNo
1eff0 64 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  de );.  assert( 
1f000 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64 65  pShmNode->pInode
1f010 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 20  ==pDbFd->pInode 
1f020 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66 73  );.  assert( ofs
1f030 74 3e 3d 30 20 26 26 20 6f 66 73 74 2b 6e 3c 3d  t>=0 && ofst+n<=
1f040 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b  SQLITE_SHM_NLOCK
1f050 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3e   );.  assert( n>
1f060 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =1 );.  assert( 
1f070 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53  flags==(SQLITE_S
1f080 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45  HM_LOCK | SQLITE
1f090 5f 53 48 4d 5f 53 48 41 52 45 44 29 0a 20 20 20  _SHM_SHARED).   
1f0a0 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53      || flags==(S
1f0b0 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c  QLITE_SHM_LOCK |
1f0c0 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c   SQLITE_SHM_EXCL
1f0d0 55 53 49 56 45 29 0a 20 20 20 20 20 20 20 7c 7c  USIVE).       ||
1f0e0 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f   flags==(SQLITE_
1f0f0 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c  SHM_UNLOCK | SQL
1f100 49 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 29 0a  ITE_SHM_SHARED).
1f110 20 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d         || flags=
1f120 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c  =(SQLITE_SHM_UNL
1f130 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d  OCK | SQLITE_SHM
1f140 5f 45 58 43 4c 55 53 49 56 45 29 20 29 3b 0a 20  _EXCLUSIVE) );. 
1f150 20 61 73 73 65 72 74 28 20 6e 3d 3d 31 20 7c 7c   assert( n==1 ||
1f160 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
1f170 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 21  _SHM_EXCLUSIVE)!
1f180 3d 30 20 29 3b 0a 0a 20 20 6d 61 73 6b 20 3d 20  =0 );..  mask = 
1f190 28 31 3c 3c 28 6f 66 73 74 2b 6e 29 29 20 2d 20  (1<<(ofst+n)) - 
1f1a0 28 31 3c 3c 6f 66 73 74 29 3b 0a 20 20 61 73 73  (1<<ofst);.  ass
1f1b0 65 72 74 28 20 6e 3e 31 20 7c 7c 20 6d 61 73 6b  ert( n>1 || mask
1f1c0 3d 3d 28 31 3c 3c 6f 66 73 74 29 20 29 3b 0a 20  ==(1<<ofst) );. 
1f1d0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
1f1e0 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d  nter(pShmNode->m
1f1f0 75 74 65 78 29 3b 0a 20 20 69 66 28 20 66 6c 61  utex);.  if( fla
1f200 67 73 20 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f  gs & SQLITE_SHM_
1f210 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 75 31  UNLOCK ){.    u1
1f220 36 20 61 6c 6c 4d 61 73 6b 20 3d 20 30 3b 20 2f  6 allMask = 0; /
1f230 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b 73 20  * Mask of locks 
1f240 68 65 6c 64 20 62 79 20 73 69 62 6c 69 6e 67 73  held by siblings
1f250 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 65 20   */..    /* See 
1f260 69 66 20 61 6e 79 20 73 69 62 6c 69 6e 67 73 20  if any siblings 
1f270 68 6f 6c 64 20 74 68 69 73 20 73 61 6d 65 20 6c  hold this same l
1f280 6f 63 6b 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70  ock */.    for(p
1f290 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72  X=pShmNode->pFir
1f2a0 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70  st; pX; pX=pX->p
1f2b0 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28  Next){.      if(
1f2c0 20 70 58 3d 3d 70 20 29 20 63 6f 6e 74 69 6e 75   pX==p ) continu
1f2d0 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e;.      assert(
1f2e0 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26   (pX->exclMask &
1f2f0 20 28 70 2d 3e 65 78 63 6c 4d 61 73 6b 7c 70 2d   (p->exclMask|p-
1f300 3e 73 68 61 72 65 64 4d 61 73 6b 29 29 3d 3d 30  >sharedMask))==0
1f310 20 29 3b 0a 20 20 20 20 20 20 61 6c 6c 4d 61 73   );.      allMas
1f320 6b 20 7c 3d 20 70 58 2d 3e 73 68 61 72 65 64 4d  k |= pX->sharedM
1f330 61 73 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ask;.    }..    
1f340 2f 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 73 79  /* Unlock the sy
1f350 73 74 65 6d 2d 6c 65 76 65 6c 20 6c 6f 63 6b 73  stem-level locks
1f360 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 6d 61 73   */.    if( (mas
1f370 6b 20 26 20 61 6c 6c 4d 61 73 6b 29 3d 3d 30 20  k & allMask)==0 
1f380 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 75 6e  ){.      rc = un
1f390 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28  ixShmSystemLock(
1f3a0 70 53 68 6d 4e 6f 64 65 2c 20 46 5f 55 4e 4c 43  pShmNode, F_UNLC
1f3b0 4b 2c 20 6f 66 73 74 2b 55 4e 49 58 5f 53 48 4d  K, ofst+UNIX_SHM
1f3c0 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20 7d  _BASE, n);.    }
1f3d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
1f3e0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1f3f0 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e 64 6f 20 74  }..    /* Undo t
1f400 68 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 73 20 2a  he local locks *
1f410 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
1f420 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1f430 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 3d 20   p->exclMask &= 
1f440 7e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70 2d 3e  ~mask;.      p->
1f450 73 68 61 72 65 64 4d 61 73 6b 20 26 3d 20 7e 6d  sharedMask &= ~m
1f460 61 73 6b 3b 0a 20 20 20 20 7d 20 0a 20 20 7d 65  ask;.    } .  }e
1f470 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20 26 20  lse if( flags & 
1f480 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52 45  SQLITE_SHM_SHARE
1f490 44 20 29 7b 0a 20 20 20 20 75 31 36 20 61 6c 6c  D ){.    u16 all
1f4a0 53 68 61 72 65 64 20 3d 20 30 3b 20 20 2f 2a 20  Shared = 0;  /* 
1f4b0 55 6e 69 6f 6e 20 6f 66 20 6c 6f 63 6b 73 20 68  Union of locks h
1f4c0 65 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f  eld by connectio
1f4d0 6e 73 20 6f 74 68 65 72 20 74 68 61 6e 20 22 70  ns other than "p
1f4e0 22 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 46 69 6e  " */..    /* Fin
1f4f0 64 20 6f 75 74 20 77 68 69 63 68 20 73 68 61 72  d out which shar
1f500 65 64 20 6c 6f 63 6b 73 20 61 72 65 20 61 6c 72  ed locks are alr
1f510 65 61 64 79 20 68 65 6c 64 20 62 79 20 73 69 62  eady held by sib
1f520 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  ling connections
1f530 2e 0a 20 20 20 20 2a 2a 20 49 66 20 61 6e 79 20  ..    ** If any 
1f540 73 69 62 6c 69 6e 67 20 61 6c 72 65 61 64 79 20  sibling already 
1f550 68 6f 6c 64 73 20 61 6e 20 65 78 63 6c 75 73 69  holds an exclusi
1f560 76 65 20 6c 6f 63 6b 2c 20 67 6f 20 61 68 65 61  ve lock, go ahea
1f570 64 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20 20  d and return.   
1f580 20 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 2e   ** SQLITE_BUSY.
1f590 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
1f5a0 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69  pX=pShmNode->pFi
1f5b0 72 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e  rst; pX; pX=pX->
1f5c0 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66  pNext){.      if
1f5d0 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20  ( (pX->exclMask 
1f5e0 26 20 6d 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20  & mask)!=0 ){.  
1f5f0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1f600 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20  E_BUSY;.        
1f610 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
1f620 20 20 20 20 20 61 6c 6c 53 68 61 72 65 64 20 7c       allShared |
1f630 3d 20 70 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b  = pX->sharedMask
1f640 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1f650 47 65 74 20 73 68 61 72 65 64 20 6c 6f 63 6b 73  Get shared locks
1f660 20 61 74 20 74 68 65 20 73 79 73 74 65 6d 20 6c   at the system l
1f670 65 76 65 6c 2c 20 69 66 20 6e 65 63 65 73 73 61  evel, if necessa
1f680 72 79 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63  ry */.    if( rc
1f690 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1f6a0 20 20 20 20 20 69 66 28 20 28 61 6c 6c 53 68 61       if( (allSha
1f6b0 72 65 64 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29  red & mask)==0 )
1f6c0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 75  {.        rc = u
1f6d0 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b  nixShmSystemLock
1f6e0 28 70 53 68 6d 4e 6f 64 65 2c 20 46 5f 52 44 4c  (pShmNode, F_RDL
1f6f0 43 4b 2c 20 6f 66 73 74 2b 55 4e 49 58 5f 53 48  CK, ofst+UNIX_SH
1f700 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20  M_BASE, n);.    
1f710 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1f720 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1f730 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
1f740 20 20 20 20 2f 2a 20 47 65 74 20 74 68 65 20 6c      /* Get the l
1f750 6f 63 61 6c 20 73 68 61 72 65 64 20 6c 6f 63 6b  ocal shared lock
1f760 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d  s */.    if( rc=
1f770 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1f780 20 20 20 20 70 2d 3e 73 68 61 72 65 64 4d 61 73      p->sharedMas
1f790 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 7d  k |= mask;.    }
1f7a0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
1f7b0 20 4d 61 6b 65 20 73 75 72 65 20 6e 6f 20 73 69   Make sure no si
1f7c0 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e  bling connection
1f7d0 73 20 68 6f 6c 64 20 6c 6f 63 6b 73 20 74 68 61  s hold locks tha
1f7e0 74 20 77 69 6c 6c 20 62 6c 6f 63 6b 20 74 68 69  t will block thi
1f7f0 73 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 2e 20 20  s.    ** lock.  
1f800 49 66 20 61 6e 79 20 64 6f 2c 20 72 65 74 75 72  If any do, retur
1f810 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 20 72 69  n SQLITE_BUSY ri
1f820 67 68 74 20 61 77 61 79 2e 0a 20 20 20 20 2a 2f  ght away..    */
1f830 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68 6d  .    for(pX=pShm
1f840 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70 58  Node->pFirst; pX
1f850 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b  ; pX=pX->pNext){
1f860 0a 20 20 20 20 20 20 69 66 28 20 28 70 58 2d 3e  .      if( (pX->
1f870 65 78 63 6c 4d 61 73 6b 20 26 20 6d 61 73 6b 29  exclMask & mask)
1f880 21 3d 30 20 7c 7c 20 28 70 58 2d 3e 73 68 61 72  !=0 || (pX->shar
1f890 65 64 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d  edMask & mask)!=
1f8a0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  0 ){.        rc 
1f8b0 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
1f8c0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1f8d0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20      }.    }.  . 
1f8e0 20 20 20 2f 2a 20 47 65 74 20 74 68 65 20 65 78     /* Get the ex
1f8f0 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20 61 74  clusive locks at
1f900 20 74 68 65 20 73 79 73 74 65 6d 20 6c 65 76 65   the system leve
1f910 6c 2e 20 20 54 68 65 6e 20 69 66 20 73 75 63 63  l.  Then if succ
1f920 65 73 73 66 75 6c 0a 20 20 20 20 2a 2a 20 61 6c  essful.    ** al
1f930 73 6f 20 6d 61 72 6b 20 74 68 65 20 6c 6f 63 61  so mark the loca
1f940 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 73 20  l connection as 
1f950 62 65 69 6e 67 20 6c 6f 63 6b 65 64 2e 0a 20 20  being locked..  
1f960 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d    */.    if( rc=
1f970 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1f980 20 20 20 20 72 63 20 3d 20 75 6e 69 78 53 68 6d      rc = unixShm
1f990 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e  SystemLock(pShmN
1f9a0 6f 64 65 2c 20 46 5f 57 52 4c 43 4b 2c 20 6f 66  ode, F_WRLCK, of
1f9b0 73 74 2b 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45  st+UNIX_SHM_BASE
1f9c0 2c 20 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , n);.      if( 
1f9d0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1f9e0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1f9f0 20 28 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20   (p->sharedMask 
1fa00 26 20 6d 61 73 6b 29 3d 3d 30 20 29 3b 0a 20 20  & mask)==0 );.  
1fa10 20 20 20 20 20 20 70 2d 3e 65 78 63 6c 4d 61 73        p->exclMas
1fa20 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20  k |= mask;.     
1fa30 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73   }.    }.  }.  s
1fa40 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
1fa50 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  ve(pShmNode->mut
1fa60 65 78 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  ex);.  OSTRACE((
1fa70 22 53 48 4d 2d 4c 4f 43 4b 20 73 68 6d 69 64 2d  "SHM-LOCK shmid-
1fa80 25 64 2c 20 70 69 64 2d 25 64 20 67 6f 74 20 25  %d, pid-%d got %
1fa90 30 33 78 2c 25 30 33 78 5c 6e 22 2c 0a 20 20 20  03x,%03x\n",.   
1faa0 20 20 20 20 20 20 20 20 70 2d 3e 69 64 2c 20 67          p->id, g
1fab0 65 74 70 69 64 28 29 2c 20 70 2d 3e 73 68 61 72  etpid(), p->shar
1fac0 65 64 4d 61 73 6b 2c 20 70 2d 3e 65 78 63 6c 4d  edMask, p->exclM
1fad0 61 73 6b 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  ask));.  return 
1fae0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70  rc;.}../*.** Imp
1faf0 6c 65 6d 65 6e 74 20 61 20 6d 65 6d 6f 72 79 20  lement a memory 
1fb00 62 61 72 72 69 65 72 20 6f 72 20 6d 65 6d 6f 72  barrier or memor
1fb10 79 20 66 65 6e 63 65 20 6f 6e 20 73 68 61 72 65  y fence on share
1fb20 64 20 6d 65 6d 6f 72 79 2e 20 20 0a 2a 2a 0a 2a  d memory.  .**.*
1fb30 2a 20 41 6c 6c 20 6c 6f 61 64 73 20 61 6e 64 20  * All loads and 
1fb40 73 74 6f 72 65 73 20 62 65 67 75 6e 20 62 65 66  stores begun bef
1fb50 6f 72 65 20 74 68 65 20 62 61 72 72 69 65 72 20  ore the barrier 
1fb60 6d 75 73 74 20 63 6f 6d 70 6c 65 74 65 20 62 65  must complete be
1fb70 66 6f 72 65 0a 2a 2a 20 61 6e 79 20 6c 6f 61 64  fore.** any load
1fb80 20 6f 72 20 73 74 6f 72 65 20 62 65 67 75 6e 20   or store begun 
1fb90 61 66 74 65 72 20 74 68 65 20 62 61 72 72 69 65  after the barrie
1fba0 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
1fbb0 64 20 75 6e 69 78 53 68 6d 42 61 72 72 69 65 72  d unixShmBarrier
1fbc0 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  (.  sqlite3_file
1fbd0 20 2a 66 64 20 20 20 20 20 20 20 20 20 20 20 20   *fd            
1fbe0 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
1fbf0 66 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68 65  file holding the
1fc00 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a   shared memory *
1fc10 2f 0a 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  /.){.  UNUSED_PA
1fc20 52 41 4d 45 54 45 52 28 66 64 29 3b 0a 20 20 75  RAMETER(fd);.  u
1fc30 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
1fc40 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65  .  unixLeaveMute
1fc50 78 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  x();.}../*.** Cl
1fc60 6f 73 65 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e  ose a connection
1fc70 20 74 6f 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72   to shared-memor
1fc80 79 2e 20 20 44 65 6c 65 74 65 20 74 68 65 20 75  y.  Delete the u
1fc90 6e 64 65 72 6c 79 69 6e 67 20 0a 2a 2a 20 73 74  nderlying .** st
1fca0 6f 72 61 67 65 20 69 66 20 64 65 6c 65 74 65 46  orage if deleteF
1fcb0 6c 61 67 20 69 73 20 74 72 75 65 2e 0a 2a 2a 0a  lag is true..**.
1fcc0 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 6e  ** If there is n
1fcd0 6f 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  o shared memory 
1fce0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
1fcf0 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74  the connection t
1fd00 68 65 6e 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74  hen this.** rout
1fd10 69 6e 65 20 69 73 20 61 20 68 61 72 6d 6c 65 73  ine is a harmles
1fd20 73 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  s no-op..*/.stat
1fd30 69 63 20 69 6e 74 20 75 6e 69 78 53 68 6d 55 6e  ic int unixShmUn
1fd40 6d 61 70 28 0a 20 20 73 71 6c 69 74 65 33 5f 66  map(.  sqlite3_f
1fd50 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20  ile *fd,        
1fd60 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e         /* The un
1fd70 64 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73  derlying databas
1fd80 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  e file */.  int 
1fd90 64 65 6c 65 74 65 46 6c 61 67 20 20 20 20 20 20  deleteFlag      
1fda0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
1fdb0 65 6c 65 74 65 20 73 68 61 72 65 64 2d 6d 65 6d  elete shared-mem
1fdc0 6f 72 79 20 69 66 20 74 72 75 65 20 2a 2f 0a 29  ory if true */.)
1fdd0 7b 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 3b 20  {.  unixShm *p; 
1fde0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fdf0 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 6e 65      /* The conne
1fe00 63 74 69 6f 6e 20 74 6f 20 62 65 20 63 6c 6f 73  ction to be clos
1fe10 65 64 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 4e  ed */.  unixShmN
1fe20 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 20  ode *pShmNode;  
1fe30 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75          /* The u
1fe40 6e 64 65 72 6c 79 69 6e 67 20 73 68 61 72 65 64  nderlying shared
1fe50 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a  -memory file */.
1fe60 20 20 75 6e 69 78 53 68 6d 20 2a 2a 70 70 3b 20    unixShm **pp; 
1fe70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe80 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67    /* For looping
1fe90 20 6f 76 65 72 20 73 69 62 6c 69 6e 67 20 63 6f   over sibling co
1fea0 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 75  nnections */.  u
1feb0 6e 69 78 46 69 6c 65 20 2a 70 44 62 46 64 3b 20  nixFile *pDbFd; 
1fec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1fed0 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  * The underlying
1fee0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
1fef0 2f 0a 0a 20 20 70 44 62 46 64 20 3d 20 28 75 6e  /..  pDbFd = (un
1ff00 69 78 46 69 6c 65 2a 29 66 64 3b 0a 20 20 70 20  ixFile*)fd;.  p 
1ff10 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20  = pDbFd->pShm;. 
1ff20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
1ff30 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1ff40 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53  pShmNode = p->pS
1ff50 68 6d 4e 6f 64 65 3b 0a 0a 20 20 61 73 73 65 72  hmNode;..  asser
1ff60 74 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 70 44 62  t( pShmNode==pDb
1ff70 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d  Fd->pInode->pShm
1ff80 4e 6f 64 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Node );.  assert
1ff90 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f  ( pShmNode->pIno
1ffa0 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64  de==pDbFd->pInod
1ffb0 65 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76  e );..  /* Remov
1ffc0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20 66  e connection p f
1ffd0 72 6f 6d 20 74 68 65 20 73 65 74 20 6f 66 20 63  rom the set of c
1ffe0 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 73 73 6f 63  onnections assoc
1fff0 69 61 74 65 64 0a 20 20 2a 2a 20 77 69 74 68 20  iated.  ** with 
20000 70 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 73 71  pShmNode */.  sq
20010 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
20020 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  r(pShmNode->mute
20030 78 29 3b 0a 20 20 66 6f 72 28 70 70 3d 26 70 53  x);.  for(pp=&pS
20040 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20  hmNode->pFirst; 
20050 28 2a 70 70 29 21 3d 70 3b 20 70 70 20 3d 20 26  (*pp)!=p; pp = &
20060 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29 7b 7d 0a  (*pp)->pNext){}.
20070 20 20 2a 70 70 20 3d 20 70 2d 3e 70 4e 65 78 74    *pp = p->pNext
20080 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20 74 68 65  ;..  /* Free the
20090 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20 2a 2f   connection p */
200a0 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
200b0 70 29 3b 0a 20 20 70 44 62 46 64 2d 3e 70 53 68  p);.  pDbFd->pSh
200c0 6d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  m = 0;.  sqlite3
200d0 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68  _mutex_leave(pSh
200e0 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 0a  mNode->mutex);..
200f0 20 20 2f 2a 20 49 66 20 70 53 68 6d 4e 6f 64 65    /* If pShmNode
20100 2d 3e 6e 52 65 66 20 68 61 73 20 72 65 61 63 68  ->nRef has reach
20110 65 64 20 30 2c 20 74 68 65 6e 20 63 6c 6f 73 65  ed 0, then close
20120 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 0a   the underlying.
20130 20 20 2a 2a 20 73 68 61 72 65 64 2d 6d 65 6d 6f    ** shared-memo
20140 72 79 20 66 69 6c 65 2c 20 74 6f 6f 20 2a 2f 0a  ry file, too */.
20150 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
20160 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53  ();.  assert( pS
20170 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3e 30 20 29  hmNode->nRef>0 )
20180 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  ;.  pShmNode->nR
20190 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 53 68 6d  ef--;.  if( pShm
201a0 4e 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b  Node->nRef==0 ){
201b0 0a 20 20 20 20 69 66 28 20 64 65 6c 65 74 65 46  .    if( deleteF
201c0 6c 61 67 20 29 20 75 6e 6c 69 6e 6b 28 70 53 68  lag ) unlink(pSh
201d0 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65  mNode->zFilename
201e0 29 3b 0a 20 20 20 20 75 6e 69 78 53 68 6d 50 75  );.    unixShmPu
201f0 72 67 65 28 70 44 62 46 64 29 3b 0a 20 20 7d 0a  rge(pDbFd);.  }.
20200 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
20210 28 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53 51  ();..  return SQ
20220 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 23 65 6c  LITE_OK;.}...#el
20230 73 65 0a 23 20 64 65 66 69 6e 65 20 75 6e 69 78  se.# define unix
20240 53 68 6d 4d 61 70 20 20 20 20 20 30 0a 23 20 64  ShmMap     0.# d
20250 65 66 69 6e 65 20 75 6e 69 78 53 68 6d 4c 6f 63  efine unixShmLoc
20260 6b 20 20 20 20 30 0a 23 20 64 65 66 69 6e 65 20  k    0.# define 
20270 75 6e 69 78 53 68 6d 42 61 72 72 69 65 72 20 30  unixShmBarrier 0
20280 0a 23 20 64 65 66 69 6e 65 20 75 6e 69 78 53 68  .# define unixSh
20290 6d 55 6e 6d 61 70 20 20 20 30 0a 23 65 6e 64 69  mUnmap   0.#endi
202a0 66 20 2f 2a 20 23 69 66 6e 64 65 66 20 53 51 4c  f /* #ifndef SQL
202b0 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a  ITE_OMIT_WAL */.
202c0 0a 2f 2a 0a 2a 2a 20 48 65 72 65 20 65 6e 64 73  ./*.** Here ends
202d0 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   the implementat
202e0 69 6f 6e 20 6f 66 20 61 6c 6c 20 73 71 6c 69 74  ion of all sqlit
202f0 65 33 5f 66 69 6c 65 20 6d 65 74 68 6f 64 73 2e  e3_file methods.
20300 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .**.************
20310 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 73  ********** End s
20320 71 6c 69 74 65 33 5f 66 69 6c 65 20 4d 65 74 68  qlite3_file Meth
20330 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ods ************
20340 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20350 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
20360 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20370 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20380 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20390 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
203a0 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  **/../*.** This 
203b0 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74 61 69 6e  division contain
203c0 73 20 64 65 66 69 6e 69 74 69 6f 6e 73 20 6f 66  s definitions of
203d0 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
203e0 6f 64 73 20 6f 62 6a 65 63 74 73 20 74 68 61 74  ods objects that
203f0 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 76 61  .** implement va
20400 72 69 6f 75 73 20 66 69 6c 65 20 6c 6f 63 6b 69  rious file locki
20410 6e 67 20 73 74 72 61 74 65 67 69 65 73 2e 20 20  ng strategies.  
20420 49 74 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 73  It also contains
20430 20 64 65 66 69 6e 69 74 69 6f 6e 73 0a 2a 2a 20   definitions.** 
20440 6f 66 20 22 66 69 6e 64 65 72 22 20 66 75 6e 63  of "finder" func
20450 74 69 6f 6e 73 2e 20 20 41 20 66 69 6e 64 65 72  tions.  A finder
20460 2d 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65  -function is use
20470 64 20 74 6f 20 6c 6f 63 61 74 65 20 74 68 65 20  d to locate the 
20480 61 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a 20 73  appropriate.** s
20490 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
204a0 73 20 6f 62 6a 65 63 74 20 66 6f 72 20 61 20 70  s object for a p
204b0 61 72 74 69 63 75 6c 61 72 20 64 61 74 61 62 61  articular databa
204c0 73 65 20 66 69 6c 65 2e 20 20 54 68 65 20 70 41  se file.  The pA
204d0 70 70 44 61 74 61 0a 2a 2a 20 66 69 65 6c 64 20  ppData.** field 
204e0 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f 76  of the sqlite3_v
204f0 66 73 20 56 46 53 20 6f 62 6a 65 63 74 73 20 61  fs VFS objects a
20500 72 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  re initialized t
20510 6f 20 62 65 20 70 6f 69 6e 74 65 72 73 20 74 6f  o be pointers to
20520 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65 63 74 20  .** the correct 
20530 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20  finder-function 
20540 66 6f 72 20 74 68 61 74 20 56 46 53 2e 0a 2a 2a  for that VFS..**
20550 0a 2a 2a 20 4d 6f 73 74 20 66 69 6e 64 65 72 20  .** Most finder 
20560 66 75 6e 63 74 69 6f 6e 73 20 72 65 74 75 72 6e  functions return
20570 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
20580 66 69 78 65 64 20 73 71 6c 69 74 65 33 5f 69 6f  fixed sqlite3_io
20590 5f 6d 65 74 68 6f 64 73 0a 2a 2a 20 6f 62 6a 65  _methods.** obje
205a0 63 74 2e 20 20 54 68 65 20 6f 6e 6c 79 20 69 6e  ct.  The only in
205b0 74 65 72 65 73 74 69 6e 67 20 66 69 6e 64 65 72  teresting finder
205c0 2d 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 75 74  -function is aut
205d0 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20 77  olockIoFinder, w
205e0 68 69 63 68 0a 2a 2a 20 6c 6f 6f 6b 73 20 61 74  hich.** looks at
205f0 20 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d 20   the filesystem 
20600 74 79 70 65 20 61 6e 64 20 74 72 69 65 73 20 74  type and tries t
20610 6f 20 67 75 65 73 73 20 74 68 65 20 62 65 73 74  o guess the best
20620 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73 74 72 61   locking.** stra
20630 74 65 67 79 20 66 72 6f 6d 20 74 68 61 74 2e 0a  tegy from that..
20640 2a 2a 0a 2a 2a 20 46 6f 72 20 66 69 6e 64 65 72  **.** For finder
20650 2d 66 75 6e 74 69 6f 6e 20 46 2c 20 74 77 6f 20  -funtion F, two 
20660 6f 62 6a 65 63 74 73 20 61 72 65 20 63 72 65 61  objects are crea
20670 74 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31  ted:.**.**    (1
20680 29 20 54 68 65 20 72 65 61 6c 20 66 69 6e 64 65  ) The real finde
20690 72 2d 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 64  r-function named
206a0 20 22 46 49 6d 70 74 28 29 22 2e 0a 2a 2a 0a 2a   "FImpt()"..**.*
206b0 2a 20 20 20 20 28 32 29 20 41 20 63 6f 6e 73 74  *    (2) A const
206c0 61 6e 74 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  ant pointer to t
206d0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  his function nam
206e0 65 64 20 6a 75 73 74 20 22 46 22 2e 0a 2a 2a 0a  ed just "F"..**.
206f0 2a 2a 0a 2a 2a 20 41 20 70 6f 69 6e 74 65 72 20  **.** A pointer 
20700 74 6f 20 74 68 65 20 46 20 70 6f 69 6e 74 65 72  to the F pointer
20710 20 69 73 20 75 73 65 64 20 61 73 20 74 68 65 20   is used as the 
20720 70 41 70 70 44 61 74 61 20 76 61 6c 75 65 20 66  pAppData value f
20730 6f 72 20 56 46 53 0a 2a 2a 20 6f 62 6a 65 63 74  or VFS.** object
20740 73 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 64  s.  We have to d
20750 6f 20 74 68 69 73 20 69 6e 73 74 65 61 64 20 6f  o this instead o
20760 66 20 6c 65 74 74 69 6e 67 20 70 41 70 70 44 61  f letting pAppDa
20770 74 61 20 70 6f 69 6e 74 0a 2a 2a 20 64 69 72 65  ta point.** dire
20780 63 74 6c 79 20 61 74 20 74 68 65 20 66 69 6e 64  ctly at the find
20790 65 72 2d 66 75 6e 63 74 69 6f 6e 20 73 69 6e 63  er-function sinc
207a0 65 20 43 39 30 20 72 75 6c 65 73 20 70 72 65 76  e C90 rules prev
207b0 65 6e 74 20 61 20 76 6f 69 64 2a 0a 2a 2a 20 66  ent a void*.** f
207c0 72 6f 6d 20 62 65 20 63 61 73 74 20 69 6e 74 6f  rom be cast into
207d0 20 61 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e   a function poin
207e0 74 65 72 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 45 61  ter..**.**.** Ea
207f0 63 68 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  ch instance of t
20800 68 69 73 20 6d 61 63 72 6f 20 67 65 6e 65 72 61  his macro genera
20810 74 65 73 20 74 77 6f 20 6f 62 6a 65 63 74 73 3a  tes two objects:
20820 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 41 20 63 6f  .**.**   *  A co
20830 6e 73 74 61 6e 74 20 73 71 6c 69 74 65 33 5f 69  nstant sqlite3_i
20840 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74  o_methods object
20850 20 63 61 6c 6c 20 4d 45 54 48 4f 44 20 74 68 61   call METHOD tha
20860 74 20 68 61 73 20 6c 6f 63 6b 69 6e 67 0a 2a 2a  t has locking.**
20870 20 20 20 20 20 20 6d 65 74 68 6f 64 73 20 43 4c        methods CL
20880 4f 53 45 2c 20 4c 4f 43 4b 2c 20 55 4e 4c 4f 43  OSE, LOCK, UNLOC
20890 4b 2c 20 43 4b 52 45 53 4c 4f 43 4b 2e 0a 2a 2a  K, CKRESLOCK..**
208a0 0a 2a 2a 20 20 20 2a 20 20 41 6e 20 49 2f 4f 20  .**   *  An I/O 
208b0 6d 65 74 68 6f 64 20 66 69 6e 64 65 72 20 66 75  method finder fu
208c0 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20 46 49  nction called FI
208d0 4e 44 45 52 20 74 68 61 74 20 72 65 74 75 72 6e  NDER that return
208e0 73 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 20  s a pointer.**  
208f0 20 20 20 20 74 6f 20 74 68 65 20 4d 45 54 48 4f      to the METHO
20900 44 20 6f 62 6a 65 63 74 20 69 6e 20 74 68 65 20  D object in the 
20910 70 72 65 76 69 6f 75 73 20 62 75 6c 6c 65 74 2e  previous bullet.
20920 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 49 4f 4d 45  .*/.#define IOME
20930 54 48 4f 44 53 28 46 49 4e 44 45 52 2c 20 4d 45  THODS(FINDER, ME
20940 54 48 4f 44 2c 20 56 45 52 53 49 4f 4e 2c 20 43  THOD, VERSION, C
20950 4c 4f 53 45 2c 20 4c 4f 43 4b 2c 20 55 4e 4c 4f  LOSE, LOCK, UNLO
20960 43 4b 2c 20 43 4b 4c 4f 43 4b 29 20 20 20 20 20  CK, CKLOCK)     
20970 20 5c 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20   \.static const 
20980 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
20990 64 73 20 4d 45 54 48 4f 44 20 3d 20 7b 20 20 20  ds METHOD = {   
209a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
209b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
209c0 5c 0a 20 20 20 56 45 52 53 49 4f 4e 2c 20 20 20  \.   VERSION,   
209d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
209e0 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 20   /* iVersion */ 
209f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
20a10 0a 20 20 20 43 4c 4f 53 45 2c 20 20 20 20 20 20  .   CLOSE,      
20a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20a30 2f 2a 20 78 43 6c 6f 73 65 20 2a 2f 20 20 20 20  /* xClose */    
20a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
20a60 20 20 20 75 6e 69 78 52 65 61 64 2c 20 20 20 20     unixRead,    
20a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20a80 2a 20 78 52 65 61 64 20 2a 2f 20 20 20 20 20 20  * xRead */      
20a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
20ab0 20 20 75 6e 69 78 57 72 69 74 65 2c 20 20 20 20    unixWrite,    
20ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20ad0 20 78 57 72 69 74 65 20 2a 2f 20 20 20 20 20 20   xWrite */      
20ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20af0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
20b00 20 75 6e 69 78 54 72 75 6e 63 61 74 65 2c 20 20   unixTruncate,  
20b10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20b20 78 54 72 75 6e 63 61 74 65 20 2a 2f 20 20 20 20  xTruncate */    
20b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20b40 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
20b50 75 6e 69 78 53 79 6e 63 2c 20 20 20 20 20 20 20  unixSync,       
20b60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
20b70 53 79 6e 63 20 2a 2f 20 20 20 20 20 20 20 20 20  Sync */         
20b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20b90 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75            \.   u
20ba0 6e 69 78 46 69 6c 65 53 69 7a 65 2c 20 20 20 20  nixFileSize,    
20bb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46             /* xF
20bc0 69 6c 65 53 69 7a 65 20 2a 2f 20 20 20 20 20 20  ileSize */      
20bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20be0 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 4c 4f           \.   LO
20bf0 43 4b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  CK,             
20c00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f            /* xLo
20c10 63 6b 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  ck */           
20c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20c30 20 20 20 20 20 20 20 20 5c 0a 20 20 20 55 4e 4c          \.   UNL
20c40 4f 43 4b 2c 20 20 20 20 20 20 20 20 20 20 20 20  OCK,            
20c50 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c           /* xUnl
20c60 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ock */          
20c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20c80 20 20 20 20 20 20 20 5c 0a 20 20 20 43 4b 4c 4f         \.   CKLO
20c90 43 4b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  CK,             
20ca0 20 20 20 20 20 20 20 20 2f 2a 20 78 43 68 65 63          /* xChec
20cb0 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 2a 2f  kReservedLock */
20cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20cd0 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 46        \.   unixF
20ce0 69 6c 65 43 6f 6e 74 72 6f 6c 2c 20 20 20 20 20  ileControl,     
20cf0 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 65 43         /* xFileC
20d00 6f 6e 74 72 6f 6c 20 2a 2f 20 20 20 20 20 20 20  ontrol */       
20d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20d20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 65       \.   unixSe
20d30 63 74 6f 72 53 69 7a 65 2c 20 20 20 20 20 20 20  ctorSize,       
20d40 20 20 20 20 20 20 2f 2a 20 78 53 65 63 74 6f 72        /* xSector
20d50 53 69 7a 65 20 2a 2f 20 20 20 20 20 20 20 20 20  Size */         
20d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20d70 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 44 65 76      \.   unixDev
20d80 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
20d90 63 73 2c 20 20 2f 2a 20 78 44 65 76 69 63 65 43  cs,  /* xDeviceC
20da0 61 70 61 62 69 6c 69 74 69 65 73 20 2a 2f 20 20  apabilities */  
20db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20dc0 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 68 6d 4d     \.   unixShmM
20dd0 61 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ap,             
20de0 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20 2a      /* xShmMap *
20df0 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
20e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20e10 20 20 5c 0a 20 20 20 75 6e 69 78 53 68 6d 4c 6f    \.   unixShmLo
20e20 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
20e30 20 20 20 2f 2a 20 78 53 68 6d 4c 6f 63 6b 20 2a     /* xShmLock *
20e40 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
20e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20e60 20 5c 0a 20 20 20 75 6e 69 78 53 68 6d 42 61 72   \.   unixShmBar
20e70 72 69 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  rier,           
20e80 20 20 2f 2a 20 78 53 68 6d 42 61 72 72 69 65 72    /* xShmBarrier
20e90 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
20ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20eb0 5c 0a 20 20 20 75 6e 69 78 53 68 6d 55 6e 6d 61  \.   unixShmUnma
20ec0 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p               
20ed0 20 2f 2a 20 78 53 68 6d 55 6e 6d 61 70 20 2a 2f   /* xShmUnmap */
20ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
20f00 0a 7d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  .};             
20f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
20f50 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c  static const sql
20f60 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
20f70 2a 46 49 4e 44 45 52 23 23 49 6d 70 6c 28 63 6f  *FINDER##Impl(co
20f80 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 75 6e 69  nst char *z, uni
20f90 78 46 69 6c 65 20 2a 70 29 7b 20 20 20 5c 0a 20  xFile *p){   \. 
20fa0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
20fb0 52 28 7a 29 3b 20 55 4e 55 53 45 44 5f 50 41 52  R(z); UNUSED_PAR
20fc0 41 4d 45 54 45 52 28 70 29 3b 20 20 20 20 20 20  AMETER(p);      
20fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20fe0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
20ff0 72 65 74 75 72 6e 20 26 4d 45 54 48 4f 44 3b 20  return &METHOD; 
21000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21030 20 20 20 20 20 20 20 20 20 20 20 5c 0a 7d 20 20             \.}  
21040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21080 20 20 20 20 20 20 20 20 20 20 5c 0a 73 74 61 74            \.stat
21090 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ic const sqlite3
210a0 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 28 2a 63  _io_methods *(*c
210b0 6f 6e 73 74 20 46 49 4e 44 45 52 29 28 63 6f 6e  onst FINDER)(con
210c0 73 74 20 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c  st char*,unixFil
210d0 65 20 2a 70 29 20 20 20 20 5c 0a 20 20 20 20 3d  e *p)    \.    =
210e0 20 46 49 4e 44 45 52 23 23 49 6d 70 6c 3b 0a 0a   FINDER##Impl;..
210f0 2f 2a 0a 2a 2a 20 48 65 72 65 20 61 72 65 20 61  /*.** Here are a
21100 6c 6c 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65  ll of the sqlite
21110 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a  3_io_methods obj
21120 65 63 74 73 20 66 6f 72 20 65 61 63 68 20 6f 66  ects for each of
21130 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20   the.** locking 
21140 73 74 72 61 74 65 67 69 65 73 2e 20 20 46 75 6e  strategies.  Fun
21150 63 74 69 6f 6e 73 20 74 68 61 74 20 72 65 74 75  ctions that retu
21160 72 6e 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 74  rn pointers to t
21170 68 65 73 65 20 6d 65 74 68 6f 64 73 0a 2a 2a 20  hese methods.** 
21180 61 72 65 20 61 6c 73 6f 20 63 72 65 61 74 65 64  are also created
21190 2e 0a 2a 2f 0a 49 4f 4d 45 54 48 4f 44 53 28 0a  ..*/.IOMETHODS(.
211a0 20 20 70 6f 73 69 78 49 6f 46 69 6e 64 65 72 2c    posixIoFinder,
211b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
211c0 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e  inder function n
211d0 61 6d 65 20 2a 2f 0a 20 20 70 6f 73 69 78 49 6f  ame */.  posixIo
211e0 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20  Methods,        
211f0 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f     /* sqlite3_io
21200 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20  _methods object 
21210 6e 61 6d 65 20 2a 2f 0a 20 20 32 2c 20 20 20 20  name */.  2,    
21220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21230 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65      /* shared me
21240 6d 6f 72 79 20 69 73 20 65 6e 61 62 6c 65 64 20  mory is enabled 
21250 2a 2f 0a 20 20 75 6e 69 78 43 6c 6f 73 65 2c 20  */.  unixClose, 
21260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21270 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20  * xClose method 
21280 2a 2f 0a 20 20 75 6e 69 78 4c 6f 63 6b 2c 20 20  */.  unixLock,  
21290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
212a0 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  * xLock method *
212b0 2f 0a 20 20 75 6e 69 78 55 6e 6c 6f 63 6b 2c 20  /.  unixUnlock, 
212c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
212d0 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20   xUnlock method 
212e0 2a 2f 0a 20 20 75 6e 69 78 43 68 65 63 6b 52 65  */.  unixCheckRe
212f0 73 65 72 76 65 64 4c 6f 63 6b 20 20 20 20 20 2f  servedLock     /
21300 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  * xCheckReserved
21310 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29  Lock method */.)
21320 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 6e 6f  .IOMETHODS(.  no
21330 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20 20 20  lockIoFinder,   
21340 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65          /* Finde
21350 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20  r function name 
21360 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 49 6f 4d 65 74  */.  nolockIoMet
21370 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20 2f  hods,          /
21380 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  * sqlite3_io_met
21390 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65  hods object name
213a0 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20   */.  1,        
213b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
213c0 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  /* shared memory
213d0 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a   is disabled */.
213e0 20 20 6e 6f 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20    nolockClose,  
213f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
21400 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a  Close method */.
21410 20 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20    nolockLock,   
21420 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
21430 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  Lock method */. 
21440 20 6e 6f 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20   nolockUnlock,  
21450 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55             /* xU
21460 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  nlock method */.
21470 20 20 6e 6f 6c 6f 63 6b 43 68 65 63 6b 52 65 73    nolockCheckRes
21480 65 72 76 65 64 4c 6f 63 6b 20 20 20 2f 2a 20 78  ervedLock   /* x
21490 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
214a0 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 49 4f  k method */.).IO
214b0 4d 45 54 48 4f 44 53 28 0a 20 20 64 6f 74 6c 6f  METHODS(.  dotlo
214c0 63 6b 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20  ckIoFinder,     
214d0 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66       /* Finder f
214e0 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a  unction name */.
214f0 20 20 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f    dotlockIoMetho
21500 64 73 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 73  ds,         /* s
21510 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
21520 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f  s object name */
21530 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20 20 20  .  1,           
21540 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21550 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73  shared memory is
21560 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 64   disabled */.  d
21570 6f 74 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20 20 20  otlockClose,    
21580 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f           /* xClo
21590 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 64  se method */.  d
215a0 6f 74 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20 20  otlockLock,     
215b0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63           /* xLoc
215c0 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 64 6f  k method */.  do
215d0 74 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20  tlockUnlock,    
215e0 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f          /* xUnlo
215f0 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 64  ck method */.  d
21600 6f 74 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72  otlockCheckReser
21610 76 65 64 4c 6f 63 6b 20 20 2f 2a 20 78 43 68 65  vedLock  /* xChe
21620 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d  ckReservedLock m
21630 65 74 68 6f 64 20 2a 2f 0a 29 0a 0a 23 69 66 20  ethod */.)..#if 
21640 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
21650 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 21  CKING_STYLE && !
21660 4f 53 5f 56 58 57 4f 52 4b 53 0a 49 4f 4d 45 54  OS_VXWORKS.IOMET
21670 48 4f 44 53 28 0a 20 20 66 6c 6f 63 6b 49 6f 46  HODS(.  flockIoF
21680 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20  inder,          
21690 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63    /* Finder func
216a0 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 66  tion name */.  f
216b0 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 2c 20 20  lockIoMethods,  
216c0 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69           /* sqli
216d0 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f  te3_io_methods o
216e0 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20  bject name */.  
216f0 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1,              
21700 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61            /* sha
21710 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69  red memory is di
21720 73 61 62 6c 65 64 20 2a 2f 0a 20 20 66 6c 6f 63  sabled */.  floc
21730 6b 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20  kClose,         
21740 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20        /* xClose 
21750 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f 63  method */.  floc
21760 6b 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  kLock,          
21770 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d        /* xLock m
21780 65 74 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b  ethod */.  flock
21790 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  Unlock,         
217a0 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20       /* xUnlock 
217b0 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f 63  method */.  floc
217c0 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  kCheckReservedLo
217d0 63 6b 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52  ck    /* xCheckR
217e0 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68  eservedLock meth
217f0 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a  od */.).#endif..
21800 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 49  #if OS_VXWORKS.I
21810 4f 4d 45 54 48 4f 44 53 28 0a 20 20 73 65 6d 49  OMETHODS(.  semI
21820 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20  oFinder,        
21830 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20        /* Finder 
21840 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f  function name */
21850 0a 20 20 73 65 6d 49 6f 4d 65 74 68 6f 64 73 2c  .  semIoMethods,
21860 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21870 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
21880 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a  ds object name *
21890 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20 20  /.  1,          
218a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
218b0 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69   shared memory i
218c0 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20  s disabled */.  
218d0 73 65 6d 43 6c 6f 73 65 2c 20 20 20 20 20 20 20  semClose,       
218e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c            /* xCl
218f0 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ose method */.  
21900 73 65 6d 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20  semLock,        
21910 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f            /* xLo
21920 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 73  ck method */.  s
21930 65 6d 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20  emUnlock,       
21940 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c           /* xUnl
21950 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
21960 73 65 6d 43 68 65 63 6b 52 65 73 65 72 76 65 64  semCheckReserved
21970 4c 6f 63 6b 20 20 20 20 20 20 2f 2a 20 78 43 68  Lock      /* xCh
21980 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20  eckReservedLock 
21990 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64  method */.).#end
219a0 69 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  if..#if defined(
219b0 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51  __APPLE__) && SQ
219c0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
219d0 49 4e 47 5f 53 54 59 4c 45 0a 49 4f 4d 45 54 48  ING_STYLE.IOMETH
219e0 4f 44 53 28 0a 20 20 61 66 70 49 6f 46 69 6e 64  ODS(.  afpIoFind
219f0 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
21a00 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74   /* Finder funct
21a10 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 61 66  ion name */.  af
21a20 70 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20  pIoMethods,     
21a30 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74          /* sqlit
21a40 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62  e3_io_methods ob
21a50 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31  ject name */.  1
21a60 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
21a70 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72           /* shar
21a80 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73  ed memory is dis
21a90 61 62 6c 65 64 20 2a 2f 0a 20 20 61 66 70 43 6c  abled */.  afpCl
21aa0 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ose,            
21ab0 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d       /* xClose m
21ac0 65 74 68 6f 64 20 2a 2f 0a 20 20 61 66 70 4c 6f  ethod */.  afpLo
21ad0 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
21ae0 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65       /* xLock me
21af0 74 68 6f 64 20 2a 2f 0a 20 20 61 66 70 55 6e 6c  thod */.  afpUnl
21b00 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
21b10 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d      /* xUnlock m
21b20 65 74 68 6f 64 20 2a 2f 0a 20 20 61 66 70 43 68  ethod */.  afpCh
21b30 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20  eckReservedLock 
21b40 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65       /* xCheckRe
21b50 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f  servedLock metho
21b60 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 2f  d */.).#endif../
21b70 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79 20 6c  *.** The proxy l
21b80 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 20 69 73  ocking method is
21b90 20 61 20 22 73 75 70 65 72 2d 6d 65 74 68 6f 64   a "super-method
21ba0 22 20 69 6e 20 74 68 65 20 73 65 6e 73 65 20 74  " in the sense t
21bb0 68 61 74 20 69 74 0a 2a 2a 20 6f 70 65 6e 73 20  hat it.** opens 
21bc0 73 65 63 6f 6e 64 61 72 79 20 66 69 6c 65 20 64  secondary file d
21bd0 65 73 63 72 69 70 74 6f 72 73 20 66 6f 72 20 74  escriptors for t
21be0 68 65 20 63 6f 6e 63 68 20 61 6e 64 20 6c 6f 63  he conch and loc
21bf0 6b 20 66 69 6c 65 73 20 61 6e 64 0a 2a 2a 20 69  k files and.** i
21c00 74 20 75 73 65 73 20 70 72 6f 78 79 2c 20 64 6f  t uses proxy, do
21c10 74 2d 66 69 6c 65 2c 20 41 46 50 2c 20 61 6e 64  t-file, AFP, and
21c20 20 66 6c 6f 63 6b 28 29 20 6c 6f 63 6b 69 6e 67   flock() locking
21c30 20 6d 65 74 68 6f 64 73 20 6f 6e 20 74 68 6f 73   methods on thos
21c40 65 0a 2a 2a 20 73 65 63 6f 6e 64 61 72 79 20 66  e.** secondary f
21c50 69 6c 65 73 2e 20 20 46 6f 72 20 74 68 69 73 20  iles.  For this 
21c60 72 65 61 73 6f 6e 2c 20 74 68 65 20 64 69 76 69  reason, the divi
21c70 73 69 6f 6e 20 74 68 61 74 20 69 6d 70 6c 65 6d  sion that implem
21c80 65 6e 74 73 0a 2a 2a 20 70 72 6f 78 79 20 6c 6f  ents.** proxy lo
21c90 63 6b 69 6e 67 20 69 73 20 6c 6f 63 61 74 65 64  cking is located
21ca0 20 6d 75 63 68 20 66 75 72 74 68 65 72 20 64 6f   much further do
21cb0 77 6e 20 69 6e 20 74 68 65 20 66 69 6c 65 2e 20  wn in the file. 
21cc0 20 42 75 74 20 77 65 20 6e 65 65 64 0a 2a 2a 20   But we need.** 
21cd0 74 6f 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20  to go ahead and 
21ce0 64 65 66 69 6e 65 20 74 68 65 20 73 71 6c 69 74  define the sqlit
21cf0 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 61 6e  e3_io_methods an
21d00 64 20 66 69 6e 64 65 72 20 66 75 6e 63 74 69 6f  d finder functio
21d10 6e 0a 2a 2a 20 66 6f 72 20 70 72 6f 78 79 20 6c  n.** for proxy l
21d20 6f 63 6b 69 6e 67 20 68 65 72 65 2e 20 20 53 6f  ocking here.  So
21d30 20 77 65 20 66 6f 72 77 61 72 64 20 64 65 63 6c   we forward decl
21d40 61 72 65 20 74 68 65 20 49 2f 4f 20 6d 65 74 68  are the I/O meth
21d50 6f 64 73 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69  ods..*/.#if defi
21d60 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26  ned(__APPLE__) &
21d70 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  & SQLITE_ENABLE_
21d80 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 73 74  LOCKING_STYLE.st
21d90 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43 6c  atic int proxyCl
21da0 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ose(sqlite3_file
21db0 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 70  *);.static int p
21dc0 72 6f 78 79 4c 6f 63 6b 28 73 71 6c 69 74 65 33  roxyLock(sqlite3
21dd0 5f 66 69 6c 65 2a 2c 20 69 6e 74 29 3b 0a 73 74  _file*, int);.st
21de0 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 55 6e  atic int proxyUn
21df0 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  lock(sqlite3_fil
21e00 65 2a 2c 20 69 6e 74 29 3b 0a 73 74 61 74 69 63  e*, int);.static
21e10 20 69 6e 74 20 70 72 6f 78 79 43 68 65 63 6b 52   int proxyCheckR
21e20 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69  eservedLock(sqli
21e30 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 2a 29  te3_file*, int*)
21e40 3b 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 70  ;.IOMETHODS(.  p
21e50 72 6f 78 79 49 6f 46 69 6e 64 65 72 2c 20 20 20  roxyIoFinder,   
21e60 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64           /* Find
21e70 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  er function name
21e80 20 2a 2f 0a 20 20 70 72 6f 78 79 49 6f 4d 65 74   */.  proxyIoMet
21e90 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20 20  hods,           
21ea0 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  /* sqlite3_io_me
21eb0 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d  thods object nam
21ec0 65 20 2a 2f 0a 20 20 32 2c 20 20 20 20 20 20 20  e */.  2,       
21ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21ee0 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72   /* shared memor
21ef0 79 20 69 73 20 65 6e 61 62 6c 65 64 20 2a 2f 0a  y is enabled */.
21f00 20 20 70 72 6f 78 79 43 6c 6f 73 65 2c 20 20 20    proxyClose,   
21f10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
21f20 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a  Close method */.
21f30 20 20 70 72 6f 78 79 4c 6f 63 6b 2c 20 20 20 20    proxyLock,    
21f40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
21f50 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  Lock method */. 
21f60 20 70 72 6f 78 79 55 6e 6c 6f 63 6b 2c 20 20 20   proxyUnlock,   
21f70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55             /* xU
21f80 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  nlock method */.
21f90 20 20 70 72 6f 78 79 43 68 65 63 6b 52 65 73 65    proxyCheckRese
21fa0 72 76 65 64 4c 6f 63 6b 20 20 20 20 2f 2a 20 78  rvedLock    /* x
21fb0 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
21fc0 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65  k method */.).#e
21fd0 6e 64 69 66 0a 0a 2f 2a 20 6e 66 73 20 6c 6f 63  ndif../* nfs loc
21fe0 6b 64 20 6f 6e 20 4f 53 58 20 31 30 2e 33 2b 20  kd on OSX 10.3+ 
21ff0 64 6f 65 73 6e 27 74 20 63 6c 65 61 72 20 77 72  doesn't clear wr
22000 69 74 65 20 6c 6f 63 6b 73 20 77 68 65 6e 20 61  ite locks when a
22010 20 72 65 61 64 20 6c 6f 63 6b 20 69 73 20 73 65   read lock is se
22020 74 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64  t */.#if defined
22030 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53  (__APPLE__) && S
22040 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
22050 4b 49 4e 47 5f 53 54 59 4c 45 0a 49 4f 4d 45 54  KING_STYLE.IOMET
22060 48 4f 44 53 28 0a 20 20 6e 66 73 49 6f 46 69 6e  HODS(.  nfsIoFin
22070 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  der,            
22080 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e     /* Finder fun
22090 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  ction name */.  
220a0 6e 66 73 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20  nfsIoMethods,   
220b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71             /* sq
220c0 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
220d0 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a   object name */.
220e0 20 20 31 2c 20 20 20 20 20 20 20 20 20 20 20 20    1,            
220f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22100 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73  shared memory is
22110 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 75   disabled */.  u
22120 6e 69 78 43 6c 6f 73 65 2c 20 20 20 20 20 20 20  nixClose,       
22130 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c            /* xCl
22140 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ose method */.  
22150 75 6e 69 78 4c 6f 63 6b 2c 20 20 20 20 20 20 20  unixLock,       
22160 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c             /* xL
22170 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
22180 6e 66 73 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20  nfsUnlock,      
22190 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55             /* xU
221a0 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  nlock method */.
221b0 20 20 75 6e 69 78 43 68 65 63 6b 52 65 73 65 72    unixCheckReser
221c0 76 65 64 4c 6f 63 6b 20 20 20 20 20 20 2f 2a 20  vedLock      /* 
221d0 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
221e0 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23  ck method */.).#
221f0 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e  endif..#if defin
22200 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26  ed(__APPLE__) &&
22210 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
22220 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 20  OCKING_STYLE./* 
22230 0a 2a 2a 20 54 68 69 73 20 22 66 69 6e 64 65 72  .** This "finder
22240 22 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d  " function attem
22250 70 74 73 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  pts to determine
22260 20 74 68 65 20 62 65 73 74 20 6c 6f 63 6b 69 6e   the best lockin
22270 67 20 73 74 72 61 74 65 67 79 20 0a 2a 2a 20 66  g strategy .** f
22280 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20  or the database 
22290 66 69 6c 65 20 22 66 69 6c 65 50 61 74 68 22 2e  file "filePath".
222a0 20 20 49 74 20 74 68 65 6e 20 72 65 74 75 72 6e    It then return
222b0 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6f  s the sqlite3_io
222c0 5f 6d 65 74 68 6f 64 73 0a 2a 2a 20 6f 62 6a 65  _methods.** obje
222d0 63 74 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e  ct that implemen
222e0 74 73 20 74 68 61 74 20 73 74 72 61 74 65 67 79  ts that strategy
222f0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ..**.** This is 
22300 66 6f 72 20 4d 61 63 4f 53 58 20 6f 6e 6c 79 2e  for MacOSX only.
22310 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
22320 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
22330 6f 64 73 20 2a 61 75 74 6f 6c 6f 63 6b 49 6f 46  ods *autolockIoF
22340 69 6e 64 65 72 49 6d 70 6c 28 0a 20 20 63 6f 6e  inderImpl(.  con
22350 73 74 20 63 68 61 72 20 2a 66 69 6c 65 50 61 74  st char *filePat
22360 68 2c 20 20 20 20 2f 2a 20 6e 61 6d 65 20 6f 66  h,    /* name of
22370 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
22380 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65  le */.  unixFile
22390 20 2a 70 4e 65 77 20 20 20 20 20 20 20 20 20 20   *pNew          
223a0 20 2f 2a 20 6f 70 65 6e 20 66 69 6c 65 20 6f 62   /* open file ob
223b0 6a 65 63 74 20 66 6f 72 20 74 68 65 20 64 61 74  ject for the dat
223c0 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 29 7b  abase file */.){
223d0 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
223e0 73 74 72 75 63 74 20 4d 61 70 70 69 6e 67 20 7b  struct Mapping {
223f0 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
22400 2a 7a 46 69 6c 65 73 79 73 74 65 6d 3b 20 20 20  *zFilesystem;   
22410 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
22420 6c 65 73 79 73 74 65 6d 20 74 79 70 65 20 6e 61  lesystem type na
22430 6d 65 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20  me */.    const 
22440 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
22450 64 73 20 2a 70 4d 65 74 68 6f 64 73 3b 20 20 20  ds *pMethods;   
22460 2f 2a 20 41 70 70 72 6f 70 72 69 61 74 65 20 6c  /* Appropriate l
22470 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 20 2a 2f  ocking method */
22480 0a 20 20 7d 20 61 4d 61 70 5b 5d 20 3d 20 7b 0a  .  } aMap[] = {.
22490 20 20 20 20 7b 20 22 68 66 73 22 2c 20 20 20 20      { "hfs",    
224a0 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 20  &posixIoMethods 
224b0 7d 2c 0a 20 20 20 20 7b 20 22 75 66 73 22 2c 20  },.    { "ufs", 
224c0 20 20 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f     &posixIoMetho
224d0 64 73 20 7d 2c 0a 20 20 20 20 7b 20 22 61 66 70  ds },.    { "afp
224e0 66 73 22 2c 20 20 26 61 66 70 49 6f 4d 65 74 68  fs",  &afpIoMeth
224f0 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20 22 73 6d  ods },.    { "sm
22500 62 66 73 22 2c 20 20 26 61 66 70 49 6f 4d 65 74  bfs",  &afpIoMet
22510 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20 22 77  hods },.    { "w
22520 65 62 64 61 76 22 2c 20 26 6e 6f 6c 6f 63 6b 49  ebdav", &nolockI
22530 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20  oMethods },.    
22540 7b 20 30 2c 20 30 20 7d 0a 20 20 7d 3b 0a 20 20  { 0, 0 }.  };.  
22550 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
22560 73 74 61 74 66 73 20 66 73 49 6e 66 6f 3b 0a 20  statfs fsInfo;. 
22570 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f   struct flock lo
22580 63 6b 49 6e 66 6f 3b 0a 0a 20 20 69 66 28 20 21  ckInfo;..  if( !
22590 66 69 6c 65 50 61 74 68 20 29 7b 0a 20 20 20 20  filePath ){.    
225a0 2f 2a 20 49 66 20 66 69 6c 65 50 61 74 68 3d 3d  /* If filePath==
225b0 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e 73 20  NULL that means 
225c0 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77  we are dealing w
225d0 69 74 68 20 61 20 74 72 61 6e 73 69 65 6e 74 20  ith a transient 
225e0 66 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68 61 74  file.    ** that
225f0 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74   does not need t
22600 6f 20 62 65 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a  o be locked. */.
22610 20 20 20 20 72 65 74 75 72 6e 20 26 6e 6f 6c 6f      return &nolo
22620 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d  ckIoMethods;.  }
22630 0a 20 20 69 66 28 20 73 74 61 74 66 73 28 66 69  .  if( statfs(fi
22640 6c 65 50 61 74 68 2c 20 26 66 73 49 6e 66 6f 29  lePath, &fsInfo)
22650 20 21 3d 20 2d 31 20 29 7b 0a 20 20 20 20 69 66   != -1 ){.    if
22660 28 20 66 73 49 6e 66 6f 2e 66 5f 66 6c 61 67 73  ( fsInfo.f_flags
22670 20 26 20 4d 4e 54 5f 52 44 4f 4e 4c 59 20 29 7b   & MNT_RDONLY ){
22680 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 26 6e  .      return &n
22690 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a  olockIoMethods;.
226a0 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d      }.    for(i=
226b0 30 3b 20 61 4d 61 70 5b 69 5d 2e 7a 46 69 6c 65  0; aMap[i].zFile
226c0 73 79 73 74 65 6d 3b 20 69 2b 2b 29 7b 0a 20 20  system; i++){.  
226d0 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 66      if( strcmp(f
226e0 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61  sInfo.f_fstypena
226f0 6d 65 2c 20 61 4d 61 70 5b 69 5d 2e 7a 46 69 6c  me, aMap[i].zFil
22700 65 73 79 73 74 65 6d 29 3d 3d 30 20 29 7b 0a 20  esystem)==0 ){. 
22710 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 61 4d         return aM
22720 61 70 5b 69 5d 2e 70 4d 65 74 68 6f 64 73 3b 0a  ap[i].pMethods;.
22730 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
22740 7d 0a 0a 20 20 2f 2a 20 44 65 66 61 75 6c 74 20  }..  /* Default 
22750 63 61 73 65 2e 20 48 61 6e 64 6c 65 73 2c 20 61  case. Handles, a
22760 6d 6f 6e 67 73 74 20 6f 74 68 65 72 73 2c 20 22  mongst others, "
22770 6e 66 73 22 2e 0a 20 20 2a 2a 20 54 65 73 74 20  nfs"..  ** Test 
22780 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 20  byte-range lock 
22790 75 73 69 6e 67 20 66 63 6e 74 6c 28 29 2e 20 49  using fcntl(). I
227a0 66 20 74 68 65 20 63 61 6c 6c 20 73 75 63 63 65  f the call succe
227b0 65 64 73 2c 20 0a 20 20 2a 2a 20 61 73 73 75 6d  eds, .  ** assum
227c0 65 20 74 68 61 74 20 74 68 65 20 66 69 6c 65 2d  e that the file-
227d0 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 73 20  system supports 
227e0 50 4f 53 49 58 20 73 74 79 6c 65 20 6c 6f 63 6b  POSIX style lock
227f0 73 2e 20 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b 49  s. .  */.  lockI
22800 6e 66 6f 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20  nfo.l_len = 1;. 
22810 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 73 74 61 72   lockInfo.l_star
22820 74 20 3d 20 30 3b 0a 20 20 6c 6f 63 6b 49 6e 66  t = 0;.  lockInf
22830 6f 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45  o.l_whence = SEE
22840 4b 5f 53 45 54 3b 0a 20 20 6c 6f 63 6b 49 6e 66  K_SET;.  lockInf
22850 6f 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c  o.l_type = F_RDL
22860 43 4b 3b 0a 20 20 69 66 28 20 66 63 6e 74 6c 28  CK;.  if( fcntl(
22870 70 4e 65 77 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b  pNew->h, F_GETLK
22880 2c 20 26 6c 6f 63 6b 49 6e 66 6f 29 21 3d 2d 31  , &lockInfo)!=-1
22890 20 29 20 7b 0a 20 20 20 20 69 66 28 20 73 74 72   ) {.    if( str
228a0 63 6d 70 28 66 73 49 6e 66 6f 2e 66 5f 66 73 74  cmp(fsInfo.f_fst
228b0 79 70 65 6e 61 6d 65 2c 20 22 6e 66 73 22 29 3d  ypename, "nfs")=
228c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =0 ){.      retu
228d0 72 6e 20 26 6e 66 73 49 6f 4d 65 74 68 6f 64 73  rn &nfsIoMethods
228e0 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20  ;.    } else {. 
228f0 20 20 20 20 20 72 65 74 75 72 6e 20 26 70 6f 73       return &pos
22900 69 78 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 20  ixIoMethods;.   
22910 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
22920 72 65 74 75 72 6e 20 26 64 6f 74 6c 6f 63 6b 49  return &dotlockI
22930 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 7d 0a  oMethods;.  }.}.
22940 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c  static const sql
22950 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
22960 0a 20 20 2a 28 2a 63 6f 6e 73 74 20 61 75 74 6f  .  *(*const auto
22970 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 29 28 63 6f  lockIoFinder)(co
22980 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69 78 46 69  nst char*,unixFi
22990 6c 65 2a 29 20 3d 20 61 75 74 6f 6c 6f 63 6b 49  le*) = autolockI
229a0 6f 46 69 6e 64 65 72 49 6d 70 6c 3b 0a 0a 23 65  oFinderImpl;..#e
229b0 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28  ndif /* defined(
229c0 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51  __APPLE__) && SQ
229d0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
229e0 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a 23 69  ING_STYLE */..#i
229f0 66 20 4f 53 5f 56 58 57 4f 52 4b 53 20 26 26 20  f OS_VXWORKS && 
22a00 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
22a10 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 20 0a  CKING_STYLE./* .
22a20 2a 2a 20 54 68 69 73 20 22 66 69 6e 64 65 72 22  ** This "finder"
22a30 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70   function attemp
22a40 74 73 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ts to determine 
22a50 74 68 65 20 62 65 73 74 20 6c 6f 63 6b 69 6e 67  the best locking
22a60 20 73 74 72 61 74 65 67 79 20 0a 2a 2a 20 66 6f   strategy .** fo
22a70 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  r the database f
22a80 69 6c 65 20 22 66 69 6c 65 50 61 74 68 22 2e 20  ile "filePath". 
22a90 20 49 74 20 74 68 65 6e 20 72 65 74 75 72 6e 73   It then returns
22aa0 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f   the sqlite3_io_
22ab0 6d 65 74 68 6f 64 73 0a 2a 2a 20 6f 62 6a 65 63  methods.** objec
22ac0 74 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74  t that implement
22ad0 73 20 74 68 61 74 20 73 74 72 61 74 65 67 79 2e  s that strategy.
22ae0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 66  .**.** This is f
22af0 6f 72 20 56 58 57 6f 72 6b 73 20 6f 6e 6c 79 2e  or VXWorks only.
22b00 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
22b10 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
22b20 6f 64 73 20 2a 61 75 74 6f 6c 6f 63 6b 49 6f 46  ods *autolockIoF
22b30 69 6e 64 65 72 49 6d 70 6c 28 0a 20 20 63 6f 6e  inderImpl(.  con
22b40 73 74 20 63 68 61 72 20 2a 66 69 6c 65 50 61 74  st char *filePat
22b50 68 2c 20 20 20 20 2f 2a 20 6e 61 6d 65 20 6f 66  h,    /* name of
22b60 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
22b70 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65  le */.  unixFile
22b80 20 2a 70 4e 65 77 20 20 20 20 20 20 20 20 20 20   *pNew          
22b90 20 2f 2a 20 74 68 65 20 6f 70 65 6e 20 66 69 6c   /* the open fil
22ba0 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20  e object */.){. 
22bb0 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f   struct flock lo
22bc0 63 6b 49 6e 66 6f 3b 0a 0a 20 20 69 66 28 20 21  ckInfo;..  if( !
22bd0 66 69 6c 65 50 61 74 68 20 29 7b 0a 20 20 20 20  filePath ){.    
22be0 2f 2a 20 49 66 20 66 69 6c 65 50 61 74 68 3d 3d  /* If filePath==
22bf0 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e 73 20  NULL that means 
22c00 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77  we are dealing w
22c10 69 74 68 20 61 20 74 72 61 6e 73 69 65 6e 74 20  ith a transient 
22c20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68 61 74  file.    ** that
22c30 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74   does not need t
22c40 6f 20 62 65 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a  o be locked. */.
22c50 20 20 20 20 72 65 74 75 72 6e 20 26 6e 6f 6c 6f      return &nolo
22c60 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d  ckIoMethods;.  }
22c70 0a 0a 20 20 2f 2a 20 54 65 73 74 20 69 66 20 66  ..  /* Test if f
22c80 63 6e 74 6c 28 29 20 69 73 20 73 75 70 70 6f 72  cntl() is suppor
22c90 74 65 64 20 61 6e 64 20 75 73 65 20 50 4f 53 49  ted and use POSI
22ca0 58 20 73 74 79 6c 65 20 6c 6f 63 6b 73 2e 0a 20  X style locks.. 
22cb0 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 20 66 61   ** Otherwise fa
22cc0 6c 6c 20 62 61 63 6b 20 74 6f 20 74 68 65 20 6e  ll back to the n
22cd0 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6d  amed semaphore m
22ce0 65 74 68 6f 64 2e 0a 20 20 2a 2f 0a 20 20 6c 6f  ethod..  */.  lo
22cf0 63 6b 49 6e 66 6f 2e 6c 5f 6c 65 6e 20 3d 20 31  ckInfo.l_len = 1
22d00 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 73  ;.  lockInfo.l_s
22d10 74 61 72 74 20 3d 20 30 3b 0a 20 20 6c 6f 63 6b  tart = 0;.  lock
22d20 49 6e 66 6f 2e 6c 5f 77 68 65 6e 63 65 20 3d 20  Info.l_whence = 
22d30 53 45 45 4b 5f 53 45 54 3b 0a 20 20 6c 6f 63 6b  SEEK_SET;.  lock
22d40 49 6e 66 6f 2e 6c 5f 74 79 70 65 20 3d 20 46 5f  Info.l_type = F_
22d50 52 44 4c 43 4b 3b 0a 20 20 69 66 28 20 66 63 6e  RDLCK;.  if( fcn
22d60 74 6c 28 70 4e 65 77 2d 3e 68 2c 20 46 5f 47 45  tl(pNew->h, F_GE
22d70 54 4c 4b 2c 20 26 6c 6f 63 6b 49 6e 66 6f 29 21  TLK, &lockInfo)!
22d80 3d 2d 31 20 29 20 7b 0a 20 20 20 20 72 65 74 75  =-1 ) {.    retu
22d90 72 6e 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f  rn &posixIoMetho
22da0 64 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ds;.  }else{.   
22db0 20 72 65 74 75 72 6e 20 26 73 65 6d 49 6f 4d 65   return &semIoMe
22dc0 74 68 6f 64 73 3b 0a 20 20 7d 0a 7d 0a 73 74 61  thods;.  }.}.sta
22dd0 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  tic const sqlite
22de0 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 0a 20 20  3_io_methods .  
22df0 2a 28 2a 63 6f 6e 73 74 20 61 75 74 6f 6c 6f 63  *(*const autoloc
22e00 6b 49 6f 46 69 6e 64 65 72 29 28 63 6f 6e 73 74  kIoFinder)(const
22e10 20 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65 2a   char*,unixFile*
22e20 29 20 3d 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69  ) = autolockIoFi
22e30 6e 64 65 72 49 6d 70 6c 3b 0a 0a 23 65 6e 64 69  nderImpl;..#endi
22e40 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20  f /* OS_VXWORKS 
22e50 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
22e60 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a  _LOCKING_STYLE *
22e70 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 61 62 73 74  /../*.** An abst
22e80 72 61 63 74 20 74 79 70 65 20 66 6f 72 20 61 20  ract type for a 
22e90 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 49 4f 20  pointer to a IO 
22ea0 6d 65 74 68 6f 64 20 66 69 6e 64 65 72 20 66 75  method finder fu
22eb0 6e 63 74 69 6f 6e 3a 0a 2a 2f 0a 74 79 70 65 64  nction:.*/.typed
22ec0 65 66 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ef const sqlite3
22ed0 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 28 2a 66  _io_methods *(*f
22ee0 69 6e 64 65 72 5f 74 79 70 65 29 28 63 6f 6e 73  inder_type)(cons
22ef0 74 20 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65  t char*,unixFile
22f00 2a 29 3b 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  *);.../*********
22f10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22f20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22f30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22f40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22f50 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
22f60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22f70 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65 74   sqlite3_vfs met
22f80 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  hods ***********
22f90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22fa0 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 64 69 76  *.**.** This div
22fb0 69 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74  ision contains t
22fc0 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
22fd0 6e 20 6f 66 20 6d 65 74 68 6f 64 73 20 6f 6e 20  n of methods on 
22fe0 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 76  the.** sqlite3_v
22ff0 66 73 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 0a 2f  fs object..*/../
23000 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
23010 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
23020 74 68 65 20 75 6e 69 78 46 69 6c 65 20 73 74 72  the unixFile str
23030 75 63 74 75 72 65 20 70 6f 69 6e 74 65 64 20 74  ucture pointed t
23040 6f 20 62 79 20 70 49 64 2e 0a 2a 2f 0a 73 74 61  o by pId..*/.sta
23050 74 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e 55 6e  tic int fillInUn
23060 69 78 46 69 6c 65 28 0a 20 20 73 71 6c 69 74 65  ixFile(.  sqlite
23070 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20  3_vfs *pVfs,    
23080 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
23090 76 66 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  vfs object */.  
230a0 69 6e 74 20 68 2c 20 20 20 20 20 20 20 20 20 20  int h,          
230b0 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20          /* Open 
230c0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
230d0 6f 66 20 66 69 6c 65 20 62 65 69 6e 67 20 6f 70  of file being op
230e0 65 6e 65 64 20 2a 2f 0a 20 20 69 6e 74 20 64 69  ened */.  int di
230f0 72 66 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  rfd,            
23100 20 20 2f 2a 20 44 69 72 65 63 74 6f 72 79 20 66    /* Directory f
23110 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a  ile descriptor *
23120 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  /.  sqlite3_file
23130 20 2a 70 49 64 2c 20 20 20 20 20 20 2f 2a 20 57   *pId,      /* W
23140 72 69 74 65 20 74 6f 20 74 68 65 20 75 6e 69 78  rite to the unix
23150 46 69 6c 65 20 73 74 72 75 63 74 75 72 65 20 68  File structure h
23160 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ere */.  const c
23170 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  har *zFilename, 
23180 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
23190 66 69 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e 65  file being opene
231a0 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 4c 6f 63  d */.  int noLoc
231b0 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  k,             /
231c0 2a 20 4f 6d 69 74 20 6c 6f 63 6b 69 6e 67 20 69  * Omit locking i
231d0 66 20 74 72 75 65 20 2a 2f 0a 20 20 69 6e 74 20  f true */.  int 
231e0 69 73 44 65 6c 65 74 65 20 20 20 20 20 20 20 20  isDelete        
231f0 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 6f 6e      /* Delete on
23200 20 63 6c 6f 73 65 20 69 66 20 74 72 75 65 20 2a   close if true *
23210 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 73 71 6c  /.){.  const sql
23220 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
23230 2a 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3b 0a  *pLockingStyle;.
23240 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e 65 77    unixFile *pNew
23250 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 70   = (unixFile *)p
23260 49 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  Id;.  int rc = S
23270 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73  QLITE_OK;..  ass
23280 65 72 74 28 20 70 4e 65 77 2d 3e 70 49 6e 6f 64  ert( pNew->pInod
23290 65 3d 3d 4e 55 4c 4c 20 29 3b 0a 0a 20 20 2f 2a  e==NULL );..  /*
232a0 20 50 61 72 61 6d 65 74 65 72 20 69 73 44 65 6c   Parameter isDel
232b0 65 74 65 20 69 73 20 6f 6e 6c 79 20 75 73 65 64  ete is only used
232c0 20 6f 6e 20 76 78 77 6f 72 6b 73 2e 20 45 78 70   on vxworks. Exp
232d0 72 65 73 73 20 74 68 69 73 20 65 78 70 6c 69 63  ress this explic
232e0 69 74 6c 79 20 0a 20 20 2a 2a 20 68 65 72 65 20  itly .  ** here 
232f0 74 6f 20 70 72 65 76 65 6e 74 20 63 6f 6d 70 69  to prevent compi
23300 6c 65 72 20 77 61 72 6e 69 6e 67 73 20 61 62 6f  ler warnings abo
23310 75 74 20 75 6e 75 73 65 64 20 70 61 72 61 6d 65  ut unused parame
23320 74 65 72 73 2e 0a 20 20 2a 2f 0a 20 20 55 4e 55  ters..  */.  UNU
23330 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 69 73  SED_PARAMETER(is
23340 44 65 6c 65 74 65 29 3b 0a 0a 20 20 2f 2a 20 55  Delete);..  /* U
23350 73 75 61 6c 6c 79 20 74 68 65 20 70 61 74 68 20  sually the path 
23360 7a 46 69 6c 65 6e 61 6d 65 20 73 68 6f 75 6c 64  zFilename should
23370 20 6e 6f 74 20 62 65 20 61 20 72 65 6c 61 74 69   not be a relati
23380 76 65 20 70 61 74 68 6e 61 6d 65 2e 20 54 68 65  ve pathname. The
23390 0a 20 20 2a 2a 20 65 78 63 65 70 74 69 6f 6e 20  .  ** exception 
233a0 69 73 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20  is when opening 
233b0 74 68 65 20 70 72 6f 78 79 20 22 63 6f 6e 63 68  the proxy "conch
233c0 22 20 66 69 6c 65 20 69 6e 20 62 75 69 6c 64 73  " file in builds
233d0 20 74 68 61 74 0a 20 20 2a 2a 20 69 6e 63 6c 75   that.  ** inclu
233e0 64 65 20 74 68 65 20 73 70 65 63 69 61 6c 20 41  de the special A
233f0 70 70 6c 65 20 6c 6f 63 6b 69 6e 67 20 73 74 79  pple locking sty
23400 6c 65 73 2e 0a 20 20 2a 2f 0a 23 69 66 20 64 65  les..  */.#if de
23410 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
23420 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
23430 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
23440 20 20 61 73 73 65 72 74 28 20 7a 46 69 6c 65 6e    assert( zFilen
23450 61 6d 65 3d 3d 30 20 7c 7c 20 7a 46 69 6c 65 6e  ame==0 || zFilen
23460 61 6d 65 5b 30 5d 3d 3d 27 2f 27 20 0a 20 20 20  ame[0]=='/' .   
23470 20 7c 7c 20 70 56 66 73 2d 3e 70 41 70 70 44 61   || pVfs->pAppDa
23480 74 61 3d 3d 28 76 6f 69 64 2a 29 26 61 75 74 6f  ta==(void*)&auto
23490 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 20 29 3b 0a  lockIoFinder );.
234a0 23 65 6c 73 65 0a 20 20 61 73 73 65 72 74 28 20  #else.  assert( 
234b0 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20  zFilename==0 || 
234c0 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 27 2f  zFilename[0]=='/
234d0 27 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 4f  ' );.#endif..  O
234e0 53 54 52 41 43 45 28 28 22 4f 50 45 4e 20 20 20  STRACE(("OPEN   
234f0 20 25 2d 33 64 20 25 73 5c 6e 22 2c 20 68 2c 20   %-3d %s\n", h, 
23500 7a 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 70  zFilename));.  p
23510 4e 65 77 2d 3e 68 20 3d 20 68 3b 0a 20 20 70 4e  New->h = h;.  pN
23520 65 77 2d 3e 64 69 72 66 64 20 3d 20 64 69 72 66  ew->dirfd = dirf
23530 64 3b 0a 20 20 70 4e 65 77 2d 3e 66 69 6c 65 46  d;.  pNew->fileF
23540 6c 61 67 73 20 3d 20 30 3b 0a 20 20 70 4e 65 77  lags = 0;.  pNew
23550 2d 3e 7a 50 61 74 68 20 3d 20 7a 46 69 6c 65 6e  ->zPath = zFilen
23560 61 6d 65 3b 0a 0a 23 69 66 20 4f 53 5f 56 58 57  ame;..#if OS_VXW
23570 4f 52 4b 53 0a 20 20 70 4e 65 77 2d 3e 70 49 64  ORKS.  pNew->pId
23580 20 3d 20 76 78 77 6f 72 6b 73 46 69 6e 64 46 69   = vxworksFindFi
23590 6c 65 49 64 28 7a 46 69 6c 65 6e 61 6d 65 29 3b  leId(zFilename);
235a0 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e 70 49 64  .  if( pNew->pId
235b0 3d 3d 30 20 29 7b 0a 20 20 20 20 6e 6f 4c 6f 63  ==0 ){.    noLoc
235c0 6b 20 3d 20 31 3b 0a 20 20 20 20 72 63 20 3d 20  k = 1;.    rc = 
235d0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
235e0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20  }.#endif..  if( 
235f0 6e 6f 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70 4c  noLock ){.    pL
23600 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 20 26 6e  ockingStyle = &n
23610 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a  olockIoMethods;.
23620 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4c 6f    }else{.    pLo
23630 63 6b 69 6e 67 53 74 79 6c 65 20 3d 20 28 2a 2a  ckingStyle = (**
23640 28 66 69 6e 64 65 72 5f 74 79 70 65 2a 29 70 56  (finder_type*)pV
23650 66 73 2d 3e 70 41 70 70 44 61 74 61 29 28 7a 46  fs->pAppData)(zF
23660 69 6c 65 6e 61 6d 65 2c 20 70 4e 65 77 29 3b 0a  ilename, pNew);.
23670 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  #if SQLITE_ENABL
23680 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
23690 20 20 20 20 2f 2a 20 43 61 63 68 65 20 7a 46 69      /* Cache zFi
236a0 6c 65 6e 61 6d 65 20 69 6e 20 74 68 65 20 6c 6f  lename in the lo
236b0 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 28 41  cking context (A
236c0 46 50 20 61 6e 64 20 64 6f 74 6c 6f 63 6b 20 6f  FP and dotlock o
236d0 76 65 72 72 69 64 65 29 20 66 6f 72 0a 20 20 20  verride) for.   
236e0 20 2a 2a 20 70 72 6f 78 79 4c 6f 63 6b 20 61 63   ** proxyLock ac
236f0 74 69 76 61 74 69 6f 6e 20 69 73 20 70 6f 73 73  tivation is poss
23700 69 62 6c 65 20 28 72 65 6d 6f 74 65 20 70 72 6f  ible (remote pro
23710 78 79 20 69 73 20 62 61 73 65 64 20 6f 6e 20 64  xy is based on d
23720 62 20 6e 61 6d 65 29 0a 20 20 20 20 2a 2a 20 7a  b name).    ** z
23730 46 69 6c 65 6e 61 6d 65 20 72 65 6d 61 69 6e 73  Filename remains
23740 20 76 61 6c 69 64 20 75 6e 74 69 6c 20 66 69 6c   valid until fil
23750 65 20 69 73 20 63 6c 6f 73 65 64 2c 20 74 6f 20  e is closed, to 
23760 73 75 70 70 6f 72 74 20 2a 2f 0a 20 20 20 20 70  support */.    p
23770 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  New->lockingCont
23780 65 78 74 20 3d 20 28 76 6f 69 64 2a 29 7a 46 69  ext = (void*)zFi
23790 6c 65 6e 61 6d 65 3b 0a 23 65 6e 64 69 66 0a 20  lename;.#endif. 
237a0 20 7d 0a 0a 20 20 69 66 28 20 70 4c 6f 63 6b 69   }..  if( pLocki
237b0 6e 67 53 74 79 6c 65 20 3d 3d 20 26 70 6f 73 69  ngStyle == &posi
237c0 78 49 6f 4d 65 74 68 6f 64 73 0a 23 69 66 20 64  xIoMethods.#if d
237d0 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
237e0 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42  ) && SQLITE_ENAB
237f0 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
23800 0a 20 20 20 20 7c 7c 20 70 4c 6f 63 6b 69 6e 67  .    || pLocking
23810 53 74 79 6c 65 20 3d 3d 20 26 6e 66 73 49 6f 4d  Style == &nfsIoM
23820 65 74 68 6f 64 73 0a 23 65 6e 64 69 66 0a 20 20  ethods.#endif.  
23830 29 7b 0a 20 20 20 20 75 6e 69 78 45 6e 74 65 72  ){.    unixEnter
23840 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 72 63 20  Mutex();.    rc 
23850 3d 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28  = findInodeInfo(
23860 70 4e 65 77 2c 20 26 70 4e 65 77 2d 3e 70 49 6e  pNew, &pNew->pIn
23870 6f 64 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ode);.    if( rc
23880 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
23890 20 20 20 20 20 2f 2a 20 49 66 20 61 6e 20 65 72       /* If an er
238a0 72 6f 72 20 6f 63 63 75 72 65 64 20 69 6e 20 66  ror occured in f
238b0 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29 2c 20  indInodeInfo(), 
238c0 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20 64  close the file d
238d0 65 73 63 72 69 70 74 6f 72 0a 20 20 20 20 20 20  escriptor.      
238e0 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 2c 20  ** immediately, 
238f0 62 65 66 6f 72 65 20 72 65 6c 65 61 73 69 6e 67  before releasing
23900 20 74 68 65 20 6d 75 74 65 78 2e 20 66 69 6e 64   the mutex. find
23910 49 6e 6f 64 65 49 6e 66 6f 28 29 20 6d 61 79 20  InodeInfo() may 
23920 66 61 69 6c 0a 20 20 20 20 20 20 2a 2a 20 69 6e  fail.      ** in
23930 20 74 77 6f 20 73 63 65 6e 61 72 69 6f 73 3a 0a   two scenarios:.
23940 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
23950 2a 20 20 20 28 61 29 20 41 20 63 61 6c 6c 20 74  *   (a) A call t
23960 6f 20 66 73 74 61 74 28 29 20 66 61 69 6c 65 64  o fstat() failed
23970 2e 0a 20 20 20 20 20 20 2a 2a 20 20 20 28 62 29  ..      **   (b)
23980 20 41 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 65 64   A malloc failed
23990 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
239a0 20 2a 2a 20 53 63 65 6e 61 72 69 6f 20 28 62 29   ** Scenario (b)
239b0 20 6d 61 79 20 6f 6e 6c 79 20 6f 63 63 75 72 20   may only occur 
239c0 69 66 20 74 68 65 20 70 72 6f 63 65 73 73 20 69  if the process i
239d0 73 20 68 6f 6c 64 69 6e 67 20 6e 6f 20 6f 74 68  s holding no oth
239e0 65 72 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65  er.      ** file
239f0 20 64 65 73 63 72 69 70 74 6f 72 73 20 6f 70 65   descriptors ope
23a00 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 66 69  n on the same fi
23a10 6c 65 2e 20 49 66 20 74 68 65 72 65 20 77 65 72  le. If there wer
23a20 65 20 6f 74 68 65 72 20 66 69 6c 65 0a 20 20 20  e other file.   
23a30 20 20 20 2a 2a 20 64 65 73 63 72 69 70 74 6f 72     ** descriptor
23a40 73 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 2c 20  s on this file, 
23a50 74 68 65 6e 20 6e 6f 20 6d 61 6c 6c 6f 63 20 77  then no malloc w
23a60 6f 75 6c 64 20 62 65 20 72 65 71 75 69 72 65 64  ould be required
23a70 20 62 79 0a 20 20 20 20 20 20 2a 2a 20 66 69 6e   by.      ** fin
23a80 64 49 6e 6f 64 65 49 6e 66 6f 28 29 2e 20 49 66  dInodeInfo(). If
23a90 20 74 68 69 73 20 69 73 20 74 68 65 20 63 61 73   this is the cas
23aa0 65 2c 20 69 74 20 69 73 20 71 75 69 74 65 20 73  e, it is quite s
23ab0 61 66 65 20 74 6f 20 63 6c 6f 73 65 0a 20 20 20  afe to close.   
23ac0 20 20 20 2a 2a 20 68 61 6e 64 6c 65 20 68 20 2d     ** handle h -
23ad0 20 61 73 20 69 74 20 69 73 20 67 75 61 72 61 6e   as it is guaran
23ae0 74 65 65 64 20 74 68 61 74 20 6e 6f 20 70 6f 73  teed that no pos
23af0 69 78 20 6c 6f 63 6b 73 20 77 69 6c 6c 20 62 65  ix locks will be
23b00 20 72 65 6c 65 61 73 65 64 0a 20 20 20 20 20 20   released.      
23b10 2a 2a 20 62 79 20 64 6f 69 6e 67 20 73 6f 2e 0a  ** by doing so..
23b20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
23b30 2a 20 49 66 20 73 63 65 6e 61 72 69 6f 20 28 61  * If scenario (a
23b40 29 20 63 61 75 73 65 64 20 74 68 65 20 65 72 72  ) caused the err
23b50 6f 72 20 74 68 65 6e 20 74 68 69 6e 67 73 20 61  or then things a
23b60 72 65 20 6e 6f 74 20 73 6f 20 73 61 66 65 2e 20  re not so safe. 
23b70 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70  The.      ** imp
23b80 6c 69 63 69 74 20 61 73 73 75 6d 70 74 69 6f 6e  licit assumption
23b90 20 68 65 72 65 20 69 73 20 74 68 61 74 20 69 66   here is that if
23ba0 20 66 73 74 61 74 28 29 20 66 61 69 6c 73 2c 20   fstat() fails, 
23bb0 74 68 69 6e 67 73 20 61 72 65 20 69 6e 0a 20 20  things are in.  
23bc0 20 20 20 20 2a 2a 20 73 75 63 68 20 62 61 64 20      ** such bad 
23bd0 73 68 61 70 65 20 74 68 61 74 20 64 72 6f 70 70  shape that dropp
23be0 69 6e 67 20 61 20 6c 6f 63 6b 20 6f 72 20 74 77  ing a lock or tw
23bf0 6f 20 64 6f 65 73 6e 27 74 20 6d 61 74 74 65 72  o doesn't matter
23c00 20 6d 75 63 68 2e 0a 20 20 20 20 20 20 2a 2f 0a   much..      */.
23c10 20 20 20 20 20 20 63 6c 6f 73 65 28 68 29 3b 0a        close(h);.
23c20 20 20 20 20 20 20 68 20 3d 20 2d 31 3b 0a 20 20        h = -1;.  
23c30 20 20 7d 0a 20 20 20 20 75 6e 69 78 4c 65 61 76    }.    unixLeav
23c40 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a 0a 23  eMutex();.  }..#
23c50 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
23c60 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26  _LOCKING_STYLE &
23c70 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  & defined(__APPL
23c80 45 5f 5f 29 0a 20 20 65 6c 73 65 20 69 66 28 20  E__).  else if( 
23c90 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d  pLockingStyle ==
23ca0 20 26 61 66 70 49 6f 4d 65 74 68 6f 64 73 20 29   &afpIoMethods )
23cb0 7b 0a 20 20 20 20 2f 2a 20 41 46 50 20 6c 6f 63  {.    /* AFP loc
23cc0 6b 69 6e 67 20 75 73 65 73 20 74 68 65 20 66 69  king uses the fi
23cd0 6c 65 20 70 61 74 68 20 73 6f 20 69 74 20 6e 65  le path so it ne
23ce0 65 64 73 20 74 6f 20 62 65 20 69 6e 63 6c 75 64  eds to be includ
23cf0 65 64 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65  ed in.    ** the
23d00 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65   afpLockingConte
23d10 78 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  xt..    */.    a
23d20 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
23d30 20 2a 70 43 74 78 3b 0a 20 20 20 20 70 4e 65 77   *pCtx;.    pNew
23d40 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
23d50 20 3d 20 70 43 74 78 20 3d 20 73 71 6c 69 74 65   = pCtx = sqlite
23d60 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  3_malloc( sizeof
23d70 28 2a 70 43 74 78 29 20 29 3b 0a 20 20 20 20 69  (*pCtx) );.    i
23d80 66 28 20 70 43 74 78 3d 3d 30 20 29 7b 0a 20 20  f( pCtx==0 ){.  
23d90 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
23da0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65  NOMEM;.    }else
23db0 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 42 3a 20 7a  {.      /* NB: z
23dc0 46 69 6c 65 6e 61 6d 65 20 65 78 69 73 74 73 20  Filename exists 
23dd0 61 6e 64 20 72 65 6d 61 69 6e 73 20 76 61 6c 69  and remains vali
23de0 64 20 75 6e 74 69 6c 20 74 68 65 20 66 69 6c 65  d until the file
23df0 20 69 73 20 63 6c 6f 73 65 64 0a 20 20 20 20 20   is closed.     
23e00 20 2a 2a 20 61 63 63 6f 72 64 69 6e 67 20 74 6f   ** according to
23e10 20 72 65 71 75 69 72 65 6d 65 6e 74 20 46 31 31   requirement F11
23e20 31 34 31 2e 20 20 53 6f 20 77 65 20 64 6f 20 6e  141.  So we do n
23e30 6f 74 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65 20  ot need to make 
23e40 61 0a 20 20 20 20 20 20 2a 2a 20 63 6f 70 79 20  a.      ** copy 
23e50 6f 66 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 2e  of the filename.
23e60 20 2a 2f 0a 20 20 20 20 20 20 70 43 74 78 2d 3e   */.      pCtx->
23e70 64 62 50 61 74 68 20 3d 20 7a 46 69 6c 65 6e 61  dbPath = zFilena
23e80 6d 65 3b 0a 20 20 20 20 20 20 70 43 74 78 2d 3e  me;.      pCtx->
23e90 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20  reserved = 0;.  
23ea0 20 20 20 20 73 72 61 6e 64 6f 6d 64 65 76 28 29      srandomdev()
23eb0 3b 0a 20 20 20 20 20 20 75 6e 69 78 45 6e 74 65  ;.      unixEnte
23ec0 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 20 20  rMutex();.      
23ed0 72 63 20 3d 20 66 69 6e 64 49 6e 6f 64 65 49 6e  rc = findInodeIn
23ee0 66 6f 28 70 4e 65 77 2c 20 26 70 4e 65 77 2d 3e  fo(pNew, &pNew->
23ef0 70 49 6e 6f 64 65 29 3b 0a 20 20 20 20 20 20 69  pInode);.      i
23f00 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
23f10 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
23f20 74 65 33 5f 66 72 65 65 28 70 4e 65 77 2d 3e 6c  te3_free(pNew->l
23f30 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3b 0a  ockingContext);.
23f40 20 20 20 20 20 20 20 20 63 6c 6f 73 65 28 68 29          close(h)
23f50 3b 0a 20 20 20 20 20 20 20 20 68 20 3d 20 2d 31  ;.        h = -1
23f60 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
23f70 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
23f80 3b 20 20 20 20 20 20 20 20 0a 20 20 20 20 7d 0a  ;        .    }.
23f90 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 65 6c    }.#endif..  el
23fa0 73 65 20 69 66 28 20 70 4c 6f 63 6b 69 6e 67 53  se if( pLockingS
23fb0 74 79 6c 65 20 3d 3d 20 26 64 6f 74 6c 6f 63 6b  tyle == &dotlock
23fc0 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20  IoMethods ){.   
23fd0 20 2f 2a 20 44 6f 74 66 69 6c 65 20 6c 6f 63 6b   /* Dotfile lock
23fe0 69 6e 67 20 75 73 65 73 20 74 68 65 20 66 69 6c  ing uses the fil
23ff0 65 20 70 61 74 68 20 73 6f 20 69 74 20 6e 65 65  e path so it nee
24000 64 73 20 74 6f 20 62 65 20 69 6e 63 6c 75 64 65  ds to be include
24010 64 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20  d in.    ** the 
24020 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f  dotlockLockingCo
24030 6e 74 65 78 74 20 0a 20 20 20 20 2a 2f 0a 20 20  ntext .    */.  
24040 20 20 63 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c    char *zLockFil
24050 65 3b 0a 20 20 20 20 69 6e 74 20 6e 46 69 6c 65  e;.    int nFile
24060 6e 61 6d 65 3b 0a 20 20 20 20 6e 46 69 6c 65 6e  name;.    nFilen
24070 61 6d 65 20 3d 20 28 69 6e 74 29 73 74 72 6c 65  ame = (int)strle
24080 6e 28 7a 46 69 6c 65 6e 61 6d 65 29 20 2b 20 36  n(zFilename) + 6
24090 3b 0a 20 20 20 20 7a 4c 6f 63 6b 46 69 6c 65 20  ;.    zLockFile 
240a0 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  = (char *)sqlite
240b0 33 5f 6d 61 6c 6c 6f 63 28 6e 46 69 6c 65 6e 61  3_malloc(nFilena
240c0 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 7a 4c 6f  me);.    if( zLo
240d0 63 6b 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20  ckFile==0 ){.   
240e0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
240f0 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  OMEM;.    }else{
24100 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
24110 6e 70 72 69 6e 74 66 28 6e 46 69 6c 65 6e 61 6d  nprintf(nFilenam
24120 65 2c 20 7a 4c 6f 63 6b 46 69 6c 65 2c 20 22 25  e, zLockFile, "%
24130 73 22 20 44 4f 54 4c 4f 43 4b 5f 53 55 46 46 49  s" DOTLOCK_SUFFI
24140 58 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  X, zFilename);. 
24150 20 20 20 7d 0a 20 20 20 20 70 4e 65 77 2d 3e 6c     }.    pNew->l
24160 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20  ockingContext = 
24170 7a 4c 6f 63 6b 46 69 6c 65 3b 0a 20 20 7d 0a 0a  zLockFile;.  }..
24180 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20  #if OS_VXWORKS. 
24190 20 65 6c 73 65 20 69 66 28 20 70 4c 6f 63 6b 69   else if( pLocki
241a0 6e 67 53 74 79 6c 65 20 3d 3d 20 26 73 65 6d 49  ngStyle == &semI
241b0 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20  oMethods ){.    
241c0 2f 2a 20 4e 61 6d 65 64 20 73 65 6d 61 70 68 6f  /* Named semapho
241d0 72 65 20 6c 6f 63 6b 69 6e 67 20 75 73 65 73 20  re locking uses 
241e0 74 68 65 20 66 69 6c 65 20 70 61 74 68 20 73 6f  the file path so
241f0 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 0a   it needs to be.
24200 20 20 20 20 2a 2a 20 69 6e 63 6c 75 64 65 64 20      ** included 
24210 69 6e 20 74 68 65 20 73 65 6d 4c 6f 63 6b 69 6e  in the semLockin
24220 67 43 6f 6e 74 65 78 74 0a 20 20 20 20 2a 2f 0a  gContext.    */.
24230 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74      unixEnterMut
24240 65 78 28 29 3b 0a 20 20 20 20 72 63 20 3d 20 66  ex();.    rc = f
24250 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 70 4e 65  indInodeInfo(pNe
24260 77 2c 20 26 70 4e 65 77 2d 3e 70 49 6e 6f 64 65  w, &pNew->pInode
24270 29 3b 0a 20 20 20 20 69 66 28 20 28 72 63 3d 3d  );.    if( (rc==
24280 53 51 4c 49 54 45 5f 4f 4b 29 20 26 26 20 28 70  SQLITE_OK) && (p
24290 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65  New->pInode->pSe
242a0 6d 3d 3d 4e 55 4c 4c 29 20 29 7b 0a 20 20 20 20  m==NULL) ){.    
242b0 20 20 63 68 61 72 20 2a 7a 53 65 6d 4e 61 6d 65    char *zSemName
242c0 20 3d 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d   = pNew->pInode-
242d0 3e 61 53 65 6d 4e 61 6d 65 3b 0a 20 20 20 20 20  >aSemName;.     
242e0 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 73 71   int n;.      sq
242f0 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d  lite3_snprintf(M
24300 41 58 5f 50 41 54 48 4e 41 4d 45 2c 20 7a 53 65  AX_PATHNAME, zSe
24310 6d 4e 61 6d 65 2c 20 22 2f 25 73 2e 73 65 6d 22  mName, "/%s.sem"
24320 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
24330 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70           pNew->p
24340 49 64 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61  Id->zCanonicalNa
24350 6d 65 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 20  me);.      for( 
24360 6e 3d 31 3b 20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d  n=1; zSemName[n]
24370 3b 20 6e 2b 2b 20 29 0a 20 20 20 20 20 20 20 20  ; n++ ).        
24380 69 66 28 20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d 3d  if( zSemName[n]=
24390 3d 27 2f 27 20 29 20 7a 53 65 6d 4e 61 6d 65 5b  ='/' ) zSemName[
243a0 6e 5d 20 3d 20 27 5f 27 3b 0a 20 20 20 20 20 20  n] = '_';.      
243b0 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53  pNew->pInode->pS
243c0 65 6d 20 3d 20 73 65 6d 5f 6f 70 65 6e 28 7a 53  em = sem_open(zS
243d0 65 6d 4e 61 6d 65 2c 20 4f 5f 43 52 45 41 54 2c  emName, O_CREAT,
243e0 20 30 36 36 36 2c 20 31 29 3b 0a 20 20 20 20 20   0666, 1);.     
243f0 20 69 66 28 20 70 4e 65 77 2d 3e 70 49 6e 6f 64   if( pNew->pInod
24400 65 2d 3e 70 53 65 6d 20 3d 3d 20 53 45 4d 5f 46  e->pSem == SEM_F
24410 41 49 4c 45 44 20 29 7b 0a 20 20 20 20 20 20 20  AILED ){.       
24420 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
24430 45 4d 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  EM;.        pNew
24440 2d 3e 70 49 6e 6f 64 65 2d 3e 61 53 65 6d 4e 61  ->pInode->aSemNa
24450 6d 65 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 20 20  me[0] = '\0';.  
24460 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
24470 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
24480 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a  ;.  }.#endif.  .
24490 20 20 70 4e 65 77 2d 3e 6c 61 73 74 45 72 72 6e    pNew->lastErrn
244a0 6f 20 3d 20 30 3b 0a 23 69 66 20 4f 53 5f 56 58  o = 0;.#if OS_VX
244b0 57 4f 52 4b 53 0a 20 20 69 66 28 20 72 63 21 3d  WORKS.  if( rc!=
244c0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
244d0 20 69 66 28 20 68 3e 3d 30 20 29 20 63 6c 6f 73   if( h>=0 ) clos
244e0 65 28 68 29 3b 0a 20 20 20 20 68 20 3d 20 2d 31  e(h);.    h = -1
244f0 3b 0a 20 20 20 20 75 6e 6c 69 6e 6b 28 7a 46 69  ;.    unlink(zFi
24500 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 69 73 44  lename);.    isD
24510 65 6c 65 74 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  elete = 0;.  }. 
24520 20 70 4e 65 77 2d 3e 69 73 44 65 6c 65 74 65 20   pNew->isDelete 
24530 3d 20 69 73 44 65 6c 65 74 65 3b 0a 23 65 6e 64  = isDelete;.#end
24540 69 66 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  if.  if( rc!=SQL
24550 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
24560 28 20 64 69 72 66 64 3e 3d 30 20 29 20 63 6c 6f  ( dirfd>=0 ) clo
24570 73 65 28 64 69 72 66 64 29 3b 20 2f 2a 20 73 69  se(dirfd); /* si
24580 6c 65 6e 74 20 6c 65 61 6b 20 69 66 20 66 61 69  lent leak if fai
24590 6c 2c 20 61 6c 72 65 61 64 79 20 69 6e 20 65 72  l, already in er
245a0 72 6f 72 20 2a 2f 0a 20 20 20 20 69 66 28 20 68  ror */.    if( h
245b0 3e 3d 30 20 29 20 63 6c 6f 73 65 28 68 29 3b 0a  >=0 ) close(h);.
245c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4e 65    }else{.    pNe
245d0 77 2d 3e 70 4d 65 74 68 6f 64 20 3d 20 70 4c 6f  w->pMethod = pLo
245e0 63 6b 69 6e 67 53 74 79 6c 65 3b 0a 20 20 20 20  ckingStyle;.    
245f0 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2b 31 29 3b  OpenCounter(+1);
24600 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
24610 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  ;.}../*.** Open 
24620 61 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  a file descripto
24630 72 20 74 6f 20 74 68 65 20 64 69 72 65 63 74 6f  r to the directo
24640 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20 66 69  ry containing fi
24650 6c 65 20 7a 46 69 6c 65 6e 61 6d 65 2e 0a 2a 2a  le zFilename..**
24660 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
24670 2a 70 46 64 20 69 73 20 73 65 74 20 74 6f 20 74  *pFd is set to t
24680 68 65 20 6f 70 65 6e 65 64 20 66 69 6c 65 20 64  he opened file d
24690 65 73 63 72 69 70 74 6f 72 20 61 6e 64 0a 2a 2a  escriptor and.**
246a0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
246b0 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 65 72  turned. If an er
246c0 72 6f 72 20 6f 63 63 75 72 73 2c 20 65 69 74 68  ror occurs, eith
246d0 65 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a  er SQLITE_NOMEM.
246e0 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 43 41 4e  ** or SQLITE_CAN
246f0 54 4f 50 45 4e 20 69 73 20 72 65 74 75 72 6e 65  TOPEN is returne
24700 64 20 61 6e 64 20 2a 70 46 64 20 69 73 20 73 65  d and *pFd is se
24710 74 20 74 6f 20 61 6e 20 75 6e 64 65 66 69 6e 65  t to an undefine
24720 64 0a 2a 2a 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a  d.** value..**.*
24730 2a 20 49 66 20 53 51 4c 49 54 45 5f 4f 4b 20 69  * If SQLITE_OK i
24740 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 20  s returned, the 
24750 63 61 6c 6c 65 72 20 69 73 20 72 65 73 70 6f 6e  caller is respon
24760 73 69 62 6c 65 20 66 6f 72 20 63 6c 6f 73 69 6e  sible for closin
24770 67 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20 64 65  g.** the file de
24780 73 63 72 69 70 74 6f 72 20 2a 70 46 64 20 75 73  scriptor *pFd us
24790 69 6e 67 20 63 6c 6f 73 65 28 29 2e 0a 2a 2f 0a  ing close()..*/.
247a0 73 74 61 74 69 63 20 69 6e 74 20 6f 70 65 6e 44  static int openD
247b0 69 72 65 63 74 6f 72 79 28 63 6f 6e 73 74 20 63  irectory(const c
247c0 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  har *zFilename, 
247d0 69 6e 74 20 2a 70 46 64 29 7b 0a 20 20 69 6e 74  int *pFd){.  int
247e0 20 69 69 3b 0a 20 20 69 6e 74 20 66 64 20 3d 20   ii;.  int fd = 
247f0 2d 31 3b 0a 20 20 63 68 61 72 20 7a 44 69 72 6e  -1;.  char zDirn
24800 61 6d 65 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45  ame[MAX_PATHNAME
24810 2b 31 5d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f  +1];..  sqlite3_
24820 73 6e 70 72 69 6e 74 66 28 4d 41 58 5f 50 41 54  snprintf(MAX_PAT
24830 48 4e 41 4d 45 2c 20 7a 44 69 72 6e 61 6d 65 2c  HNAME, zDirname,
24840 20 22 25 73 22 2c 20 7a 46 69 6c 65 6e 61 6d 65   "%s", zFilename
24850 29 3b 0a 20 20 66 6f 72 28 69 69 3d 28 69 6e 74  );.  for(ii=(int
24860 29 73 74 72 6c 65 6e 28 7a 44 69 72 6e 61 6d 65  )strlen(zDirname
24870 29 3b 20 69 69 3e 31 20 26 26 20 7a 44 69 72 6e  ); ii>1 && zDirn
24880 61 6d 65 5b 69 69 5d 21 3d 27 2f 27 3b 20 69 69  ame[ii]!='/'; ii
24890 2d 2d 29 3b 0a 20 20 69 66 28 20 69 69 3e 30 20  --);.  if( ii>0 
248a0 29 7b 0a 20 20 20 20 7a 44 69 72 6e 61 6d 65 5b  ){.    zDirname[
248b0 69 69 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20  ii] = '\0';.    
248c0 66 64 20 3d 20 6f 70 65 6e 28 7a 44 69 72 6e 61  fd = open(zDirna
248d0 6d 65 2c 20 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f 42  me, O_RDONLY|O_B
248e0 49 4e 41 52 59 2c 20 30 29 3b 0a 20 20 20 20 69  INARY, 0);.    i
248f0 66 28 20 66 64 3e 3d 30 20 29 7b 0a 23 69 66 64  f( fd>=0 ){.#ifd
24900 65 66 20 46 44 5f 43 4c 4f 45 58 45 43 0a 20 20  ef FD_CLOEXEC.  
24910 20 20 20 20 66 63 6e 74 6c 28 66 64 2c 20 46 5f      fcntl(fd, F_
24920 53 45 54 46 44 2c 20 66 63 6e 74 6c 28 66 64 2c  SETFD, fcntl(fd,
24930 20 46 5f 47 45 54 46 44 2c 20 30 29 20 7c 20 46   F_GETFD, 0) | F
24940 44 5f 43 4c 4f 45 58 45 43 29 3b 0a 23 65 6e 64  D_CLOEXEC);.#end
24950 69 66 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  if.      OSTRACE
24960 28 28 22 4f 50 45 4e 44 49 52 20 25 2d 33 64 20  (("OPENDIR %-3d 
24970 25 73 5c 6e 22 2c 20 66 64 2c 20 7a 44 69 72 6e  %s\n", fd, zDirn
24980 61 6d 65 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ame));.    }.  }
24990 0a 20 20 2a 70 46 64 20 3d 20 66 64 3b 0a 20 20  .  *pFd = fd;.  
249a0 72 65 74 75 72 6e 20 28 66 64 3e 3d 30 3f 53 51  return (fd>=0?SQ
249b0 4c 49 54 45 5f 4f 4b 3a 53 51 4c 49 54 45 5f 43  LITE_OK:SQLITE_C
249c0 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 29 3b 0a 7d  ANTOPEN_BKPT);.}
249d0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
249e0 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 64 69 72  he name of a dir
249f0 65 63 74 6f 72 79 20 69 6e 20 77 68 69 63 68 20  ectory in which 
24a00 74 6f 20 70 75 74 20 74 65 6d 70 6f 72 61 72 79  to put temporary
24a10 20 66 69 6c 65 73 2e 0a 2a 2a 20 49 66 20 6e 6f   files..** If no
24a20 20 73 75 69 74 61 62 6c 65 20 74 65 6d 70 6f 72   suitable tempor
24a30 61 72 79 20 66 69 6c 65 20 64 69 72 65 63 74 6f  ary file directo
24a40 72 79 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 2c  ry can be found,
24a50 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f   return NULL..*/
24a60 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
24a70 61 72 20 2a 75 6e 69 78 54 65 6d 70 46 69 6c 65  ar *unixTempFile
24a80 44 69 72 28 76 6f 69 64 29 7b 0a 20 20 73 74 61  Dir(void){.  sta
24a90 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
24aa0 61 7a 44 69 72 73 5b 5d 20 3d 20 7b 0a 20 20 20  azDirs[] = {.   
24ab0 20 20 30 2c 0a 20 20 20 20 20 30 2c 0a 20 20 20    0,.     0,.   
24ac0 20 20 22 2f 76 61 72 2f 74 6d 70 22 2c 0a 20 20    "/var/tmp",.  
24ad0 20 20 20 22 2f 75 73 72 2f 74 6d 70 22 2c 0a 20     "/usr/tmp",. 
24ae0 20 20 20 20 22 2f 74 6d 70 22 2c 0a 20 20 20 20      "/tmp",.    
24af0 20 30 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73   0        /* Lis
24b00 74 20 74 65 72 6d 69 6e 61 74 6f 72 20 2a 2f 0a  t terminator */.
24b10 20 20 7d 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20    };.  unsigned 
24b20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
24b30 73 74 61 74 20 62 75 66 3b 0a 20 20 63 6f 6e 73  stat buf;.  cons
24b40 74 20 63 68 61 72 20 2a 7a 44 69 72 20 3d 20 30  t char *zDir = 0
24b50 3b 0a 0a 20 20 61 7a 44 69 72 73 5b 30 5d 20 3d  ;..  azDirs[0] =
24b60 20 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69   sqlite3_temp_di
24b70 72 65 63 74 6f 72 79 3b 0a 20 20 69 66 28 20 21  rectory;.  if( !
24b80 61 7a 44 69 72 73 5b 31 5d 20 29 20 61 7a 44 69  azDirs[1] ) azDi
24b90 72 73 5b 31 5d 20 3d 20 67 65 74 65 6e 76 28 22  rs[1] = getenv("
24ba0 54 4d 50 44 49 52 22 29 3b 0a 20 20 66 6f 72 28  TMPDIR");.  for(
24bb0 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 7a  i=0; i<sizeof(az
24bc0 44 69 72 73 29 2f 73 69 7a 65 6f 66 28 61 7a 44  Dirs)/sizeof(azD
24bd0 69 72 73 5b 30 5d 29 3b 20 7a 44 69 72 3d 61 7a  irs[0]); zDir=az
24be0 44 69 72 73 5b 69 2b 2b 5d 29 7b 0a 20 20 20 20  Dirs[i++]){.    
24bf0 69 66 28 20 7a 44 69 72 3d 3d 30 20 29 20 63 6f  if( zDir==0 ) co
24c00 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
24c10 73 74 61 74 28 7a 44 69 72 2c 20 26 62 75 66 29  stat(zDir, &buf)
24c20 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
24c30 20 69 66 28 20 21 53 5f 49 53 44 49 52 28 62 75   if( !S_ISDIR(bu
24c40 66 2e 73 74 5f 6d 6f 64 65 29 20 29 20 63 6f 6e  f.st_mode) ) con
24c50 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 61  tinue;.    if( a
24c60 63 63 65 73 73 28 7a 44 69 72 2c 20 30 37 29 20  ccess(zDir, 07) 
24c70 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
24c80 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74  break;.  }.  ret
24c90 75 72 6e 20 7a 44 69 72 3b 0a 7d 0a 0a 2f 2a 0a  urn zDir;.}../*.
24ca0 2a 2a 20 43 72 65 61 74 65 20 61 20 74 65 6d 70  ** Create a temp
24cb0 6f 72 61 72 79 20 66 69 6c 65 20 6e 61 6d 65 20  orary file name 
24cc0 69 6e 20 7a 42 75 66 2e 20 20 7a 42 75 66 20 6d  in zBuf.  zBuf m
24cd0 75 73 74 20 62 65 20 61 6c 6c 6f 63 61 74 65 64  ust be allocated
24ce0 0a 2a 2a 20 62 79 20 74 68 65 20 63 61 6c 6c 69  .** by the calli
24cf0 6e 67 20 70 72 6f 63 65 73 73 20 61 6e 64 20 6d  ng process and m
24d00 75 73 74 20 62 65 20 62 69 67 20 65 6e 6f 75 67  ust be big enoug
24d10 68 20 74 6f 20 68 6f 6c 64 20 61 74 20 6c 65 61  h to hold at lea
24d20 73 74 0a 2a 2a 20 70 56 66 73 2d 3e 6d 78 50 61  st.** pVfs->mxPa
24d30 74 68 6e 61 6d 65 20 62 79 74 65 73 2e 0a 2a 2f  thname bytes..*/
24d40 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
24d50 47 65 74 54 65 6d 70 6e 61 6d 65 28 69 6e 74 20  GetTempname(int 
24d60 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66  nBuf, char *zBuf
24d70 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  ){.  static cons
24d80 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
24d90 7a 43 68 61 72 73 5b 5d 20 3d 0a 20 20 20 20 22  zChars[] =.    "
24da0 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70  abcdefghijklmnop
24db0 71 72 73 74 75 76 77 78 79 7a 22 0a 20 20 20 20  qrstuvwxyz".    
24dc0 22 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f  "ABCDEFGHIJKLMNO
24dd0 50 51 52 53 54 55 56 57 58 59 5a 22 0a 20 20 20  PQRSTUVWXYZ".   
24de0 20 22 30 31 32 33 34 35 36 37 38 39 22 3b 0a 20   "0123456789";. 
24df0 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 2c   unsigned int i,
24e00 20 6a 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   j;.  const char
24e10 20 2a 7a 44 69 72 3b 0a 0a 20 20 2f 2a 20 49 74   *zDir;..  /* It
24e20 27 73 20 6f 64 64 20 74 6f 20 73 69 6d 75 6c 61  's odd to simula
24e30 74 65 20 61 6e 20 69 6f 2d 65 72 72 6f 72 20 68  te an io-error h
24e40 65 72 65 2c 20 62 75 74 20 72 65 61 6c 6c 79 20  ere, but really 
24e50 74 68 69 73 20 69 73 20 6a 75 73 74 0a 20 20 2a  this is just.  *
24e60 2a 20 75 73 69 6e 67 20 74 68 65 20 69 6f 2d 65  * using the io-e
24e70 72 72 6f 72 20 69 6e 66 72 61 73 74 72 75 63 74  rror infrastruct
24e80 75 72 65 20 74 6f 20 74 65 73 74 20 74 68 61 74  ure to test that
24e90 20 53 51 4c 69 74 65 20 68 61 6e 64 6c 65 73 20   SQLite handles 
24ea0 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69  this.  ** functi
24eb0 6f 6e 20 66 61 69 6c 69 6e 67 2e 20 0a 20 20 2a  on failing. .  *
24ec0 2f 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  /.  SimulateIOEr
24ed0 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
24ee0 54 45 5f 49 4f 45 52 52 20 29 3b 0a 0a 20 20 7a  TE_IOERR );..  z
24ef0 44 69 72 20 3d 20 75 6e 69 78 54 65 6d 70 46 69  Dir = unixTempFi
24f00 6c 65 44 69 72 28 29 3b 0a 20 20 69 66 28 20 7a  leDir();.  if( z
24f10 44 69 72 3d 3d 30 20 29 20 7a 44 69 72 20 3d 20  Dir==0 ) zDir = 
24f20 22 2e 22 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  ".";..  /* Check
24f30 20 74 68 61 74 20 74 68 65 20 6f 75 74 70 75 74   that the output
24f40 20 62 75 66 66 65 72 20 69 73 20 6c 61 72 67 65   buffer is large
24f50 20 65 6e 6f 75 67 68 20 66 6f 72 20 74 68 65 20   enough for the 
24f60 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 0a  temporary file .
24f70 20 20 2a 2a 20 6e 61 6d 65 2e 20 49 66 20 69 74    ** name. If it
24f80 20 69 73 20 6e 6f 74 2c 20 72 65 74 75 72 6e 20   is not, return 
24f90 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 20 20  SQLITE_ERROR..  
24fa0 2a 2f 0a 20 20 69 66 28 20 28 73 74 72 6c 65 6e  */.  if( (strlen
24fb0 28 7a 44 69 72 29 20 2b 20 73 74 72 6c 65 6e 28  (zDir) + strlen(
24fc0 53 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45  SQLITE_TEMP_FILE
24fd0 5f 50 52 45 46 49 58 29 20 2b 20 31 37 29 20 3e  _PREFIX) + 17) >
24fe0 3d 20 28 73 69 7a 65 5f 74 29 6e 42 75 66 20 29  = (size_t)nBuf )
24ff0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
25000 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  ITE_ERROR;.  }..
25010 20 20 64 6f 7b 0a 20 20 20 20 73 71 6c 69 74 65    do{.    sqlite
25020 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2d  3_snprintf(nBuf-
25030 31 37 2c 20 7a 42 75 66 2c 20 22 25 73 2f 22 53  17, zBuf, "%s/"S
25040 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f  QLITE_TEMP_FILE_
25050 50 52 45 46 49 58 2c 20 7a 44 69 72 29 3b 0a 20  PREFIX, zDir);. 
25060 20 20 20 6a 20 3d 20 28 69 6e 74 29 73 74 72 6c     j = (int)strl
25070 65 6e 28 7a 42 75 66 29 3b 0a 20 20 20 20 73 71  en(zBuf);.    sq
25080 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73  lite3_randomness
25090 28 31 35 2c 20 26 7a 42 75 66 5b 6a 5d 29 3b 0a  (15, &zBuf[j]);.
250a0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31      for(i=0; i<1
250b0 35 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20  5; i++, j++){.  
250c0 20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 28 63      zBuf[j] = (c
250d0 68 61 72 29 7a 43 68 61 72 73 5b 20 28 28 75 6e  har)zChars[ ((un
250e0 73 69 67 6e 65 64 20 63 68 61 72 29 7a 42 75 66  signed char)zBuf
250f0 5b 6a 5d 29 25 28 73 69 7a 65 6f 66 28 7a 43 68  [j])%(sizeof(zCh
25100 61 72 73 29 2d 31 29 20 5d 3b 0a 20 20 20 20 7d  ars)-1) ];.    }
25110 0a 20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 30  .    zBuf[j] = 0
25120 3b 0a 20 20 7d 77 68 69 6c 65 28 20 61 63 63 65  ;.  }while( acce
25130 73 73 28 7a 42 75 66 2c 30 29 3d 3d 30 20 29 3b  ss(zBuf,0)==0 );
25140 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
25150 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49  _OK;.}..#if SQLI
25160 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
25170 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e  G_STYLE && defin
25180 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 2f 2a  ed(__APPLE__)./*
25190 0a 2a 2a 20 52 6f 75 74 69 6e 65 20 74 6f 20 74  .** Routine to t
251a0 72 61 6e 73 66 6f 72 6d 20 61 20 75 6e 69 78 46  ransform a unixF
251b0 69 6c 65 20 69 6e 74 6f 20 61 20 70 72 6f 78 79  ile into a proxy
251c0 2d 6c 6f 63 6b 69 6e 67 20 75 6e 69 78 46 69 6c  -locking unixFil
251d0 65 2e 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61  e..** Implementa
251e0 74 69 6f 6e 20 69 6e 20 74 68 65 20 70 72 6f 78  tion in the prox
251f0 79 2d 6c 6f 63 6b 20 64 69 76 69 73 69 6f 6e 2c  y-lock division,
25200 20 62 75 74 20 75 73 65 64 20 62 79 20 75 6e 69   but used by uni
25210 78 4f 70 65 6e 28 29 0a 2a 2a 20 69 66 20 53 51  xOpen().** if SQ
25220 4c 49 54 45 5f 50 52 45 46 45 52 5f 50 52 4f 58  LITE_PREFER_PROX
25230 59 5f 4c 4f 43 4b 49 4e 47 20 69 73 20 64 65 66  Y_LOCKING is def
25240 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ined..*/.static 
25250 69 6e 74 20 70 72 6f 78 79 54 72 61 6e 73 66 6f  int proxyTransfo
25260 72 6d 55 6e 69 78 46 69 6c 65 28 75 6e 69 78 46  rmUnixFile(unixF
25270 69 6c 65 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72  ile*, const char
25280 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  *);.#endif../*.*
25290 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61 6e 20  * Search for an 
252a0 75 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73 63  unused file desc
252b0 72 69 70 74 6f 72 20 74 68 61 74 20 77 61 73 20  riptor that was 
252c0 6f 70 65 6e 65 64 20 6f 6e 20 74 68 65 20 64 61  opened on the da
252d0 74 61 62 61 73 65 20 0a 2a 2a 20 66 69 6c 65 20  tabase .** file 
252e0 28 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 20 6f  (not a journal o
252f0 72 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  r master-journal
25300 20 66 69 6c 65 29 20 69 64 65 6e 74 69 66 69 65   file) identifie
25310 64 20 62 79 20 70 61 74 68 6e 61 6d 65 0a 2a 2a  d by pathname.**
25320 20 7a 50 61 74 68 20 77 69 74 68 20 53 51 4c 49   zPath with SQLI
25330 54 45 5f 4f 50 45 4e 5f 58 58 58 20 66 6c 61 67  TE_OPEN_XXX flag
25340 73 20 6d 61 74 63 68 69 6e 67 20 74 68 6f 73 65  s matching those
25350 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
25360 65 63 6f 6e 64 0a 2a 2a 20 61 72 67 75 6d 65 6e  econd.** argumen
25370 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  t to this functi
25380 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 53 75 63 68 20 61  on..**.** Such a
25390 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
253a0 20 6d 61 79 20 65 78 69 73 74 20 69 66 20 61 20   may exist if a 
253b0 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
253c0 69 6f 6e 20 77 61 73 20 63 6c 6f 73 65 64 0a 2a  ion was closed.*
253d0 2a 20 62 75 74 20 74 68 65 20 61 73 73 6f 63 69  * but the associ
253e0 61 74 65 64 20 66 69 6c 65 20 64 65 73 63 72 69  ated file descri
253f0 70 74 6f 72 20 63 6f 75 6c 64 20 6e 6f 74 20 62  ptor could not b
25400 65 20 63 6c 6f 73 65 64 20 62 65 63 61 75 73 65  e closed because
25410 20 73 6f 6d 65 0a 2a 2a 20 6f 74 68 65 72 20 66   some.** other f
25420 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f  ile descriptor o
25430 70 65 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  pen on the same 
25440 66 69 6c 65 20 69 73 20 68 6f 6c 64 69 6e 67 20  file is holding 
25450 61 20 66 69 6c 65 2d 6c 6f 63 6b 2e 0a 2a 2a 20  a file-lock..** 
25460 52 65 66 65 72 20 74 6f 20 63 6f 6d 6d 65 6e 74  Refer to comment
25470 73 20 69 6e 20 74 68 65 20 75 6e 69 78 43 6c 6f  s in the unixClo
25480 73 65 28 29 20 66 75 6e 63 74 69 6f 6e 20 61 6e  se() function an
25490 64 20 74 68 65 20 6c 65 6e 67 74 68 79 20 63 6f  d the lengthy co
254a0 6d 6d 65 6e 74 0a 2a 2a 20 64 65 73 63 72 69 62  mment.** describ
254b0 69 6e 67 20 22 50 6f 73 69 78 20 41 64 76 69 73  ing "Posix Advis
254c0 6f 72 79 20 4c 6f 63 6b 69 6e 67 22 20 61 74 20  ory Locking" at 
254d0 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 69  the start of thi
254e0 73 20 66 69 6c 65 20 66 6f 72 20 0a 2a 2a 20 66  s file for .** f
254f0 75 72 74 68 65 72 20 64 65 74 61 69 6c 73 2e 20  urther details. 
25500 41 6c 73 6f 2c 20 74 69 63 6b 65 74 20 23 34 30  Also, ticket #40
25510 31 38 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 73  18..**.** If a s
25520 75 69 74 61 62 6c 65 20 66 69 6c 65 20 64 65 73  uitable file des
25530 63 72 69 70 74 6f 72 20 69 73 20 66 6f 75 6e 64  criptor is found
25540 2c 20 74 68 65 6e 20 69 74 20 69 73 20 72 65 74  , then it is ret
25550 75 72 6e 65 64 2e 20 49 66 20 6e 6f 0a 2a 2a 20  urned. If no.** 
25560 73 75 63 68 20 66 69 6c 65 20 64 65 73 63 72 69  such file descri
25570 70 74 6f 72 20 69 73 20 6c 6f 63 61 74 65 64 2c  ptor is located,
25580 20 2d 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e   -1 is returned.
25590 0a 2a 2f 0a 73 74 61 74 69 63 20 55 6e 69 78 55  .*/.static UnixU
255a0 6e 75 73 65 64 46 64 20 2a 66 69 6e 64 52 65 75  nusedFd *findReu
255b0 73 61 62 6c 65 46 64 28 63 6f 6e 73 74 20 63 68  sableFd(const ch
255c0 61 72 20 2a 7a 50 61 74 68 2c 20 69 6e 74 20 66  ar *zPath, int f
255d0 6c 61 67 73 29 7b 0a 20 20 55 6e 69 78 55 6e 75  lags){.  UnixUnu
255e0 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64 20 3d  sedFd *pUnused =
255f0 20 30 3b 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74   0;..  /* Do not
25600 20 73 65 61 72 63 68 20 66 6f 72 20 61 6e 20 75   search for an u
25610 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73 63 72  nused file descr
25620 69 70 74 6f 72 20 6f 6e 20 76 78 77 6f 72 6b 73  iptor on vxworks
25630 2e 20 4e 6f 74 20 62 65 63 61 75 73 65 0a 20 20  . Not because.  
25640 2a 2a 20 76 78 77 6f 72 6b 73 20 77 6f 75 6c 64  ** vxworks would
25650 20 6e 6f 74 20 62 65 6e 65 66 69 74 20 66 72 6f   not benefit fro
25660 6d 20 74 68 65 20 63 68 61 6e 67 65 20 28 69 74  m the change (it
25670 20 6d 69 67 68 74 2c 20 77 65 27 72 65 20 6e 6f   might, we're no
25680 74 20 73 75 72 65 29 2c 0a 20 20 2a 2a 20 62 75  t sure),.  ** bu
25690 74 20 62 65 63 61 75 73 65 20 6e 6f 20 77 61 79  t because no way
256a0 20 74 6f 20 74 65 73 74 20 69 74 20 69 73 20 63   to test it is c
256b0 75 72 72 65 6e 74 6c 79 20 61 76 61 69 6c 61 62  urrently availab
256c0 6c 65 2e 20 49 74 20 69 73 20 62 65 74 74 65 72  le. It is better
256d0 20 0a 20 20 2a 2a 20 6e 6f 74 20 74 6f 20 72 69   .  ** not to ri
256e0 73 6b 20 62 72 65 61 6b 69 6e 67 20 76 78 77 6f  sk breaking vxwo
256f0 72 6b 73 20 73 75 70 70 6f 72 74 20 66 6f 72 20  rks support for 
25700 74 68 65 20 73 61 6b 65 20 6f 66 20 73 75 63 68  the sake of such
25710 20 61 6e 20 6f 62 73 63 75 72 65 20 0a 20 20 2a   an obscure .  *
25720 2a 20 66 65 61 74 75 72 65 2e 20 20 2a 2f 0a 23  * feature.  */.#
25730 69 66 20 21 4f 53 5f 56 58 57 4f 52 4b 53 0a 20  if !OS_VXWORKS. 
25740 20 73 74 72 75 63 74 20 73 74 61 74 20 73 53 74   struct stat sSt
25750 61 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  at;             
25760 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 73        /* Results
25770 20 6f 66 20 73 74 61 74 28 29 20 63 61 6c 6c 20   of stat() call 
25780 2a 2f 0a 0a 20 20 2f 2a 20 41 20 73 74 61 74 28  */..  /* A stat(
25790 29 20 63 61 6c 6c 20 6d 61 79 20 66 61 69 6c 20  ) call may fail 
257a0 66 6f 72 20 76 61 72 69 6f 75 73 20 72 65 61 73  for various reas
257b0 6f 6e 73 2e 20 49 66 20 74 68 69 73 20 68 61 70  ons. If this hap
257c0 70 65 6e 73 2c 20 69 74 20 69 73 0a 20 20 2a 2a  pens, it is.  **
257d0 20 61 6c 6d 6f 73 74 20 63 65 72 74 61 69 6e 20   almost certain 
257e0 74 68 61 74 20 61 6e 20 6f 70 65 6e 28 29 20 63  that an open() c
257f0 61 6c 6c 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  all on the same 
25800 70 61 74 68 20 77 69 6c 6c 20 61 6c 73 6f 20 66  path will also f
25810 61 69 6c 2e 0a 20 20 2a 2a 20 46 6f 72 20 74 68  ail..  ** For th
25820 69 73 20 72 65 61 73 6f 6e 2c 20 69 66 20 61 6e  is reason, if an
25830 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 69 6e   error occurs in
25840 20 74 68 65 20 73 74 61 74 28 29 20 63 61 6c 6c   the stat() call
25850 20 68 65 72 65 2c 20 69 74 20 69 73 0a 20 20 2a   here, it is.  *
25860 2a 20 69 67 6e 6f 72 65 64 20 61 6e 64 20 2d 31  * ignored and -1
25870 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 54 68   is returned. Th
25880 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 74 72  e caller will tr
25890 79 20 74 6f 20 6f 70 65 6e 20 61 20 6e 65 77 20  y to open a new 
258a0 66 69 6c 65 0a 20 20 2a 2a 20 64 65 73 63 72 69  file.  ** descri
258b0 70 74 6f 72 20 6f 6e 20 74 68 65 20 73 61 6d 65  ptor on the same
258c0 20 70 61 74 68 2c 20 66 61 69 6c 2c 20 61 6e 64   path, fail, and
258d0 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   return an error
258e0 20 74 6f 20 53 51 4c 69 74 65 2e 0a 20 20 2a 2a   to SQLite..  **
258f0 0a 20 20 2a 2a 20 45 76 65 6e 20 69 66 20 61 20  .  ** Even if a 
25900 73 75 62 73 65 71 75 65 6e 74 20 6f 70 65 6e 28  subsequent open(
25910 29 20 63 61 6c 6c 20 64 6f 65 73 20 73 75 63 63  ) call does succ
25920 65 65 64 2c 20 74 68 65 20 63 6f 6e 73 65 71 75  eed, the consequ
25930 65 6e 63 65 73 20 6f 66 0a 20 20 2a 2a 20 6e 6f  ences of.  ** no
25940 74 20 73 65 61 72 63 68 69 6e 67 20 66 6f 72 20  t searching for 
25950 61 20 72 65 73 75 73 61 62 6c 65 20 66 69 6c 65  a resusable file
25960 20 64 65 73 63 72 69 70 74 6f 72 20 61 72 65 20   descriptor are 
25970 6e 6f 74 20 64 69 72 65 2e 20 20 2a 2f 0a 20 20  not dire.  */.  
25980 69 66 28 20 30 3d 3d 73 74 61 74 28 7a 50 61 74  if( 0==stat(zPat
25990 68 2c 20 26 73 53 74 61 74 29 20 29 7b 0a 20 20  h, &sStat) ){.  
259a0 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20    unixInodeInfo 
259b0 2a 70 49 6e 6f 64 65 3b 0a 0a 20 20 20 20 75 6e  *pInode;..    un
259c0 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
259d0 20 20 20 20 70 49 6e 6f 64 65 20 3d 20 69 6e 6f      pInode = ino
259e0 64 65 4c 69 73 74 3b 0a 20 20 20 20 77 68 69 6c  deList;.    whil
259f0 65 28 20 70 49 6e 6f 64 65 20 26 26 20 28 70 49  e( pInode && (pI
25a00 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2e 64 65 76  node->fileId.dev
25a10 21 3d 73 53 74 61 74 2e 73 74 5f 64 65 76 0a 20  !=sStat.st_dev. 
25a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25a30 20 20 20 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 66      || pInode->f
25a40 69 6c 65 49 64 2e 69 6e 6f 21 3d 73 53 74 61 74  ileId.ino!=sStat
25a50 2e 73 74 5f 69 6e 6f 29 20 29 7b 0a 20 20 20 20  .st_ino) ){.    
25a60 20 20 20 70 49 6e 6f 64 65 20 3d 20 70 49 6e 6f     pInode = pIno
25a70 64 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d  de->pNext;.    }
25a80 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 20  .    if( pInode 
25a90 29 7b 0a 20 20 20 20 20 20 55 6e 69 78 55 6e 75  ){.      UnixUnu
25aa0 73 65 64 46 64 20 2a 2a 70 70 3b 0a 20 20 20 20  sedFd **pp;.    
25ab0 20 20 66 6f 72 28 70 70 3d 26 70 49 6e 6f 64 65    for(pp=&pInode
25ac0 2d 3e 70 55 6e 75 73 65 64 3b 20 2a 70 70 20 26  ->pUnused; *pp &
25ad0 26 20 28 2a 70 70 29 2d 3e 66 6c 61 67 73 21 3d  & (*pp)->flags!=
25ae0 66 6c 61 67 73 3b 20 70 70 3d 26 28 28 2a 70 70  flags; pp=&((*pp
25af0 29 2d 3e 70 4e 65 78 74 29 29 3b 0a 20 20 20 20  )->pNext));.    
25b00 20 20 70 55 6e 75 73 65 64 20 3d 20 2a 70 70 3b    pUnused = *pp;
25b10 0a 20 20 20 20 20 20 69 66 28 20 70 55 6e 75 73  .      if( pUnus
25b20 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70  ed ){.        *p
25b30 70 20 3d 20 70 55 6e 75 73 65 64 2d 3e 70 4e 65  p = pUnused->pNe
25b40 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  xt;.      }.    
25b50 7d 0a 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d  }.    unixLeaveM
25b60 75 74 65 78 28 29 3b 0a 20 20 7d 0a 23 65 6e 64  utex();.  }.#end
25b70 69 66 20 20 20 20 2f 2a 20 69 66 20 21 4f 53 5f  if    /* if !OS_
25b80 56 58 57 4f 52 4b 53 20 2a 2f 0a 20 20 72 65 74  VXWORKS */.  ret
25b90 75 72 6e 20 70 55 6e 75 73 65 64 3b 0a 7d 0a 0a  urn pUnused;.}..
25ba0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
25bb0 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 79  ion is called by
25bc0 20 75 6e 69 78 4f 70 65 6e 28 29 20 74 6f 20 64   unixOpen() to d
25bd0 65 74 65 72 6d 69 6e 65 20 74 68 65 20 75 6e 69  etermine the uni
25be0 78 20 70 65 72 6d 69 73 73 69 6f 6e 73 0a 2a 2a  x permissions.**
25bf0 20 74 6f 20 63 72 65 61 74 65 20 6e 65 77 20 66   to create new f
25c00 69 6c 65 73 20 77 69 74 68 2e 20 49 66 20 6e 6f  iles with. If no
25c10 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
25c20 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  hen SQLITE_OK is
25c30 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61 6e 64   returned.** and
25c40 20 61 20 76 61 6c 75 65 20 73 75 69 74 61 62 6c   a value suitabl
25c50 65 20 66 6f 72 20 70 61 73 73 69 6e 67 20 61 73  e for passing as
25c60 20 74 68 65 20 74 68 69 72 64 20 61 72 67 75 6d   the third argum
25c70 65 6e 74 20 74 6f 20 6f 70 65 6e 28 32 29 20 69  ent to open(2) i
25c80 73 0a 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f 20  s.** written to 
25c90 2a 70 4d 6f 64 65 2e 20 49 66 20 61 6e 20 49 4f  *pMode. If an IO
25ca0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61   error occurs, a
25cb0 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
25cc0 6f 64 65 20 69 73 20 0a 2a 2a 20 72 65 74 75 72  ode is .** retur
25cd0 6e 65 64 20 61 6e 64 20 74 68 65 20 76 61 6c 75  ned and the valu
25ce0 65 20 6f 66 20 2a 70 4d 6f 64 65 20 69 73 20 6e  e of *pMode is n
25cf0 6f 74 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a  ot modified..**.
25d00 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 62  ** If the file b
25d10 65 69 6e 67 20 6f 70 65 6e 65 64 20 69 73 20 61  eing opened is a
25d20 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2c   temporary file,
25d30 20 69 74 20 69 73 20 61 6c 77 61 79 73 20 63 72   it is always cr
25d40 65 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 74 68  eated with.** th
25d50 65 20 6f 63 74 61 6c 20 70 65 72 6d 69 73 73 69  e octal permissi
25d60 6f 6e 73 20 30 36 30 30 20 28 72 65 61 64 2f 77  ons 0600 (read/w
25d70 72 69 74 61 62 6c 65 20 62 79 20 6f 77 6e 65 72  ritable by owner
25d80 20 6f 6e 6c 79 29 2e 20 49 66 20 74 68 65 20 66   only). If the f
25d90 69 6c 65 0a 2a 2a 20 69 73 20 61 20 64 61 74 61  ile.** is a data
25da0 62 61 73 65 20 6f 72 20 6d 61 73 74 65 72 20 6a  base or master j
25db0 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 69 74 20  ournal file, it 
25dc0 69 73 20 63 72 65 61 74 65 64 20 77 69 74 68 20  is created with 
25dd0 74 68 65 20 70 65 72 6d 69 73 73 69 6f 6e 73 20  the permissions 
25de0 0a 2a 2a 20 6d 61 73 6b 20 53 51 4c 49 54 45 5f  .** mask SQLITE_
25df0 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52  DEFAULT_FILE_PER
25e00 4d 49 53 53 49 4f 4e 53 2e 0a 2a 2a 0a 2a 2a 20  MISSIONS..**.** 
25e10 46 69 6e 61 6c 6c 79 2c 20 69 66 20 74 68 65 20  Finally, if the 
25e20 66 69 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e 65  file being opene
25e30 64 20 69 73 20 61 20 57 41 4c 20 6f 72 20 72 65  d is a WAL or re
25e40 67 75 6c 61 72 20 6a 6f 75 72 6e 61 6c 20 66 69  gular journal fi
25e50 6c 65 2c 20 74 68 65 6e 20 0a 2a 2a 20 74 68 69  le, then .** thi
25e60 73 20 66 75 6e 63 74 69 6f 6e 20 71 75 65 72 69  s function queri
25e70 65 73 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  es the file-syst
25e80 65 6d 20 66 6f 72 20 74 68 65 20 70 65 72 6d 69  em for the permi
25e90 73 73 69 6f 6e 73 20 6f 6e 20 74 68 65 20 0a 2a  ssions on the .*
25ea0 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  * corresponding 
25eb0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e  database file an
25ec0 64 20 73 65 74 73 20 2a 70 4d 6f 64 65 20 74 6f  d sets *pMode to
25ed0 20 74 68 69 73 20 76 61 6c 75 65 2e 20 57 68 65   this value. Whe
25ee0 6e 65 76 65 72 20 0a 2a 2a 20 70 6f 73 73 69 62  never .** possib
25ef0 6c 65 2c 20 57 41 4c 20 61 6e 64 20 6a 6f 75 72  le, WAL and jour
25f00 6e 61 6c 20 66 69 6c 65 73 20 61 72 65 20 63 72  nal files are cr
25f10 65 61 74 65 64 20 75 73 69 6e 67 20 74 68 65 20  eated using the 
25f20 73 61 6d 65 20 70 65 72 6d 69 73 73 69 6f 6e 73  same permissions
25f30 20 0a 2a 2a 20 61 73 20 74 68 65 20 61 73 73 6f   .** as the asso
25f40 63 69 61 74 65 64 20 64 61 74 61 62 61 73 65 20  ciated database 
25f50 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
25f60 69 6e 74 20 66 69 6e 64 43 72 65 61 74 65 46 69  int findCreateFi
25f70 6c 65 4d 6f 64 65 28 0a 20 20 63 6f 6e 73 74 20  leMode(.  const 
25f80 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20  char *zPath,    
25f90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 74            /* Pat
25fa0 68 20 6f 66 20 66 69 6c 65 20 28 70 6f 73 73 69  h of file (possi
25fb0 62 6c 79 29 20 62 65 69 6e 67 20 63 72 65 61 74  bly) being creat
25fc0 65 64 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  ed */.  int flag
25fd0 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
25fe0 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73          /* Flags
25ff0 20 70 61 73 73 65 64 20 61 73 20 34 74 68 20 61   passed as 4th a
26000 72 67 75 6d 65 6e 74 20 74 6f 20 78 4f 70 65 6e  rgument to xOpen
26010 28 29 20 2a 2f 0a 20 20 6d 6f 64 65 5f 74 20 2a  () */.  mode_t *
26020 70 4d 6f 64 65 20 20 20 20 20 20 20 20 20 20 20  pMode           
26030 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
26040 50 65 72 6d 69 73 73 69 6f 6e 73 20 74 6f 20 6f  Permissions to o
26050 70 65 6e 20 66 69 6c 65 20 77 69 74 68 20 2a 2f  pen file with */
26060 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
26070 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
26080 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
26090 43 6f 64 65 20 2a 2f 0a 20 20 69 66 28 20 66 6c  Code */.  if( fl
260a0 61 67 73 20 26 20 28 53 51 4c 49 54 45 5f 4f 50  ags & (SQLITE_OP
260b0 45 4e 5f 57 41 4c 7c 53 51 4c 49 54 45 5f 4f 50  EN_WAL|SQLITE_OP
260c0 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29  EN_MAIN_JOURNAL)
260d0 20 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 44 62   ){.    char zDb
260e0 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 31 5d  [MAX_PATHNAME+1]
260f0 3b 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73  ;     /* Databas
26100 65 20 66 69 6c 65 20 70 61 74 68 20 2a 2f 0a 20  e file path */. 
26110 20 20 20 69 6e 74 20 6e 44 62 3b 20 20 20 20 20     int nDb;     
26120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26130 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 76 61   /* Number of va
26140 6c 69 64 20 62 79 74 65 73 20 69 6e 20 7a 44 62  lid bytes in zDb
26150 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20 73   */.    struct s
26160 74 61 74 20 73 53 74 61 74 3b 20 20 20 20 20 20  tat sStat;      
26170 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20        /* Output 
26180 6f 66 20 73 74 61 74 28 29 20 6f 6e 20 64 61 74  of stat() on dat
26190 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20  abase file */.. 
261a0 20 20 20 2f 2a 20 7a 50 61 74 68 20 69 73 20 61     /* zPath is a
261b0 20 70 61 74 68 20 74 6f 20 61 20 57 41 4c 20 6f   path to a WAL o
261c0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  r journal file. 
261d0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c  The following bl
261e0 6f 63 6b 20 64 65 72 69 76 65 73 0a 20 20 20 20  ock derives.    
261f0 2a 2a 20 74 68 65 20 70 61 74 68 20 74 6f 20 74  ** the path to t
26200 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 64 61  he associated da
26210 74 61 62 61 73 65 20 66 69 6c 65 20 66 72 6f 6d  tabase file from
26220 20 7a 50 61 74 68 2e 20 54 68 69 73 20 62 6c 6f   zPath. This blo
26230 63 6b 20 68 61 6e 64 6c 65 73 0a 20 20 20 20 2a  ck handles.    *
26240 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * the following 
26250 6e 61 6d 69 6e 67 20 63 6f 6e 76 65 6e 74 69 6f  naming conventio
26260 6e 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ns:.    **.    *
26270 2a 20 20 20 22 3c 70 61 74 68 20 74 6f 20 64 62  *   "<path to db
26280 3e 2d 6a 6f 75 72 6e 61 6c 22 0a 20 20 20 20 2a  >-journal".    *
26290 2a 20 20 20 22 3c 70 61 74 68 20 74 6f 20 64 62  *   "<path to db
262a0 3e 2d 77 61 6c 22 0a 20 20 20 20 2a 2a 20 20 20  >-wal".    **   
262b0 22 3c 70 61 74 68 20 74 6f 20 64 62 3e 2d 6a 6f  "<path to db>-jo
262c0 75 72 6e 61 6c 2d 4e 4e 4e 4e 22 0a 20 20 20 20  urnal-NNNN".    
262d0 2a 2a 20 20 20 22 3c 70 61 74 68 20 74 6f 20 64  **   "<path to d
262e0 62 3e 2d 77 61 6c 2d 4e 4e 4e 4e 22 0a 20 20 20  b>-wal-NNNN".   
262f0 20 2a 2a 0a 20 20 20 20 2a 2a 20 77 68 65 72 65   **.    ** where
26300 20 4e 4e 4e 4e 20 69 73 20 61 20 34 20 64 69 67   NNNN is a 4 dig
26310 69 74 20 64 65 63 69 6d 61 6c 20 6e 75 6d 62 65  it decimal numbe
26320 72 2e 20 54 68 65 20 4e 4e 4e 4e 20 6e 61 6d 69  r. The NNNN nami
26330 6e 67 20 73 63 68 65 6d 65 73 20 61 72 65 20 0a  ng schemes are .
26340 20 20 20 20 2a 2a 20 75 73 65 64 20 62 79 20 74      ** used by t
26350 68 65 20 74 65 73 74 5f 6d 75 6c 74 69 70 6c 65  he test_multiple
26360 78 2e 63 20 6d 6f 64 75 6c 65 2e 0a 20 20 20 20  x.c module..    
26370 2a 2f 0a 20 20 20 20 6e 44 62 20 3d 20 73 71 6c  */.    nDb = sql
26380 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 50 61  ite3Strlen30(zPa
26390 74 68 29 20 2d 20 31 3b 20 0a 20 20 20 20 77 68  th) - 1; .    wh
263a0 69 6c 65 28 20 6e 44 62 3e 30 20 26 26 20 7a 50  ile( nDb>0 && zP
263b0 61 74 68 5b 6e 44 62 5d 21 3d 27 6c 27 20 29 20  ath[nDb]!='l' ) 
263c0 6e 44 62 2d 2d 3b 0a 20 20 20 20 6e 44 62 20 2d  nDb--;.    nDb -
263d0 3d 20 28 28 66 6c 61 67 73 20 26 20 53 51 4c 49  = ((flags & SQLI
263e0 54 45 5f 4f 50 45 4e 5f 57 41 4c 29 20 3f 20 33  TE_OPEN_WAL) ? 3
263f0 20 3a 20 37 29 3b 0a 20 20 20 20 6d 65 6d 63 70   : 7);.    memcp
26400 79 28 7a 44 62 2c 20 7a 50 61 74 68 2c 20 6e 44  y(zDb, zPath, nD
26410 62 29 3b 0a 20 20 20 20 7a 44 62 5b 6e 44 62 5d  b);.    zDb[nDb]
26420 20 3d 20 27 5c 30 27 3b 0a 0a 20 20 20 20 69 66   = '\0';..    if
26430 28 20 30 3d 3d 73 74 61 74 28 7a 44 62 2c 20 26  ( 0==stat(zDb, &
26440 73 53 74 61 74 29 20 29 7b 0a 20 20 20 20 20 20  sStat) ){.      
26450 2a 70 4d 6f 64 65 20 3d 20 73 53 74 61 74 2e 73  *pMode = sStat.s
26460 74 5f 6d 6f 64 65 20 26 20 30 37 37 37 3b 0a 20  t_mode & 0777;. 
26470 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
26480 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
26490 52 5f 46 53 54 41 54 3b 0a 20 20 20 20 7d 0a 20  R_FSTAT;.    }. 
264a0 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73   }else if( flags
264b0 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44   & SQLITE_OPEN_D
264c0 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 29 7b 0a  ELETEONCLOSE ){.
264d0 20 20 20 20 2a 70 4d 6f 64 65 20 3d 20 30 36 30      *pMode = 060
264e0 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
264f0 2a 70 4d 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f  *pMode = SQLITE_
26500 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52  DEFAULT_FILE_PER
26510 4d 49 53 53 49 4f 4e 53 3b 0a 20 20 7d 0a 20 20  MISSIONS;.  }.  
26520 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
26530 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 66 69 6c  .** Open the fil
26540 65 20 7a 50 61 74 68 2e 0a 2a 2a 20 0a 2a 2a 20  e zPath..** .** 
26550 50 72 65 76 69 6f 75 73 6c 79 2c 20 74 68 65 20  Previously, the 
26560 53 51 4c 69 74 65 20 4f 53 20 6c 61 79 65 72 20  SQLite OS layer 
26570 75 73 65 64 20 74 68 72 65 65 20 66 75 6e 63 74  used three funct
26580 69 6f 6e 73 20 69 6e 20 70 6c 61 63 65 20 6f 66  ions in place of
26590 20 74 68 69 73 0a 2a 2a 20 6f 6e 65 3a 0a 2a 2a   this.** one:.**
265a0 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33 4f  .**     sqlite3O
265b0 73 4f 70 65 6e 52 65 61 64 57 72 69 74 65 28 29  sOpenReadWrite()
265c0 3b 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33  ;.**     sqlite3
265d0 4f 73 4f 70 65 6e 52 65 61 64 4f 6e 6c 79 28 29  OsOpenReadOnly()
265e0 3b 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33  ;.**     sqlite3
265f0 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28  OsOpenExclusive(
26600 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 63  );.**.** These c
26610 61 6c 6c 73 20 63 6f 72 72 65 73 70 6f 6e 64 20  alls correspond 
26620 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  to the following
26630 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6f 66   combinations of
26640 20 66 6c 61 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   flags:.**.**   
26650 20 20 52 65 61 64 57 72 69 74 65 28 29 20 2d 3e    ReadWrite() ->
26660 20 20 20 20 20 28 52 45 41 44 57 52 49 54 45 20       (READWRITE 
26670 7c 20 43 52 45 41 54 45 29 0a 2a 2a 20 20 20 20  | CREATE).**    
26680 20 52 65 61 64 4f 6e 6c 79 28 29 20 20 2d 3e 20   ReadOnly()  -> 
26690 20 20 20 20 28 52 45 41 44 4f 4e 4c 59 29 20 0a      (READONLY) .
266a0 2a 2a 20 20 20 20 20 4f 70 65 6e 45 78 63 6c 75  **     OpenExclu
266b0 73 69 76 65 28 29 20 2d 3e 20 28 52 45 41 44 57  sive() -> (READW
266c0 52 49 54 45 20 7c 20 43 52 45 41 54 45 20 7c 20  RITE | CREATE | 
266d0 45 58 43 4c 55 53 49 56 45 29 0a 2a 2a 0a 2a 2a  EXCLUSIVE).**.**
266e0 20 54 68 65 20 6f 6c 64 20 4f 70 65 6e 45 78 63   The old OpenExc
266f0 6c 75 73 69 76 65 28 29 20 61 63 63 65 70 74 65  lusive() accepte
26700 64 20 61 20 62 6f 6f 6c 65 61 6e 20 61 72 67 75  d a boolean argu
26710 6d 65 6e 74 20 2d 20 22 64 65 6c 46 6c 61 67 22  ment - "delFlag"
26720 2e 20 49 66 0a 2a 2a 20 74 72 75 65 2c 20 74 68  . If.** true, th
26730 65 20 66 69 6c 65 20 77 61 73 20 63 6f 6e 66 69  e file was confi
26740 67 75 72 65 64 20 74 6f 20 62 65 20 61 75 74 6f  gured to be auto
26750 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65  matically delete
26760 64 20 77 68 65 6e 20 74 68 65 0a 2a 2a 20 66 69  d when the.** fi
26770 6c 65 20 68 61 6e 64 6c 65 20 63 6c 6f 73 65 64  le handle closed
26780 2e 20 54 6f 20 61 63 68 69 65 76 65 20 74 68 65  . To achieve the
26790 20 73 61 6d 65 20 65 66 66 65 63 74 20 75 73 69   same effect usi
267a0 6e 67 20 74 68 69 73 20 6e 65 77 20 0a 2a 2a 20  ng this new .** 
267b0 69 6e 74 65 72 66 61 63 65 2c 20 61 64 64 20 74  interface, add t
267c0 68 65 20 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45  he DELETEONCLOSE
267d0 20 66 6c 61 67 20 74 6f 20 74 68 6f 73 65 20 73   flag to those s
267e0 70 65 63 69 66 69 65 64 20 61 62 6f 76 65 20 66  pecified above f
267f0 6f 72 20 0a 2a 2a 20 4f 70 65 6e 45 78 63 6c 75  or .** OpenExclu
26800 73 69 76 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  sive()..*/.stati
26810 63 20 69 6e 74 20 75 6e 69 78 4f 70 65 6e 28 0a  c int unixOpen(.
26820 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
26830 56 66 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f  Vfs,           /
26840 2a 20 54 68 65 20 56 46 53 20 66 6f 72 20 77 68  * The VFS for wh
26850 69 63 68 20 74 68 69 73 20 69 73 20 74 68 65 20  ich this is the 
26860 78 4f 70 65 6e 20 6d 65 74 68 6f 64 20 2a 2f 0a  xOpen method */.
26870 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
26880 61 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ath,           /
26890 2a 20 50 61 74 68 6e 61 6d 65 20 6f 66 20 66 69  * Pathname of fi
268a0 6c 65 20 74 6f 20 62 65 20 6f 70 65 6e 65 64 20  le to be opened 
268b0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  */.  sqlite3_fil
268c0 65 20 2a 70 46 69 6c 65 2c 20 20 20 20 20 20 20  e *pFile,       
268d0 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65    /* The file de
268e0 73 63 72 69 70 74 6f 72 20 74 6f 20 62 65 20 66  scriptor to be f
268f0 69 6c 6c 65 64 20 69 6e 20 2a 2f 0a 20 20 69 6e  illed in */.  in
26900 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20  t flags,        
26910 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
26920 70 75 74 20 66 6c 61 67 73 20 74 6f 20 63 6f 6e  put flags to con
26930 74 72 6f 6c 20 74 68 65 20 6f 70 65 6e 69 6e 67  trol the opening
26940 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 4f 75 74 46   */.  int *pOutF
26950 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20  lags            
26960 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 66 6c 61     /* Output fla
26970 67 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 53  gs returned to S
26980 51 4c 69 74 65 20 63 6f 72 65 20 2a 2f 0a 29 7b  QLite core */.){
26990 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 20 3d  .  unixFile *p =
269a0 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 70 46 69   (unixFile *)pFi
269b0 6c 65 3b 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d  le;.  int fd = -
269c0 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
269d0 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73       /* File des
269e0 63 72 69 70 74 6f 72 20 72 65 74 75 72 6e 65 64  criptor returned
269f0 20 62 79 20 6f 70 65 6e 28 29 20 2a 2f 0a 20 20   by open() */.  
26a00 69 6e 74 20 64 69 72 66 64 20 3d 20 2d 31 3b 20  int dirfd = -1; 
26a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26a20 2a 20 44 69 72 65 63 74 6f 72 79 20 66 69 6c 65  * Directory file
26a30 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20   descriptor */. 
26a40 20 69 6e 74 20 6f 70 65 6e 46 6c 61 67 73 20 3d   int openFlags =
26a50 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
26a60 2f 2a 20 46 6c 61 67 73 20 74 6f 20 70 61 73 73  /* Flags to pass
26a70 20 74 6f 20 6f 70 65 6e 28 29 20 2a 2f 0a 20 20   to open() */.  
26a80 69 6e 74 20 65 54 79 70 65 20 3d 20 66 6c 61 67  int eType = flag
26a90 73 26 30 78 46 46 46 46 46 46 30 30 3b 20 20 2f  s&0xFFFFFF00;  /
26aa0 2a 20 54 79 70 65 20 6f 66 20 66 69 6c 65 20 74  * Type of file t
26ab0 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20  o open */.  int 
26ac0 6e 6f 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20  noLock;         
26ad0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
26ae0 75 65 20 74 6f 20 6f 6d 69 74 20 6c 6f 63 6b 69  ue to omit locki
26af0 6e 67 20 70 72 69 6d 69 74 69 76 65 73 20 2a 2f  ng primitives */
26b00 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
26b10 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
26b20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 52 65    /* Function Re
26b30 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 0a 20 20  turn Code */..  
26b40 69 6e 74 20 69 73 45 78 63 6c 75 73 69 76 65 20  int isExclusive 
26b50 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49   = (flags & SQLI
26b60 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56  TE_OPEN_EXCLUSIV
26b70 45 29 3b 0a 20 20 69 6e 74 20 69 73 44 65 6c 65  E);.  int isDele
26b80 74 65 20 20 20 20 20 3d 20 28 66 6c 61 67 73 20  te     = (flags 
26b90 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45  & SQLITE_OPEN_DE
26ba0 4c 45 54 45 4f 4e 43 4c 4f 53 45 29 3b 0a 20 20  LETEONCLOSE);.  
26bb0 69 6e 74 20 69 73 43 72 65 61 74 65 20 20 20 20  int isCreate    
26bc0 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49   = (flags & SQLI
26bd0 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b  TE_OPEN_CREATE);
26be0 0a 20 20 69 6e 74 20 69 73 52 65 61 64 6f 6e 6c  .  int isReadonl
26bf0 79 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53  y   = (flags & S
26c00 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
26c10 4e 4c 59 29 3b 0a 20 20 69 6e 74 20 69 73 52 65  NLY);.  int isRe
26c20 61 64 57 72 69 74 65 20 20 3d 20 28 66 6c 61 67  adWrite  = (flag
26c30 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
26c40 52 45 41 44 57 52 49 54 45 29 3b 0a 23 69 66 20  READWRITE);.#if 
26c50 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
26c60 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 69 6e  CKING_STYLE.  in
26c70 74 20 69 73 41 75 74 6f 50 72 6f 78 79 20 20 3d  t isAutoProxy  =
26c80 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
26c90 5f 4f 50 45 4e 5f 41 55 54 4f 50 52 4f 58 59 29  _OPEN_AUTOPROXY)
26ca0 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49  ;.#endif..  /* I
26cb0 66 20 63 72 65 61 74 69 6e 67 20 61 20 6d 61 73  f creating a mas
26cc0 74 65 72 20 6f 72 20 6d 61 69 6e 2d 66 69 6c 65  ter or main-file
26cd0 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 69 73 20 66   journal, this f
26ce0 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 6f 70 65  unction will ope
26cf0 6e 0a 20 20 2a 2a 20 61 20 66 69 6c 65 2d 64 65  n.  ** a file-de
26d00 73 63 72 69 70 74 6f 72 20 6f 6e 20 74 68 65 20  scriptor on the 
26d10 64 69 72 65 63 74 6f 72 79 20 74 6f 6f 2e 20 54  directory too. T
26d20 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 75 6e  he first time un
26d30 69 78 53 79 6e 63 28 29 0a 20 20 2a 2a 20 69 73  ixSync().  ** is
26d40 20 63 61 6c 6c 65 64 20 74 68 65 20 64 69 72 65   called the dire
26d50 63 74 6f 72 79 20 66 69 6c 65 20 64 65 73 63 72  ctory file descr
26d60 69 70 74 6f 72 20 77 69 6c 6c 20 62 65 20 66 73  iptor will be fs
26d70 79 6e 63 28 29 65 64 20 61 6e 64 20 63 6c 6f 73  ync()ed and clos
26d80 65 28 29 64 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74  e()d..  */.  int
26d90 20 69 73 4f 70 65 6e 44 69 72 65 63 74 6f 72 79   isOpenDirectory
26da0 20 3d 20 28 69 73 43 72 65 61 74 65 20 26 26 20   = (isCreate && 
26db0 28 0a 20 20 20 20 20 20 20 20 65 54 79 70 65 3d  (.        eType=
26dc0 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53  =SQLITE_OPEN_MAS
26dd0 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20  TER_JOURNAL .   
26de0 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49    || eType==SQLI
26df0 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
26e00 52 4e 41 4c 20 0a 20 20 20 20 20 7c 7c 20 65 54  RNAL .     || eT
26e10 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
26e20 5f 57 41 4c 0a 20 20 29 29 3b 0a 0a 20 20 2f 2a  _WAL.  ));..  /*
26e30 20 49 66 20 61 72 67 75 6d 65 6e 74 20 7a 50 61   If argument zPa
26e40 74 68 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69  th is a NULL poi
26e50 6e 74 65 72 2c 20 74 68 69 73 20 66 75 6e 63 74  nter, this funct
26e60 69 6f 6e 20 69 73 20 72 65 71 75 69 72 65 64 20  ion is required 
26e70 74 6f 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 74  to open.  ** a t
26e80 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 55  emporary file. U
26e90 73 65 20 74 68 69 73 20 62 75 66 66 65 72 20 74  se this buffer t
26ea0 6f 20 73 74 6f 72 65 20 74 68 65 20 66 69 6c 65  o store the file
26eb0 20 6e 61 6d 65 20 69 6e 2e 0a 20 20 2a 2f 0a 20   name in..  */. 
26ec0 20 63 68 61 72 20 7a 54 6d 70 6e 61 6d 65 5b 4d   char zTmpname[M
26ed0 41 58 5f 50 41 54 48 4e 41 4d 45 2b 31 5d 3b 0a  AX_PATHNAME+1];.
26ee0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
26ef0 61 6d 65 20 3d 20 7a 50 61 74 68 3b 0a 0a 20 20  ame = zPath;..  
26f00 2f 2a 20 43 68 65 63 6b 20 74 68 65 20 66 6f 6c  /* Check the fol
26f10 6c 6f 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74  lowing statement
26f20 73 20 61 72 65 20 74 72 75 65 3a 20 0a 20 20 2a  s are true: .  *
26f30 2a 0a 20 20 2a 2a 20 20 20 28 61 29 20 45 78 61  *.  **   (a) Exa
26f40 63 74 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65 20  ctly one of the 
26f50 52 45 41 44 57 52 49 54 45 20 61 6e 64 20 52 45  READWRITE and RE
26f60 41 44 4f 4e 4c 59 20 66 6c 61 67 73 20 6d 75 73  ADONLY flags mus
26f70 74 20 62 65 20 73 65 74 2c 20 61 6e 64 20 0a 20  t be set, and . 
26f80 20 2a 2a 20 20 20 28 62 29 20 69 66 20 43 52 45   **   (b) if CRE
26f90 41 54 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e  ATE is set, then
26fa0 20 52 45 41 44 57 52 49 54 45 20 6d 75 73 74 20   READWRITE must 
26fb0 61 6c 73 6f 20 62 65 20 73 65 74 2c 20 61 6e 64  also be set, and
26fc0 0a 20 20 2a 2a 20 20 20 28 63 29 20 69 66 20 45  .  **   (c) if E
26fd0 58 43 4c 55 53 49 56 45 20 69 73 20 73 65 74 2c  XCLUSIVE is set,
26fe0 20 74 68 65 6e 20 43 52 45 41 54 45 20 6d 75 73   then CREATE mus
26ff0 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20  t also be set.. 
27000 20 2a 2a 20 20 20 28 64 29 20 69 66 20 44 45 4c   **   (d) if DEL
27010 45 54 45 4f 4e 43 4c 4f 53 45 20 69 73 20 73 65  ETEONCLOSE is se
27020 74 2c 20 74 68 65 6e 20 43 52 45 41 54 45 20 6d  t, then CREATE m
27030 75 73 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2e  ust also be set.
27040 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 28  .  */.  assert((
27050 69 73 52 65 61 64 6f 6e 6c 79 3d 3d 30 20 7c 7c  isReadonly==0 ||
27060 20 69 73 52 65 61 64 57 72 69 74 65 3d 3d 30 29   isReadWrite==0)
27070 20 26 26 20 28 69 73 52 65 61 64 57 72 69 74 65   && (isReadWrite
27080 20 7c 7c 20 69 73 52 65 61 64 6f 6e 6c 79 29 29   || isReadonly))
27090 3b 0a 20 20 61 73 73 65 72 74 28 69 73 43 72 65  ;.  assert(isCre
270a0 61 74 65 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64  ate==0 || isRead
270b0 57 72 69 74 65 29 3b 0a 20 20 61 73 73 65 72 74  Write);.  assert
270c0 28 69 73 45 78 63 6c 75 73 69 76 65 3d 3d 30 20  (isExclusive==0 
270d0 7c 7c 20 69 73 43 72 65 61 74 65 29 3b 0a 20 20  || isCreate);.  
270e0 61 73 73 65 72 74 28 69 73 44 65 6c 65 74 65 3d  assert(isDelete=
270f0 3d 30 20 7c 7c 20 69 73 43 72 65 61 74 65 29 3b  =0 || isCreate);
27100 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20  ..  /* The main 
27110 44 42 2c 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  DB, main journal
27120 2c 20 57 41 4c 20 66 69 6c 65 20 61 6e 64 20 6d  , WAL file and m
27130 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 72  aster journal ar
27140 65 20 6e 65 76 65 72 20 0a 20 20 2a 2a 20 61 75  e never .  ** au
27150 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65  tomatically dele
27160 74 65 64 2e 20 4e 6f 72 20 61 72 65 20 74 68 65  ted. Nor are the
27170 79 20 65 76 65 72 20 74 65 6d 70 6f 72 61 72 79  y ever temporary
27180 20 66 69 6c 65 73 2e 20 20 2a 2f 0a 20 20 61 73   files.  */.  as
27190 73 65 72 74 28 20 28 21 69 73 44 65 6c 65 74 65  sert( (!isDelete
271a0 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54   && zName) || eT
271b0 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype!=SQLITE_OPEN
271c0 5f 4d 41 49 4e 5f 44 42 20 29 3b 0a 20 20 61 73  _MAIN_DB );.  as
271d0 73 65 72 74 28 20 28 21 69 73 44 65 6c 65 74 65  sert( (!isDelete
271e0 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54   && zName) || eT
271f0 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype!=SQLITE_OPEN
27200 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 29 3b  _MAIN_JOURNAL );
27210 0a 20 20 61 73 73 65 72 74 28 20 28 21 69 73 44  .  assert( (!isD
27220 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20  elete && zName) 
27230 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45  || eType!=SQLITE
27240 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55  _OPEN_MASTER_JOU
27250 52 4e 41 4c 20 29 3b 0a 20 20 61 73 73 65 72 74  RNAL );.  assert
27260 28 20 28 21 69 73 44 65 6c 65 74 65 20 26 26 20  ( (!isDelete && 
27270 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21  zName) || eType!
27280 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c  =SQLITE_OPEN_WAL
27290 20 29 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74   );..  /* Assert
272a0 20 74 68 61 74 20 74 68 65 20 75 70 70 65 72 20   that the upper 
272b0 6c 61 79 65 72 20 68 61 73 20 73 65 74 20 6f 6e  layer has set on
272c0 65 20 6f 66 20 74 68 65 20 22 66 69 6c 65 2d 74  e of the "file-t
272d0 79 70 65 22 20 66 6c 61 67 73 2e 20 2a 2f 0a 20  ype" flags. */. 
272e0 20 61 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d   assert( eType==
272f0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
27300 5f 44 42 20 20 20 20 20 20 7c 7c 20 65 54 79 70  _DB      || eTyp
27310 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54  e==SQLITE_OPEN_T
27320 45 4d 50 5f 44 42 20 0a 20 20 20 20 20 20 20 7c  EMP_DB .       |
27330 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
27340 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
27350 4c 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49  L || eType==SQLI
27360 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55  TE_OPEN_TEMP_JOU
27370 52 4e 41 4c 20 0a 20 20 20 20 20 20 20 7c 7c 20  RNAL .       || 
27380 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
27390 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 20 20 20  EN_SUBJOURNAL   
273a0 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
273b0 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55  _OPEN_MASTER_JOU
273c0 52 4e 41 4c 20 0a 20 20 20 20 20 20 20 7c 7c 20  RNAL .       || 
273d0 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
273e0 45 4e 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42 20  EN_TRANSIENT_DB 
273f0 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
27400 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 29 3b 0a 0a  _OPEN_WAL.  );..
27410 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73    memset(p, 0, s
27420 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65 29 29  izeof(unixFile))
27430 3b 0a 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d  ;..  if( eType==
27440 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
27450 5f 44 42 20 29 7b 0a 20 20 20 20 55 6e 69 78 55  _DB ){.    UnixU
27460 6e 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64  nusedFd *pUnused
27470 3b 0a 20 20 20 20 70 55 6e 75 73 65 64 20 3d 20  ;.    pUnused = 
27480 66 69 6e 64 52 65 75 73 61 62 6c 65 46 64 28 7a  findReusableFd(z
27490 4e 61 6d 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20  Name, flags);.  
274a0 20 20 69 66 28 20 70 55 6e 75 73 65 64 20 29 7b    if( pUnused ){
274b0 0a 20 20 20 20 20 20 66 64 20 3d 20 70 55 6e 75  .      fd = pUnu
274c0 73 65 64 2d 3e 66 64 3b 0a 20 20 20 20 7d 65 6c  sed->fd;.    }el
274d0 73 65 7b 0a 20 20 20 20 20 20 70 55 6e 75 73 65  se{.      pUnuse
274e0 64 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  d = sqlite3_mall
274f0 6f 63 28 73 69 7a 65 6f 66 28 2a 70 55 6e 75 73  oc(sizeof(*pUnus
27500 65 64 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ed));.      if( 
27510 21 70 55 6e 75 73 65 64 20 29 7b 0a 20 20 20 20  !pUnused ){.    
27520 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
27530 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d  E_NOMEM;.      }
27540 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 70 55  .    }.    p->pU
27550 6e 75 73 65 64 20 3d 20 70 55 6e 75 73 65 64 3b  nused = pUnused;
27560 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 7a 4e  .  }else if( !zN
27570 61 6d 65 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  ame ){.    /* If
27580 20 7a 4e 61 6d 65 20 69 73 20 4e 55 4c 4c 2c 20   zName is NULL, 
27590 74 68 65 20 75 70 70 65 72 20 6c 61 79 65 72 20  the upper layer 
275a0 69 73 20 72 65 71 75 65 73 74 69 6e 67 20 61 20  is requesting a 
275b0 74 65 6d 70 20 66 69 6c 65 2e 20 2a 2f 0a 20 20  temp file. */.  
275c0 20 20 61 73 73 65 72 74 28 69 73 44 65 6c 65 74    assert(isDelet
275d0 65 20 26 26 20 21 69 73 4f 70 65 6e 44 69 72 65  e && !isOpenDire
275e0 63 74 6f 72 79 29 3b 0a 20 20 20 20 72 63 20 3d  ctory);.    rc =
275f0 20 75 6e 69 78 47 65 74 54 65 6d 70 6e 61 6d 65   unixGetTempname
27600 28 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 31 2c  (MAX_PATHNAME+1,
27610 20 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 20 20   zTmpname);.    
27620 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
27630 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
27640 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
27650 7a 4e 61 6d 65 20 3d 20 7a 54 6d 70 6e 61 6d 65  zName = zTmpname
27660 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 74 65  ;.  }..  /* Dete
27670 72 6d 69 6e 65 20 74 68 65 20 76 61 6c 75 65 20  rmine the value 
27680 6f 66 20 74 68 65 20 66 6c 61 67 73 20 70 61 72  of the flags par
27690 61 6d 65 74 65 72 20 70 61 73 73 65 64 20 74 6f  ameter passed to
276a0 20 50 4f 53 49 58 20 66 75 6e 63 74 69 6f 6e 0a   POSIX function.
276b0 20 20 2a 2a 20 6f 70 65 6e 28 29 2e 20 54 68 65    ** open(). The
276c0 73 65 20 6d 75 73 74 20 62 65 20 63 61 6c 63 75  se must be calcu
276d0 6c 61 74 65 64 20 65 76 65 6e 20 69 66 20 6f 70  lated even if op
276e0 65 6e 28 29 20 69 73 20 6e 6f 74 20 63 61 6c 6c  en() is not call
276f0 65 64 2c 20 61 73 0a 20 20 2a 2a 20 74 68 65 79  ed, as.  ** they
27700 20 6d 61 79 20 62 65 20 73 74 6f 72 65 64 20 61   may be stored a
27710 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 66 69  s part of the fi
27720 6c 65 20 68 61 6e 64 6c 65 20 61 6e 64 20 75 73  le handle and us
27730 65 64 20 62 79 20 74 68 65 20 0a 20 20 2a 2a 20  ed by the .  ** 
27740 27 63 6f 6e 63 68 20 66 69 6c 65 27 20 6c 6f 63  'conch file' loc
27750 6b 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73 20 6c  king functions l
27760 61 74 65 72 20 6f 6e 2e 20 20 2a 2f 0a 20 20 69  ater on.  */.  i
27770 66 28 20 69 73 52 65 61 64 6f 6e 6c 79 20 29 20  f( isReadonly ) 
27780 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f   openFlags |= O_
27790 52 44 4f 4e 4c 59 3b 0a 20 20 69 66 28 20 69 73  RDONLY;.  if( is
277a0 52 65 61 64 57 72 69 74 65 20 29 20 6f 70 65 6e  ReadWrite ) open
277b0 46 6c 61 67 73 20 7c 3d 20 4f 5f 52 44 57 52 3b  Flags |= O_RDWR;
277c0 0a 20 20 69 66 28 20 69 73 43 72 65 61 74 65 20  .  if( isCreate 
277d0 29 20 20 20 20 6f 70 65 6e 46 6c 61 67 73 20 7c  )    openFlags |
277e0 3d 20 4f 5f 43 52 45 41 54 3b 0a 20 20 69 66 28  = O_CREAT;.  if(
277f0 20 69 73 45 78 63 6c 75 73 69 76 65 20 29 20 6f   isExclusive ) o
27800 70 65 6e 46 6c 61 67 73 20 7c 3d 20 28 4f 5f 45  penFlags |= (O_E
27810 58 43 4c 7c 4f 5f 4e 4f 46 4f 4c 4c 4f 57 29 3b  XCL|O_NOFOLLOW);
27820 0a 20 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20  .  openFlags |= 
27830 28 4f 5f 4c 41 52 47 45 46 49 4c 45 7c 4f 5f 42  (O_LARGEFILE|O_B
27840 49 4e 41 52 59 29 3b 0a 0a 20 20 69 66 28 20 66  INARY);..  if( f
27850 64 3c 30 20 29 7b 0a 20 20 20 20 6d 6f 64 65 5f  d<0 ){.    mode_
27860 74 20 6f 70 65 6e 4d 6f 64 65 3b 20 20 20 20 20  t openMode;     
27870 20 20 20 20 20 20 20 20 20 2f 2a 20 50 65 72 6d           /* Perm
27880 69 73 73 69 6f 6e 73 20 74 6f 20 63 72 65 61 74  issions to creat
27890 65 20 66 69 6c 65 20 77 69 74 68 20 2a 2f 0a 20  e file with */. 
278a0 20 20 20 72 63 20 3d 20 66 69 6e 64 43 72 65 61     rc = findCrea
278b0 74 65 46 69 6c 65 4d 6f 64 65 28 7a 4e 61 6d 65  teFileMode(zName
278c0 2c 20 66 6c 61 67 73 2c 20 26 6f 70 65 6e 4d 6f  , flags, &openMo
278d0 64 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  de);.    if( rc!
278e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
278f0 20 20 20 20 61 73 73 65 72 74 28 20 21 70 2d 3e      assert( !p->
27900 70 55 6e 75 73 65 64 20 29 3b 0a 20 20 20 20 20  pUnused );.     
27910 20 61 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d   assert( eType==
27920 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20  SQLITE_OPEN_WAL 
27930 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
27940 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
27950 41 4c 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75  AL );.      retu
27960 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
27970 20 66 64 20 3d 20 6f 70 65 6e 28 7a 4e 61 6d 65   fd = open(zName
27980 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20 6f 70 65  , openFlags, ope
27990 6e 4d 6f 64 65 29 3b 0a 20 20 20 20 4f 53 54 52  nMode);.    OSTR
279a0 41 43 45 28 28 22 4f 50 45 4e 58 20 20 20 25 2d  ACE(("OPENX   %-
279b0 33 64 20 25 73 20 30 25 6f 5c 6e 22 2c 20 66 64  3d %s 0%o\n", fd
279c0 2c 20 7a 4e 61 6d 65 2c 20 6f 70 65 6e 46 6c 61  , zName, openFla
279d0 67 73 29 29 3b 0a 20 20 20 20 69 66 28 20 66 64  gs));.    if( fd
279e0 3c 30 20 26 26 20 65 72 72 6e 6f 21 3d 45 49 53  <0 && errno!=EIS
279f0 44 49 52 20 26 26 20 69 73 52 65 61 64 57 72 69  DIR && isReadWri
27a00 74 65 20 26 26 20 21 69 73 45 78 63 6c 75 73 69  te && !isExclusi
27a10 76 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46  ve ){.      /* F
27a20 61 69 6c 65 64 20 74 6f 20 6f 70 65 6e 20 74 68  ailed to open th
27a30 65 20 66 69 6c 65 20 66 6f 72 20 72 65 61 64 2f  e file for read/
27a40 77 72 69 74 65 20 61 63 63 65 73 73 2e 20 54 72  write access. Tr
27a50 79 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 2a 2f 0a  y read-only. */.
27a60 20 20 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e        flags &= ~
27a70 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41  (SQLITE_OPEN_REA
27a80 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50  DWRITE|SQLITE_OP
27a90 45 4e 5f 43 52 45 41 54 45 29 3b 0a 20 20 20 20  EN_CREATE);.    
27aa0 20 20 6f 70 65 6e 46 6c 61 67 73 20 26 3d 20 7e    openFlags &= ~
27ab0 28 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 29  (O_RDWR|O_CREAT)
27ac0 3b 0a 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d  ;.      flags |=
27ad0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
27ae0 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 6f 70 65  DONLY;.      ope
27af0 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f 52 44 4f 4e  nFlags |= O_RDON
27b00 4c 59 3b 0a 20 20 20 20 20 20 66 64 20 3d 20 6f  LY;.      fd = o
27b10 70 65 6e 28 7a 4e 61 6d 65 2c 20 6f 70 65 6e 46  pen(zName, openF
27b20 6c 61 67 73 2c 20 6f 70 65 6e 4d 6f 64 65 29 3b  lags, openMode);
27b30 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 66  .    }.    if( f
27b40 64 3c 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  d<0 ){.      rc 
27b50 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  = SQLITE_CANTOPE
27b60 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f  N_BKPT;.      go
27b70 74 6f 20 6f 70 65 6e 5f 66 69 6e 69 73 68 65 64  to open_finished
27b80 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73  ;.    }.  }.  as
27b90 73 65 72 74 28 20 66 64 3e 3d 30 20 29 3b 0a 20  sert( fd>=0 );. 
27ba0 20 69 66 28 20 70 4f 75 74 46 6c 61 67 73 20 29   if( pOutFlags )
27bb0 7b 0a 20 20 20 20 2a 70 4f 75 74 46 6c 61 67 73  {.    *pOutFlags
27bc0 20 3d 20 66 6c 61 67 73 3b 0a 20 20 7d 0a 0a 20   = flags;.  }.. 
27bd0 20 69 66 28 20 70 2d 3e 70 55 6e 75 73 65 64 20   if( p->pUnused 
27be0 29 7b 0a 20 20 20 20 70 2d 3e 70 55 6e 75 73 65  ){.    p->pUnuse
27bf0 64 2d 3e 66 64 20 3d 20 66 64 3b 0a 20 20 20 20  d->fd = fd;.    
27c00 70 2d 3e 70 55 6e 75 73 65 64 2d 3e 66 6c 61 67  p->pUnused->flag
27c10 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 7d 0a 0a  s = flags;.  }..
27c20 20 20 69 66 28 20 69 73 44 65 6c 65 74 65 20 29    if( isDelete )
27c30 7b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  {.#if OS_VXWORKS
27c40 0a 20 20 20 20 7a 50 61 74 68 20 3d 20 7a 4e 61  .    zPath = zNa
27c50 6d 65 3b 0a 23 65 6c 73 65 0a 20 20 20 20 75 6e  me;.#else.    un
27c60 6c 69 6e 6b 28 7a 4e 61 6d 65 29 3b 0a 23 65 6e  link(zName);.#en
27c70 64 69 66 0a 20 20 7d 0a 23 69 66 20 53 51 4c 49  dif.  }.#if SQLI
27c80 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
27c90 47 5f 53 54 59 4c 45 0a 20 20 65 6c 73 65 7b 0a  G_STYLE.  else{.
27ca0 20 20 20 20 70 2d 3e 6f 70 65 6e 46 6c 61 67 73      p->openFlags
27cb0 20 3d 20 6f 70 65 6e 46 6c 61 67 73 3b 0a 20 20   = openFlags;.  
27cc0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20  }.#endif..  if( 
27cd0 69 73 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 20  isOpenDirectory 
27ce0 29 7b 0a 20 20 20 20 72 63 20 3d 20 6f 70 65 6e  ){.    rc = open
27cf0 44 69 72 65 63 74 6f 72 79 28 7a 50 61 74 68 2c  Directory(zPath,
27d00 20 26 64 69 72 66 64 29 3b 0a 20 20 20 20 69 66   &dirfd);.    if
27d10 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
27d20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 74 20 69  ){.      /* It i
27d30 73 20 73 61 66 65 20 74 6f 20 63 6c 6f 73 65 20  s safe to close 
27d40 66 64 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  fd at this point
27d50 2c 20 62 65 63 61 75 73 65 20 69 74 20 69 73 20  , because it is 
27d60 67 75 61 72 61 6e 74 65 65 64 20 6e 6f 74 0a 20  guaranteed not. 
27d70 20 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 6f 70       ** to be op
27d80 65 6e 20 6f 6e 20 61 20 64 61 74 61 62 61 73 65  en on a database
27d90 20 66 69 6c 65 2e 20 49 66 20 69 74 20 77 65 72   file. If it wer
27da0 65 20 6f 70 65 6e 20 6f 6e 20 61 20 64 61 74 61  e open on a data
27db0 62 61 73 65 20 66 69 6c 65 2c 0a 20 20 20 20 20  base file,.     
27dc0 20 2a 2a 20 69 74 20 77 6f 75 6c 64 20 6e 6f 74   ** it would not
27dd0 20 62 65 20 73 61 66 65 20 74 6f 20 63 6c 6f 73   be safe to clos
27de0 65 20 61 73 20 74 68 69 73 20 77 6f 75 6c 64 20  e as this would 
27df0 72 65 6c 65 61 73 65 20 61 6e 79 20 6c 6f 63 6b  release any lock
27e00 73 20 68 65 6c 64 0a 20 20 20 20 20 20 2a 2a 20  s held.      ** 
27e10 6f 6e 20 74 68 65 20 66 69 6c 65 20 62 79 20 74  on the file by t
27e20 68 69 73 20 70 72 6f 63 65 73 73 2e 20 20 2a 2f  his process.  */
27e30 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65  .      assert( e
27e40 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45  Type!=SQLITE_OPE
27e50 4e 5f 4d 41 49 4e 5f 44 42 20 29 3b 0a 20 20 20  N_MAIN_DB );.   
27e60 20 20 20 63 6c 6f 73 65 28 66 64 29 3b 20 20 20     close(fd);   
27e70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 69 6c            /* sil
27e80 65 6e 74 6c 79 20 6c 65 61 6b 20 69 66 20 66 61  ently leak if fa
27e90 69 6c 2c 20 61 6c 72 65 61 64 79 20 69 6e 20 65  il, already in e
27ea0 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20 67 6f  rror */.      go
27eb0 74 6f 20 6f 70 65 6e 5f 66 69 6e 69 73 68 65 64  to open_finished
27ec0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66  ;.    }.  }..#if
27ed0 64 65 66 20 46 44 5f 43 4c 4f 45 58 45 43 0a 20  def FD_CLOEXEC. 
27ee0 20 66 63 6e 74 6c 28 66 64 2c 20 46 5f 53 45 54   fcntl(fd, F_SET
27ef0 46 44 2c 20 66 63 6e 74 6c 28 66 64 2c 20 46 5f  FD, fcntl(fd, F_
27f00 47 45 54 46 44 2c 20 30 29 20 7c 20 46 44 5f 43  GETFD, 0) | FD_C
27f10 4c 4f 45 58 45 43 29 3b 0a 23 65 6e 64 69 66 0a  LOEXEC);.#endif.
27f20 0a 20 20 6e 6f 4c 6f 63 6b 20 3d 20 65 54 79 70  .  noLock = eTyp
27f30 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e!=SQLITE_OPEN_M
27f40 41 49 4e 5f 44 42 3b 0a 0a 20 20 0a 23 69 66 20  AIN_DB;..  .#if 
27f50 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
27f60 5f 29 20 7c 7c 20 53 51 4c 49 54 45 5f 45 4e 41  _) || SQLITE_ENA
27f70 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
27f80 45 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 66  E.  struct statf
27f90 73 20 66 73 49 6e 66 6f 3b 0a 20 20 69 66 28 20  s fsInfo;.  if( 
27fa0 66 73 74 61 74 66 73 28 66 64 2c 20 26 66 73 49  fstatfs(fd, &fsI
27fb0 6e 66 6f 29 20 3d 3d 20 2d 31 20 29 7b 0a 20 20  nfo) == -1 ){.  
27fc0 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 70 46    ((unixFile*)pF
27fd0 69 6c 65 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  ile)->lastErrno 
27fe0 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 69 66 28  = errno;.    if(
27ff0 20 64 69 72 66 64 3e 3d 30 20 29 20 63 6c 6f 73   dirfd>=0 ) clos
28000 65 28 64 69 72 66 64 29 3b 20 2f 2a 20 73 69 6c  e(dirfd); /* sil
28010 65 6e 74 6c 79 20 6c 65 61 6b 20 69 66 20 66 61  ently leak if fa
28020 69 6c 2c 20 69 6e 20 65 72 72 6f 72 20 2a 2f 0a  il, in error */.
28030 20 20 20 20 63 6c 6f 73 65 28 66 64 29 3b 20 2f      close(fd); /
28040 2a 20 73 69 6c 65 6e 74 6c 79 20 6c 65 61 6b 20  * silently leak 
28050 69 66 20 66 61 69 6c 2c 20 69 6e 20 65 72 72 6f  if fail, in erro
28060 72 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  r */.    return 
28070 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43  SQLITE_IOERR_ACC
28080 45 53 53 3b 0a 20 20 7d 0a 20 20 69 66 20 28 30  ESS;.  }.  if (0
28090 20 3d 3d 20 73 74 72 6e 63 6d 70 28 22 6d 73 64   == strncmp("msd
280a0 6f 73 22 2c 20 66 73 49 6e 66 6f 2e 66 5f 66 73  os", fsInfo.f_fs
280b0 74 79 70 65 6e 61 6d 65 2c 20 35 29 29 20 7b 0a  typename, 5)) {.
280c0 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29      ((unixFile*)
280d0 70 46 69 6c 65 29 2d 3e 66 73 46 6c 61 67 73 20  pFile)->fsFlags 
280e0 7c 3d 20 53 51 4c 49 54 45 5f 46 53 46 4c 41 47  |= SQLITE_FSFLAG
280f0 53 5f 49 53 5f 4d 53 44 4f 53 3b 0a 20 20 7d 0a  S_IS_MSDOS;.  }.
28100 20 20 69 66 20 28 30 20 3d 3d 20 73 74 72 6e 63    if (0 == strnc
28110 6d 70 28 22 65 78 66 61 74 22 2c 20 66 73 49 6e  mp("exfat", fsIn
28120 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c  fo.f_fstypename,
28130 20 35 29 29 20 7b 0a 20 20 20 20 28 28 75 6e 69   5)) {.    ((uni
28140 78 46 69 6c 65 2a 29 70 46 69 6c 65 29 2d 3e 66  xFile*)pFile)->f
28150 73 46 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45  sFlags |= SQLITE
28160 5f 46 53 46 4c 41 47 53 5f 49 53 5f 4d 53 44 4f  _FSFLAGS_IS_MSDO
28170 53 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  S;.  }.#endif.  
28180 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
28190 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
281a0 0a 23 69 66 20 53 51 4c 49 54 45 5f 50 52 45 46  .#if SQLITE_PREF
281b0 45 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47  ER_PROXY_LOCKING
281c0 0a 20 20 69 73 41 75 74 6f 50 72 6f 78 79 20 3d  .  isAutoProxy =
281d0 20 31 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28   1;.#endif.  if(
281e0 20 69 73 41 75 74 6f 50 72 6f 78 79 20 26 26 20   isAutoProxy && 
281f0 28 7a 50 61 74 68 21 3d 4e 55 4c 4c 29 20 26 26  (zPath!=NULL) &&
28200 20 28 21 6e 6f 4c 6f 63 6b 29 20 26 26 20 70 56   (!noLock) && pV
28210 66 73 2d 3e 78 4f 70 65 6e 20 29 7b 0a 20 20 20  fs->xOpen ){.   
28220 20 63 68 61 72 20 2a 65 6e 76 66 6f 72 63 65 20   char *envforce 
28230 3d 20 67 65 74 65 6e 76 28 22 53 51 4c 49 54 45  = getenv("SQLITE
28240 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f 4c 4f 43  _FORCE_PROXY_LOC
28250 4b 49 4e 47 22 29 3b 0a 20 20 20 20 69 6e 74 20  KING");.    int 
28260 75 73 65 50 72 6f 78 79 20 3d 20 30 3b 0a 0a 20  useProxy = 0;.. 
28270 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 46 4f 52     /* SQLITE_FOR
28280 43 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47  CE_PROXY_LOCKING
28290 3d 3d 31 20 6d 65 61 6e 73 20 66 6f 72 63 65 20  ==1 means force 
282a0 61 6c 77 61 79 73 20 75 73 65 20 70 72 6f 78 79  always use proxy
282b0 2c 20 30 20 6d 65 61 6e 73 20 0a 20 20 20 20 2a  , 0 means .    *
282c0 2a 20 6e 65 76 65 72 20 75 73 65 20 70 72 6f 78  * never use prox
282d0 79 2c 20 4e 55 4c 4c 20 6d 65 61 6e 73 20 75 73  y, NULL means us
282e0 65 20 70 72 6f 78 79 20 66 6f 72 20 6e 6f 6e 2d  e proxy for non-
282f0 6c 6f 63 61 6c 20 66 69 6c 65 73 20 6f 6e 6c 79  local files only
28300 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 6e  .  */.    if( en
28310 76 66 6f 72 63 65 21 3d 4e 55 4c 4c 20 29 7b 0a  vforce!=NULL ){.
28320 20 20 20 20 20 20 75 73 65 50 72 6f 78 79 20 3d        useProxy =
28330 20 61 74 6f 69 28 65 6e 76 66 6f 72 63 65 29 3e   atoi(envforce)>
28340 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
28350 20 20 20 20 75 73 65 50 72 6f 78 79 20 3d 20 21      useProxy = !
28360 28 66 73 49 6e 66 6f 2e 66 5f 66 6c 61 67 73 26  (fsInfo.f_flags&
28370 4d 4e 54 5f 4c 4f 43 41 4c 29 3b 0a 20 20 20 20  MNT_LOCAL);.    
28380 7d 0a 20 20 20 20 69 66 28 20 75 73 65 50 72 6f  }.    if( usePro
28390 78 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  xy ){.      rc =
283a0 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 28   fillInUnixFile(
283b0 70 56 66 73 2c 20 66 64 2c 20 64 69 72 66 64 2c  pVfs, fd, dirfd,
283c0 20 70 46 69 6c 65 2c 20 7a 50 61 74 68 2c 20 6e   pFile, zPath, n
283d0 6f 4c 6f 63 6b 2c 20 69 73 44 65 6c 65 74 65 29  oLock, isDelete)
283e0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
283f0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
28400 20 20 20 20 20 2f 2a 20 63 61 63 68 65 20 74 68       /* cache th
28410 65 20 70 4d 65 74 68 6f 64 20 69 6e 20 63 61 73  e pMethod in cas
28420 65 20 74 68 65 20 74 72 61 6e 73 66 6f 72 6d 20  e the transform 
28430 66 61 69 6c 73 20 2a 2f 0a 20 20 20 20 20 20 20  fails */.       
28440 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 73 71   const struct sq
28450 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
28460 20 2a 70 4d 65 74 68 6f 64 20 3d 20 70 46 69 6c   *pMethod = pFil
28470 65 2d 3e 70 4d 65 74 68 6f 64 73 3b 0a 20 20 20  e->pMethods;.   
28480 20 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79 54       rc = proxyT
28490 72 61 6e 73 66 6f 72 6d 55 6e 69 78 46 69 6c 65  ransformUnixFile
284a0 28 28 75 6e 69 78 46 69 6c 65 2a 29 70 46 69 6c  ((unixFile*)pFil
284b0 65 2c 20 22 3a 61 75 74 6f 3a 22 29 3b 0a 20 20  e, ":auto:");.  
284c0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
284d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
284e0 20 20 20 20 20 2f 2a 20 55 73 65 20 75 6e 69 78       /* Use unix
284f0 43 6c 6f 73 65 20 74 6f 20 63 6c 65 61 6e 20 75  Close to clean u
28500 70 20 74 68 65 20 72 65 73 6f 75 72 63 65 73 20  p the resources 
28510 61 64 64 65 64 20 69 6e 20 66 69 6c 6c 49 6e 55  added in fillInU
28520 6e 69 78 46 69 6c 65 20 0a 20 20 20 20 20 20 20  nixFile .       
28530 20 20 20 2a 2a 20 61 6e 64 20 63 6c 65 61 72 20     ** and clear 
28540 61 6c 6c 20 74 68 65 20 73 74 72 75 63 74 75 72  all the structur
28550 65 27 73 20 72 65 66 65 72 65 6e 63 65 73 2e 20  e's references. 
28560 20 53 70 65 63 69 66 69 63 61 6c 6c 79 2c 20 0a   Specifically, .
28570 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 46 69            ** pFi
28580 6c 65 2d 3e 70 4d 65 74 68 6f 64 73 20 77 69 6c  le->pMethods wil
28590 6c 20 62 65 20 4e 55 4c 4c 20 73 6f 20 73 71 6c  l be NULL so sql
285a0 69 74 65 33 4f 73 43 6c 6f 73 65 20 77 69 6c 6c  ite3OsClose will
285b0 20 62 65 20 61 20 6e 6f 2d 6f 70 20 0a 20 20 20   be a no-op .   
285c0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
285d0 20 20 20 20 69 66 28 20 70 4d 65 74 68 6f 64 21      if( pMethod!
285e0 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20  =NULL ){.       
285f0 20 20 20 20 20 70 4d 65 74 68 6f 64 2d 3e 78 43       pMethod->xC
28600 6c 6f 73 65 28 70 46 69 6c 65 29 3b 0a 20 20 20  lose(pFile);.   
28610 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
28620 20 20 20 20 20 20 20 20 20 20 75 6e 69 78 43 6c            unixCl
28630 6f 73 65 28 70 46 69 6c 65 29 3b 0a 20 20 20 20  ose(pFile);.    
28640 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
28650 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
28660 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
28670 20 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 5f 66       goto open_f
28680 69 6e 69 73 68 65 64 3b 0a 20 20 20 20 7d 0a 20  inished;.    }. 
28690 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 72   }.#endif.  .  r
286a0 63 20 3d 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69  c = fillInUnixFi
286b0 6c 65 28 70 56 66 73 2c 20 66 64 2c 20 64 69 72  le(pVfs, fd, dir
286c0 66 64 2c 20 70 46 69 6c 65 2c 20 7a 50 61 74 68  fd, pFile, zPath
286d0 2c 20 6e 6f 4c 6f 63 6b 2c 20 69 73 44 65 6c 65  , noLock, isDele
286e0 74 65 29 3b 0a 6f 70 65 6e 5f 66 69 6e 69 73 68  te);.open_finish
286f0 65 64 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51  ed:.  if( rc!=SQ
28700 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
28710 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 70  qlite3_free(p->p
28720 55 6e 75 73 65 64 29 3b 0a 20 20 7d 0a 20 20 72  Unused);.  }.  r
28730 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
28740 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20 66  .** Delete the f
28750 69 6c 65 20 61 74 20 7a 50 61 74 68 2e 20 49 66  ile at zPath. If
28760 20 74 68 65 20 64 69 72 53 79 6e 63 20 61 72 67   the dirSync arg
28770 75 6d 65 6e 74 20 69 73 20 74 72 75 65 2c 20 66  ument is true, f
28780 73 79 6e 63 28 29 0a 2a 2a 20 74 68 65 20 64 69  sync().** the di
28790 72 65 63 74 6f 72 79 20 61 66 74 65 72 20 64 65  rectory after de
287a0 6c 65 74 69 6e 67 20 74 68 65 20 66 69 6c 65 2e  leting the file.
287b0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
287c0 6e 69 78 44 65 6c 65 74 65 28 0a 20 20 73 71 6c  nixDelete(.  sql
287d0 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65  ite3_vfs *NotUse
287e0 64 2c 20 20 20 20 20 2f 2a 20 56 46 53 20 63 6f  d,     /* VFS co
287f0 6e 74 61 69 6e 69 6e 67 20 74 68 69 73 20 61 73  ntaining this as
28800 20 74 68 65 20 78 44 65 6c 65 74 65 20 6d 65 74   the xDelete met
28810 68 6f 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  hod */.  const c
28820 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20  har *zPath,     
28830 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69     /* Name of fi
28840 6c 65 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64  le to be deleted
28850 20 2a 2f 0a 20 20 69 6e 74 20 64 69 72 53 79 6e   */.  int dirSyn
28860 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c               
28870 2f 2a 20 49 66 20 74 72 75 65 2c 20 66 73 79 6e  /* If true, fsyn
28880 63 28 29 20 64 69 72 65 63 74 6f 72 79 20 61 66  c() directory af
28890 74 65 72 20 64 65 6c 65 74 69 6e 67 20 66 69 6c  ter deleting fil
288a0 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  e */.){.  int rc
288b0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
288c0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
288d0 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 53 69 6d  (NotUsed);.  Sim
288e0 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65 74  ulateIOError(ret
288f0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
28900 5f 44 45 4c 45 54 45 29 3b 0a 20 20 69 66 28 20  _DELETE);.  if( 
28910 75 6e 6c 69 6e 6b 28 7a 50 61 74 68 29 3d 3d 28  unlink(zPath)==(
28920 2d 31 29 20 26 26 20 65 72 72 6e 6f 21 3d 45 4e  -1) && errno!=EN
28930 4f 45 4e 54 20 29 7b 0a 20 20 20 20 72 65 74 75  OENT ){.    retu
28940 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
28950 44 45 4c 45 54 45 3b 0a 20 20 7d 0a 23 69 66 6e  DELETE;.  }.#ifn
28960 64 65 66 20 53 51 4c 49 54 45 5f 44 49 53 41 42  def SQLITE_DISAB
28970 4c 45 5f 44 49 52 53 59 4e 43 0a 20 20 69 66 28  LE_DIRSYNC.  if(
28980 20 64 69 72 53 79 6e 63 20 29 7b 0a 20 20 20 20   dirSync ){.    
28990 69 6e 74 20 66 64 3b 0a 20 20 20 20 72 63 20 3d  int fd;.    rc =
289a0 20 6f 70 65 6e 44 69 72 65 63 74 6f 72 79 28 7a   openDirectory(z
289b0 50 61 74 68 2c 20 26 66 64 29 3b 0a 20 20 20 20  Path, &fd);.    
289c0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
289d0 4b 20 29 7b 0a 23 69 66 20 4f 53 5f 56 58 57 4f  K ){.#if OS_VXWO
289e0 52 4b 53 0a 20 20 20 20 20 20 69 66 28 20 66 73  RKS.      if( fs
289f0 79 6e 63 28 66 64 29 3d 3d 2d 31 20 29 0a 23 65  ync(fd)==-1 ).#e
28a00 6c 73 65 0a 20 20 20 20 20 20 69 66 28 20 66 73  lse.      if( fs
28a10 79 6e 63 28 66 64 29 20 29 0a 23 65 6e 64 69 66  ync(fd) ).#endif
28a20 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20  .      {.       
28a30 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
28a40 52 52 5f 44 49 52 5f 46 53 59 4e 43 3b 0a 20 20  RR_DIR_FSYNC;.  
28a50 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
28a60 63 6c 6f 73 65 28 66 64 29 26 26 21 72 63 20 29  close(fd)&&!rc )
28a70 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
28a80 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f  QLITE_IOERR_DIR_
28a90 43 4c 4f 53 45 3b 0a 20 20 20 20 20 20 7d 0a 20  CLOSE;.      }. 
28aa0 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
28ab0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
28ac0 2f 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 65  /*.** Test the e
28ad0 78 69 73 74 61 6e 63 65 20 6f 66 20 6f 72 20 61  xistance of or a
28ae0 63 63 65 73 73 20 70 65 72 6d 69 73 73 69 6f 6e  ccess permission
28af0 73 20 6f 66 20 66 69 6c 65 20 7a 50 61 74 68 2e  s of file zPath.
28b00 20 54 68 65 0a 2a 2a 20 74 65 73 74 20 70 65 72   The.** test per
28b10 66 6f 72 6d 65 64 20 64 65 70 65 6e 64 73 20 6f  formed depends o
28b20 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 66  n the value of f
28b30 6c 61 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  lags:.**.**     
28b40 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
28b50 49 53 54 53 3a 20 52 65 74 75 72 6e 20 31 20 69  ISTS: Return 1 i
28b60 66 20 74 68 65 20 66 69 6c 65 20 65 78 69 73 74  f the file exist
28b70 73 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f  s.**     SQLITE_
28b80 41 43 43 45 53 53 5f 52 45 41 44 57 52 49 54 45  ACCESS_READWRITE
28b90 3a 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68  : Return 1 if th
28ba0 65 20 66 69 6c 65 20 69 73 20 72 65 61 64 20 61  e file is read a
28bb0 6e 64 20 77 72 69 74 61 62 6c 65 2e 0a 2a 2a 20  nd writable..** 
28bc0 20 20 20 20 53 51 4c 49 54 45 5f 41 43 43 45 53      SQLITE_ACCES
28bd0 53 5f 52 45 41 44 4f 4e 4c 59 3a 20 52 65 74 75  S_READONLY: Retu
28be0 72 6e 20 31 20 69 66 20 74 68 65 20 66 69 6c 65  rn 1 if the file
28bf0 20 69 73 20 72 65 61 64 61 62 6c 65 2e 0a 2a 2a   is readable..**
28c00 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 20 72 65  .** Otherwise re
28c10 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74 69  turn 0..*/.stati
28c20 63 20 69 6e 74 20 75 6e 69 78 41 63 63 65 73 73  c int unixAccess
28c30 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
28c40 2a 4e 6f 74 55 73 65 64 2c 20 20 20 2f 2a 20 54  *NotUsed,   /* T
28c50 68 65 20 56 46 53 20 63 6f 6e 74 61 69 6e 69 6e  he VFS containin
28c60 67 20 74 68 69 73 20 78 41 63 63 65 73 73 20 6d  g this xAccess m
28c70 65 74 68 6f 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  ethod */.  const
28c80 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20   char *zPath,   
28c90 20 20 20 2f 2a 20 50 61 74 68 20 6f 66 20 74 68     /* Path of th
28ca0 65 20 66 69 6c 65 20 74 6f 20 65 78 61 6d 69 6e  e file to examin
28cb0 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  e */.  int flags
28cc0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
28cd0 2a 20 57 68 61 74 20 64 6f 20 77 65 20 77 61 6e  * What do we wan
28ce0 74 20 74 6f 20 6c 65 61 72 6e 20 61 62 6f 75 74  t to learn about
28cf0 20 74 68 65 20 7a 50 61 74 68 20 66 69 6c 65 3f   the zPath file?
28d00 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 4f   */.  int *pResO
28d10 75 74 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ut            /*
28d20 20 57 72 69 74 65 20 72 65 73 75 6c 74 20 62 6f   Write result bo
28d30 6f 6c 65 61 6e 20 68 65 72 65 20 2a 2f 0a 29 7b  olean here */.){
28d40 0a 20 20 69 6e 74 20 61 6d 6f 64 65 20 3d 20 30  .  int amode = 0
28d50 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
28d60 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
28d70 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
28d80 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ( return SQLITE_
28d90 49 4f 45 52 52 5f 41 43 43 45 53 53 3b 20 29 3b  IOERR_ACCESS; );
28da0 0a 20 20 73 77 69 74 63 68 28 20 66 6c 61 67 73  .  switch( flags
28db0 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c   ){.    case SQL
28dc0 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54  ITE_ACCESS_EXIST
28dd0 53 3a 0a 20 20 20 20 20 20 61 6d 6f 64 65 20 3d  S:.      amode =
28de0 20 46 5f 4f 4b 3b 0a 20 20 20 20 20 20 62 72 65   F_OK;.      bre
28df0 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
28e00 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44 57  ITE_ACCESS_READW
28e10 52 49 54 45 3a 0a 20 20 20 20 20 20 61 6d 6f 64  RITE:.      amod
28e20 65 20 3d 20 57 5f 4f 4b 7c 52 5f 4f 4b 3b 0a 20  e = W_OK|R_OK;. 
28e30 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
28e40 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45  case SQLITE_ACCE
28e50 53 53 5f 52 45 41 44 3a 0a 20 20 20 20 20 20 61  SS_READ:.      a
28e60 6d 6f 64 65 20 3d 20 52 5f 4f 4b 3b 0a 20 20 20  mode = R_OK;.   
28e70 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 64     break;..    d
28e80 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 61 73  efault:.      as
28e90 73 65 72 74 28 21 22 49 6e 76 61 6c 69 64 20 66  sert(!"Invalid f
28ea0 6c 61 67 73 20 61 72 67 75 6d 65 6e 74 22 29 3b  lags argument");
28eb0 0a 20 20 7d 0a 20 20 2a 70 52 65 73 4f 75 74 20  .  }.  *pResOut 
28ec0 3d 20 28 61 63 63 65 73 73 28 7a 50 61 74 68 2c  = (access(zPath,
28ed0 20 61 6d 6f 64 65 29 3d 3d 30 29 3b 0a 20 20 69   amode)==0);.  i
28ee0 66 28 20 66 6c 61 67 73 3d 3d 53 51 4c 49 54 45  f( flags==SQLITE
28ef0 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 20 26  _ACCESS_EXISTS &
28f00 26 20 2a 70 52 65 73 4f 75 74 20 29 7b 0a 20 20  & *pResOut ){.  
28f10 20 20 73 74 72 75 63 74 20 73 74 61 74 20 62 75    struct stat bu
28f20 66 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 73 74  f;.    if( 0==st
28f30 61 74 28 7a 50 61 74 68 2c 20 26 62 75 66 29 20  at(zPath, &buf) 
28f40 26 26 20 62 75 66 2e 73 74 5f 73 69 7a 65 3d 3d  && buf.st_size==
28f50 30 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73  0 ){.      *pRes
28f60 4f 75 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  Out = 0;.    }. 
28f70 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
28f80 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  TE_OK;.}.../*.**
28f90 20 54 75 72 6e 20 61 20 72 65 6c 61 74 69 76 65   Turn a relative
28fa0 20 70 61 74 68 6e 61 6d 65 20 69 6e 74 6f 20 61   pathname into a
28fb0 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 2e 20   full pathname. 
28fc0 54 68 65 20 72 65 6c 61 74 69 76 65 20 70 61 74  The relative pat
28fd0 68 0a 2a 2a 20 69 73 20 73 74 6f 72 65 64 20 61  h.** is stored a
28fe0 73 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74  s a nul-terminat
28ff0 65 64 20 73 74 72 69 6e 67 20 69 6e 20 74 68 65  ed string in the
29000 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20   buffer pointed 
29010 74 6f 20 62 79 0a 2a 2a 20 7a 50 61 74 68 2e 20  to by.** zPath. 
29020 0a 2a 2a 0a 2a 2a 20 7a 4f 75 74 20 70 6f 69 6e  .**.** zOut poin
29030 74 73 20 74 6f 20 61 20 62 75 66 66 65 72 20 6f  ts to a buffer o
29040 66 20 61 74 20 6c 65 61 73 74 20 73 71 6c 69 74  f at least sqlit
29050 65 33 5f 76 66 73 2e 6d 78 50 61 74 68 6e 61 6d  e3_vfs.mxPathnam
29060 65 20 62 79 74 65 73 20 0a 2a 2a 20 28 69 6e 20  e bytes .** (in 
29070 74 68 69 73 20 63 61 73 65 2c 20 4d 41 58 5f 50  this case, MAX_P
29080 41 54 48 4e 41 4d 45 20 62 79 74 65 73 29 2e 20  ATHNAME bytes). 
29090 54 68 65 20 66 75 6c 6c 2d 70 61 74 68 20 69 73  The full-path is
290a0 20 77 72 69 74 74 65 6e 20 74 6f 0a 2a 2a 20 74   written to.** t
290b0 68 69 73 20 62 75 66 66 65 72 20 62 65 66 6f 72  his buffer befor
290c0 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a  e returning..*/.
290d0 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 46  static int unixF
290e0 75 6c 6c 50 61 74 68 6e 61 6d 65 28 0a 20 20 73  ullPathname(.  s
290f0 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
29100 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
29110 50 6f 69 6e 74 65 72 20 74 6f 20 76 66 73 20 6f  Pointer to vfs o
29120 62 6a 65 63 74 20 2a 2f 0a 20 20 63 6f 6e 73 74  bject */.  const
29130 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20   char *zPath,   
29140 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 73           /* Poss
29150 69 62 6c 79 20 72 65 6c 61 74 69 76 65 20 69 6e  ibly relative in
29160 70 75 74 20 70 61 74 68 20 2a 2f 0a 20 20 69 6e  put path */.  in
29170 74 20 6e 4f 75 74 2c 20 20 20 20 20 20 20 20 20  t nOut,         
29180 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
29190 69 7a 65 20 6f 66 20 6f 75 74 70 75 74 20 62 75  ize of output bu
291a0 66 66 65 72 20 69 6e 20 62 79 74 65 73 20 2a 2f  ffer in bytes */
291b0 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74 20 20 20  .  char *zOut   
291c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
291d0 20 2f 2a 20 4f 75 74 70 75 74 20 62 75 66 66 65   /* Output buffe
291e0 72 20 2a 2f 0a 29 7b 0a 0a 20 20 2f 2a 20 49 74  r */.){..  /* It
291f0 27 73 20 6f 64 64 20 74 6f 20 73 69 6d 75 6c 61  's odd to simula
29200 74 65 20 61 6e 20 69 6f 2d 65 72 72 6f 72 20 68  te an io-error h
29210 65 72 65 2c 20 62 75 74 20 72 65 61 6c 6c 79 20  ere, but really 
29220 74 68 69 73 20 69 73 20 6a 75 73 74 0a 20 20 2a  this is just.  *
29230 2a 20 75 73 69 6e 67 20 74 68 65 20 69 6f 2d 65  * using the io-e
29240 72 72 6f 72 20 69 6e 66 72 61 73 74 72 75 63 74  rror infrastruct
29250 75 72 65 20 74 6f 20 74 65 73 74 20 74 68 61 74  ure to test that
29260 20 53 51 4c 69 74 65 20 68 61 6e 64 6c 65 73 20   SQLite handles 
29270 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69  this.  ** functi
29280 6f 6e 20 66 61 69 6c 69 6e 67 2e 20 54 68 69 73  on failing. This
29290 20 66 75 6e 63 74 69 6f 6e 20 63 6f 75 6c 64 20   function could 
292a0 66 61 69 6c 20 69 66 2c 20 66 6f 72 20 65 78 61  fail if, for exa
292b0 6d 70 6c 65 2c 20 74 68 65 0a 20 20 2a 2a 20 63  mple, the.  ** c
292c0 75 72 72 65 6e 74 20 77 6f 72 6b 69 6e 67 20 64  urrent working d
292d0 69 72 65 63 74 6f 72 79 20 68 61 73 20 62 65 65  irectory has bee
292e0 6e 20 75 6e 6c 69 6e 6b 65 64 2e 0a 20 20 2a 2f  n unlinked..  */
292f0 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
29300 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54  or( return SQLIT
29310 45 5f 45 52 52 4f 52 20 29 3b 0a 0a 20 20 61 73  E_ERROR );..  as
29320 73 65 72 74 28 20 70 56 66 73 2d 3e 6d 78 50 61  sert( pVfs->mxPa
29330 74 68 6e 61 6d 65 3d 3d 4d 41 58 5f 50 41 54 48  thname==MAX_PATH
29340 4e 41 4d 45 20 29 3b 0a 20 20 55 4e 55 53 45 44  NAME );.  UNUSED
29350 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29  _PARAMETER(pVfs)
29360 3b 0a 0a 20 20 7a 4f 75 74 5b 6e 4f 75 74 2d 31  ;..  zOut[nOut-1
29370 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 69 66 28 20  ] = '\0';.  if( 
29380 7a 50 61 74 68 5b 30 5d 3d 3d 27 2f 27 20 29 7b  zPath[0]=='/' ){
29390 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
293a0 72 69 6e 74 66 28 6e 4f 75 74 2c 20 7a 4f 75 74  rintf(nOut, zOut
293b0 2c 20 22 25 73 22 2c 20 7a 50 61 74 68 29 3b 0a  , "%s", zPath);.
293c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
293d0 20 6e 43 77 64 3b 0a 20 20 20 20 69 66 28 20 67   nCwd;.    if( g
293e0 65 74 63 77 64 28 7a 4f 75 74 2c 20 6e 4f 75 74  etcwd(zOut, nOut
293f0 2d 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  -1)==0 ){.      
29400 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41  return SQLITE_CA
29410 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20  NTOPEN_BKPT;.   
29420 20 7d 0a 20 20 20 20 6e 43 77 64 20 3d 20 28 69   }.    nCwd = (i
29430 6e 74 29 73 74 72 6c 65 6e 28 7a 4f 75 74 29 3b  nt)strlen(zOut);
29440 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
29450 72 69 6e 74 66 28 6e 4f 75 74 2d 6e 43 77 64 2c  rintf(nOut-nCwd,
29460 20 26 7a 4f 75 74 5b 6e 43 77 64 5d 2c 20 22 2f   &zOut[nCwd], "/
29470 25 73 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20 7d  %s", zPath);.  }
29480 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
29490 5f 4f 4b 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66  _OK;.}...#ifndef
294a0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41   SQLITE_OMIT_LOA
294b0 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 2f 2a 0a 2a  D_EXTENSION./*.*
294c0 2a 20 49 6e 74 65 72 66 61 63 65 73 20 66 6f 72  * Interfaces for
294d0 20 6f 70 65 6e 69 6e 67 20 61 20 73 68 61 72 65   opening a share
294e0 64 20 6c 69 62 72 61 72 79 2c 20 66 69 6e 64 69  d library, findi
294f0 6e 67 20 65 6e 74 72 79 20 70 6f 69 6e 74 73 0a  ng entry points.
29500 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20 73 68  ** within the sh
29510 61 72 65 64 20 6c 69 62 72 61 72 79 2c 20 61 6e  ared library, an
29520 64 20 63 6c 6f 73 69 6e 67 20 74 68 65 20 73 68  d closing the sh
29530 61 72 65 64 20 6c 69 62 72 61 72 79 2e 0a 2a 2f  ared library..*/
29540 0a 23 69 6e 63 6c 75 64 65 20 3c 64 6c 66 63 6e  .#include <dlfcn
29550 2e 68 3e 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .h>.static void 
29560 2a 75 6e 69 78 44 6c 4f 70 65 6e 28 73 71 6c 69  *unixDlOpen(sqli
29570 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64  te3_vfs *NotUsed
29580 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  , const char *zF
29590 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 55 4e 55 53  ilename){.  UNUS
295a0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
295b0 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20  Used);.  return 
295c0 64 6c 6f 70 65 6e 28 7a 46 69 6c 65 6e 61 6d 65  dlopen(zFilename
295d0 2c 20 52 54 4c 44 5f 4e 4f 57 20 7c 20 52 54 4c  , RTLD_NOW | RTL
295e0 44 5f 47 4c 4f 42 41 4c 29 3b 0a 7d 0a 0a 2f 2a  D_GLOBAL);.}../*
295f0 0a 2a 2a 20 53 51 4c 69 74 65 20 63 61 6c 6c 73  .** SQLite calls
29600 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
29610 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72  mmediately after
29620 20 61 20 63 61 6c 6c 20 74 6f 20 75 6e 69 78 44   a call to unixD
29630 6c 53 79 6d 28 29 20 6f 72 0a 2a 2a 20 75 6e 69  lSym() or.** uni
29640 78 44 6c 4f 70 65 6e 28 29 20 66 61 69 6c 73 20  xDlOpen() fails 
29650 28 72 65 74 75 72 6e 73 20 61 20 6e 75 6c 6c 20  (returns a null 
29660 70 6f 69 6e 74 65 72 29 2e 20 49 66 20 61 20 6d  pointer). If a m
29670 6f 72 65 20 64 65 74 61 69 6c 65 64 20 65 72 72  ore detailed err
29680 6f 72 0a 2a 2a 20 6d 65 73 73 61 67 65 20 69 73  or.** message is
29690 20 61 76 61 69 6c 61 62 6c 65 2c 20 69 74 20 69   available, it i
296a0 73 20 77 72 69 74 74 65 6e 20 74 6f 20 7a 42 75  s written to zBu
296b0 66 4f 75 74 2e 20 49 66 20 6e 6f 20 65 72 72 6f  fOut. If no erro
296c0 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20 69 73 20  r message.** is 
296d0 61 76 61 69 6c 61 62 6c 65 2c 20 7a 42 75 66 4f  available, zBufO
296e0 75 74 20 69 73 20 6c 65 66 74 20 75 6e 6d 6f 64  ut is left unmod
296f0 69 66 69 65 64 20 61 6e 64 20 53 51 4c 69 74 65  ified and SQLite
29700 20 75 73 65 73 20 61 20 64 65 66 61 75 6c 74 0a   uses a default.
29710 2a 2a 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  ** error message
29720 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
29730 20 75 6e 69 78 44 6c 45 72 72 6f 72 28 73 71 6c   unixDlError(sql
29740 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65  ite3_vfs *NotUse
29750 64 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61  d, int nBuf, cha
29760 72 20 2a 7a 42 75 66 4f 75 74 29 7b 0a 20 20 63  r *zBufOut){.  c
29770 68 61 72 20 2a 7a 45 72 72 3b 0a 20 20 55 4e 55  har *zErr;.  UNU
29780 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
29790 74 55 73 65 64 29 3b 0a 20 20 75 6e 69 78 45 6e  tUsed);.  unixEn
297a0 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 7a 45  terMutex();.  zE
297b0 72 72 20 3d 20 64 6c 65 72 72 6f 72 28 29 3b 0a  rr = dlerror();.
297c0 20 20 69 66 28 20 7a 45 72 72 20 29 7b 0a 20 20    if( zErr ){.  
297d0 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
297e0 74 66 28 6e 42 75 66 2c 20 7a 42 75 66 4f 75 74  tf(nBuf, zBufOut
297f0 2c 20 22 25 73 22 2c 20 7a 45 72 72 29 3b 0a 20  , "%s", zErr);. 
29800 20 7d 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75   }.  unixLeaveMu
29810 74 65 78 28 29 3b 0a 7d 0a 73 74 61 74 69 63 20  tex();.}.static 
29820 76 6f 69 64 20 28 2a 75 6e 69 78 44 6c 53 79 6d  void (*unixDlSym
29830 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f  (sqlite3_vfs *No
29840 74 55 73 65 64 2c 20 76 6f 69 64 20 2a 70 2c 20  tUsed, void *p, 
29850 63 6f 6e 73 74 20 63 68 61 72 2a 7a 53 79 6d 29  const char*zSym)
29860 29 28 76 6f 69 64 29 7b 0a 20 20 2f 2a 20 0a 20  )(void){.  /* . 
29870 20 2a 2a 20 47 43 43 20 77 69 74 68 20 2d 70 65   ** GCC with -pe
29880 64 61 6e 74 69 63 2d 65 72 72 6f 72 73 20 73 61  dantic-errors sa
29890 79 73 20 74 68 61 74 20 43 39 30 20 64 6f 65 73  ys that C90 does
298a0 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 20 76 6f 69   not allow a voi
298b0 64 2a 20 74 6f 20 62 65 0a 20 20 2a 2a 20 63 61  d* to be.  ** ca
298c0 73 74 20 69 6e 74 6f 20 61 20 70 6f 69 6e 74 65  st into a pointe
298d0 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 2e  r to a function.
298e0 20 20 41 6e 64 20 79 65 74 20 74 68 65 20 6c 69    And yet the li
298f0 62 72 61 72 79 20 64 6c 73 79 6d 28 29 20 72 6f  brary dlsym() ro
29900 75 74 69 6e 65 0a 20 20 2a 2a 20 72 65 74 75 72  utine.  ** retur
29910 6e 73 20 61 20 76 6f 69 64 2a 20 77 68 69 63 68  ns a void* which
29920 20 69 73 20 72 65 61 6c 6c 79 20 61 20 70 6f 69   is really a poi
29930 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69  nter to a functi
29940 6f 6e 2e 20 20 53 6f 20 68 6f 77 20 64 6f 20 77  on.  So how do w
29950 65 0a 20 20 2a 2a 20 75 73 65 20 64 6c 73 79 6d  e.  ** use dlsym
29960 28 29 20 77 69 74 68 20 2d 70 65 64 61 6e 74 69  () with -pedanti
29970 63 2d 65 72 72 6f 72 73 3f 0a 20 20 2a 2a 0a 20  c-errors?.  **. 
29980 20 2a 2a 20 56 61 72 69 61 62 6c 65 20 78 20 62   ** Variable x b
29990 65 6c 6f 77 20 69 73 20 64 65 66 69 6e 65 64 20  elow is defined 
299a0 74 6f 20 62 65 20 61 20 70 6f 69 6e 74 65 72 20  to be a pointer 
299b0 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 74 61  to a function ta
299c0 6b 69 6e 67 0a 20 20 2a 2a 20 70 61 72 61 6d 65  king.  ** parame
299d0 74 65 72 73 20 76 6f 69 64 2a 20 61 6e 64 20 63  ters void* and c
299e0 6f 6e 73 74 20 63 68 61 72 2a 20 61 6e 64 20 72  onst char* and r
299f0 65 74 75 72 6e 69 6e 67 20 61 20 70 6f 69 6e 74  eturning a point
29a00 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e  er to a function
29a10 2e 0a 20 20 2a 2a 20 57 65 20 69 6e 69 74 69 61  ..  ** We initia
29a20 6c 69 7a 65 20 78 20 62 79 20 61 73 73 69 67 6e  lize x by assign
29a30 69 6e 67 20 69 74 20 61 20 70 6f 69 6e 74 65 72  ing it a pointer
29a40 20 74 6f 20 74 68 65 20 64 6c 73 79 6d 28 29 20   to the dlsym() 
29a50 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 28  function..  ** (
29a60 54 68 61 74 20 61 73 73 69 67 6e 6d 65 6e 74 20  That assignment 
29a70 72 65 71 75 69 72 65 73 20 61 20 63 61 73 74 2e  requires a cast.
29a80 29 20 20 54 68 65 6e 20 77 65 20 63 61 6c 6c 20  )  Then we call 
29a90 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 74 68 61  the function tha
29aa0 74 0a 20 20 2a 2a 20 78 20 70 6f 69 6e 74 73 20  t.  ** x points 
29ab0 74 6f 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  to.  .  **.  ** 
29ac0 54 68 69 73 20 77 6f 72 6b 2d 61 72 6f 75 6e 64  This work-around
29ad0 20 69 73 20 75 6e 6c 69 6b 65 6c 79 20 74 6f 20   is unlikely to 
29ae0 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79 20 6f  work correctly o
29af0 6e 20 61 6e 79 20 73 79 73 74 65 6d 20 77 68 65  n any system whe
29b00 72 65 0a 20 20 2a 2a 20 79 6f 75 20 72 65 61 6c  re.  ** you real
29b10 6c 79 20 63 61 6e 6e 6f 74 20 63 61 73 74 20 61  ly cannot cast a
29b20 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65   function pointe
29b30 72 20 69 6e 74 6f 20 76 6f 69 64 2a 2e 20 20 42  r into void*.  B
29b40 75 74 20 74 68 65 6e 2c 20 6f 6e 20 74 68 65 0a  ut then, on the.
29b50 20 20 2a 2a 20 6f 74 68 65 72 20 68 61 6e 64 2c    ** other hand,
29b60 20 64 6c 73 79 6d 28 29 20 77 69 6c 6c 20 6e 6f   dlsym() will no
29b70 74 20 77 6f 72 6b 20 6f 6e 20 73 75 63 68 20 61  t work on such a
29b80 20 73 79 73 74 65 6d 20 65 69 74 68 65 72 2c 20   system either, 
29b90 73 6f 20 77 65 20 68 61 76 65 0a 20 20 2a 2a 20  so we have.  ** 
29ba0 6e 6f 74 20 72 65 61 6c 6c 79 20 6c 6f 73 74 20  not really lost 
29bb0 61 6e 79 74 68 69 6e 67 2e 0a 20 20 2a 2f 0a 20  anything..  */. 
29bc0 20 76 6f 69 64 20 28 2a 28 2a 78 29 28 76 6f 69   void (*(*x)(voi
29bd0 64 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 29  d*,const char*))
29be0 28 76 6f 69 64 29 3b 0a 20 20 55 4e 55 53 45 44  (void);.  UNUSED
29bf0 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
29c00 65 64 29 3b 0a 20 20 78 20 3d 20 28 76 6f 69 64  ed);.  x = (void
29c10 28 2a 28 2a 29 28 76 6f 69 64 2a 2c 63 6f 6e 73  (*(*)(void*,cons
29c20 74 20 63 68 61 72 2a 29 29 28 76 6f 69 64 29 29  t char*))(void))
29c30 64 6c 73 79 6d 3b 0a 20 20 72 65 74 75 72 6e 20  dlsym;.  return 
29c40 28 2a 78 29 28 70 2c 20 7a 53 79 6d 29 3b 0a 7d  (*x)(p, zSym);.}
29c50 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69  .static void uni
29c60 78 44 6c 43 6c 6f 73 65 28 73 71 6c 69 74 65 33  xDlClose(sqlite3
29c70 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 76  _vfs *NotUsed, v
29c80 6f 69 64 20 2a 70 48 61 6e 64 6c 65 29 7b 0a 20  oid *pHandle){. 
29c90 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
29ca0 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 64 6c  R(NotUsed);.  dl
29cb0 63 6c 6f 73 65 28 70 48 61 6e 64 6c 65 29 3b 0a  close(pHandle);.
29cc0 7d 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 53 51  }.#else /* if SQ
29cd0 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45  LITE_OMIT_LOAD_E
29ce0 58 54 45 4e 53 49 4f 4e 20 69 73 20 64 65 66 69  XTENSION is defi
29cf0 6e 65 64 3a 20 2a 2f 0a 20 20 23 64 65 66 69 6e  ned: */.  #defin
29d00 65 20 75 6e 69 78 44 6c 4f 70 65 6e 20 20 30 0a  e unixDlOpen  0.
29d10 20 20 23 64 65 66 69 6e 65 20 75 6e 69 78 44 6c    #define unixDl
29d20 45 72 72 6f 72 20 30 0a 20 20 23 64 65 66 69 6e  Error 0.  #defin
29d30 65 20 75 6e 69 78 44 6c 53 79 6d 20 20 20 30 0a  e unixDlSym   0.
29d40 20 20 23 64 65 66 69 6e 65 20 75 6e 69 78 44 6c    #define unixDl
29d50 43 6c 6f 73 65 20 30 0a 23 65 6e 64 69 66 0a 0a  Close 0.#endif..
29d60 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 6e 42 75 66  /*.** Write nBuf
29d70 20 62 79 74 65 73 20 6f 66 20 72 61 6e 64 6f 6d   bytes of random
29d80 20 64 61 74 61 20 74 6f 20 74 68 65 20 73 75 70   data to the sup
29d90 70 6c 69 65 64 20 62 75 66 66 65 72 20 7a 42 75  plied buffer zBu
29da0 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  f..*/.static int
29db0 20 75 6e 69 78 52 61 6e 64 6f 6d 6e 65 73 73 28   unixRandomness(
29dc0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74  sqlite3_vfs *Not
29dd0 55 73 65 64 2c 20 69 6e 74 20 6e 42 75 66 2c 20  Used, int nBuf, 
29de0 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 55  char *zBuf){.  U
29df0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
29e00 4e 6f 74 55 73 65 64 29 3b 0a 20 20 61 73 73 65  NotUsed);.  asse
29e10 72 74 28 28 73 69 7a 65 5f 74 29 6e 42 75 66 3e  rt((size_t)nBuf>
29e20 3d 28 73 69 7a 65 6f 66 28 74 69 6d 65 5f 74 29  =(sizeof(time_t)
29e30 2b 73 69 7a 65 6f 66 28 69 6e 74 29 29 29 3b 0a  +sizeof(int)));.
29e40 0a 20 20 2f 2a 20 57 65 20 68 61 76 65 20 74 6f  .  /* We have to
29e50 20 69 6e 69 74 69 61 6c 69 7a 65 20 7a 42 75 66   initialize zBuf
29e60 20 74 6f 20 70 72 65 76 65 6e 74 20 76 61 6c 67   to prevent valg
29e70 72 69 6e 64 20 66 72 6f 6d 20 72 65 70 6f 72 74  rind from report
29e80 69 6e 67 0a 20 20 2a 2a 20 65 72 72 6f 72 73 2e  ing.  ** errors.
29e90 20 20 54 68 65 20 72 65 70 6f 72 74 73 20 69 73    The reports is
29ea0 73 75 65 64 20 62 79 20 76 61 6c 67 72 69 6e 64  sued by valgrind
29eb0 20 61 72 65 20 69 6e 63 6f 72 72 65 63 74 20 2d   are incorrect -
29ec0 20 77 65 20 77 6f 75 6c 64 0a 20 20 2a 2a 20 70   we would.  ** p
29ed0 72 65 66 65 72 20 74 68 61 74 20 74 68 65 20 72  refer that the r
29ee0 61 6e 64 6f 6d 6e 65 73 73 20 62 65 20 69 6e 63  andomness be inc
29ef0 72 65 61 73 65 64 20 62 79 20 6d 61 6b 69 6e 67  reased by making
29f00 20 75 73 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a   use of the.  **
29f10 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 73   uninitialized s
29f20 70 61 63 65 20 69 6e 20 7a 42 75 66 20 2d 20 62  pace in zBuf - b
29f30 75 74 20 76 61 6c 67 72 69 6e 64 20 65 72 72 6f  ut valgrind erro
29f40 72 73 20 74 65 6e 64 20 74 6f 20 77 6f 72 72 79  rs tend to worry
29f50 0a 20 20 2a 2a 20 73 6f 6d 65 20 75 73 65 72 73  .  ** some users
29f60 2e 20 20 52 61 74 68 65 72 20 74 68 61 6e 20 61  .  Rather than a
29f70 72 67 75 65 2c 20 69 74 20 73 65 65 6d 73 20 65  rgue, it seems e
29f80 61 73 69 65 72 20 6a 75 73 74 20 74 6f 20 69 6e  asier just to in
29f90 69 74 69 61 6c 69 7a 65 0a 20 20 2a 2a 20 74 68  itialize.  ** th
29fa0 65 20 77 68 6f 6c 65 20 61 72 72 61 79 20 61 6e  e whole array an
29fb0 64 20 73 69 6c 65 6e 63 65 20 76 61 6c 67 72 69  d silence valgri
29fc0 6e 64 2c 20 65 76 65 6e 20 69 66 20 74 68 61 74  nd, even if that
29fd0 20 6d 65 61 6e 73 20 6c 65 73 73 20 72 61 6e 64   means less rand
29fe0 6f 6d 6e 65 73 73 0a 20 20 2a 2a 20 69 6e 20 74  omness.  ** in t
29ff0 68 65 20 72 61 6e 64 6f 6d 20 73 65 65 64 2e 0a  he random seed..
2a000 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 74    **.  ** When t
2a010 65 73 74 69 6e 67 2c 20 69 6e 69 74 69 61 6c 69  esting, initiali
2a020 7a 69 6e 67 20 7a 42 75 66 5b 5d 20 74 6f 20 7a  zing zBuf[] to z
2a030 65 72 6f 20 69 73 20 61 6c 6c 20 77 65 20 64 6f  ero is all we do
2a040 2e 20 20 54 68 61 74 20 6d 65 61 6e 73 0a 20 20  .  That means.  
2a050 2a 2a 20 74 68 61 74 20 77 65 20 61 6c 77 61 79  ** that we alway
2a060 73 20 75 73 65 20 74 68 65 20 73 61 6d 65 20 72  s use the same r
2a070 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 73 65 71  andom number seq
2a080 75 65 6e 63 65 2e 20 20 54 68 69 73 20 6d 61 6b  uence.  This mak
2a090 65 73 20 74 68 65 0a 20 20 2a 2a 20 74 65 73 74  es the.  ** test
2a0a0 73 20 72 65 70 65 61 74 61 62 6c 65 2e 0a 20 20  s repeatable..  
2a0b0 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 7a 42 75 66  */.  memset(zBuf
2a0c0 2c 20 30 2c 20 6e 42 75 66 29 3b 0a 23 69 66 20  , 0, nBuf);.#if 
2a0d0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
2a0e0 54 45 53 54 29 0a 20 20 7b 0a 20 20 20 20 69 6e  TEST).  {.    in
2a0f0 74 20 70 69 64 2c 20 66 64 3b 0a 20 20 20 20 66  t pid, fd;.    f
2a100 64 20 3d 20 6f 70 65 6e 28 22 2f 64 65 76 2f 75  d = open("/dev/u
2a110 72 61 6e 64 6f 6d 22 2c 20 4f 5f 52 44 4f 4e 4c  random", O_RDONL
2a120 59 29 3b 0a 20 20 20 20 69 66 28 20 66 64 3c 30  Y);.    if( fd<0
2a130 20 29 7b 0a 20 20 20 20 20 20 74 69 6d 65 5f 74   ){.      time_t
2a140 20 74 3b 0a 20 20 20 20 20 20 74 69 6d 65 28 26   t;.      time(&
2a150 74 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  t);.      memcpy
2a160 28 7a 42 75 66 2c 20 26 74 2c 20 73 69 7a 65 6f  (zBuf, &t, sizeo
2a170 66 28 74 29 29 3b 0a 20 20 20 20 20 20 70 69 64  f(t));.      pid
2a180 20 3d 20 67 65 74 70 69 64 28 29 3b 0a 20 20 20   = getpid();.   
2a190 20 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b     memcpy(&zBuf[
2a1a0 73 69 7a 65 6f 66 28 74 29 5d 2c 20 26 70 69 64  sizeof(t)], &pid
2a1b0 2c 20 73 69 7a 65 6f 66 28 70 69 64 29 29 3b 0a  , sizeof(pid));.
2a1c0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 69        assert( si
2a1d0 7a 65 6f 66 28 74 29 2b 73 69 7a 65 6f 66 28 70  zeof(t)+sizeof(p
2a1e0 69 64 29 3c 3d 28 73 69 7a 65 5f 74 29 6e 42 75  id)<=(size_t)nBu
2a1f0 66 20 29 3b 0a 20 20 20 20 20 20 6e 42 75 66 20  f );.      nBuf 
2a200 3d 20 73 69 7a 65 6f 66 28 74 29 20 2b 20 73 69  = sizeof(t) + si
2a210 7a 65 6f 66 28 70 69 64 29 3b 0a 20 20 20 20 7d  zeof(pid);.    }
2a220 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 42 75 66  else{.      nBuf
2a230 20 3d 20 72 65 61 64 28 66 64 2c 20 7a 42 75 66   = read(fd, zBuf
2a240 2c 20 6e 42 75 66 29 3b 0a 20 20 20 20 20 20 63  , nBuf);.      c
2a250 6c 6f 73 65 28 66 64 29 3b 0a 20 20 20 20 7d 0a  lose(fd);.    }.
2a260 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74    }.#endif.  ret
2a270 75 72 6e 20 6e 42 75 66 3b 0a 7d 0a 0a 0a 2f 2a  urn nBuf;.}.../*
2a280 0a 2a 2a 20 53 6c 65 65 70 20 66 6f 72 20 61 20  .** Sleep for a 
2a290 6c 69 74 74 6c 65 20 77 68 69 6c 65 2e 20 20 52  little while.  R
2a2a0 65 74 75 72 6e 20 74 68 65 20 61 6d 6f 75 6e 74  eturn the amount
2a2b0 20 6f 66 20 74 69 6d 65 20 73 6c 65 70 74 2e 0a   of time slept..
2a2c0 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20  ** The argument 
2a2d0 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
2a2e0 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20 77 65   microseconds we
2a2f0 20 77 61 6e 74 20 74 6f 20 73 6c 65 65 70 2e 0a   want to sleep..
2a300 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  ** The return va
2a310 6c 75 65 20 69 73 20 74 68 65 20 6e 75 6d 62 65  lue is the numbe
2a320 72 20 6f 66 20 6d 69 63 72 6f 73 65 63 6f 6e 64  r of microsecond
2a330 73 20 6f 66 20 73 6c 65 65 70 20 61 63 74 75 61  s of sleep actua
2a340 6c 6c 79 0a 2a 2a 20 72 65 71 75 65 73 74 65 64  lly.** requested
2a350 20 66 72 6f 6d 20 74 68 65 20 75 6e 64 65 72 6c   from the underl
2a360 79 69 6e 67 20 6f 70 65 72 61 74 69 6e 67 20 73  ying operating s
2a370 79 73 74 65 6d 2c 20 61 20 6e 75 6d 62 65 72 20  ystem, a number 
2a380 77 68 69 63 68 0a 2a 2a 20 6d 69 67 68 74 20 62  which.** might b
2a390 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f  e greater than o
2a3a0 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 61  r equal to the a
2a3b0 72 67 75 6d 65 6e 74 2c 20 62 75 74 20 6e 6f 74  rgument, but not
2a3c0 20 6c 65 73 73 0a 2a 2a 20 74 68 61 6e 20 74 68   less.** than th
2a3d0 65 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73  e argument..*/.s
2a3e0 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 6c  tatic int unixSl
2a3f0 65 65 70 28 73 71 6c 69 74 65 33 5f 76 66 73 20  eep(sqlite3_vfs 
2a400 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 6d 69  *NotUsed, int mi
2a410 63 72 6f 73 65 63 6f 6e 64 73 29 7b 0a 23 69 66  croseconds){.#if
2a420 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74   OS_VXWORKS.  st
2a430 72 75 63 74 20 74 69 6d 65 73 70 65 63 20 73 70  ruct timespec sp
2a440 3b 0a 0a 20 20 73 70 2e 74 76 5f 73 65 63 20 3d  ;..  sp.tv_sec =
2a450 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20 2f 20   microseconds / 
2a460 31 30 30 30 30 30 30 3b 0a 20 20 73 70 2e 74 76  1000000;.  sp.tv
2a470 5f 6e 73 65 63 20 3d 20 28 6d 69 63 72 6f 73 65  _nsec = (microse
2a480 63 6f 6e 64 73 20 25 20 31 30 30 30 30 30 30 29  conds % 1000000)
2a490 20 2a 20 31 30 30 30 3b 0a 20 20 6e 61 6e 6f 73   * 1000;.  nanos
2a4a0 6c 65 65 70 28 26 73 70 2c 20 4e 55 4c 4c 29 3b  leep(&sp, NULL);
2a4b0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
2a4c0 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
2a4d0 72 65 74 75 72 6e 20 6d 69 63 72 6f 73 65 63 6f  return microseco
2a4e0 6e 64 73 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e  nds;.#elif defin
2a4f0 65 64 28 48 41 56 45 5f 55 53 4c 45 45 50 29 20  ed(HAVE_USLEEP) 
2a500 26 26 20 48 41 56 45 5f 55 53 4c 45 45 50 0a 20  && HAVE_USLEEP. 
2a510 20 75 73 6c 65 65 70 28 6d 69 63 72 6f 73 65 63   usleep(microsec
2a520 6f 6e 64 73 29 3b 0a 20 20 55 4e 55 53 45 44 5f  onds);.  UNUSED_
2a530 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
2a540 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 6d 69 63  d);.  return mic
2a550 72 6f 73 65 63 6f 6e 64 73 3b 0a 23 65 6c 73 65  roseconds;.#else
2a560 0a 20 20 69 6e 74 20 73 65 63 6f 6e 64 73 20 3d  .  int seconds =
2a570 20 28 6d 69 63 72 6f 73 65 63 6f 6e 64 73 2b 39   (microseconds+9
2a580 39 39 39 39 39 29 2f 31 30 30 30 30 30 30 3b 0a  99999)/1000000;.
2a590 20 20 73 6c 65 65 70 28 73 65 63 6f 6e 64 73 29    sleep(seconds)
2a5a0 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
2a5b0 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
2a5c0 20 72 65 74 75 72 6e 20 73 65 63 6f 6e 64 73 2a   return seconds*
2a5d0 31 30 30 30 30 30 30 3b 0a 23 65 6e 64 69 66 0a  1000000;.#endif.
2a5e0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  }../*.** The fol
2a5f0 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65 2c  lowing variable,
2a600 20 69 66 20 73 65 74 20 74 6f 20 61 20 6e 6f 6e   if set to a non
2a610 2d 7a 65 72 6f 20 76 61 6c 75 65 2c 20 69 73 20  -zero value, is 
2a620 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 0a 2a  interpreted as.*
2a630 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * the number of 
2a640 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 31 39  seconds since 19
2a650 37 30 20 61 6e 64 20 69 73 20 75 73 65 64 20 74  70 and is used t
2a660 6f 20 73 65 74 20 74 68 65 20 72 65 73 75 6c 74  o set the result
2a670 20 6f 66 0a 2a 2a 20 73 71 6c 69 74 65 33 4f 73   of.** sqlite3Os
2a680 43 75 72 72 65 6e 74 54 69 6d 65 28 29 20 64 75  CurrentTime() du
2a690 72 69 6e 67 20 74 65 73 74 69 6e 67 2e 0a 2a 2f  ring testing..*/
2a6a0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
2a6b0 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  EST.int sqlite3_
2a6c0 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 3d 20 30  current_time = 0
2a6d0 3b 20 20 2f 2a 20 46 61 6b 65 20 73 79 73 74 65  ;  /* Fake syste
2a6e0 6d 20 74 69 6d 65 20 69 6e 20 73 65 63 6f 6e 64  m time in second
2a6f0 73 20 73 69 6e 63 65 20 31 39 37 30 2e 20 2a 2f  s since 1970. */
2a700 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46  .#endif../*.** F
2a710 69 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20  ind the current 
2a720 74 69 6d 65 20 28 69 6e 20 55 6e 69 76 65 72 73  time (in Univers
2a730 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65 64 20 54  al Coordinated T
2a740 69 6d 65 29 2e 20 20 57 72 69 74 65 20 69 6e 74  ime).  Write int
2a750 6f 20 2a 70 69 4e 6f 77 0a 2a 2a 20 74 68 65 20  o *piNow.** the 
2a760 63 75 72 72 65 6e 74 20 74 69 6d 65 20 61 6e 64  current time and
2a770 20 64 61 74 65 20 61 73 20 61 20 4a 75 6c 69 61   date as a Julia
2a780 6e 20 44 61 79 20 6e 75 6d 62 65 72 20 74 69 6d  n Day number tim
2a790 65 73 20 38 36 5f 34 30 30 5f 30 30 30 2e 20 20  es 86_400_000.  
2a7a0 49 6e 0a 2a 2a 20 6f 74 68 65 72 20 77 6f 72 64  In.** other word
2a7b0 73 2c 20 77 72 69 74 65 20 69 6e 74 6f 20 2a 70  s, write into *p
2a7c0 69 4e 6f 77 20 74 68 65 20 6e 75 6d 62 65 72 20  iNow the number 
2a7d0 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20  of milliseconds 
2a7e0 73 69 6e 63 65 20 74 68 65 20 4a 75 6c 69 61 6e  since the Julian
2a7f0 0a 2a 2a 20 65 70 6f 63 68 20 6f 66 20 6e 6f 6f  .** epoch of noo
2a800 6e 20 69 6e 20 47 72 65 65 6e 77 69 63 68 20 6f  n in Greenwich o
2a810 6e 20 4e 6f 76 65 6d 62 65 72 20 32 34 2c 20 34  n November 24, 4
2a820 37 31 34 20 42 2e 43 20 61 63 63 6f 72 64 69 6e  714 B.C accordin
2a830 67 20 74 6f 20 74 68 65 0a 2a 2a 20 70 72 6f 6c  g to the.** prol
2a840 65 70 74 69 63 20 47 72 65 67 6f 72 69 61 6e 20  eptic Gregorian 
2a850 63 61 6c 65 6e 64 61 72 2e 0a 2a 2a 0a 2a 2a 20  calendar..**.** 
2a860 4f 6e 20 73 75 63 63 65 73 73 2c 20 72 65 74 75  On success, retu
2a870 72 6e 20 30 2e 20 20 52 65 74 75 72 6e 20 31 20  rn 0.  Return 1 
2a880 69 66 20 74 68 65 20 74 69 6d 65 20 61 6e 64 20  if the time and 
2a890 64 61 74 65 20 63 61 6e 6e 6f 74 20 62 65 20 66  date cannot be f
2a8a0 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ound..*/.static 
2a8b0 69 6e 74 20 75 6e 69 78 43 75 72 72 65 6e 74 54  int unixCurrentT
2a8c0 69 6d 65 49 6e 74 36 34 28 73 71 6c 69 74 65 33  imeInt64(sqlite3
2a8d0 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 73  _vfs *NotUsed, s
2a8e0 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a 70 69  qlite3_int64 *pi
2a8f0 4e 6f 77 29 7b 0a 20 20 73 74 61 74 69 63 20 63  Now){.  static c
2a900 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6e 74  onst sqlite3_int
2a910 36 34 20 75 6e 69 78 45 70 6f 63 68 20 3d 20 32  64 unixEpoch = 2
2a920 34 34 30 35 38 37 35 2a 28 73 71 6c 69 74 65 33  4405875*(sqlite3
2a930 5f 69 6e 74 36 34 29 38 36 34 30 30 30 30 3b 0a  _int64)8640000;.
2a940 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 47  #if defined(NO_G
2a950 45 54 54 4f 44 29 0a 20 20 74 69 6d 65 5f 74 20  ETTOD).  time_t 
2a960 74 3b 0a 20 20 74 69 6d 65 28 26 74 29 3b 0a 20  t;.  time(&t);. 
2a970 20 2a 70 69 4e 6f 77 20 3d 20 28 28 73 71 6c 69   *piNow = ((sqli
2a980 74 65 33 5f 69 6e 74 36 34 29 69 29 2a 31 30 30  te3_int64)i)*100
2a990 30 20 2b 20 75 6e 69 78 45 70 6f 63 68 3b 0a 23  0 + unixEpoch;.#
2a9a0 65 6c 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  elif OS_VXWORKS.
2a9b0 20 20 73 74 72 75 63 74 20 74 69 6d 65 73 70 65    struct timespe
2a9c0 63 20 73 4e 6f 77 3b 0a 20 20 63 6c 6f 63 6b 5f  c sNow;.  clock_
2a9d0 67 65 74 74 69 6d 65 28 43 4c 4f 43 4b 5f 52 45  gettime(CLOCK_RE
2a9e0 41 4c 54 49 4d 45 2c 20 26 73 4e 6f 77 29 3b 0a  ALTIME, &sNow);.
2a9f0 20 20 2a 70 69 4e 6f 77 20 3d 20 75 6e 69 78 45    *piNow = unixE
2aa00 70 6f 63 68 20 2b 20 31 30 30 30 2a 28 73 71 6c  poch + 1000*(sql
2aa10 69 74 65 33 5f 69 6e 74 36 34 29 73 4e 6f 77 2e  ite3_int64)sNow.
2aa20 74 76 5f 73 65 63 20 2b 20 73 4e 6f 77 2e 74 76  tv_sec + sNow.tv
2aa30 5f 6e 73 65 63 2f 31 30 30 30 30 30 30 3b 0a 23  _nsec/1000000;.#
2aa40 65 6c 73 65 0a 20 20 73 74 72 75 63 74 20 74 69  else.  struct ti
2aa50 6d 65 76 61 6c 20 73 4e 6f 77 3b 0a 20 20 67 65  meval sNow;.  ge
2aa60 74 74 69 6d 65 6f 66 64 61 79 28 26 73 4e 6f 77  ttimeofday(&sNow
2aa70 2c 20 30 29 3b 0a 20 20 2a 70 69 4e 6f 77 20 3d  , 0);.  *piNow =
2aa80 20 75 6e 69 78 45 70 6f 63 68 20 2b 20 31 30 30   unixEpoch + 100
2aa90 30 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  0*(sqlite3_int64
2aaa0 29 73 4e 6f 77 2e 74 76 5f 73 65 63 20 2b 20 73  )sNow.tv_sec + s
2aab0 4e 6f 77 2e 74 76 5f 75 73 65 63 2f 31 30 30 30  Now.tv_usec/1000
2aac0 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  ;.#endif..#ifdef
2aad0 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69   SQLITE_TEST.  i
2aae0 66 28 20 73 71 6c 69 74 65 33 5f 63 75 72 72 65  f( sqlite3_curre
2aaf0 6e 74 5f 74 69 6d 65 20 29 7b 0a 20 20 20 20 2a  nt_time ){.    *
2ab00 70 69 4e 6f 77 20 3d 20 31 30 30 30 2a 28 73 71  piNow = 1000*(sq
2ab10 6c 69 74 65 33 5f 69 6e 74 36 34 29 73 71 6c 69  lite3_int64)sqli
2ab20 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65  te3_current_time
2ab30 20 2b 20 75 6e 69 78 45 70 6f 63 68 3b 0a 20 20   + unixEpoch;.  
2ab40 7d 0a 23 65 6e 64 69 66 0a 20 20 55 4e 55 53 45  }.#endif.  UNUSE
2ab50 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
2ab60 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 30  sed);.  return 0
2ab70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20  ;.}../*.** Find 
2ab80 74 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65  the current time
2ab90 20 28 69 6e 20 55 6e 69 76 65 72 73 61 6c 20 43   (in Universal C
2aba0 6f 6f 72 64 69 6e 61 74 65 64 20 54 69 6d 65 29  oordinated Time)
2abb0 2e 20 20 57 72 69 74 65 20 74 68 65 0a 2a 2a 20  .  Write the.** 
2abc0 63 75 72 72 65 6e 74 20 74 69 6d 65 20 61 6e 64  current time and
2abd0 20 64 61 74 65 20 61 73 20 61 20 4a 75 6c 69 61   date as a Julia
2abe0 6e 20 44 61 79 20 6e 75 6d 62 65 72 20 69 6e 74  n Day number int
2abf0 6f 20 2a 70 72 4e 6f 77 20 61 6e 64 0a 2a 2a 20  o *prNow and.** 
2ac00 72 65 74 75 72 6e 20 30 2e 20 20 52 65 74 75 72  return 0.  Retur
2ac10 6e 20 31 20 69 66 20 74 68 65 20 74 69 6d 65 20  n 1 if the time 
2ac20 61 6e 64 20 64 61 74 65 20 63 61 6e 6e 6f 74 20  and date cannot 
2ac30 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61  be found..*/.sta
2ac40 74 69 63 20 69 6e 74 20 75 6e 69 78 43 75 72 72  tic int unixCurr
2ac50 65 6e 74 54 69 6d 65 28 73 71 6c 69 74 65 33 5f  entTime(sqlite3_
2ac60 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 64 6f  vfs *NotUsed, do
2ac70 75 62 6c 65 20 2a 70 72 4e 6f 77 29 7b 0a 20 20  uble *prNow){.  
2ac80 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 3b  sqlite3_int64 i;
2ac90 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
2aca0 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
2acb0 75 6e 69 78 43 75 72 72 65 6e 74 54 69 6d 65 49  unixCurrentTimeI
2acc0 6e 74 36 34 28 30 2c 20 26 69 29 3b 0a 20 20 2a  nt64(0, &i);.  *
2acd0 70 72 4e 6f 77 20 3d 20 69 2f 38 36 34 30 30 30  prNow = i/864000
2ace0 30 30 2e 30 3b 0a 20 20 72 65 74 75 72 6e 20 30  00.0;.  return 0
2acf0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 65 20 61 64  ;.}../*.** We ad
2ad00 64 65 64 20 74 68 65 20 78 47 65 74 4c 61 73 74  ded the xGetLast
2ad10 45 72 72 6f 72 28 29 20 6d 65 74 68 6f 64 20 77  Error() method w
2ad20 69 74 68 20 74 68 65 20 69 6e 74 65 6e 74 69 6f  ith the intentio
2ad30 6e 20 6f 66 20 70 72 6f 76 69 64 69 6e 67 0a 2a  n of providing.*
2ad40 2a 20 62 65 74 74 65 72 20 6c 6f 77 2d 6c 65 76  * better low-lev
2ad50 65 6c 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  el error message
2ad60 73 20 77 68 65 6e 20 6f 70 65 72 61 74 69 6e 67  s when operating
2ad70 2d 73 79 73 74 65 6d 20 70 72 6f 62 6c 65 6d 73  -system problems
2ad80 20 63 6f 6d 65 20 75 70 0a 2a 2a 20 64 75 72 69   come up.** duri
2ad90 6e 67 20 53 51 4c 69 74 65 20 6f 70 65 72 61 74  ng SQLite operat
2ada0 69 6f 6e 2e 20 20 42 75 74 20 73 6f 20 66 61 72  ion.  But so far
2adb0 2c 20 6e 6f 6e 65 20 6f 66 20 74 68 61 74 20 68  , none of that h
2adc0 61 73 20 62 65 65 6e 20 69 6d 70 6c 65 6d 65 6e  as been implemen
2add0 74 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 63 6f  ted.** in the co
2ade0 72 65 2e 20 20 53 6f 20 74 68 69 73 20 72 6f 75  re.  So this rou
2adf0 74 69 6e 65 20 69 73 20 6e 65 76 65 72 20 63 61  tine is never ca
2ae00 6c 6c 65 64 2e 20 20 46 6f 72 20 6e 6f 77 2c 20  lled.  For now, 
2ae10 69 74 20 69 73 20 6d 65 72 65 6c 79 0a 2a 2a 20  it is merely.** 
2ae20 61 20 70 6c 61 63 65 2d 68 6f 6c 64 65 72 2e 0a  a place-holder..
2ae30 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
2ae40 69 78 47 65 74 4c 61 73 74 45 72 72 6f 72 28 73  ixGetLastError(s
2ae50 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55  qlite3_vfs *NotU
2ae60 73 65 64 2c 20 69 6e 74 20 4e 6f 74 55 73 65 64  sed, int NotUsed
2ae70 32 2c 20 63 68 61 72 20 2a 4e 6f 74 55 73 65 64  2, char *NotUsed
2ae80 33 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  3){.  UNUSED_PAR
2ae90 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b  AMETER(NotUsed);
2aea0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
2aeb0 54 45 52 28 4e 6f 74 55 73 65 64 32 29 3b 0a 20  TER(NotUsed2);. 
2aec0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
2aed0 52 28 4e 6f 74 55 73 65 64 33 29 3b 0a 20 20 72  R(NotUsed3);.  r
2aee0 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a  eturn 0;.}.../*.
2aef0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2af00 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20  ******** End of 
2af10 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65 74 68  sqlite3_vfs meth
2af20 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ods ************
2af30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
2af40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2af50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2af60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2af70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2af80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
2af90 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
2afa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2afb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2afc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2afd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2afe0 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
2aff0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69  *********** Begi
2b000 6e 20 50 72 6f 78 79 20 4c 6f 63 6b 69 6e 67 20  n Proxy Locking 
2b010 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b020 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b030 0a 2a 2a 0a 2a 2a 20 50 72 6f 78 79 20 6c 6f 63  .**.** Proxy loc
2b040 6b 69 6e 67 20 69 73 20 61 20 22 75 62 65 72 2d  king is a "uber-
2b050 6c 6f 63 6b 69 6e 67 2d 6d 65 74 68 6f 64 22 20  locking-method" 
2b060 69 6e 20 74 68 69 73 20 73 65 6e 73 65 3a 20 20  in this sense:  
2b070 49 74 20 75 73 65 73 20 74 68 65 0a 2a 2a 20 6f  It uses the.** o
2b080 74 68 65 72 20 6c 6f 63 6b 69 6e 67 20 6d 65 74  ther locking met
2b090 68 6f 64 73 20 6f 6e 20 73 65 63 6f 6e 64 61 72  hods on secondar
2b0a0 79 20 6c 6f 63 6b 20 66 69 6c 65 73 2e 20 20 50  y lock files.  P
2b0b0 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20  roxy locking is 
2b0c0 61 0a 2a 2a 20 6d 65 74 61 2d 6c 61 79 65 72 20  a.** meta-layer 
2b0d0 6f 76 65 72 20 74 6f 70 20 6f 66 20 74 68 65 20  over top of the 
2b0e0 70 72 69 6d 69 74 69 76 65 20 6c 6f 63 6b 69 6e  primitive lockin
2b0f0 67 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 62  g implemented ab
2b100 6f 76 65 2e 20 20 46 6f 72 0a 2a 2a 20 74 68 69  ove.  For.** thi
2b110 73 20 72 65 61 73 6f 6e 2c 20 74 68 65 20 64 69  s reason, the di
2b120 76 69 73 69 6f 6e 20 74 68 61 74 20 69 6d 70 6c  vision that impl
2b130 65 6d 65 6e 74 73 20 6f 66 20 70 72 6f 78 79 20  ements of proxy 
2b140 6c 6f 63 6b 69 6e 67 20 69 73 20 64 65 66 65 72  locking is defer
2b150 72 65 64 0a 2a 2a 20 75 6e 74 69 6c 20 6c 61 74  red.** until lat
2b160 65 20 69 6e 20 74 68 65 20 66 69 6c 65 20 28 68  e in the file (h
2b170 65 72 65 29 20 61 66 74 65 72 20 61 6c 6c 20 6f  ere) after all o
2b180 66 20 74 68 65 20 6f 74 68 65 72 20 49 2f 4f 20  f the other I/O 
2b190 6d 65 74 68 6f 64 73 20 68 61 76 65 0a 2a 2a 20  methods have.** 
2b1a0 62 65 65 6e 20 64 65 66 69 6e 65 64 20 2d 20 73  been defined - s
2b1b0 6f 20 74 68 61 74 20 74 68 65 20 70 72 69 6d 69  o that the primi
2b1c0 74 69 76 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74  tive locking met
2b1d0 68 6f 64 73 20 61 72 65 20 61 76 61 69 6c 61 62  hods are availab
2b1e0 6c 65 0a 2a 2a 20 61 73 20 73 65 72 76 69 63 65  le.** as service
2b1f0 73 20 74 6f 20 68 65 6c 70 20 77 69 74 68 20 74  s to help with t
2b200 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
2b210 6e 20 6f 66 20 70 72 6f 78 79 20 6c 6f 63 6b 69  n of proxy locki
2b220 6e 67 2e 0a 2a 2a 0a 2a 2a 2a 2a 0a 2a 2a 0a 2a  ng..**.****.**.*
2b230 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20 6c 6f  * The default lo
2b240 63 6b 69 6e 67 20 73 63 68 65 6d 65 73 20 69 6e  cking schemes in
2b250 20 53 51 4c 69 74 65 20 75 73 65 20 62 79 74 65   SQLite use byte
2b260 2d 72 61 6e 67 65 20 6c 6f 63 6b 73 20 6f 6e 20  -range locks on 
2b270 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
2b280 66 69 6c 65 20 74 6f 20 63 6f 6f 72 64 69 6e 61  file to coordina
2b290 74 65 20 73 61 66 65 2c 20 63 6f 6e 63 75 72 72  te safe, concurr
2b2a0 65 6e 74 20 61 63 63 65 73 73 20 62 79 20 6d 75  ent access by mu
2b2b0 6c 74 69 70 6c 65 20 72 65 61 64 65 72 73 0a 2a  ltiple readers.*
2b2c0 2a 20 61 6e 64 20 77 72 69 74 65 72 73 20 5b 68  * and writers [h
2b2d0 74 74 70 3a 2f 2f 73 71 6c 69 74 65 2e 6f 72 67  ttp://sqlite.org
2b2e0 2f 6c 6f 63 6b 69 6e 67 76 33 2e 68 74 6d 6c 5d  /lockingv3.html]
2b2f0 2e 20 20 54 68 65 20 66 69 76 65 20 66 69 6c 65  .  The five file
2b300 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73 74 61 74   locking.** stat
2b310 65 73 20 28 55 4e 4c 4f 43 4b 45 44 2c 20 50 45  es (UNLOCKED, PE
2b320 4e 44 49 4e 47 2c 20 53 48 41 52 45 44 2c 20 52  NDING, SHARED, R
2b330 45 53 45 52 56 45 44 2c 20 45 58 43 4c 55 53 49  ESERVED, EXCLUSI
2b340 56 45 29 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e  VE) are implemen
2b350 74 65 64 0a 2a 2a 20 61 73 20 50 4f 53 49 58 20  ted.** as POSIX 
2b360 72 65 61 64 20 26 20 77 72 69 74 65 20 6c 6f 63  read & write loc
2b370 6b 73 20 6f 76 65 72 20 66 69 78 65 64 20 73 65  ks over fixed se
2b380 74 20 6f 66 20 6c 6f 63 61 74 69 6f 6e 73 20 28  t of locations (
2b390 76 69 61 20 66 73 63 74 6c 29 2c 0a 2a 2a 20 6f  via fsctl),.** o
2b3a0 6e 20 41 46 50 20 61 6e 64 20 53 4d 42 20 6f 6e  n AFP and SMB on
2b3b0 6c 79 20 65 78 63 6c 75 73 69 76 65 20 62 79 74  ly exclusive byt
2b3c0 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 73 20 61 72  e-range locks ar
2b3d0 65 20 61 76 61 69 6c 61 62 6c 65 20 76 69 61 20  e available via 
2b3e0 66 73 63 74 6c 0a 2a 2a 20 77 69 74 68 20 5f 49  fsctl.** with _I
2b3f0 4f 57 52 28 27 7a 27 2c 20 32 33 2c 20 73 74 72  OWR('z', 23, str
2b400 75 63 74 20 42 79 74 65 52 61 6e 67 65 4c 6f 63  uct ByteRangeLoc
2b410 6b 50 42 32 29 20 74 6f 20 74 72 61 63 6b 20 74  kPB2) to track t
2b420 68 65 20 73 61 6d 65 20 35 20 73 74 61 74 65 73  he same 5 states
2b430 2e 0a 2a 2a 20 54 6f 20 73 69 6d 75 6c 61 74 65  ..** To simulate
2b440 20 61 20 46 5f 52 44 4c 43 4b 20 6f 6e 20 74 68   a F_RDLCK on th
2b450 65 20 73 68 61 72 65 64 20 72 61 6e 67 65 2c 20  e shared range, 
2b460 6f 6e 20 41 46 50 20 61 20 72 61 6e 64 6f 6d 6c  on AFP a randoml
2b470 79 20 73 65 6c 65 63 74 65 64 0a 2a 2a 20 61 64  y selected.** ad
2b480 64 72 65 73 73 20 69 6e 20 74 68 65 20 73 68 61  dress in the sha
2b490 72 65 64 20 72 61 6e 67 65 20 69 73 20 74 61 6b  red range is tak
2b4a0 65 6e 20 66 6f 72 20 61 20 53 48 41 52 45 44 20  en for a SHARED 
2b4b0 6c 6f 63 6b 2c 20 74 68 65 20 65 6e 74 69 72 65  lock, the entire
2b4c0 0a 2a 2a 20 73 68 61 72 65 64 20 72 61 6e 67 65  .** shared range
2b4d0 20 69 73 20 74 61 6b 65 6e 20 66 6f 72 20 61 6e   is taken for an
2b4e0 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 29   EXCLUSIVE lock)
2b4f0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 50 45 4e  :.**.**      PEN
2b500 44 49 4e 47 5f 42 59 54 45 20 20 20 20 20 20 20  DING_BYTE       
2b510 20 30 78 34 30 30 30 30 30 30 30 09 09 20 20 20   0x40000000..   
2b520 09 0a 2a 2a 20 20 20 20 20 20 52 45 53 45 52 56  ..**      RESERV
2b530 45 44 5f 42 59 54 45 20 20 20 20 20 20 20 30 78  ED_BYTE       0x
2b540 34 30 30 30 30 30 30 31 0a 2a 2a 20 20 20 20 20  40000001.**     
2b550 20 53 48 41 52 45 44 5f 52 41 4e 47 45 20 20 20   SHARED_RANGE   
2b560 20 20 20 20 20 30 78 34 30 30 30 30 30 30 32 20       0x40000002 
2b570 2d 3e 20 30 78 34 30 30 30 30 32 30 30 0a 2a 2a  -> 0x40000200.**
2b580 0a 2a 2a 20 54 68 69 73 20 77 6f 72 6b 73 20 77  .** This works w
2b590 65 6c 6c 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c  ell on the local
2b5a0 20 66 69 6c 65 20 73 79 73 74 65 6d 2c 20 62 75   file system, bu
2b5b0 74 20 73 68 6f 77 73 20 61 20 6e 65 61 72 6c 79  t shows a nearly
2b5c0 20 31 30 30 78 0a 2a 2a 20 73 6c 6f 77 64 6f 77   100x.** slowdow
2b5d0 6e 20 69 6e 20 72 65 61 64 20 70 65 72 66 6f 72  n in read perfor
2b5e0 6d 61 6e 63 65 20 6f 6e 20 41 46 50 20 62 65 63  mance on AFP bec
2b5f0 61 75 73 65 20 74 68 65 20 41 46 50 20 63 6c 69  ause the AFP cli
2b600 65 6e 74 20 64 69 73 61 62 6c 65 73 0a 2a 2a 20  ent disables.** 
2b610 74 68 65 20 72 65 61 64 20 63 61 63 68 65 20 77  the read cache w
2b620 68 65 6e 20 62 79 74 65 2d 72 61 6e 67 65 20 6c  hen byte-range l
2b630 6f 63 6b 73 20 61 72 65 20 70 72 65 73 65 6e 74  ocks are present
2b640 2e 20 20 45 6e 61 62 6c 69 6e 67 20 74 68 65 20  .  Enabling the 
2b650 72 65 61 64 0a 2a 2a 20 63 61 63 68 65 20 65 78  read.** cache ex
2b660 70 6f 73 65 73 20 61 20 63 61 63 68 65 20 63 6f  poses a cache co
2b670 68 65 72 65 6e 63 79 20 70 72 6f 62 6c 65 6d 20  herency problem 
2b680 74 68 61 74 20 69 73 20 70 72 65 73 65 6e 74 20  that is present 
2b690 6f 6e 20 61 6c 6c 20 4f 53 20 58 0a 2a 2a 20 73  on all OS X.** s
2b6a0 75 70 70 6f 72 74 65 64 20 6e 65 74 77 6f 72 6b  upported network
2b6b0 20 66 69 6c 65 20 73 79 73 74 65 6d 73 2e 20 20   file systems.  
2b6c0 4e 46 53 20 61 6e 64 20 41 46 50 20 62 6f 74 68  NFS and AFP both
2b6d0 20 6f 62 73 65 72 76 65 20 74 68 65 0a 2a 2a 20   observe the.** 
2b6e0 63 6c 6f 73 65 2d 74 6f 2d 6f 70 65 6e 20 73 65  close-to-open se
2b6f0 6d 61 6e 74 69 63 73 20 66 6f 72 20 65 6e 73 75  mantics for ensu
2b700 72 69 6e 67 20 63 61 63 68 65 20 63 6f 68 65 72  ring cache coher
2b710 65 6e 63 79 0a 2a 2a 20 5b 68 74 74 70 3a 2f 2f  ency.** [http://
2b720 6e 66 73 2e 73 6f 75 72 63 65 66 6f 72 67 65 2e  nfs.sourceforge.
2b730 6e 65 74 2f 23 66 61 71 5f 61 38 5d 2c 20 77 68  net/#faq_a8], wh
2b740 69 63 68 20 64 6f 65 73 20 6e 6f 74 20 65 66 66  ich does not eff
2b750 65 63 74 69 76 65 6c 79 0a 2a 2a 20 61 64 64 72  ectively.** addr
2b760 65 73 73 20 74 68 65 20 72 65 71 75 69 72 65 6d  ess the requirem
2b770 65 6e 74 73 20 66 6f 72 20 63 6f 6e 63 75 72 72  ents for concurr
2b780 65 6e 74 20 64 61 74 61 62 61 73 65 20 61 63 63  ent database acc
2b790 65 73 73 20 62 79 20 6d 75 6c 74 69 70 6c 65 0a  ess by multiple.
2b7a0 2a 2a 20 72 65 61 64 65 72 73 20 61 6e 64 20 77  ** readers and w
2b7b0 72 69 74 65 72 73 0a 2a 2a 20 5b 68 74 74 70 3a  riters.** [http:
2b7c0 2f 2f 77 77 77 2e 6e 61 62 62 6c 65 2e 63 6f 6d  //www.nabble.com
2b7d0 2f 53 51 4c 69 74 65 2d 6f 6e 2d 4e 46 53 2d 63  /SQLite-on-NFS-c
2b7e0 61 63 68 65 2d 63 6f 68 65 72 65 6e 63 79 2d 74  ache-coherency-t
2b7f0 64 31 35 36 35 35 37 30 31 2e 68 74 6d 6c 5d 2e  d15655701.html].
2b800 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 64 64 72 65 73  .**.** To addres
2b810 73 20 74 68 65 20 70 65 72 66 6f 72 6d 61 6e 63  s the performanc
2b820 65 20 61 6e 64 20 63 61 63 68 65 20 63 6f 68 65  e and cache cohe
2b830 72 65 6e 63 79 20 69 73 73 75 65 73 2c 20 70 72  rency issues, pr
2b840 6f 78 79 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67  oxy file locking
2b850 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 68 65 20  .** changes the 
2b860 77 61 79 20 64 61 74 61 62 61 73 65 20 61 63 63  way database acc
2b870 65 73 73 20 69 73 20 63 6f 6e 74 72 6f 6c 6c 65  ess is controlle
2b880 64 20 62 79 20 6c 69 6d 69 74 69 6e 67 20 61 63  d by limiting ac
2b890 63 65 73 73 20 74 6f 20 61 0a 2a 2a 20 73 69 6e  cess to a.** sin
2b8a0 67 6c 65 20 68 6f 73 74 20 61 74 20 61 20 74 69  gle host at a ti
2b8b0 6d 65 20 61 6e 64 20 6d 6f 76 69 6e 67 20 66 69  me and moving fi
2b8c0 6c 65 20 6c 6f 63 6b 73 20 6f 66 66 20 6f 66 20  le locks off of 
2b8d0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2b8e0 65 0a 2a 2a 20 61 6e 64 20 6f 6e 74 6f 20 61 20  e.** and onto a 
2b8f0 70 72 6f 78 79 20 66 69 6c 65 20 6f 6e 20 74 68  proxy file on th
2b900 65 20 6c 6f 63 61 6c 20 66 69 6c 65 20 73 79 73  e local file sys
2b910 74 65 6d 2e 20 20 0a 2a 2a 0a 2a 2a 0a 2a 2a 20  tem.  .**.**.** 
2b920 55 73 69 6e 67 20 70 72 6f 78 79 20 6c 6f 63 6b  Using proxy lock
2b930 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  s.** -----------
2b940 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 43 20 41  ------.**.** C A
2b950 50 49 73 0a 2a 2a 0a 2a 2a 20 20 73 71 6c 69 74  PIs.**.**  sqlit
2b960 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28  e3_file_control(
2b970 64 62 2c 20 64 62 6e 61 6d 65 2c 20 53 51 4c 49  db, dbname, SQLI
2b980 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59  TE_SET_LOCKPROXY
2b990 46 49 4c 45 2c 0a 2a 2a 20 20 20 20 20 20 20 20  FILE,.**        
2b9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3c                 <
2b9b0 70 72 6f 78 79 5f 70 61 74 68 3e 20 7c 20 22 3a  proxy_path> | ":
2b9c0 61 75 74 6f 3a 22 29 3b 0a 2a 2a 20 20 73 71 6c  auto:");.**  sql
2b9d0 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f  ite3_file_contro
2b9e0 6c 28 64 62 2c 20 64 62 6e 61 6d 65 2c 20 53 51  l(db, dbname, SQ
2b9f0 4c 49 54 45 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f  LITE_GET_LOCKPRO
2ba00 58 59 46 49 4c 45 2c 20 26 3c 70 72 6f 78 79 5f  XYFILE, &<proxy_
2ba10 70 61 74 68 3e 29 3b 0a 2a 2a 0a 2a 2a 0a 2a 2a  path>);.**.**.**
2ba20 20 53 51 4c 20 70 72 61 67 6d 61 73 0a 2a 2a 0a   SQL pragmas.**.
2ba30 2a 2a 20 20 50 52 41 47 4d 41 20 5b 64 61 74 61  **  PRAGMA [data
2ba40 62 61 73 65 2e 5d 6c 6f 63 6b 5f 70 72 6f 78 79  base.]lock_proxy
2ba50 5f 66 69 6c 65 3d 3c 70 72 6f 78 79 5f 70 61 74  _file=<proxy_pat
2ba60 68 3e 20 7c 20 3a 61 75 74 6f 3a 0a 2a 2a 20 20  h> | :auto:.**  
2ba70 50 52 41 47 4d 41 20 5b 64 61 74 61 62 61 73 65  PRAGMA [database
2ba80 2e 5d 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66 69 6c  .]lock_proxy_fil
2ba90 65 0a 2a 2a 0a 2a 2a 20 53 70 65 63 69 66 79 69  e.**.** Specifyi
2baa0 6e 67 20 22 3a 61 75 74 6f 3a 22 20 6d 65 61 6e  ng ":auto:" mean
2bab0 73 20 74 68 61 74 20 69 66 20 74 68 65 72 65 20  s that if there 
2bac0 69 73 20 61 20 63 6f 6e 63 68 20 66 69 6c 65 20  is a conch file 
2bad0 77 69 74 68 20 61 20 6d 61 74 63 68 69 6e 67 0a  with a matching.
2bae0 2a 2a 20 68 6f 73 74 20 49 44 20 69 6e 20 69 74  ** host ID in it
2baf0 2c 20 74 68 65 20 70 72 6f 78 79 20 70 61 74 68  , the proxy path
2bb00 20 69 6e 20 74 68 65 20 63 6f 6e 63 68 20 66 69   in the conch fi
2bb10 6c 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64 2c  le will be used,
2bb20 20 6f 74 68 65 72 77 69 73 65 0a 2a 2a 20 61 20   otherwise.** a 
2bb30 70 72 6f 78 79 20 70 61 74 68 20 62 61 73 65 64  proxy path based
2bb40 20 6f 6e 20 74 68 65 20 75 73 65 72 27 73 20 74   on the user's t
2bb50 65 6d 70 20 64 69 72 0a 2a 2a 20 28 76 69 61 20  emp dir.** (via 
2bb60 63 6f 6e 66 73 74 72 28 5f 43 53 5f 44 41 52 57  confstr(_CS_DARW
2bb70 49 4e 5f 55 53 45 52 5f 54 45 4d 50 5f 44 49 52  IN_USER_TEMP_DIR
2bb80 2c 2e 2e 2e 29 29 20 77 69 6c 6c 20 62 65 20 75  ,...)) will be u
2bb90 73 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 61  sed and the.** a
2bba0 63 74 75 61 6c 20 70 72 6f 78 79 20 66 69 6c 65  ctual proxy file
2bbb0 20 6e 61 6d 65 20 69 73 20 67 65 6e 65 72 61 74   name is generat
2bbc0 65 64 20 66 72 6f 6d 20 74 68 65 20 6e 61 6d 65  ed from the name
2bbd0 20 61 6e 64 20 70 61 74 68 20 6f 66 20 74 68 65   and path of the
2bbe0 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c  .** database fil
2bbf0 65 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a  e.  For example:
2bc00 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 46 6f 72  .**.**       For
2bc10 20 64 61 74 61 62 61 73 65 20 70 61 74 68 20 22   database path "
2bc20 2f 55 73 65 72 73 2f 6d 65 2f 66 6f 6f 2e 64 62  /Users/me/foo.db
2bc30 22 20 0a 2a 2a 20 20 20 20 20 20 20 54 68 65 20  " .**       The 
2bc40 6c 6f 63 6b 20 70 61 74 68 20 77 69 6c 6c 20 62  lock path will b
2bc50 65 20 22 3c 74 6d 70 64 69 72 3e 2f 73 71 6c 69  e "<tmpdir>/sqli
2bc60 74 65 70 6c 6f 63 6b 73 2f 5f 55 73 65 72 73 5f  teplocks/_Users_
2bc70 6d 65 5f 66 6f 6f 2e 64 62 3a 61 75 74 6f 3a 22  me_foo.db:auto:"
2bc80 29 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61 20 6c  ).**.** Once a l
2bc90 6f 63 6b 20 70 72 6f 78 79 20 69 73 20 63 6f 6e  ock proxy is con
2bca0 66 69 67 75 72 65 64 20 66 6f 72 20 61 20 64 61  figured for a da
2bcb0 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
2bcc0 6e 2c 20 69 74 20 63 61 6e 20 6e 6f 74 0a 2a 2a  n, it can not.**
2bcd0 20 62 65 20 72 65 6d 6f 76 65 64 2c 20 68 6f 77   be removed, how
2bce0 65 76 65 72 20 69 74 20 6d 61 79 20 62 65 20 73  ever it may be s
2bcf0 77 69 74 63 68 65 64 20 74 6f 20 61 20 64 69 66  witched to a dif
2bd00 66 65 72 65 6e 74 20 70 72 6f 78 79 20 70 61 74  ferent proxy pat
2bd10 68 20 76 69 61 0a 2a 2a 20 74 68 65 20 61 62 6f  h via.** the abo
2bd20 76 65 20 41 50 49 73 20 28 61 73 73 75 6d 69 6e  ve APIs (assumin
2bd30 67 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65  g the conch file
2bd40 20 69 73 20 6e 6f 74 20 62 65 69 6e 67 20 68 65   is not being he
2bd50 6c 64 20 62 79 20 61 6e 6f 74 68 65 72 0a 2a 2a  ld by another.**
2bd60 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 72 20 70   connection or p
2bd70 72 6f 63 65 73 73 29 2e 20 0a 2a 2a 0a 2a 2a 0a  rocess). .**.**.
2bd80 2a 2a 20 48 6f 77 20 70 72 6f 78 79 20 6c 6f 63  ** How proxy loc
2bd90 6b 69 6e 67 20 77 6f 72 6b 73 0a 2a 2a 20 2d 2d  king works.** --
2bda0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2bdb0 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 50 72 6f 78  -----.**.** Prox
2bdc0 79 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 72  y file locking r
2bdd0 65 6c 69 65 73 20 70 72 69 6d 61 72 69 6c 79 20  elies primarily 
2bde0 6f 6e 20 74 77 6f 20 6e 65 77 20 73 75 70 70 6f  on two new suppo
2bdf0 72 74 69 6e 67 20 66 69 6c 65 73 3a 20 0a 2a 2a  rting files: .**
2be00 0a 2a 2a 20 20 20 2a 20 20 63 6f 6e 63 68 20 66  .**   *  conch f
2be10 69 6c 65 20 74 6f 20 6c 69 6d 69 74 20 61 63 63  ile to limit acc
2be20 65 73 73 20 74 6f 20 74 68 65 20 64 61 74 61 62  ess to the datab
2be30 61 73 65 20 66 69 6c 65 20 74 6f 20 61 20 73 69  ase file to a si
2be40 6e 67 6c 65 20 68 6f 73 74 0a 2a 2a 20 20 20 20  ngle host.**    
2be50 20 20 61 74 20 61 20 74 69 6d 65 0a 2a 2a 0a 2a    at a time.**.*
2be60 2a 20 20 20 2a 20 20 70 72 6f 78 79 20 66 69 6c  *   *  proxy fil
2be70 65 20 74 6f 20 61 63 74 20 61 73 20 61 20 70 72  e to act as a pr
2be80 6f 78 79 20 66 6f 72 20 74 68 65 20 61 64 76 69  oxy for the advi
2be90 73 6f 72 79 20 6c 6f 63 6b 73 20 6e 6f 72 6d 61  sory locks norma
2bea0 6c 6c 79 0a 2a 2a 20 20 20 20 20 20 74 61 6b 65  lly.**      take
2beb0 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  n on the databas
2bec0 65 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e 63  e.**.** The conc
2bed0 68 20 66 69 6c 65 20 2d 20 74 6f 20 75 73 65 20  h file - to use 
2bee0 61 20 70 72 6f 78 79 20 66 69 6c 65 2c 20 73 71  a proxy file, sq
2bef0 6c 69 74 65 20 6d 75 73 74 20 66 69 72 73 74 20  lite must first 
2bf00 22 68 6f 6c 64 20 74 68 65 20 63 6f 6e 63 68 22  "hold the conch"
2bf10 0a 2a 2a 20 62 79 20 74 61 6b 69 6e 67 20 61 6e  .** by taking an
2bf20 20 73 71 6c 69 74 65 2d 73 74 79 6c 65 20 73 68   sqlite-style sh
2bf30 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  ared lock on the
2bf40 20 63 6f 6e 63 68 20 66 69 6c 65 2c 20 72 65 61   conch file, rea
2bf50 64 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 6e 74  ding the.** cont
2bf60 65 6e 74 73 20 61 6e 64 20 63 6f 6d 70 61 72 69  ents and compari
2bf70 6e 67 20 74 68 65 20 68 6f 73 74 27 73 20 75 6e  ng the host's un
2bf80 69 71 75 65 20 68 6f 73 74 20 49 44 20 28 73 65  ique host ID (se
2bf90 65 20 62 65 6c 6f 77 29 20 61 6e 64 20 6c 6f 63  e below) and loc
2bfa0 6b 0a 2a 2a 20 70 72 6f 78 79 20 70 61 74 68 20  k.** proxy path 
2bfb0 61 67 61 69 6e 73 74 20 74 68 65 20 76 61 6c 75  against the valu
2bfc0 65 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  es stored in the
2bfd0 20 63 6f 6e 63 68 2e 20 20 54 68 65 20 63 6f 6e   conch.  The con
2bfe0 63 68 20 66 69 6c 65 20 69 73 0a 2a 2a 20 73 74  ch file is.** st
2bff0 6f 72 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65  ored in the same
2c000 20 64 69 72 65 63 74 6f 72 79 20 61 73 20 74 68   directory as th
2c010 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2c020 61 6e 64 20 74 68 65 20 66 69 6c 65 20 6e 61 6d  and the file nam
2c030 65 0a 2a 2a 20 69 73 20 70 61 74 74 65 72 6e 65  e.** is patterne
2c040 64 20 61 66 74 65 72 20 74 68 65 20 64 61 74 61  d after the data
2c050 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 61  base file name a
2c060 73 20 22 2e 3c 64 61 74 61 62 61 73 65 6e 61 6d  s ".<databasenam
2c070 65 3e 2d 63 6f 6e 63 68 22 2e 0a 2a 2a 20 49 66  e>-conch"..** If
2c080 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20   the conch file 
2c090 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20  does not exist, 
2c0a0 6f 72 20 69 74 27 73 20 63 6f 6e 74 65 6e 74 73  or it's contents
2c0b0 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68 20 74 68   do not match th
2c0c0 65 0a 2a 2a 20 68 6f 73 74 20 49 44 20 61 6e 64  e.** host ID and
2c0d0 2f 6f 72 20 70 72 6f 78 79 20 70 61 74 68 2c 20  /or proxy path, 
2c0e0 74 68 65 6e 20 74 68 65 20 6c 6f 63 6b 20 69 73  then the lock is
2c0f0 20 65 73 63 61 6c 61 74 65 64 20 74 6f 20 61 6e   escalated to an
2c100 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20 6c 6f   exclusive.** lo
2c110 63 6b 20 61 6e 64 20 74 68 65 20 63 6f 6e 63 68  ck and the conch
2c120 20 66 69 6c 65 20 63 6f 6e 74 65 6e 74 73 20 69   file contents i
2c130 73 20 75 70 64 61 74 65 64 20 77 69 74 68 20 74  s updated with t
2c140 68 65 20 68 6f 73 74 20 49 44 20 61 6e 64 20 70  he host ID and p
2c150 72 6f 78 79 0a 2a 2a 20 70 61 74 68 20 61 6e 64  roxy.** path and
2c160 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 64 6f 77   the lock is dow
2c170 6e 67 72 61 64 65 64 20 74 6f 20 61 20 73 68 61  ngraded to a sha
2c180 72 65 64 20 6c 6f 63 6b 20 61 67 61 69 6e 2e 20  red lock again. 
2c190 20 49 66 20 74 68 65 20 63 6f 6e 63 68 0a 2a 2a   If the conch.**
2c1a0 20 69 73 20 68 65 6c 64 20 62 79 20 61 6e 6f 74   is held by anot
2c1b0 68 65 72 20 70 72 6f 63 65 73 73 20 28 77 69 74  her process (wit
2c1c0 68 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 29  h a shared lock)
2c1d0 2c 20 74 68 65 20 65 78 63 6c 75 73 69 76 65 20  , the exclusive 
2c1e0 6c 6f 63 6b 0a 2a 2a 20 77 69 6c 6c 20 66 61 69  lock.** will fai
2c1f0 6c 20 61 6e 64 20 53 51 4c 49 54 45 5f 42 55 53  l and SQLITE_BUS
2c200 59 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  Y is returned..*
2c210 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79 20 66  *.** The proxy f
2c220 69 6c 65 20 2d 20 61 20 73 69 6e 67 6c 65 2d 62  ile - a single-b
2c230 79 74 65 20 66 69 6c 65 20 75 73 65 64 20 66 6f  yte file used fo
2c240 72 20 61 6c 6c 20 61 64 76 69 73 6f 72 79 20 66  r all advisory f
2c250 69 6c 65 20 6c 6f 63 6b 73 0a 2a 2a 20 6e 6f 72  ile locks.** nor
2c260 6d 61 6c 6c 79 20 74 61 6b 65 6e 20 6f 6e 20 74  mally taken on t
2c270 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2c280 2e 20 20 20 54 68 69 73 20 61 6c 6c 6f 77 73 20  .   This allows 
2c290 66 6f 72 20 73 61 66 65 20 73 68 61 72 69 6e 67  for safe sharing
2c2a0 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61 74 61 62  .** of the datab
2c2b0 61 73 65 20 66 69 6c 65 20 66 6f 72 20 6d 75 6c  ase file for mul
2c2c0 74 69 70 6c 65 20 72 65 61 64 65 72 73 20 61 6e  tiple readers an
2c2d0 64 20 77 72 69 74 65 72 73 20 6f 6e 20 74 68 65  d writers on the
2c2e0 20 73 61 6d 65 0a 2a 2a 20 68 6f 73 74 20 28 74   same.** host (t
2c2f0 68 65 20 63 6f 6e 63 68 20 65 6e 73 75 72 65 73  he conch ensures
2c300 20 74 68 61 74 20 74 68 65 79 20 61 6c 6c 20 75   that they all u
2c310 73 65 20 74 68 65 20 73 61 6d 65 20 6c 6f 63 61  se the same loca
2c320 6c 20 6c 6f 63 6b 20 66 69 6c 65 29 2e 0a 2a 2a  l lock file)..**
2c330 0a 2a 2a 20 52 65 71 75 65 73 74 69 6e 67 20 74  .** Requesting t
2c340 68 65 20 6c 6f 63 6b 20 70 72 6f 78 79 20 64 6f  he lock proxy do
2c350 65 73 20 6e 6f 74 20 69 6d 6d 65 64 69 61 74 65  es not immediate
2c360 6c 79 20 74 61 6b 65 20 74 68 65 20 63 6f 6e 63  ly take the conc
2c370 68 2c 20 69 74 20 69 73 0a 2a 2a 20 6f 6e 6c 79  h, it is.** only
2c380 20 74 61 6b 65 6e 20 77 68 65 6e 20 74 68 65 20   taken when the 
2c390 66 69 72 73 74 20 72 65 71 75 65 73 74 20 74 6f  first request to
2c3a0 20 6c 6f 63 6b 20 64 61 74 61 62 61 73 65 20 66   lock database f
2c3b0 69 6c 65 20 69 73 20 6d 61 64 65 2e 20 20 0a 2a  ile is made.  .*
2c3c0 2a 20 54 68 69 73 20 6d 61 74 63 68 65 73 20 74  * This matches t
2c3d0 68 65 20 73 65 6d 61 6e 74 69 63 73 20 6f 66 20  he semantics of 
2c3e0 74 68 65 20 74 72 61 64 69 74 69 6f 6e 61 6c 20  the traditional 
2c3f0 6c 6f 63 6b 69 6e 67 20 62 65 68 61 76 69 6f 72  locking behavior
2c400 2c 20 77 68 65 72 65 0a 2a 2a 20 6f 70 65 6e 69  , where.** openi
2c410 6e 67 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ng a connection 
2c420 74 6f 20 61 20 64 61 74 61 62 61 73 65 20 66 69  to a database fi
2c430 6c 65 20 64 6f 65 73 20 6e 6f 74 20 74 61 6b 65  le does not take
2c440 20 61 20 6c 6f 63 6b 20 6f 6e 20 69 74 2e 0a 2a   a lock on it..*
2c450 2a 20 54 68 65 20 73 68 61 72 65 64 20 6c 6f 63  * The shared loc
2c460 6b 20 61 6e 64 20 61 6e 20 6f 70 65 6e 20 66 69  k and an open fi
2c470 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 61 72  le descriptor ar
2c480 65 20 6d 61 69 6e 74 61 69 6e 65 64 20 75 6e 74  e maintained unt
2c490 69 6c 20 0a 2a 2a 20 74 68 65 20 63 6f 6e 6e 65  il .** the conne
2c4a0 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 64 61 74  ction to the dat
2c4b0 61 62 61 73 65 20 69 73 20 63 6c 6f 73 65 64 2e  abase is closed.
2c4c0 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 78   .**.** The prox
2c4d0 79 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 6c  y file and the l
2c4e0 6f 63 6b 20 66 69 6c 65 20 61 72 65 20 6e 65 76  ock file are nev
2c4f0 65 72 20 64 65 6c 65 74 65 64 20 73 6f 20 74 68  er deleted so th
2c500 65 79 20 6f 6e 6c 79 20 6e 65 65 64 0a 2a 2a 20  ey only need.** 
2c510 74 6f 20 62 65 20 63 72 65 61 74 65 64 20 74 68  to be created th
2c520 65 20 66 69 72 73 74 20 74 69 6d 65 20 74 68 65  e first time the
2c530 79 20 61 72 65 20 75 73 65 64 2e 0a 2a 2a 0a 2a  y are used..**.*
2c540 2a 20 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  * Configuration 
2c550 6f 70 74 69 6f 6e 73 0a 2a 2a 20 2d 2d 2d 2d 2d  options.** -----
2c560 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2c570 0a 2a 2a 0a 2a 2a 20 20 53 51 4c 49 54 45 5f 50  .**.**  SQLITE_P
2c580 52 45 46 45 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b  REFER_PROXY_LOCK
2c590 49 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  ING.**.**       
2c5a0 44 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 61  Database files a
2c5b0 63 63 65 73 73 65 64 20 6f 6e 20 6e 6f 6e 2d 6c  ccessed on non-l
2c5c0 6f 63 61 6c 20 66 69 6c 65 20 73 79 73 74 65 6d  ocal file system
2c5d0 73 20 61 72 65 0a 2a 2a 20 20 20 20 20 20 20 61  s are.**       a
2c5e0 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6f 6e  utomatically con
2c5f0 66 69 67 75 72 65 64 20 66 6f 72 20 70 72 6f 78  figured for prox
2c600 79 20 6c 6f 63 6b 69 6e 67 2c 20 6c 6f 63 6b 20  y locking, lock 
2c610 66 69 6c 65 73 20 61 72 65 0a 2a 2a 20 20 20 20  files are.**    
2c620 20 20 20 6e 61 6d 65 64 20 61 75 74 6f 6d 61 74     named automat
2c630 69 63 61 6c 6c 79 20 75 73 69 6e 67 20 74 68 65  ically using the
2c640 20 73 61 6d 65 20 6c 6f 67 69 63 20 61 73 0a 2a   same logic as.*
2c650 2a 20 20 20 20 20 20 20 50 52 41 47 4d 41 20 6c  *       PRAGMA l
2c660 6f 63 6b 5f 70 72 6f 78 79 5f 66 69 6c 65 3d 22  ock_proxy_file="
2c670 3a 61 75 74 6f 3a 22 0a 2a 2a 20 20 20 20 0a 2a  :auto:".**    .*
2c680 2a 20 20 53 51 4c 49 54 45 5f 50 52 4f 58 59 5f  *  SQLITE_PROXY_
2c690 44 45 42 55 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20  DEBUG.**.**     
2c6a0 20 20 45 6e 61 62 6c 65 73 20 74 68 65 20 6c 6f    Enables the lo
2c6b0 67 67 69 6e 67 20 6f 66 20 65 72 72 6f 72 20 6d  gging of error m
2c6c0 65 73 73 61 67 65 73 20 64 75 72 69 6e 67 20 68  essages during h
2c6d0 6f 73 74 20 69 64 20 66 69 6c 65 0a 2a 2a 20 20  ost id file.**  
2c6e0 20 20 20 20 20 72 65 74 72 69 65 76 61 6c 20 61       retrieval a
2c6f0 6e 64 20 63 72 65 61 74 69 6f 6e 0a 2a 2a 0a 2a  nd creation.**.*
2c700 2a 20 20 4c 4f 43 4b 50 52 4f 58 59 44 49 52 0a  *  LOCKPROXYDIR.
2c710 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 4f 76 65 72  **.**       Over
2c720 72 69 64 65 73 20 74 68 65 20 64 65 66 61 75 6c  rides the defaul
2c730 74 20 64 69 72 65 63 74 6f 72 79 20 75 73 65 64  t directory used
2c740 20 66 6f 72 20 6c 6f 63 6b 20 70 72 6f 78 79 20   for lock proxy 
2c750 66 69 6c 65 73 20 74 68 61 74 0a 2a 2a 20 20 20  files that.**   
2c760 20 20 20 20 61 72 65 20 6e 61 6d 65 64 20 61 75      are named au
2c770 74 6f 6d 61 74 69 63 61 6c 6c 79 20 76 69 61 20  tomatically via 
2c780 74 68 65 20 22 3a 61 75 74 6f 3a 22 20 73 65 74  the ":auto:" set
2c790 74 69 6e 67 0a 2a 2a 0a 2a 2a 20 20 53 51 4c 49  ting.**.**  SQLI
2c7a0 54 45 5f 44 45 46 41 55 4c 54 5f 50 52 4f 58 59  TE_DEFAULT_PROXY
2c7b0 44 49 52 5f 50 45 52 4d 49 53 53 49 4f 4e 53 0a  DIR_PERMISSIONS.
2c7c0 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 50 65 72 6d  **.**       Perm
2c7d0 69 73 73 69 6f 6e 73 20 74 6f 20 75 73 65 20 77  issions to use w
2c7e0 68 65 6e 20 63 72 65 61 74 69 6e 67 20 61 20 64  hen creating a d
2c7f0 69 72 65 63 74 6f 72 79 20 66 6f 72 20 73 74 6f  irectory for sto
2c800 72 69 6e 67 20 74 68 65 0a 2a 2a 20 20 20 20 20  ring the.**     
2c810 20 20 6c 6f 63 6b 20 70 72 6f 78 79 20 66 69 6c    lock proxy fil
2c820 65 73 2c 20 6f 6e 6c 79 20 75 73 65 64 20 77 68  es, only used wh
2c830 65 6e 20 4c 4f 43 4b 50 52 4f 58 59 44 49 52 20  en LOCKPROXYDIR 
2c840 69 73 20 6e 6f 74 20 73 65 74 2e 0a 2a 2a 20 20  is not set..**  
2c850 20 20 0a 2a 2a 20 20 20 20 0a 2a 2a 20 41 73 20    .**    .** As 
2c860 6d 65 6e 74 69 6f 6e 65 64 20 61 62 6f 76 65 2c  mentioned above,
2c870 20 77 68 65 6e 20 63 6f 6d 70 69 6c 65 64 20 77   when compiled w
2c880 69 74 68 20 53 51 4c 49 54 45 5f 50 52 45 46 45  ith SQLITE_PREFE
2c890 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 2c  R_PROXY_LOCKING,
2c8a0 0a 2a 2a 20 73 65 74 74 69 6e 67 20 74 68 65 20  .** setting the 
2c8b0 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69  environment vari
2c8c0 61 62 6c 65 20 53 51 4c 49 54 45 5f 46 4f 52 43  able SQLITE_FORC
2c8d0 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 20  E_PROXY_LOCKING 
2c8e0 74 6f 20 31 20 77 69 6c 6c 0a 2a 2a 20 66 6f 72  to 1 will.** for
2c8f0 63 65 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67  ce proxy locking
2c900 20 74 6f 20 62 65 20 75 73 65 64 20 66 6f 72 20   to be used for 
2c910 65 76 65 72 79 20 64 61 74 61 62 61 73 65 20 66  every database f
2c920 69 6c 65 20 6f 70 65 6e 65 64 2c 20 61 6e 64 20  ile opened, and 
2c930 30 0a 2a 2a 20 77 69 6c 6c 20 66 6f 72 63 65 20  0.** will force 
2c940 61 75 74 6f 6d 61 74 69 63 20 70 72 6f 78 79 20  automatic proxy 
2c950 6c 6f 63 6b 69 6e 67 20 74 6f 20 62 65 20 64 69  locking to be di
2c960 73 61 62 6c 65 64 20 66 6f 72 20 61 6c 6c 20 64  sabled for all d
2c970 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 73  atabase.** files
2c980 20 28 65 78 70 6c 69 63 69 74 79 20 63 61 6c 6c   (explicity call
2c990 69 6e 67 20 74 68 65 20 53 51 4c 49 54 45 5f 53  ing the SQLITE_S
2c9a0 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45  ET_LOCKPROXYFILE
2c9b0 20 70 72 61 67 6d 61 20 6f 72 0a 2a 2a 20 73 71   pragma or.** sq
2c9c0 6c 69 74 65 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f  lite_file_contro
2c9d0 6c 20 41 50 49 20 69 73 20 6e 6f 74 20 61 66 66  l API is not aff
2c9e0 65 63 74 65 64 20 62 79 20 53 51 4c 49 54 45 5f  ected by SQLITE_
2c9f0 46 4f 52 43 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b  FORCE_PROXY_LOCK
2ca00 49 4e 47 29 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  ING)..*/../*.** 
2ca10 50 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73  Proxy locking is
2ca20 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20   only available 
2ca30 6f 6e 20 4d 61 63 4f 53 58 20 0a 2a 2f 0a 23 69  on MacOSX .*/.#i
2ca40 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
2ca50 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45  E__) && SQLITE_E
2ca60 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
2ca70 59 4c 45 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70  YLE../*.** The p
2ca80 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
2ca90 78 74 20 68 61 73 20 74 68 65 20 70 61 74 68 20  xt has the path 
2caa0 61 6e 64 20 66 69 6c 65 20 73 74 72 75 63 74 75  and file structu
2cab0 72 65 73 20 66 6f 72 20 74 68 65 20 72 65 6d 6f  res for the remo
2cac0 74 65 20 0a 2a 2a 20 61 6e 64 20 6c 6f 63 61 6c  te .** and local
2cad0 20 70 72 6f 78 79 20 66 69 6c 65 73 20 69 6e 20   proxy files in 
2cae0 69 74 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  it.*/.typedef st
2caf0 72 75 63 74 20 70 72 6f 78 79 4c 6f 63 6b 69 6e  ruct proxyLockin
2cb00 67 43 6f 6e 74 65 78 74 20 70 72 6f 78 79 4c 6f  gContext proxyLo
2cb10 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 73 74  ckingContext;.st
2cb20 72 75 63 74 20 70 72 6f 78 79 4c 6f 63 6b 69 6e  ruct proxyLockin
2cb30 67 43 6f 6e 74 65 78 74 20 7b 0a 20 20 75 6e 69  gContext {.  uni
2cb40 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46 69 6c 65  xFile *conchFile
2cb50 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65  ;         /* Ope
2cb60 6e 20 63 6f 6e 63 68 20 66 69 6c 65 20 2a 2f 0a  n conch file */.
2cb70 20 20 63 68 61 72 20 2a 63 6f 6e 63 68 46 69 6c    char *conchFil
2cb80 65 50 61 74 68 3b 20 20 20 20 20 20 20 20 20 2f  ePath;         /
2cb90 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f  * Name of the co
2cba0 6e 63 68 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e  nch file */.  un
2cbb0 69 78 46 69 6c 65 20 2a 6c 6f 63 6b 50 72 6f 78  ixFile *lockProx
2cbc0 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70  y;         /* Op
2cbd0 65 6e 20 70 72 6f 78 79 20 6c 6f 63 6b 20 66 69  en proxy lock fi
2cbe0 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 6c 6f  le */.  char *lo
2cbf0 63 6b 50 72 6f 78 79 50 61 74 68 3b 20 20 20 20  ckProxyPath;    
2cc00 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
2cc10 74 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b 20 66  the proxy lock f
2cc20 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 64  ile */.  char *d
2cc30 62 50 61 74 68 3b 20 20 20 20 20 20 20 20 20 20  bPath;          
2cc40 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
2cc50 20 74 68 65 20 6f 70 65 6e 20 66 69 6c 65 20 2a   the open file *
2cc60 2f 0a 20 20 69 6e 74 20 63 6f 6e 63 68 48 65 6c  /.  int conchHel
2cc70 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
2cc80 20 2f 2a 20 31 20 69 66 20 74 68 65 20 63 6f 6e   /* 1 if the con
2cc90 63 68 20 69 73 20 68 65 6c 64 2c 20 2d 31 20 69  ch is held, -1 i
2cca0 66 20 6c 6f 63 6b 6c 65 73 73 20 2a 2f 0a 20 20  f lockless */.  
2ccb0 76 6f 69 64 20 2a 6f 6c 64 4c 6f 63 6b 69 6e 67  void *oldLocking
2ccc0 43 6f 6e 74 65 78 74 3b 20 20 20 20 20 2f 2a 20  Context;     /* 
2ccd0 4f 72 69 67 69 6e 61 6c 20 6c 6f 63 6b 69 6e 67  Original locking
2cce0 63 6f 6e 74 65 78 74 20 74 6f 20 72 65 73 74 6f  context to resto
2ccf0 72 65 20 6f 6e 20 63 6c 6f 73 65 20 2a 2f 0a 20  re on close */. 
2cd00 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
2cd10 6f 64 73 20 63 6f 6e 73 74 20 2a 70 4f 6c 64 4d  ods const *pOldM
2cd20 65 74 68 6f 64 3b 20 20 20 20 20 2f 2a 20 4f 72  ethod;     /* Or
2cd30 69 67 69 6e 61 6c 20 49 2f 4f 20 6d 65 74 68 6f  iginal I/O metho
2cd40 64 73 20 66 6f 72 20 63 6c 6f 73 65 20 2a 2f 0a  ds for close */.
2cd50 7d 3b 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 65 20 70  };../* .** The p
2cd60 72 6f 78 79 20 6c 6f 63 6b 20 66 69 6c 65 20 70  roxy lock file p
2cd70 61 74 68 20 66 6f 72 20 74 68 65 20 64 61 74 61  ath for the data
2cd80 62 61 73 65 20 61 74 20 64 62 50 61 74 68 20 69  base at dbPath i
2cd90 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 6c  s written into l
2cda0 50 61 74 68 2c 20 0a 2a 2a 20 77 68 69 63 68 20  Path, .** which 
2cdb0 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 76 61  must point to va
2cdc0 6c 69 64 2c 20 77 72 69 74 61 62 6c 65 20 6d 65  lid, writable me
2cdd0 6d 6f 72 79 20 6c 61 72 67 65 20 65 6e 6f 75 67  mory large enoug
2cde0 68 20 66 6f 72 20 61 20 6d 61 78 4c 65 6e 20 6c  h for a maxLen l
2cdf0 65 6e 67 74 68 0a 2a 2a 20 66 69 6c 65 20 70 61  ength.** file pa
2ce00 74 68 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69  th. .*/.static i
2ce10 6e 74 20 70 72 6f 78 79 47 65 74 4c 6f 63 6b 50  nt proxyGetLockP
2ce20 61 74 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ath(const char *
2ce30 64 62 50 61 74 68 2c 20 63 68 61 72 20 2a 6c 50  dbPath, char *lP
2ce40 61 74 68 2c 20 73 69 7a 65 5f 74 20 6d 61 78 4c  ath, size_t maxL
2ce50 65 6e 29 7b 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a  en){.  int len;.
2ce60 20 20 69 6e 74 20 64 62 4c 65 6e 3b 0a 20 20 69    int dbLen;.  i
2ce70 6e 74 20 69 3b 0a 0a 23 69 66 64 65 66 20 4c 4f  nt i;..#ifdef LO
2ce80 43 4b 50 52 4f 58 59 44 49 52 0a 20 20 6c 65 6e  CKPROXYDIR.  len
2ce90 20 3d 20 73 74 72 6c 63 70 79 28 6c 50 61 74 68   = strlcpy(lPath
2cea0 2c 20 4c 4f 43 4b 50 52 4f 58 59 44 49 52 2c 20  , LOCKPROXYDIR, 
2ceb0 6d 61 78 4c 65 6e 29 3b 0a 23 65 6c 73 65 0a 23  maxLen);.#else.#
2cec0 20 69 66 64 65 66 20 5f 43 53 5f 44 41 52 57 49   ifdef _CS_DARWI
2ced0 4e 5f 55 53 45 52 5f 54 45 4d 50 5f 44 49 52 0a  N_USER_TEMP_DIR.
2cee0 20 20 7b 0a 20 20 20 20 69 66 28 20 21 63 6f 6e    {.    if( !con
2cef0 66 73 74 72 28 5f 43 53 5f 44 41 52 57 49 4e 5f  fstr(_CS_DARWIN_
2cf00 55 53 45 52 5f 54 45 4d 50 5f 44 49 52 2c 20 6c  USER_TEMP_DIR, l
2cf10 50 61 74 68 2c 20 6d 61 78 4c 65 6e 29 20 29 7b  Path, maxLen) ){
2cf20 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
2cf30 22 47 45 54 4c 4f 43 4b 50 41 54 48 20 20 66 61  "GETLOCKPATH  fa
2cf40 69 6c 65 64 20 25 73 20 65 72 72 6e 6f 3d 25 64  iled %s errno=%d
2cf50 20 70 69 64 3d 25 64 5c 6e 22 2c 0a 20 20 20 20   pid=%d\n",.    
2cf60 20 20 20 20 20 20 20 20 20 20 20 6c 50 61 74 68             lPath
2cf70 2c 20 65 72 72 6e 6f 2c 20 67 65 74 70 69 64 28  , errno, getpid(
2cf80 29 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  )));.      retur
2cf90 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c  n SQLITE_IOERR_L
2cfa0 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c  OCK;.    }.    l
2cfb0 65 6e 20 3d 20 73 74 72 6c 63 61 74 28 6c 50 61  en = strlcat(lPa
2cfc0 74 68 2c 20 22 73 71 6c 69 74 65 70 6c 6f 63 6b  th, "sqliteplock
2cfd0 73 22 2c 20 6d 61 78 4c 65 6e 29 3b 20 20 20 20  s", maxLen);    
2cfe0 0a 20 20 7d 0a 23 20 65 6c 73 65 0a 20 20 6c 65  .  }.# else.  le
2cff0 6e 20 3d 20 73 74 72 6c 63 70 79 28 6c 50 61 74  n = strlcpy(lPat
2d000 68 2c 20 22 2f 74 6d 70 2f 22 2c 20 6d 61 78 4c  h, "/tmp/", maxL
2d010 65 6e 29 3b 0a 23 20 65 6e 64 69 66 0a 23 65 6e  en);.# endif.#en
2d020 64 69 66 0a 0a 20 20 69 66 28 20 6c 50 61 74 68  dif..  if( lPath
2d030 5b 6c 65 6e 2d 31 5d 21 3d 27 2f 27 20 29 7b 0a  [len-1]!='/' ){.
2d040 20 20 20 20 6c 65 6e 20 3d 20 73 74 72 6c 63 61      len = strlca
2d050 74 28 6c 50 61 74 68 2c 20 22 2f 22 2c 20 6d 61  t(lPath, "/", ma
2d060 78 4c 65 6e 29 3b 0a 20 20 7d 0a 20 20 0a 20 20  xLen);.  }.  .  
2d070 2f 2a 20 74 72 61 6e 73 66 6f 72 6d 20 74 68 65  /* transform the
2d080 20 64 62 20 70 61 74 68 20 74 6f 20 61 20 75 6e   db path to a un
2d090 69 71 75 65 20 63 61 63 68 65 20 6e 61 6d 65 20  ique cache name 
2d0a0 2a 2f 0a 20 20 64 62 4c 65 6e 20 3d 20 28 69 6e  */.  dbLen = (in
2d0b0 74 29 73 74 72 6c 65 6e 28 64 62 50 61 74 68 29  t)strlen(dbPath)
2d0c0 3b 0a 20 20 66 6f 72 28 20 69 3d 30 3b 20 69 3c  ;.  for( i=0; i<
2d0d0 64 62 4c 65 6e 20 26 26 20 28 69 2b 6c 65 6e 2b  dbLen && (i+len+
2d0e0 37 29 3c 28 69 6e 74 29 6d 61 78 4c 65 6e 3b 20  7)<(int)maxLen; 
2d0f0 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72 20 63  i++){.    char c
2d100 20 3d 20 64 62 50 61 74 68 5b 69 5d 3b 0a 20 20   = dbPath[i];.  
2d110 20 20 6c 50 61 74 68 5b 69 2b 6c 65 6e 5d 20 3d    lPath[i+len] =
2d120 20 28 63 3d 3d 27 2f 27 29 3f 27 5f 27 3a 63 3b   (c=='/')?'_':c;
2d130 0a 20 20 7d 0a 20 20 6c 50 61 74 68 5b 69 2b 6c  .  }.  lPath[i+l
2d140 65 6e 5d 3d 27 5c 30 27 3b 0a 20 20 73 74 72 6c  en]='\0';.  strl
2d150 63 61 74 28 6c 50 61 74 68 2c 20 22 3a 61 75 74  cat(lPath, ":aut
2d160 6f 3a 22 2c 20 6d 61 78 4c 65 6e 29 3b 0a 20 20  o:", maxLen);.  
2d170 4f 53 54 52 41 43 45 28 28 22 47 45 54 4c 4f 43  OSTRACE(("GETLOC
2d180 4b 50 41 54 48 20 20 70 72 6f 78 79 20 6c 6f 63  KPATH  proxy loc
2d190 6b 20 70 61 74 68 3d 25 73 20 70 69 64 3d 25 64  k path=%s pid=%d
2d1a0 5c 6e 22 2c 20 6c 50 61 74 68 2c 20 67 65 74 70  \n", lPath, getp
2d1b0 69 64 28 29 29 29 3b 0a 20 20 72 65 74 75 72 6e  id()));.  return
2d1c0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
2d1d0 2a 20 0a 20 2a 2a 20 43 72 65 61 74 65 73 20 74  * . ** Creates t
2d1e0 68 65 20 6c 6f 63 6b 20 66 69 6c 65 20 61 6e 64  he lock file and
2d1f0 20 61 6e 79 20 6d 69 73 73 69 6e 67 20 64 69 72   any missing dir
2d200 65 63 74 6f 72 69 65 73 20 69 6e 20 6c 6f 63 6b  ectories in lock
2d210 50 61 74 68 0a 20 2a 2f 0a 73 74 61 74 69 63 20  Path. */.static 
2d220 69 6e 74 20 70 72 6f 78 79 43 72 65 61 74 65 4c  int proxyCreateL
2d230 6f 63 6b 50 61 74 68 28 63 6f 6e 73 74 20 63 68  ockPath(const ch
2d240 61 72 20 2a 6c 6f 63 6b 50 61 74 68 29 7b 0a 20  ar *lockPath){. 
2d250 20 69 6e 74 20 69 2c 20 6c 65 6e 3b 0a 20 20 63   int i, len;.  c
2d260 68 61 72 20 62 75 66 5b 4d 41 58 50 41 54 48 4c  har buf[MAXPATHL
2d270 45 4e 5d 3b 0a 20 20 69 6e 74 20 73 74 61 72 74  EN];.  int start
2d280 20 3d 20 30 3b 0a 20 20 0a 20 20 61 73 73 65 72   = 0;.  .  asser
2d290 74 28 6c 6f 63 6b 50 61 74 68 21 3d 4e 55 4c 4c  t(lockPath!=NULL
2d2a0 29 3b 0a 20 20 2f 2a 20 74 72 79 20 74 6f 20 63  );.  /* try to c
2d2b0 72 65 61 74 65 20 61 6c 6c 20 74 68 65 20 69 6e  reate all the in
2d2c0 74 65 72 6d 65 64 69 61 74 65 20 64 69 72 65 63  termediate direc
2d2d0 74 6f 72 69 65 73 20 2a 2f 0a 20 20 6c 65 6e 20  tories */.  len 
2d2e0 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 6c 6f  = (int)strlen(lo
2d2f0 63 6b 50 61 74 68 29 3b 0a 20 20 62 75 66 5b 30  ckPath);.  buf[0
2d300 5d 20 3d 20 6c 6f 63 6b 50 61 74 68 5b 30 5d 3b  ] = lockPath[0];
2d310 0a 20 20 66 6f 72 28 20 69 3d 31 3b 20 69 3c 6c  .  for( i=1; i<l
2d320 65 6e 3b 20 69 2b 2b 20 29 7b 0a 20 20 20 20 69  en; i++ ){.    i
2d330 66 28 20 6c 6f 63 6b 50 61 74 68 5b 69 5d 20 3d  f( lockPath[i] =
2d340 3d 20 27 2f 27 20 26 26 20 28 69 20 2d 20 73 74  = '/' && (i - st
2d350 61 72 74 20 3e 20 30 29 20 29 7b 0a 20 20 20 20  art > 0) ){.    
2d360 20 20 2f 2a 20 6f 6e 6c 79 20 6d 6b 64 69 72 20    /* only mkdir 
2d370 69 66 20 6c 65 61 66 20 64 69 72 20 21 3d 20 22  if leaf dir != "
2d380 2e 22 20 6f 72 20 22 2f 22 20 6f 72 20 22 2e 2e  ." or "/" or "..
2d390 22 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69  " */.      if( i
2d3a0 2d 73 74 61 72 74 3e 32 20 7c 7c 20 28 69 2d 73  -start>2 || (i-s
2d3b0 74 61 72 74 3d 3d 31 20 26 26 20 62 75 66 5b 73  tart==1 && buf[s
2d3c0 74 61 72 74 5d 20 21 3d 20 27 2e 27 20 26 26 20  tart] != '.' && 
2d3d0 62 75 66 5b 73 74 61 72 74 5d 20 21 3d 20 27 2f  buf[start] != '/
2d3e0 27 29 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  ') .         || 
2d3f0 28 69 2d 73 74 61 72 74 3d 3d 32 20 26 26 20 62  (i-start==2 && b
2d400 75 66 5b 73 74 61 72 74 5d 20 21 3d 20 27 2e 27  uf[start] != '.'
2d410 20 26 26 20 62 75 66 5b 73 74 61 72 74 2b 31 5d   && buf[start+1]
2d420 20 21 3d 20 27 2e 27 29 20 29 7b 0a 20 20 20 20   != '.') ){.    
2d430 20 20 20 20 62 75 66 5b 69 5d 3d 27 5c 30 27 3b      buf[i]='\0';
2d440 0a 20 20 20 20 20 20 20 20 69 66 28 20 6d 6b 64  .        if( mkd
2d450 69 72 28 62 75 66 2c 20 53 51 4c 49 54 45 5f 44  ir(buf, SQLITE_D
2d460 45 46 41 55 4c 54 5f 50 52 4f 58 59 44 49 52 5f  EFAULT_PROXYDIR_
2d470 50 45 52 4d 49 53 53 49 4f 4e 53 29 20 29 7b 0a  PERMISSIONS) ){.
2d480 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 65 72            int er
2d490 72 3d 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20  r=errno;.       
2d4a0 20 20 20 69 66 28 20 65 72 72 21 3d 45 45 58 49     if( err!=EEXI
2d4b0 53 54 20 29 20 7b 0a 20 20 20 20 20 20 20 20 20  ST ) {.         
2d4c0 20 20 20 4f 53 54 52 41 43 45 28 28 22 43 52 45     OSTRACE(("CRE
2d4d0 41 54 45 4c 4f 43 4b 50 41 54 48 20 20 46 41 49  ATELOCKPATH  FAI
2d4e0 4c 45 44 20 63 72 65 61 74 69 6e 67 20 25 73 2c  LED creating %s,
2d4f0 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   ".             
2d500 20 20 20 20 20 20 20 20 22 27 25 73 27 20 70 72          "'%s' pr
2d510 6f 78 79 20 6c 6f 63 6b 20 70 61 74 68 3d 25 73  oxy lock path=%s
2d520 20 70 69 64 3d 25 64 5c 6e 22 2c 0a 20 20 20 20   pid=%d\n",.    
2d530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d540 20 62 75 66 2c 20 73 74 72 65 72 72 6f 72 28 65   buf, strerror(e
2d550 72 72 29 2c 20 6c 6f 63 6b 50 61 74 68 2c 20 67  rr), lockPath, g
2d560 65 74 70 69 64 28 29 29 29 3b 0a 20 20 20 20 20  etpid()));.     
2d570 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 65 72         return er
2d580 72 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  r;.          }. 
2d590 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2d5a0 0a 20 20 20 20 20 20 73 74 61 72 74 3d 69 2b 31  .      start=i+1
2d5b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 75 66 5b  ;.    }.    buf[
2d5c0 69 5d 20 3d 20 6c 6f 63 6b 50 61 74 68 5b 69 5d  i] = lockPath[i]
2d5d0 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28  ;.  }.  OSTRACE(
2d5e0 28 22 43 52 45 41 54 45 4c 4f 43 4b 50 41 54 48  ("CREATELOCKPATH
2d5f0 20 20 70 72 6f 78 79 20 6c 6f 63 6b 20 70 61 74    proxy lock pat
2d600 68 3d 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c 20  h=%s pid=%d\n", 
2d610 6c 6f 63 6b 50 61 74 68 2c 20 67 65 74 70 69 64  lockPath, getpid
2d620 28 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 30  ()));.  return 0
2d630 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.}..static int 
2d640 69 73 50 72 6f 78 79 4c 6f 63 6b 69 6e 67 4d 6f  isProxyLockingMo
2d650 64 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  de(unixFile *pFi
2d660 6c 65 29 20 7b 0a 20 20 72 65 74 75 72 6e 20 28  le) {.  return (
2d670 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 20 3d  pFile->pMethod =
2d680 3d 20 26 70 72 6f 78 79 49 6f 4d 65 74 68 6f 64  = &proxyIoMethod
2d690 73 29 20 3f 20 31 20 3a 20 30 3b 0a 7d 0a 0a 2f  s) ? 1 : 0;.}../
2d6a0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
2d6b0 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 62 61  shared memory ba
2d6c0 73 65 20 70 61 74 68 20 62 61 73 65 64 20 6f 6e  se path based on
2d6d0 20 74 68 65 20 6c 6f 63 6b 20 70 72 6f 78 79 20   the lock proxy 
2d6e0 66 69 6c 65 20 69 66 20 74 68 65 20 0a 2a 2a 20  file if the .** 
2d6f0 6c 6f 63 6b 20 70 72 6f 78 79 20 66 69 6c 65 20  lock proxy file 
2d700 69 73 20 68 6f 73 74 65 64 20 6f 6e 20 61 20 73  is hosted on a s
2d710 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 63 6f 6d  hared memory com
2d720 70 61 74 69 62 6c 65 20 46 53 0a 2a 2f 0a 73 74  patible FS.*/.st
2d730 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
2d740 2a 70 72 6f 78 79 53 68 61 72 65 64 4d 65 6d 6f  *proxySharedMemo
2d750 72 79 42 61 73 65 50 61 74 68 28 75 6e 69 78 46  ryBasePath(unixF
2d760 69 6c 65 20 2a 70 46 69 6c 65 29 20 7b 0a 20 20  ile *pFile) {.  
2d770 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
2d780 65 78 74 20 2a 70 43 74 78 3b 0a 20 20 75 6e 69  ext *pCtx;.  uni
2d790 78 46 69 6c 65 20 2a 70 4c 6f 63 6b 46 69 6c 65  xFile *pLockFile
2d7a0 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 70 46  ;.  .  assert(pF
2d7b0 69 6c 65 21 3d 4e 55 4c 4c 20 26 26 20 70 46 69  ile!=NULL && pFi
2d7c0 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
2d7d0 78 74 21 3d 4e 55 4c 4c 29 3b 0a 20 20 61 73 73  xt!=NULL);.  ass
2d7e0 65 72 74 28 70 46 69 6c 65 2d 3e 70 4d 65 74 68  ert(pFile->pMeth
2d7f0 6f 64 20 3d 3d 20 26 70 72 6f 78 79 49 6f 4d 65  od == &proxyIoMe
2d800 74 68 6f 64 73 29 3b 0a 20 20 70 43 74 78 20 3d  thods);.  pCtx =
2d810 20 28 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43   ((proxyLockingC
2d820 6f 6e 74 65 78 74 20 2a 29 28 70 46 69 6c 65 2d  ontext *)(pFile-
2d830 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29  >lockingContext)
2d840 29 3b 0a 20 20 70 4c 6f 63 6b 46 69 6c 65 20 3d  );.  pLockFile =
2d850 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79   pCtx->lockProxy
2d860 3b 0a 20 20 69 66 28 20 70 4c 6f 63 6b 46 69 6c  ;.  if( pLockFil
2d870 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 69 56 65 72  e->pMethod->iVer
2d880 73 69 6f 6e 3e 3d 32 20 26 26 20 70 4c 6f 63 6b  sion>=2 && pLock
2d890 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78  File->pMethod->x
2d8a0 53 68 6d 4d 61 70 21 3d 30 20 29 7b 0a 20 20 20  ShmMap!=0 ){.   
2d8b0 20 72 65 74 75 72 6e 20 70 43 74 78 2d 3e 6c 6f   return pCtx->lo
2d8c0 63 6b 50 72 6f 78 79 50 61 74 68 3b 0a 20 20 7d  ckProxyPath;.  }
2d8d0 0a 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a  .  return NULL;.
2d8e0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
2d8f0 61 20 6e 65 77 20 56 46 53 20 66 69 6c 65 20 64  a new VFS file d
2d900 65 73 63 72 69 70 74 6f 72 20 28 73 74 6f 72 65  escriptor (store
2d910 64 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61  d in memory obta
2d920 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c  ined from.** sql
2d930 69 74 65 33 5f 6d 61 6c 6c 6f 63 29 20 61 6e 64  ite3_malloc) and
2d940 20 6f 70 65 6e 20 74 68 65 20 66 69 6c 65 20 6e   open the file n
2d950 61 6d 65 64 20 22 70 61 74 68 22 20 69 6e 20 74  amed "path" in t
2d960 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
2d970 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61  or..**.** The ca
2d980 6c 6c 65 72 20 69 73 20 72 65 73 70 6f 6e 73 69  ller is responsi
2d990 62 6c 65 20 6e 6f 74 20 6f 6e 6c 79 20 66 6f 72  ble not only for
2d9a0 20 63 6c 6f 73 69 6e 67 20 74 68 65 20 66 69 6c   closing the fil
2d9b0 65 20 64 65 73 63 72 69 70 74 6f 72 0a 2a 2a 20  e descriptor.** 
2d9c0 62 75 74 20 61 6c 73 6f 20 66 6f 72 20 66 72 65  but also for fre
2d9d0 65 69 6e 67 20 74 68 65 20 6d 65 6d 6f 72 79 20  eing the memory 
2d9e0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
2d9f0 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
2da00 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  tor..*/.static i
2da10 6e 74 20 70 72 6f 78 79 43 72 65 61 74 65 55 6e  nt proxyCreateUn
2da20 69 78 46 69 6c 65 28 0a 20 20 20 20 63 6f 6e 73  ixFile(.    cons
2da30 74 20 63 68 61 72 20 2a 70 61 74 68 2c 20 20 20  t char *path,   
2da40 20 20 20 20 20 2f 2a 20 70 61 74 68 20 66 6f 72       /* path for
2da50 20 74 68 65 20 6e 65 77 20 75 6e 69 78 46 69 6c   the new unixFil
2da60 65 20 2a 2f 0a 20 20 20 20 75 6e 69 78 46 69 6c  e */.    unixFil
2da70 65 20 2a 2a 70 70 46 69 6c 65 2c 20 20 20 20 20  e **ppFile,     
2da80 20 20 2f 2a 20 75 6e 69 78 46 69 6c 65 20 63 72    /* unixFile cr
2da90 65 61 74 65 64 20 61 6e 64 20 72 65 74 75 72 6e  eated and return
2daa0 65 64 20 62 79 20 72 65 66 20 2a 2f 0a 20 20 20  ed by ref */.   
2dab0 20 69 6e 74 20 69 73 6c 6f 63 6b 66 69 6c 65 20   int islockfile 
2dac0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 66 20            /* if 
2dad0 6e 6f 6e 20 7a 65 72 6f 20 6d 69 73 73 69 6e 67  non zero missing
2dae0 20 64 69 72 73 20 77 69 6c 6c 20 62 65 20 63 72   dirs will be cr
2daf0 65 61 74 65 64 20 2a 2f 0a 29 20 7b 0a 20 20 69  eated */.) {.  i
2db00 6e 74 20 66 64 20 3d 20 2d 31 3b 0a 20 20 69 6e  nt fd = -1;.  in
2db10 74 20 64 69 72 66 64 20 3d 20 2d 31 3b 0a 20 20  t dirfd = -1;.  
2db20 75 6e 69 78 46 69 6c 65 20 2a 70 4e 65 77 3b 0a  unixFile *pNew;.
2db30 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
2db40 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6f 70 65 6e  E_OK;.  int open
2db50 46 6c 61 67 73 20 3d 20 4f 5f 52 44 57 52 20 7c  Flags = O_RDWR |
2db60 20 4f 5f 43 52 45 41 54 3b 0a 20 20 73 71 6c 69   O_CREAT;.  sqli
2db70 74 65 33 5f 76 66 73 20 64 75 6d 6d 79 56 66 73  te3_vfs dummyVfs
2db80 3b 0a 20 20 69 6e 74 20 74 65 72 72 6e 6f 20 3d  ;.  int terrno =
2db90 20 30 3b 0a 20 20 55 6e 69 78 55 6e 75 73 65 64   0;.  UnixUnused
2dba0 46 64 20 2a 70 55 6e 75 73 65 64 20 3d 20 4e 55  Fd *pUnused = NU
2dbb0 4c 4c 3b 0a 0a 20 20 2f 2a 20 31 2e 20 66 69 72  LL;..  /* 1. fir
2dbc0 73 74 20 74 72 79 20 74 6f 20 6f 70 65 6e 2f 63  st try to open/c
2dbd0 72 65 61 74 65 20 74 68 65 20 66 69 6c 65 0a 20  reate the file. 
2dbe0 20 2a 2a 20 32 2e 20 69 66 20 74 68 61 74 20 66   ** 2. if that f
2dbf0 61 69 6c 73 2c 20 61 6e 64 20 74 68 69 73 20 69  ails, and this i
2dc00 73 20 61 20 6c 6f 63 6b 20 66 69 6c 65 20 28 6e  s a lock file (n
2dc10 6f 74 2d 63 6f 6e 63 68 29 2c 20 74 72 79 20 63  ot-conch), try c
2dc20 72 65 61 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65  reating.  ** the
2dc30 20 70 61 72 65 6e 74 20 64 69 72 65 63 74 6f 72   parent director
2dc40 69 65 73 20 61 6e 64 20 74 68 65 6e 20 74 72 79  ies and then try
2dc50 20 61 67 61 69 6e 2e 0a 20 20 2a 2a 20 33 2e 20   again..  ** 3. 
2dc60 69 66 20 74 68 61 74 20 66 61 69 6c 73 2c 20 74  if that fails, t
2dc70 72 79 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 66  ry to open the f
2dc80 69 6c 65 20 72 65 61 64 2d 6f 6e 6c 79 0a 20 20  ile read-only.  
2dc90 2a 2a 20 6f 74 68 65 72 77 69 73 65 20 72 65 74  ** otherwise ret
2dca0 75 72 6e 20 42 55 53 59 20 28 69 66 20 6c 6f 63  urn BUSY (if loc
2dcb0 6b 20 66 69 6c 65 29 20 6f 72 20 43 41 4e 54 4f  k file) or CANTO
2dcc0 50 45 4e 20 66 6f 72 20 74 68 65 20 63 6f 6e 63  PEN for the conc
2dcd0 68 20 66 69 6c 65 0a 20 20 2a 2f 0a 20 20 70 55  h file.  */.  pU
2dce0 6e 75 73 65 64 20 3d 20 66 69 6e 64 52 65 75 73  nused = findReus
2dcf0 61 62 6c 65 46 64 28 70 61 74 68 2c 20 6f 70 65  ableFd(path, ope
2dd00 6e 46 6c 61 67 73 29 3b 0a 20 20 69 66 28 20 70  nFlags);.  if( p
2dd10 55 6e 75 73 65 64 20 29 7b 0a 20 20 20 20 66 64  Unused ){.    fd
2dd20 20 3d 20 70 55 6e 75 73 65 64 2d 3e 66 64 3b 0a   = pUnused->fd;.
2dd30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 55 6e    }else{.    pUn
2dd40 75 73 65 64 20 3d 20 73 71 6c 69 74 65 33 5f 6d  used = sqlite3_m
2dd50 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 70 55  alloc(sizeof(*pU
2dd60 6e 75 73 65 64 29 29 3b 0a 20 20 20 20 69 66 28  nused));.    if(
2dd70 20 21 70 55 6e 75 73 65 64 20 29 7b 0a 20 20 20   !pUnused ){.   
2dd80 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2dd90 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20  _NOMEM;.    }.  
2dda0 7d 0a 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a  }.  if( fd<0 ){.
2ddb0 20 20 20 20 66 64 20 3d 20 6f 70 65 6e 28 70 61      fd = open(pa
2ddc0 74 68 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20 53  th, openFlags, S
2ddd0 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49  QLITE_DEFAULT_FI
2dde0 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 29 3b  LE_PERMISSIONS);
2ddf0 0a 20 20 20 20 74 65 72 72 6e 6f 20 3d 20 65 72  .    terrno = er
2de00 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20 66 64 3c  rno;.    if( fd<
2de10 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 4e 4f 45  0 && errno==ENOE
2de20 4e 54 20 26 26 20 69 73 6c 6f 63 6b 66 69 6c 65  NT && islockfile
2de30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 72   ){.      if( pr
2de40 6f 78 79 43 72 65 61 74 65 4c 6f 63 6b 50 61 74  oxyCreateLockPat
2de50 68 28 70 61 74 68 29 20 3d 3d 20 53 51 4c 49 54  h(path) == SQLIT
2de60 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2de70 66 64 20 3d 20 6f 70 65 6e 28 70 61 74 68 2c 20  fd = open(path, 
2de80 6f 70 65 6e 46 6c 61 67 73 2c 20 53 51 4c 49 54  openFlags, SQLIT
2de90 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50  E_DEFAULT_FILE_P
2dea0 45 52 4d 49 53 53 49 4f 4e 53 29 3b 0a 20 20 20  ERMISSIONS);.   
2deb0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
2dec0 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20   if( fd<0 ){.   
2ded0 20 6f 70 65 6e 46 6c 61 67 73 20 3d 20 4f 5f 52   openFlags = O_R
2dee0 44 4f 4e 4c 59 3b 0a 20 20 20 20 66 64 20 3d 20  DONLY;.    fd = 
2def0 6f 70 65 6e 28 70 61 74 68 2c 20 6f 70 65 6e 46  open(path, openF
2df00 6c 61 67 73 2c 20 53 51 4c 49 54 45 5f 44 45 46  lags, SQLITE_DEF
2df10 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53  AULT_FILE_PERMIS
2df20 53 49 4f 4e 53 29 3b 0a 20 20 20 20 74 65 72 72  SIONS);.    terr
2df30 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 7d 0a  no = errno;.  }.
2df40 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20    if( fd<0 ){.  
2df50 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
2df60 55 6e 75 73 65 64 29 3b 0a 20 20 20 20 69 66 28  Unused);.    if(
2df70 20 69 73 6c 6f 63 6b 66 69 6c 65 20 29 7b 0a 20   islockfile ){. 
2df80 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2df90 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a 20  TE_BUSY;.    }. 
2dfa0 20 20 20 73 77 69 74 63 68 20 28 74 65 72 72 6e     switch (terrn
2dfb0 6f 29 20 7b 0a 20 20 20 20 20 20 63 61 73 65 20  o) {.      case 
2dfc0 45 41 43 43 45 53 3a 0a 20 20 20 20 20 20 20 20  EACCES:.        
2dfd0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45  return SQLITE_PE
2dfe0 52 4d 3b 0a 20 20 20 20 20 20 63 61 73 65 20 45  RM;.      case E
2dff0 49 4f 3a 20 0a 20 20 20 20 20 20 20 20 72 65 74  IO: .        ret
2e000 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
2e010 5f 4c 4f 43 4b 3b 20 2f 2a 20 65 76 65 6e 20 74  _LOCK; /* even t
2e020 68 6f 75 67 68 20 69 74 20 69 73 20 74 68 65 20  hough it is the 
2e030 63 6f 6e 63 68 20 2a 2f 0a 20 20 20 20 20 20 64  conch */.      d
2e040 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 20 20  efault:.        
2e050 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41  return SQLITE_CA
2e060 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20  NTOPEN_BKPT;.   
2e070 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 70 4e 65 77   }.  }.  .  pNew
2e080 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 73   = (unixFile *)s
2e090 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69  qlite3_malloc(si
2e0a0 7a 65 6f 66 28 2a 70 4e 65 77 29 29 3b 0a 20 20  zeof(*pNew));.  
2e0b0 69 66 28 20 70 4e 65 77 3d 3d 4e 55 4c 4c 20 29  if( pNew==NULL )
2e0c0 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
2e0d0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74  E_NOMEM;.    got
2e0e0 6f 20 65 6e 64 5f 63 72 65 61 74 65 5f 70 72 6f  o end_create_pro
2e0f0 78 79 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74  xy;.  }.  memset
2e100 28 70 4e 65 77 2c 20 30 2c 20 73 69 7a 65 6f 66  (pNew, 0, sizeof
2e110 28 75 6e 69 78 46 69 6c 65 29 29 3b 0a 20 20 70  (unixFile));.  p
2e120 4e 65 77 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d  New->openFlags =
2e130 20 6f 70 65 6e 46 6c 61 67 73 3b 0a 20 20 64 75   openFlags;.  du
2e140 6d 6d 79 56 66 73 2e 70 41 70 70 44 61 74 61 20  mmyVfs.pAppData 
2e150 3d 20 28 76 6f 69 64 2a 29 26 61 75 74 6f 6c 6f  = (void*)&autolo
2e160 63 6b 49 6f 46 69 6e 64 65 72 3b 0a 20 20 70 55  ckIoFinder;.  pU
2e170 6e 75 73 65 64 2d 3e 66 64 20 3d 20 66 64 3b 0a  nused->fd = fd;.
2e180 20 20 70 55 6e 75 73 65 64 2d 3e 66 6c 61 67 73    pUnused->flags
2e190 20 3d 20 6f 70 65 6e 46 6c 61 67 73 3b 0a 20 20   = openFlags;.  
2e1a0 70 4e 65 77 2d 3e 70 55 6e 75 73 65 64 20 3d 20  pNew->pUnused = 
2e1b0 70 55 6e 75 73 65 64 3b 0a 20 20 0a 20 20 72 63  pUnused;.  .  rc
2e1c0 20 3d 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c   = fillInUnixFil
2e1d0 65 28 26 64 75 6d 6d 79 56 66 73 2c 20 66 64 2c  e(&dummyVfs, fd,
2e1e0 20 64 69 72 66 64 2c 20 28 73 71 6c 69 74 65 33   dirfd, (sqlite3
2e1f0 5f 66 69 6c 65 2a 29 70 4e 65 77 2c 20 70 61 74  _file*)pNew, pat
2e200 68 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20  h, 0, 0);.  if( 
2e210 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2e220 0a 20 20 20 20 2a 70 70 46 69 6c 65 20 3d 20 70  .    *ppFile = p
2e230 4e 65 77 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  New;.    return 
2e240 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 65  SQLITE_OK;.  }.e
2e250 6e 64 5f 63 72 65 61 74 65 5f 70 72 6f 78 79 3a  nd_create_proxy:
2e260 20 20 20 20 0a 20 20 63 6c 6f 73 65 28 66 64 29      .  close(fd)
2e270 3b 20 2f 2a 20 73 69 6c 65 6e 74 6c 79 20 6c 65  ; /* silently le
2e280 61 6b 20 66 64 20 69 66 20 65 72 72 6f 72 2c 20  ak fd if error, 
2e290 77 65 27 72 65 20 61 6c 72 65 61 64 79 20 69 6e  we're already in
2e2a0 20 65 72 72 6f 72 20 2a 2f 0a 20 20 73 71 6c 69   error */.  sqli
2e2b0 74 65 33 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a  te3_free(pNew);.
2e2c0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
2e2d0 55 6e 75 73 65 64 29 3b 0a 20 20 72 65 74 75 72  Unused);.  retur
2e2e0 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  n rc;.}..#ifdef 
2e2f0 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 20 73  SQLITE_TEST./* s
2e300 69 6d 75 6c 61 74 65 20 6d 75 6c 74 69 70 6c 65  imulate multiple
2e310 20 68 6f 73 74 73 20 62 79 20 63 72 65 61 74 69   hosts by creati
2e320 6e 67 20 75 6e 69 71 75 65 20 68 6f 73 74 69 64  ng unique hostid
2e330 20 66 69 6c 65 20 70 61 74 68 73 20 2a 2f 0a 69   file paths */.i
2e340 6e 74 20 73 71 6c 69 74 65 33 5f 68 6f 73 74 69  nt sqlite3_hosti
2e350 64 5f 6e 75 6d 20 3d 20 30 3b 0a 23 65 6e 64 69  d_num = 0;.#endi
2e360 66 0a 0a 23 64 65 66 69 6e 65 20 50 52 4f 58 59  f..#define PROXY
2e370 5f 48 4f 53 54 49 44 4c 45 4e 20 20 20 20 31 36  _HOSTIDLEN    16
2e380 20 20 2f 2a 20 63 6f 6e 63 68 20 66 69 6c 65 20    /* conch file 
2e390 68 6f 73 74 20 69 64 20 6c 65 6e 67 74 68 20 2a  host id length *
2e3a0 2f 0a 0a 2f 2a 20 4e 6f 74 20 61 6c 77 61 79 73  /../* Not always
2e3b0 20 64 65 66 69 6e 65 64 20 69 6e 20 74 68 65 20   defined in the 
2e3c0 68 65 61 64 65 72 73 20 61 73 20 69 74 20 6f 75  headers as it ou
2e3d0 67 68 74 20 74 6f 20 62 65 20 2a 2f 0a 65 78 74  ght to be */.ext
2e3e0 65 72 6e 20 69 6e 74 20 67 65 74 68 6f 73 74 75  ern int gethostu
2e3f0 75 69 64 28 75 75 69 64 5f 74 20 69 64 2c 20 63  uid(uuid_t id, c
2e400 6f 6e 73 74 20 73 74 72 75 63 74 20 74 69 6d 65  onst struct time
2e410 73 70 65 63 20 2a 77 61 69 74 29 3b 0a 0a 2f 2a  spec *wait);../*
2e420 20 67 65 74 20 74 68 65 20 68 6f 73 74 20 49 44   get the host ID
2e430 20 76 69 61 20 67 65 74 68 6f 73 74 75 75 69 64   via gethostuuid
2e440 28 29 2c 20 70 48 6f 73 74 49 44 20 6d 75 73 74  (), pHostID must
2e450 20 70 6f 69 6e 74 20 74 6f 20 50 52 4f 58 59 5f   point to PROXY_
2e460 48 4f 53 54 49 44 4c 45 4e 20 0a 2a 2a 20 62 79  HOSTIDLEN .** by
2e470 74 65 73 20 6f 66 20 77 72 69 74 61 62 6c 65 20  tes of writable 
2e480 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69  memory..*/.stati
2e490 63 20 69 6e 74 20 70 72 6f 78 79 47 65 74 48 6f  c int proxyGetHo
2e4a0 73 74 49 44 28 75 6e 73 69 67 6e 65 64 20 63 68  stID(unsigned ch
2e4b0 61 72 20 2a 70 48 6f 73 74 49 44 2c 20 69 6e 74  ar *pHostID, int
2e4c0 20 2a 70 45 72 72 6f 72 29 7b 0a 20 20 73 74 72   *pError){.  str
2e4d0 75 63 74 20 74 69 6d 65 73 70 65 63 20 74 69 6d  uct timespec tim
2e4e0 65 6f 75 74 20 3d 20 7b 31 2c 20 30 7d 3b 20 2f  eout = {1, 0}; /
2e4f0 2a 20 31 20 73 65 63 20 74 69 6d 65 6f 75 74 20  * 1 sec timeout 
2e500 2a 2f 0a 20 20 0a 20 20 61 73 73 65 72 74 28 50  */.  .  assert(P
2e510 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 20 3d  ROXY_HOSTIDLEN =
2e520 3d 20 73 69 7a 65 6f 66 28 75 75 69 64 5f 74 29  = sizeof(uuid_t)
2e530 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70 48 6f 73  );.  memset(pHos
2e540 74 49 44 2c 20 30 2c 20 50 52 4f 58 59 5f 48 4f  tID, 0, PROXY_HO
2e550 53 54 49 44 4c 45 4e 29 3b 0a 23 69 66 20 64 65  STIDLEN);.#if de
2e560 66 69 6e 65 64 28 5f 5f 4d 41 58 5f 4f 53 5f 58  fined(__MAX_OS_X
2e570 5f 56 45 52 53 49 4f 4e 5f 4d 49 4e 5f 52 45 51  _VERSION_MIN_REQ
2e580 55 49 52 45 44 29 5c 0a 20 20 20 20 20 20 20 20  UIRED)\.        
2e590 20 20 20 20 20 20 20 26 26 20 5f 5f 4d 41 43 5f         && __MAC_
2e5a0 4f 53 5f 58 5f 56 45 52 53 49 4f 4e 5f 4d 49 4e  OS_X_VERSION_MIN
2e5b0 5f 52 45 51 55 49 52 45 44 3c 31 30 35 30 0a 20  _REQUIRED<1050. 
2e5c0 20 69 66 28 20 67 65 74 68 6f 73 74 75 75 69 64   if( gethostuuid
2e5d0 28 70 48 6f 73 74 49 44 2c 20 26 74 69 6d 65 6f  (pHostID, &timeo
2e5e0 75 74 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 65  ut) ){.    int e
2e5f0 72 72 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  rr = errno;.    
2e600 69 66 28 20 70 45 72 72 6f 72 20 29 7b 0a 20 20  if( pError ){.  
2e610 20 20 20 20 2a 70 45 72 72 6f 72 20 3d 20 65 72      *pError = er
2e620 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  r;.    }.    ret
2e630 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
2e640 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66  ;.  }.#endif.#if
2e650 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
2e660 20 20 2f 2a 20 73 69 6d 75 6c 61 74 65 20 6d 75    /* simulate mu
2e670 6c 74 69 70 6c 65 20 68 6f 73 74 73 20 62 79 20  ltiple hosts by 
2e680 63 72 65 61 74 69 6e 67 20 75 6e 69 71 75 65 20  creating unique 
2e690 68 6f 73 74 69 64 20 66 69 6c 65 20 70 61 74 68  hostid file path
2e6a0 73 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74  s */.  if( sqlit
2e6b0 65 33 5f 68 6f 73 74 69 64 5f 6e 75 6d 20 21 3d  e3_hostid_num !=
2e6c0 20 30 29 7b 0a 20 20 20 20 70 48 6f 73 74 49 44   0){.    pHostID
2e6d0 5b 30 5d 20 3d 20 28 63 68 61 72 29 28 70 48 6f  [0] = (char)(pHo
2e6e0 73 74 49 44 5b 30 5d 20 2b 20 28 63 68 61 72 29  stID[0] + (char)
2e6f0 28 73 71 6c 69 74 65 33 5f 68 6f 73 74 69 64 5f  (sqlite3_hostid_
2e700 6e 75 6d 20 26 20 30 78 46 46 29 29 3b 0a 20 20  num & 0xFF));.  
2e710 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 72 65  }.#endif.  .  re
2e720 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2e730 7d 0a 0a 2f 2a 20 54 68 65 20 63 6f 6e 63 68 20  }../* The conch 
2e740 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74 68  file contains th
2e750 65 20 68 65 61 64 65 72 2c 20 68 6f 73 74 20 69  e header, host i
2e760 64 20 61 6e 64 20 6c 6f 63 6b 20 66 69 6c 65 20  d and lock file 
2e770 70 61 74 68 0a 20 2a 2f 0a 23 64 65 66 69 6e 65  path. */.#define
2e780 20 50 52 4f 58 59 5f 43 4f 4e 43 48 56 45 52 53   PROXY_CONCHVERS
2e790 49 4f 4e 20 32 20 20 20 2f 2a 20 31 2d 62 79 74  ION 2   /* 1-byt
2e7a0 65 20 68 65 61 64 65 72 2c 20 31 36 2d 62 79 74  e header, 16-byt
2e7b0 65 20 68 6f 73 74 20 69 64 2c 20 70 61 74 68 20  e host id, path 
2e7c0 2a 2f 0a 23 64 65 66 69 6e 65 20 50 52 4f 58 59  */.#define PROXY
2e7d0 5f 48 45 41 44 45 52 4c 45 4e 20 20 20 20 31 20  _HEADERLEN    1 
2e7e0 20 20 2f 2a 20 63 6f 6e 63 68 20 66 69 6c 65 20    /* conch file 
2e7f0 68 65 61 64 65 72 20 6c 65 6e 67 74 68 20 2a 2f  header length */
2e800 0a 23 64 65 66 69 6e 65 20 50 52 4f 58 59 5f 50  .#define PROXY_P
2e810 41 54 48 49 4e 44 45 58 20 20 20 20 28 50 52 4f  ATHINDEX    (PRO
2e820 58 59 5f 48 45 41 44 45 52 4c 45 4e 2b 50 52 4f  XY_HEADERLEN+PRO
2e830 58 59 5f 48 4f 53 54 49 44 4c 45 4e 29 0a 23 64  XY_HOSTIDLEN).#d
2e840 65 66 69 6e 65 20 50 52 4f 58 59 5f 4d 41 58 43  efine PROXY_MAXC
2e850 4f 4e 43 48 4c 45 4e 20 20 28 50 52 4f 58 59 5f  ONCHLEN  (PROXY_
2e860 48 45 41 44 45 52 4c 45 4e 2b 50 52 4f 58 59 5f  HEADERLEN+PROXY_
2e870 48 4f 53 54 49 44 4c 45 4e 2b 4d 41 58 50 41 54  HOSTIDLEN+MAXPAT
2e880 48 4c 45 4e 29 0a 0a 2f 2a 20 0a 2a 2a 20 54 61  HLEN)../* .** Ta
2e890 6b 65 73 20 61 6e 20 6f 70 65 6e 20 63 6f 6e 63  kes an open conc
2e8a0 68 20 66 69 6c 65 2c 20 63 6f 70 69 65 73 20 74  h file, copies t
2e8b0 68 65 20 63 6f 6e 74 65 6e 74 73 20 74 6f 20 61  he contents to a
2e8c0 20 6e 65 77 20 70 61 74 68 20 61 6e 64 20 74 68   new path and th
2e8d0 65 6e 20 6d 6f 76 65 73 20 0a 2a 2a 20 69 74 20  en moves .** it 
2e8e0 62 61 63 6b 2e 20 20 54 68 65 20 6e 65 77 6c 79  back.  The newly
2e8f0 20 63 72 65 61 74 65 64 20 66 69 6c 65 27 73 20   created file's 
2e900 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
2e910 69 73 20 61 73 73 69 67 6e 65 64 20 74 6f 20 74  is assigned to t
2e920 68 65 0a 2a 2a 20 63 6f 6e 63 68 20 66 69 6c 65  he.** conch file
2e930 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 66   structure and f
2e940 69 6e 61 6c 6c 79 20 74 68 65 20 6f 72 69 67 69  inally the origi
2e950 6e 61 6c 20 63 6f 6e 63 68 20 66 69 6c 65 20 64  nal conch file d
2e960 65 73 63 72 69 70 74 6f 72 20 69 73 20 0a 2a 2a  escriptor is .**
2e970 20 63 6c 6f 73 65 64 2e 20 20 52 65 74 75 72 6e   closed.  Return
2e980 73 20 7a 65 72 6f 20 69 66 20 73 75 63 63 65 73  s zero if succes
2e990 73 66 75 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  sful..*/.static 
2e9a0 69 6e 74 20 70 72 6f 78 79 42 72 65 61 6b 43 6f  int proxyBreakCo
2e9b0 6e 63 68 4c 6f 63 6b 28 75 6e 69 78 46 69 6c 65  nchLock(unixFile
2e9c0 20 2a 70 46 69 6c 65 2c 20 75 75 69 64 5f 74 20   *pFile, uuid_t 
2e9d0 6d 79 48 6f 73 74 49 44 29 7b 0a 20 20 70 72 6f  myHostID){.  pro
2e9e0 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  xyLockingContext
2e9f0 20 2a 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c   *pCtx = (proxyL
2ea00 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29  ockingContext *)
2ea10 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
2ea20 6e 74 65 78 74 3b 20 0a 20 20 75 6e 69 78 46 69  ntext; .  unixFi
2ea30 6c 65 20 2a 63 6f 6e 63 68 46 69 6c 65 20 3d 20  le *conchFile = 
2ea40 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 3b  pCtx->conchFile;
2ea50 0a 20 20 63 68 61 72 20 74 50 61 74 68 5b 4d 41  .  char tPath[MA
2ea60 58 50 41 54 48 4c 45 4e 5d 3b 0a 20 20 63 68 61  XPATHLEN];.  cha
2ea70 72 20 62 75 66 5b 50 52 4f 58 59 5f 4d 41 58 43  r buf[PROXY_MAXC
2ea80 4f 4e 43 48 4c 45 4e 5d 3b 0a 20 20 63 68 61 72  ONCHLEN];.  char
2ea90 20 2a 63 50 61 74 68 20 3d 20 70 43 74 78 2d 3e   *cPath = pCtx->
2eaa0 63 6f 6e 63 68 46 69 6c 65 50 61 74 68 3b 0a 20  conchFilePath;. 
2eab0 20 73 69 7a 65 5f 74 20 72 65 61 64 4c 65 6e 20   size_t readLen 
2eac0 3d 20 30 3b 0a 20 20 73 69 7a 65 5f 74 20 70 61  = 0;.  size_t pa
2ead0 74 68 4c 65 6e 20 3d 20 30 3b 0a 20 20 63 68 61  thLen = 0;.  cha
2eae0 72 20 65 72 72 6d 73 67 5b 36 34 5d 20 3d 20 22  r errmsg[64] = "
2eaf0 22 3b 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d 31  ";.  int fd = -1
2eb00 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 2d 31 3b  ;.  int rc = -1;
2eb10 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
2eb20 54 45 52 28 6d 79 48 6f 73 74 49 44 29 3b 0a 0a  TER(myHostID);..
2eb30 20 20 2f 2a 20 63 72 65 61 74 65 20 61 20 6e 65    /* create a ne
2eb40 77 20 70 61 74 68 20 62 79 20 72 65 70 6c 61 63  w path by replac
2eb50 65 20 74 68 65 20 74 72 61 69 6c 69 6e 67 20 27  e the trailing '
2eb60 2d 63 6f 6e 63 68 27 20 77 69 74 68 20 27 2d 62  -conch' with '-b
2eb70 72 65 61 6b 27 20 2a 2f 0a 20 20 70 61 74 68 4c  reak' */.  pathL
2eb80 65 6e 20 3d 20 73 74 72 6c 63 70 79 28 74 50 61  en = strlcpy(tPa
2eb90 74 68 2c 20 63 50 61 74 68 2c 20 4d 41 58 50 41  th, cPath, MAXPA
2eba0 54 48 4c 45 4e 29 3b 0a 20 20 69 66 28 20 70 61  THLEN);.  if( pa
2ebb0 74 68 4c 65 6e 3e 4d 41 58 50 41 54 48 4c 45 4e  thLen>MAXPATHLEN
2ebc0 20 7c 7c 20 70 61 74 68 4c 65 6e 3c 36 20 7c 7c   || pathLen<6 ||
2ebd0 20 0a 20 20 20 20 20 28 73 74 72 6c 63 70 79 28   .     (strlcpy(
2ebe0 26 74 50 61 74 68 5b 70 61 74 68 4c 65 6e 2d 35  &tPath[pathLen-5
2ebf0 5d 2c 20 22 62 72 65 61 6b 22 2c 20 36 29 20 21  ], "break", 6) !
2ec00 3d 20 35 29 20 29 7b 0a 20 20 20 20 73 70 72 69  = 5) ){.    spri
2ec10 6e 74 66 28 65 72 72 6d 73 67 2c 20 22 70 61 74  ntf(errmsg, "pat
2ec20 68 20 65 72 72 6f 72 20 28 6c 65 6e 20 25 64 29  h error (len %d)
2ec30 22 2c 20 28 69 6e 74 29 70 61 74 68 4c 65 6e 29  ", (int)pathLen)
2ec40 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 62  ;.    goto end_b
2ec50 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20  reaklock;.  }.  
2ec60 2f 2a 20 72 65 61 64 20 74 68 65 20 63 6f 6e 63  /* read the conc
2ec70 68 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 72  h content */.  r
2ec80 65 61 64 4c 65 6e 20 3d 20 70 72 65 61 64 28 63  eadLen = pread(c
2ec90 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 62 75 66  onchFile->h, buf
2eca0 2c 20 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48  , PROXY_MAXCONCH
2ecb0 4c 45 4e 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  LEN, 0);.  if( r
2ecc0 65 61 64 4c 65 6e 3c 50 52 4f 58 59 5f 50 41 54  eadLen<PROXY_PAT
2ecd0 48 49 4e 44 45 58 20 29 7b 0a 20 20 20 20 73 70  HINDEX ){.    sp
2ece0 72 69 6e 74 66 28 65 72 72 6d 73 67 2c 20 22 72  rintf(errmsg, "r
2ecf0 65 61 64 20 65 72 72 6f 72 20 28 6c 65 6e 20 25  ead error (len %
2ed00 64 29 22 2c 20 28 69 6e 74 29 72 65 61 64 4c 65  d)", (int)readLe
2ed10 6e 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64  n);.    goto end
2ed20 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a  _breaklock;.  }.
2ed30 20 20 2f 2a 20 77 72 69 74 65 20 69 74 20 6f 75    /* write it ou
2ed40 74 20 74 6f 20 74 68 65 20 74 65 6d 70 6f 72 61  t to the tempora
2ed50 72 79 20 62 72 65 61 6b 20 66 69 6c 65 20 2a 2f  ry break file */
2ed60 0a 20 20 66 64 20 3d 20 6f 70 65 6e 28 74 50 61  .  fd = open(tPa
2ed70 74 68 2c 20 28 4f 5f 52 44 57 52 7c 4f 5f 43 52  th, (O_RDWR|O_CR
2ed80 45 41 54 7c 4f 5f 45 58 43 4c 29 2c 20 53 51 4c  EAT|O_EXCL), SQL
2ed90 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45  ITE_DEFAULT_FILE
2eda0 5f 50 45 52 4d 49 53 53 49 4f 4e 53 29 3b 0a 20  _PERMISSIONS);. 
2edb0 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20   if( fd<0 ){.   
2edc0 20 73 70 72 69 6e 74 66 28 65 72 72 6d 73 67 2c   sprintf(errmsg,
2edd0 20 22 63 72 65 61 74 65 20 66 61 69 6c 65 64 20   "create failed 
2ede0 28 25 64 29 22 2c 20 65 72 72 6e 6f 29 3b 0a 20  (%d)", errno);. 
2edf0 20 20 20 67 6f 74 6f 20 65 6e 64 5f 62 72 65 61     goto end_brea
2ee00 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 69 66 28  klock;.  }.  if(
2ee10 20 70 77 72 69 74 65 28 66 64 2c 20 62 75 66 2c   pwrite(fd, buf,
2ee20 20 72 65 61 64 4c 65 6e 2c 20 30 29 20 21 3d 20   readLen, 0) != 
2ee30 28 73 73 69 7a 65 5f 74 29 72 65 61 64 4c 65 6e  (ssize_t)readLen
2ee40 20 29 7b 0a 20 20 20 20 73 70 72 69 6e 74 66 28   ){.    sprintf(
2ee50 65 72 72 6d 73 67 2c 20 22 77 72 69 74 65 20 66  errmsg, "write f
2ee60 61 69 6c 65 64 20 28 25 64 29 22 2c 20 65 72 72  ailed (%d)", err
2ee70 6e 6f 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  no);.    goto en
2ee80 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20 7d  d_breaklock;.  }
2ee90 0a 20 20 69 66 28 20 72 65 6e 61 6d 65 28 74 50  .  if( rename(tP
2eea0 61 74 68 2c 20 63 50 61 74 68 29 20 29 7b 0a 20  ath, cPath) ){. 
2eeb0 20 20 20 73 70 72 69 6e 74 66 28 65 72 72 6d 73     sprintf(errms
2eec0 67 2c 20 22 72 65 6e 61 6d 65 20 66 61 69 6c 65  g, "rename faile
2eed0 64 20 28 25 64 29 22 2c 20 65 72 72 6e 6f 29 3b  d (%d)", errno);
2eee0 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 62 72  .    goto end_br
2eef0 65 61 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 72  eaklock;.  }.  r
2ef00 63 20 3d 20 30 3b 0a 20 20 66 70 72 69 6e 74 66  c = 0;.  fprintf
2ef10 28 73 74 64 65 72 72 2c 20 22 62 72 6f 6b 65 20  (stderr, "broke 
2ef20 73 74 61 6c 65 20 6c 6f 63 6b 20 6f 6e 20 25 73  stale lock on %s
2ef30 5c 6e 22 2c 20 63 50 61 74 68 29 3b 0a 20 20 63  \n", cPath);.  c
2ef40 6c 6f 73 65 28 63 6f 6e 63 68 46 69 6c 65 2d 3e  lose(conchFile->
2ef50 68 29 3b 0a 20 20 63 6f 6e 63 68 46 69 6c 65 2d  h);.  conchFile-
2ef60 3e 68 20 3d 20 66 64 3b 0a 20 20 63 6f 6e 63 68  >h = fd;.  conch
2ef70 46 69 6c 65 2d 3e 6f 70 65 6e 46 6c 61 67 73 20  File->openFlags 
2ef80 3d 20 4f 5f 52 44 57 52 20 7c 20 4f 5f 43 52 45  = O_RDWR | O_CRE
2ef90 41 54 3b 0a 0a 65 6e 64 5f 62 72 65 61 6b 6c 6f  AT;..end_breaklo
2efa0 63 6b 3a 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  ck:.  if( rc ){.
2efb0 20 20 20 20 69 66 28 20 66 64 3e 3d 30 20 29 7b      if( fd>=0 ){
2efc0 0a 20 20 20 20 20 20 75 6e 6c 69 6e 6b 28 74 50  .      unlink(tP
2efd0 61 74 68 29 3b 0a 20 20 20 20 20 20 63 6c 6f 73  ath);.      clos
2efe0 65 28 66 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20  e(fd);.    }.   
2eff0 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
2f000 20 22 66 61 69 6c 65 64 20 74 6f 20 62 72 65 61   "failed to brea
2f010 6b 20 73 74 61 6c 65 20 6c 6f 63 6b 20 6f 6e 20  k stale lock on 
2f020 25 73 2c 20 25 73 5c 6e 22 2c 20 63 50 61 74 68  %s, %s\n", cPath
2f030 2c 20 65 72 72 6d 73 67 29 3b 0a 20 20 7d 0a 20  , errmsg);.  }. 
2f040 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2f050 2a 20 54 61 6b 65 20 74 68 65 20 72 65 71 75 65  * Take the reque
2f060 73 74 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  sted lock on the
2f070 20 63 6f 6e 63 68 20 66 69 6c 65 20 61 6e 64 20   conch file and 
2f080 62 72 65 61 6b 20 61 20 73 74 61 6c 65 20 6c 6f  break a stale lo
2f090 63 6b 20 69 66 20 74 68 65 20 0a 2a 2a 20 68 6f  ck if the .** ho
2f0a0 73 74 20 69 64 20 6d 61 74 63 68 65 73 2e 0a 2a  st id matches..*
2f0b0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  /.static int pro
2f0c0 78 79 43 6f 6e 63 68 4c 6f 63 6b 28 75 6e 69 78  xyConchLock(unix
2f0d0 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 75 75 69  File *pFile, uui
2f0e0 64 5f 74 20 6d 79 48 6f 73 74 49 44 2c 20 69 6e  d_t myHostID, in
2f0f0 74 20 6c 6f 63 6b 54 79 70 65 29 7b 0a 20 20 70  t lockType){.  p
2f100 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
2f110 78 74 20 2a 70 43 74 78 20 3d 20 28 70 72 6f 78  xt *pCtx = (prox
2f120 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  yLockingContext 
2f130 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  *)pFile->locking
2f140 43 6f 6e 74 65 78 74 3b 20 0a 20 20 75 6e 69 78  Context; .  unix
2f150 46 69 6c 65 20 2a 63 6f 6e 63 68 46 69 6c 65 20  File *conchFile 
2f160 3d 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c  = pCtx->conchFil
2f170 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  e;.  int rc = SQ
2f180 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e  LITE_OK;.  int n
2f190 54 72 69 65 73 20 3d 20 30 3b 0a 20 20 73 74 72  Tries = 0;.  str
2f1a0 75 63 74 20 74 69 6d 65 73 70 65 63 20 63 6f 6e  uct timespec con
2f1b0 63 68 4d 6f 64 54 69 6d 65 3b 0a 20 20 0a 20 20  chModTime;.  .  
2f1c0 64 6f 20 7b 0a 20 20 20 20 72 63 20 3d 20 63 6f  do {.    rc = co
2f1d0 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64  nchFile->pMethod
2f1e0 2d 3e 78 4c 6f 63 6b 28 28 73 71 6c 69 74 65 33  ->xLock((sqlite3
2f1f0 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65  _file*)conchFile
2f200 2c 20 6c 6f 63 6b 54 79 70 65 29 3b 0a 20 20 20  , lockType);.   
2f210 20 6e 54 72 69 65 73 20 2b 2b 3b 0a 20 20 20 20   nTries ++;.    
2f220 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42  if( rc==SQLITE_B
2f230 55 53 59 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  USY ){.      /* 
2f240 49 66 20 74 68 65 20 6c 6f 63 6b 20 66 61 69 6c  If the lock fail
2f250 65 64 20 28 62 75 73 79 29 3a 0a 20 20 20 20 20  ed (busy):.     
2f260 20 20 2a 20 31 73 74 20 74 72 79 3a 20 67 65 74    * 1st try: get
2f270 20 74 68 65 20 6d 6f 64 20 74 69 6d 65 20 6f 66   the mod time of
2f280 20 74 68 65 20 63 6f 6e 63 68 2c 20 77 61 69 74   the conch, wait
2f290 20 30 2e 35 73 20 61 6e 64 20 74 72 79 20 61 67   0.5s and try ag
2f2a0 61 69 6e 2e 20 0a 20 20 20 20 20 20 20 2a 20 32  ain. .       * 2
2f2b0 6e 64 20 74 72 79 3a 20 66 61 69 6c 20 69 66 20  nd try: fail if 
2f2c0 74 68 65 20 6d 6f 64 20 74 69 6d 65 20 63 68 61  the mod time cha
2f2d0 6e 67 65 64 20 6f 72 20 68 6f 73 74 20 69 64 20  nged or host id 
2f2e0 69 73 20 64 69 66 66 65 72 65 6e 74 2c 20 77 61  is different, wa
2f2f0 69 74 20 0a 20 20 20 20 20 20 20 2a 20 20 20 20  it .       *    
2f300 20 20 20 20 20 20 20 31 30 20 73 65 63 20 61 6e         10 sec an
2f310 64 20 74 72 79 20 61 67 61 69 6e 0a 20 20 20 20  d try again.    
2f320 20 20 20 2a 20 33 72 64 20 74 72 79 3a 20 62 72     * 3rd try: br
2f330 65 61 6b 20 74 68 65 20 6c 6f 63 6b 20 75 6e 6c  eak the lock unl
2f340 65 73 73 20 74 68 65 20 6d 6f 64 20 74 69 6d 65  ess the mod time
2f350 20 68 61 73 20 63 68 61 6e 67 65 64 2e 0a 20 20   has changed..  
2f360 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 74       */.      st
2f370 72 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20  ruct stat buf;. 
2f380 20 20 20 20 20 69 66 28 20 66 73 74 61 74 28 63       if( fstat(c
2f390 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 26 62 75  onchFile->h, &bu
2f3a0 66 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46  f) ){.        pF
2f3b0 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
2f3c0 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20   errno;.        
2f3d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
2f3e0 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20  ERR_LOCK;.      
2f3f0 7d 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20 69  }.      .      i
2f400 66 28 20 6e 54 72 69 65 73 3d 3d 31 20 29 7b 0a  f( nTries==1 ){.
2f410 20 20 20 20 20 20 20 20 63 6f 6e 63 68 4d 6f 64          conchMod
2f420 54 69 6d 65 20 3d 20 62 75 66 2e 73 74 5f 6d 74  Time = buf.st_mt
2f430 69 6d 65 73 70 65 63 3b 0a 20 20 20 20 20 20 20  imespec;.       
2f440 20 75 73 6c 65 65 70 28 35 30 30 30 30 30 29 3b   usleep(500000);
2f450 20 2f 2a 20 77 61 69 74 20 30 2e 35 20 73 65 63   /* wait 0.5 sec
2f460 20 61 6e 64 20 74 72 79 20 74 68 65 20 6c 6f 63   and try the loc
2f470 6b 20 61 67 61 69 6e 2a 2f 0a 20 20 20 20 20 20  k again*/.      
2f480 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20 0a 20 20    continue;  .  
2f490 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 73 73      }..      ass
2f4a0 65 72 74 28 20 6e 54 72 69 65 73 3e 31 20 29 3b  ert( nTries>1 );
2f4b0 0a 20 20 20 20 20 20 69 66 28 20 63 6f 6e 63 68  .      if( conch
2f4c0 4d 6f 64 54 69 6d 65 2e 74 76 5f 73 65 63 20 21  ModTime.tv_sec !
2f4d0 3d 20 62 75 66 2e 73 74 5f 6d 74 69 6d 65 73 70  = buf.st_mtimesp
2f4e0 65 63 2e 74 76 5f 73 65 63 20 7c 7c 20 0a 20 20  ec.tv_sec || .  
2f4f0 20 20 20 20 20 20 20 63 6f 6e 63 68 4d 6f 64 54         conchModT
2f500 69 6d 65 2e 74 76 5f 6e 73 65 63 20 21 3d 20 62  ime.tv_nsec != b
2f510 75 66 2e 73 74 5f 6d 74 69 6d 65 73 70 65 63 2e  uf.st_mtimespec.
2f520 74 76 5f 6e 73 65 63 20 29 7b 0a 20 20 20 20 20  tv_nsec ){.     
2f530 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2f540 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 7d 0a 20  _BUSY;.      }. 
2f550 20 20 20 20 20 0a 20 20 20 20 20 20 69 66 28 20       .      if( 
2f560 6e 54 72 69 65 73 3d 3d 32 20 29 7b 20 20 0a 20  nTries==2 ){  . 
2f570 20 20 20 20 20 20 20 63 68 61 72 20 74 42 75 66         char tBuf
2f580 5b 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c  [PROXY_MAXCONCHL
2f590 45 4e 5d 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  EN];.        int
2f5a0 20 6c 65 6e 20 3d 20 70 72 65 61 64 28 63 6f 6e   len = pread(con
2f5b0 63 68 46 69 6c 65 2d 3e 68 2c 20 74 42 75 66 2c  chFile->h, tBuf,
2f5c0 20 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c   PROXY_MAXCONCHL
2f5d0 45 4e 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  EN, 0);.        
2f5e0 69 66 28 20 6c 65 6e 3c 30 20 29 7b 0a 20 20 20  if( len<0 ){.   
2f5f0 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61         pFile->la
2f600 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b  stErrno = errno;
2f610 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
2f620 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c  n SQLITE_IOERR_L
2f630 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  OCK;.        }. 
2f640 20 20 20 20 20 20 20 69 66 28 20 6c 65 6e 3e 50         if( len>P
2f650 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 20 26  ROXY_PATHINDEX &
2f660 26 20 74 42 75 66 5b 30 5d 3d 3d 28 63 68 61 72  & tBuf[0]==(char
2f670 29 50 52 4f 58 59 5f 43 4f 4e 43 48 56 45 52 53  )PROXY_CONCHVERS
2f680 49 4f 4e 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ION){.          
2f690 2f 2a 20 64 6f 6e 27 74 20 62 72 65 61 6b 20 74  /* don't break t
2f6a0 68 65 20 6c 6f 63 6b 20 69 66 20 74 68 65 20 68  he lock if the h
2f6b0 6f 73 74 20 69 64 20 64 6f 65 73 6e 27 74 20 6d  ost id doesn't m
2f6c0 61 74 63 68 20 2a 2f 0a 20 20 20 20 20 20 20 20  atch */.        
2f6d0 20 20 69 66 28 20 30 21 3d 6d 65 6d 63 6d 70 28    if( 0!=memcmp(
2f6e0 26 74 42 75 66 5b 50 52 4f 58 59 5f 48 45 41 44  &tBuf[PROXY_HEAD
2f6f0 45 52 4c 45 4e 5d 2c 20 6d 79 48 6f 73 74 49 44  ERLEN], myHostID
2f700 2c 20 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45  , PROXY_HOSTIDLE
2f710 4e 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  N) ){.          
2f720 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2f730 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 20 20  BUSY;.          
2f740 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  }.        }else{
2f750 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64 6f  .          /* do
2f760 6e 27 74 20 62 72 65 61 6b 20 74 68 65 20 6c 6f  n't break the lo
2f770 63 6b 20 6f 6e 20 73 68 6f 72 74 20 72 65 61 64  ck on short read
2f780 20 6f 72 20 61 20 76 65 72 73 69 6f 6e 20 6d 69   or a version mi
2f790 73 6d 61 74 63 68 20 2a 2f 0a 20 20 20 20 20 20  smatch */.      
2f7a0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2f7b0 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20  E_BUSY;.        
2f7c0 7d 0a 20 20 20 20 20 20 20 20 75 73 6c 65 65 70  }.        usleep
2f7d0 28 31 30 30 30 30 30 30 30 29 3b 20 2f 2a 20 77  (10000000); /* w
2f7e0 61 69 74 20 31 30 20 73 65 63 20 61 6e 64 20 74  ait 10 sec and t
2f7f0 72 79 20 74 68 65 20 6c 6f 63 6b 20 61 67 61 69  ry the lock agai
2f800 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f 6e  n */.        con
2f810 74 69 6e 75 65 3b 20 0a 20 20 20 20 20 20 7d 0a  tinue; .      }.
2f820 20 20 20 20 20 20 0a 20 20 20 20 20 20 61 73 73        .      ass
2f830 65 72 74 28 20 6e 54 72 69 65 73 3d 3d 33 20 29  ert( nTries==3 )
2f840 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 70  ;.      if( 0==p
2f850 72 6f 78 79 42 72 65 61 6b 43 6f 6e 63 68 4c 6f  roxyBreakConchLo
2f860 63 6b 28 70 46 69 6c 65 2c 20 6d 79 48 6f 73 74  ck(pFile, myHost
2f870 49 44 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ID) ){.        r
2f880 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
2f890 20 20 20 20 20 20 20 69 66 28 20 6c 6f 63 6b 54         if( lockT
2f8a0 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ype==EXCLUSIVE_L
2f8b0 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  OCK ){.         
2f8c0 20 72 63 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d   rc = conchFile-
2f8d0 3e 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28  >pMethod->xLock(
2f8e0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63  (sqlite3_file*)c
2f8f0 6f 6e 63 68 46 69 6c 65 2c 20 53 48 41 52 45 44  onchFile, SHARED
2f900 5f 4c 4f 43 4b 29 3b 20 20 20 20 20 20 20 20 20  _LOCK);         
2f910 20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20   .        }.    
2f920 20 20 20 20 69 66 28 20 21 72 63 20 29 7b 0a 20      if( !rc ){. 
2f930 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 63 6f           rc = co
2f940 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64  nchFile->pMethod
2f950 2d 3e 78 4c 6f 63 6b 28 28 73 71 6c 69 74 65 33  ->xLock((sqlite3
2f960 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65  _file*)conchFile
2f970 2c 20 6c 6f 63 6b 54 79 70 65 29 3b 0a 20 20 20  , lockType);.   
2f980 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
2f990 20 20 20 7d 0a 20 20 7d 20 77 68 69 6c 65 28 20     }.  } while( 
2f9a0 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc==SQLITE_BUSY 
2f9b0 26 26 20 6e 54 72 69 65 73 3c 33 20 29 3b 0a 20  && nTries<3 );. 
2f9c0 20 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d   .  return rc;.}
2f9d0 0a 0a 2f 2a 20 54 61 6b 65 73 20 74 68 65 20 63  ../* Takes the c
2f9e0 6f 6e 63 68 20 62 79 20 74 61 6b 69 6e 67 20 61  onch by taking a
2f9f0 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 61 6e 64   shared lock and
2fa00 20 72 65 61 64 20 74 68 65 20 63 6f 6e 74 65 6e   read the conten
2fa10 74 73 20 63 6f 6e 63 68 2c 20 69 66 20 0a 2a 2a  ts conch, if .**
2fa20 20 6c 6f 63 6b 50 61 74 68 20 69 73 20 6e 6f 6e   lockPath is non
2fa30 2d 4e 55 4c 4c 2c 20 74 68 65 20 68 6f 73 74 20  -NULL, the host 
2fa40 49 44 20 61 6e 64 20 6c 6f 63 6b 20 66 69 6c 65  ID and lock file
2fa50 20 70 61 74 68 20 6d 75 73 74 20 6d 61 74 63 68   path must match
2fa60 2e 20 20 41 20 4e 55 4c 4c 20 0a 2a 2a 20 6c 6f  .  A NULL .** lo
2fa70 63 6b 50 61 74 68 20 6d 65 61 6e 73 20 74 68 61  ckPath means tha
2fa80 74 20 74 68 65 20 6c 6f 63 6b 50 61 74 68 20 69  t the lockPath i
2fa90 6e 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65  n the conch file
2faa0 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 69 66   will be used if
2fab0 20 74 68 65 20 0a 2a 2a 20 68 6f 73 74 20 49 44   the .** host ID
2fac0 73 20 6d 61 74 63 68 2c 20 6f 72 20 61 20 6e 65  s match, or a ne
2fad0 77 20 6c 6f 63 6b 20 70 61 74 68 20 77 69 6c 6c  w lock path will
2fae0 20 62 65 20 67 65 6e 65 72 61 74 65 64 20 61 75   be generated au
2faf0 74 6f 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a 20  tomatically .** 
2fb00 61 6e 64 20 77 72 69 74 74 65 6e 20 74 6f 20 74  and written to t
2fb10 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 2e 0a 2a  he conch file..*
2fb20 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  /.static int pro
2fb30 78 79 54 61 6b 65 43 6f 6e 63 68 28 75 6e 69 78  xyTakeConch(unix
2fb40 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20  File *pFile){.  
2fb50 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
2fb60 65 78 74 20 2a 70 43 74 78 20 3d 20 28 70 72 6f  ext *pCtx = (pro
2fb70 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  xyLockingContext
2fb80 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e   *)pFile->lockin
2fb90 67 43 6f 6e 74 65 78 74 3b 20 0a 20 20 0a 20 20  gContext; .  .  
2fba0 69 66 28 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48  if( pCtx->conchH
2fbb0 65 6c 64 21 3d 30 20 29 7b 0a 20 20 20 20 72 65  eld!=0 ){.    re
2fbc0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2fbd0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 6e 69    }else{.    uni
2fbe0 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46 69 6c 65  xFile *conchFile
2fbf0 20 3d 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69   = pCtx->conchFi
2fc00 6c 65 3b 0a 20 20 20 20 75 75 69 64 5f 74 20 6d  le;.    uuid_t m
2fc10 79 48 6f 73 74 49 44 3b 0a 20 20 20 20 69 6e 74  yHostID;.    int
2fc20 20 70 45 72 72 6f 72 20 3d 20 30 3b 0a 20 20 20   pError = 0;.   
2fc30 20 63 68 61 72 20 72 65 61 64 42 75 66 5b 50 52   char readBuf[PR
2fc40 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 5d  OXY_MAXCONCHLEN]
2fc50 3b 0a 20 20 20 20 63 68 61 72 20 6c 6f 63 6b 50  ;.    char lockP
2fc60 61 74 68 5b 4d 41 58 50 41 54 48 4c 45 4e 5d 3b  ath[MAXPATHLEN];
2fc70 0a 20 20 20 20 63 68 61 72 20 2a 74 65 6d 70 4c  .    char *tempL
2fc80 6f 63 6b 50 61 74 68 20 3d 20 4e 55 4c 4c 3b 0a  ockPath = NULL;.
2fc90 20 20 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c      int rc = SQL
2fca0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 69 6e 74 20  ITE_OK;.    int 
2fcb0 63 72 65 61 74 65 43 6f 6e 63 68 20 3d 20 30 3b  createConch = 0;
2fcc0 0a 20 20 20 20 69 6e 74 20 68 6f 73 74 49 64 4d  .    int hostIdM
2fcd0 61 74 63 68 20 3d 20 30 3b 0a 20 20 20 20 69 6e  atch = 0;.    in
2fce0 74 20 72 65 61 64 4c 65 6e 20 3d 20 30 3b 0a 20  t readLen = 0;. 
2fcf0 20 20 20 69 6e 74 20 74 72 79 4f 6c 64 4c 6f 63     int tryOldLoc
2fd00 6b 50 61 74 68 20 3d 20 30 3b 0a 20 20 20 20 69  kPath = 0;.    i
2fd10 6e 74 20 66 6f 72 63 65 4e 65 77 4c 6f 63 6b 50  nt forceNewLockP
2fd20 61 74 68 20 3d 20 30 3b 0a 20 20 20 20 0a 20 20  ath = 0;.    .  
2fd30 20 20 4f 53 54 52 41 43 45 28 28 22 54 41 4b 45    OSTRACE(("TAKE
2fd40 43 4f 4e 43 48 20 20 25 64 20 66 6f 72 20 25 73  CONCH  %d for %s
2fd50 20 70 69 64 3d 25 64 5c 6e 22 2c 20 63 6f 6e 63   pid=%d\n", conc
2fd60 68 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20  hFile->h,.      
2fd70 20 20 20 20 20 20 20 28 70 43 74 78 2d 3e 6c 6f         (pCtx->lo
2fd80 63 6b 50 72 6f 78 79 50 61 74 68 20 3f 20 70 43  ckProxyPath ? pC
2fd90 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74  tx->lockProxyPat
2fda0 68 20 3a 20 22 3a 61 75 74 6f 3a 22 29 2c 20 67  h : ":auto:"), g
2fdb0 65 74 70 69 64 28 29 29 29 3b 0a 0a 20 20 20 20  etpid()));..    
2fdc0 72 63 20 3d 20 70 72 6f 78 79 47 65 74 48 6f 73  rc = proxyGetHos
2fdd0 74 49 44 28 6d 79 48 6f 73 74 49 44 2c 20 26 70  tID(myHostID, &p
2fde0 45 72 72 6f 72 29 3b 0a 20 20 20 20 69 66 28 20  Error);.    if( 
2fdf0 28 72 63 26 30 78 66 66 29 3d 3d 53 51 4c 49 54  (rc&0xff)==SQLIT
2fe00 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20 20 20  E_IOERR ){.     
2fe10 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
2fe20 6f 20 3d 20 70 45 72 72 6f 72 3b 0a 20 20 20 20  o = pError;.    
2fe30 20 20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b 65 63    goto end_takec
2fe40 6f 6e 63 68 3b 0a 20 20 20 20 7d 0a 20 20 20 20  onch;.    }.    
2fe50 72 63 20 3d 20 70 72 6f 78 79 43 6f 6e 63 68 4c  rc = proxyConchL
2fe60 6f 63 6b 28 70 46 69 6c 65 2c 20 6d 79 48 6f 73  ock(pFile, myHos
2fe70 74 49 44 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b  tID, SHARED_LOCK
2fe80 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
2fe90 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2fea0 20 20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b 65 63    goto end_takec
2feb0 6f 6e 63 68 3b 0a 20 20 20 20 7d 0a 20 20 20 20  onch;.    }.    
2fec0 2f 2a 20 72 65 61 64 20 74 68 65 20 65 78 69 73  /* read the exis
2fed0 74 69 6e 67 20 63 6f 6e 63 68 20 66 69 6c 65 20  ting conch file 
2fee0 2a 2f 0a 20 20 20 20 72 65 61 64 4c 65 6e 20 3d  */.    readLen =
2fef0 20 73 65 65 6b 41 6e 64 52 65 61 64 28 28 75 6e   seekAndRead((un
2ff00 69 78 46 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c  ixFile*)conchFil
2ff10 65 2c 20 30 2c 20 72 65 61 64 42 75 66 2c 20 50  e, 0, readBuf, P
2ff20 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e  ROXY_MAXCONCHLEN
2ff30 29 3b 0a 20 20 20 20 69 66 28 20 72 65 61 64 4c  );.    if( readL
2ff40 65 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  en<0 ){.      /*
2ff50 20 49 2f 4f 20 65 72 72 6f 72 3a 20 6c 61 73 74   I/O error: last
2ff60 45 72 72 6e 6f 20 73 65 74 20 62 79 20 73 65 65  Errno set by see
2ff70 6b 41 6e 64 52 65 61 64 20 2a 2f 0a 20 20 20 20  kAndRead */.    
2ff80 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
2ff90 6e 6f 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e  no = conchFile->
2ffa0 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20  lastErrno;.     
2ffb0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
2ffc0 52 52 5f 52 45 41 44 3b 0a 20 20 20 20 20 20 67  RR_READ;.      g
2ffd0 6f 74 6f 20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63  oto end_takeconc
2ffe0 68 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  h;.    }else if(
2fff0 20 72 65 61 64 4c 65 6e 3c 3d 28 50 52 4f 58 59   readLen<=(PROXY
30000 5f 48 45 41 44 45 52 4c 45 4e 2b 50 52 4f 58 59  _HEADERLEN+PROXY
30010 5f 48 4f 53 54 49 44 4c 45 4e 29 20 7c 7c 20 0a  _HOSTIDLEN) || .
30020 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 61               rea
30030 64 42 75 66 5b 30 5d 21 3d 28 63 68 61 72 29 50  dBuf[0]!=(char)P
30040 52 4f 58 59 5f 43 4f 4e 43 48 56 45 52 53 49 4f  ROXY_CONCHVERSIO
30050 4e 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 61 20  N ){.      /* a 
30060 73 68 6f 72 74 20 72 65 61 64 20 6f 72 20 76 65  short read or ve
30070 72 73 69 6f 6e 20 66 6f 72 6d 61 74 20 6d 69 73  rsion format mis
30080 6d 61 74 63 68 20 6d 65 61 6e 73 20 77 65 20 6e  match means we n
30090 65 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 20  eed to create a 
300a0 6e 65 77 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f  new .      ** co
300b0 6e 63 68 20 66 69 6c 65 2e 20 0a 20 20 20 20 20  nch file. .     
300c0 20 2a 2f 0a 20 20 20 20 20 20 63 72 65 61 74 65   */.      create
300d0 43 6f 6e 63 68 20 3d 20 31 3b 0a 20 20 20 20 7d  Conch = 1;.    }
300e0 0a 20 20 20 20 2f 2a 20 69 66 20 74 68 65 20 68  .    /* if the h
300f0 6f 73 74 20 69 64 20 6d 61 74 63 68 65 73 20 61  ost id matches a
30100 6e 64 20 74 68 65 20 6c 6f 63 6b 20 70 61 74 68  nd the lock path
30110 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20   already exists 
30120 69 6e 20 74 68 65 20 63 6f 6e 63 68 0a 20 20 20  in the conch.   
30130 20 2a 2a 20 77 65 27 6c 6c 20 74 72 79 20 74 6f   ** we'll try to
30140 20 75 73 65 20 74 68 65 20 70 61 74 68 20 74 68   use the path th
30150 65 72 65 2c 20 69 66 20 77 65 20 63 61 6e 27 74  ere, if we can't
30160 20 6f 70 65 6e 20 74 68 61 74 20 70 61 74 68 2c   open that path,
30170 20 77 65 27 6c 6c 20 0a 20 20 20 20 2a 2a 20 72   we'll .    ** r
30180 65 74 72 79 20 77 69 74 68 20 61 20 6e 65 77 20  etry with a new 
30190 61 75 74 6f 2d 67 65 6e 65 72 61 74 65 64 20 70  auto-generated p
301a0 61 74 68 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ath .    */.    
301b0 64 6f 20 7b 20 2f 2a 20 69 6e 20 63 61 73 65 20  do { /* in case 
301c0 77 65 20 6e 65 65 64 20 74 6f 20 74 72 79 20 61  we need to try a
301d0 67 61 69 6e 20 66 6f 72 20 61 6e 20 3a 61 75 74  gain for an :aut
301e0 6f 3a 20 6e 61 6d 65 64 20 6c 6f 63 6b 20 66 69  o: named lock fi
301f0 6c 65 20 2a 2f 0a 0a 20 20 20 20 20 20 69 66 28  le */..      if(
30200 20 21 63 72 65 61 74 65 43 6f 6e 63 68 20 26 26   !createConch &&
30210 20 21 66 6f 72 63 65 4e 65 77 4c 6f 63 6b 50 61   !forceNewLockPa
30220 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20 68 6f  th ){.        ho
30230 73 74 49 64 4d 61 74 63 68 20 3d 20 21 6d 65 6d  stIdMatch = !mem
30240 63 6d 70 28 26 72 65 61 64 42 75 66 5b 50 52 4f  cmp(&readBuf[PRO
30250 58 59 5f 48 45 41 44 45 52 4c 45 4e 5d 2c 20 6d  XY_HEADERLEN], m
30260 79 48 6f 73 74 49 44 2c 20 0a 20 20 20 20 20 20  yHostID, .      
30270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30280 20 20 20 20 20 20 20 20 20 20 20 20 50 52 4f 58              PROX
30290 59 5f 48 4f 53 54 49 44 4c 45 4e 29 3b 0a 20 20  Y_HOSTIDLEN);.  
302a0 20 20 20 20 20 20 2f 2a 20 69 66 20 74 68 65 20        /* if the 
302b0 63 6f 6e 63 68 20 68 61 73 20 64 61 74 61 20 63  conch has data c
302c0 6f 6d 70 61 72 65 20 74 68 65 20 63 6f 6e 74 65  ompare the conte
302d0 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  nts */.        i
302e0 66 28 20 21 70 43 74 78 2d 3e 6c 6f 63 6b 50 72  f( !pCtx->lockPr
302f0 6f 78 79 50 61 74 68 20 29 7b 0a 20 20 20 20 20  oxyPath ){.     
30300 20 20 20 20 20 2f 2a 20 66 6f 72 20 61 75 74 6f       /* for auto
30310 2d 6e 61 6d 65 64 20 6c 6f 63 61 6c 20 6c 6f 63  -named local loc
30320 6b 20 66 69 6c 65 2c 20 6a 75 73 74 20 63 68 65  k file, just che
30330 63 6b 20 74 68 65 20 68 6f 73 74 20 49 44 20 61  ck the host ID a
30340 6e 64 20 77 65 27 6c 6c 0a 20 20 20 20 20 20 20  nd we'll.       
30350 20 20 20 20 2a 2a 20 75 73 65 20 74 68 65 20 6c      ** use the l
30360 6f 63 61 6c 20 6c 6f 63 6b 20 66 69 6c 65 20 70  ocal lock file p
30370 61 74 68 20 74 68 61 74 27 73 20 61 6c 72 65 61  ath that's alrea
30380 64 79 20 69 6e 20 74 68 65 72 65 0a 20 20 20 20  dy in there.    
30390 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
303a0 20 20 20 20 69 66 28 20 68 6f 73 74 49 64 4d 61      if( hostIdMa
303b0 74 63 68 20 29 7b 0a 20 20 20 20 20 20 20 20 20  tch ){.         
303c0 20 20 20 73 69 7a 65 5f 74 20 70 61 74 68 4c 65     size_t pathLe
303d0 6e 20 3d 20 28 72 65 61 64 4c 65 6e 20 2d 20 50  n = (readLen - P
303e0 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 29 3b  ROXY_PATHINDEX);
303f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 0a 20 20  .            .  
30400 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 61            if( pa
30410 74 68 4c 65 6e 3e 3d 4d 41 58 50 41 54 48 4c 45  thLen>=MAXPATHLE
30420 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  N ){.           
30430 20 20 20 70 61 74 68 4c 65 6e 3d 4d 41 58 50 41     pathLen=MAXPA
30440 54 48 4c 45 4e 2d 31 3b 0a 20 20 20 20 20 20 20  THLEN-1;.       
30450 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
30460 20 20 20 6d 65 6d 63 70 79 28 6c 6f 63 6b 50 61     memcpy(lockPa
30470 74 68 2c 20 26 72 65 61 64 42 75 66 5b 50 52 4f  th, &readBuf[PRO
30480 58 59 5f 50 41 54 48 49 4e 44 45 58 5d 2c 20 70  XY_PATHINDEX], p
30490 61 74 68 4c 65 6e 29 3b 0a 20 20 20 20 20 20 20  athLen);.       
304a0 20 20 20 20 20 6c 6f 63 6b 50 61 74 68 5b 70 61       lockPath[pa
304b0 74 68 4c 65 6e 5d 20 3d 20 30 3b 0a 20 20 20 20  thLen] = 0;.    
304c0 20 20 20 20 20 20 20 20 74 65 6d 70 4c 6f 63 6b          tempLock
304d0 50 61 74 68 20 3d 20 6c 6f 63 6b 50 61 74 68 3b  Path = lockPath;
304e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79  .            try
304f0 4f 6c 64 4c 6f 63 6b 50 61 74 68 20 3d 20 31 3b  OldLockPath = 1;
30500 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
30510 63 72 65 61 74 65 20 61 20 63 6f 70 79 20 6f 66  create a copy of
30520 20 74 68 65 20 6c 6f 63 6b 20 70 61 74 68 20 69   the lock path i
30530 66 20 74 68 65 20 63 6f 6e 63 68 20 69 73 20 74  f the conch is t
30540 61 6b 65 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20  aken */.        
30550 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b      goto end_tak
30560 65 63 6f 6e 63 68 3b 0a 20 20 20 20 20 20 20 20  econch;.        
30570 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73    }.        }els
30580 65 20 69 66 28 20 68 6f 73 74 49 64 4d 61 74 63  e if( hostIdMatc
30590 68 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h.              
305a0 20 26 26 20 21 73 74 72 6e 63 6d 70 28 70 43 74   && !strncmp(pCt
305b0 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68  x->lockProxyPath
305c0 2c 20 26 72 65 61 64 42 75 66 5b 50 52 4f 58 59  , &readBuf[PROXY
305d0 5f 50 41 54 48 49 4e 44 45 58 5d 2c 0a 20 20 20  _PATHINDEX],.   
305e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
305f0 20 20 20 20 20 20 20 20 72 65 61 64 4c 65 6e 2d          readLen-
30600 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 29  PROXY_PATHINDEX)
30610 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
30620 20 20 20 20 20 20 2f 2a 20 63 6f 6e 63 68 20 68        /* conch h
30630 6f 73 74 20 61 6e 64 20 6c 6f 63 6b 20 70 61 74  ost and lock pat
30640 68 20 6d 61 74 63 68 20 2a 2f 0a 20 20 20 20 20  h match */.     
30650 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 74 61       goto end_ta
30660 6b 65 63 6f 6e 63 68 3b 20 0a 20 20 20 20 20 20  keconch; .      
30670 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
30680 20 20 0a 20 20 20 20 20 20 2f 2a 20 69 66 20 74    .      /* if t
30690 68 65 20 63 6f 6e 63 68 20 69 73 6e 27 74 20 77  he conch isn't w
306a0 72 69 74 61 62 6c 65 20 61 6e 64 20 64 6f 65 73  ritable and does
306b0 6e 27 74 20 6d 61 74 63 68 2c 20 77 65 20 63 61  n't match, we ca
306c0 6e 27 74 20 74 61 6b 65 20 69 74 20 2a 2f 0a 20  n't take it */. 
306d0 20 20 20 20 20 69 66 28 20 28 63 6f 6e 63 68 46       if( (conchF
306e0 69 6c 65 2d 3e 6f 70 65 6e 46 6c 61 67 73 26 4f  ile->openFlags&O
306f0 5f 52 44 57 52 29 20 3d 3d 20 30 20 29 7b 0a 20  _RDWR) == 0 ){. 
30700 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
30710 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20  TE_BUSY;.       
30720 20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b 65 63 6f   goto end_takeco
30730 6e 63 68 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nch;.      }.   
30740 20 20 20 0a 20 20 20 20 20 20 2f 2a 20 65 69 74     .      /* eit
30750 68 65 72 20 74 68 65 20 63 6f 6e 63 68 20 64 69  her the conch di
30760 64 6e 27 74 20 6d 61 74 63 68 20 6f 72 20 77 65  dn't match or we
30770 20 6e 65 65 64 20 74 6f 20 63 72 65 61 74 65 20   need to create 
30780 61 20 6e 65 77 20 6f 6e 65 20 2a 2f 0a 20 20 20  a new one */.   
30790 20 20 20 69 66 28 20 21 70 43 74 78 2d 3e 6c 6f     if( !pCtx->lo
307a0 63 6b 50 72 6f 78 79 50 61 74 68 20 29 7b 0a 20  ckProxyPath ){. 
307b0 20 20 20 20 20 20 20 70 72 6f 78 79 47 65 74 4c         proxyGetL
307c0 6f 63 6b 50 61 74 68 28 70 43 74 78 2d 3e 64 62  ockPath(pCtx->db
307d0 50 61 74 68 2c 20 6c 6f 63 6b 50 61 74 68 2c 20  Path, lockPath, 
307e0 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a 20 20 20  MAXPATHLEN);.   
307f0 20 20 20 20 20 74 65 6d 70 4c 6f 63 6b 50 61 74       tempLockPat
30800 68 20 3d 20 6c 6f 63 6b 50 61 74 68 3b 0a 20 20  h = lockPath;.  
30810 20 20 20 20 20 20 2f 2a 20 63 72 65 61 74 65 20        /* create 
30820 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 6c 6f  a copy of the lo
30830 63 6b 20 70 61 74 68 20 5f 6f 6e 6c 79 5f 20 69  ck path _only_ i
30840 66 20 74 68 65 20 63 6f 6e 63 68 20 69 73 20 74  f the conch is t
30850 61 6b 65 6e 20 2a 2f 0a 20 20 20 20 20 20 7d 0a  aken */.      }.
30860 20 20 20 20 20 20 0a 20 20 20 20 20 20 2f 2a 20        .      /* 
30870 75 70 64 61 74 65 20 63 6f 6e 63 68 20 77 69 74  update conch wit
30880 68 20 68 6f 73 74 20 61 6e 64 20 70 61 74 68 20  h host and path 
30890 28 74 68 69 73 20 77 69 6c 6c 20 66 61 69 6c 20  (this will fail 
308a0 69 66 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  if other process
308b0 0a 20 20 20 20 20 20 2a 2a 20 68 61 73 20 61 20  .      ** has a 
308c0 73 68 61 72 65 64 20 6c 6f 63 6b 20 61 6c 72 65  shared lock alre
308d0 61 64 79 29 2c 20 69 66 20 74 68 65 20 68 6f 73  ady), if the hos
308e0 74 20 69 64 20 6d 61 74 63 68 65 73 2c 20 75 73  t id matches, us
308f0 65 20 74 68 65 20 62 69 67 0a 20 20 20 20 20 20  e the big.      
30900 2a 2a 20 73 74 69 63 6b 2e 0a 20 20 20 20 20 20  ** stick..      
30910 2a 2f 0a 20 20 20 20 20 20 66 75 74 69 6d 65 73  */.      futimes
30920 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 4e  (conchFile->h, N
30930 55 4c 4c 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ULL);.      if( 
30940 68 6f 73 74 49 64 4d 61 74 63 68 20 26 26 20 21  hostIdMatch && !
30950 63 72 65 61 74 65 43 6f 6e 63 68 20 29 7b 0a 20  createConch ){. 
30960 20 20 20 20 20 20 20 69 66 28 20 63 6f 6e 63 68         if( conch
30970 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 26 26 20  File->pInode && 
30980 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 49 6e 6f 64  conchFile->pInod
30990 65 2d 3e 6e 53 68 61 72 65 64 3e 31 20 29 7b 0a  e->nShared>1 ){.
309a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20            /* We 
309b0 61 72 65 20 74 72 79 69 6e 67 20 66 6f 72 20 61  are trying for a
309c0 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
309d0 20 62 75 74 20 61 6e 6f 74 68 65 72 20 74 68 72   but another thr
309e0 65 61 64 20 69 6e 20 74 68 69 73 0a 20 20 20 20  ead in this.    
309f0 20 20 20 20 20 20 20 2a 2a 20 73 61 6d 65 20 70         ** same p
30a00 72 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20  rocess is still 
30a10 68 6f 6c 64 69 6e 67 20 61 20 73 68 61 72 65 64  holding a shared
30a20 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 20 20 20 20   lock. */.      
30a30 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
30a40 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 7d 20  BUSY;.        } 
30a50 65 6c 73 65 20 7b 20 20 20 20 20 20 20 20 20 20  else {          
30a60 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
30a70 70 72 6f 78 79 43 6f 6e 63 68 4c 6f 63 6b 28 70  proxyConchLock(p
30a80 46 69 6c 65 2c 20 6d 79 48 6f 73 74 49 44 2c 20  File, myHostID, 
30a90 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b  EXCLUSIVE_LOCK);
30aa0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
30ab0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
30ac0 72 63 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e  rc = conchFile->
30ad0 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28  pMethod->xLock((
30ae0 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f  sqlite3_file*)co
30af0 6e 63 68 46 69 6c 65 2c 20 45 58 43 4c 55 53 49  nchFile, EXCLUSI
30b00 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  VE_LOCK);.      
30b10 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  }.      if( rc==
30b20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
30b30 20 20 20 20 20 63 68 61 72 20 77 72 69 74 65 42       char writeB
30b40 75 66 66 65 72 5b 50 52 4f 58 59 5f 4d 41 58 43  uffer[PROXY_MAXC
30b50 4f 4e 43 48 4c 45 4e 5d 3b 0a 20 20 20 20 20 20  ONCHLEN];.      
30b60 20 20 69 6e 74 20 77 72 69 74 65 53 69 7a 65 20    int writeSize 
30b70 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 0a 20 20  = 0;.        .  
30b80 20 20 20 20 20 20 77 72 69 74 65 42 75 66 66 65        writeBuffe
30b90 72 5b 30 5d 20 3d 20 28 63 68 61 72 29 50 52 4f  r[0] = (char)PRO
30ba0 58 59 5f 43 4f 4e 43 48 56 45 52 53 49 4f 4e 3b  XY_CONCHVERSION;
30bb0 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
30bc0 26 77 72 69 74 65 42 75 66 66 65 72 5b 50 52 4f  &writeBuffer[PRO
30bd0 58 59 5f 48 45 41 44 45 52 4c 45 4e 5d 2c 20 6d  XY_HEADERLEN], m
30be0 79 48 6f 73 74 49 44 2c 20 50 52 4f 58 59 5f 48  yHostID, PROXY_H
30bf0 4f 53 54 49 44 4c 45 4e 29 3b 0a 20 20 20 20 20  OSTIDLEN);.     
30c00 20 20 20 69 66 28 20 70 43 74 78 2d 3e 6c 6f 63     if( pCtx->loc
30c10 6b 50 72 6f 78 79 50 61 74 68 21 3d 4e 55 4c 4c  kProxyPath!=NULL
30c20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74   ){.          st
30c30 72 6c 63 70 79 28 26 77 72 69 74 65 42 75 66 66  rlcpy(&writeBuff
30c40 65 72 5b 50 52 4f 58 59 5f 50 41 54 48 49 4e 44  er[PROXY_PATHIND
30c50 45 58 5d 2c 20 70 43 74 78 2d 3e 6c 6f 63 6b 50  EX], pCtx->lockP
30c60 72 6f 78 79 50 61 74 68 2c 20 4d 41 58 50 41 54  roxyPath, MAXPAT
30c70 48 4c 45 4e 29 3b 0a 20 20 20 20 20 20 20 20 7d  HLEN);.        }
30c80 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
30c90 73 74 72 6c 63 70 79 28 26 77 72 69 74 65 42 75  strlcpy(&writeBu
30ca0 66 66 65 72 5b 50 52 4f 58 59 5f 50 41 54 48 49  ffer[PROXY_PATHI
30cb0 4e 44 45 58 5d 2c 20 74 65 6d 70 4c 6f 63 6b 50  NDEX], tempLockP
30cc0 61 74 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29  ath, MAXPATHLEN)
30cd0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
30ce0 20 20 20 20 77 72 69 74 65 53 69 7a 65 20 3d 20      writeSize = 
30cf0 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 20  PROXY_PATHINDEX 
30d00 2b 20 73 74 72 6c 65 6e 28 26 77 72 69 74 65 42  + strlen(&writeB
30d10 75 66 66 65 72 5b 50 52 4f 58 59 5f 50 41 54 48  uffer[PROXY_PATH
30d20 49 4e 44 45 58 5d 29 3b 0a 20 20 20 20 20 20 20  INDEX]);.       
30d30 20 66 74 72 75 6e 63 61 74 65 28 63 6f 6e 63 68   ftruncate(conch
30d40 46 69 6c 65 2d 3e 68 2c 20 77 72 69 74 65 53 69  File->h, writeSi
30d50 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  ze);.        rc 
30d60 3d 20 75 6e 69 78 57 72 69 74 65 28 28 73 71 6c  = unixWrite((sql
30d70 69 74 65 33 5f 66 69 6c 65 20 2a 29 63 6f 6e 63  ite3_file *)conc
30d80 68 46 69 6c 65 2c 20 77 72 69 74 65 42 75 66 66  hFile, writeBuff
30d90 65 72 2c 20 77 72 69 74 65 53 69 7a 65 2c 20 30  er, writeSize, 0
30da0 29 3b 0a 20 20 20 20 20 20 20 20 66 73 79 6e 63  );.        fsync
30db0 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 29 3b 0a  (conchFile->h);.
30dc0 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65          /* If we
30dd0 20 63 72 65 61 74 65 64 20 61 20 6e 65 77 20 63   created a new c
30de0 6f 6e 63 68 20 66 69 6c 65 20 28 6e 6f 74 20 6a  onch file (not j
30df0 75 73 74 20 75 70 64 61 74 65 64 20 74 68 65 20  ust updated the 
30e00 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61 20 0a 20  contents of a . 
30e10 20 20 20 20 20 20 20 20 2a 2a 20 76 61 6c 69 64          ** valid
30e20 20 63 6f 6e 63 68 20 66 69 6c 65 29 2c 20 74 72   conch file), tr
30e30 79 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20 70  y to match the p
30e40 65 72 6d 69 73 73 69 6f 6e 73 20 6f 66 20 74 68  ermissions of th
30e50 65 20 64 61 74 61 62 61 73 65 20 0a 20 20 20 20  e database .    
30e60 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
30e70 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
30e80 4b 20 26 26 20 63 72 65 61 74 65 43 6f 6e 63 68  K && createConch
30e90 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74   ){.          st
30ea0 72 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20  ruct stat buf;. 
30eb0 20 20 20 20 20 20 20 20 20 69 6e 74 20 65 72 72           int err
30ec0 20 3d 20 66 73 74 61 74 28 70 46 69 6c 65 2d 3e   = fstat(pFile->
30ed0 68 2c 20 26 62 75 66 29 3b 0a 20 20 20 20 20 20  h, &buf);.      
30ee0 20 20 20 20 69 66 28 20 65 72 72 3d 3d 30 20 29      if( err==0 )
30ef0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 6f  {.            mo
30f00 64 65 5f 74 20 63 6d 6f 64 65 20 3d 20 62 75 66  de_t cmode = buf
30f10 2e 73 74 5f 6d 6f 64 65 26 28 53 5f 49 52 55 53  .st_mode&(S_IRUS
30f20 52 7c 53 5f 49 57 55 53 52 20 7c 20 53 5f 49 52  R|S_IWUSR | S_IR
30f30 47 52 50 7c 53 5f 49 57 47 52 50 20 7c 0a 20 20  GRP|S_IWGRP |.  
30f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30f60 20 20 20 20 20 20 53 5f 49 52 4f 54 48 7c 53 5f        S_IROTH|S_
30f70 49 57 4f 54 48 29 3b 0a 20 20 20 20 20 20 20 20  IWOTH);.        
30f80 20 20 20 20 2f 2a 20 74 72 79 20 74 6f 20 6d 61      /* try to ma
30f90 74 63 68 20 74 68 65 20 64 61 74 61 62 61 73 65  tch the database
30fa0 20 66 69 6c 65 20 52 2f 57 20 70 65 72 6d 69 73   file R/W permis
30fb0 73 69 6f 6e 73 2c 20 69 67 6e 6f 72 65 20 66 61  sions, ignore fa
30fc0 69 6c 75 72 65 20 2a 2f 0a 23 69 66 6e 64 65 66  ilure */.#ifndef
30fd0 20 53 51 4c 49 54 45 5f 50 52 4f 58 59 5f 44 45   SQLITE_PROXY_DE
30fe0 42 55 47 0a 20 20 20 20 20 20 20 20 20 20 20 20  BUG.            
30ff0 66 63 68 6d 6f 64 28 63 6f 6e 63 68 46 69 6c 65  fchmod(conchFile
31000 2d 3e 68 2c 20 63 6d 6f 64 65 29 3b 0a 23 65 6c  ->h, cmode);.#el
31010 73 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  se.            i
31020 66 28 20 66 63 68 6d 6f 64 28 63 6f 6e 63 68 46  f( fchmod(conchF
31030 69 6c 65 2d 3e 68 2c 20 63 6d 6f 64 65 29 21 3d  ile->h, cmode)!=
31040 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
31050 20 20 20 69 6e 74 20 63 6f 64 65 20 3d 20 65 72     int code = er
31060 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 20  rno;.           
31070 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
31080 72 2c 20 22 66 63 68 6d 6f 64 20 25 6f 20 46 41  r, "fchmod %o FA
31090 49 4c 45 44 20 77 69 74 68 20 25 64 20 25 73 5c  ILED with %d %s\
310a0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
310b0 20 20 20 20 20 20 20 20 20 20 63 6d 6f 64 65 2c            cmode,
310c0 20 63 6f 64 65 2c 20 73 74 72 65 72 72 6f 72 28   code, strerror(
310d0 63 6f 64 65 29 29 3b 0a 20 20 20 20 20 20 20 20  code));.        
310e0 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
310f0 20 20 20 20 20 20 20 20 20 20 20 66 70 72 69 6e             fprin
31100 74 66 28 73 74 64 65 72 72 2c 20 22 66 63 68 6d  tf(stderr, "fchm
31110 6f 64 20 25 6f 20 53 55 43 43 45 44 45 44 5c 6e  od %o SUCCEDED\n
31120 22 2c 63 6d 6f 64 65 29 3b 0a 20 20 20 20 20 20  ",cmode);.      
31130 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
31140 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
31150 20 20 20 20 20 69 6e 74 20 63 6f 64 65 20 3d 20       int code = 
31160 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20  errno;.         
31170 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
31180 72 2c 20 22 53 54 41 54 20 46 41 49 4c 45 44 5b  r, "STAT FAILED[
31190 25 64 5d 20 77 69 74 68 20 25 64 20 25 73 5c 6e  %d] with %d %s\n
311a0 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ", .            
311b0 20 20 20 20 20 20 20 20 65 72 72 2c 20 63 6f 64          err, cod
311c0 65 2c 20 73 74 72 65 72 72 6f 72 28 63 6f 64 65  e, strerror(code
311d0 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  ));.#endif.     
311e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
311f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63  .      }.      c
31200 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f  onchFile->pMetho
31210 64 2d 3e 78 55 6e 6c 6f 63 6b 28 28 73 71 6c 69  d->xUnlock((sqli
31220 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46  te3_file*)conchF
31230 69 6c 65 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b  ile, SHARED_LOCK
31240 29 3b 0a 20 20 20 20 20 20 0a 20 20 20 20 65 6e  );.      .    en
31250 64 5f 74 61 6b 65 63 6f 6e 63 68 3a 0a 20 20 20  d_takeconch:.   
31260 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 52 41     OSTRACE(("TRA
31270 4e 53 50 52 4f 58 59 3a 20 43 4c 4f 53 45 20 20  NSPROXY: CLOSE  
31280 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29  %d\n", pFile->h)
31290 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
312a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 46  =SQLITE_OK && pF
312b0 69 6c 65 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 29  ile->openFlags )
312c0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 46  {.        if( pF
312d0 69 6c 65 2d 3e 68 3e 3d 30 20 29 7b 0a 23 69 66  ile->h>=0 ){.#if
312e0 64 65 66 20 53 54 52 49 43 54 5f 43 4c 4f 53 45  def STRICT_CLOSE
312f0 5f 45 52 52 4f 52 0a 20 20 20 20 20 20 20 20 20  _ERROR.         
31300 20 69 66 28 20 63 6c 6f 73 65 28 70 46 69 6c 65   if( close(pFile
31310 2d 3e 68 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ->h) ){.        
31320 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
31330 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
31340 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
31350 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c   SQLITE_IOERR_CL
31360 4f 53 45 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  OSE;.          }
31370 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 20 20 20  .#else.         
31380 20 63 6c 6f 73 65 28 70 46 69 6c 65 2d 3e 68 29   close(pFile->h)
31390 3b 20 2f 2a 20 73 69 6c 65 6e 74 6c 79 20 6c 65  ; /* silently le
313a0 61 6b 20 66 64 20 69 66 20 66 61 69 6c 20 2a 2f  ak fd if fail */
313b0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
313c0 7d 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d  }.        pFile-
313d0 3e 68 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20  >h = -1;.       
313e0 20 69 6e 74 20 66 64 20 3d 20 6f 70 65 6e 28 70   int fd = open(p
313f0 43 74 78 2d 3e 64 62 50 61 74 68 2c 20 70 46 69  Ctx->dbPath, pFi
31400 6c 65 2d 3e 6f 70 65 6e 46 6c 61 67 73 2c 0a 20  le->openFlags,. 
31410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31420 20 20 20 20 20 53 51 4c 49 54 45 5f 44 45 46 41       SQLITE_DEFA
31430 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53  ULT_FILE_PERMISS
31440 49 4f 4e 53 29 3b 0a 20 20 20 20 20 20 20 20 4f  IONS);.        O
31450 53 54 52 41 43 45 28 28 22 54 52 41 4e 53 50 52  STRACE(("TRANSPR
31460 4f 58 59 3a 20 4f 50 45 4e 20 20 25 64 5c 6e 22  OXY: OPEN  %d\n"
31470 2c 20 66 64 29 29 3b 0a 20 20 20 20 20 20 20 20  , fd));.        
31480 69 66 28 20 66 64 3e 3d 30 20 29 7b 0a 20 20 20  if( fd>=0 ){.   
31490 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 20         pFile->h 
314a0 3d 20 66 64 3b 0a 20 20 20 20 20 20 20 20 7d 65  = fd;.        }e
314b0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72  lse{.          r
314c0 63 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  c=SQLITE_CANTOPE
314d0 4e 5f 42 4b 50 54 3b 20 2f 2a 20 53 51 4c 49 54  N_BKPT; /* SQLIT
314e0 45 5f 42 55 53 59 3f 20 70 72 6f 78 79 54 61 6b  E_BUSY? proxyTak
314f0 65 43 6f 6e 63 68 20 63 61 6c 6c 65 64 0a 20 20  eConch called.  
31500 20 20 20 20 20 20 20 20 20 64 75 72 69 6e 67 20           during 
31510 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 20 20 20 20 20  locking */.     
31520 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
31530 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
31540 45 5f 4f 4b 20 26 26 20 21 70 43 74 78 2d 3e 6c  E_OK && !pCtx->l
31550 6f 63 6b 50 72 6f 78 79 20 29 7b 0a 20 20 20 20  ockProxy ){.    
31560 20 20 20 20 63 68 61 72 20 2a 70 61 74 68 20 3d      char *path =
31570 20 74 65 6d 70 4c 6f 63 6b 50 61 74 68 20 3f 20   tempLockPath ? 
31580 74 65 6d 70 4c 6f 63 6b 50 61 74 68 20 3a 20 70  tempLockPath : p
31590 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61  Ctx->lockProxyPa
315a0 74 68 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  th;.        rc =
315b0 20 70 72 6f 78 79 43 72 65 61 74 65 55 6e 69 78   proxyCreateUnix
315c0 46 69 6c 65 28 70 61 74 68 2c 20 26 70 43 74 78  File(path, &pCtx
315d0 2d 3e 6c 6f 63 6b 50 72 6f 78 79 2c 20 31 29 3b  ->lockProxy, 1);
315e0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
315f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63  =SQLITE_OK && rc
31600 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 26  !=SQLITE_NOMEM &
31610 26 20 74 72 79 4f 6c 64 4c 6f 63 6b 50 61 74 68  & tryOldLockPath
31620 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
31630 20 77 65 20 63 6f 75 6c 64 6e 27 74 20 63 72 65   we couldn't cre
31640 61 74 65 20 74 68 65 20 70 72 6f 78 79 20 6c 6f  ate the proxy lo
31650 63 6b 20 66 69 6c 65 20 77 69 74 68 20 74 68 65  ck file with the
31660 20 6f 6c 64 20 6c 6f 63 6b 20 66 69 6c 65 20 70   old lock file p
31670 61 74 68 0a 20 20 20 20 20 20 20 20 20 20 20 2a  ath.           *
31680 2a 20 73 6f 20 74 72 79 20 61 67 61 69 6e 20 76  * so try again v
31690 69 61 20 61 75 74 6f 2d 6e 61 6d 69 6e 67 20 0a  ia auto-naming .
316a0 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20             */.  
316b0 20 20 20 20 20 20 20 20 66 6f 72 63 65 4e 65 77          forceNew
316c0 4c 6f 63 6b 50 61 74 68 20 3d 20 31 3b 0a 20 20  LockPath = 1;.  
316d0 20 20 20 20 20 20 20 20 74 72 79 4f 6c 64 4c 6f          tryOldLo
316e0 63 6b 50 61 74 68 20 3d 20 30 3b 0a 20 20 20 20  ckPath = 0;.    
316f0 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20        continue; 
31700 2f 2a 20 67 6f 20 62 61 63 6b 20 74 6f 20 74 68  /* go back to th
31710 65 20 64 6f 20 7b 7d 20 77 68 69 6c 65 20 73 74  e do {} while st
31720 61 72 74 20 70 6f 69 6e 74 2c 20 74 72 79 20 61  art point, try a
31730 67 61 69 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20  gain */.        
31740 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
31750 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
31760 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  K ){.        /* 
31770 4e 65 65 64 20 74 6f 20 6d 61 6b 65 20 61 20 63  Need to make a c
31780 6f 70 79 20 6f 66 20 70 61 74 68 20 69 66 20 77  opy of path if w
31790 65 20 65 78 74 72 61 63 74 65 64 20 74 68 65 20  e extracted the 
317a0 76 61 6c 75 65 0a 20 20 20 20 20 20 20 20 20 2a  value.         *
317b0 2a 20 66 72 6f 6d 20 74 68 65 20 63 6f 6e 63 68  * from the conch
317c0 20 66 69 6c 65 20 6f 72 20 74 68 65 20 70 61 74   file or the pat
317d0 68 20 77 61 73 20 61 6c 6c 6f 63 61 74 65 64 20  h was allocated 
317e0 6f 6e 20 74 68 65 20 73 74 61 63 6b 0a 20 20 20  on the stack.   
317f0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
31800 20 69 66 28 20 74 65 6d 70 4c 6f 63 6b 50 61 74   if( tempLockPat
31810 68 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  h ){.          p
31820 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61  Ctx->lockProxyPa
31830 74 68 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  th = sqlite3DbSt
31840 72 44 75 70 28 30 2c 20 74 65 6d 70 4c 6f 63 6b  rDup(0, tempLock
31850 50 61 74 68 29 3b 0a 20 20 20 20 20 20 20 20 20  Path);.         
31860 20 69 66 28 20 21 70 43 74 78 2d 3e 6c 6f 63 6b   if( !pCtx->lock
31870 50 72 6f 78 79 50 61 74 68 20 29 7b 0a 20 20 20  ProxyPath ){.   
31880 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
31890 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
318a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
318b0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
318c0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
318d0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 74  K ){.        pCt
318e0 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 20 3d 20 31  x->conchHeld = 1
318f0 3b 0a 20 20 20 20 20 20 20 20 0a 20 20 20 20 20  ;.        .     
31900 20 20 20 69 66 28 20 70 43 74 78 2d 3e 6c 6f 63     if( pCtx->loc
31910 6b 50 72 6f 78 79 2d 3e 70 4d 65 74 68 6f 64 20  kProxy->pMethod 
31920 3d 3d 20 26 61 66 70 49 6f 4d 65 74 68 6f 64 73  == &afpIoMethods
31930 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 66   ){.          af
31940 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  pLockingContext 
31950 2a 61 66 70 43 74 78 3b 0a 20 20 20 20 20 20 20  *afpCtx;.       
31960 20 20 20 61 66 70 43 74 78 20 3d 20 28 61 66 70     afpCtx = (afp
31970 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
31980 29 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79  )pCtx->lockProxy
31990 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
319a0 3b 0a 20 20 20 20 20 20 20 20 20 20 61 66 70 43  ;.          afpC
319b0 74 78 2d 3e 64 62 50 61 74 68 20 3d 20 70 43 74  tx->dbPath = pCt
319c0 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68  x->lockProxyPath
319d0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
319e0 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
319f0 20 20 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d     conchFile->pM
31a00 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28 28  ethod->xUnlock((
31a10 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f  sqlite3_file*)co
31a20 6e 63 68 46 69 6c 65 2c 20 4e 4f 5f 4c 4f 43 4b  nchFile, NO_LOCK
31a30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
31a40 20 4f 53 54 52 41 43 45 28 28 22 54 41 4b 45 43   OSTRACE(("TAKEC
31a50 4f 4e 43 48 20 20 25 64 20 25 73 5c 6e 22 2c 20  ONCH  %d %s\n", 
31a60 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 0a 20 20  conchFile->h,.  
31a70 20 20 20 20 20 20 20 20 20 20 20 20 20 72 63 3d               rc=
31a80 3d 53 51 4c 49 54 45 5f 4f 4b 3f 22 6f 6b 22 3a  =SQLITE_OK?"ok":
31a90 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 20 20  "failed"));.    
31aa0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
31ab0 20 7d 20 77 68 69 6c 65 20 28 31 29 3b 20 2f 2a   } while (1); /*
31ac0 20 69 6e 20 63 61 73 65 20 77 65 20 6e 65 65 64   in case we need
31ad0 20 74 6f 20 72 65 74 72 79 20 74 68 65 20 3a 61   to retry the :a
31ae0 75 74 6f 3a 20 6c 6f 63 6b 20 66 69 6c 65 20 2d  uto: lock file -
31af0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
31b00 20 20 20 2a 2a 20 77 65 20 73 68 6f 75 6c 64 20     ** we should 
31b10 6e 65 76 65 72 20 67 65 74 20 68 65 72 65 20 65  never get here e
31b20 78 63 65 70 74 20 76 69 61 20 74 68 65 20 27 63  xcept via the 'c
31b30 6f 6e 74 69 6e 75 65 27 20 63 61 6c 6c 2e 20 2a  ontinue' call. *
31b40 2f 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  /.  }.}../*.** I
31b50 66 20 70 46 69 6c 65 20 68 6f 6c 64 73 20 61 20  f pFile holds a 
31b60 6c 6f 63 6b 20 6f 6e 20 61 20 63 6f 6e 63 68 20  lock on a conch 
31b70 66 69 6c 65 2c 20 74 68 65 6e 20 72 65 6c 65 61  file, then relea
31b80 73 65 20 74 68 61 74 20 6c 6f 63 6b 2e 0a 2a 2f  se that lock..*/
31b90 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
31ba0 79 52 65 6c 65 61 73 65 43 6f 6e 63 68 28 75 6e  yReleaseConch(un
31bb0 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a  ixFile *pFile){.
31bc0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
31bd0 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 2f 2a  E_OK;         /*
31be0 20 53 75 62 72 6f 75 74 69 6e 65 20 72 65 74 75   Subroutine retu
31bf0 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 70 72 6f  rn code */.  pro
31c00 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  xyLockingContext
31c10 20 2a 70 43 74 78 3b 20 20 2f 2a 20 54 68 65 20   *pCtx;  /* The 
31c20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20  locking context 
31c30 66 6f 72 20 74 68 65 20 70 72 6f 78 79 20 6c 6f  for the proxy lo
31c40 63 6b 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65  ck */.  unixFile
31c50 20 2a 63 6f 6e 63 68 46 69 6c 65 3b 20 20 20 20   *conchFile;    
31c60 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
31c70 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 2a 2f  he conch file */
31c80 0a 0a 20 20 70 43 74 78 20 3d 20 28 70 72 6f 78  ..  pCtx = (prox
31c90 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  yLockingContext 
31ca0 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  *)pFile->locking
31cb0 43 6f 6e 74 65 78 74 3b 0a 20 20 63 6f 6e 63 68  Context;.  conch
31cc0 46 69 6c 65 20 3d 20 70 43 74 78 2d 3e 63 6f 6e  File = pCtx->con
31cd0 63 68 46 69 6c 65 3b 0a 20 20 4f 53 54 52 41 43  chFile;.  OSTRAC
31ce0 45 28 28 22 52 45 4c 45 41 53 45 43 4f 4e 43 48  E(("RELEASECONCH
31cf0 20 20 25 64 20 66 6f 72 20 25 73 20 70 69 64 3d    %d for %s pid=
31d00 25 64 5c 6e 22 2c 20 63 6f 6e 63 68 46 69 6c 65  %d\n", conchFile
31d10 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ->h,.           
31d20 28 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79  (pCtx->lockProxy
31d30 50 61 74 68 20 3f 20 70 43 74 78 2d 3e 6c 6f 63  Path ? pCtx->loc
31d40 6b 50 72 6f 78 79 50 61 74 68 20 3a 20 22 3a 61  kProxyPath : ":a
31d50 75 74 6f 3a 22 29 2c 20 0a 20 20 20 20 20 20 20  uto:"), .       
31d60 20 20 20 20 67 65 74 70 69 64 28 29 29 29 3b 0a      getpid()));.
31d70 20 20 69 66 28 20 70 43 74 78 2d 3e 63 6f 6e 63    if( pCtx->conc
31d80 68 48 65 6c 64 3e 30 20 29 7b 0a 20 20 20 20 72  hHeld>0 ){.    r
31d90 63 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70  c = conchFile->p
31da0 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28  Method->xUnlock(
31db0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63  (sqlite3_file*)c
31dc0 6f 6e 63 68 46 69 6c 65 2c 20 4e 4f 5f 4c 4f 43  onchFile, NO_LOC
31dd0 4b 29 3b 0a 20 20 7d 0a 20 20 70 43 74 78 2d 3e  K);.  }.  pCtx->
31de0 63 6f 6e 63 68 48 65 6c 64 20 3d 20 30 3b 0a 20  conchHeld = 0;. 
31df0 20 4f 53 54 52 41 43 45 28 28 22 52 45 4c 45 41   OSTRACE(("RELEA
31e00 53 45 43 4f 4e 43 48 20 20 25 64 20 25 73 5c 6e  SECONCH  %d %s\n
31e10 22 2c 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c  ", conchFile->h,
31e20 0a 20 20 20 20 20 20 20 20 20 20 20 28 72 63 3d  .           (rc=
31e30 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b  =SQLITE_OK ? "ok
31e40 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29 29 3b  " : "failed")));
31e50 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
31e60 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65  ./*.** Given the
31e70 20 6e 61 6d 65 20 6f 66 20 61 20 64 61 74 61 62   name of a datab
31e80 61 73 65 20 66 69 6c 65 2c 20 63 6f 6d 70 75 74  ase file, comput
31e90 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 69 74  e the name of it
31ea0 73 20 63 6f 6e 63 68 20 66 69 6c 65 2e 0a 2a 2a  s conch file..**
31eb0 20 53 74 6f 72 65 20 74 68 65 20 63 6f 6e 63 68   Store the conch
31ec0 20 66 69 6c 65 6e 61 6d 65 20 69 6e 20 6d 65 6d   filename in mem
31ed0 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ory obtained fro
31ee0 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  m sqlite3_malloc
31ef0 28 29 2e 0a 2a 2a 20 4d 61 6b 65 20 2a 70 43 6f  ()..** Make *pCo
31f00 6e 63 68 50 61 74 68 20 70 6f 69 6e 74 20 74 6f  nchPath point to
31f10 20 74 68 65 20 6e 65 77 20 6e 61 6d 65 2e 20 20   the new name.  
31f20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
31f30 20 6f 6e 20 73 75 63 63 65 73 73 0a 2a 2a 20 6f   on success.** o
31f40 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69  r SQLITE_NOMEM i
31f50 66 20 75 6e 61 62 6c 65 20 74 6f 20 6f 62 74 61  f unable to obta
31f60 69 6e 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a  in memory..**.**
31f70 20 54 68 65 20 63 61 6c 6c 65 72 20 69 73 20 72   The caller is r
31f80 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 65  esponsible for e
31f90 6e 73 75 72 69 6e 67 20 74 68 61 74 20 74 68 65  nsuring that the
31fa0 20 61 6c 6c 6f 63 61 74 65 64 20 6d 65 6d 6f 72   allocated memor
31fb0 79 0a 2a 2a 20 73 70 61 63 65 20 69 73 20 65 76  y.** space is ev
31fc0 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 64 2e 0a  entually freed..
31fd0 2a 2a 0a 2a 2a 20 2a 70 43 6f 6e 63 68 50 61 74  **.** *pConchPat
31fe0 68 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c  h is set to NULL
31ff0 20 69 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c   if a memory all
32000 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 6f 63  ocation error oc
32010 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  curs..*/.static 
32020 69 6e 74 20 70 72 6f 78 79 43 72 65 61 74 65 43  int proxyCreateC
32030 6f 6e 63 68 50 61 74 68 6e 61 6d 65 28 63 68 61  onchPathname(cha
32040 72 20 2a 64 62 50 61 74 68 2c 20 63 68 61 72 20  r *dbPath, char 
32050 2a 2a 70 43 6f 6e 63 68 50 61 74 68 29 7b 0a 20  **pConchPath){. 
32060 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
32070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
32080 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
32090 2f 0a 20 20 69 6e 74 20 6c 65 6e 20 3d 20 28 69  /.  int len = (i
320a0 6e 74 29 73 74 72 6c 65 6e 28 64 62 50 61 74 68  nt)strlen(dbPath
320b0 29 3b 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20  ); /* Length of 
320c0 64 61 74 61 62 61 73 65 20 66 69 6c 65 6e 61 6d  database filenam
320d0 65 20 2d 20 64 62 50 61 74 68 20 2a 2f 0a 20 20  e - dbPath */.  
320e0 63 68 61 72 20 2a 63 6f 6e 63 68 50 61 74 68 3b  char *conchPath;
320f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
32100 20 62 75 66 66 65 72 20 69 6e 20 77 68 69 63 68   buffer in which
32110 20 74 6f 20 63 6f 6e 73 74 72 75 63 74 20 63 6f   to construct co
32120 6e 63 68 20 6e 61 6d 65 20 2a 2f 0a 0a 20 20 2f  nch name */..  /
32130 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  * Allocate space
32140 20 66 6f 72 20 74 68 65 20 63 6f 6e 63 68 20 66   for the conch f
32150 69 6c 65 6e 61 6d 65 20 61 6e 64 20 69 6e 69 74  ilename and init
32160 69 61 6c 69 7a 65 20 74 68 65 20 6e 61 6d 65 20  ialize the name 
32170 74 6f 0a 20 20 2a 2a 20 74 68 65 20 6e 61 6d 65  to.  ** the name
32180 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   of the original
32190 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
321a0 2a 2f 20 20 0a 20 20 2a 70 43 6f 6e 63 68 50 61  */  .  *pConchPa
321b0 74 68 20 3d 20 63 6f 6e 63 68 50 61 74 68 20 3d  th = conchPath =
321c0 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33   (char *)sqlite3
321d0 5f 6d 61 6c 6c 6f 63 28 6c 65 6e 20 2b 20 38 29  _malloc(len + 8)
321e0 3b 0a 20 20 69 66 28 20 63 6f 6e 63 68 50 61 74  ;.  if( conchPat
321f0 68 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  h==0 ){.    retu
32200 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
32210 0a 20 20 7d 0a 20 20 6d 65 6d 63 70 79 28 63 6f  .  }.  memcpy(co
32220 6e 63 68 50 61 74 68 2c 20 64 62 50 61 74 68 2c  nchPath, dbPath,
32230 20 6c 65 6e 2b 31 29 3b 0a 20 20 0a 20 20 2f 2a   len+1);.  .  /*
32240 20 6e 6f 77 20 69 6e 73 65 72 74 20 61 20 22 2e   now insert a ".
32250 22 20 62 65 66 6f 72 65 20 74 68 65 20 6c 61 73  " before the las
32260 74 20 2f 20 63 68 61 72 61 63 74 65 72 20 2a 2f  t / character */
32270 0a 20 20 66 6f 72 28 20 69 3d 28 6c 65 6e 2d 31  .  for( i=(len-1
32280 29 3b 20 69 3e 3d 30 3b 20 69 2d 2d 20 29 7b 0a  ); i>=0; i-- ){.
32290 20 20 20 20 69 66 28 20 63 6f 6e 63 68 50 61 74      if( conchPat
322a0 68 5b 69 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20  h[i]=='/' ){.   
322b0 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 62 72     i++;.      br
322c0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
322d0 20 63 6f 6e 63 68 50 61 74 68 5b 69 5d 3d 27 2e   conchPath[i]='.
322e0 27 3b 0a 20 20 77 68 69 6c 65 20 28 20 69 3c 6c  ';.  while ( i<l
322f0 65 6e 20 29 7b 0a 20 20 20 20 63 6f 6e 63 68 50  en ){.    conchP
32300 61 74 68 5b 69 2b 31 5d 3d 64 62 50 61 74 68 5b  ath[i+1]=dbPath[
32310 69 5d 3b 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d  i];.    i++;.  }
32320 0a 0a 20 20 2f 2a 20 61 70 70 65 6e 64 20 74 68  ..  /* append th
32330 65 20 22 2d 63 6f 6e 63 68 22 20 73 75 66 66 69  e "-conch" suffi
32340 78 20 74 6f 20 74 68 65 20 66 69 6c 65 20 2a 2f  x to the file */
32350 0a 20 20 6d 65 6d 63 70 79 28 26 63 6f 6e 63 68  .  memcpy(&conch
32360 50 61 74 68 5b 69 2b 31 5d 2c 20 22 2d 63 6f 6e  Path[i+1], "-con
32370 63 68 22 2c 20 37 29 3b 0a 20 20 61 73 73 65 72  ch", 7);.  asser
32380 74 28 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 63  t( (int)strlen(c
32390 6f 6e 63 68 50 61 74 68 29 20 3d 3d 20 6c 65 6e  onchPath) == len
323a0 2b 37 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  +7 );..  return 
323b0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f  SQLITE_OK;.}.../
323c0 2a 20 54 61 6b 65 73 20 61 20 66 75 6c 6c 79 20  * Takes a fully 
323d0 63 6f 6e 66 69 67 75 72 65 64 20 70 72 6f 78 79  configured proxy
323e0 20 6c 6f 63 6b 69 6e 67 2d 73 74 79 6c 65 20 75   locking-style u
323f0 6e 69 78 20 66 69 6c 65 20 61 6e 64 20 73 77 69  nix file and swi
32400 74 63 68 65 73 0a 2a 2a 20 74 68 65 20 6c 6f 63  tches.** the loc
32410 61 6c 20 6c 6f 63 6b 20 66 69 6c 65 20 70 61 74  al lock file pat
32420 68 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  h .*/.static int
32430 20 73 77 69 74 63 68 4c 6f 63 6b 50 72 6f 78 79   switchLockProxy
32440 50 61 74 68 28 75 6e 69 78 46 69 6c 65 20 2a 70  Path(unixFile *p
32450 46 69 6c 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  File, const char
32460 20 2a 70 61 74 68 29 20 7b 0a 20 20 70 72 6f 78   *path) {.  prox
32470 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  yLockingContext 
32480 2a 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f  *pCtx = (proxyLo
32490 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2a 29 70 46  ckingContext*)pF
324a0 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
324b0 65 78 74 3b 0a 20 20 63 68 61 72 20 2a 6f 6c 64  ext;.  char *old
324c0 50 61 74 68 20 3d 20 70 43 74 78 2d 3e 6c 6f 63  Path = pCtx->loc
324d0 6b 50 72 6f 78 79 50 61 74 68 3b 0a 20 20 69 6e  kProxyPath;.  in
324e0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
324f0 3b 0a 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  ;..  if( pFile->
32500 65 46 69 6c 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f  eFileLock!=NO_LO
32510 43 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  CK ){.    return
32520 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
32530 7d 20 20 0a 0a 20 20 2f 2a 20 6e 6f 74 68 69 6e  }  ..  /* nothin
32540 67 20 74 6f 20 64 6f 20 69 66 20 74 68 65 20 70  g to do if the p
32550 61 74 68 20 69 73 20 4e 55 4c 4c 2c 20 3a 61 75  ath is NULL, :au
32560 74 6f 3a 20 6f 72 20 6d 61 74 63 68 65 73 20 74  to: or matches t
32570 68 65 20 65 78 69 73 74 69 6e 67 20 70 61 74 68  he existing path
32580 20 2a 2f 0a 20 20 69 66 28 20 21 70 61 74 68 20   */.  if( !path 
32590 7c 7c 20 70 61 74 68 5b 30 5d 3d 3d 27 5c 30 27  || path[0]=='\0'
325a0 20 7c 7c 20 21 73 74 72 63 6d 70 28 70 61 74 68   || !strcmp(path
325b0 2c 20 22 3a 61 75 74 6f 3a 22 29 20 7c 7c 0a 20  , ":auto:") ||. 
325c0 20 20 20 28 6f 6c 64 50 61 74 68 20 26 26 20 21     (oldPath && !
325d0 73 74 72 6e 63 6d 70 28 6f 6c 64 50 61 74 68 2c  strncmp(oldPath,
325e0 20 70 61 74 68 2c 20 4d 41 58 50 41 54 48 4c 45   path, MAXPATHLE
325f0 4e 29 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  N)) ){.    retur
32600 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
32610 65 6c 73 65 7b 0a 20 20 20 20 75 6e 69 78 46 69  else{.    unixFi
32620 6c 65 20 2a 6c 6f 63 6b 50 72 6f 78 79 20 3d 20  le *lockProxy = 
32630 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 3b  pCtx->lockProxy;
32640 0a 20 20 20 20 70 43 74 78 2d 3e 6c 6f 63 6b 50  .    pCtx->lockP
32650 72 6f 78 79 3d 4e 55 4c 4c 3b 0a 20 20 20 20 70  roxy=NULL;.    p
32660 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 20 3d  Ctx->conchHeld =
32670 20 30 3b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b   0;.    if( lock
32680 50 72 6f 78 79 21 3d 4e 55 4c 4c 20 29 7b 0a 20  Proxy!=NULL ){. 
32690 20 20 20 20 20 72 63 3d 6c 6f 63 6b 50 72 6f 78       rc=lockProx
326a0 79 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 43 6c 6f  y->pMethod->xClo
326b0 73 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  se((sqlite3_file
326c0 20 2a 29 6c 6f 63 6b 50 72 6f 78 79 29 3b 0a 20   *)lockProxy);. 
326d0 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
326e0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 73  turn rc;.      s
326f0 71 6c 69 74 65 33 5f 66 72 65 65 28 6c 6f 63 6b  qlite3_free(lock
32700 50 72 6f 78 79 29 3b 0a 20 20 20 20 7d 0a 20 20  Proxy);.    }.  
32710 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 6f    sqlite3_free(o
32720 6c 64 50 61 74 68 29 3b 0a 20 20 20 20 70 43 74  ldPath);.    pCt
32730 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68  x->lockProxyPath
32740 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
32750 75 70 28 30 2c 20 70 61 74 68 29 3b 0a 20 20 7d  up(0, path);.  }
32760 0a 20 20 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  .  .  return rc;
32770 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 46 69 6c 65 20  .}../*.** pFile 
32780 69 73 20 61 20 66 69 6c 65 20 74 68 61 74 20 68  is a file that h
32790 61 73 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 62  as been opened b
327a0 79 20 61 20 70 72 69 6f 72 20 78 4f 70 65 6e 20  y a prior xOpen 
327b0 63 61 6c 6c 2e 20 20 64 62 50 61 74 68 0a 2a 2a  call.  dbPath.**
327c0 20 69 73 20 61 20 73 74 72 69 6e 67 20 62 75 66   is a string buf
327d0 66 65 72 20 61 74 20 6c 65 61 73 74 20 4d 41 58  fer at least MAX
327e0 50 41 54 48 4c 45 4e 2b 31 20 63 68 61 72 61 63  PATHLEN+1 charac
327f0 74 65 72 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a  ters in size..**
32800 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
32810 20 66 69 6e 64 20 74 68 65 20 66 69 6c 65 6e 61   find the filena
32820 6d 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  me associated wi
32830 74 68 20 70 46 69 6c 65 20 61 6e 64 20 77 72 69  th pFile and wri
32840 74 65 73 20 69 74 0a 2a 2a 20 69 6e 74 20 64 62  tes it.** int db
32850 50 61 74 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Path..*/.static 
32860 69 6e 74 20 67 65 74 44 62 50 61 74 68 46 6f 72  int getDbPathFor
32870 55 6e 69 78 46 69 6c 65 28 75 6e 69 78 46 69 6c  UnixFile(unixFil
32880 65 20 2a 70 46 69 6c 65 2c 20 63 68 61 72 20 2a  e *pFile, char *
32890 64 62 50 61 74 68 29 7b 0a 23 69 66 20 64 65 66  dbPath){.#if def
328a0 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a  ined(__APPLE__).
328b0 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 4d 65    if( pFile->pMe
328c0 74 68 6f 64 20 3d 3d 20 26 61 66 70 49 6f 4d 65  thod == &afpIoMe
328d0 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f 2a 20  thods ){.    /* 
328e0 61 66 70 20 73 74 79 6c 65 20 6b 65 65 70 73 20  afp style keeps 
328f0 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  a reference to t
32900 68 65 20 64 62 20 70 61 74 68 20 69 6e 20 74 68  he db path in th
32910 65 20 66 69 6c 65 50 61 74 68 20 66 69 65 6c 64  e filePath field
32920 20 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20   .    ** of the 
32930 73 74 72 75 63 74 20 2a 2f 0a 20 20 20 20 61 73  struct */.    as
32940 73 65 72 74 28 20 28 69 6e 74 29 73 74 72 6c 65  sert( (int)strle
32950 6e 28 28 63 68 61 72 2a 29 70 46 69 6c 65 2d 3e  n((char*)pFile->
32960 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3c  lockingContext)<
32970 3d 4d 41 58 50 41 54 48 4c 45 4e 20 29 3b 0a 20  =MAXPATHLEN );. 
32980 20 20 20 73 74 72 6c 63 70 79 28 64 62 50 61 74     strlcpy(dbPat
32990 68 2c 20 28 28 61 66 70 4c 6f 63 6b 69 6e 67 43  h, ((afpLockingC
329a0 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e  ontext *)pFile->
329b0 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 2d  lockingContext)-
329c0 3e 64 62 50 61 74 68 2c 20 4d 41 58 50 41 54 48  >dbPath, MAXPATH
329d0 4c 45 4e 29 3b 0a 20 20 7d 20 65 6c 73 65 0a 23  LEN);.  } else.#
329e0 65 6e 64 69 66 0a 20 20 69 66 28 20 70 46 69 6c  endif.  if( pFil
329f0 65 2d 3e 70 4d 65 74 68 6f 64 20 3d 3d 20 26 64  e->pMethod == &d
32a00 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 20  otlockIoMethods 
32a10 29 7b 0a 20 20 20 20 2f 2a 20 64 6f 74 20 6c 6f  ){.    /* dot lo
32a20 63 6b 20 73 74 79 6c 65 20 75 73 65 73 20 74 68  ck style uses th
32a30 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78  e locking contex
32a40 74 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 64  t to store the d
32a50 6f 74 20 6c 6f 63 6b 0a 20 20 20 20 2a 2a 20 66  ot lock.    ** f
32a60 69 6c 65 20 70 61 74 68 20 2a 2f 0a 20 20 20 20  ile path */.    
32a70 69 6e 74 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e  int len = strlen
32a80 28 28 63 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e  ((char *)pFile->
32a90 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 20  lockingContext) 
32aa0 2d 20 73 74 72 6c 65 6e 28 44 4f 54 4c 4f 43 4b  - strlen(DOTLOCK
32ab0 5f 53 55 46 46 49 58 29 3b 0a 20 20 20 20 6d 65  _SUFFIX);.    me
32ac0 6d 63 70 79 28 64 62 50 61 74 68 2c 20 28 63 68  mcpy(dbPath, (ch
32ad0 61 72 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ar *)pFile->lock
32ae0 69 6e 67 43 6f 6e 74 65 78 74 2c 20 6c 65 6e 20  ingContext, len 
32af0 2b 20 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  + 1);.  }else{. 
32b00 20 20 20 2f 2a 20 61 6c 6c 20 6f 74 68 65 72 20     /* all other 
32b10 73 74 79 6c 65 73 20 75 73 65 20 74 68 65 20 6c  styles use the l
32b20 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 74  ocking context t
32b30 6f 20 73 74 6f 72 65 20 74 68 65 20 64 62 20 66  o store the db f
32b40 69 6c 65 20 70 61 74 68 20 2a 2f 0a 20 20 20 20  ile path */.    
32b50 61 73 73 65 72 74 28 20 73 74 72 6c 65 6e 28 28  assert( strlen((
32b60 63 68 61 72 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63  char*)pFile->loc
32b70 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3c 3d 4d 41  kingContext)<=MA
32b80 58 50 41 54 48 4c 45 4e 20 29 3b 0a 20 20 20 20  XPATHLEN );.    
32b90 73 74 72 6c 63 70 79 28 64 62 50 61 74 68 2c 20  strlcpy(dbPath, 
32ba0 28 63 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e 6c  (char *)pFile->l
32bb0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2c 20 4d  ockingContext, M
32bc0 41 58 50 41 54 48 4c 45 4e 29 3b 0a 20 20 7d 0a  AXPATHLEN);.  }.
32bd0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
32be0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 61 6b  OK;.}../*.** Tak
32bf0 65 73 20 61 6e 20 61 6c 72 65 61 64 79 20 66 69  es an already fi
32c00 6c 6c 65 64 20 69 6e 20 75 6e 69 78 20 66 69 6c  lled in unix fil
32c10 65 20 61 6e 64 20 61 6c 74 65 72 73 20 69 74 20  e and alters it 
32c20 73 6f 20 61 6c 6c 20 66 69 6c 65 20 6c 6f 63 6b  so all file lock
32c30 69 6e 67 20 0a 2a 2a 20 77 69 6c 6c 20 62 65 20  ing .** will be 
32c40 70 65 72 66 6f 72 6d 65 64 20 6f 6e 20 74 68 65  performed on the
32c50 20 6c 6f 63 61 6c 20 70 72 6f 78 79 20 6c 6f 63   local proxy loc
32c60 6b 20 66 69 6c 65 2e 20 20 54 68 65 20 66 6f 6c  k file.  The fol
32c70 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 0a 2a 2a  lowing fields.**
32c80 20 61 72 65 20 70 72 65 73 65 72 76 65 64 20 69   are preserved i
32c90 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f  n the locking co
32ca0 6e 74 65 78 74 20 73 6f 20 74 68 61 74 20 74 68  ntext so that th
32cb0 65 79 20 63 61 6e 20 62 65 20 72 65 73 74 6f 72  ey can be restor
32cc0 65 64 20 61 6e 64 20 0a 2a 2a 20 74 68 65 20 75  ed and .** the u
32cd0 6e 69 78 20 73 74 72 75 63 74 75 72 65 20 70 72  nix structure pr
32ce0 6f 70 65 72 6c 79 20 63 6c 65 61 6e 65 64 20 75  operly cleaned u
32cf0 70 20 61 74 20 63 6c 6f 73 65 20 74 69 6d 65 3a  p at close time:
32d00 0a 2a 2a 20 20 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  .**  ->lockingCo
32d10 6e 74 65 78 74 0a 2a 2a 20 20 2d 3e 70 4d 65 74  ntext.**  ->pMet
32d20 68 6f 64 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  hod.*/.static in
32d30 74 20 70 72 6f 78 79 54 72 61 6e 73 66 6f 72 6d  t proxyTransform
32d40 55 6e 69 78 46 69 6c 65 28 75 6e 69 78 46 69 6c  UnixFile(unixFil
32d50 65 20 2a 70 46 69 6c 65 2c 20 63 6f 6e 73 74 20  e *pFile, const 
32d60 63 68 61 72 20 2a 70 61 74 68 29 20 7b 0a 20 20  char *path) {.  
32d70 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
32d80 65 78 74 20 2a 70 43 74 78 3b 0a 20 20 63 68 61  ext *pCtx;.  cha
32d90 72 20 64 62 50 61 74 68 5b 4d 41 58 50 41 54 48  r dbPath[MAXPATH
32da0 4c 45 4e 2b 31 5d 3b 20 20 20 20 20 20 20 2f 2a  LEN+1];       /*
32db0 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   Name of the dat
32dc0 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
32dd0 63 68 61 72 20 2a 6c 6f 63 6b 50 61 74 68 3d 4e  char *lockPath=N
32de0 55 4c 4c 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ULL;.  int rc = 
32df0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 0a 20 20  SQLITE_OK;.  .  
32e00 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  if( pFile->eFile
32e10 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b  Lock!=NO_LOCK ){
32e20 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
32e30 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 20 20 67  TE_BUSY;.  }.  g
32e40 65 74 44 62 50 61 74 68 46 6f 72 55 6e 69 78 46  etDbPathForUnixF
32e50 69 6c 65 28 70 46 69 6c 65 2c 20 64 62 50 61 74  ile(pFile, dbPat
32e60 68 29 3b 0a 20 20 69 66 28 20 21 70 61 74 68 20  h);.  if( !path 
32e70 7c 7c 20 70 61 74 68 5b 30 5d 3d 3d 27 5c 30 27  || path[0]=='\0'
32e80 20 7c 7c 20 21 73 74 72 63 6d 70 28 70 61 74 68   || !strcmp(path
32e90 2c 20 22 3a 61 75 74 6f 3a 22 29 20 29 7b 0a 20  , ":auto:") ){. 
32ea0 20 20 20 6c 6f 63 6b 50 61 74 68 3d 4e 55 4c 4c     lockPath=NULL
32eb0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6c  ;.  }else{.    l
32ec0 6f 63 6b 50 61 74 68 3d 28 63 68 61 72 20 2a 29  ockPath=(char *)
32ed0 70 61 74 68 3b 0a 20 20 7d 0a 20 20 0a 20 20 4f  path;.  }.  .  O
32ee0 53 54 52 41 43 45 28 28 22 54 52 41 4e 53 50 52  STRACE(("TRANSPR
32ef0 4f 58 59 20 20 25 64 20 66 6f 72 20 25 73 20 70  OXY  %d for %s p
32f00 69 64 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d  id=%d\n", pFile-
32f10 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 28  >h,.           (
32f20 6c 6f 63 6b 50 61 74 68 20 3f 20 6c 6f 63 6b 50  lockPath ? lockP
32f30 61 74 68 20 3a 20 22 3a 61 75 74 6f 3a 22 29 2c  ath : ":auto:"),
32f40 20 67 65 74 70 69 64 28 29 29 29 3b 0a 0a 20 20   getpid()));..  
32f50 70 43 74 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d  pCtx = sqlite3_m
32f60 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70  alloc( sizeof(*p
32f70 43 74 78 29 20 29 3b 0a 20 20 69 66 28 20 70 43  Ctx) );.  if( pC
32f80 74 78 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  tx==0 ){.    ret
32f90 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
32fa0 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70  ;.  }.  memset(p
32fb0 43 74 78 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  Ctx, 0, sizeof(*
32fc0 70 43 74 78 29 29 3b 0a 0a 20 20 72 63 20 3d 20  pCtx));..  rc = 
32fd0 70 72 6f 78 79 43 72 65 61 74 65 43 6f 6e 63 68  proxyCreateConch
32fe0 50 61 74 68 6e 61 6d 65 28 64 62 50 61 74 68 2c  Pathname(dbPath,
32ff0 20 26 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c   &pCtx->conchFil
33000 65 50 61 74 68 29 3b 0a 20 20 69 66 28 20 72 63  ePath);.  if( rc
33010 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
33020 20 20 20 72 63 20 3d 20 70 72 6f 78 79 43 72 65     rc = proxyCre
33030 61 74 65 55 6e 69 78 46 69 6c 65 28 70 43 74 78  ateUnixFile(pCtx
33040 2d 3e 63 6f 6e 63 68 46 69 6c 65 50 61 74 68 2c  ->conchFilePath,
33050 20 26 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c   &pCtx->conchFil
33060 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  e, 0);.    if( r
33070 63 3d 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  c==SQLITE_CANTOP
33080 45 4e 20 26 26 20 28 28 70 46 69 6c 65 2d 3e 6f  EN && ((pFile->o
33090 70 65 6e 46 6c 61 67 73 26 4f 5f 52 44 57 52 29  penFlags&O_RDWR)
330a0 20 3d 3d 20 30 29 20 29 7b 0a 20 20 20 20 20 20   == 0) ){.      
330b0 2f 2a 20 69 66 20 28 61 29 20 74 68 65 20 6f 70  /* if (a) the op
330c0 65 6e 20 66 6c 61 67 73 20 61 72 65 20 6e 6f 74  en flags are not
330d0 20 4f 5f 52 44 57 52 2c 20 28 62 29 20 74 68 65   O_RDWR, (b) the
330e0 20 63 6f 6e 63 68 20 69 73 6e 27 74 20 74 68 65   conch isn't the
330f0 72 65 2c 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a  re, and.      **
33100 20 28 63 29 20 74 68 65 20 66 69 6c 65 20 73 79   (c) the file sy
33110 73 74 65 6d 20 69 73 20 72 65 61 64 2d 6f 6e 6c  stem is read-onl
33120 79 2c 20 74 68 65 6e 20 65 6e 61 62 6c 65 20 6e  y, then enable n
33130 6f 2d 6c 6f 63 6b 69 6e 67 20 61 63 63 65 73 73  o-locking access
33140 2e 0a 20 20 20 20 20 20 2a 2a 20 55 67 68 2c 20  ..      ** Ugh, 
33150 73 69 6e 63 65 20 4f 5f 52 44 4f 4e 4c 59 3d 3d  since O_RDONLY==
33160 30 78 30 30 30 30 20 77 65 20 74 65 73 74 20 66  0x0000 we test f
33170 6f 72 20 21 4f 5f 52 44 57 52 20 73 69 6e 63 65  or !O_RDWR since
33180 20 75 6e 69 78 4f 70 65 6e 20 61 73 73 65 72 74   unixOpen assert
33190 73 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20  s.      ** that 
331a0 6f 70 65 6e 46 6c 61 67 73 20 77 69 6c 6c 20 68  openFlags will h
331b0 61 76 65 20 6f 6e 6c 79 20 6f 6e 65 20 6f 66 20  ave only one of 
331c0 4f 5f 52 44 4f 4e 4c 59 20 6f 72 20 4f 5f 52 44  O_RDONLY or O_RD
331d0 57 52 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  WR..      */.   
331e0 20 20 20 73 74 72 75 63 74 20 73 74 61 74 66 73     struct statfs
331f0 20 66 73 49 6e 66 6f 3b 0a 20 20 20 20 20 20 73   fsInfo;.      s
33200 74 72 75 63 74 20 73 74 61 74 20 63 6f 6e 63 68  truct stat conch
33210 49 6e 66 6f 3b 0a 20 20 20 20 20 20 69 6e 74 20  Info;.      int 
33220 67 6f 4c 6f 63 6b 6c 65 73 73 20 3d 20 30 3b 0a  goLockless = 0;.
33230 0a 20 20 20 20 20 20 69 66 28 20 73 74 61 74 28  .      if( stat(
33240 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 50  pCtx->conchFileP
33250 61 74 68 2c 20 26 63 6f 6e 63 68 49 6e 66 6f 29  ath, &conchInfo)
33260 20 3d 3d 20 2d 31 20 29 20 7b 0a 20 20 20 20 20   == -1 ) {.     
33270 20 20 20 69 6e 74 20 65 72 72 20 3d 20 65 72 72     int err = err
33280 6e 6f 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  no;.        if( 
33290 28 65 72 72 3d 3d 45 4e 4f 45 4e 54 29 20 26 26  (err==ENOENT) &&
332a0 20 28 73 74 61 74 66 73 28 64 62 50 61 74 68 2c   (statfs(dbPath,
332b0 20 26 66 73 49 6e 66 6f 29 20 21 3d 20 2d 31 29   &fsInfo) != -1)
332c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
332d0 4c 6f 63 6b 6c 65 73 73 20 3d 20 28 66 73 49 6e  Lockless = (fsIn
332e0 66 6f 2e 66 5f 66 6c 61 67 73 26 4d 4e 54 5f 52  fo.f_flags&MNT_R
332f0 44 4f 4e 4c 59 29 20 3d 3d 20 4d 4e 54 5f 52 44  DONLY) == MNT_RD
33300 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ONLY;.        }.
33310 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
33320 28 20 67 6f 4c 6f 63 6b 6c 65 73 73 20 29 7b 0a  ( goLockless ){.
33330 20 20 20 20 20 20 20 20 70 43 74 78 2d 3e 63 6f          pCtx->co
33340 6e 63 68 48 65 6c 64 20 3d 20 2d 31 3b 20 2f 2a  nchHeld = -1; /*
33350 20 72 65 61 64 20 6f 6e 6c 79 20 46 53 2f 20 6c   read only FS/ l
33360 6f 63 6b 6c 65 73 73 20 2a 2f 0a 20 20 20 20 20  ockless */.     
33370 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
33380 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  K;.      }.    }
33390 0a 20 20 7d 20 20 0a 20 20 69 66 28 20 72 63 3d  .  }  .  if( rc=
333a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6c 6f  =SQLITE_OK && lo
333b0 63 6b 50 61 74 68 20 29 7b 0a 20 20 20 20 70 43  ckPath ){.    pC
333c0 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74  tx->lockProxyPat
333d0 68 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  h = sqlite3DbStr
333e0 44 75 70 28 30 2c 20 6c 6f 63 6b 50 61 74 68 29  Dup(0, lockPath)
333f0 3b 0a 20 20 20 20 69 66 28 20 70 43 74 78 2d 3e  ;.    if( pCtx->
33400 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 3d 3d 4e  lockProxyPath==N
33410 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ULL ){.      rc 
33420 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
33430 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
33440 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
33450 7b 0a 20 20 20 20 70 43 74 78 2d 3e 64 62 50 61  {.    pCtx->dbPa
33460 74 68 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  th = sqlite3DbSt
33470 72 44 75 70 28 30 2c 20 64 62 50 61 74 68 29 3b  rDup(0, dbPath);
33480 0a 20 20 20 20 69 66 28 20 70 43 74 78 2d 3e 64  .    if( pCtx->d
33490 62 50 61 74 68 3d 3d 4e 55 4c 4c 20 29 7b 0a 20  bPath==NULL ){. 
334a0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
334b0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20  _NOMEM;.    }.  
334c0 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
334d0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20  TE_OK ){.    /* 
334e0 61 6c 6c 20 6d 65 6d 6f 72 79 20 69 73 20 61 6c  all memory is al
334f0 6c 6f 63 61 74 65 64 2c 20 70 72 6f 78 79 73 20  located, proxys 
33500 61 72 65 20 63 72 65 61 74 65 64 20 61 6e 64 20  are created and 
33510 61 73 73 69 67 6e 65 64 2c 20 0a 20 20 20 20 2a  assigned, .    *
33520 2a 20 73 77 69 74 63 68 20 74 68 65 20 6c 6f 63  * switch the loc
33530 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 61 6e 64  king context and
33540 20 70 4d 65 74 68 6f 64 20 74 68 65 6e 20 72 65   pMethod then re
33550 74 75 72 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  turn..    */.   
33560 20 70 43 74 78 2d 3e 6f 6c 64 4c 6f 63 6b 69 6e   pCtx->oldLockin
33570 67 43 6f 6e 74 65 78 74 20 3d 20 70 46 69 6c 65  gContext = pFile
33580 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
33590 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63  ;.    pFile->loc
335a0 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20 70 43  kingContext = pC
335b0 74 78 3b 0a 20 20 20 20 70 43 74 78 2d 3e 70 4f  tx;.    pCtx->pO
335c0 6c 64 4d 65 74 68 6f 64 20 3d 20 70 46 69 6c 65  ldMethod = pFile
335d0 2d 3e 70 4d 65 74 68 6f 64 3b 0a 20 20 20 20 70  ->pMethod;.    p
335e0 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 20 3d 20  File->pMethod = 
335f0 26 70 72 6f 78 79 49 6f 4d 65 74 68 6f 64 73 3b  &proxyIoMethods;
33600 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66  .  }else{.    if
33610 28 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c  ( pCtx->conchFil
33620 65 20 29 7b 20 0a 20 20 20 20 20 20 70 43 74 78  e ){ .      pCtx
33630 2d 3e 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65  ->conchFile->pMe
33640 74 68 6f 64 2d 3e 78 43 6c 6f 73 65 28 28 73 71  thod->xClose((sq
33650 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 70 43 74  lite3_file *)pCt
33660 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 29 3b 0a 20  x->conchFile);. 
33670 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
33680 65 28 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c  e(pCtx->conchFil
33690 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  e);.    }.    sq
336a0 6c 69 74 65 33 44 62 46 72 65 65 28 30 2c 20 70  lite3DbFree(0, p
336b0 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61  Ctx->lockProxyPa
336c0 74 68 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  th);.    sqlite3
336d0 5f 66 72 65 65 28 70 43 74 78 2d 3e 63 6f 6e 63  _free(pCtx->conc
336e0 68 46 69 6c 65 50 61 74 68 29 3b 20 0a 20 20 20  hFilePath); .   
336f0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
33700 74 78 29 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41  tx);.  }.  OSTRA
33710 43 45 28 28 22 54 52 41 4e 53 50 52 4f 58 59 20  CE(("TRANSPROXY 
33720 20 25 64 20 25 73 5c 6e 22 2c 20 70 46 69 6c 65   %d %s\n", pFile
33730 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ->h,.           
33740 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f  (rc==SQLITE_OK ?
33750 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22   "ok" : "failed"
33760 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  )));.  return rc
33770 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ;.}.../*.** This
33780 20 72 6f 75 74 69 6e 65 20 68 61 6e 64 6c 65 73   routine handles
33790 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f   sqlite3_file_co
337a0 6e 74 72 6f 6c 28 29 20 63 61 6c 6c 73 20 74 68  ntrol() calls th
337b0 61 74 20 61 72 65 20 73 70 65 63 69 66 69 63 0a  at are specific.
337c0 2a 2a 20 74 6f 20 70 72 6f 78 79 20 6c 6f 63 6b  ** to proxy lock
337d0 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ing..*/.static i
337e0 6e 74 20 70 72 6f 78 79 46 69 6c 65 43 6f 6e 74  nt proxyFileCont
337f0 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  rol(sqlite3_file
33800 20 2a 69 64 2c 20 69 6e 74 20 6f 70 2c 20 76 6f   *id, int op, vo
33810 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 73 77 69  id *pArg){.  swi
33820 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63  tch( op ){.    c
33830 61 73 65 20 53 51 4c 49 54 45 5f 47 45 54 5f 4c  ase SQLITE_GET_L
33840 4f 43 4b 50 52 4f 58 59 46 49 4c 45 3a 20 7b 0a  OCKPROXYFILE: {.
33850 20 20 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a        unixFile *
33860 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
33870 65 2a 29 69 64 3b 0a 20 20 20 20 20 20 69 66 28  e*)id;.      if(
33880 20 69 73 50 72 6f 78 79 4c 6f 63 6b 69 6e 67 4d   isProxyLockingM
33890 6f 64 65 28 70 46 69 6c 65 29 20 29 7b 0a 20 20  ode(pFile) ){.  
338a0 20 20 20 20 20 20 70 72 6f 78 79 4c 6f 63 6b 69        proxyLocki
338b0 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20  ngContext *pCtx 
338c0 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43  = (proxyLockingC
338d0 6f 6e 74 65 78 74 2a 29 70 46 69 6c 65 2d 3e 6c  ontext*)pFile->l
338e0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20  ockingContext;. 
338f0 20 20 20 20 20 20 20 70 72 6f 78 79 54 61 6b 65         proxyTake
33900 43 6f 6e 63 68 28 70 46 69 6c 65 29 3b 0a 20 20  Conch(pFile);.  
33910 20 20 20 20 20 20 69 66 28 20 70 43 74 78 2d 3e        if( pCtx->
33920 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 29 7b  lockProxyPath ){
33930 0a 20 20 20 20 20 20 20 20 20 20 2a 28 63 6f 6e  .          *(con
33940 73 74 20 63 68 61 72 20 2a 2a 29 70 41 72 67 20  st char **)pArg 
33950 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78  = pCtx->lockProx
33960 79 50 61 74 68 3b 0a 20 20 20 20 20 20 20 20 7d  yPath;.        }
33970 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
33980 2a 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 29  *(const char **)
33990 70 41 72 67 20 3d 20 22 3a 61 75 74 6f 3a 20 28  pArg = ":auto: (
339a0 6e 6f 74 20 68 65 6c 64 29 22 3b 0a 20 20 20 20  not held)";.    
339b0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 65 6c      }.      } el
339c0 73 65 20 7b 0a 20 20 20 20 20 20 20 20 2a 28 63  se {.        *(c
339d0 6f 6e 73 74 20 63 68 61 72 20 2a 2a 29 70 41 72  onst char **)pAr
339e0 67 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 20 20  g = NULL;.      
339f0 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  }.      return S
33a00 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
33a10 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
33a20 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c  SET_LOCKPROXYFIL
33a30 45 3a 20 7b 0a 20 20 20 20 20 20 75 6e 69 78 46  E: {.      unixF
33a40 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
33a50 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20  ixFile*)id;.    
33a60 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
33a70 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 69 6e 74 20  E_OK;.      int 
33a80 69 73 50 72 6f 78 79 53 74 79 6c 65 20 3d 20 69  isProxyStyle = i
33a90 73 50 72 6f 78 79 4c 6f 63 6b 69 6e 67 4d 6f 64  sProxyLockingMod
33aa0 65 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20  e(pFile);.      
33ab0 69 66 28 20 70 41 72 67 3d 3d 4e 55 4c 4c 20 7c  if( pArg==NULL |
33ac0 7c 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29  | (const char *)
33ad0 70 41 72 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pArg==0 ){.     
33ae0 20 20 20 69 66 28 20 69 73 50 72 6f 78 79 53 74     if( isProxySt
33af0 79 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  yle ){.         
33b00 20 2f 2a 20 74 75 72 6e 20 6f 66 66 20 70 72 6f   /* turn off pro
33b10 78 79 20 6c 6f 63 6b 69 6e 67 20 2d 20 6e 6f 74  xy locking - not
33b20 20 73 75 70 70 6f 72 74 65 64 2e 20 20 49 66 20   supported.  If 
33b30 73 75 70 70 6f 72 74 20 69 73 20 61 64 64 65 64  support is added
33b40 20 66 6f 72 0a 20 20 20 20 20 20 20 20 20 20 2a   for.          *
33b50 2a 20 73 77 69 74 63 68 69 6e 67 20 70 72 6f 78  * switching prox
33b60 79 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 6f  y locking mode o
33b70 66 66 20 74 68 65 6e 20 69 74 20 77 69 6c 6c 20  ff then it will 
33b80 6e 65 65 64 20 74 6f 20 66 61 69 6c 20 69 66 0a  need to fail if.
33b90 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65            ** the
33ba0 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 20 69 73   journal mode is
33bb0 20 57 41 4c 20 6d 6f 64 65 2e 20 0a 20 20 20 20   WAL mode. .    
33bc0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
33bd0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
33be0 52 52 4f 52 20 2f 2a 53 51 4c 49 54 45 5f 50 52  RROR /*SQLITE_PR
33bf0 4f 54 4f 43 4f 4c 3f 20 53 51 4c 49 54 45 5f 4d  OTOCOL? SQLITE_M
33c00 49 53 55 53 45 3f 2a 2f 3b 0a 20 20 20 20 20 20  ISUSE?*/;.      
33c10 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
33c20 20 20 20 2f 2a 20 74 75 72 6e 20 6f 66 66 20 70     /* turn off p
33c30 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 2d 20 61  roxy locking - a
33c40 6c 72 65 61 64 79 20 6f 66 66 20 2d 20 4e 4f 4f  lready off - NOO
33c50 50 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72  P */.          r
33c60 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
33c70 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
33c80 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f  else{.        co
33c90 6e 73 74 20 63 68 61 72 20 2a 70 72 6f 78 79 50  nst char *proxyP
33ca0 61 74 68 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  ath = (const cha
33cb0 72 20 2a 29 70 41 72 67 3b 0a 20 20 20 20 20 20  r *)pArg;.      
33cc0 20 20 69 66 28 20 69 73 50 72 6f 78 79 53 74 79    if( isProxySty
33cd0 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  le ){.          
33ce0 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
33cf0 65 78 74 20 2a 70 43 74 78 20 3d 20 0a 20 20 20  ext *pCtx = .   
33d00 20 20 20 20 20 20 20 20 20 28 70 72 6f 78 79 4c           (proxyL
33d10 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2a 29 70  ockingContext*)p
33d20 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
33d30 74 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20  text;.          
33d40 69 66 28 20 21 73 74 72 63 6d 70 28 70 41 72 67  if( !strcmp(pArg
33d50 2c 20 22 3a 61 75 74 6f 3a 22 29 20 0a 20 20 20  , ":auto:") .   
33d60 20 20 20 20 20 20 20 20 7c 7c 20 28 70 43 74 78          || (pCtx
33d70 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20  ->lockProxyPath 
33d80 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  &&.             
33d90 20 20 21 73 74 72 6e 63 6d 70 28 70 43 74 78 2d    !strncmp(pCtx-
33da0 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 2c 20  >lockProxyPath, 
33db0 70 72 6f 78 79 50 61 74 68 2c 20 4d 41 58 50 41  proxyPath, MAXPA
33dc0 54 48 4c 45 4e 29 29 0a 20 20 20 20 20 20 20 20  THLEN)).        
33dd0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20    ){.           
33de0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
33df0 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
33e00 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
33e10 20 3d 20 73 77 69 74 63 68 4c 6f 63 6b 50 72 6f   = switchLockPro
33e20 78 79 50 61 74 68 28 70 46 69 6c 65 2c 20 70 72  xyPath(pFile, pr
33e30 6f 78 79 50 61 74 68 29 3b 0a 20 20 20 20 20 20  oxyPath);.      
33e40 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65      }.        }e
33e50 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
33e60 2a 20 74 75 72 6e 20 6f 6e 20 70 72 6f 78 79 20  * turn on proxy 
33e70 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a  file locking */.
33e80 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70            rc = p
33e90 72 6f 78 79 54 72 61 6e 73 66 6f 72 6d 55 6e 69  roxyTransformUni
33ea0 78 46 69 6c 65 28 70 46 69 6c 65 2c 20 70 72 6f  xFile(pFile, pro
33eb0 78 79 50 61 74 68 29 3b 0a 20 20 20 20 20 20 20  xyPath);.       
33ec0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
33ed0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
33ee0 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  }.    default: {
33ef0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 30  .      assert( 0
33f00 20 29 3b 20 20 2f 2a 20 54 68 65 20 63 61 6c 6c   );  /* The call
33f10 20 61 73 73 75 72 65 73 20 74 68 61 74 20 6f 6e   assures that on
33f20 6c 79 20 76 61 6c 69 64 20 6f 70 63 6f 64 65 73  ly valid opcodes
33f30 20 61 72 65 20 73 65 6e 74 20 2a 2f 0a 20 20 20   are sent */.   
33f40 20 7d 0a 20 20 7d 0a 20 20 2f 2a 4e 4f 54 52 45   }.  }.  /*NOTRE
33f50 41 43 48 45 44 2a 2f 0a 20 20 72 65 74 75 72 6e  ACHED*/.  return
33f60 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 7d   SQLITE_ERROR;.}
33f70 0a 0a 2f 2a 0a 2a 2a 20 57 69 74 68 69 6e 20 74  ../*.** Within t
33f80 68 69 73 20 64 69 76 69 73 69 6f 6e 20 28 74 68  his division (th
33f90 65 20 70 72 6f 78 79 69 6e 67 20 6c 6f 63 6b 69  e proxying locki
33fa0 6e 67 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ng implementatio
33fb0 6e 29 20 74 68 65 20 70 72 6f 63 65 64 75 72 65  n) the procedure
33fc0 73 0a 2a 2a 20 61 62 6f 76 65 20 74 68 69 73 20  s.** above this 
33fd0 70 6f 69 6e 74 20 61 72 65 20 61 6c 6c 20 75 74  point are all ut
33fe0 69 6c 69 74 69 65 73 2e 20 20 54 68 65 20 6c 6f  ilities.  The lo
33ff0 63 6b 2d 72 65 6c 61 74 65 64 20 6d 65 74 68 6f  ck-related metho
34000 64 73 20 6f 66 20 74 68 65 0a 2a 2a 20 70 72 6f  ds of the.** pro
34010 78 79 2d 6c 6f 63 6b 69 6e 67 20 73 71 6c 69 74  xy-locking sqlit
34020 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 20 6f 62 6a  e3_io_method obj
34030 65 63 74 20 66 6f 6c 6c 6f 77 2e 0a 2a 2f 0a 0a  ect follow..*/..
34040 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
34050 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74 68  ine checks if th
34060 65 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45  ere is a RESERVE
34070 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74  D lock held on t
34080 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20  he specified.** 
34090 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20  file by this or 
340a0 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73  any other proces
340b0 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63  s. If such a loc
340c0 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a  k is held, set *
340d0 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20  pResOut.** to a 
340e0 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f  non-zero value o
340f0 74 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75  therwise *pResOu
34100 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f  t is set to zero
34110 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  .  The return va
34120 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f  lue.** is set to
34130 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73   SQLITE_OK unles
34140 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f  s an I/O error o
34150 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63  ccurs during loc
34160 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73  k checking..*/.s
34170 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43  tatic int proxyC
34180 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
34190 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
341a0 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29  d, int *pResOut)
341b0 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70   {.  unixFile *p
341c0 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
341d0 2a 29 69 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d  *)id;.  int rc =
341e0 20 70 72 6f 78 79 54 61 6b 65 43 6f 6e 63 68 28   proxyTakeConch(
341f0 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 72 63  pFile);.  if( rc
34200 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
34210 20 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43     proxyLockingC
34220 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20 28  ontext *pCtx = (
34230 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
34240 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63  ext *)pFile->loc
34250 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20  kingContext;.   
34260 20 69 66 28 20 70 43 74 78 2d 3e 63 6f 6e 63 68   if( pCtx->conch
34270 48 65 6c 64 3e 30 20 29 7b 0a 20 20 20 20 20 20  Held>0 ){.      
34280 75 6e 69 78 46 69 6c 65 20 2a 70 72 6f 78 79 20  unixFile *proxy 
34290 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78  = pCtx->lockProx
342a0 79 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  y;.      return 
342b0 70 72 6f 78 79 2d 3e 70 4d 65 74 68 6f 64 2d 3e  proxy->pMethod->
342c0 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
342d0 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ck((sqlite3_file
342e0 2a 29 70 72 6f 78 79 2c 20 70 52 65 73 4f 75 74  *)proxy, pResOut
342f0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 20 2f 2a  );.    }else{ /*
34300 20 63 6f 6e 63 68 48 65 6c 64 20 3c 20 30 20 69   conchHeld < 0 i
34310 73 20 6c 6f 63 6b 6c 65 73 73 20 2a 2f 0a 20 20  s lockless */.  
34320 20 20 20 20 70 52 65 73 4f 75 74 3d 30 3b 0a 20      pResOut=0;. 
34330 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
34340 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  n rc;.}../*.** L
34350 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74  ock the file wit
34360 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69  h the lock speci
34370 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65  fied by paramete
34380 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e  r eFileLock - on
34390 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c  e.** of the foll
343a0 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  owing:.**.**    
343b0 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b   (1) SHARED_LOCK
343c0 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53 45  .**     (2) RESE
343d0 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  RVED_LOCK.**    
343e0 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43   (3) PENDING_LOC
343f0 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43  K.**     (4) EXC
34400 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a  LUSIVE_LOCK.**.*
34410 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e  * Sometimes when
34420 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20   requesting one 
34430 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69  lock state, addi
34440 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74  tional lock stat
34450 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74  es.** are insert
34460 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20  ed in between.  
34470 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68  The locking migh
34480 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66  t fail on one of
34490 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72   the later.** tr
344a0 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e  ansitions leavin
344b0 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65  g the lock state
344c0 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20   different from 
344d0 77 68 61 74 20 69 74 20 73 74 61 72 74 65 64 20  what it started 
344e0 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f  but.** still sho
344f0 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20  rt of its goal. 
34500 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   The following c
34510 68 61 72 74 20 73 68 6f 77 73 20 74 68 65 20 61  hart shows the a
34520 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69  llowed.** transi
34530 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e  tions and the in
34540 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69  serted intermedi
34550 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a  ate states:.**.*
34560 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e  *    UNLOCKED ->
34570 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48   SHARED.**    SH
34580 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44  ARED -> RESERVED
34590 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e  .**    SHARED ->
345a0 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58   (PENDING) -> EX
345b0 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45  CLUSIVE.**    RE
345c0 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49  SERVED -> (PENDI
345d0 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  NG) -> EXCLUSIVE
345e0 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d  .**    PENDING -
345f0 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a  > EXCLUSIVE.**.*
34600 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
34610 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73  ill only increas
34620 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74  e a lock.  Use t
34630 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f  he sqlite3OsUnlo
34640 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  ck().** routine 
34650 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69  to lower a locki
34660 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61  ng level..*/.sta
34670 74 69 63 20 69 6e 74 20 70 72 6f 78 79 4c 6f 63  tic int proxyLoc
34680 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
34690 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63  id, int eFileLoc
346a0 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  k) {.  unixFile 
346b0 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
346c0 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20 72 63  le*)id;.  int rc
346d0 20 3d 20 70 72 6f 78 79 54 61 6b 65 43 6f 6e 63   = proxyTakeConc
346e0 68 28 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20  h(pFile);.  if( 
346f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
34700 0a 20 20 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e  .    proxyLockin
34710 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d  gContext *pCtx =
34720 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f   (proxyLockingCo
34730 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c  ntext *)pFile->l
34740 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20  ockingContext;. 
34750 20 20 20 69 66 28 20 70 43 74 78 2d 3e 63 6f 6e     if( pCtx->con
34760 63 68 48 65 6c 64 3e 30 20 29 7b 0a 20 20 20 20  chHeld>0 ){.    
34770 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 72 6f 78    unixFile *prox
34780 79 20 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72  y = pCtx->lockPr
34790 6f 78 79 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  oxy;.      rc = 
347a0 70 72 6f 78 79 2d 3e 70 4d 65 74 68 6f 64 2d 3e  proxy->pMethod->
347b0 78 4c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66  xLock((sqlite3_f
347c0 69 6c 65 2a 29 70 72 6f 78 79 2c 20 65 46 69 6c  ile*)proxy, eFil
347d0 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 20 20 70 46  eLock);.      pF
347e0 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
347f0 20 70 72 6f 78 79 2d 3e 65 46 69 6c 65 4c 6f 63   proxy->eFileLoc
34800 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  k;.    }else{.  
34810 20 20 20 20 2f 2a 20 63 6f 6e 63 68 48 65 6c 64      /* conchHeld
34820 20 3c 20 30 20 69 73 20 6c 6f 63 6b 6c 65 73 73   < 0 is lockless
34830 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   */.    }.  }.  
34840 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
34850 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c  *.** Lower the l
34860 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20  ocking level on 
34870 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
34880 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f  pFile to eFileLo
34890 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a  ck.  eFileLock.*
348a0 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  * must be either
348b0 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52   NO_LOCK or SHAR
348c0 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49  ED_LOCK..**.** I
348d0 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  f the locking le
348e0 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20  vel of the file 
348f0 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c  descriptor is al
34900 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f  ready at or belo
34910 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74  w.** the request
34920 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  ed locking level
34930 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
34940 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
34950 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 55 6e  atic int proxyUn
34960 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  lock(sqlite3_fil
34970 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65  e *id, int eFile
34980 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69  Lock) {.  unixFi
34990 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
349a0 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74  xFile*)id;.  int
349b0 20 72 63 20 3d 20 70 72 6f 78 79 54 61 6b 65 43   rc = proxyTakeC
349c0 6f 6e 63 68 28 70 46 69 6c 65 29 3b 0a 20 20 69  onch(pFile);.  i
349d0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
349e0 20 29 7b 0a 20 20 20 20 70 72 6f 78 79 4c 6f 63   ){.    proxyLoc
349f0 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74  kingContext *pCt
34a00 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e  x = (proxyLockin
34a10 67 43 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c 65  gContext *)pFile
34a20 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
34a30 3b 0a 20 20 20 20 69 66 28 20 70 43 74 78 2d 3e  ;.    if( pCtx->
34a40 63 6f 6e 63 68 48 65 6c 64 3e 30 20 29 7b 0a 20  conchHeld>0 ){. 
34a50 20 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70       unixFile *p
34a60 72 6f 78 79 20 3d 20 70 43 74 78 2d 3e 6c 6f 63  roxy = pCtx->loc
34a70 6b 50 72 6f 78 79 3b 0a 20 20 20 20 20 20 72 63  kProxy;.      rc
34a80 20 3d 20 70 72 6f 78 79 2d 3e 70 4d 65 74 68 6f   = proxy->pMetho
34a90 64 2d 3e 78 55 6e 6c 6f 63 6b 28 28 73 71 6c 69  d->xUnlock((sqli
34aa0 74 65 33 5f 66 69 6c 65 2a 29 70 72 6f 78 79 2c  te3_file*)proxy,
34ab0 20 65 46 69 6c 65 4c 6f 63 6b 29 3b 0a 20 20 20   eFileLock);.   
34ac0 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
34ad0 6f 63 6b 20 3d 20 70 72 6f 78 79 2d 3e 65 46 69  ock = proxy->eFi
34ae0 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 7d 65 6c 73  leLock;.    }els
34af0 65 7b 0a 20 20 20 20 20 20 2f 2a 20 63 6f 6e 63  e{.      /* conc
34b00 68 48 65 6c 64 20 3c 20 30 20 69 73 20 6c 6f 63  hHeld < 0 is loc
34b10 6b 6c 65 73 73 20 2a 2f 0a 20 20 20 20 7d 0a 20  kless */.    }. 
34b20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
34b30 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
34b40 20 66 69 6c 65 20 74 68 61 74 20 75 73 65 73 20   file that uses 
34b50 70 72 6f 78 79 20 6c 6f 63 6b 73 2e 0a 2a 2f 0a  proxy locks..*/.
34b60 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
34b70 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69  Close(sqlite3_fi
34b80 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69 66 28 20  le *id) {.  if( 
34b90 69 64 20 29 7b 0a 20 20 20 20 75 6e 69 78 46 69  id ){.    unixFi
34ba0 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
34bb0 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20 70  xFile*)id;.    p
34bc0 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
34bd0 78 74 20 2a 70 43 74 78 20 3d 20 28 70 72 6f 78  xt *pCtx = (prox
34be0 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  yLockingContext 
34bf0 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  *)pFile->locking
34c00 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 75 6e 69  Context;.    uni
34c10 78 46 69 6c 65 20 2a 6c 6f 63 6b 50 72 6f 78 79  xFile *lockProxy
34c20 20 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f   = pCtx->lockPro
34c30 78 79 3b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65  xy;.    unixFile
34c40 20 2a 63 6f 6e 63 68 46 69 6c 65 20 3d 20 70 43   *conchFile = pC
34c50 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 3b 0a 20  tx->conchFile;. 
34c60 20 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49     int rc = SQLI
34c70 54 45 5f 4f 4b 3b 0a 20 20 20 20 0a 20 20 20 20  TE_OK;.    .    
34c80 69 66 28 20 6c 6f 63 6b 50 72 6f 78 79 20 29 7b  if( lockProxy ){
34c90 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 6f 63 6b  .      rc = lock
34ca0 50 72 6f 78 79 2d 3e 70 4d 65 74 68 6f 64 2d 3e  Proxy->pMethod->
34cb0 78 55 6e 6c 6f 63 6b 28 28 73 71 6c 69 74 65 33  xUnlock((sqlite3
34cc0 5f 66 69 6c 65 2a 29 6c 6f 63 6b 50 72 6f 78 79  _file*)lockProxy
34cd0 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  , NO_LOCK);.    
34ce0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
34cf0 6e 20 72 63 3b 0a 20 20 20 20 20 20 72 63 20 3d  n rc;.      rc =
34d00 20 6c 6f 63 6b 50 72 6f 78 79 2d 3e 70 4d 65 74   lockProxy->pMet
34d10 68 6f 64 2d 3e 78 43 6c 6f 73 65 28 28 73 71 6c  hod->xClose((sql
34d20 69 74 65 33 5f 66 69 6c 65 2a 29 6c 6f 63 6b 50  ite3_file*)lockP
34d30 72 6f 78 79 29 3b 0a 20 20 20 20 20 20 69 66 28  roxy);.      if(
34d40 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
34d50 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
34d60 72 65 65 28 6c 6f 63 6b 50 72 6f 78 79 29 3b 0a  ree(lockProxy);.
34d70 20 20 20 20 20 20 70 43 74 78 2d 3e 6c 6f 63 6b        pCtx->lock
34d80 50 72 6f 78 79 20 3d 20 30 3b 0a 20 20 20 20 7d  Proxy = 0;.    }
34d90 0a 20 20 20 20 69 66 28 20 63 6f 6e 63 68 46 69  .    if( conchFi
34da0 6c 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  le ){.      if( 
34db0 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 20  pCtx->conchHeld 
34dc0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
34dd0 70 72 6f 78 79 52 65 6c 65 61 73 65 43 6f 6e 63  proxyReleaseConc
34de0 68 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20  h(pFile);.      
34df0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
34e00 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
34e10 20 20 20 20 72 63 20 3d 20 63 6f 6e 63 68 46 69      rc = conchFi
34e20 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 43 6c  le->pMethod->xCl
34e30 6f 73 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c  ose((sqlite3_fil
34e40 65 2a 29 63 6f 6e 63 68 46 69 6c 65 29 3b 0a 20  e*)conchFile);. 
34e50 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
34e60 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 73  turn rc;.      s
34e70 71 6c 69 74 65 33 5f 66 72 65 65 28 63 6f 6e 63  qlite3_free(conc
34e80 68 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20  hFile);.    }.  
34e90 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
34ea0 30 2c 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f  0, pCtx->lockPro
34eb0 78 79 50 61 74 68 29 3b 0a 20 20 20 20 73 71 6c  xyPath);.    sql
34ec0 69 74 65 33 5f 66 72 65 65 28 70 43 74 78 2d 3e  ite3_free(pCtx->
34ed0 63 6f 6e 63 68 46 69 6c 65 50 61 74 68 29 3b 0a  conchFilePath);.
34ee0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
34ef0 65 28 30 2c 20 70 43 74 78 2d 3e 64 62 50 61 74  e(0, pCtx->dbPat
34f00 68 29 3b 0a 20 20 20 20 2f 2a 20 72 65 73 74 6f  h);.    /* resto
34f10 72 65 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  re the original 
34f20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20  locking context 
34f30 61 6e 64 20 70 4d 65 74 68 6f 64 20 74 68 65 6e  and pMethod then
34f40 20 63 6c 6f 73 65 20 69 74 20 2a 2f 0a 20 20 20   close it */.   
34f50 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43   pFile->lockingC
34f60 6f 6e 74 65 78 74 20 3d 20 70 43 74 78 2d 3e 6f  ontext = pCtx->o
34f70 6c 64 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ldLockingContext
34f80 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 70 4d 65  ;.    pFile->pMe
34f90 74 68 6f 64 20 3d 20 70 43 74 78 2d 3e 70 4f 6c  thod = pCtx->pOl
34fa0 64 4d 65 74 68 6f 64 3b 0a 20 20 20 20 73 71 6c  dMethod;.    sql
34fb0 69 74 65 33 5f 66 72 65 65 28 70 43 74 78 29 3b  ite3_free(pCtx);
34fc0 0a 20 20 20 20 72 65 74 75 72 6e 20 70 46 69 6c  .    return pFil
34fd0 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 43 6c 6f  e->pMethod->xClo
34fe0 73 65 28 69 64 29 3b 0a 20 20 7d 0a 20 20 72 65  se(id);.  }.  re
34ff0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
35000 7d 0a 0a 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 64  }....#endif /* d
35010 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
35020 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42  ) && SQLITE_ENAB
35030 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
35040 20 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 72   */./*.** The pr
35050 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 73 74 79 6c  oxy locking styl
35060 65 20 69 73 20 69 6e 74 65 6e 64 65 64 20 66 6f  e is intended fo
35070 72 20 75 73 65 20 77 69 74 68 20 41 46 50 20 66  r use with AFP f
35080 69 6c 65 73 79 73 74 65 6d 73 2e 0a 2a 2a 20 41  ilesystems..** A
35090 6e 64 20 73 69 6e 63 65 20 41 46 50 20 69 73 20  nd since AFP is 
350a0 6f 6e 6c 79 20 73 75 70 70 6f 72 74 65 64 20 6f  only supported o
350b0 6e 20 4d 61 63 4f 53 58 2c 20 74 68 65 20 70 72  n MacOSX, the pr
350c0 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20 61  oxy locking is a
350d0 6c 73 6f 0a 2a 2a 20 72 65 73 74 72 69 63 74 65  lso.** restricte
350e0 64 20 74 6f 20 4d 61 63 4f 53 58 2e 0a 2a 2a 20  d to MacOSX..** 
350f0 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .**.************
35100 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74  ******* End of t
35110 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b 20 69 6d  he proxy lock im
35120 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a  plementation ***
35130 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
35140 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
35150 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
35160 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
35170 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
35180 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
35190 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69  **/../*.** Initi
351a0 61 6c 69 7a 65 20 74 68 65 20 6f 70 65 72 61 74  alize the operat
351b0 69 6e 67 20 73 79 73 74 65 6d 20 69 6e 74 65 72  ing system inter
351c0 66 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  face..**.** This
351d0 20 72 6f 75 74 69 6e 65 20 72 65 67 69 73 74 65   routine registe
351e0 72 73 20 61 6c 6c 20 56 46 53 20 69 6d 70 6c 65  rs all VFS imple
351f0 6d 65 6e 74 61 74 69 6f 6e 73 20 66 6f 72 20 75  mentations for u
35200 6e 69 78 2d 6c 69 6b 65 20 6f 70 65 72 61 74 69  nix-like operati
35210 6e 67 0a 2a 2a 20 73 79 73 74 65 6d 73 2e 20 20  ng.** systems.  
35220 54 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 61 6e  This routine, an
35230 64 20 74 68 65 20 73 71 6c 69 74 65 33 5f 6f 73  d the sqlite3_os
35240 5f 65 6e 64 28 29 20 72 6f 75 74 69 6e 65 20 74  _end() routine t
35250 68 61 74 20 66 6f 6c 6c 6f 77 73 2c 0a 2a 2a 20  hat follows,.** 
35260 73 68 6f 75 6c 64 20 62 65 20 74 68 65 20 6f 6e  should be the on
35270 6c 79 20 72 6f 75 74 69 6e 65 73 20 69 6e 20 74  ly routines in t
35280 68 69 73 20 66 69 6c 65 20 74 68 61 74 20 61 72  his file that ar
35290 65 20 76 69 73 69 62 6c 65 20 66 72 6f 6d 20 6f  e visible from o
352a0 74 68 65 72 0a 2a 2a 20 66 69 6c 65 73 2e 0a 2a  ther.** files..*
352b0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
352c0 65 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 63 65  e is called once
352d0 20 64 75 72 69 6e 67 20 53 51 4c 69 74 65 20 69   during SQLite i
352e0 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 61 6e  nitialization an
352f0 64 20 62 79 20 61 0a 2a 2a 20 73 69 6e 67 6c 65  d by a.** single
35300 20 74 68 72 65 61 64 2e 20 20 54 68 65 20 6d 65   thread.  The me
35310 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
35320 61 6e 64 20 6d 75 74 65 78 20 73 75 62 73 79 73  and mutex subsys
35330 74 65 6d 73 20 68 61 76 65 20 6e 6f 74 0a 2a 2a  tems have not.**
35340 20 6e 65 63 65 73 73 61 72 69 6c 79 20 62 65 65   necessarily bee
35350 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 77 68  n initialized wh
35360 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
35370 69 73 20 63 61 6c 6c 65 64 2c 20 61 6e 64 20 73  is called, and s
35380 6f 20 74 68 65 79 0a 2a 2a 20 73 68 6f 75 6c 64  o they.** should
35390 20 6e 6f 74 20 62 65 20 75 73 65 64 2e 0a 2a 2f   not be used..*/
353a0 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 73 5f  .int sqlite3_os_
353b0 69 6e 69 74 28 76 6f 69 64 29 7b 20 0a 20 20 2f  init(void){ .  /
353c0 2a 20 0a 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c  * .  ** The foll
353d0 6f 77 69 6e 67 20 6d 61 63 72 6f 20 64 65 66 69  owing macro defi
353e0 6e 65 73 20 61 6e 20 69 6e 69 74 69 61 6c 69 7a  nes an initializ
353f0 65 72 20 66 6f 72 20 61 6e 20 73 71 6c 69 74 65  er for an sqlite
35400 33 5f 76 66 73 20 6f 62 6a 65 63 74 2e 0a 20 20  3_vfs object..  
35410 2a 2a 20 54 68 65 20 6e 61 6d 65 20 6f 66 20 74  ** The name of t
35420 68 65 20 56 46 53 20 69 73 20 4e 41 4d 45 2e 20  he VFS is NAME. 
35430 20 54 68 65 20 70 41 70 70 44 61 74 61 20 69 73   The pAppData is
35440 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
35450 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 74 6f 20  pointer.  ** to 
35460 74 68 65 20 22 66 69 6e 64 65 72 22 20 66 75 6e  the "finder" fun
35470 63 74 69 6f 6e 2e 20 20 28 70 41 70 70 44 61 74  ction.  (pAppDat
35480 61 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  a is a pointer t
35490 6f 20 61 20 70 6f 69 6e 74 65 72 20 62 65 63 61  o a pointer beca
354a0 75 73 65 0a 20 20 2a 2a 20 73 69 6c 6c 79 20 43  use.  ** silly C
354b0 39 30 20 72 75 6c 65 73 20 70 72 6f 68 69 62 69  90 rules prohibi
354c0 74 20 61 20 76 6f 69 64 2a 20 66 72 6f 6d 20 62  t a void* from b
354d0 65 69 6e 67 20 63 61 73 74 20 74 6f 20 61 20 66  eing cast to a f
354e0 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 0a  unction pointer.
354f0 20 20 2a 2a 20 61 6e 64 20 73 6f 20 77 65 20 68    ** and so we h
35500 61 76 65 20 74 6f 20 67 6f 20 74 68 72 6f 75 67  ave to go throug
35510 68 20 74 68 65 20 69 6e 74 65 72 6d 65 64 69 61  h the intermedia
35520 74 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 76  te pointer to av
35530 6f 69 64 20 70 72 6f 62 6c 65 6d 73 0a 20 20 2a  oid problems.  *
35540 2a 20 77 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67  * when compiling
35550 20 77 69 74 68 20 2d 70 65 64 61 6e 74 69 63 2d   with -pedantic-
35560 65 72 72 6f 72 73 20 6f 6e 20 47 43 43 2e 29 0a  errors on GCC.).
35570 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 46 49    **.  ** The FI
35580 4e 44 45 52 20 70 61 72 61 6d 65 74 65 72 20 74  NDER parameter t
35590 6f 20 74 68 69 73 20 6d 61 63 72 6f 20 69 73 20  o this macro is 
355a0 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
355b0 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 0a 20  pointer to the. 
355c0 20 2a 2a 20 66 69 6e 64 65 72 2d 66 75 6e 63 74   ** finder-funct
355d0 69 6f 6e 2e 20 20 54 68 65 20 66 69 6e 64 65 72  ion.  The finder
355e0 2d 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e  -function return
355f0 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  s a pointer to t
35600 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 5f 69  he.  ** sqlite_i
35610 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74  o_methods object
35620 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73   that implements
35630 20 74 68 65 20 64 65 73 69 72 65 64 20 6c 6f 63   the desired loc
35640 6b 69 6e 67 0a 20 20 2a 2a 20 62 65 68 61 76 69  king.  ** behavi
35650 6f 72 73 2e 20 20 53 65 65 20 74 68 65 20 64 69  ors.  See the di
35660 76 69 73 69 6f 6e 20 61 62 6f 76 65 20 74 68 61  vision above tha
35670 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 49  t contains the I
35680 4f 4d 45 54 48 4f 44 53 0a 20 20 2a 2a 20 6d 61  OMETHODS.  ** ma
35690 63 72 6f 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  cro for addition
356a0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20   information on 
356b0 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 73  finder-functions
356c0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 6f 73 74  ..  **.  ** Most
356d0 20 66 69 6e 64 65 72 73 20 73 69 6d 70 6c 79 20   finders simply 
356e0 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
356f0 20 74 6f 20 61 20 66 69 78 65 64 20 73 71 6c 69   to a fixed sqli
35700 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 0a 20  te3_io_methods. 
35710 20 2a 2a 20 6f 62 6a 65 63 74 2e 20 20 42 75 74   ** object.  But
35720 20 74 68 65 20 22 61 75 74 6f 6c 6f 63 6b 49 6f   the "autolockIo
35730 46 69 6e 64 65 72 22 20 61 76 61 69 6c 61 62 6c  Finder" availabl
35740 65 20 6f 6e 20 4d 61 63 4f 53 58 20 64 6f 65 73  e on MacOSX does
35750 20 61 20 6c 69 74 74 6c 65 0a 20 20 2a 2a 20 6d   a little.  ** m
35760 6f 72 65 20 74 68 61 6e 20 74 68 61 74 3b 20 69  ore than that; i
35770 74 20 6c 6f 6f 6b 73 20 61 74 20 74 68 65 20 66  t looks at the f
35780 69 6c 65 73 79 73 74 65 6d 20 74 79 70 65 20 74  ilesystem type t
35790 68 61 74 20 68 6f 73 74 73 20 74 68 65 20 0a 20  hat hosts the . 
357a0 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
357b0 65 20 61 6e 64 20 74 72 69 65 73 20 74 6f 20 63  e and tries to c
357c0 68 6f 6f 73 65 20 61 6e 20 6c 6f 63 6b 69 6e 67  hoose an locking
357d0 20 6d 65 74 68 6f 64 20 61 70 70 72 6f 70 72 69   method appropri
357e0 61 74 65 20 66 6f 72 0a 20 20 2a 2a 20 74 68 61  ate for.  ** tha
357f0 74 20 66 69 6c 65 73 79 73 74 65 6d 20 74 69 6d  t filesystem tim
35800 65 2e 0a 20 20 2a 2f 0a 20 20 23 64 65 66 69 6e  e..  */.  #defin
35810 65 20 55 4e 49 58 56 46 53 28 56 46 53 4e 41 4d  e UNIXVFS(VFSNAM
35820 45 2c 20 46 49 4e 44 45 52 29 20 7b 20 20 20 20  E, FINDER) {    
35830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35840 20 20 20 20 5c 0a 20 20 20 20 32 2c 20 20 20 20      \.    2,    
35850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35860 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 20 20  /* iVersion */  
35870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35880 20 20 5c 0a 20 20 20 20 73 69 7a 65 6f 66 28 75    \.    sizeof(u
35890 6e 69 78 46 69 6c 65 29 2c 20 20 20 20 20 2f 2a  nixFile),     /*
358a0 20 73 7a 4f 73 46 69 6c 65 20 2a 2f 20 20 20 20   szOsFile */    
358b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
358c0 5c 0a 20 20 20 20 4d 41 58 5f 50 41 54 48 4e 41  \.    MAX_PATHNA
358d0 4d 45 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 6d  ME,         /* m
358e0 78 50 61 74 68 6e 61 6d 65 20 2a 2f 20 20 20 20  xPathname */    
358f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
35900 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20      0,          
35910 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 4e 65            /* pNe
35920 78 74 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  xt */           
35930 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
35940 20 20 56 46 53 4e 41 4d 45 2c 20 20 20 20 20 20    VFSNAME,      
35950 20 20 20 20 20 20 20 20 2f 2a 20 7a 4e 61 6d 65          /* zName
35960 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
35970 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
35980 28 76 6f 69 64 2a 29 26 46 49 4e 44 45 52 2c 20  (void*)&FINDER, 
35990 20 20 20 20 20 20 2f 2a 20 70 41 70 70 44 61 74        /* pAppDat
359a0 61 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  a */            
359b0 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e          \.    un
359c0 69 78 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20  ixOpen,         
359d0 20 20 20 20 2f 2a 20 78 4f 70 65 6e 20 2a 2f 20      /* xOpen */ 
359e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
359f0 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78        \.    unix
35a00 44 65 6c 65 74 65 2c 20 20 20 20 20 20 20 20 20  Delete,         
35a10 20 20 2f 2a 20 78 44 65 6c 65 74 65 20 2a 2f 20    /* xDelete */ 
35a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35a30 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 41 63      \.    unixAc
35a40 63 65 73 73 2c 20 20 20 20 20 20 20 20 20 20 20  cess,           
35a50 2f 2a 20 78 41 63 63 65 73 73 20 2a 2f 20 20 20  /* xAccess */   
35a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35a70 20 20 5c 0a 20 20 20 20 75 6e 69 78 46 75 6c 6c    \.    unixFull
35a80 50 61 74 68 6e 61 6d 65 2c 20 20 20 20 20 2f 2a  Pathname,     /*
35a90 20 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 2a   xFullPathname *
35aa0 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
35ab0 5c 0a 20 20 20 20 75 6e 69 78 44 6c 4f 70 65 6e  \.    unixDlOpen
35ac0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78  ,           /* x
35ad0 44 6c 4f 70 65 6e 20 2a 2f 20 20 20 20 20 20 20  DlOpen */       
35ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
35af0 20 20 20 20 75 6e 69 78 44 6c 45 72 72 6f 72 2c      unixDlError,
35b00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c            /* xDl
35b10 45 72 72 6f 72 20 2a 2f 20 20 20 20 20 20 20 20  Error */        
35b20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
35b30 20 20 75 6e 69 78 44 6c 53 79 6d 2c 20 20 20 20    unixDlSym,    
35b40 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 53 79          /* xDlSy
35b50 6d 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  m */            
35b60 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
35b70 75 6e 69 78 44 6c 43 6c 6f 73 65 2c 20 20 20 20  unixDlClose,    
35b80 20 20 20 20 20 20 2f 2a 20 78 44 6c 43 6c 6f 73        /* xDlClos
35b90 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  e */            
35ba0 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e          \.    un
35bb0 69 78 52 61 6e 64 6f 6d 6e 65 73 73 2c 20 20 20  ixRandomness,   
35bc0 20 20 20 20 2f 2a 20 78 52 61 6e 64 6f 6d 6e 65      /* xRandomne
35bd0 73 73 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  ss */           
35be0 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78        \.    unix
35bf0 53 6c 65 65 70 2c 20 20 20 20 20 20 20 20 20 20  Sleep,          
35c00 20 20 2f 2a 20 78 53 6c 65 65 70 20 2a 2f 20 20    /* xSleep */  
35c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35c20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 43 75      \.    unixCu
35c30 72 72 65 6e 74 54 69 6d 65 2c 20 20 20 20 20 20  rrentTime,      
35c40 2f 2a 20 78 43 75 72 72 65 6e 74 54 69 6d 65 20  /* xCurrentTime 
35c50 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
35c60 20 20 5c 0a 20 20 20 20 75 6e 69 78 47 65 74 4c    \.    unixGetL
35c70 61 73 74 45 72 72 6f 72 2c 20 20 20 20 20 2f 2a  astError,     /*
35c80 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72 20 2a   xGetLastError *
35c90 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
35ca0 5c 0a 20 20 20 20 75 6e 69 78 43 75 72 72 65 6e  \.    unixCurren
35cb0 74 54 69 6d 65 49 6e 74 36 34 2c 20 2f 2a 20 78  tTimeInt64, /* x
35cc0 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34  CurrentTimeInt64
35cd0 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 5c 0a   */           \.
35ce0 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41    }..  /*.  ** A
35cf0 6c 6c 20 64 65 66 61 75 6c 74 20 56 46 53 65 73  ll default VFSes
35d00 20 66 6f 72 20 75 6e 69 78 20 61 72 65 20 63 6f   for unix are co
35d10 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 66  ntained in the f
35d20 6f 6c 6c 6f 77 69 6e 67 20 61 72 72 61 79 2e 0a  ollowing array..
35d30 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20 74    **.  ** Note t
35d40 68 61 74 20 74 68 65 20 73 71 6c 69 74 65 33 5f  hat the sqlite3_
35d50 76 66 73 2e 70 4e 65 78 74 20 66 69 65 6c 64 20  vfs.pNext field 
35d60 6f 66 20 74 68 65 20 56 46 53 20 6f 62 6a 65 63  of the VFS objec
35d70 74 20 69 73 20 6d 6f 64 69 66 69 65 64 0a 20 20  t is modified.  
35d80 2a 2a 20 62 79 20 74 68 65 20 53 51 4c 69 74 65  ** by the SQLite
35d90 20 63 6f 72 65 20 77 68 65 6e 20 74 68 65 20 56   core when the V
35da0 46 53 20 69 73 20 72 65 67 69 73 74 65 72 65 64  FS is registered
35db0 2e 20 20 53 6f 20 74 68 65 20 66 6f 6c 6c 6f 77  .  So the follow
35dc0 69 6e 67 0a 20 20 2a 2a 20 61 72 72 61 79 20 63  ing.  ** array c
35dd0 61 6e 6e 6f 74 20 62 65 20 63 6f 6e 73 74 2e 0a  annot be const..
35de0 20 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 73 71    */.  static sq
35df0 6c 69 74 65 33 5f 76 66 73 20 61 56 66 73 5b 5d  lite3_vfs aVfs[]
35e00 20 3d 20 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f   = {.#if SQLITE_
35e10 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
35e20 54 59 4c 45 20 26 26 20 28 4f 53 5f 56 58 57 4f  TYLE && (OS_VXWO
35e30 52 4b 53 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f  RKS || defined(_
35e40 5f 41 50 50 4c 45 5f 5f 29 29 0a 20 20 20 20 55  _APPLE__)).    U
35e50 4e 49 58 56 46 53 28 22 75 6e 69 78 22 2c 20 20  NIXVFS("unix",  
35e60 20 20 20 20 20 20 20 20 61 75 74 6f 6c 6f 63 6b          autolock
35e70 49 6f 46 69 6e 64 65 72 20 29 2c 0a 23 65 6c 73  IoFinder ),.#els
35e80 65 0a 20 20 20 20 55 4e 49 58 56 46 53 28 22 75  e.    UNIXVFS("u
35e90 6e 69 78 22 2c 20 20 20 20 20 20 20 20 20 20 70  nix",          p
35ea0 6f 73 69 78 49 6f 46 69 6e 64 65 72 20 29 2c 0a  osixIoFinder ),.
35eb0 23 65 6e 64 69 66 0a 20 20 20 20 55 4e 49 58 56  #endif.    UNIXV
35ec0 46 53 28 22 75 6e 69 78 2d 6e 6f 6e 65 22 2c 20  FS("unix-none", 
35ed0 20 20 20 20 6e 6f 6c 6f 63 6b 49 6f 46 69 6e 64      nolockIoFind
35ee0 65 72 20 29 2c 0a 20 20 20 20 55 4e 49 58 56 46  er ),.    UNIXVF
35ef0 53 28 22 75 6e 69 78 2d 64 6f 74 66 69 6c 65 22  S("unix-dotfile"
35f00 2c 20 20 64 6f 74 6c 6f 63 6b 49 6f 46 69 6e 64  ,  dotlockIoFind
35f10 65 72 20 29 2c 0a 23 69 66 20 4f 53 5f 56 58 57  er ),.#if OS_VXW
35f20 4f 52 4b 53 0a 20 20 20 20 55 4e 49 58 56 46 53  ORKS.    UNIXVFS
35f30 28 22 75 6e 69 78 2d 6e 61 6d 65 64 73 65 6d 22  ("unix-namedsem"
35f40 2c 20 73 65 6d 49 6f 46 69 6e 64 65 72 20 29 2c  , semIoFinder ),
35f50 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
35f60 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
35f70 47 5f 53 54 59 4c 45 0a 20 20 20 20 55 4e 49 58  G_STYLE.    UNIX
35f80 56 46 53 28 22 75 6e 69 78 2d 70 6f 73 69 78 22  VFS("unix-posix"
35f90 2c 20 20 20 20 70 6f 73 69 78 49 6f 46 69 6e 64  ,    posixIoFind
35fa0 65 72 20 29 2c 0a 23 69 66 20 21 4f 53 5f 56 58  er ),.#if !OS_VX
35fb0 57 4f 52 4b 53 0a 20 20 20 20 55 4e 49 58 56 46  WORKS.    UNIXVF
35fc0 53 28 22 75 6e 69 78 2d 66 6c 6f 63 6b 22 2c 20  S("unix-flock", 
35fd0 20 20 20 66 6c 6f 63 6b 49 6f 46 69 6e 64 65 72     flockIoFinder
35fe0 20 29 2c 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69   ),.#endif.#endi
35ff0 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  f.#if SQLITE_ENA
36000 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
36010 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41  E && defined(__A
36020 50 50 4c 45 5f 5f 29 0a 20 20 20 20 55 4e 49 58  PPLE__).    UNIX
36030 56 46 53 28 22 75 6e 69 78 2d 61 66 70 22 2c 20  VFS("unix-afp", 
36040 20 20 20 20 20 61 66 70 49 6f 46 69 6e 64 65 72       afpIoFinder
36050 20 29 2c 0a 20 20 20 20 55 4e 49 58 56 46 53 28   ),.    UNIXVFS(
36060 22 75 6e 69 78 2d 6e 66 73 22 2c 20 20 20 20 20  "unix-nfs",     
36070 20 6e 66 73 49 6f 46 69 6e 64 65 72 20 29 2c 0a   nfsIoFinder ),.
36080 20 20 20 20 55 4e 49 58 56 46 53 28 22 75 6e 69      UNIXVFS("uni
36090 78 2d 70 72 6f 78 79 22 2c 20 20 20 20 70 72 6f  x-proxy",    pro
360a0 78 79 49 6f 46 69 6e 64 65 72 20 29 2c 0a 23 65  xyIoFinder ),.#e
360b0 6e 64 69 66 0a 20 20 7d 3b 0a 20 20 75 6e 73 69  ndif.  };.  unsi
360c0 67 6e 65 64 20 69 6e 74 20 69 3b 20 20 20 20 20  gned int i;     
360d0 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
360e0 6e 74 65 72 20 2a 2f 0a 0a 20 20 2f 2a 20 52 65  nter */..  /* Re
360f0 67 69 73 74 65 72 20 61 6c 6c 20 56 46 53 65 73  gister all VFSes
36100 20 64 65 66 69 6e 65 64 20 69 6e 20 74 68 65 20   defined in the 
36110 61 56 66 73 5b 5d 20 61 72 72 61 79 20 2a 2f 0a  aVfs[] array */.
36120 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 28 73 69    for(i=0; i<(si
36130 7a 65 6f 66 28 61 56 66 73 29 2f 73 69 7a 65 6f  zeof(aVfs)/sizeo
36140 66 28 73 71 6c 69 74 65 33 5f 76 66 73 29 29 3b  f(sqlite3_vfs));
36150 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
36160 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28  e3_vfs_register(
36170 26 61 56 66 73 5b 69 5d 2c 20 69 3d 3d 30 29 3b  &aVfs[i], i==0);
36180 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
36190 4c 49 54 45 5f 4f 4b 3b 20 0a 7d 0a 0a 2f 2a 0a  LITE_OK; .}../*.
361a0 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74 68 65 20  ** Shutdown the 
361b0 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
361c0 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2a 0a 2a   interface..**.*
361d0 2a 20 53 6f 6d 65 20 6f 70 65 72 61 74 69 6e 67  * Some operating
361e0 20 73 79 73 74 65 6d 73 20 6d 69 67 68 74 20 6e   systems might n
361f0 65 65 64 20 74 6f 20 64 6f 20 73 6f 6d 65 20 63  eed to do some c
36200 6c 65 61 6e 75 70 20 69 6e 20 74 68 69 73 20 72  leanup in this r
36210 6f 75 74 69 6e 65 2c 0a 2a 2a 20 74 6f 20 72 65  outine,.** to re
36220 6c 65 61 73 65 20 64 79 6e 61 6d 69 63 61 6c 6c  lease dynamicall
36230 79 20 61 6c 6c 6f 63 61 74 65 64 20 6f 62 6a 65  y allocated obje
36240 63 74 73 2e 20 20 42 75 74 20 6e 6f 74 20 6f 6e  cts.  But not on
36250 20 75 6e 69 78 2e 0a 2a 2a 20 54 68 69 73 20 72   unix..** This r
36260 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
36270 70 20 66 6f 72 20 75 6e 69 78 2e 0a 2a 2f 0a 69  p for unix..*/.i
36280 6e 74 20 73 71 6c 69 74 65 33 5f 6f 73 5f 65 6e  nt sqlite3_os_en
36290 64 28 76 6f 69 64 29 7b 20 0a 20 20 72 65 74 75  d(void){ .  retu
362a0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 0a 7d  rn SQLITE_OK; .}
362b0 0a 20 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  . .#endif /* SQL
362c0 49 54 45 5f 4f 53 5f 55 4e 49 58 20 2a 2f 0a     ITE_OS_UNIX */.