/ Hex Artifact Content
Login

Artifact 683ba91de68419771b13f2b9a3dc0e439147e199:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 4d 61 79 20 32  /*.** 2004 May 2
0010: 32 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  2.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
0180: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74   file contains t
0190: 68 65 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74  he VFS implement
01a0: 61 74 69 6f 6e 20 66 6f 72 20 75 6e 69 78 2d 6c  ation for unix-l
01b0: 69 6b 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  ike operating sy
01c0: 73 74 65 6d 73 0a 2a 2a 20 69 6e 63 6c 75 64 65  stems.** include
01d0: 20 4c 69 6e 75 78 2c 20 4d 61 63 4f 53 58 2c 20   Linux, MacOSX, 
01e0: 2a 42 53 44 2c 20 51 4e 58 2c 20 56 78 57 6f 72  *BSD, QNX, VxWor
01f0: 6b 73 2c 20 41 49 58 2c 20 48 50 55 58 2c 20 61  ks, AIX, HPUX, a
0200: 6e 64 20 6f 74 68 65 72 73 2e 0a 2a 2a 0a 2a 2a  nd others..**.**
0210: 20 54 68 65 72 65 20 61 72 65 20 61 63 74 75 61   There are actua
0220: 6c 6c 79 20 73 65 76 65 72 61 6c 20 64 69 66 66  lly several diff
0230: 65 72 65 6e 74 20 56 46 53 20 69 6d 70 6c 65 6d  erent VFS implem
0240: 65 6e 74 61 74 69 6f 6e 73 20 69 6e 20 74 68 69  entations in thi
0250: 73 20 66 69 6c 65 2e 0a 2a 2a 20 54 68 65 20 64  s file..** The d
0260: 69 66 66 65 72 65 6e 63 65 73 20 61 72 65 20 69  ifferences are i
0270: 6e 20 74 68 65 20 77 61 79 20 74 68 61 74 20 66  n the way that f
0280: 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20 64  ile locking is d
0290: 6f 6e 65 2e 20 20 54 68 65 20 64 65 66 61 75 6c  one.  The defaul
02a0: 74 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74  t.** implementat
02b0: 69 6f 6e 20 75 73 65 73 20 50 6f 73 69 78 20 41  ion uses Posix A
02c0: 64 76 69 73 6f 72 79 20 4c 6f 63 6b 73 2e 20 20  dvisory Locks.  
02d0: 41 6c 74 65 72 6e 61 74 69 76 65 20 69 6d 70 6c  Alternative impl
02e0: 65 6d 65 6e 74 61 74 69 6f 6e 73 0a 2a 2a 20 75  ementations.** u
02f0: 73 65 20 66 6c 6f 63 6b 28 29 2c 20 64 6f 74 2d  se flock(), dot-
0300: 66 69 6c 65 73 2c 20 76 61 72 69 6f 75 73 20 70  files, various p
0310: 72 6f 70 72 69 65 74 61 72 79 20 6c 6f 63 6b 69  roprietary locki
0320: 6e 67 20 73 63 68 65 6d 61 73 2c 20 6f 72 20 73  ng schemas, or s
0330: 69 6d 70 6c 79 0a 2a 2a 20 73 6b 69 70 20 6c 6f  imply.** skip lo
0340: 63 6b 69 6e 67 20 61 6c 6c 20 74 6f 67 65 74 68  cking all togeth
0350: 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73  er..**.** This s
0360: 6f 75 72 63 65 20 66 69 6c 65 20 69 73 20 6f 72  ource file is or
0370: 67 61 6e 69 7a 65 64 20 69 6e 74 6f 20 64 69 76  ganized into div
0380: 69 73 69 6f 6e 73 20 77 68 65 72 65 20 74 68 65  isions where the
0390: 20 6c 6f 67 69 63 20 66 6f 72 20 76 61 72 69 6f   logic for vario
03a0: 75 73 0a 2a 2a 20 73 75 62 66 75 6e 63 74 69 6f  us.** subfunctio
03b0: 6e 73 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20  ns is contained 
03c0: 77 69 74 68 69 6e 20 74 68 65 20 61 70 70 72 6f  within the appro
03d0: 70 72 69 61 74 65 20 64 69 76 69 73 69 6f 6e 2e  priate division.
03e0: 20 20 50 4c 45 41 53 45 0a 2a 2a 20 4b 45 45 50    PLEASE.** KEEP
03f0: 20 54 48 45 20 53 54 52 55 43 54 55 52 45 20 4f   THE STRUCTURE O
0400: 46 20 54 48 49 53 20 46 49 4c 45 20 49 4e 54 41  F THIS FILE INTA
0410: 43 54 2e 20 20 4e 65 77 20 63 6f 64 65 20 73 68  CT.  New code sh
0420: 6f 75 6c 64 20 62 65 20 70 6c 61 63 65 64 0a 2a  ould be placed.*
0430: 2a 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74  * in the correct
0440: 20 64 69 76 69 73 69 6f 6e 20 61 6e 64 20 73 68   division and sh
0450: 6f 75 6c 64 20 62 65 20 63 6c 65 61 72 6c 79 20  ould be clearly 
0460: 6c 61 62 65 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  labeled..**.** T
0470: 68 65 20 6c 61 79 6f 75 74 20 6f 66 20 64 69 76  he layout of div
0480: 69 73 69 6f 6e 73 20 69 73 20 61 73 20 66 6f 6c  isions is as fol
0490: 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  lows:.**.**   * 
04a0: 20 47 65 6e 65 72 61 6c 2d 70 75 72 70 6f 73 65   General-purpose
04b0: 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 20 61 6e   declarations an
04c0: 64 20 75 74 69 6c 69 74 79 20 66 75 6e 63 74 69  d utility functi
04d0: 6f 6e 73 2e 0a 2a 2a 20 20 20 2a 20 20 55 6e 69  ons..**   *  Uni
04e0: 71 75 65 20 66 69 6c 65 20 49 44 20 6c 6f 67 69  que file ID logi
04f0: 63 20 75 73 65 64 20 62 79 20 56 78 57 6f 72 6b  c used by VxWork
0500: 73 2e 0a 2a 2a 20 20 20 2a 20 20 56 61 72 69 6f  s..**   *  Vario
0510: 75 73 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69  us locking primi
0520: 74 69 76 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  tive implementat
0530: 69 6f 6e 73 20 28 61 6c 6c 20 65 78 63 65 70 74  ions (all except
0540: 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 29 3a   proxy locking):
0550: 0a 2a 2a 20 20 20 20 20 20 2b 20 66 6f 72 20 50  .**      + for P
0560: 6f 73 69 78 20 41 64 76 69 73 6f 72 79 20 4c 6f  osix Advisory Lo
0570: 63 6b 73 0a 2a 2a 20 20 20 20 20 20 2b 20 66 6f  cks.**      + fo
0580: 72 20 6e 6f 2d 6f 70 20 6c 6f 63 6b 73 0a 2a 2a  r no-op locks.**
0590: 20 20 20 20 20 20 2b 20 66 6f 72 20 64 6f 74 2d        + for dot-
05a0: 66 69 6c 65 20 6c 6f 63 6b 73 0a 2a 2a 20 20 20  file locks.**   
05b0: 20 20 20 2b 20 66 6f 72 20 66 6c 6f 63 6b 28 29     + for flock()
05c0: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   locking.**     
05d0: 20 2b 20 66 6f 72 20 6e 61 6d 65 64 20 73 65 6d   + for named sem
05e0: 61 70 68 6f 72 65 20 6c 6f 63 6b 73 20 28 56 78  aphore locks (Vx
05f0: 57 6f 72 6b 73 20 6f 6e 6c 79 29 0a 2a 2a 20 20  Works only).**  
0600: 20 20 20 20 2b 20 66 6f 72 20 41 46 50 20 66 69      + for AFP fi
0610: 6c 65 73 79 73 74 65 6d 20 6c 6f 63 6b 73 20 28  lesystem locks (
0620: 4d 61 63 4f 53 58 20 6f 6e 6c 79 29 0a 2a 2a 20  MacOSX only).** 
0630: 20 20 2a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c    *  sqlite3_fil
0640: 65 20 6d 65 74 68 6f 64 73 20 6e 6f 74 20 61 73  e methods not as
0650: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 6c 6f  sociated with lo
0660: 63 6b 69 6e 67 2e 0a 2a 2a 20 20 20 2a 20 20 44  cking..**   *  D
0670: 65 66 69 6e 69 74 69 6f 6e 73 20 6f 66 20 73 71  efinitions of sq
0680: 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
0690: 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 61 6c 6c   objects for all
06a0: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   locking.**     
06b0: 20 6d 65 74 68 6f 64 73 20 70 6c 75 73 20 22 66   methods plus "f
06c0: 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 73  inder" functions
06d0: 20 66 6f 72 20 65 61 63 68 20 6c 6f 63 6b 69 6e   for each lockin
06e0: 67 20 6d 65 74 68 6f 64 2e 0a 2a 2a 20 20 20 2a  g method..**   *
06f0: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65    sqlite3_vfs me
0700: 74 68 6f 64 20 69 6d 70 6c 65 6d 65 6e 74 61 74  thod implementat
0710: 69 6f 6e 73 2e 0a 2a 2a 20 20 20 2a 20 20 4c 6f  ions..**   *  Lo
0720: 63 6b 69 6e 67 20 70 72 69 6d 69 74 69 76 65 73  cking primitives
0730: 20 66 6f 72 20 74 68 65 20 70 72 6f 78 79 20 75   for the proxy u
0740: 62 65 72 2d 6c 6f 63 6b 69 6e 67 2d 6d 65 74 68  ber-locking-meth
0750: 6f 64 2e 20 28 4d 61 63 4f 53 58 20 6f 6e 6c 79  od. (MacOSX only
0760: 29 0a 2a 2a 20 20 20 2a 20 20 44 65 66 69 6e 69  ).**   *  Defini
0770: 74 69 6f 6e 73 20 6f 66 20 73 71 6c 69 74 65 33  tions of sqlite3
0780: 5f 76 66 73 20 6f 62 6a 65 63 74 73 20 66 6f 72  _vfs objects for
0790: 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6d 65 74   all locking met
07a0: 68 6f 64 73 0a 2a 2a 20 20 20 20 20 20 70 6c 75  hods.**      plu
07b0: 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  s implementation
07c0: 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 6f 73 5f  s of sqlite3_os_
07d0: 69 6e 69 74 28 29 20 61 6e 64 20 73 71 6c 69 74  init() and sqlit
07e0: 65 33 5f 6f 73 5f 65 6e 64 28 29 2e 0a 2a 2f 0a  e3_os_end()..*/.
07f0: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0800: 49 6e 74 2e 68 22 0a 23 69 66 20 53 51 4c 49 54  Int.h".#if SQLIT
0810: 45 5f 4f 53 5f 55 4e 49 58 20 20 20 20 20 20 20  E_OS_UNIX       
0820: 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 66         /* This f
0830: 69 6c 65 20 69 73 20 75 73 65 64 20 6f 6e 20 75  ile is used on u
0840: 6e 69 78 20 6f 6e 6c 79 20 2a 2f 0a 0a 2f 2a 0a  nix only */../*.
0850: 2a 2a 20 54 68 65 72 65 20 61 72 65 20 76 61 72  ** There are var
0860: 69 6f 75 73 20 6d 65 74 68 6f 64 73 20 66 6f 72  ious methods for
0870: 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 75 73   file locking us
0880: 65 64 20 66 6f 72 20 63 6f 6e 63 75 72 72 65 6e  ed for concurren
0890: 63 79 0a 2a 2a 20 63 6f 6e 74 72 6f 6c 3a 0a 2a  cy.** control:.*
08a0: 2a 0a 2a 2a 20 20 20 31 2e 20 50 4f 53 49 58 20  *.**   1. POSIX 
08b0: 6c 6f 63 6b 69 6e 67 20 28 74 68 65 20 64 65 66  locking (the def
08c0: 61 75 6c 74 29 2c 0a 2a 2a 20 20 20 32 2e 20 4e  ault),.**   2. N
08d0: 6f 20 6c 6f 63 6b 69 6e 67 2c 0a 2a 2a 20 20 20  o locking,.**   
08e0: 33 2e 20 44 6f 74 2d 66 69 6c 65 20 6c 6f 63 6b  3. Dot-file lock
08f0: 69 6e 67 2c 0a 2a 2a 20 20 20 34 2e 20 66 6c 6f  ing,.**   4. flo
0900: 63 6b 28 29 20 6c 6f 63 6b 69 6e 67 2c 0a 2a 2a  ck() locking,.**
0910: 20 20 20 35 2e 20 41 46 50 20 6c 6f 63 6b 69 6e     5. AFP lockin
0920: 67 20 28 4f 53 58 20 6f 6e 6c 79 29 2c 0a 2a 2a  g (OSX only),.**
0930: 20 20 20 36 2e 20 4e 61 6d 65 64 20 50 4f 53 49     6. Named POSI
0940: 58 20 73 65 6d 61 70 68 6f 72 65 73 20 28 56 58  X semaphores (VX
0950: 57 6f 72 6b 73 20 6f 6e 6c 79 29 2c 0a 2a 2a 20  Works only),.** 
0960: 20 20 37 2e 20 70 72 6f 78 79 20 6c 6f 63 6b 69    7. proxy locki
0970: 6e 67 2e 20 28 4f 53 58 20 6f 6e 6c 79 29 0a 2a  ng. (OSX only).*
0980: 2a 0a 2a 2a 20 53 74 79 6c 65 73 20 34 2c 20 35  *.** Styles 4, 5
0990: 2c 20 61 6e 64 20 37 20 61 72 65 20 6f 6e 6c 79  , and 7 are only
09a0: 20 61 76 61 69 6c 61 62 6c 65 20 6f 66 20 53 51   available of SQ
09b0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
09c0: 49 4e 47 5f 53 54 59 4c 45 0a 2a 2a 20 69 73 20  ING_STYLE.** is 
09d0: 64 65 66 69 6e 65 64 20 74 6f 20 31 2e 20 20 54  defined to 1.  T
09e0: 68 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  he SQLITE_ENABLE
09f0: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 61  _LOCKING_STYLE a
0a00: 6c 73 6f 20 65 6e 61 62 6c 65 73 20 61 75 74 6f  lso enables auto
0a10: 6d 61 74 69 63 0a 2a 2a 20 73 65 6c 65 63 74 69  matic.** selecti
0a20: 6f 6e 20 6f 66 20 74 68 65 20 61 70 70 72 6f 70  on of the approp
0a30: 72 69 61 74 65 20 6c 6f 63 6b 69 6e 67 20 73 74  riate locking st
0a40: 79 6c 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65  yle based on the
0a50: 20 66 69 6c 65 73 79 73 74 65 6d 0a 2a 2a 20 77   filesystem.** w
0a60: 68 65 72 65 20 74 68 65 20 64 61 74 61 62 61 73  here the databas
0a70: 65 20 69 73 20 6c 6f 63 61 74 65 64 2e 20 20 0a  e is located.  .
0a80: 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
0a90: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
0aa0: 43 4b 49 4e 47 5f 53 54 59 4c 45 29 0a 23 20 20  CKING_STYLE).#  
0ab0: 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
0ac0: 4c 45 5f 5f 29 0a 23 20 20 20 20 64 65 66 69 6e  LE__).#    defin
0ad0: 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  e SQLITE_ENABLE_
0ae0: 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 31 0a  LOCKING_STYLE 1.
0af0: 23 20 20 65 6c 73 65 0a 23 20 20 20 20 64 65 66  #  else.#    def
0b00: 69 6e 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ine SQLITE_ENABL
0b10: 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
0b20: 30 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69  0.#  endif.#endi
0b30: 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65 20  f../*.** Define 
0b40: 74 68 65 20 4f 53 5f 56 58 57 4f 52 4b 53 20 70  the OS_VXWORKS p
0b50: 72 65 2d 70 72 6f 63 65 73 73 6f 72 20 6d 61 63  re-processor mac
0b60: 72 6f 20 74 6f 20 31 20 69 66 20 62 75 69 6c 64  ro to 1 if build
0b70: 69 6e 67 20 6f 6e 20 0a 2a 2a 20 76 78 77 6f 72  ing on .** vxwor
0b80: 6b 73 2c 20 6f 72 20 30 20 6f 74 68 65 72 77 69  ks, or 0 otherwi
0b90: 73 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4f  se..*/.#ifndef O
0ba0: 53 5f 56 58 57 4f 52 4b 53 0a 23 20 20 69 66 20  S_VXWORKS.#  if 
0bb0: 64 65 66 69 6e 65 64 28 5f 5f 52 54 50 5f 5f 29  defined(__RTP__)
0bc0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 57 52 53   || defined(_WRS
0bd0: 5f 4b 45 52 4e 45 4c 29 0a 23 20 20 20 20 64 65  _KERNEL).#    de
0be0: 66 69 6e 65 20 4f 53 5f 56 58 57 4f 52 4b 53 20  fine OS_VXWORKS 
0bf0: 31 0a 23 20 20 65 6c 73 65 0a 23 20 20 20 20 64  1.#  else.#    d
0c00: 65 66 69 6e 65 20 4f 53 5f 56 58 57 4f 52 4b 53  efine OS_VXWORKS
0c10: 20 30 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64   0.#  endif.#end
0c20: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20  if../*.** These 
0c30: 23 64 65 66 69 6e 65 73 20 73 68 6f 75 6c 64 20  #defines should 
0c40: 65 6e 61 62 6c 65 20 3e 32 47 42 20 66 69 6c 65  enable >2GB file
0c50: 20 73 75 70 70 6f 72 74 20 6f 6e 20 50 6f 73 69   support on Posi
0c60: 78 20 69 66 20 74 68 65 0a 2a 2a 20 75 6e 64 65  x if the.** unde
0c70: 72 6c 79 69 6e 67 20 6f 70 65 72 61 74 69 6e 67  rlying operating
0c80: 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 73   system supports
0c90: 20 69 74 2e 20 20 49 66 20 74 68 65 20 4f 53 20   it.  If the OS 
0ca0: 6c 61 63 6b 73 0a 2a 2a 20 6c 61 72 67 65 20 66  lacks.** large f
0cb0: 69 6c 65 20 73 75 70 70 6f 72 74 2c 20 74 68 65  ile support, the
0cc0: 73 65 20 73 68 6f 75 6c 64 20 62 65 20 6e 6f 2d  se should be no-
0cd0: 6f 70 73 2e 0a 2a 2a 0a 2a 2a 20 4c 61 72 67 65  ops..**.** Large
0ce0: 20 66 69 6c 65 20 73 75 70 70 6f 72 74 20 63 61   file support ca
0cf0: 6e 20 62 65 20 64 69 73 61 62 6c 65 64 20 75 73  n be disabled us
0d00: 69 6e 67 20 74 68 65 20 2d 44 53 51 4c 49 54 45  ing the -DSQLITE
0d10: 5f 44 49 53 41 42 4c 45 5f 4c 46 53 20 73 77 69  _DISABLE_LFS swi
0d20: 74 63 68 0a 2a 2a 20 6f 6e 20 74 68 65 20 63 6f  tch.** on the co
0d30: 6d 70 69 6c 65 72 20 63 6f 6d 6d 61 6e 64 20 6c  mpiler command l
0d40: 69 6e 65 2e 20 20 54 68 69 73 20 69 73 20 6e 65  ine.  This is ne
0d50: 63 65 73 73 61 72 79 20 69 66 20 79 6f 75 20 61  cessary if you a
0d60: 72 65 20 63 6f 6d 70 69 6c 69 6e 67 0a 2a 2a 20  re compiling.** 
0d70: 6f 6e 20 61 20 72 65 63 65 6e 74 20 6d 61 63 68  on a recent mach
0d80: 69 6e 65 20 28 65 78 3a 20 52 65 64 48 61 74 20  ine (ex: RedHat 
0d90: 37 2e 32 29 20 62 75 74 20 79 6f 75 20 77 61 6e  7.2) but you wan
0da0: 74 20 79 6f 75 72 20 63 6f 64 65 20 74 6f 20 77  t your code to w
0db0: 6f 72 6b 0a 2a 2a 20 6f 6e 20 61 6e 20 6f 6c 64  ork.** on an old
0dc0: 65 72 20 6d 61 63 68 69 6e 65 20 28 65 78 3a 20  er machine (ex: 
0dd0: 52 65 64 48 61 74 20 36 2e 30 29 2e 20 20 49 66  RedHat 6.0).  If
0de0: 20 79 6f 75 20 63 6f 6d 70 69 6c 65 20 6f 6e 20   you compile on 
0df0: 52 65 64 48 61 74 20 37 2e 32 0a 2a 2a 20 77 69  RedHat 7.2.** wi
0e00: 74 68 6f 75 74 20 74 68 69 73 20 6f 70 74 69 6f  thout this optio
0e10: 6e 2c 20 4c 46 53 20 69 73 20 65 6e 61 62 6c 65  n, LFS is enable
0e20: 2e 20 20 42 75 74 20 4c 46 53 20 64 6f 65 73 20  .  But LFS does 
0e30: 6e 6f 74 20 65 78 69 73 74 20 69 6e 20 74 68 65  not exist in the
0e40: 20 6b 65 72 6e 65 6c 0a 2a 2a 20 69 6e 20 52 65   kernel.** in Re
0e50: 64 48 61 74 20 36 2e 30 2c 20 73 6f 20 74 68 65  dHat 6.0, so the
0e60: 20 63 6f 64 65 20 77 6f 6e 27 74 20 77 6f 72 6b   code won't work
0e70: 2e 20 20 48 65 6e 63 65 2c 20 66 6f 72 20 6d 61  .  Hence, for ma
0e80: 78 69 6d 75 6d 20 62 69 6e 61 72 79 0a 2a 2a 20  ximum binary.** 
0e90: 70 6f 72 74 61 62 69 6c 69 74 79 20 79 6f 75 20  portability you 
0ea0: 73 68 6f 75 6c 64 20 6f 6d 69 74 20 4c 46 53 2e  should omit LFS.
0eb0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 65 76 69  .**.** The previ
0ec0: 6f 75 73 20 70 61 72 61 67 72 61 70 68 20 77 61  ous paragraph wa
0ed0: 73 20 77 72 69 74 74 65 6e 20 69 6e 20 32 30 30  s written in 200
0ee0: 35 2e 20 20 28 54 68 69 73 20 70 61 72 61 67 72  5.  (This paragr
0ef0: 61 70 68 20 69 73 20 77 72 69 74 74 65 6e 0a 2a  aph is written.*
0f00: 2a 20 6f 6e 20 32 30 30 38 2d 31 31 2d 32 38 2e  * on 2008-11-28.
0f10: 29 20 54 68 65 73 65 20 64 61 79 73 2c 20 61 6c  ) These days, al
0f20: 6c 20 4c 69 6e 75 78 20 6b 65 72 6e 65 6c 73 20  l Linux kernels 
0f30: 73 75 70 70 6f 72 74 20 6c 61 72 67 65 20 66 69  support large fi
0f40: 6c 65 73 2c 20 73 6f 0a 2a 2a 20 79 6f 75 20 73  les, so.** you s
0f50: 68 6f 75 6c 64 20 70 72 6f 62 61 62 6c 79 20 6c  hould probably l
0f60: 65 61 76 65 20 4c 46 53 20 65 6e 61 62 6c 65 64  eave LFS enabled
0f70: 2e 20 20 42 75 74 20 73 6f 6d 65 20 65 6d 62 65  .  But some embe
0f80: 64 64 65 64 20 70 6c 61 74 66 6f 72 6d 73 20 6d  dded platforms m
0f90: 69 67 68 74 0a 2a 2a 20 6c 61 63 6b 20 4c 46 53  ight.** lack LFS
0fa0: 20 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 74   in which case t
0fb0: 68 65 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c  he SQLITE_DISABL
0fc0: 45 5f 4c 46 53 20 6d 61 63 72 6f 20 6d 69 67 68  E_LFS macro migh
0fd0: 74 20 73 74 69 6c 6c 20 62 65 20 75 73 65 66 75  t still be usefu
0fe0: 6c 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  l..*/.#ifndef SQ
0ff0: 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 4c 46 53  LITE_DISABLE_LFS
1000: 0a 23 20 64 65 66 69 6e 65 20 5f 4c 41 52 47 45  .# define _LARGE
1010: 5f 46 49 4c 45 20 20 20 20 20 20 20 31 0a 23 20  _FILE       1.# 
1020: 69 66 6e 64 65 66 20 5f 46 49 4c 45 5f 4f 46 46  ifndef _FILE_OFF
1030: 53 45 54 5f 42 49 54 53 0a 23 20 20 20 64 65 66  SET_BITS.#   def
1040: 69 6e 65 20 5f 46 49 4c 45 5f 4f 46 46 53 45 54  ine _FILE_OFFSET
1050: 5f 42 49 54 53 20 36 34 0a 23 20 65 6e 64 69 66  _BITS 64.# endif
1060: 0a 23 20 64 65 66 69 6e 65 20 5f 4c 41 52 47 45  .# define _LARGE
1070: 46 49 4c 45 5f 53 4f 55 52 43 45 20 31 0a 23 65  FILE_SOURCE 1.#e
1080: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 73 74 61 6e  ndif../*.** stan
1090: 64 61 72 64 20 69 6e 63 6c 75 64 65 20 66 69 6c  dard include fil
10a0: 65 73 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20  es..*/.#include 
10b0: 3c 73 79 73 2f 74 79 70 65 73 2e 68 3e 0a 23 69  <sys/types.h>.#i
10c0: 6e 63 6c 75 64 65 20 3c 73 79 73 2f 73 74 61 74  nclude <sys/stat
10d0: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 66 63  .h>.#include <fc
10e0: 6e 74 6c 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  ntl.h>.#include 
10f0: 3c 75 6e 69 73 74 64 2e 68 3e 0a 23 69 6e 63 6c  <unistd.h>.#incl
1100: 75 64 65 20 3c 74 69 6d 65 2e 68 3e 0a 23 69 6e  ude <time.h>.#in
1110: 63 6c 75 64 65 20 3c 73 79 73 2f 74 69 6d 65 2e  clude <sys/time.
1120: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 65 72 72  h>.#include <err
1130: 6e 6f 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  no.h>.#include <
1140: 73 79 73 2f 6d 6d 61 6e 2e 68 3e 0a 0a 23 69 66  sys/mman.h>..#if
1150: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
1160: 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 23 20 69  OCKING_STYLE.# i
1170: 6e 63 6c 75 64 65 20 3c 73 79 73 2f 69 6f 63 74  nclude <sys/ioct
1180: 6c 2e 68 3e 0a 23 20 69 66 20 4f 53 5f 56 58 57  l.h>.# if OS_VXW
1190: 4f 52 4b 53 0a 23 20 20 69 6e 63 6c 75 64 65 20  ORKS.#  include 
11a0: 3c 73 65 6d 61 70 68 6f 72 65 2e 68 3e 0a 23 20  <semaphore.h>.# 
11b0: 20 69 6e 63 6c 75 64 65 20 3c 6c 69 6d 69 74 73   include <limits
11c0: 2e 68 3e 0a 23 20 65 6c 73 65 0a 23 20 20 69 6e  .h>.# else.#  in
11d0: 63 6c 75 64 65 20 3c 73 79 73 2f 66 69 6c 65 2e  clude <sys/file.
11e0: 68 3e 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c 73  h>.#  include <s
11f0: 79 73 2f 70 61 72 61 6d 2e 68 3e 0a 23 20 65 6e  ys/param.h>.# en
1200: 64 69 66 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  dif.#endif /* SQ
1210: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
1220: 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a 23 69  ING_STYLE */..#i
1230: 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
1240: 45 5f 5f 29 20 7c 7c 20 28 53 51 4c 49 54 45 5f  E__) || (SQLITE_
1250: 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
1260: 54 59 4c 45 20 26 26 20 21 4f 53 5f 56 58 57 4f  TYLE && !OS_VXWO
1270: 52 4b 53 29 0a 23 20 69 6e 63 6c 75 64 65 20 3c  RKS).# include <
1280: 73 79 73 2f 6d 6f 75 6e 74 2e 68 3e 0a 23 65 6e  sys/mount.h>.#en
1290: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77  dif../*.** Allow
12a0: 65 64 20 76 61 6c 75 65 73 20 6f 66 20 75 6e 69  ed values of uni
12b0: 78 46 69 6c 65 2e 66 73 46 6c 61 67 73 0a 2a 2f  xFile.fsFlags.*/
12c0: 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  .#define SQLITE_
12d0: 46 53 46 4c 41 47 53 5f 49 53 5f 4d 53 44 4f 53  FSFLAGS_IS_MSDOS
12e0: 20 20 20 20 20 30 78 31 0a 0a 2f 2a 0a 2a 2a 20       0x1../*.** 
12f0: 49 66 20 77 65 20 61 72 65 20 74 6f 20 62 65 20  If we are to be 
1300: 74 68 72 65 61 64 2d 73 61 66 65 2c 20 69 6e 63  thread-safe, inc
1310: 6c 75 64 65 20 74 68 65 20 70 74 68 72 65 61 64  lude the pthread
1320: 73 20 68 65 61 64 65 72 20 61 6e 64 20 64 65 66  s header and def
1330: 69 6e 65 0a 2a 2a 20 74 68 65 20 53 51 4c 49 54  ine.** the SQLIT
1340: 45 5f 55 4e 49 58 5f 54 48 52 45 41 44 53 20 6d  E_UNIX_THREADS m
1350: 61 63 72 6f 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c  acro..*/.#if SQL
1360: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a 23  ITE_THREADSAFE.#
1370: 20 69 6e 63 6c 75 64 65 20 3c 70 74 68 72 65 61   include <pthrea
1380: 64 2e 68 3e 0a 23 20 64 65 66 69 6e 65 20 53 51  d.h>.# define SQ
1390: 4c 49 54 45 5f 55 4e 49 58 5f 54 48 52 45 41 44  LITE_UNIX_THREAD
13a0: 53 20 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  S 1.#endif../*.*
13b0: 2a 20 44 65 66 61 75 6c 74 20 70 65 72 6d 69 73  * Default permis
13c0: 73 69 6f 6e 73 20 77 68 65 6e 20 63 72 65 61 74  sions when creat
13d0: 69 6e 67 20 61 20 6e 65 77 20 66 69 6c 65 0a 2a  ing a new file.*
13e0: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
13f0: 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45  _DEFAULT_FILE_PE
1400: 52 4d 49 53 53 49 4f 4e 53 0a 23 20 64 65 66 69  RMISSIONS.# defi
1410: 6e 65 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  ne SQLITE_DEFAUL
1420: 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f  T_FILE_PERMISSIO
1430: 4e 53 20 30 36 34 34 0a 23 65 6e 64 69 66 0a 0a  NS 0644.#endif..
1440: 2f 2a 0a 20 2a 2a 20 44 65 66 61 75 6c 74 20 70  /*. ** Default p
1450: 65 72 6d 69 73 73 69 6f 6e 73 20 77 68 65 6e 20  ermissions when 
1460: 63 72 65 61 74 69 6e 67 20 61 75 74 6f 20 70 72  creating auto pr
1470: 6f 78 79 20 64 69 72 0a 20 2a 2f 0a 23 69 66 6e  oxy dir. */.#ifn
1480: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55  def SQLITE_DEFAU
1490: 4c 54 5f 50 52 4f 58 59 44 49 52 5f 50 45 52 4d  LT_PROXYDIR_PERM
14a0: 49 53 53 49 4f 4e 53 0a 23 20 64 65 66 69 6e 65  ISSIONS.# define
14b0: 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
14c0: 50 52 4f 58 59 44 49 52 5f 50 45 52 4d 49 53 53  PROXYDIR_PERMISS
14d0: 49 4f 4e 53 20 30 37 35 35 0a 23 65 6e 64 69 66  IONS 0755.#endif
14e0: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20  ../*.** Maximum 
14f0: 73 75 70 70 6f 72 74 65 64 20 70 61 74 68 2d 6c  supported path-l
1500: 65 6e 67 74 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e  ength..*/.#defin
1510: 65 20 4d 41 58 5f 50 41 54 48 4e 41 4d 45 20 35  e MAX_PATHNAME 5
1520: 31 32 0a 0a 2f 2a 0a 2a 2a 20 4f 6e 6c 79 20 73  12../*.** Only s
1530: 65 74 20 74 68 65 20 6c 61 73 74 45 72 72 6e 6f  et the lastErrno
1540: 20 69 66 20 74 68 65 20 65 72 72 6f 72 20 63 6f   if the error co
1550: 64 65 20 69 73 20 61 20 72 65 61 6c 20 65 72 72  de is a real err
1560: 6f 72 20 61 6e 64 20 6e 6f 74 20 0a 2a 2a 20 61  or and not .** a
1570: 20 6e 6f 72 6d 61 6c 20 65 78 70 65 63 74 65 64   normal expected
1580: 20 72 65 74 75 72 6e 20 63 6f 64 65 20 6f 66 20   return code of 
1590: 53 51 4c 49 54 45 5f 42 55 53 59 20 6f 72 20 53  SQLITE_BUSY or S
15a0: 51 4c 49 54 45 5f 4f 4b 0a 2a 2f 0a 23 64 65 66  QLITE_OK.*/.#def
15b0: 69 6e 65 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  ine IS_LOCK_ERRO
15c0: 52 28 78 29 20 20 28 28 78 20 21 3d 20 53 51 4c  R(x)  ((x != SQL
15d0: 49 54 45 5f 4f 4b 29 20 26 26 20 28 78 20 21 3d  ITE_OK) && (x !=
15e0: 20 53 51 4c 49 54 45 5f 42 55 53 59 29 29 0a 0a   SQLITE_BUSY))..
15f0: 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72  /* Forward refer
1600: 65 6e 63 65 73 20 2a 2f 0a 74 79 70 65 64 65 66  ences */.typedef
1610: 20 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d 20   struct unixShm 
1620: 75 6e 69 78 53 68 6d 3b 20 20 20 20 20 20 20 20  unixShm;        
1630: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63         /* Connec
1640: 74 69 6f 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f  tion shared memo
1650: 72 79 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  ry */.typedef st
1660: 72 75 63 74 20 75 6e 69 78 53 68 6d 4e 6f 64 65  ruct unixShmNode
1670: 20 75 6e 69 78 53 68 6d 4e 6f 64 65 3b 20 20 20   unixShmNode;   
1680: 20 20 20 20 2f 2a 20 53 68 61 72 65 64 20 6d 65      /* Shared me
1690: 6d 6f 72 79 20 69 6e 73 74 61 6e 63 65 20 2a 2f  mory instance */
16a0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
16b0: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 75 6e  unixInodeInfo un
16c0: 69 78 49 6e 6f 64 65 49 6e 66 6f 3b 20 20 20 2f  ixInodeInfo;   /
16d0: 2a 20 41 6e 20 69 2d 6e 6f 64 65 20 2a 2f 0a 74  * An i-node */.t
16e0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 55 6e  ypedef struct Un
16f0: 69 78 55 6e 75 73 65 64 46 64 20 55 6e 69 78 55  ixUnusedFd UnixU
1700: 6e 75 73 65 64 46 64 3b 20 20 20 20 20 2f 2a 20  nusedFd;     /* 
1710: 41 6e 20 75 6e 75 73 65 64 20 66 69 6c 65 20 64  An unused file d
1720: 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 0a 2f 2a  escriptor */../*
1730: 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 2c 20 61  .** Sometimes, a
1740: 66 74 65 72 20 61 20 66 69 6c 65 20 68 61 6e 64  fter a file hand
1750: 6c 65 20 69 73 20 63 6c 6f 73 65 64 20 62 79 20  le is closed by 
1760: 53 51 4c 69 74 65 2c 20 74 68 65 20 66 69 6c 65  SQLite, the file
1770: 20 64 65 73 63 72 69 70 74 6f 72 0a 2a 2a 20 63   descriptor.** c
1780: 61 6e 6e 6f 74 20 62 65 20 63 6c 6f 73 65 64 20  annot be closed 
1790: 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20 49 6e 20  immediately. In 
17a0: 74 68 65 73 65 20 63 61 73 65 73 2c 20 69 6e 73  these cases, ins
17b0: 74 61 6e 63 65 73 20 6f 66 20 74 68 65 20 66 6f  tances of the fo
17c0: 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 72 75 63  llowing.** struc
17d0: 74 75 72 65 20 61 72 65 20 75 73 65 64 20 74 6f  ture are used to
17e0: 20 73 74 6f 72 65 20 74 68 65 20 66 69 6c 65 20   store the file 
17f0: 64 65 73 63 72 69 70 74 6f 72 20 77 68 69 6c 65  descriptor while
1800: 20 77 61 69 74 69 6e 67 20 66 6f 72 20 61 6e 0a   waiting for an.
1810: 2a 2a 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74  ** opportunity t
1820: 6f 20 65 69 74 68 65 72 20 63 6c 6f 73 65 20 6f  o either close o
1830: 72 20 72 65 75 73 65 20 69 74 2e 0a 2a 2f 0a 73  r reuse it..*/.s
1840: 74 72 75 63 74 20 55 6e 69 78 55 6e 75 73 65 64  truct UnixUnused
1850: 46 64 20 7b 0a 20 20 69 6e 74 20 66 64 3b 20 20  Fd {.  int fd;  
1860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1870: 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70   /* File descrip
1880: 74 6f 72 20 74 6f 20 63 6c 6f 73 65 20 2a 2f 0a  tor to close */.
1890: 20 20 69 6e 74 20 66 6c 61 67 73 3b 20 20 20 20    int flags;    
18a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
18b0: 6c 61 67 73 20 74 68 69 73 20 66 69 6c 65 20 64  lags this file d
18c0: 65 73 63 72 69 70 74 6f 72 20 77 61 73 20 6f 70  escriptor was op
18d0: 65 6e 65 64 20 77 69 74 68 20 2a 2f 0a 20 20 55  ened with */.  U
18e0: 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70 4e 65  nixUnusedFd *pNe
18f0: 78 74 3b 20 20 20 20 20 20 2f 2a 20 4e 65 78 74  xt;      /* Next
1900: 20 75 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73   unused file des
1910: 63 72 69 70 74 6f 72 20 6f 6e 20 73 61 6d 65 20  criptor on same 
1920: 66 69 6c 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  file */.};../*.*
1930: 2a 20 54 68 65 20 75 6e 69 78 46 69 6c 65 20 73  * The unixFile s
1940: 74 72 75 63 74 75 72 65 20 69 73 20 73 75 62 63  tructure is subc
1950: 6c 61 73 73 20 6f 66 20 73 71 6c 69 74 65 33 5f  lass of sqlite3_
1960: 66 69 6c 65 20 73 70 65 63 69 66 69 63 20 74 6f  file specific to
1970: 20 74 68 65 20 75 6e 69 78 0a 2a 2a 20 56 46 53   the unix.** VFS
1980: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73   implementations
1990: 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  ..*/.typedef str
19a0: 75 63 74 20 75 6e 69 78 46 69 6c 65 20 75 6e 69  uct unixFile uni
19b0: 78 46 69 6c 65 3b 0a 73 74 72 75 63 74 20 75 6e  xFile;.struct un
19c0: 69 78 46 69 6c 65 20 7b 0a 20 20 73 71 6c 69 74  ixFile {.  sqlit
19d0: 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 63 6f  e3_io_methods co
19e0: 6e 73 74 20 2a 70 4d 65 74 68 6f 64 3b 20 20 2f  nst *pMethod;  /
19f0: 2a 20 41 6c 77 61 79 73 20 74 68 65 20 66 69 72  * Always the fir
1a00: 73 74 20 65 6e 74 72 79 20 2a 2f 0a 20 20 75 6e  st entry */.  un
1a10: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e  ixInodeInfo *pIn
1a20: 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ode;            
1a30: 20 20 2f 2a 20 49 6e 66 6f 20 61 62 6f 75 74 20    /* Info about 
1a40: 6c 6f 63 6b 73 20 6f 6e 20 74 68 69 73 20 69 6e  locks on this in
1a50: 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 68 3b 20  ode */.  int h; 
1a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a80: 54 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  The file descrip
1a90: 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 64 69 72  tor */.  int dir
1aa0: 66 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  fd;             
1ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ac0: 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  File descriptor 
1ad0: 66 6f 72 20 74 68 65 20 64 69 72 65 63 74 6f 72  for the director
1ae0: 79 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  y */.  unsigned 
1af0: 63 68 61 72 20 65 46 69 6c 65 4c 6f 63 6b 3b 20  char eFileLock; 
1b00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1b10: 65 20 74 79 70 65 20 6f 66 20 6c 6f 63 6b 20 68  e type of lock h
1b20: 65 6c 64 20 6f 6e 20 74 68 69 73 20 66 64 20 2a  eld on this fd *
1b30: 2f 0a 20 20 69 6e 74 20 6c 61 73 74 45 72 72 6e  /.  int lastErrn
1b40: 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o;              
1b50: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75          /* The u
1b60: 6e 69 78 20 65 72 72 6e 6f 20 66 72 6f 6d 20 6c  nix errno from l
1b70: 61 73 74 20 49 2f 4f 20 65 72 72 6f 72 20 2a 2f  ast I/O error */
1b80: 0a 20 20 76 6f 69 64 20 2a 6c 6f 63 6b 69 6e 67  .  void *locking
1b90: 43 6f 6e 74 65 78 74 3b 20 20 20 20 20 20 20 20  Context;        
1ba0: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 6b 69 6e         /* Lockin
1bb0: 67 20 73 74 79 6c 65 20 73 70 65 63 69 66 69 63  g style specific
1bc0: 20 73 74 61 74 65 20 2a 2f 0a 20 20 55 6e 69 78   state */.  Unix
1bd0: 55 6e 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65  UnusedFd *pUnuse
1be0: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
1bf0: 2f 2a 20 50 72 65 2d 61 6c 6c 6f 63 61 74 65 64  /* Pre-allocated
1c00: 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 2f   UnixUnusedFd */
1c10: 0a 20 20 69 6e 74 20 66 69 6c 65 46 6c 61 67 73  .  int fileFlags
1c20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1c30: 20 20 20 20 20 20 20 2f 2a 20 4d 69 73 63 65 6c         /* Miscel
1c40: 6c 61 6e 6f 75 73 20 66 6c 61 67 73 20 2a 2f 0a  lanous flags */.
1c50: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
1c60: 61 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20  ath;            
1c70: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
1c80: 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75   the file */.  u
1c90: 6e 69 78 53 68 6d 20 2a 70 53 68 6d 3b 20 20 20  nixShm *pShm;   
1ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cb0: 20 20 20 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d     /* Shared mem
1cc0: 6f 72 79 20 73 65 67 6d 65 6e 74 20 69 6e 66 6f  ory segment info
1cd0: 72 6d 61 74 69 6f 6e 20 2a 2f 0a 23 69 66 20 53  rmation */.#if S
1ce0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
1cf0: 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 69 6e 74  KING_STYLE.  int
1d00: 20 6f 70 65 6e 46 6c 61 67 73 3b 20 20 20 20 20   openFlags;     
1d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d20: 20 2f 2a 20 54 68 65 20 66 6c 61 67 73 20 73 70   /* The flags sp
1d30: 65 63 69 66 69 65 64 20 61 74 20 6f 70 65 6e 28  ecified at open(
1d40: 29 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20  ) */.#endif.#if 
1d50: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
1d60: 43 4b 49 4e 47 5f 53 54 59 4c 45 20 7c 7c 20 64  CKING_STYLE || d
1d70: 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
1d80: 29 0a 20 20 75 6e 73 69 67 6e 65 64 20 66 73 46  ).  unsigned fsF
1d90: 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
1da0: 20 20 20 20 20 20 20 20 2f 2a 20 63 61 63 68 65          /* cache
1db0: 64 20 64 65 74 61 69 6c 73 20 66 72 6f 6d 20 73  d details from s
1dc0: 74 61 74 66 73 28 29 20 2a 2f 0a 23 65 6e 64 69  tatfs() */.#endi
1dd0: 66 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  f.#if OS_VXWORKS
1de0: 0a 20 20 69 6e 74 20 69 73 44 65 6c 65 74 65 3b  .  int isDelete;
1df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e00: 20 20 20 20 20 20 20 2f 2a 20 44 65 6c 65 74 65         /* Delete
1e10: 20 6f 6e 20 63 6c 6f 73 65 20 69 66 20 74 72 75   on close if tru
1e20: 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 76 78  e */.  struct vx
1e30: 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 49 64  worksFileId *pId
1e40: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e  ;          /* Un
1e50: 69 71 75 65 20 66 69 6c 65 20 49 44 20 2a 2f 0a  ique file ID */.
1e60: 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 4e  #endif.#ifndef N
1e70: 44 45 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 6e  DEBUG.  /* The n
1e80: 65 78 74 20 67 72 6f 75 70 20 6f 66 20 76 61 72  ext group of var
1e90: 69 61 62 6c 65 73 20 61 72 65 20 75 73 65 64 20  iables are used 
1ea0: 74 6f 20 74 72 61 63 6b 20 77 68 65 74 68 65 72  to track whether
1eb0: 20 6f 72 20 6e 6f 74 20 74 68 65 0a 20 20 2a 2a   or not the.  **
1ec0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
1ed0: 6e 74 65 72 20 69 6e 20 62 79 74 65 73 20 32 34  nter in bytes 24
1ee0: 2d 32 37 20 6f 66 20 64 61 74 61 62 61 73 65 20  -27 of database 
1ef0: 66 69 6c 65 73 20 61 72 65 20 75 70 64 61 74 65  files are update
1f00: 64 0a 20 20 2a 2a 20 77 68 65 6e 65 76 65 72 20  d.  ** whenever 
1f10: 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65 20  any part of the 
1f20: 64 61 74 61 62 61 73 65 20 63 68 61 6e 67 65 73  database changes
1f30: 2e 20 20 41 6e 20 61 73 73 65 72 74 69 6f 6e 20  .  An assertion 
1f40: 66 61 75 6c 74 20 77 69 6c 6c 0a 20 20 2a 2a 20  fault will.  ** 
1f50: 6f 63 63 75 72 20 69 66 20 61 20 66 69 6c 65 20  occur if a file 
1f60: 69 73 20 75 70 64 61 74 65 64 20 77 69 74 68 6f  is updated witho
1f70: 75 74 20 61 6c 73 6f 20 75 70 64 61 74 69 6e 67  ut also updating
1f80: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1f90: 0a 20 20 2a 2a 20 63 6f 75 6e 74 65 72 2e 20 20  .  ** counter.  
1fa0: 54 68 69 73 20 74 65 73 74 20 69 73 20 6d 61 64  This test is mad
1fb0: 65 20 74 6f 20 61 76 6f 69 64 20 6e 65 77 20 70  e to avoid new p
1fc0: 72 6f 62 6c 65 6d 73 20 73 69 6d 69 6c 61 72 20  roblems similar 
1fd0: 74 6f 20 74 68 65 0a 20 20 2a 2a 20 6f 6e 65 20  to the.  ** one 
1fe0: 64 65 73 63 72 69 62 65 64 20 62 79 20 74 69 63  described by tic
1ff0: 6b 65 74 20 23 33 35 38 34 2e 20 0a 20 20 2a 2f  ket #3584. .  */
2000: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
2010: 20 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 3b 20   transCntrChng; 
2020: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65    /* True if the
2030: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
2040: 6e 74 65 72 20 63 68 61 6e 67 65 64 20 2a 2f 0a  nter changed */.
2050: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
2060: 64 62 55 70 64 61 74 65 3b 20 20 20 20 20 20 20  dbUpdate;       
2070: 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 79 20   /* True if any 
2080: 70 61 72 74 20 6f 66 20 64 61 74 61 62 61 73 65  part of database
2090: 20 66 69 6c 65 20 63 68 61 6e 67 65 64 20 2a 2f   file changed */
20a0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
20b0: 20 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 3b 20   inNormalWrite; 
20c0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 69 6e 20    /* True if in 
20d0: 61 20 6e 6f 72 6d 61 6c 20 77 72 69 74 65 20 6f  a normal write o
20e0: 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 23 65 6e 64  peration */.#end
20f0: 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  if.#ifdef SQLITE
2100: 5f 54 45 53 54 0a 20 20 2f 2a 20 49 6e 20 74 65  _TEST.  /* In te
2110: 73 74 20 6d 6f 64 65 2c 20 69 6e 63 72 65 61 73  st mode, increas
2120: 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  e the size of th
2130: 69 73 20 73 74 72 75 63 74 75 72 65 20 61 20 62  is structure a b
2140: 69 74 20 73 6f 20 74 68 61 74 20 0a 20 20 2a 2a  it so that .  **
2150: 20 69 74 20 69 73 20 6c 61 72 67 65 72 20 74 68   it is larger th
2160: 61 6e 20 74 68 65 20 73 74 72 75 63 74 20 43 72  an the struct Cr
2170: 61 73 68 46 69 6c 65 20 64 65 66 69 6e 65 64 20  ashFile defined 
2180: 69 6e 20 74 65 73 74 36 2e 63 2e 0a 20 20 2a 2f  in test6.c..  */
2190: 0a 20 20 63 68 61 72 20 61 50 61 64 64 69 6e 67  .  char aPadding
21a0: 5b 33 32 5d 3b 0a 23 65 6e 64 69 66 0a 7d 3b 0a  [32];.#endif.};.
21b0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
21c0: 77 69 6e 67 20 6d 61 63 72 6f 73 20 64 65 66 69  wing macros defi
21d0: 6e 65 20 62 69 74 73 20 69 6e 20 75 6e 69 78 46  ne bits in unixF
21e0: 69 6c 65 2e 66 69 6c 65 46 6c 61 67 73 0a 2a 2f  ile.fileFlags.*/
21f0: 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  .#define SQLITE_
2200: 57 48 4f 4c 45 5f 46 49 4c 45 5f 4c 4f 43 4b 49  WHOLE_FILE_LOCKI
2210: 4e 47 20 20 30 78 30 30 30 31 20 20 20 2f 2a 20  NG  0x0001   /* 
2220: 55 73 65 20 77 68 6f 6c 65 2d 66 69 6c 65 20 6c  Use whole-file l
2230: 6f 63 6b 69 6e 67 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  ocking */../*.**
2240: 20 49 6e 63 6c 75 64 65 20 63 6f 64 65 20 74 68   Include code th
2250: 61 74 20 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20  at is common to 
2260: 61 6c 6c 20 6f 73 5f 2a 2e 63 20 66 69 6c 65 73  all os_*.c files
2270: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 6f 73  .*/.#include "os
2280: 5f 63 6f 6d 6d 6f 6e 2e 68 22 0a 0a 2f 2a 0a 2a  _common.h"../*.*
2290: 2a 20 44 65 66 69 6e 65 20 76 61 72 69 6f 75 73  * Define various
22a0: 20 6d 61 63 72 6f 73 20 74 68 61 74 20 61 72 65   macros that are
22b0: 20 6d 69 73 73 69 6e 67 20 66 72 6f 6d 20 73 6f   missing from so
22c0: 6d 65 20 73 79 73 74 65 6d 73 2e 0a 2a 2f 0a 23  me systems..*/.#
22d0: 69 66 6e 64 65 66 20 4f 5f 4c 41 52 47 45 46 49  ifndef O_LARGEFI
22e0: 4c 45 0a 23 20 64 65 66 69 6e 65 20 4f 5f 4c 41  LE.# define O_LA
22f0: 52 47 45 46 49 4c 45 20 30 0a 23 65 6e 64 69 66  RGEFILE 0.#endif
2300: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
2310: 49 53 41 42 4c 45 5f 4c 46 53 0a 23 20 75 6e 64  ISABLE_LFS.# und
2320: 65 66 20 4f 5f 4c 41 52 47 45 46 49 4c 45 0a 23  ef O_LARGEFILE.#
2330: 20 64 65 66 69 6e 65 20 4f 5f 4c 41 52 47 45 46   define O_LARGEF
2340: 49 4c 45 20 30 0a 23 65 6e 64 69 66 0a 23 69 66  ILE 0.#endif.#if
2350: 6e 64 65 66 20 4f 5f 4e 4f 46 4f 4c 4c 4f 57 0a  ndef O_NOFOLLOW.
2360: 23 20 64 65 66 69 6e 65 20 4f 5f 4e 4f 46 4f 4c  # define O_NOFOL
2370: 4c 4f 57 20 30 0a 23 65 6e 64 69 66 0a 23 69 66  LOW 0.#endif.#if
2380: 6e 64 65 66 20 4f 5f 42 49 4e 41 52 59 0a 23 20  ndef O_BINARY.# 
2390: 64 65 66 69 6e 65 20 4f 5f 42 49 4e 41 52 59 20  define O_BINARY 
23a0: 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  0.#endif../*.** 
23b0: 54 68 65 20 44 4a 47 50 50 20 63 6f 6d 70 69 6c  The DJGPP compil
23c0: 65 72 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 6c  er environment l
23d0: 6f 6f 6b 73 20 6d 6f 73 74 6c 79 20 6c 69 6b 65  ooks mostly like
23e0: 20 55 6e 69 78 2c 20 62 75 74 20 69 74 0a 2a 2a   Unix, but it.**
23f0: 20 6c 61 63 6b 73 20 74 68 65 20 66 63 6e 74 6c   lacks the fcntl
2400: 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 20  () system call. 
2410: 20 53 6f 20 72 65 64 65 66 69 6e 65 20 66 63 6e   So redefine fcn
2420: 74 6c 28 29 20 74 6f 20 62 65 20 73 6f 6d 65 74  tl() to be somet
2430: 68 69 6e 67 0a 2a 2a 20 74 68 61 74 20 61 6c 77  hing.** that alw
2440: 61 79 73 20 73 75 63 63 65 65 64 73 2e 20 20 54  ays succeeds.  T
2450: 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 6c  his means that l
2460: 6f 63 6b 69 6e 67 20 64 6f 65 73 20 6e 6f 74 20  ocking does not 
2470: 6f 63 63 75 72 20 75 6e 64 65 72 0a 2a 2a 20 44  occur under.** D
2480: 4a 47 50 50 2e 20 20 42 75 74 20 69 74 20 69 73  JGPP.  But it is
2490: 20 44 4f 53 20 2d 20 77 68 61 74 20 64 69 64 20   DOS - what did 
24a0: 79 6f 75 20 65 78 70 65 63 74 3f 0a 2a 2f 0a 23  you expect?.*/.#
24b0: 69 66 64 65 66 20 5f 5f 44 4a 47 50 50 5f 5f 0a  ifdef __DJGPP__.
24c0: 23 20 64 65 66 69 6e 65 20 66 63 6e 74 6c 28 41  # define fcntl(A
24d0: 2c 42 2c 43 29 20 30 0a 23 65 6e 64 69 66 0a 0a  ,B,C) 0.#endif..
24e0: 2f 2a 0a 2a 2a 20 54 68 65 20 74 68 72 65 61 64  /*.** The thread
24f0: 69 64 20 6d 61 63 72 6f 20 72 65 73 6f 6c 76 65  id macro resolve
2500: 73 20 74 6f 20 74 68 65 20 74 68 72 65 61 64 2d  s to the thread-
2510: 69 64 20 6f 72 20 74 6f 20 30 2e 20 20 55 73 65  id or to 0.  Use
2520: 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67  d for.** testing
2530: 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f   and debugging o
2540: 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49  nly..*/.#if SQLI
2550: 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a 23 64  TE_THREADSAFE.#d
2560: 65 66 69 6e 65 20 74 68 72 65 61 64 69 64 20 70  efine threadid p
2570: 74 68 72 65 61 64 5f 73 65 6c 66 28 29 0a 23 65  thread_self().#e
2580: 6c 73 65 0a 23 64 65 66 69 6e 65 20 74 68 72 65  lse.#define thre
2590: 61 64 69 64 20 30 0a 23 65 6e 64 69 66 0a 0a 0a  adid 0.#endif...
25a0: 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e  /*.** Helper fun
25b0: 63 74 69 6f 6e 73 20 74 6f 20 6f 62 74 61 69 6e  ctions to obtain
25c0: 20 61 6e 64 20 72 65 6c 69 6e 71 75 69 73 68 20   and relinquish 
25d0: 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78  the global mutex
25e0: 2e 20 54 68 65 0a 2a 2a 20 67 6c 6f 62 61 6c 20  . The.** global 
25f0: 6d 75 74 65 78 20 69 73 20 75 73 65 64 20 74 6f  mutex is used to
2600: 20 70 72 6f 74 65 63 74 20 74 68 65 20 75 6e 69   protect the uni
2610: 78 49 6e 6f 64 65 49 6e 66 6f 20 61 6e 64 0a 2a  xInodeInfo and.*
2620: 2a 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  * vxworksFileId 
2630: 6f 62 6a 65 63 74 73 20 75 73 65 64 20 62 79 20  objects used by 
2640: 74 68 69 73 20 66 69 6c 65 2c 20 61 6c 6c 20 6f  this file, all o
2650: 66 20 77 68 69 63 68 20 6d 61 79 20 62 65 20 0a  f which may be .
2660: 2a 2a 20 73 68 61 72 65 64 20 62 79 20 6d 75 6c  ** shared by mul
2670: 74 69 70 6c 65 20 74 68 72 65 61 64 73 2e 0a 2a  tiple threads..*
2680: 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 20 75 6e  *.** Function un
2690: 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 69 73  ixMutexHeld() is
26a0: 20 75 73 65 64 20 74 6f 20 61 73 73 65 72 74 28   used to assert(
26b0: 29 20 74 68 61 74 20 74 68 65 20 67 6c 6f 62 61  ) that the globa
26c0: 6c 20 6d 75 74 65 78 20 0a 2a 2a 20 69 73 20 68  l mutex .** is h
26d0: 65 6c 64 20 77 68 65 6e 20 72 65 71 75 69 72 65  eld when require
26e0: 64 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  d. This function
26f0: 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 61 73   is only used as
2700: 20 70 61 72 74 20 6f 66 20 61 73 73 65 72 74 28   part of assert(
2710: 29 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73  ) .** statements
2720: 2e 20 65 2e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 75  . e.g..**.**   u
2730: 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 0a  nixEnterMutex().
2740: 2a 2a 20 20 20 20 20 61 73 73 65 72 74 28 20 75  **     assert( u
2750: 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 29  nixMutexHeld() )
2760: 3b 0a 2a 2a 20 20 20 75 6e 69 78 45 6e 74 65 72  ;.**   unixEnter
2770: 4c 65 61 76 65 28 29 0a 2a 2f 0a 73 74 61 74 69  Leave().*/.stati
2780: 63 20 76 6f 69 64 20 75 6e 69 78 45 6e 74 65 72  c void unixEnter
2790: 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a 20 20 73  Mutex(void){.  s
27a0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
27b0: 65 72 28 73 71 6c 69 74 65 33 4d 75 74 65 78 41  er(sqlite3MutexA
27c0: 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
27d0: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29  X_STATIC_MASTER)
27e0: 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  );.}.static void
27f0: 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
2800: 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33  void){.  sqlite3
2810: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 73 71 6c  _mutex_leave(sql
2820: 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
2830: 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
2840: 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 23  IC_MASTER));.}.#
2850: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
2860: 55 47 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  UG.static int un
2870: 69 78 4d 75 74 65 78 48 65 6c 64 28 76 6f 69 64  ixMutexHeld(void
2880: 29 20 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  ) {.  return sql
2890: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
28a0: 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
28b0: 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
28c0: 54 41 54 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a  TATIC_MASTER));.
28d0: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66 64 65  }.#endif...#ifde
28e0: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f  f SQLITE_DEBUG./
28f0: 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e 63  *.** Helper func
2900: 74 69 6f 6e 20 66 6f 72 20 70 72 69 6e 74 69 6e  tion for printin
2910: 67 20 6f 75 74 20 74 72 61 63 65 20 69 6e 66 6f  g out trace info
2920: 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 64 65 62  rmation from deb
2930: 75 67 67 69 6e 67 0a 2a 2a 20 62 69 6e 61 72 69  ugging.** binari
2940: 65 73 2e 20 54 68 69 73 20 72 65 74 75 72 6e 73  es. This returns
2950: 20 74 68 65 20 73 74 72 69 6e 67 20 72 65 70 72   the string repr
2960: 65 73 65 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  esetation of the
2970: 20 73 75 70 70 6c 69 65 64 0a 2a 2a 20 69 6e 74   supplied.** int
2980: 65 67 65 72 20 6c 6f 63 6b 2d 74 79 70 65 2e 0a  eger lock-type..
2990: 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
29a0: 63 68 61 72 20 2a 61 7a 46 69 6c 65 4c 6f 63 6b  char *azFileLock
29b0: 28 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b  (int eFileLock){
29c0: 0a 20 20 73 77 69 74 63 68 28 20 65 46 69 6c 65  .  switch( eFile
29d0: 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 63 61 73 65  Lock ){.    case
29e0: 20 4e 4f 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e   NO_LOCK: return
29f0: 20 22 4e 4f 4e 45 22 3b 0a 20 20 20 20 63 61 73   "NONE";.    cas
2a00: 65 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3a 20 72  e SHARED_LOCK: r
2a10: 65 74 75 72 6e 20 22 53 48 41 52 45 44 22 3b 0a  eturn "SHARED";.
2a20: 20 20 20 20 63 61 73 65 20 52 45 53 45 52 56 45      case RESERVE
2a30: 44 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22  D_LOCK: return "
2a40: 52 45 53 45 52 56 45 44 22 3b 0a 20 20 20 20 63  RESERVED";.    c
2a50: 61 73 65 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  ase PENDING_LOCK
2a60: 3a 20 72 65 74 75 72 6e 20 22 50 45 4e 44 49 4e  : return "PENDIN
2a70: 47 22 3b 0a 20 20 20 20 63 61 73 65 20 45 58 43  G";.    case EXC
2a80: 4c 55 53 49 56 45 5f 4c 4f 43 4b 3a 20 72 65 74  LUSIVE_LOCK: ret
2a90: 75 72 6e 20 22 45 58 43 4c 55 53 49 56 45 22 3b  urn "EXCLUSIVE";
2aa0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 22 45  .  }.  return "E
2ab0: 52 52 4f 52 22 3b 0a 7d 0a 23 65 6e 64 69 66 0a  RROR";.}.#endif.
2ac0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4c  .#ifdef SQLITE_L
2ad0: 4f 43 4b 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20  OCK_TRACE./*.** 
2ae0: 50 72 69 6e 74 20 6f 75 74 20 69 6e 66 6f 72 6d  Print out inform
2af0: 61 74 69 6f 6e 20 61 62 6f 75 74 20 61 6c 6c 20  ation about all 
2b00: 6c 6f 63 6b 69 6e 67 20 6f 70 65 72 61 74 69 6f  locking operatio
2b10: 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ns..**.** This r
2b20: 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66  outine is used f
2b30: 6f 72 20 74 72 6f 75 62 6c 65 73 68 6f 6f 74 69  or troubleshooti
2b40: 6e 67 20 6c 6f 63 6b 73 20 6f 6e 20 6d 75 6c 74  ng locks on mult
2b50: 69 74 68 72 65 61 64 65 64 0a 2a 2a 20 70 6c 61  ithreaded.** pla
2b60: 74 66 6f 72 6d 73 2e 20 20 45 6e 61 62 6c 65 20  tforms.  Enable 
2b70: 62 79 20 63 6f 6d 70 69 6c 69 6e 67 20 77 69 74  by compiling wit
2b80: 68 20 74 68 65 20 2d 44 53 51 4c 49 54 45 5f 4c  h the -DSQLITE_L
2b90: 4f 43 4b 5f 54 52 41 43 45 0a 2a 2a 20 63 6f 6d  OCK_TRACE.** com
2ba0: 6d 61 6e 64 2d 6c 69 6e 65 20 6f 70 74 69 6f 6e  mand-line option
2bb0: 20 6f 6e 20 74 68 65 20 63 6f 6d 70 69 6c 65 72   on the compiler
2bc0: 2e 20 20 54 68 69 73 20 63 6f 64 65 20 69 73 20  .  This code is 
2bd0: 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a 20 74 75 72 6e  normally.** turn
2be0: 65 64 20 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74 69  ed off..*/.stati
2bf0: 63 20 69 6e 74 20 6c 6f 63 6b 54 72 61 63 65 28  c int lockTrace(
2c00: 69 6e 74 20 66 64 2c 20 69 6e 74 20 6f 70 2c 20  int fd, int op, 
2c10: 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 2a 70 29  struct flock *p)
2c20: 7b 0a 20 20 63 68 61 72 20 2a 7a 4f 70 4e 61 6d  {.  char *zOpNam
2c30: 65 2c 20 2a 7a 54 79 70 65 3b 0a 20 20 69 6e 74  e, *zType;.  int
2c40: 20 73 3b 0a 20 20 69 6e 74 20 73 61 76 65 64 45   s;.  int savedE
2c50: 72 72 6e 6f 3b 0a 20 20 69 66 28 20 6f 70 3d 3d  rrno;.  if( op==
2c60: 46 5f 47 45 54 4c 4b 20 29 7b 0a 20 20 20 20 7a  F_GETLK ){.    z
2c70: 4f 70 4e 61 6d 65 20 3d 20 22 47 45 54 4c 4b 22  OpName = "GETLK"
2c80: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70  ;.  }else if( op
2c90: 3d 3d 46 5f 53 45 54 4c 4b 20 29 7b 0a 20 20 20  ==F_SETLK ){.   
2ca0: 20 7a 4f 70 4e 61 6d 65 20 3d 20 22 53 45 54 4c   zOpName = "SETL
2cb0: 4b 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  K";.  }else{.   
2cc0: 20 73 20 3d 20 66 63 6e 74 6c 28 66 64 2c 20 6f   s = fcntl(fd, o
2cd0: 70 2c 20 70 29 3b 0a 20 20 20 20 73 71 6c 69 74  p, p);.    sqlit
2ce0: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 66  e3DebugPrintf("f
2cf0: 63 6e 74 6c 20 75 6e 6b 6e 6f 77 6e 20 25 64 20  cntl unknown %d 
2d00: 25 64 20 25 64 5c 6e 22 2c 20 66 64 2c 20 6f 70  %d %d\n", fd, op
2d10: 2c 20 73 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , s);.    return
2d20: 20 73 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d   s;.  }.  if( p-
2d30: 3e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44 4c 43 4b  >l_type==F_RDLCK
2d40: 20 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20   ){.    zType = 
2d50: 22 52 44 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73 65  "RDLCK";.  }else
2d60: 20 69 66 28 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d   if( p->l_type==
2d70: 46 5f 57 52 4c 43 4b 20 29 7b 0a 20 20 20 20 7a  F_WRLCK ){.    z
2d80: 54 79 70 65 20 3d 20 22 57 52 4c 43 4b 22 3b 0a  Type = "WRLCK";.
2d90: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6c    }else if( p->l
2da0: 5f 74 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29  _type==F_UNLCK )
2db0: 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 22 55  {.    zType = "U
2dc0: 4e 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a  NLCK";.  }else{.
2dd0: 20 20 20 20 61 73 73 65 72 74 28 20 30 20 29 3b      assert( 0 );
2de0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
2df0: 2d 3e 6c 5f 77 68 65 6e 63 65 3d 3d 53 45 45 4b  ->l_whence==SEEK
2e00: 5f 53 45 54 20 29 3b 0a 20 20 73 20 3d 20 66 63  _SET );.  s = fc
2e10: 6e 74 6c 28 66 64 2c 20 6f 70 2c 20 70 29 3b 0a  ntl(fd, op, p);.
2e20: 20 20 73 61 76 65 64 45 72 72 6e 6f 20 3d 20 65    savedErrno = e
2e30: 72 72 6e 6f 3b 0a 20 20 73 71 6c 69 74 65 33 44  rrno;.  sqlite3D
2e40: 65 62 75 67 50 72 69 6e 74 66 28 22 66 63 6e 74  ebugPrintf("fcnt
2e50: 6c 20 25 64 20 25 64 20 25 73 20 25 73 20 25 64  l %d %d %s %s %d
2e60: 20 25 64 20 25 64 20 25 64 5c 6e 22 2c 0a 20 20   %d %d %d\n",.  
2e70: 20 20 20 74 68 72 65 61 64 69 64 2c 20 66 64 2c     threadid, fd,
2e80: 20 7a 4f 70 4e 61 6d 65 2c 20 7a 54 79 70 65 2c   zOpName, zType,
2e90: 20 28 69 6e 74 29 70 2d 3e 6c 5f 73 74 61 72 74   (int)p->l_start
2ea0: 2c 20 28 69 6e 74 29 70 2d 3e 6c 5f 6c 65 6e 2c  , (int)p->l_len,
2eb0: 0a 20 20 20 20 20 28 69 6e 74 29 70 2d 3e 6c 5f  .     (int)p->l_
2ec0: 70 69 64 2c 20 73 29 3b 0a 20 20 69 66 28 20 73  pid, s);.  if( s
2ed0: 3d 3d 28 2d 31 29 20 26 26 20 6f 70 3d 3d 46 5f  ==(-1) && op==F_
2ee0: 53 45 54 4c 4b 20 26 26 20 28 70 2d 3e 6c 5f 74  SETLK && (p->l_t
2ef0: 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 7c 7c 20  ype==F_RDLCK || 
2f00: 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 57 52 4c  p->l_type==F_WRL
2f10: 43 4b 29 20 29 7b 0a 20 20 20 20 73 74 72 75 63  CK) ){.    struc
2f20: 74 20 66 6c 6f 63 6b 20 6c 32 3b 0a 20 20 20 20  t flock l2;.    
2f30: 6c 32 20 3d 20 2a 70 3b 0a 20 20 20 20 66 63 6e  l2 = *p;.    fcn
2f40: 74 6c 28 66 64 2c 20 46 5f 47 45 54 4c 4b 2c 20  tl(fd, F_GETLK, 
2f50: 26 6c 32 29 3b 0a 20 20 20 20 69 66 28 20 6c 32  &l2);.    if( l2
2f60: 2e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44 4c 43 4b  .l_type==F_RDLCK
2f70: 20 29 7b 0a 20 20 20 20 20 20 7a 54 79 70 65 20   ){.      zType 
2f80: 3d 20 22 52 44 4c 43 4b 22 3b 0a 20 20 20 20 7d  = "RDLCK";.    }
2f90: 65 6c 73 65 20 69 66 28 20 6c 32 2e 6c 5f 74 79  else if( l2.l_ty
2fa0: 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 7b 0a 20  pe==F_WRLCK ){. 
2fb0: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 57 52       zType = "WR
2fc0: 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c 73 65 20  LCK";.    }else 
2fd0: 69 66 28 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46  if( l2.l_type==F
2fe0: 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20  _UNLCK ){.      
2ff0: 7a 54 79 70 65 20 3d 20 22 55 4e 4c 43 4b 22 3b  zType = "UNLCK";
3000: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
3010: 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a 20    assert( 0 );. 
3020: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
3030: 44 65 62 75 67 50 72 69 6e 74 66 28 22 66 63 6e  DebugPrintf("fcn
3040: 74 6c 2d 66 61 69 6c 75 72 65 2d 72 65 61 73 6f  tl-failure-reaso
3050: 6e 3a 20 25 73 20 25 64 20 25 64 20 25 64 5c 6e  n: %s %d %d %d\n
3060: 22 2c 0a 20 20 20 20 20 20 20 7a 54 79 70 65 2c  ",.       zType,
3070: 20 28 69 6e 74 29 6c 32 2e 6c 5f 73 74 61 72 74   (int)l2.l_start
3080: 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f 6c 65 6e 2c  , (int)l2.l_len,
3090: 20 28 69 6e 74 29 6c 32 2e 6c 5f 70 69 64 29 3b   (int)l2.l_pid);
30a0: 0a 20 20 7d 0a 20 20 65 72 72 6e 6f 20 3d 20 73  .  }.  errno = s
30b0: 61 76 65 64 45 72 72 6e 6f 3b 0a 20 20 72 65 74  avedErrno;.  ret
30c0: 75 72 6e 20 73 3b 0a 7d 0a 23 64 65 66 69 6e 65  urn s;.}.#define
30d0: 20 66 63 6e 74 6c 20 6c 6f 63 6b 54 72 61 63 65   fcntl lockTrace
30e0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
30f0: 45 5f 4c 4f 43 4b 5f 54 52 41 43 45 20 2a 2f 0a  E_LOCK_TRACE */.
3100: 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  .../*.** This ro
3110: 75 74 69 6e 65 20 74 72 61 6e 73 6c 61 74 65 73  utine translates
3120: 20 61 20 73 74 61 6e 64 61 72 64 20 50 4f 53 49   a standard POSI
3130: 58 20 65 72 72 6e 6f 20 63 6f 64 65 20 69 6e 74  X errno code int
3140: 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 75  o something.** u
3150: 73 65 66 75 6c 20 74 6f 20 74 68 65 20 63 6c 69  seful to the cli
3160: 65 6e 74 73 20 6f 66 20 74 68 65 20 73 71 6c 69  ents of the sqli
3170: 74 65 33 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20  te3 functions.  
3180: 53 70 65 63 69 66 69 63 61 6c 6c 79 2c 20 69 74  Specifically, it
3190: 20 69 73 0a 2a 2a 20 69 6e 74 65 6e 64 65 64 20   is.** intended 
31a0: 74 6f 20 74 72 61 6e 73 6c 61 74 65 20 61 20 76  to translate a v
31b0: 61 72 69 65 74 79 20 6f 66 20 22 74 72 79 20 61  ariety of "try a
31c0: 67 61 69 6e 22 20 65 72 72 6f 72 73 20 69 6e 74  gain" errors int
31d0: 6f 20 53 51 4c 49 54 45 5f 42 55 53 59 0a 2a 2a  o SQLITE_BUSY.**
31e0: 20 61 6e 64 20 61 20 76 61 72 69 65 74 79 20 6f   and a variety o
31f0: 66 20 22 70 6c 65 61 73 65 20 63 6c 6f 73 65 20  f "please close 
3200: 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
3210: 74 6f 72 20 4e 4f 57 22 20 65 72 72 6f 72 73 20  tor NOW" errors 
3220: 69 6e 74 6f 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  into .** SQLITE_
3230: 49 4f 45 52 52 0a 2a 2a 20 0a 2a 2a 20 45 72 72  IOERR.** .** Err
3240: 6f 72 73 20 64 75 72 69 6e 67 20 69 6e 69 74 69  ors during initi
3250: 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 6c 6f 63  alization of loc
3260: 6b 73 2c 20 6f 72 20 66 69 6c 65 20 73 79 73 74  ks, or file syst
3270: 65 6d 20 73 75 70 70 6f 72 74 20 66 6f 72 20 6c  em support for l
3280: 6f 63 6b 73 2c 0a 2a 2a 20 73 68 6f 75 6c 64 20  ocks,.** should 
3290: 68 61 6e 64 6c 65 20 45 4e 4f 4c 43 4b 2c 20 45  handle ENOLCK, E
32a0: 4e 4f 54 53 55 50 2c 20 45 4f 50 4e 4f 54 53 55  NOTSUP, EOPNOTSU
32b0: 50 50 20 73 65 70 61 72 61 74 65 6c 79 2e 0a 2a  PP separately..*
32c0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c  /.static int sql
32d0: 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
32e0: 78 45 72 72 6f 72 28 69 6e 74 20 70 6f 73 69 78  xError(int posix
32f0: 45 72 72 6f 72 2c 20 69 6e 74 20 73 71 6c 69 74  Error, int sqlit
3300: 65 49 4f 45 72 72 29 20 7b 0a 20 20 73 77 69 74  eIOErr) {.  swit
3310: 63 68 20 28 70 6f 73 69 78 45 72 72 6f 72 29 20  ch (posixError) 
3320: 7b 0a 20 20 63 61 73 65 20 30 3a 20 0a 20 20 20  {.  case 0: .   
3330: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
3340: 4b 3b 0a 20 20 20 20 0a 20 20 63 61 73 65 20 45  K;.    .  case E
3350: 41 47 41 49 4e 3a 0a 20 20 63 61 73 65 20 45 54  AGAIN:.  case ET
3360: 49 4d 45 44 4f 55 54 3a 0a 20 20 63 61 73 65 20  IMEDOUT:.  case 
3370: 45 42 55 53 59 3a 0a 20 20 63 61 73 65 20 45 49  EBUSY:.  case EI
3380: 4e 54 52 3a 0a 20 20 63 61 73 65 20 45 4e 4f 4c  NTR:.  case ENOL
3390: 43 4b 3a 20 20 0a 20 20 20 20 2f 2a 20 72 61 6e  CK:  .    /* ran
33a0: 64 6f 6d 20 4e 46 53 20 72 65 74 72 79 20 65 72  dom NFS retry er
33b0: 72 6f 72 2c 20 75 6e 6c 65 73 73 20 64 75 72 69  ror, unless duri
33c0: 6e 67 20 66 69 6c 65 20 73 79 73 74 65 6d 20 73  ng file system s
33d0: 75 70 70 6f 72 74 20 0a 20 20 20 20 20 2a 20 69  upport .     * i
33e0: 6e 74 72 6f 73 70 65 63 74 69 6f 6e 2c 20 69 6e  ntrospection, in
33f0: 20 77 68 69 63 68 20 69 74 20 61 63 74 75 61 6c   which it actual
3400: 6c 79 20 6d 65 61 6e 73 20 77 68 61 74 20 69 74  ly means what it
3410: 20 73 61 79 73 20 2a 2f 0a 20 20 20 20 72 65 74   says */.    ret
3420: 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  urn SQLITE_BUSY;
3430: 0a 20 20 20 20 0a 20 20 63 61 73 65 20 45 41 43  .    .  case EAC
3440: 43 45 53 3a 20 0a 20 20 20 20 2f 2a 20 45 41 43  CES: .    /* EAC
3450: 43 45 53 20 69 73 20 6c 69 6b 65 20 45 41 47 41  CES is like EAGA
3460: 49 4e 20 64 75 72 69 6e 67 20 6c 6f 63 6b 69 6e  IN during lockin
3470: 67 20 6f 70 65 72 61 74 69 6f 6e 73 2c 20 62 75  g operations, bu
3480: 74 20 6e 6f 74 20 61 6e 79 20 6f 74 68 65 72 20  t not any other 
3490: 74 69 6d 65 2a 2f 0a 20 20 20 20 69 66 28 20 28  time*/.    if( (
34a0: 73 71 6c 69 74 65 49 4f 45 72 72 20 3d 3d 20 53  sqliteIOErr == S
34b0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b  QLITE_IOERR_LOCK
34c0: 29 20 7c 7c 20 0a 09 28 73 71 6c 69 74 65 49 4f  ) || ..(sqliteIO
34d0: 45 72 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f  Err == SQLITE_IO
34e0: 45 52 52 5f 55 4e 4c 4f 43 4b 29 20 7c 7c 20 0a  ERR_UNLOCK) || .
34f0: 09 28 73 71 6c 69 74 65 49 4f 45 72 72 20 3d 3d  .(sqliteIOErr ==
3500: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44   SQLITE_IOERR_RD
3510: 4c 4f 43 4b 29 20 7c 7c 0a 09 28 73 71 6c 69 74  LOCK) ||..(sqlit
3520: 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49 54 45  eIOErr == SQLITE
3530: 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45  _IOERR_CHECKRESE
3540: 52 56 45 44 4c 4f 43 4b 29 20 29 7b 0a 20 20 20  RVEDLOCK) ){.   
3550: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
3560: 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a 20 20 20  _BUSY;.    }.   
3570: 20 2f 2a 20 65 6c 73 65 20 66 61 6c 6c 20 74 68   /* else fall th
3580: 72 6f 75 67 68 20 2a 2f 0a 20 20 63 61 73 65 20  rough */.  case 
3590: 45 50 45 52 4d 3a 20 0a 20 20 20 20 72 65 74 75  EPERM: .    retu
35a0: 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a  rn SQLITE_PERM;.
35b0: 20 20 20 20 0a 20 20 63 61 73 65 20 45 44 45 41      .  case EDEA
35c0: 44 4c 4b 3a 0a 20 20 20 20 72 65 74 75 72 6e 20  DLK:.    return 
35d0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f  SQLITE_IOERR_BLO
35e0: 43 4b 45 44 3b 0a 20 20 20 20 0a 23 69 66 20 45  CKED;.    .#if E
35f0: 4f 50 4e 4f 54 53 55 50 50 21 3d 45 4e 4f 54 53  OPNOTSUPP!=ENOTS
3600: 55 50 0a 20 20 63 61 73 65 20 45 4f 50 4e 4f 54  UP.  case EOPNOT
3610: 53 55 50 50 3a 20 0a 20 20 20 20 2f 2a 20 73 6f  SUPP: .    /* so
3620: 6d 65 74 68 69 6e 67 20 77 65 6e 74 20 74 65 72  mething went ter
3630: 72 69 62 6c 79 20 61 77 72 79 2c 20 75 6e 6c 65  ribly awry, unle
3640: 73 73 20 64 75 72 69 6e 67 20 66 69 6c 65 20 73  ss during file s
3650: 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20 0a 20  ystem support . 
3660: 20 20 20 20 2a 20 69 6e 74 72 6f 73 70 65 63 74      * introspect
3670: 69 6f 6e 2c 20 69 6e 20 77 68 69 63 68 20 69 74  ion, in which it
3680: 20 61 63 74 75 61 6c 6c 79 20 6d 65 61 6e 73 20   actually means 
3690: 77 68 61 74 20 69 74 20 73 61 79 73 20 2a 2f 0a  what it says */.
36a0: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 45 4e  #endif.#ifdef EN
36b0: 4f 54 53 55 50 0a 20 20 63 61 73 65 20 45 4e 4f  OTSUP.  case ENO
36c0: 54 53 55 50 3a 20 0a 20 20 20 20 2f 2a 20 69 6e  TSUP: .    /* in
36d0: 76 61 6c 69 64 20 66 64 2c 20 75 6e 6c 65 73 73  valid fd, unless
36e0: 20 64 75 72 69 6e 67 20 66 69 6c 65 20 73 79 73   during file sys
36f0: 74 65 6d 20 73 75 70 70 6f 72 74 20 69 6e 74 72  tem support intr
3700: 6f 73 70 65 63 74 69 6f 6e 2c 20 69 6e 20 77 68  ospection, in wh
3710: 69 63 68 20 0a 20 20 20 20 20 2a 20 69 74 20 61  ich .     * it a
3720: 63 74 75 61 6c 6c 79 20 6d 65 61 6e 73 20 77 68  ctually means wh
3730: 61 74 20 69 74 20 73 61 79 73 20 2a 2f 0a 23 65  at it says */.#e
3740: 6e 64 69 66 0a 20 20 63 61 73 65 20 45 49 4f 3a  ndif.  case EIO:
3750: 0a 20 20 63 61 73 65 20 45 42 41 44 46 3a 0a 20  .  case EBADF:. 
3760: 20 63 61 73 65 20 45 49 4e 56 41 4c 3a 0a 20 20   case EINVAL:.  
3770: 63 61 73 65 20 45 4e 4f 54 43 4f 4e 4e 3a 0a 20  case ENOTCONN:. 
3780: 20 63 61 73 65 20 45 4e 4f 44 45 56 3a 0a 20 20   case ENODEV:.  
3790: 63 61 73 65 20 45 4e 58 49 4f 3a 0a 20 20 63 61  case ENXIO:.  ca
37a0: 73 65 20 45 4e 4f 45 4e 54 3a 0a 20 20 63 61 73  se ENOENT:.  cas
37b0: 65 20 45 53 54 41 4c 45 3a 0a 20 20 63 61 73 65  e ESTALE:.  case
37c0: 20 45 4e 4f 53 59 53 3a 0a 20 20 20 20 2f 2a 20   ENOSYS:.    /* 
37d0: 74 68 65 73 65 20 73 68 6f 75 6c 64 20 66 6f 72  these should for
37e0: 63 65 20 74 68 65 20 63 6c 69 65 6e 74 20 74 6f  ce the client to
37f0: 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20   close the file 
3800: 61 6e 64 20 72 65 63 6f 6e 6e 65 63 74 20 2a 2f  and reconnect */
3810: 0a 20 20 20 20 0a 20 20 64 65 66 61 75 6c 74 3a  .    .  default:
3820: 20 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c   .    return sql
3830: 69 74 65 49 4f 45 72 72 3b 0a 20 20 7d 0a 7d 0a  iteIOErr;.  }.}.
3840: 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .../************
3850: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3860: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3870: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3880: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3890: 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
38a0: 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 55 6e 69 71  ***** Begin Uniq
38b0: 75 65 20 46 69 6c 65 20 49 44 20 55 74 69 6c 69  ue File ID Utili
38c0: 74 79 20 55 73 65 64 20 42 79 20 56 78 57 6f 72  ty Used By VxWor
38d0: 6b 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ks *************
38e0: 2a 2a 0a 2a 2a 0a 2a 2a 20 4f 6e 20 6d 6f 73 74  **.**.** On most
38f0: 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 75 6e 69   versions of uni
3900: 78 2c 20 77 65 20 63 61 6e 20 67 65 74 20 61 20  x, we can get a 
3910: 75 6e 69 71 75 65 20 49 44 20 66 6f 72 20 61 20  unique ID for a 
3920: 66 69 6c 65 20 62 79 20 63 6f 6e 63 61 74 65 6e  file by concaten
3930: 61 74 69 6e 67 0a 2a 2a 20 74 68 65 20 64 65 76  ating.** the dev
3940: 69 63 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 74  ice number and t
3950: 68 65 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72 2e  he inode number.
3960: 20 20 42 75 74 20 74 68 69 73 20 64 6f 65 73 20    But this does 
3970: 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 56 78 57 6f  not work on VxWo
3980: 72 6b 73 2e 0a 2a 2a 20 4f 6e 20 56 78 57 6f 72  rks..** On VxWor
3990: 6b 73 2c 20 61 20 75 6e 69 71 75 65 20 66 69 6c  ks, a unique fil
39a0: 65 20 69 64 20 6d 75 73 74 20 62 65 20 62 61 73  e id must be bas
39b0: 65 64 20 6f 6e 20 74 68 65 20 63 61 6e 6f 6e 69  ed on the canoni
39c0: 63 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a 2a 2a  cal filename..**
39d0: 0a 2a 2a 20 41 20 70 6f 69 6e 74 65 72 20 74 6f  .** A pointer to
39e0: 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   an instance of 
39f0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
3a00: 72 75 63 74 75 72 65 20 63 61 6e 20 62 65 20 75  ructure can be u
3a10: 73 65 64 20 61 73 20 61 0a 2a 2a 20 75 6e 69 71  sed as a.** uniq
3a20: 75 65 20 66 69 6c 65 20 49 44 20 69 6e 20 56 78  ue file ID in Vx
3a30: 57 6f 72 6b 73 2e 20 20 45 61 63 68 20 69 6e 73  Works.  Each ins
3a40: 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73 74  tance of this st
3a50: 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73  ructure contains
3a60: 0a 2a 2a 20 61 20 63 6f 70 79 20 6f 66 20 74 68  .** a copy of th
3a70: 65 20 63 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65  e canonical file
3a80: 6e 61 6d 65 2e 20 20 54 68 65 72 65 20 69 73 20  name.  There is 
3a90: 61 6c 73 6f 20 61 20 72 65 66 65 72 65 6e 63 65  also a reference
3aa0: 20 63 6f 75 6e 74 2e 20 20 0a 2a 2a 20 54 68 65   count.  .** The
3ab0: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 72 65   structure is re
3ac0: 63 6c 61 69 6d 65 64 20 77 68 65 6e 20 74 68 65  claimed when the
3ad0: 20 6e 75 6d 62 65 72 20 6f 66 20 70 6f 69 6e 74   number of point
3ae0: 65 72 73 20 74 6f 20 69 74 20 64 72 6f 70 73 20  ers to it drops 
3af0: 74 6f 0a 2a 2a 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a  to.** zero..**.*
3b00: 2a 20 54 68 65 72 65 20 61 72 65 20 6e 65 76 65  * There are neve
3b10: 72 20 76 65 72 79 20 6d 61 6e 79 20 66 69 6c 65  r very many file
3b20: 73 20 6f 70 65 6e 20 61 74 20 6f 6e 65 20 74 69  s open at one ti
3b30: 6d 65 20 61 6e 64 20 6c 6f 6f 6b 75 70 73 20 61  me and lookups a
3b40: 72 65 20 6e 6f 74 0a 2a 2a 20 61 20 70 65 72 66  re not.** a perf
3b50: 6f 72 6d 61 6e 63 65 2d 63 72 69 74 69 63 61 6c  ormance-critical
3b60: 20 70 61 74 68 2c 20 73 6f 20 69 74 20 69 73 20   path, so it is 
3b70: 73 75 66 66 69 63 69 65 6e 74 20 74 6f 20 70 75  sufficient to pu
3b80: 74 20 74 68 65 73 65 0a 2a 2a 20 73 74 72 75 63  t these.** struc
3b90: 74 75 72 65 73 20 6f 6e 20 61 20 6c 69 6e 6b 65  tures on a linke
3ba0: 64 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 72 75 63  d list..*/.struc
3bb0: 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  t vxworksFileId 
3bc0: 7b 0a 20 20 73 74 72 75 63 74 20 76 78 77 6f 72  {.  struct vxwor
3bd0: 6b 73 46 69 6c 65 49 64 20 2a 70 4e 65 78 74 3b  ksFileId *pNext;
3be0: 20 20 2f 2a 20 4e 65 78 74 20 69 6e 20 61 20 6c    /* Next in a l
3bf0: 69 73 74 20 6f 66 20 74 68 65 6d 20 61 6c 6c 20  ist of them all 
3c00: 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20  */.  int nRef;  
3c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c20: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
3c30: 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
3c40: 69 73 20 6f 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  is one */.  int 
3c50: 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  nName;          
3c60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e            /* Len
3c70: 67 74 68 20 6f 66 20 74 68 65 20 7a 43 61 6e 6f  gth of the zCano
3c80: 6e 69 63 61 6c 4e 61 6d 65 5b 5d 20 73 74 72 69  nicalName[] stri
3c90: 6e 67 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43  ng */.  char *zC
3ca0: 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 3b 20 20 20  anonicalName;   
3cb0: 20 20 20 20 20 20 2f 2a 20 43 61 6e 6f 6e 69 63        /* Canonic
3cc0: 61 6c 20 66 69 6c 65 6e 61 6d 65 20 2a 2f 0a 7d  al filename */.}
3cd0: 3b 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b  ;..#if OS_VXWORK
3ce0: 53 0a 2f 2a 20 0a 2a 2a 20 41 6c 6c 20 75 6e 69  S./* .** All uni
3cf0: 71 75 65 20 66 69 6c 65 6e 61 6d 65 73 20 61 72  que filenames ar
3d00: 65 20 68 65 6c 64 20 6f 6e 20 61 20 6c 69 6e 6b  e held on a link
3d10: 65 64 20 6c 69 73 74 20 68 65 61 64 65 64 20 62  ed list headed b
3d20: 79 20 74 68 69 73 0a 2a 2a 20 76 61 72 69 61 62  y this.** variab
3d30: 6c 65 3a 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74  le:.*/.static st
3d40: 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65  ruct vxworksFile
3d50: 49 64 20 2a 76 78 77 6f 72 6b 73 46 69 6c 65 4c  Id *vxworksFileL
3d60: 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20  ist = 0;../*.** 
3d70: 53 69 6d 70 6c 69 66 79 20 61 20 66 69 6c 65 6e  Simplify a filen
3d80: 61 6d 65 20 69 6e 74 6f 20 69 74 73 20 63 61 6e  ame into its can
3d90: 6f 6e 69 63 61 6c 20 66 6f 72 6d 0a 2a 2a 20 62  onical form.** b
3da0: 79 20 6d 61 6b 69 6e 67 20 74 68 65 20 66 6f 6c  y making the fol
3db0: 6c 6f 77 69 6e 67 20 63 68 61 6e 67 65 73 3a 0a  lowing changes:.
3dc0: 2a 2a 0a 2a 2a 20 20 2a 20 72 65 6d 6f 76 69 6e  **.**  * removin
3dd0: 67 20 61 6e 79 20 74 72 61 69 6c 69 6e 67 20 61  g any trailing a
3de0: 6e 64 20 64 75 70 6c 69 63 61 74 65 20 2f 0a 2a  nd duplicate /.*
3df0: 2a 20 20 2a 20 63 6f 6e 76 65 72 74 20 2f 2e 2f  *  * convert /./
3e00: 20 69 6e 74 6f 20 6a 75 73 74 20 2f 0a 2a 2a 20   into just /.** 
3e10: 20 2a 20 63 6f 6e 76 65 72 74 20 2f 41 2f 2e 2e   * convert /A/..
3e20: 2f 20 77 68 65 72 65 20 41 20 69 73 20 61 6e 79  / where A is any
3e30: 20 73 69 6d 70 6c 65 20 6e 61 6d 65 20 69 6e 74   simple name int
3e40: 6f 20 6a 75 73 74 20 2f 0a 2a 2a 0a 2a 2a 20 43  o just /.**.** C
3e50: 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20  hanges are made 
3e60: 69 6e 2d 70 6c 61 63 65 2e 20 20 52 65 74 75 72  in-place.  Retur
3e70: 6e 20 74 68 65 20 6e 65 77 20 6e 61 6d 65 20 6c  n the new name l
3e80: 65 6e 67 74 68 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ength..**.** The
3e90: 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65 6e 61   original filena
3ea0: 6d 65 20 69 73 20 69 6e 20 7a 5b 30 2e 2e 6e 2d  me is in z[0..n-
3eb0: 31 5d 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  1].  Return the 
3ec0: 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 63 68 61  number of.** cha
3ed0: 72 61 63 74 65 72 73 20 69 6e 20 74 68 65 20 73  racters in the s
3ee0: 69 6d 70 6c 69 66 69 65 64 20 6e 61 6d 65 2e 0a  implified name..
3ef0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 78  */.static int vx
3f00: 77 6f 72 6b 73 53 69 6d 70 6c 69 66 79 4e 61 6d  worksSimplifyNam
3f10: 65 28 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e  e(char *z, int n
3f20: 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  ){.  int i, j;. 
3f30: 20 77 68 69 6c 65 28 20 6e 3e 31 20 26 26 20 7a   while( n>1 && z
3f40: 5b 6e 2d 31 5d 3d 3d 27 2f 27 20 29 7b 20 6e 2d  [n-1]=='/' ){ n-
3f50: 2d 3b 20 7d 0a 20 20 66 6f 72 28 69 3d 6a 3d 30  -; }.  for(i=j=0
3f60: 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<n; i++){.   
3f70: 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 2f 27 20 29   if( z[i]=='/' )
3f80: 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2b  {.      if( z[i+
3f90: 31 5d 3d 3d 27 2f 27 20 29 20 63 6f 6e 74 69 6e  1]=='/' ) contin
3fa0: 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 5b  ue;.      if( z[
3fb0: 69 2b 31 5d 3d 3d 27 2e 27 20 26 26 20 69 2b 32  i+1]=='.' && i+2
3fc0: 3c 6e 20 26 26 20 7a 5b 69 2b 32 5d 3d 3d 27 2f  <n && z[i+2]=='/
3fd0: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 69 20 2b  ' ){.        i +
3fe0: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e  = 1;.        con
3ff0: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20  tinue;.      }. 
4000: 20 20 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3d       if( z[i+1]=
4010: 3d 27 2e 27 20 26 26 20 69 2b 33 3c 6e 20 26 26  ='.' && i+3<n &&
4020: 20 7a 5b 69 2b 32 5d 3d 3d 27 2e 27 20 26 26 20   z[i+2]=='.' && 
4030: 7a 5b 69 2b 33 5d 3d 3d 27 2f 27 20 29 7b 0a 20  z[i+3]=='/' ){. 
4040: 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 6a 3e         while( j>
4050: 30 20 26 26 20 7a 5b 6a 2d 31 5d 21 3d 27 2f 27  0 && z[j-1]!='/'
4060: 20 29 7b 20 6a 2d 2d 3b 20 7d 0a 20 20 20 20 20   ){ j--; }.     
4070: 20 20 20 69 66 28 20 6a 3e 30 20 29 7b 20 6a 2d     if( j>0 ){ j-
4080: 2d 3b 20 7d 0a 20 20 20 20 20 20 20 20 69 20 2b  -; }.        i +
4090: 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e  = 2;.        con
40a0: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20  tinue;.      }. 
40b0: 20 20 20 7d 0a 20 20 20 20 7a 5b 6a 2b 2b 5d 20     }.    z[j++] 
40c0: 3d 20 7a 5b 69 5d 3b 0a 20 20 7d 0a 20 20 7a 5b  = z[i];.  }.  z[
40d0: 6a 5d 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  j] = 0;.  return
40e0: 20 6a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e   j;.}../*.** Fin
40f0: 64 20 61 20 75 6e 69 71 75 65 20 66 69 6c 65 20  d a unique file 
4100: 49 44 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e  ID for the given
4110: 20 61 62 73 6f 6c 75 74 65 20 70 61 74 68 6e 61   absolute pathna
4120: 6d 65 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 61  me.  Return.** a
4130: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
4140: 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62  vxworksFileId ob
4150: 6a 65 63 74 2e 20 20 54 68 69 73 20 70 6f 69 6e  ject.  This poin
4160: 74 65 72 20 69 73 20 74 68 65 20 75 6e 69 71 75  ter is the uniqu
4170: 65 0a 2a 2a 20 66 69 6c 65 20 49 44 2e 0a 2a 2a  e.** file ID..**
4180: 0a 2a 2a 20 54 68 65 20 6e 52 65 66 20 66 69 65  .** The nRef fie
4190: 6c 64 20 6f 66 20 74 68 65 20 76 78 77 6f 72 6b  ld of the vxwork
41a0: 73 46 69 6c 65 49 64 20 6f 62 6a 65 63 74 20 69  sFileId object i
41b0: 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 62 65  s incremented be
41c0: 66 6f 72 65 0a 2a 2a 20 74 68 65 20 6f 62 6a 65  fore.** the obje
41d0: 63 74 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  ct is returned. 
41e0: 20 41 20 6e 65 77 20 76 78 77 6f 72 6b 73 46 69   A new vxworksFi
41f0: 6c 65 49 64 20 6f 62 6a 65 63 74 20 69 73 20 63  leId object is c
4200: 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20 61 64  reated.** and ad
4210: 64 65 64 20 74 6f 20 74 68 65 20 67 6c 6f 62 61  ded to the globa
4220: 6c 20 6c 69 73 74 20 69 66 20 6e 65 63 65 73 73  l list if necess
4230: 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  ary..**.** If a 
4240: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
4250: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
4260: 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a  return NULL..*/.
4270: 73 74 61 74 69 63 20 73 74 72 75 63 74 20 76 78  static struct vx
4280: 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 76 78 77  worksFileId *vxw
4290: 6f 72 6b 73 46 69 6e 64 46 69 6c 65 49 64 28 63  orksFindFileId(c
42a0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 62 73 6f  onst char *zAbso
42b0: 6c 75 74 65 4e 61 6d 65 29 7b 0a 20 20 73 74 72  luteName){.  str
42c0: 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49  uct vxworksFileI
42d0: 64 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20  d *pNew;        
42e0: 20 2f 2a 20 73 65 61 72 63 68 20 6b 65 79 20 61   /* search key a
42f0: 6e 64 20 6e 65 77 20 66 69 6c 65 20 49 44 20 2a  nd new file ID *
4300: 2f 0a 20 20 73 74 72 75 63 74 20 76 78 77 6f 72  /.  struct vxwor
4310: 6b 73 46 69 6c 65 49 64 20 2a 70 43 61 6e 64 69  ksFileId *pCandi
4320: 64 61 74 65 3b 20 20 20 2f 2a 20 46 6f 72 20 6c  date;   /* For l
4330: 6f 6f 70 69 6e 67 20 6f 76 65 72 20 65 78 69 73  ooping over exis
4340: 74 69 6e 67 20 66 69 6c 65 20 49 44 73 20 2a 2f  ting file IDs */
4350: 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20  .  int n;       
4360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4370: 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68         /* Length
4380: 20 6f 66 20 7a 41 62 73 6f 6c 75 74 65 4e 61 6d   of zAbsoluteNam
4390: 65 20 73 74 72 69 6e 67 20 2a 2f 0a 0a 20 20 61  e string */..  a
43a0: 73 73 65 72 74 28 20 7a 41 62 73 6f 6c 75 74 65  ssert( zAbsolute
43b0: 4e 61 6d 65 5b 30 5d 3d 3d 27 2f 27 20 29 3b 0a  Name[0]=='/' );.
43c0: 20 20 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65    n = (int)strle
43d0: 6e 28 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65 29  n(zAbsoluteName)
43e0: 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74  ;.  pNew = sqlit
43f0: 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  e3_malloc( sizeo
4400: 66 28 2a 70 4e 65 77 29 20 2b 20 28 6e 2b 31 29  f(*pNew) + (n+1)
4410: 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   );.  if( pNew==
4420: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
4430: 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c  pNew->zCanonical
4440: 4e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70  Name = (char*)&p
4450: 4e 65 77 5b 31 5d 3b 0a 20 20 6d 65 6d 63 70 79  New[1];.  memcpy
4460: 28 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61  (pNew->zCanonica
4470: 6c 4e 61 6d 65 2c 20 7a 41 62 73 6f 6c 75 74 65  lName, zAbsolute
4480: 4e 61 6d 65 2c 20 6e 2b 31 29 3b 0a 20 20 6e 20  Name, n+1);.  n 
4490: 3d 20 76 78 77 6f 72 6b 73 53 69 6d 70 6c 69 66  = vxworksSimplif
44a0: 79 4e 61 6d 65 28 70 4e 65 77 2d 3e 7a 43 61 6e  yName(pNew->zCan
44b0: 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20 6e 29 3b 0a  onicalName, n);.
44c0: 0a 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72  .  /* Search for
44d0: 20 61 6e 20 65 78 69 73 74 69 6e 67 20 65 6e 74   an existing ent
44e0: 72 79 20 74 68 61 74 20 6d 61 74 63 68 69 6e 67  ry that matching
44f0: 20 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c 20 6e   the canonical n
4500: 61 6d 65 2e 0a 20 20 2a 2a 20 49 66 20 66 6f 75  ame..  ** If fou
4510: 6e 64 2c 20 69 6e 63 72 65 6d 65 6e 74 20 74 68  nd, increment th
4520: 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
4530: 74 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70  t and return a p
4540: 6f 69 6e 74 65 72 20 74 6f 0a 20 20 2a 2a 20 74  ointer to.  ** t
4550: 68 65 20 65 78 69 73 74 69 6e 67 20 66 69 6c 65  he existing file
4560: 20 49 44 2e 0a 20 20 2a 2f 0a 20 20 75 6e 69 78   ID..  */.  unix
4570: 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
4580: 66 6f 72 28 70 43 61 6e 64 69 64 61 74 65 3d 76  for(pCandidate=v
4590: 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74 3b 20  xworksFileList; 
45a0: 70 43 61 6e 64 69 64 61 74 65 3b 20 70 43 61 6e  pCandidate; pCan
45b0: 64 69 64 61 74 65 3d 70 43 61 6e 64 69 64 61 74  didate=pCandidat
45c0: 65 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  e->pNext){.    i
45d0: 66 28 20 70 43 61 6e 64 69 64 61 74 65 2d 3e 6e  f( pCandidate->n
45e0: 4e 61 6d 65 3d 3d 6e 20 0a 20 20 20 20 20 26 26  Name==n .     &&
45f0: 20 6d 65 6d 63 6d 70 28 70 43 61 6e 64 69 64 61   memcmp(pCandida
4600: 74 65 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61  te->zCanonicalNa
4610: 6d 65 2c 20 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e  me, pNew->zCanon
4620: 69 63 61 6c 4e 61 6d 65 2c 20 6e 29 3d 3d 30 0a  icalName, n)==0.
4630: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 73 71      ){.       sq
4640: 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77 29  lite3_free(pNew)
4650: 3b 0a 20 20 20 20 20 20 20 70 43 61 6e 64 69 64  ;.       pCandid
4660: 61 74 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20  ate->nRef++;.   
4670: 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74      unixLeaveMut
4680: 65 78 28 29 3b 0a 20 20 20 20 20 20 20 72 65 74  ex();.       ret
4690: 75 72 6e 20 70 43 61 6e 64 69 64 61 74 65 3b 0a  urn pCandidate;.
46a0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
46b0: 4e 6f 20 6d 61 74 63 68 20 77 61 73 20 66 6f 75  No match was fou
46c0: 6e 64 2e 20 20 57 65 20 77 69 6c 6c 20 6d 61 6b  nd.  We will mak
46d0: 65 20 61 20 6e 65 77 20 66 69 6c 65 20 49 44 20  e a new file ID 
46e0: 2a 2f 0a 20 20 70 4e 65 77 2d 3e 6e 52 65 66 20  */.  pNew->nRef 
46f0: 3d 20 31 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4e 61  = 1;.  pNew->nNa
4700: 6d 65 20 3d 20 6e 3b 0a 20 20 70 4e 65 77 2d 3e  me = n;.  pNew->
4710: 70 4e 65 78 74 20 3d 20 76 78 77 6f 72 6b 73 46  pNext = vxworksF
4720: 69 6c 65 4c 69 73 74 3b 0a 20 20 76 78 77 6f 72  ileList;.  vxwor
4730: 6b 73 46 69 6c 65 4c 69 73 74 20 3d 20 70 4e 65  ksFileList = pNe
4740: 77 3b 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75  w;.  unixLeaveMu
4750: 74 65 78 28 29 3b 0a 20 20 72 65 74 75 72 6e 20  tex();.  return 
4760: 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  pNew;.}../*.** D
4770: 65 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66  ecrement the ref
4780: 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20  erence count on 
4790: 61 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  a vxworksFileId 
47a0: 6f 62 6a 65 63 74 2e 20 20 46 72 65 65 0a 2a 2a  object.  Free.**
47b0: 20 74 68 65 20 6f 62 6a 65 63 74 20 77 68 65 6e   the object when
47c0: 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63   the reference c
47d0: 6f 75 6e 74 20 72 65 61 63 68 65 73 20 7a 65 72  ount reaches zer
47e0: 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  o..*/.static voi
47f0: 64 20 76 78 77 6f 72 6b 73 52 65 6c 65 61 73 65  d vxworksRelease
4800: 46 69 6c 65 49 64 28 73 74 72 75 63 74 20 76 78  FileId(struct vx
4810: 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 49 64  worksFileId *pId
4820: 29 7b 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75  ){.  unixEnterMu
4830: 74 65 78 28 29 3b 0a 20 20 61 73 73 65 72 74 28  tex();.  assert(
4840: 20 70 49 64 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a   pId->nRef>0 );.
4850: 20 20 70 49 64 2d 3e 6e 52 65 66 2d 2d 3b 0a 20    pId->nRef--;. 
4860: 20 69 66 28 20 70 49 64 2d 3e 6e 52 65 66 3d 3d   if( pId->nRef==
4870: 30 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  0 ){.    struct 
4880: 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 2a  vxworksFileId **
4890: 70 70 3b 0a 20 20 20 20 66 6f 72 28 70 70 3d 26  pp;.    for(pp=&
48a0: 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74 3b  vxworksFileList;
48b0: 20 2a 70 70 20 26 26 20 2a 70 70 21 3d 70 49 64   *pp && *pp!=pId
48c0: 3b 20 70 70 20 3d 20 26 28 28 2a 70 70 29 2d 3e  ; pp = &((*pp)->
48d0: 70 4e 65 78 74 29 29 7b 7d 0a 20 20 20 20 61 73  pNext)){}.    as
48e0: 73 65 72 74 28 20 2a 70 70 3d 3d 70 49 64 20 29  sert( *pp==pId )
48f0: 3b 0a 20 20 20 20 2a 70 70 20 3d 20 70 49 64 2d  ;.    *pp = pId-
4900: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 73 71 6c 69  >pNext;.    sqli
4910: 74 65 33 5f 66 72 65 65 28 70 49 64 29 3b 0a 20  te3_free(pId);. 
4920: 20 7d 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75   }.  unixLeaveMu
4930: 74 65 78 28 29 3b 0a 7d 0a 23 65 6e 64 69 66 20  tex();.}.#endif 
4940: 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f  /* OS_VXWORKS */
4950: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
4960: 2a 20 45 6e 64 20 6f 66 20 55 6e 69 71 75 65 20  * End of Unique 
4970: 46 69 6c 65 20 49 44 20 55 74 69 6c 69 74 79 20  File ID Utility 
4980: 55 73 65 64 20 42 79 20 56 78 57 6f 72 6b 73 20  Used By VxWorks 
4990: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
49a0: 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
49b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
49c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
49d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
49e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
49f0: 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .../************
4a00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4a10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4a20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4a30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4a40: 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
4a50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 50  ************** P
4a60: 6f 73 69 78 20 41 64 76 69 73 6f 72 79 20 4c 6f  osix Advisory Lo
4a70: 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  cking **********
4a80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4a90: 2a 2a 0a 2a 2a 0a 2a 2a 20 50 4f 53 49 58 20 61  **.**.** POSIX a
4aa0: 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20 61 72  dvisory locks ar
4ab0: 65 20 62 72 6f 6b 65 6e 20 62 79 20 64 65 73 69  e broken by desi
4ac0: 67 6e 2e 20 20 41 4e 53 49 20 53 54 44 20 31 30  gn.  ANSI STD 10
4ad0: 30 33 2e 31 20 28 31 39 39 36 29 0a 2a 2a 20 73  03.1 (1996).** s
4ae0: 65 63 74 69 6f 6e 20 36 2e 35 2e 32 2e 32 20 6c  ection 6.5.2.2 l
4af0: 69 6e 65 73 20 34 38 33 20 74 68 72 6f 75 67 68  ines 483 through
4b00: 20 34 39 30 20 73 70 65 63 69 66 79 20 74 68 61   490 specify tha
4b10: 74 20 77 68 65 6e 20 61 20 70 72 6f 63 65 73 73  t when a process
4b20: 0a 2a 2a 20 73 65 74 73 20 6f 72 20 63 6c 65 61  .** sets or clea
4b30: 72 73 20 61 20 6c 6f 63 6b 2c 20 74 68 61 74 20  rs a lock, that 
4b40: 6f 70 65 72 61 74 69 6f 6e 20 6f 76 65 72 72 69  operation overri
4b50: 64 65 73 20 61 6e 79 20 70 72 69 6f 72 20 6c 6f  des any prior lo
4b60: 63 6b 73 20 73 65 74 0a 2a 2a 20 62 79 20 74 68  cks set.** by th
4b70: 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 2e 20  e same process. 
4b80: 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 70   It does not exp
4b90: 6c 69 63 69 74 6c 79 20 73 61 79 20 73 6f 2c 20  licitly say so, 
4ba0: 62 75 74 20 74 68 69 73 20 69 6d 70 6c 69 65 73  but this implies
4bb0: 0a 2a 2a 20 74 68 61 74 20 69 74 20 6f 76 65 72  .** that it over
4bc0: 72 69 64 65 73 20 6c 6f 63 6b 73 20 73 65 74 20  rides locks set 
4bd0: 62 79 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63  by the same proc
4be0: 65 73 73 20 75 73 69 6e 67 20 61 20 64 69 66 66  ess using a diff
4bf0: 65 72 65 6e 74 0a 2a 2a 20 66 69 6c 65 20 64 65  erent.** file de
4c00: 73 63 72 69 70 74 6f 72 2e 20 20 43 6f 6e 73 69  scriptor.  Consi
4c10: 64 65 72 20 74 68 69 73 20 74 65 73 74 20 63 61  der this test ca
4c20: 73 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  se:.**.**       
4c30: 69 6e 74 20 66 64 31 20 3d 20 6f 70 65 6e 28 22  int fd1 = open("
4c40: 2e 2f 66 69 6c 65 31 22 2c 20 4f 5f 52 44 57 52  ./file1", O_RDWR
4c50: 7c 4f 5f 43 52 45 41 54 2c 20 30 36 34 34 29 3b  |O_CREAT, 0644);
4c60: 0a 2a 2a 20 20 20 20 20 20 20 69 6e 74 20 66 64  .**       int fd
4c70: 32 20 3d 20 6f 70 65 6e 28 22 2e 2f 66 69 6c 65  2 = open("./file
4c80: 32 22 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43 52 45  2", O_RDWR|O_CRE
4c90: 41 54 2c 20 30 36 34 34 29 3b 0a 2a 2a 0a 2a 2a  AT, 0644);.**.**
4ca0: 20 53 75 70 70 6f 73 65 20 2e 2f 66 69 6c 65 31   Suppose ./file1
4cb0: 20 61 6e 64 20 2e 2f 66 69 6c 65 32 20 61 72 65   and ./file2 are
4cc0: 20 72 65 61 6c 6c 79 20 74 68 65 20 73 61 6d 65   really the same
4cd0: 20 66 69 6c 65 20 28 62 65 63 61 75 73 65 0a 2a   file (because.*
4ce0: 2a 20 6f 6e 65 20 69 73 20 61 20 68 61 72 64 20  * one is a hard 
4cf0: 6f 72 20 73 79 6d 62 6f 6c 69 63 20 6c 69 6e 6b  or symbolic link
4d00: 20 74 6f 20 74 68 65 20 6f 74 68 65 72 29 20 74   to the other) t
4d10: 68 65 6e 20 69 66 20 79 6f 75 20 73 65 74 0a 2a  hen if you set.*
4d20: 2a 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  * an exclusive l
4d30: 6f 63 6b 20 6f 6e 20 66 64 31 2c 20 74 68 65 6e  ock on fd1, then
4d40: 20 74 72 79 20 74 6f 20 67 65 74 20 61 6e 20 65   try to get an e
4d50: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 0a 2a 2a  xclusive lock.**
4d60: 20 6f 6e 20 66 64 32 2c 20 69 74 20 77 6f 72 6b   on fd2, it work
4d70: 73 2e 20 20 49 20 77 6f 75 6c 64 20 68 61 76 65  s.  I would have
4d80: 20 65 78 70 65 63 74 65 64 20 74 68 65 20 73 65   expected the se
4d90: 63 6f 6e 64 20 6c 6f 63 6b 20 74 6f 0a 2a 2a 20  cond lock to.** 
4da0: 66 61 69 6c 20 73 69 6e 63 65 20 74 68 65 72 65  fail since there
4db0: 20 77 61 73 20 61 6c 72 65 61 64 79 20 61 20 6c   was already a l
4dc0: 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 20  ock on the file 
4dd0: 64 75 65 20 74 6f 20 66 64 31 2e 0a 2a 2a 20 42  due to fd1..** B
4de0: 75 74 20 6e 6f 74 20 73 6f 2e 20 20 53 69 6e 63  ut not so.  Sinc
4df0: 65 20 62 6f 74 68 20 6c 6f 63 6b 73 20 63 61 6d  e both locks cam
4e00: 65 20 66 72 6f 6d 20 74 68 65 20 73 61 6d 65 20  e from the same 
4e10: 70 72 6f 63 65 73 73 2c 20 74 68 65 0a 2a 2a 20  process, the.** 
4e20: 73 65 63 6f 6e 64 20 6f 76 65 72 72 69 64 65 73  second overrides
4e30: 20 74 68 65 20 66 69 72 73 74 2c 20 65 76 65 6e   the first, even
4e40: 20 74 68 6f 75 67 68 20 74 68 65 79 20 77 65 72   though they wer
4e50: 65 20 6f 6e 20 64 69 66 66 65 72 65 6e 74 0a 2a  e on different.*
4e60: 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * file descripto
4e70: 72 73 20 6f 70 65 6e 65 64 20 6f 6e 20 64 69 66  rs opened on dif
4e80: 66 65 72 65 6e 74 20 66 69 6c 65 20 6e 61 6d 65  ferent file name
4e90: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d 65  s..**.** This me
4ea0: 61 6e 73 20 74 68 61 74 20 77 65 20 63 61 6e 6e  ans that we cann
4eb0: 6f 74 20 75 73 65 20 50 4f 53 49 58 20 6c 6f 63  ot use POSIX loc
4ec0: 6b 73 20 74 6f 20 73 79 6e 63 68 72 6f 6e 69 7a  ks to synchroniz
4ed0: 65 20 66 69 6c 65 20 61 63 63 65 73 73 0a 2a 2a  e file access.**
4ee0: 20 61 6d 6f 6e 67 20 63 6f 6d 70 65 74 69 6e 67   among competing
4ef0: 20 74 68 72 65 61 64 73 20 6f 66 20 74 68 65 20   threads of the 
4f00: 73 61 6d 65 20 70 72 6f 63 65 73 73 2e 20 20 50  same process.  P
4f10: 4f 53 49 58 20 6c 6f 63 6b 73 20 77 69 6c 6c 20  OSIX locks will 
4f20: 77 6f 72 6b 20 66 69 6e 65 0a 2a 2a 20 74 6f 20  work fine.** to 
4f30: 73 79 6e 63 68 72 6f 6e 69 7a 65 20 61 63 63 65  synchronize acce
4f40: 73 73 20 66 6f 72 20 74 68 72 65 61 64 73 20 69  ss for threads i
4f50: 6e 20 73 65 70 61 72 61 74 65 20 70 72 6f 63 65  n separate proce
4f60: 73 73 65 73 2c 20 62 75 74 20 6e 6f 74 0a 2a 2a  sses, but not.**
4f70: 20 74 68 72 65 61 64 73 20 77 69 74 68 69 6e 20   threads within 
4f80: 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73  the same process
4f90: 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 77 6f 72 6b 20  ..**.** To work 
4fa0: 61 72 6f 75 6e 64 20 74 68 65 20 70 72 6f 62 6c  around the probl
4fb0: 65 6d 2c 20 53 51 4c 69 74 65 20 68 61 73 20 74  em, SQLite has t
4fc0: 6f 20 6d 61 6e 61 67 65 20 66 69 6c 65 20 6c 6f  o manage file lo
4fd0: 63 6b 73 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a  cks internally.*
4fe0: 2a 20 6f 6e 20 69 74 73 20 6f 77 6e 2e 20 20 57  * on its own.  W
4ff0: 68 65 6e 65 76 65 72 20 61 20 6e 65 77 20 64 61  henever a new da
5000: 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e 65 64  tabase is opened
5010: 2c 20 77 65 20 68 61 76 65 20 74 6f 20 66 69 6e  , we have to fin
5020: 64 20 74 68 65 0a 2a 2a 20 73 70 65 63 69 66 69  d the.** specifi
5030: 63 20 69 6e 6f 64 65 20 6f 66 20 74 68 65 20 64  c inode of the d
5040: 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 74 68  atabase file (th
5050: 65 20 69 6e 6f 64 65 20 69 73 20 64 65 74 65 72  e inode is deter
5060: 6d 69 6e 65 64 20 62 79 20 74 68 65 0a 2a 2a 20  mined by the.** 
5070: 73 74 5f 64 65 76 20 61 6e 64 20 73 74 5f 69 6e  st_dev and st_in
5080: 6f 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20  o fields of the 
5090: 73 74 61 74 20 73 74 72 75 63 74 75 72 65 20 74  stat structure t
50a0: 68 61 74 20 66 73 74 61 74 28 29 20 66 69 6c 6c  hat fstat() fill
50b0: 73 20 69 6e 29 0a 2a 2a 20 61 6e 64 20 63 68 65  s in).** and che
50c0: 63 6b 20 66 6f 72 20 6c 6f 63 6b 73 20 61 6c 72  ck for locks alr
50d0: 65 61 64 79 20 65 78 69 73 74 69 6e 67 20 6f 6e  eady existing on
50e0: 20 74 68 61 74 20 69 6e 6f 64 65 2e 20 20 57 68   that inode.  Wh
50f0: 65 6e 20 6c 6f 63 6b 73 20 61 72 65 0a 2a 2a 20  en locks are.** 
5100: 63 72 65 61 74 65 64 20 6f 72 20 72 65 6d 6f 76  created or remov
5110: 65 64 2c 20 77 65 20 68 61 76 65 20 74 6f 20 6c  ed, we have to l
5120: 6f 6f 6b 20 61 74 20 6f 75 72 20 6f 77 6e 20 69  ook at our own i
5130: 6e 74 65 72 6e 61 6c 20 72 65 63 6f 72 64 20 6f  nternal record o
5140: 66 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 73 20 74  f the.** locks t
5150: 6f 20 73 65 65 20 69 66 20 61 6e 6f 74 68 65 72  o see if another
5160: 20 74 68 72 65 61 64 20 68 61 73 20 70 72 65 76   thread has prev
5170: 69 6f 75 73 6c 79 20 73 65 74 20 61 20 6c 6f 63  iously set a loc
5180: 6b 20 6f 6e 20 74 68 61 74 20 73 61 6d 65 0a 2a  k on that same.*
5190: 2a 20 69 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 28  * inode..**.** (
51a0: 41 73 69 64 65 3a 20 54 68 65 20 75 73 65 20 6f  Aside: The use o
51b0: 66 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72 73 20  f inode numbers 
51c0: 61 73 20 75 6e 69 71 75 65 20 49 44 73 20 64 6f  as unique IDs do
51d0: 65 73 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 56  es not work on V
51e0: 78 57 6f 72 6b 73 2e 0a 2a 2a 20 46 6f 72 20 56  xWorks..** For V
51f0: 78 57 6f 72 6b 73 2c 20 77 65 20 68 61 76 65 20  xWorks, we have 
5200: 74 6f 20 75 73 65 20 74 68 65 20 61 6c 74 65 72  to use the alter
5210: 6e 61 74 69 76 65 20 75 6e 69 71 75 65 20 49 44  native unique ID
5220: 20 73 79 73 74 65 6d 20 62 61 73 65 64 20 6f 6e   system based on
5230: 0a 2a 2a 20 63 61 6e 6f 6e 69 63 61 6c 20 66 69  .** canonical fi
5240: 6c 65 6e 61 6d 65 20 61 6e 64 20 69 6d 70 6c 65  lename and imple
5250: 6d 65 6e 74 65 64 20 69 6e 20 74 68 65 20 70 72  mented in the pr
5260: 65 76 69 6f 75 73 20 64 69 76 69 73 69 6f 6e 2e  evious division.
5270: 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69  ).**.** The sqli
5280: 74 65 33 5f 66 69 6c 65 20 73 74 72 75 63 74 75  te3_file structu
5290: 72 65 20 66 6f 72 20 50 4f 53 49 58 20 69 73 20  re for POSIX is 
52a0: 6e 6f 20 6c 6f 6e 67 65 72 20 6a 75 73 74 20 61  no longer just a
52b0: 6e 20 69 6e 74 65 67 65 72 20 66 69 6c 65 0a 2a  n integer file.*
52c0: 2a 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 49  * descriptor.  I
52d0: 74 20 69 73 20 6e 6f 77 20 61 20 73 74 72 75 63  t is now a struc
52e0: 74 75 72 65 20 74 68 61 74 20 68 6f 6c 64 73 20  ture that holds 
52f0: 74 68 65 20 69 6e 74 65 67 65 72 20 66 69 6c 65  the integer file
5300: 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20 61  .** descriptor a
5310: 6e 64 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  nd a pointer to 
5320: 61 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  a structure that
5330: 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 69   describes the i
5340: 6e 74 65 72 6e 61 6c 0a 2a 2a 20 6c 6f 63 6b 73  nternal.** locks
5350: 20 6f 6e 20 74 68 65 20 63 6f 72 72 65 73 70 6f   on the correspo
5360: 6e 64 69 6e 67 20 69 6e 6f 64 65 2e 20 20 54 68  nding inode.  Th
5370: 65 72 65 20 69 73 20 6f 6e 65 20 6c 6f 63 6b 69  ere is one locki
5380: 6e 67 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20  ng structure.** 
5390: 70 65 72 20 69 6e 6f 64 65 2c 20 73 6f 20 69 66  per inode, so if
53a0: 20 74 68 65 20 73 61 6d 65 20 69 6e 6f 64 65 20   the same inode 
53b0: 69 73 20 6f 70 65 6e 65 64 20 74 77 69 63 65 2c  is opened twice,
53c0: 20 62 6f 74 68 20 75 6e 69 78 46 69 6c 65 20 73   both unixFile s
53d0: 74 72 75 63 74 75 72 65 73 0a 2a 2a 20 70 6f 69  tructures.** poi
53e0: 6e 74 20 74 6f 20 74 68 65 20 73 61 6d 65 20 6c  nt to the same l
53f0: 6f 63 6b 69 6e 67 20 73 74 72 75 63 74 75 72 65  ocking structure
5400: 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 73  .  The locking s
5410: 74 72 75 63 74 75 72 65 20 6b 65 65 70 73 0a 2a  tructure keeps.*
5420: 2a 20 61 20 72 65 66 65 72 65 6e 63 65 20 63 6f  * a reference co
5430: 75 6e 74 20 28 73 6f 20 77 65 20 77 69 6c 6c 20  unt (so we will 
5440: 6b 6e 6f 77 20 77 68 65 6e 20 74 6f 20 64 65 6c  know when to del
5450: 65 74 65 20 69 74 29 20 61 6e 64 20 61 20 22 63  ete it) and a "c
5460: 6e 74 22 0a 2a 2a 20 66 69 65 6c 64 20 74 68 61  nt".** field tha
5470: 74 20 74 65 6c 6c 73 20 75 73 20 69 74 73 20 69  t tells us its i
5480: 6e 74 65 72 6e 61 6c 20 6c 6f 63 6b 20 73 74 61  nternal lock sta
5490: 74 75 73 2e 20 20 63 6e 74 3d 3d 30 20 6d 65 61  tus.  cnt==0 mea
54a0: 6e 73 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 69  ns the.** file i
54b0: 73 20 75 6e 6c 6f 63 6b 65 64 2e 20 20 63 6e 74  s unlocked.  cnt
54c0: 3d 3d 2d 31 20 6d 65 61 6e 73 20 74 68 65 20 66  ==-1 means the f
54d0: 69 6c 65 20 68 61 73 20 61 6e 20 65 78 63 6c 75  ile has an exclu
54e0: 73 69 76 65 20 6c 6f 63 6b 2e 0a 2a 2a 20 63 6e  sive lock..** cn
54f0: 74 3e 30 20 6d 65 61 6e 73 20 74 68 65 72 65 20  t>0 means there 
5500: 61 72 65 20 63 6e 74 20 73 68 61 72 65 64 20 6c  are cnt shared l
5510: 6f 63 6b 73 20 6f 6e 20 74 68 65 20 66 69 6c 65  ocks on the file
5520: 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 61 74 74 65  ..**.** Any atte
5530: 6d 70 74 20 74 6f 20 6c 6f 63 6b 20 6f 72 20 75  mpt to lock or u
5540: 6e 6c 6f 63 6b 20 61 20 66 69 6c 65 20 66 69 72  nlock a file fir
5550: 73 74 20 63 68 65 63 6b 73 20 74 68 65 20 6c 6f  st checks the lo
5560: 63 6b 69 6e 67 0a 2a 2a 20 73 74 72 75 63 74 75  cking.** structu
5570: 72 65 2e 20 20 54 68 65 20 66 63 6e 74 6c 28 29  re.  The fcntl()
5580: 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 69 73 20   system call is 
5590: 6f 6e 6c 79 20 69 6e 76 6f 6b 65 64 20 74 6f 20  only invoked to 
55a0: 73 65 74 20 61 20 0a 2a 2a 20 50 4f 53 49 58 20  set a .** POSIX 
55b0: 6c 6f 63 6b 20 69 66 20 74 68 65 20 69 6e 74 65  lock if the inte
55c0: 72 6e 61 6c 20 6c 6f 63 6b 20 73 74 72 75 63 74  rnal lock struct
55d0: 75 72 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  ure transitions 
55e0: 62 65 74 77 65 65 6e 0a 2a 2a 20 61 20 6c 6f 63  between.** a loc
55f0: 6b 65 64 20 61 6e 64 20 61 6e 20 75 6e 6c 6f 63  ked and an unloc
5600: 6b 65 64 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a  ked state..**.**
5610: 20 42 75 74 20 77 61 69 74 3a 20 20 74 68 65 72   But wait:  ther
5620: 65 20 61 72 65 20 79 65 74 20 6d 6f 72 65 20 70  e are yet more p
5630: 72 6f 62 6c 65 6d 73 20 77 69 74 68 20 50 4f 53  roblems with POS
5640: 49 58 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b  IX advisory lock
5650: 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 79 6f 75 20  s..**.** If you 
5660: 63 6c 6f 73 65 20 61 20 66 69 6c 65 20 64 65 73  close a file des
5670: 63 72 69 70 74 6f 72 20 74 68 61 74 20 70 6f 69  criptor that poi
5680: 6e 74 73 20 74 6f 20 61 20 66 69 6c 65 20 74 68  nts to a file th
5690: 61 74 20 68 61 73 20 6c 6f 63 6b 73 2c 0a 2a 2a  at has locks,.**
56a0: 20 61 6c 6c 20 6c 6f 63 6b 73 20 6f 6e 20 74 68   all locks on th
56b0: 61 74 20 66 69 6c 65 20 74 68 61 74 20 61 72 65  at file that are
56c0: 20 6f 77 6e 65 64 20 62 79 20 74 68 65 20 63 75   owned by the cu
56d0: 72 72 65 6e 74 20 70 72 6f 63 65 73 73 20 61 72  rrent process ar
56e0: 65 0a 2a 2a 20 72 65 6c 65 61 73 65 64 2e 20 20  e.** released.  
56f0: 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74  To work around t
5700: 68 69 73 20 70 72 6f 62 6c 65 6d 2c 20 65 61 63  his problem, eac
5710: 68 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20  h unixInodeInfo 
5720: 6f 62 6a 65 63 74 0a 2a 2a 20 6d 61 69 6e 74 61  object.** mainta
5730: 69 6e 73 20 61 20 63 6f 75 6e 74 20 6f 66 20 74  ins a count of t
5740: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 65 6e  he number of pen
5750: 64 69 6e 67 20 6c 6f 63 6b 73 20 6f 6e 20 74 68  ding locks on th
5760: 61 20 69 6e 6f 64 65 2e 0a 2a 2a 20 57 68 65 6e  a inode..** When
5770: 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d   an attempt is m
5780: 61 64 65 20 74 6f 20 63 6c 6f 73 65 20 61 6e 20  ade to close an 
5790: 75 6e 69 78 46 69 6c 65 2c 20 69 66 20 74 68 65  unixFile, if the
57a0: 72 65 20 61 72 65 0a 2a 2a 20 6f 74 68 65 72 20  re are.** other 
57b0: 75 6e 69 78 46 69 6c 65 20 6f 70 65 6e 20 6f 6e  unixFile open on
57c0: 20 74 68 65 20 73 61 6d 65 20 69 6e 6f 64 65 20   the same inode 
57d0: 74 68 61 74 20 61 72 65 20 68 6f 6c 64 69 6e 67  that are holding
57e0: 20 6c 6f 63 6b 73 2c 20 74 68 65 20 63 61 6c 6c   locks, the call
57f0: 0a 2a 2a 20 74 6f 20 63 6c 6f 73 65 28 29 20 74  .** to close() t
5800: 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
5810: 6f 72 20 69 73 20 64 65 66 65 72 72 65 64 20 75  or is deferred u
5820: 6e 74 69 6c 20 61 6c 6c 20 6f 66 20 74 68 65 20  ntil all of the 
5830: 6c 6f 63 6b 73 20 63 6c 65 61 72 2e 0a 2a 2a 20  locks clear..** 
5840: 54 68 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  The unixInodeInf
5850: 6f 20 73 74 72 75 63 74 75 72 65 20 6b 65 65 70  o structure keep
5860: 73 20 61 20 6c 69 73 74 20 6f 66 20 66 69 6c 65  s a list of file
5870: 20 64 65 73 63 72 69 70 74 6f 72 73 20 74 68 61   descriptors tha
5880: 74 20 6e 65 65 64 20 74 6f 0a 2a 2a 20 62 65 20  t need to.** be 
5890: 63 6c 6f 73 65 64 20 61 6e 64 20 74 68 61 74 20  closed and that 
58a0: 6c 69 73 74 20 69 73 20 77 61 6c 6b 65 64 20 28  list is walked (
58b0: 61 6e 64 20 63 6c 65 61 72 65 64 29 20 77 68 65  and cleared) whe
58c0: 6e 20 74 68 65 20 6c 61 73 74 20 6c 6f 63 6b 0a  n the last lock.
58d0: 2a 2a 20 63 6c 65 61 72 73 2e 0a 2a 2a 0a 2a 2a  ** clears..**.**
58e0: 20 59 65 74 20 61 6e 6f 74 68 65 72 20 70 72 6f   Yet another pro
58f0: 62 6c 65 6d 3a 20 20 4c 69 6e 75 78 54 68 72 65  blem:  LinuxThre
5900: 61 64 73 20 64 6f 20 6e 6f 74 20 70 6c 61 79 20  ads do not play 
5910: 77 65 6c 6c 20 77 69 74 68 20 70 6f 73 69 78 20  well with posix 
5920: 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 4d 61 6e  locks..**.** Man
5930: 79 20 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 73  y older versions
5940: 20 6f 66 20 6c 69 6e 75 78 20 75 73 65 20 74 68   of linux use th
5950: 65 20 4c 69 6e 75 78 54 68 72 65 61 64 73 20 6c  e LinuxThreads l
5960: 69 62 72 61 72 79 20 77 68 69 63 68 20 69 73 0a  ibrary which is.
5970: 2a 2a 20 6e 6f 74 20 70 6f 73 69 78 20 63 6f 6d  ** not posix com
5980: 70 6c 69 61 6e 74 2e 20 20 55 6e 64 65 72 20 4c  pliant.  Under L
5990: 69 6e 75 78 54 68 72 65 61 64 73 2c 20 61 20 6c  inuxThreads, a l
59a0: 6f 63 6b 20 63 72 65 61 74 65 64 20 62 79 20 74  ock created by t
59b0: 68 72 65 61 64 0a 2a 2a 20 41 20 63 61 6e 6e 6f  hread.** A canno
59c0: 74 20 62 65 20 6d 6f 64 69 66 69 65 64 20 6f 72  t be modified or
59d0: 20 6f 76 65 72 72 69 64 64 65 6e 20 62 79 20 61   overridden by a
59e0: 20 64 69 66 66 65 72 65 6e 74 20 74 68 72 65 61   different threa
59f0: 64 20 42 2e 0a 2a 2a 20 4f 6e 6c 79 20 74 68 72  d B..** Only thr
5a00: 65 61 64 20 41 20 63 61 6e 20 6d 6f 64 69 66 79  ead A can modify
5a10: 20 74 68 65 20 6c 6f 63 6b 2e 20 20 4c 6f 63 6b   the lock.  Lock
5a20: 69 6e 67 20 62 65 68 61 76 69 6f 72 20 69 73 20  ing behavior is 
5a30: 63 6f 72 72 65 63 74 0a 2a 2a 20 69 66 20 74 68  correct.** if th
5a40: 65 20 61 70 70 6c 69 61 74 69 6f 6e 20 75 73 65  e appliation use
5a50: 73 20 74 68 65 20 6e 65 77 65 72 20 4e 61 74 69  s the newer Nati
5a60: 76 65 20 50 6f 73 69 78 20 54 68 72 65 61 64 20  ve Posix Thread 
5a70: 4c 69 62 72 61 72 79 20 28 4e 50 54 4c 29 0a 2a  Library (NPTL).*
5a80: 2a 20 6f 6e 20 6c 69 6e 75 78 20 2d 20 77 69 74  * on linux - wit
5a90: 68 20 4e 50 54 4c 20 61 20 6c 6f 63 6b 20 63 72  h NPTL a lock cr
5aa0: 65 61 74 65 64 20 62 79 20 74 68 72 65 61 64 20  eated by thread 
5ab0: 41 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20 6c  A can override l
5ac0: 6f 63 6b 73 0a 2a 2a 20 69 6e 20 74 68 72 65 61  ocks.** in threa
5ad0: 64 20 42 2e 20 20 42 75 74 20 74 68 65 72 65 20  d B.  But there 
5ae0: 69 73 20 6e 6f 20 77 61 79 20 74 6f 20 6b 6e 6f  is no way to kno
5af0: 77 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  w at compile-tim
5b00: 65 20 77 68 69 63 68 0a 2a 2a 20 74 68 72 65 61  e which.** threa
5b10: 64 69 6e 67 20 6c 69 62 72 61 72 79 20 69 73 20  ding library is 
5b20: 62 65 69 6e 67 20 75 73 65 64 2e 20 20 53 6f 20  being used.  So 
5b30: 74 68 65 72 65 20 69 73 20 6e 6f 20 77 61 79 20  there is no way 
5b40: 74 6f 20 6b 6e 6f 77 20 61 74 0a 2a 2a 20 63 6f  to know at.** co
5b50: 6d 70 69 6c 65 2d 74 69 6d 65 20 77 68 65 74 68  mpile-time wheth
5b60: 65 72 20 6f 72 20 6e 6f 74 20 74 68 72 65 61 64  er or not thread
5b70: 20 41 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20   A can override 
5b80: 6c 6f 63 6b 73 20 6f 6e 20 74 68 72 65 61 64 20  locks on thread 
5b90: 42 2e 0a 2a 2a 20 4f 6e 65 20 68 61 73 20 74 6f  B..** One has to
5ba0: 20 64 6f 20 61 20 72 75 6e 2d 74 69 6d 65 20 63   do a run-time c
5bb0: 68 65 63 6b 20 74 6f 20 64 69 73 63 6f 76 65 72  heck to discover
5bc0: 20 74 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66   the behavior of
5bd0: 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20   the.** current 
5be0: 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 53  process..**.** S
5bf0: 51 4c 69 74 65 20 75 73 65 64 20 74 6f 20 73 75  QLite used to su
5c00: 70 70 6f 72 74 20 4c 69 6e 75 78 54 68 72 65 61  pport LinuxThrea
5c10: 64 73 2e 20 20 42 75 74 20 73 75 70 70 6f 72 74  ds.  But support
5c20: 20 66 6f 72 20 4c 69 6e 75 78 54 68 72 65 61 64   for LinuxThread
5c30: 73 0a 2a 2a 20 77 61 73 20 64 72 6f 70 70 65 64  s.** was dropped
5c40: 20 62 65 67 69 6e 6e 69 6e 67 20 77 69 74 68 20   beginning with 
5c50: 76 65 72 73 69 6f 6e 20 33 2e 37 2e 30 2e 20 20  version 3.7.0.  
5c60: 53 51 4c 69 74 65 20 77 69 6c 6c 20 73 74 69 6c  SQLite will stil
5c70: 6c 20 77 6f 72 6b 20 77 69 74 68 0a 2a 2a 20 4c  l work with.** L
5c80: 69 6e 75 78 54 68 72 65 61 64 73 20 70 72 6f 76  inuxThreads prov
5c90: 69 64 65 64 20 74 68 61 74 20 28 31 29 20 74 68  ided that (1) th
5ca0: 65 72 65 20 69 73 20 6e 6f 20 6d 6f 72 65 20 74  ere is no more t
5cb0: 68 61 6e 20 6f 6e 65 20 63 6f 6e 6e 65 63 74 69  han one connecti
5cc0: 6f 6e 20 0a 2a 2a 20 70 65 72 20 64 61 74 61 62  on .** per datab
5cd0: 61 73 65 20 66 69 6c 65 20 69 6e 20 74 68 65 20  ase file in the 
5ce0: 73 61 6d 65 20 70 72 6f 63 65 73 73 20 61 6e 64  same process and
5cf0: 20 28 32 29 20 64 61 74 61 62 61 73 65 20 63 6f   (2) database co
5d00: 6e 6e 65 63 74 69 6f 6e 73 0a 2a 2a 20 64 6f 20  nnections.** do 
5d10: 6e 6f 74 20 6d 6f 76 65 20 61 63 72 6f 73 73 20  not move across 
5d20: 74 68 72 65 61 64 73 2e 0a 2a 2f 0a 0a 2f 2a 0a  threads..*/../*.
5d30: 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f  ** An instance o
5d40: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
5d50: 73 74 72 75 63 74 75 72 65 20 73 65 72 76 65 73  structure serves
5d60: 20 61 73 20 74 68 65 20 6b 65 79 20 75 73 65 64   as the key used
5d70: 0a 2a 2a 20 74 6f 20 6c 6f 63 61 74 65 20 61 20  .** to locate a 
5d80: 70 61 72 74 69 63 75 6c 61 72 20 75 6e 69 78 49  particular unixI
5d90: 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 2e  nodeInfo object.
5da0: 0a 2a 2f 0a 73 74 72 75 63 74 20 75 6e 69 78 46  .*/.struct unixF
5db0: 69 6c 65 49 64 20 7b 0a 20 20 64 65 76 5f 74 20  ileId {.  dev_t 
5dc0: 64 65 76 3b 20 20 20 20 20 20 20 20 20 20 20 20  dev;            
5dd0: 20 20 20 20 20 20 2f 2a 20 44 65 76 69 63 65 20        /* Device 
5de0: 6e 75 6d 62 65 72 20 2a 2f 0a 23 69 66 20 4f 53  number */.#if OS
5df0: 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74 72 75 63  _VXWORKS.  struc
5e00: 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  t vxworksFileId 
5e10: 2a 70 49 64 3b 20 20 2f 2a 20 55 6e 69 71 75 65  *pId;  /* Unique
5e20: 20 66 69 6c 65 20 49 44 20 66 6f 72 20 76 78 77   file ID for vxw
5e30: 6f 72 6b 73 2e 20 2a 2f 0a 23 65 6c 73 65 0a 20  orks. */.#else. 
5e40: 20 69 6e 6f 5f 74 20 69 6e 6f 3b 20 20 20 20 20   ino_t ino;     
5e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5e60: 49 6e 6f 64 65 20 6e 75 6d 62 65 72 20 2a 2f 0a  Inode number */.
5e70: 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  #endif.};../*.**
5e80: 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   An instance of 
5e90: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
5ea0: 72 75 63 74 75 72 65 20 69 73 20 61 6c 6c 6f 63  ructure is alloc
5eb0: 61 74 65 64 20 66 6f 72 20 65 61 63 68 20 6f 70  ated for each op
5ec0: 65 6e 0a 2a 2a 20 69 6e 6f 64 65 2e 20 20 4f 72  en.** inode.  Or
5ed0: 2c 20 6f 6e 20 4c 69 6e 75 78 54 68 72 65 61 64  , on LinuxThread
5ee0: 73 2c 20 74 68 65 72 65 20 69 73 20 6f 6e 65 20  s, there is one 
5ef0: 6f 66 20 74 68 65 73 65 20 73 74 72 75 63 74 75  of these structu
5f00: 72 65 73 20 66 6f 72 0a 2a 2a 20 65 61 63 68 20  res for.** each 
5f10: 69 6e 6f 64 65 20 6f 70 65 6e 65 64 20 62 79 20  inode opened by 
5f20: 65 61 63 68 20 74 68 72 65 61 64 2e 0a 2a 2a 0a  each thread..**.
5f30: 2a 2a 20 41 20 73 69 6e 67 6c 65 20 69 6e 6f 64  ** A single inod
5f40: 65 20 63 61 6e 20 68 61 76 65 20 6d 75 6c 74 69  e can have multi
5f50: 70 6c 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  ple file descrip
5f60: 74 6f 72 73 2c 20 73 6f 20 65 61 63 68 20 75 6e  tors, so each un
5f70: 69 78 46 69 6c 65 0a 2a 2a 20 73 74 72 75 63 74  ixFile.** struct
5f80: 75 72 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70  ure contains a p
5f90: 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e 73  ointer to an ins
5fa0: 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6f 62  tance of this ob
5fb0: 6a 65 63 74 20 61 6e 64 20 74 68 69 73 0a 2a 2a  ject and this.**
5fc0: 20 6f 62 6a 65 63 74 20 6b 65 65 70 73 20 61 20   object keeps a 
5fd0: 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 6e 75 6d  count of the num
5fe0: 62 65 72 20 6f 66 20 75 6e 69 78 46 69 6c 65 20  ber of unixFile 
5ff0: 70 6f 69 6e 74 69 6e 67 20 74 6f 20 69 74 2e 0a  pointing to it..
6000: 2a 2f 0a 73 74 72 75 63 74 20 75 6e 69 78 49 6e  */.struct unixIn
6010: 6f 64 65 49 6e 66 6f 20 7b 0a 20 20 73 74 72 75  odeInfo {.  stru
6020: 63 74 20 75 6e 69 78 46 69 6c 65 49 64 20 66 69  ct unixFileId fi
6030: 6c 65 49 64 3b 20 20 20 20 20 20 20 2f 2a 20 54  leId;       /* T
6040: 68 65 20 6c 6f 6f 6b 75 70 20 6b 65 79 20 2a 2f  he lookup key */
6050: 0a 20 20 69 6e 74 20 6e 53 68 61 72 65 64 3b 20  .  int nShared; 
6060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6070: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
6080: 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 68 65 6c  SHARED locks hel
6090: 64 20 2a 2f 0a 20 20 69 6e 74 20 65 46 69 6c 65  d */.  int eFile
60a0: 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20  Lock;           
60b0: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
60c0: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45   SHARED_LOCK, RE
60d0: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 65 74 63 2e  SERVED_LOCK etc.
60e0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20   */.  int nRef; 
60f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6100: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
6110: 6f 66 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 74  of pointers to t
6120: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f  his structure */
6130: 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a  .  unixShmNode *
6140: 70 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20 20 20  pShmNode;       
6150: 20 20 20 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d     /* Shared mem
6160: 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77  ory associated w
6170: 69 74 68 20 74 68 69 73 20 69 6e 6f 64 65 20 2a  ith this inode *
6180: 2f 0a 20 20 69 6e 74 20 6e 4c 6f 63 6b 3b 20 20  /.  int nLock;  
6190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
61a0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
61b0: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 66 69 6c   outstanding fil
61c0: 65 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 55 6e 69  e locks */.  Uni
61d0: 78 55 6e 75 73 65 64 46 64 20 2a 70 55 6e 75 73  xUnusedFd *pUnus
61e0: 65 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ed;          /* 
61f0: 55 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73 63  Unused file desc
6200: 72 69 70 74 6f 72 73 20 74 6f 20 63 6c 6f 73 65  riptors to close
6210: 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49   */.  unixInodeI
6220: 6e 66 6f 20 2a 70 4e 65 78 74 3b 20 20 20 20 20  nfo *pNext;     
6230: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
6240: 20 61 6c 6c 20 75 6e 69 78 49 6e 6f 64 65 49 6e   all unixInodeIn
6250: 66 6f 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20  fo objects */.  
6260: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70  unixInodeInfo *p
6270: 50 72 65 76 3b 20 20 20 20 20 20 20 20 20 20 20  Prev;           
6280: 2f 2a 20 20 20 20 2e 2e 2e 2e 20 64 6f 75 62 6c  /*    .... doubl
6290: 79 20 6c 69 6e 6b 65 64 20 2a 2f 0a 23 69 66 20  y linked */.#if 
62a0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
62b0: 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
62c0: 59 4c 45 29 0a 20 20 75 6e 73 69 67 6e 65 64 20  YLE).  unsigned 
62d0: 6c 6f 6e 67 20 6c 6f 6e 67 20 73 68 61 72 65 64  long long shared
62e0: 42 79 74 65 3b 20 20 2f 2a 20 66 6f 72 20 41 46  Byte;  /* for AF
62f0: 50 20 73 69 6d 75 6c 61 74 65 64 20 73 68 61 72  P simulated shar
6300: 65 64 20 6c 6f 63 6b 20 2a 2f 0a 23 65 6e 64 69  ed lock */.#endi
6310: 66 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  f.#if OS_VXWORKS
6320: 0a 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d 3b 20  .  sem_t *pSem; 
6330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6340: 20 20 20 2f 2a 20 4e 61 6d 65 64 20 50 4f 53 49     /* Named POSI
6350: 58 20 73 65 6d 61 70 68 6f 72 65 20 2a 2f 0a 20  X semaphore */. 
6360: 20 63 68 61 72 20 61 53 65 6d 4e 61 6d 65 5b 4d   char aSemName[M
6370: 41 58 5f 50 41 54 48 4e 41 4d 45 2b 32 5d 3b 20  AX_PATHNAME+2]; 
6380: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 61 74   /* Name of that
6390: 20 73 65 6d 61 70 68 6f 72 65 20 2a 2f 0a 23 65   semaphore */.#e
63a0: 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  ndif.};../*.** A
63b0: 20 6c 69 73 74 73 20 6f 66 20 61 6c 6c 20 75 6e   lists of all un
63c0: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65  ixInodeInfo obje
63d0: 63 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75  cts..*/.static u
63e0: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 69 6e  nixInodeInfo *in
63f0: 6f 64 65 4c 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a  odeList = 0;../*
6400: 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 75 6e  .** Release a un
6410: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 73 74 72 75  ixInodeInfo stru
6420: 63 74 75 72 65 20 70 72 65 76 69 6f 75 73 6c 79  cture previously
6430: 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 66 69   allocated by fi
6440: 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29 2e 0a 2a  ndInodeInfo()..*
6450: 2a 0a 2a 2a 20 54 68 65 20 6d 75 74 65 78 20 65  *.** The mutex e
6460: 6e 74 65 72 65 64 20 75 73 69 6e 67 20 74 68 65  ntered using the
6470: 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
6480: 29 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20  ) function must 
6490: 62 65 20 68 65 6c 64 0a 2a 2a 20 77 68 65 6e 20  be held.** when 
64a0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
64b0: 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74   called..*/.stat
64c0: 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 49  ic void releaseI
64d0: 6e 6f 64 65 49 6e 66 6f 28 75 6e 69 78 49 6e 6f  nodeInfo(unixIno
64e0: 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 29 7b  deInfo *pInode){
64f0: 0a 20 20 61 73 73 65 72 74 28 20 75 6e 69 78 4d  .  assert( unixM
6500: 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 20 20  utexHeld() );.  
6510: 69 66 28 20 70 49 6e 6f 64 65 20 29 7b 0a 20 20  if( pInode ){.  
6520: 20 20 70 49 6e 6f 64 65 2d 3e 6e 52 65 66 2d 2d    pInode->nRef--
6530: 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65  ;.    if( pInode
6540: 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ->nRef==0 ){.   
6550: 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64     assert( pInod
6560: 65 2d 3e 70 53 68 6d 4e 6f 64 65 3d 3d 30 20 29  e->pShmNode==0 )
6570: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e 6f  ;.      if( pIno
6580: 64 65 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20  de->pPrev ){.   
6590: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e       assert( pIn
65a0: 6f 64 65 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78  ode->pPrev->pNex
65b0: 74 3d 3d 70 49 6e 6f 64 65 20 29 3b 0a 20 20 20  t==pInode );.   
65c0: 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70 50 72       pInode->pPr
65d0: 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 6f  ev->pNext = pIno
65e0: 64 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  de->pNext;.     
65f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
6600: 61 73 73 65 72 74 28 20 69 6e 6f 64 65 4c 69 73  assert( inodeLis
6610: 74 3d 3d 70 49 6e 6f 64 65 20 29 3b 0a 20 20 20  t==pInode );.   
6620: 20 20 20 20 20 69 6e 6f 64 65 4c 69 73 74 20 3d       inodeList =
6630: 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a   pInode->pNext;.
6640: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
6650: 28 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 20  ( pInode->pNext 
6660: 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
6670: 74 28 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74  t( pInode->pNext
6680: 2d 3e 70 50 72 65 76 3d 3d 70 49 6e 6f 64 65 20  ->pPrev==pInode 
6690: 29 3b 0a 20 20 20 20 20 20 20 20 70 49 6e 6f 64  );.        pInod
66a0: 65 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20  e->pNext->pPrev 
66b0: 3d 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76 3b  = pInode->pPrev;
66c0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
66d0: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49 6e 6f  qlite3_free(pIno
66e0: 64 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  de);.    }.  }.}
66f0: 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20  ../*.** Given a 
6700: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2c  file descriptor,
6710: 20 6c 6f 63 61 74 65 20 74 68 65 20 75 6e 69 78   locate the unix
6720: 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74  InodeInfo object
6730: 20 74 68 61 74 0a 2a 2a 20 64 65 73 63 72 69 62   that.** describ
6740: 65 73 20 74 68 61 74 20 66 69 6c 65 20 64 65 73  es that file des
6750: 63 72 69 70 74 6f 72 2e 20 20 43 72 65 61 74 65  criptor.  Create
6760: 20 61 20 6e 65 77 20 6f 6e 65 20 69 66 20 6e 65   a new one if ne
6770: 63 65 73 73 61 72 79 2e 20 20 54 68 65 0a 2a 2a  cessary.  The.**
6780: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6d 69   return value mi
6790: 67 68 74 20 62 65 20 75 6e 69 6e 69 74 69 61 6c  ght be uninitial
67a0: 69 7a 65 64 20 69 66 20 61 6e 20 65 72 72 6f 72  ized if an error
67b0: 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54   occurs..**.** T
67c0: 68 65 20 6d 75 74 65 78 20 65 6e 74 65 72 65 64  he mutex entered
67d0: 20 75 73 69 6e 67 20 74 68 65 20 75 6e 69 78 45   using the unixE
67e0: 6e 74 65 72 4d 75 74 65 78 28 29 20 66 75 6e 63  nterMutex() func
67f0: 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 68 65 6c  tion must be hel
6800: 64 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73 20 66  d.** when this f
6810: 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
6820: 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  d..**.** Return 
6830: 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65  an appropriate e
6840: 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74  rror code..*/.st
6850: 61 74 69 63 20 69 6e 74 20 66 69 6e 64 49 6e 6f  atic int findIno
6860: 64 65 49 6e 66 6f 28 0a 20 20 75 6e 69 78 46 69  deInfo(.  unixFi
6870: 6c 65 20 2a 70 46 69 6c 65 2c 20 20 20 20 20 20  le *pFile,      
6880: 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 69 78           /* Unix
6890: 20 66 69 6c 65 20 77 69 74 68 20 66 69 6c 65 20   file with file 
68a0: 64 65 73 63 20 75 73 65 64 20 69 6e 20 74 68 65  desc used in the
68b0: 20 6b 65 79 20 2a 2f 0a 20 20 75 6e 69 78 49 6e   key */.  unixIn
68c0: 6f 64 65 49 6e 66 6f 20 2a 2a 70 70 49 6e 6f 64  odeInfo **ppInod
68d0: 65 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75  e        /* Retu
68e0: 72 6e 20 74 68 65 20 75 6e 69 78 49 6e 6f 64 65  rn the unixInode
68f0: 49 6e 66 6f 20 6f 62 6a 65 63 74 20 68 65 72 65  Info object here
6900: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
6910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6920: 20 20 20 20 20 20 20 20 2f 2a 20 53 79 73 74 65          /* Syste
6930: 6d 20 63 61 6c 6c 20 72 65 74 75 72 6e 20 63 6f  m call return co
6940: 64 65 20 2a 2f 0a 20 20 69 6e 74 20 66 64 3b 20  de */.  int fd; 
6950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6960: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69         /* The fi
6970: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f  le descriptor fo
6980: 72 20 70 46 69 6c 65 20 2a 2f 0a 20 20 73 74 72  r pFile */.  str
6990: 75 63 74 20 75 6e 69 78 46 69 6c 65 49 64 20 66  uct unixFileId f
69a0: 69 6c 65 49 64 3b 20 20 20 20 20 20 2f 2a 20 4c  ileId;      /* L
69b0: 6f 6f 6b 75 70 20 6b 65 79 20 66 6f 72 20 74 68  ookup key for th
69c0: 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20  e unixInodeInfo 
69d0: 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 74 61 74  */.  struct stat
69e0: 20 73 74 61 74 62 75 66 3b 20 20 20 20 20 20 20   statbuf;       
69f0: 20 20 20 20 2f 2a 20 4c 6f 77 2d 6c 65 76 65 6c      /* Low-level
6a00: 20 66 69 6c 65 20 69 6e 66 6f 72 6d 61 74 69 6f   file informatio
6a10: 6e 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65  n */.  unixInode
6a20: 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 30  Info *pInode = 0
6a30: 3b 20 20 20 20 20 2f 2a 20 43 61 6e 64 69 64 61  ;     /* Candida
6a40: 74 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  te unixInodeInfo
6a50: 20 6f 62 6a 65 63 74 20 2a 2f 0a 0a 20 20 61 73   object */..  as
6a60: 73 65 72 74 28 20 75 6e 69 78 4d 75 74 65 78 48  sert( unixMutexH
6a70: 65 6c 64 28 29 20 29 3b 0a 0a 20 20 2f 2a 20 47  eld() );..  /* G
6a80: 65 74 20 6c 6f 77 2d 6c 65 76 65 6c 20 69 6e 66  et low-level inf
6a90: 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74  ormation about t
6aa0: 68 65 20 66 69 6c 65 20 74 68 61 74 20 77 65 20  he file that we 
6ab0: 63 61 6e 20 75 73 65 64 20 74 6f 0a 20 20 2a 2a  can used to.  **
6ac0: 20 63 72 65 61 74 65 20 61 20 75 6e 69 71 75 65   create a unique
6ad0: 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 66 69   name for the fi
6ae0: 6c 65 2e 0a 20 20 2a 2f 0a 20 20 66 64 20 3d 20  le..  */.  fd = 
6af0: 70 46 69 6c 65 2d 3e 68 3b 0a 20 20 72 63 20 3d  pFile->h;.  rc =
6b00: 20 66 73 74 61 74 28 66 64 2c 20 26 73 74 61 74   fstat(fd, &stat
6b10: 62 75 66 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  buf);.  if( rc!=
6b20: 30 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  0 ){.    pFile->
6b30: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  lastErrno = errn
6b40: 6f 3b 0a 23 69 66 64 65 66 20 45 4f 56 45 52 46  o;.#ifdef EOVERF
6b50: 4c 4f 57 0a 20 20 20 20 69 66 28 20 70 46 69 6c  LOW.    if( pFil
6b60: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 4f  e->lastErrno==EO
6b70: 56 45 52 46 4c 4f 57 20 29 20 72 65 74 75 72 6e  VERFLOW ) return
6b80: 20 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 3b 0a 23   SQLITE_NOLFS;.#
6b90: 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e  endif.    return
6ba0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20   SQLITE_IOERR;. 
6bb0: 20 7d 0a 0a 23 69 66 64 65 66 20 5f 5f 41 50 50   }..#ifdef __APP
6bc0: 4c 45 5f 5f 0a 20 20 2f 2a 20 4f 6e 20 4f 53 20  LE__.  /* On OS 
6bd0: 58 20 6f 6e 20 61 6e 20 6d 73 64 6f 73 20 66 69  X on an msdos fi
6be0: 6c 65 73 79 73 74 65 6d 2c 20 74 68 65 20 69 6e  lesystem, the in
6bf0: 6f 64 65 20 6e 75 6d 62 65 72 20 69 73 20 72 65  ode number is re
6c00: 70 6f 72 74 65 64 0a 20 20 2a 2a 20 69 6e 63 6f  ported.  ** inco
6c10: 72 72 65 63 74 6c 79 20 66 6f 72 20 7a 65 72 6f  rrectly for zero
6c20: 2d 73 69 7a 65 20 66 69 6c 65 73 2e 20 20 53 65  -size files.  Se
6c30: 65 20 74 69 63 6b 65 74 20 23 33 32 36 30 2e 20  e ticket #3260. 
6c40: 20 54 6f 20 77 6f 72 6b 0a 20 20 2a 2a 20 61 72   To work.  ** ar
6c50: 6f 75 6e 64 20 74 68 69 73 20 70 72 6f 62 6c 65  ound this proble
6c60: 6d 20 28 77 65 20 63 6f 6e 73 69 64 65 72 20 69  m (we consider i
6c70: 74 20 61 20 62 75 67 20 69 6e 20 4f 53 20 58 2c  t a bug in OS X,
6c80: 20 6e 6f 74 20 53 51 4c 69 74 65 29 0a 20 20 2a   not SQLite).  *
6c90: 2a 20 77 65 20 61 6c 77 61 79 73 20 69 6e 63 72  * we always incr
6ca0: 65 61 73 65 20 74 68 65 20 66 69 6c 65 20 73 69  ease the file si
6cb0: 7a 65 20 74 6f 20 31 20 62 79 20 77 72 69 74 69  ze to 1 by writi
6cc0: 6e 67 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65  ng a single byte
6cd0: 0a 20 20 2a 2a 20 70 72 69 6f 72 20 74 6f 20 61  .  ** prior to a
6ce0: 63 63 65 73 73 69 6e 67 20 74 68 65 20 69 6e 6f  ccessing the ino
6cf0: 64 65 20 6e 75 6d 62 65 72 2e 20 20 54 68 65 20  de number.  The 
6d00: 6f 6e 65 20 62 79 74 65 20 77 72 69 74 74 65 6e  one byte written
6d10: 20 69 73 0a 20 20 2a 2a 20 61 6e 20 41 53 43 49   is.  ** an ASCI
6d20: 49 20 27 53 27 20 63 68 61 72 61 63 74 65 72 20  I 'S' character 
6d30: 77 68 69 63 68 20 61 6c 73 6f 20 68 61 70 70 65  which also happe
6d40: 6e 73 20 74 6f 20 62 65 20 74 68 65 20 66 69 72  ns to be the fir
6d50: 73 74 20 62 79 74 65 0a 20 20 2a 2a 20 69 6e 20  st byte.  ** in 
6d60: 74 68 65 20 68 65 61 64 65 72 20 6f 66 20 65 76  the header of ev
6d70: 65 72 79 20 53 51 4c 69 74 65 20 64 61 74 61 62  ery SQLite datab
6d80: 61 73 65 2e 20 20 49 6e 20 74 68 69 73 20 77 61  ase.  In this wa
6d90: 79 2c 20 69 66 20 74 68 65 72 65 0a 20 20 2a 2a  y, if there.  **
6da0: 20 69 73 20 61 20 72 61 63 65 20 63 6f 6e 64 69   is a race condi
6db0: 74 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61  tion such that a
6dc0: 6e 6f 74 68 65 72 20 74 68 72 65 61 64 20 68 61  nother thread ha
6dd0: 73 20 61 6c 72 65 61 64 79 20 70 6f 70 75 6c 61  s already popula
6de0: 74 65 64 0a 20 20 2a 2a 20 74 68 65 20 66 69 72  ted.  ** the fir
6df0: 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 64  st page of the d
6e00: 61 74 61 62 61 73 65 2c 20 6e 6f 20 64 61 6d 61  atabase, no dama
6e10: 67 65 20 69 73 20 64 6f 6e 65 2e 0a 20 20 2a 2f  ge is done..  */
6e20: 0a 20 20 69 66 28 20 73 74 61 74 62 75 66 2e 73  .  if( statbuf.s
6e30: 74 5f 73 69 7a 65 3d 3d 30 20 26 26 20 28 70 46  t_size==0 && (pF
6e40: 69 6c 65 2d 3e 66 73 46 6c 61 67 73 20 26 20 53  ile->fsFlags & S
6e50: 51 4c 49 54 45 5f 46 53 46 4c 41 47 53 5f 49 53  QLITE_FSFLAGS_IS
6e60: 5f 4d 53 44 4f 53 29 21 3d 30 20 29 7b 0a 20 20  _MSDOS)!=0 ){.  
6e70: 20 20 72 63 20 3d 20 77 72 69 74 65 28 66 64 2c    rc = write(fd,
6e80: 20 22 53 22 2c 20 31 29 3b 0a 20 20 20 20 69 66   "S", 1);.    if
6e90: 28 20 72 63 21 3d 31 20 29 7b 0a 20 20 20 20 20  ( rc!=1 ){.     
6ea0: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
6eb0: 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
6ec0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
6ed0: 4f 45 52 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  OERR;.    }.    
6ee0: 72 63 20 3d 20 66 73 74 61 74 28 66 64 2c 20 26  rc = fstat(fd, &
6ef0: 73 74 61 74 62 75 66 29 3b 0a 20 20 20 20 69 66  statbuf);.    if
6f00: 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20  ( rc!=0 ){.     
6f10: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
6f20: 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
6f30: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
6f40: 4f 45 52 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  OERR;.    }.  }.
6f50: 23 65 6e 64 69 66 0a 0a 20 20 6d 65 6d 73 65 74  #endif..  memset
6f60: 28 26 66 69 6c 65 49 64 2c 20 30 2c 20 73 69 7a  (&fileId, 0, siz
6f70: 65 6f 66 28 66 69 6c 65 49 64 29 29 3b 0a 20 20  eof(fileId));.  
6f80: 66 69 6c 65 49 64 2e 64 65 76 20 3d 20 73 74 61  fileId.dev = sta
6f90: 74 62 75 66 2e 73 74 5f 64 65 76 3b 0a 23 69 66  tbuf.st_dev;.#if
6fa0: 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 66 69   OS_VXWORKS.  fi
6fb0: 6c 65 49 64 2e 70 49 64 20 3d 20 70 46 69 6c 65  leId.pId = pFile
6fc0: 2d 3e 70 49 64 3b 0a 23 65 6c 73 65 0a 20 20 66  ->pId;.#else.  f
6fd0: 69 6c 65 49 64 2e 69 6e 6f 20 3d 20 73 74 61 74  ileId.ino = stat
6fe0: 62 75 66 2e 73 74 5f 69 6e 6f 3b 0a 23 65 6e 64  buf.st_ino;.#end
6ff0: 69 66 0a 20 20 70 49 6e 6f 64 65 20 3d 20 69 6e  if.  pInode = in
7000: 6f 64 65 4c 69 73 74 3b 0a 20 20 77 68 69 6c 65  odeList;.  while
7010: 28 20 70 49 6e 6f 64 65 20 26 26 20 6d 65 6d 63  ( pInode && memc
7020: 6d 70 28 26 66 69 6c 65 49 64 2c 20 26 70 49 6e  mp(&fileId, &pIn
7030: 6f 64 65 2d 3e 66 69 6c 65 49 64 2c 20 73 69 7a  ode->fileId, siz
7040: 65 6f 66 28 66 69 6c 65 49 64 29 29 20 29 7b 0a  eof(fileId)) ){.
7050: 20 20 20 20 70 49 6e 6f 64 65 20 3d 20 70 49 6e      pInode = pIn
7060: 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a  ode->pNext;.  }.
7070: 20 20 69 66 28 20 70 49 6e 6f 64 65 3d 3d 30 20    if( pInode==0 
7080: 29 7b 0a 20 20 20 20 70 49 6e 6f 64 65 20 3d 20  ){.    pInode = 
7090: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20  sqlite3_malloc( 
70a0: 73 69 7a 65 6f 66 28 2a 70 49 6e 6f 64 65 29 20  sizeof(*pInode) 
70b0: 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64  );.    if( pInod
70c0: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  e==0 ){.      re
70d0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
70e0: 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d  M;.    }.    mem
70f0: 73 65 74 28 70 49 6e 6f 64 65 2c 20 30 2c 20 73  set(pInode, 0, s
7100: 69 7a 65 6f 66 28 2a 70 49 6e 6f 64 65 29 29 3b  izeof(*pInode));
7110: 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70 49 6e  .    memcpy(&pIn
7120: 6f 64 65 2d 3e 66 69 6c 65 49 64 2c 20 26 66 69  ode->fileId, &fi
7130: 6c 65 49 64 2c 20 73 69 7a 65 6f 66 28 66 69 6c  leId, sizeof(fil
7140: 65 49 64 29 29 3b 0a 20 20 20 20 70 49 6e 6f 64  eId));.    pInod
7150: 65 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20  e->nRef = 1;.   
7160: 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 20 3d   pInode->pNext =
7170: 20 69 6e 6f 64 65 4c 69 73 74 3b 0a 20 20 20 20   inodeList;.    
7180: 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76 20 3d 20  pInode->pPrev = 
7190: 30 3b 0a 20 20 20 20 69 66 28 20 69 6e 6f 64 65  0;.    if( inode
71a0: 4c 69 73 74 20 29 20 69 6e 6f 64 65 4c 69 73 74  List ) inodeList
71b0: 2d 3e 70 50 72 65 76 20 3d 20 70 49 6e 6f 64 65  ->pPrev = pInode
71c0: 3b 0a 20 20 20 20 69 6e 6f 64 65 4c 69 73 74 20  ;.    inodeList 
71d0: 3d 20 70 49 6e 6f 64 65 3b 0a 20 20 7d 65 6c 73  = pInode;.  }els
71e0: 65 7b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e  e{.    pInode->n
71f0: 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 2a 70 70  Ref++;.  }.  *pp
7200: 49 6e 6f 64 65 20 3d 20 70 49 6e 6f 64 65 3b 0a  Inode = pInode;.
7210: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
7220: 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  OK;.}.../*.** Th
7230: 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b  is routine check
7240: 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20  s if there is a 
7250: 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65  RESERVED lock he
7260: 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66  ld on the specif
7270: 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74  ied.** file by t
7280: 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72  his or any other
7290: 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63   process. If suc
72a0: 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  h a lock is held
72b0: 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a  , set *pResOut.*
72c0: 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20  * to a non-zero 
72d0: 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20  value otherwise 
72e0: 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65 74 20  *pResOut is set 
72f0: 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65  to zero.  The re
7300: 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73  turn value.** is
7310: 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f   set to SQLITE_O
7320: 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20  K unless an I/O 
7330: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72  error occurs dur
7340: 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e  ing lock checkin
7350: 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
7360: 20 75 6e 69 78 43 68 65 63 6b 52 65 73 65 72 76   unixCheckReserv
7370: 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  edLock(sqlite3_f
7380: 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52  ile *id, int *pR
7390: 65 73 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72 63  esOut){.  int rc
73a0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
73b0: 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d 20 30  int reserved = 0
73c0: 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  ;.  unixFile *pF
73d0: 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
73e0: 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65  )id;..  Simulate
73f0: 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  IOError( return 
7400: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45  SQLITE_IOERR_CHE
7410: 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20  CKRESERVEDLOCK; 
7420: 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46  );..  assert( pF
7430: 69 6c 65 20 29 3b 0a 20 20 75 6e 69 78 45 6e 74  ile );.  unixEnt
7440: 65 72 4d 75 74 65 78 28 29 3b 20 2f 2a 20 42 65  erMutex(); /* Be
7450: 63 61 75 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e  cause pFile->pIn
7460: 6f 64 65 20 69 73 20 73 68 61 72 65 64 20 61 63  ode is shared ac
7470: 72 6f 73 73 20 74 68 72 65 61 64 73 20 2a 2f 0a  ross threads */.
7480: 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61  .  /* Check if a
7490: 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 20   thread in this 
74a0: 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75  process holds su
74b0: 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69  ch a lock */.  i
74c0: 66 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  f( pFile->pInode
74d0: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52  ->eFileLock>SHAR
74e0: 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72  ED_LOCK ){.    r
74f0: 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d  eserved = 1;.  }
7500: 0a 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65  ..  /* Otherwise
7510: 20 73 65 65 20 69 66 20 73 6f 6d 65 20 6f 74 68   see if some oth
7520: 65 72 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73  er process holds
7530: 20 69 74 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65   it..  */.#ifnde
7540: 66 20 5f 5f 44 4a 47 50 50 5f 5f 0a 20 20 69 66  f __DJGPP__.  if
7550: 28 20 21 72 65 73 65 72 76 65 64 20 29 7b 0a 20  ( !reserved ){. 
7560: 20 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20     struct flock 
7570: 6c 6f 63 6b 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c  lock;.    lock.l
7580: 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
7590: 45 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73  ET;.    lock.l_s
75a0: 74 61 72 74 20 3d 20 52 45 53 45 52 56 45 44 5f  tart = RESERVED_
75b0: 42 59 54 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c  BYTE;.    lock.l
75c0: 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20 20 20 6c 6f  _len = 1;.    lo
75d0: 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57 52  ck.l_type = F_WR
75e0: 4c 43 4b 3b 0a 20 20 20 20 69 66 20 28 2d 31 20  LCK;.    if (-1 
75f0: 3d 3d 20 66 63 6e 74 6c 28 70 46 69 6c 65 2d 3e  == fcntl(pFile->
7600: 68 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63  h, F_GETLK, &loc
7610: 6b 29 29 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  k)) {.      int 
7620: 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
7630: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
7640: 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45  eErrorFromPosixE
7650: 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c  rror(tErrno, SQL
7660: 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52  ITE_IOERR_CHECKR
7670: 45 53 45 52 56 45 44 4c 4f 43 4b 29 3b 0a 20 20  ESERVEDLOCK);.  
7680: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
7690: 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20  rrno = tErrno;. 
76a0: 20 20 20 7d 20 65 6c 73 65 20 69 66 28 20 6c 6f     } else if( lo
76b0: 63 6b 2e 6c 5f 74 79 70 65 21 3d 46 5f 55 4e 4c  ck.l_type!=F_UNL
76c0: 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 73 65  CK ){.      rese
76d0: 72 76 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  rved = 1;.    }.
76e0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20    }.#endif.  .  
76f0: 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
7700: 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54 45  ;.  OSTRACE(("TE
7710: 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64  ST WR-LOCK %d %d
7720: 20 25 64 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70   %d (unix)\n", p
7730: 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73  File->h, rc, res
7740: 65 72 76 65 64 29 29 3b 0a 0a 20 20 2a 70 52 65  erved));..  *pRe
7750: 73 4f 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b  sOut = reserved;
7760: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
7770: 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20  ./*.** Lock the 
7780: 66 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f  file with the lo
7790: 63 6b 20 73 70 65 63 69 66 69 65 64 20 62 79 20  ck specified by 
77a0: 70 61 72 61 6d 65 74 65 72 20 65 46 69 6c 65 4c  parameter eFileL
77b0: 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20  ock - one.** of 
77c0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a  the following:.*
77d0: 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41  *.**     (1) SHA
77e0: 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  RED_LOCK.**     
77f0: 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  (2) RESERVED_LOC
7800: 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e  K.**     (3) PEN
7810: 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  DING_LOCK.**    
7820: 20 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c   (4) EXCLUSIVE_L
7830: 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69  OCK.**.** Someti
7840: 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65 73 74  mes when request
7850: 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61  ing one lock sta
7860: 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c  te, additional l
7870: 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72  ock states.** ar
7880: 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65  e inserted in be
7890: 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b  tween.  The lock
78a0: 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f  ing might fail o
78b0: 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74  n one of the lat
78c0: 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  er.** transition
78d0: 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f  s leaving the lo
78e0: 63 6b 20 73 74 61 74 65 20 64 69 66 66 65 72 65  ck state differe
78f0: 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20  nt from what it 
7900: 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73  started but.** s
7910: 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74  till short of it
7920: 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c  s goal.  The fol
7930: 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f  lowing chart sho
7940: 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a  ws the allowed.*
7950: 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e  * transitions an
7960: 64 20 74 68 65 20 69 6e 73 65 72 74 65 64 20 69  d the inserted i
7970: 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74  ntermediate stat
7980: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c  es:.**.**    UNL
7990: 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a  OCKED -> SHARED.
79a0: 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20  **    SHARED -> 
79b0: 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53  RESERVED.**    S
79c0: 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e  HARED -> (PENDIN
79d0: 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  G) -> EXCLUSIVE.
79e0: 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44 20 2d  **    RESERVED -
79f0: 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45  > (PENDING) -> E
7a00: 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50  XCLUSIVE.**    P
7a10: 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53  ENDING -> EXCLUS
7a20: 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  IVE.**.** This r
7a30: 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79  outine will only
7a40: 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b   increase a lock
7a50: 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c 69 74  .  Use the sqlit
7a60: 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20  e3OsUnlock().** 
7a70: 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72  routine to lower
7a80: 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c   a locking level
7a90: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
7aa0: 75 6e 69 78 4c 6f 63 6b 28 73 71 6c 69 74 65 33  unixLock(sqlite3
7ab0: 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65  _file *id, int e
7ac0: 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20 2f 2a 20  FileLock){.  /* 
7ad0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 64 65  The following de
7ae0: 73 63 72 69 62 65 73 20 74 68 65 20 69 6d 70 6c  scribes the impl
7af0: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
7b00: 65 20 76 61 72 69 6f 75 73 20 6c 6f 63 6b 73 20  e various locks 
7b10: 61 6e 64 0a 20 20 2a 2a 20 6c 6f 63 6b 20 74 72  and.  ** lock tr
7b20: 61 6e 73 69 74 69 6f 6e 73 20 69 6e 20 74 65 72  ansitions in ter
7b30: 6d 73 20 6f 66 20 74 68 65 20 50 4f 53 49 58 20  ms of the POSIX 
7b40: 61 64 76 69 73 6f 72 79 20 73 68 61 72 65 64 20  advisory shared 
7b50: 61 6e 64 20 65 78 63 6c 75 73 69 76 65 0a 20 20  and exclusive.  
7b60: 2a 2a 20 6c 6f 63 6b 20 70 72 69 6d 69 74 69 76  ** lock primitiv
7b70: 65 73 20 28 63 61 6c 6c 65 64 20 72 65 61 64 2d  es (called read-
7b80: 6c 6f 63 6b 73 20 61 6e 64 20 77 72 69 74 65 2d  locks and write-
7b90: 6c 6f 63 6b 73 20 62 65 6c 6f 77 2c 20 74 6f 20  locks below, to 
7ba0: 61 76 6f 69 64 0a 20 20 2a 2a 20 63 6f 6e 66 75  avoid.  ** confu
7bb0: 73 69 6f 6e 20 77 69 74 68 20 53 51 4c 69 74 65  sion with SQLite
7bc0: 20 6c 6f 63 6b 20 6e 61 6d 65 73 29 2e 20 54 68   lock names). Th
7bd0: 65 20 61 6c 67 6f 72 69 74 68 6d 73 20 61 72 65  e algorithms are
7be0: 20 63 6f 6d 70 6c 69 63 61 74 65 64 0a 20 20 2a   complicated.  *
7bf0: 2a 20 73 6c 69 67 68 74 6c 79 20 69 6e 20 6f 72  * slightly in or
7c00: 64 65 72 20 74 6f 20 62 65 20 63 6f 6d 70 61 74  der to be compat
7c10: 69 62 6c 65 20 77 69 74 68 20 77 69 6e 64 6f 77  ible with window
7c20: 73 20 73 79 73 74 65 6d 73 20 73 69 6d 75 6c 74  s systems simult
7c30: 61 6e 65 6f 75 73 6c 79 0a 20 20 2a 2a 20 61 63  aneously.  ** ac
7c40: 63 65 73 73 69 6e 67 20 74 68 65 20 73 61 6d 65  cessing the same
7c50: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
7c60: 69 6e 20 63 61 73 65 20 74 68 61 74 20 69 73 20  in case that is 
7c70: 65 76 65 72 20 72 65 71 75 69 72 65 64 2e 0a 20  ever required.. 
7c80: 20 2a 2a 0a 20 20 2a 2a 20 53 79 6d 62 6f 6c 73   **.  ** Symbols
7c90: 20 64 65 66 69 6e 65 64 20 69 6e 20 6f 73 2e 68   defined in os.h
7ca0: 20 69 6e 64 65 6e 74 69 66 79 20 74 68 65 20 27   indentify the '
7cb0: 70 65 6e 64 69 6e 67 20 62 79 74 65 27 20 61 6e  pending byte' an
7cc0: 64 20 74 68 65 20 27 72 65 73 65 72 76 65 64 0a  d the 'reserved.
7cd0: 20 20 2a 2a 20 62 79 74 65 27 2c 20 65 61 63 68    ** byte', each
7ce0: 20 73 69 6e 67 6c 65 20 62 79 74 65 73 20 61 74   single bytes at
7cf0: 20 77 65 6c 6c 20 6b 6e 6f 77 6e 20 6f 66 66 73   well known offs
7d00: 65 74 73 2c 20 61 6e 64 20 74 68 65 20 27 73 68  ets, and the 'sh
7d10: 61 72 65 64 20 62 79 74 65 0a 20 20 2a 2a 20 72  ared byte.  ** r
7d20: 61 6e 67 65 27 2c 20 61 20 72 61 6e 67 65 20 6f  ange', a range o
7d30: 66 20 35 31 30 20 62 79 74 65 73 20 61 74 20 61  f 510 bytes at a
7d40: 20 77 65 6c 6c 20 6b 6e 6f 77 6e 20 6f 66 66 73   well known offs
7d50: 65 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 6f  et..  **.  ** To
7d60: 20 6f 62 74 61 69 6e 20 61 20 53 48 41 52 45 44   obtain a SHARED
7d70: 20 6c 6f 63 6b 2c 20 61 20 72 65 61 64 2d 6c 6f   lock, a read-lo
7d80: 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 20 6f  ck is obtained o
7d90: 6e 20 74 68 65 20 27 70 65 6e 64 69 6e 67 0a 20  n the 'pending. 
7da0: 20 2a 2a 20 62 79 74 65 27 2e 20 20 49 66 20 74   ** byte'.  If t
7db0: 68 69 73 20 69 73 20 73 75 63 63 65 73 73 66 75  his is successfu
7dc0: 6c 2c 20 61 20 72 61 6e 64 6f 6d 20 62 79 74 65  l, a random byte
7dd0: 20 66 72 6f 6d 20 74 68 65 20 27 73 68 61 72 65   from the 'share
7de0: 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67  d byte.  ** rang
7df0: 65 27 20 69 73 20 72 65 61 64 2d 6c 6f 63 6b 65  e' is read-locke
7e00: 64 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f  d and the lock o
7e10: 6e 20 74 68 65 20 27 70 65 6e 64 69 6e 67 20 62  n the 'pending b
7e20: 79 74 65 27 20 72 65 6c 65 61 73 65 64 2e 0a 20  yte' released.. 
7e30: 20 2a 2a 0a 20 20 2a 2a 20 41 20 70 72 6f 63 65   **.  ** A proce
7e40: 73 73 20 6d 61 79 20 6f 6e 6c 79 20 6f 62 74 61  ss may only obta
7e50: 69 6e 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  in a RESERVED lo
7e60: 63 6b 20 61 66 74 65 72 20 69 74 20 68 61 73 20  ck after it has 
7e70: 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2e 0a 20  a SHARED lock.. 
7e80: 20 2a 2a 20 41 20 52 45 53 45 52 56 45 44 20 6c   ** A RESERVED l
7e90: 6f 63 6b 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74  ock is implement
7ea0: 65 64 20 62 79 20 67 72 61 62 62 69 6e 67 20 61  ed by grabbing a
7eb0: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74   write-lock on t
7ec0: 68 65 0a 20 20 2a 2a 20 27 72 65 73 65 72 76 65  he.  ** 'reserve
7ed0: 64 20 62 79 74 65 27 2e 20 0a 20 20 2a 2a 0a 20  d byte'. .  **. 
7ee0: 20 2a 2a 20 41 20 70 72 6f 63 65 73 73 20 6d 61   ** A process ma
7ef0: 79 20 6f 6e 6c 79 20 6f 62 74 61 69 6e 20 61 20  y only obtain a 
7f00: 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 61 66 74  PENDING lock aft
7f10: 65 72 20 69 74 20 68 61 73 20 6f 62 74 61 69 6e  er it has obtain
7f20: 65 64 20 61 0a 20 20 2a 2a 20 53 48 41 52 45 44  ed a.  ** SHARED
7f30: 20 6c 6f 63 6b 2e 20 41 20 50 45 4e 44 49 4e 47   lock. A PENDING
7f40: 20 6c 6f 63 6b 20 69 73 20 69 6d 70 6c 65 6d 65   lock is impleme
7f50: 6e 74 65 64 20 62 79 20 6f 62 74 61 69 6e 69 6e  nted by obtainin
7f60: 67 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 0a 20  g a write-lock. 
7f70: 20 2a 2a 20 6f 6e 20 74 68 65 20 27 70 65 6e 64   ** on the 'pend
7f80: 69 6e 67 20 62 79 74 65 27 2e 20 54 68 69 73 20  ing byte'. This 
7f90: 65 6e 73 75 72 65 73 20 74 68 61 74 20 6e 6f 20  ensures that no 
7fa0: 6e 65 77 20 53 48 41 52 45 44 20 6c 6f 63 6b 73  new SHARED locks
7fb0: 20 63 61 6e 20 62 65 0a 20 20 2a 2a 20 6f 62 74   can be.  ** obt
7fc0: 61 69 6e 65 64 2c 20 62 75 74 20 65 78 69 73 74  ained, but exist
7fd0: 69 6e 67 20 53 48 41 52 45 44 20 6c 6f 63 6b 73  ing SHARED locks
7fe0: 20 61 72 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20   are allowed to 
7ff0: 70 65 72 73 69 73 74 2e 20 41 20 70 72 6f 63 65  persist. A proce
8000: 73 73 0a 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74  ss.  ** does not
8010: 20 68 61 76 65 20 74 6f 20 6f 62 74 61 69 6e 20   have to obtain 
8020: 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
8030: 6f 6e 20 74 68 65 20 77 61 79 20 74 6f 20 61 20  on the way to a 
8040: 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 2e 0a 20 20  PENDING lock..  
8050: 2a 2a 20 54 68 69 73 20 70 72 6f 70 65 72 74 79  ** This property
8060: 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20   is used by the 
8070: 61 6c 67 6f 72 69 74 68 6d 20 66 6f 72 20 72 6f  algorithm for ro
8080: 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 6a 6f 75  lling back a jou
8090: 72 6e 61 6c 20 66 69 6c 65 0a 20 20 2a 2a 20 61  rnal file.  ** a
80a0: 66 74 65 72 20 61 20 63 72 61 73 68 2e 0a 20 20  fter a crash..  
80b0: 2a 2a 0a 20 20 2a 2a 20 41 6e 20 45 58 43 4c 55  **.  ** An EXCLU
80c0: 53 49 56 45 20 6c 6f 63 6b 2c 20 6f 62 74 61 69  SIVE lock, obtai
80d0: 6e 65 64 20 61 66 74 65 72 20 61 20 50 45 4e 44  ned after a PEND
80e0: 49 4e 47 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  ING lock is held
80f0: 2c 20 69 73 0a 20 20 2a 2a 20 69 6d 70 6c 65 6d  , is.  ** implem
8100: 65 6e 74 65 64 20 62 79 20 6f 62 74 61 69 6e 69  ented by obtaini
8110: 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20  ng a write-lock 
8120: 6f 6e 20 74 68 65 20 65 6e 74 69 72 65 20 27 73  on the entire 's
8130: 68 61 72 65 64 20 62 79 74 65 0a 20 20 2a 2a 20  hared byte.  ** 
8140: 72 61 6e 67 65 27 2e 20 53 69 6e 63 65 20 61 6c  range'. Since al
8150: 6c 20 6f 74 68 65 72 20 6c 6f 63 6b 73 20 72 65  l other locks re
8160: 71 75 69 72 65 20 61 20 72 65 61 64 2d 6c 6f 63  quire a read-loc
8170: 6b 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  k on one of the 
8180: 62 79 74 65 73 0a 20 20 2a 2a 20 77 69 74 68 69  bytes.  ** withi
8190: 6e 20 74 68 69 73 20 72 61 6e 67 65 2c 20 74 68  n this range, th
81a0: 69 73 20 65 6e 73 75 72 65 73 20 74 68 61 74 20  is ensures that 
81b0: 6e 6f 20 6f 74 68 65 72 20 6c 6f 63 6b 73 20 61  no other locks a
81c0: 72 65 20 68 65 6c 64 20 6f 6e 20 74 68 65 0a 20  re held on the. 
81d0: 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 0a 20   ** database. . 
81e0: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 72 65 61   **.  ** The rea
81f0: 73 6f 6e 20 61 20 73 69 6e 67 6c 65 20 62 79 74  son a single byt
8200: 65 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64  e cannot be used
8210: 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20   instead of the 
8220: 27 73 68 61 72 65 64 20 62 79 74 65 0a 20 20 2a  'shared byte.  *
8230: 2a 20 72 61 6e 67 65 27 20 69 73 20 74 68 61 74  * range' is that
8240: 20 73 6f 6d 65 20 76 65 72 73 69 6f 6e 73 20 6f   some versions o
8250: 66 20 77 69 6e 64 6f 77 73 20 64 6f 20 6e 6f 74  f windows do not
8260: 20 73 75 70 70 6f 72 74 20 72 65 61 64 2d 6c 6f   support read-lo
8270: 63 6b 73 2e 20 42 79 0a 20 20 2a 2a 20 6c 6f 63  cks. By.  ** loc
8280: 6b 69 6e 67 20 61 20 72 61 6e 64 6f 6d 20 62 79  king a random by
8290: 74 65 20 66 72 6f 6d 20 61 20 72 61 6e 67 65 2c  te from a range,
82a0: 20 63 6f 6e 63 75 72 72 65 6e 74 20 53 48 41 52   concurrent SHAR
82b0: 45 44 20 6c 6f 63 6b 73 20 6d 61 79 20 65 78 69  ED locks may exi
82c0: 73 74 0a 20 20 2a 2a 20 65 76 65 6e 20 69 66 20  st.  ** even if 
82d0: 74 68 65 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d  the locking prim
82e0: 69 74 69 76 65 20 75 73 65 64 20 69 73 20 61 6c  itive used is al
82f0: 77 61 79 73 20 61 20 77 72 69 74 65 2d 6c 6f 63  ways a write-loc
8300: 6b 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 72 63  k..  */.  int rc
8310: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
8320: 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
8330: 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
8340: 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  .  unixInodeInfo
8350: 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65   *pInode = pFile
8360: 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 73 74 72 75  ->pInode;.  stru
8370: 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20  ct flock lock;. 
8380: 20 69 6e 74 20 73 20 3d 20 30 3b 0a 20 20 69 6e   int s = 0;.  in
8390: 74 20 74 45 72 72 6e 6f 20 3d 20 30 3b 0a 0a 20  t tErrno = 0;.. 
83a0: 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
83b0: 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f  ;.  OSTRACE(("LO
83c0: 43 4b 20 20 20 20 25 64 20 25 73 20 77 61 73 20  CK    %d %s was 
83d0: 25 73 28 25 73 2c 25 64 29 20 70 69 64 3d 25 64  %s(%s,%d) pid=%d
83e0: 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c   (unix)\n", pFil
83f0: 65 2d 3e 68 2c 0a 20 20 20 20 20 20 61 7a 46 69  e->h,.      azFi
8400: 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b  leLock(eFileLock
8410: 29 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 46  ), azFileLock(pF
8420: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c  ile->eFileLock),
8430: 0a 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63  .      azFileLoc
8440: 6b 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c  k(pInode->eFileL
8450: 6f 63 6b 29 2c 20 70 49 6e 6f 64 65 2d 3e 6e 53  ock), pInode->nS
8460: 68 61 72 65 64 20 2c 20 67 65 74 70 69 64 28 29  hared , getpid()
8470: 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  ));..  /* If the
8480: 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20  re is already a 
8490: 6c 6f 63 6b 20 6f 66 20 74 68 69 73 20 74 79 70  lock of this typ
84a0: 65 20 6f 72 20 6d 6f 72 65 20 72 65 73 74 72 69  e or more restri
84b0: 63 74 69 76 65 20 6f 6e 20 74 68 65 0a 20 20 2a  ctive on the.  *
84c0: 2a 20 75 6e 69 78 46 69 6c 65 2c 20 64 6f 20 6e  * unixFile, do n
84d0: 6f 74 68 69 6e 67 2e 20 44 6f 6e 27 74 20 75 73  othing. Don't us
84e0: 65 20 74 68 65 20 65 6e 64 5f 6c 6f 63 6b 3a 20  e the end_lock: 
84f0: 65 78 69 74 20 70 61 74 68 2c 20 61 73 0a 20 20  exit path, as.  
8500: 2a 2a 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  ** unixEnterMute
8510: 78 28 29 20 68 61 73 6e 27 74 20 62 65 65 6e 20  x() hasn't been 
8520: 63 61 6c 6c 65 64 20 79 65 74 2e 0a 20 20 2a 2f  called yet..  */
8530: 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46  .  if( pFile->eF
8540: 69 6c 65 4c 6f 63 6b 3e 3d 65 46 69 6c 65 4c 6f  ileLock>=eFileLo
8550: 63 6b 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43  ck ){.    OSTRAC
8560: 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25  E(("LOCK    %d %
8570: 73 20 6f 6b 20 28 61 6c 72 65 61 64 79 20 68 65  s ok (already he
8580: 6c 64 29 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70  ld) (unix)\n", p
8590: 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20  File->h,.       
85a0: 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28       azFileLock(
85b0: 65 46 69 6c 65 4c 6f 63 6b 29 29 29 3b 0a 20 20  eFileLock)));.  
85c0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
85d0: 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61  OK;.  }..  /* Ma
85e0: 6b 65 20 73 75 72 65 20 74 68 65 20 6c 6f 63 6b  ke sure the lock
85f0: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73 20  ing sequence is 
8600: 63 6f 72 72 65 63 74 2e 0a 20 20 2a 2a 20 20 28  correct..  **  (
8610: 31 29 20 57 65 20 6e 65 76 65 72 20 6d 6f 76 65  1) We never move
8620: 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64 20 74   from unlocked t
8630: 6f 20 61 6e 79 74 68 69 6e 67 20 68 69 67 68 65  o anything highe
8640: 72 20 74 68 61 6e 20 73 68 61 72 65 64 20 6c 6f  r than shared lo
8650: 63 6b 2e 0a 20 20 2a 2a 20 20 28 32 29 20 53 51  ck..  **  (2) SQ
8660: 4c 69 74 65 20 6e 65 76 65 72 20 65 78 70 6c 69  Lite never expli
8670: 63 69 74 6c 79 20 72 65 71 75 65 73 74 73 20 61  citly requests a
8680: 20 70 65 6e 64 69 67 20 6c 6f 63 6b 2e 0a 20 20   pendig lock..  
8690: 2a 2a 20 20 28 33 29 20 41 20 73 68 61 72 65 64  **  (3) A shared
86a0: 20 6c 6f 63 6b 20 69 73 20 61 6c 77 61 79 73 20   lock is always 
86b0: 68 65 6c 64 20 77 68 65 6e 20 61 20 72 65 73 65  held when a rese
86c0: 72 76 65 20 6c 6f 63 6b 20 69 73 20 72 65 71 75  rve lock is requ
86d0: 65 73 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73  ested..  */.  as
86e0: 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 65 46 69  sert( pFile->eFi
86f0: 6c 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20  leLock!=NO_LOCK 
8700: 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  || eFileLock==SH
8710: 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61  ARED_LOCK );.  a
8720: 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b  ssert( eFileLock
8730: 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29  !=PENDING_LOCK )
8740: 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c  ;.  assert( eFil
8750: 65 4c 6f 63 6b 21 3d 52 45 53 45 52 56 45 44 5f  eLock!=RESERVED_
8760: 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 65  LOCK || pFile->e
8770: 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
8780: 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 54  _LOCK );..  /* T
8790: 68 69 73 20 6d 75 74 65 78 20 69 73 20 6e 65 65  his mutex is nee
87a0: 64 65 64 20 62 65 63 61 75 73 65 20 70 46 69 6c  ded because pFil
87b0: 65 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73 68 61  e->pInode is sha
87c0: 72 65 64 20 61 63 72 6f 73 73 20 74 68 72 65 61  red across threa
87d0: 64 73 0a 20 20 2a 2f 0a 20 20 75 6e 69 78 45 6e  ds.  */.  unixEn
87e0: 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 70 49  terMutex();.  pI
87f0: 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49  node = pFile->pI
8800: 6e 6f 64 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 73  node;..  /* If s
8810: 6f 6d 65 20 74 68 72 65 61 64 20 75 73 69 6e 67  ome thread using
8820: 20 74 68 69 73 20 50 49 44 20 68 61 73 20 61 20   this PID has a 
8830: 6c 6f 63 6b 20 76 69 61 20 61 20 64 69 66 66 65  lock via a diffe
8840: 72 65 6e 74 20 75 6e 69 78 46 69 6c 65 2a 0a 20  rent unixFile*. 
8850: 20 2a 2a 20 68 61 6e 64 6c 65 20 74 68 61 74 20   ** handle that 
8860: 70 72 65 63 6c 75 64 65 73 20 74 68 65 20 72 65  precludes the re
8870: 71 75 65 73 74 65 64 20 6c 6f 63 6b 2c 20 72 65  quested lock, re
8880: 74 75 72 6e 20 42 55 53 59 2e 0a 20 20 2a 2f 0a  turn BUSY..  */.
8890: 20 20 69 66 28 20 28 70 46 69 6c 65 2d 3e 65 46    if( (pFile->eF
88a0: 69 6c 65 4c 6f 63 6b 21 3d 70 49 6e 6f 64 65 2d  ileLock!=pInode-
88b0: 3e 65 46 69 6c 65 4c 6f 63 6b 20 26 26 20 0a 20  >eFileLock && . 
88c0: 20 20 20 20 20 20 20 20 20 28 70 49 6e 6f 64 65           (pInode
88d0: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 50 45 4e  ->eFileLock>=PEN
88e0: 44 49 4e 47 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69  DING_LOCK || eFi
88f0: 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f  leLock>SHARED_LO
8900: 43 4b 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 63  CK)).  ){.    rc
8910: 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
8920: 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63      goto end_loc
8930: 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  k;.  }..  /* If 
8940: 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 73  a SHARED lock is
8950: 20 72 65 71 75 65 73 74 65 64 2c 20 61 6e 64 20   requested, and 
8960: 73 6f 6d 65 20 74 68 72 65 61 64 20 75 73 69 6e  some thread usin
8970: 67 20 74 68 69 73 20 50 49 44 20 61 6c 72 65 61  g this PID alrea
8980: 64 79 0a 20 20 2a 2a 20 68 61 73 20 61 20 53 48  dy.  ** has a SH
8990: 41 52 45 44 20 6f 72 20 52 45 53 45 52 56 45 44  ARED or RESERVED
89a0: 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 69 6e 63 72   lock, then incr
89b0: 65 6d 65 6e 74 20 72 65 66 65 72 65 6e 63 65 20  ement reference 
89c0: 63 6f 75 6e 74 73 20 61 6e 64 0a 20 20 2a 2a 20  counts and.  ** 
89d0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
89e0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69  ..  */.  if( eFi
89f0: 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
8a00: 4f 43 4b 20 26 26 20 0a 20 20 20 20 20 20 28 70  OCK && .      (p
8a10: 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
8a20: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c  ==SHARED_LOCK ||
8a30: 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f   pInode->eFileLo
8a40: 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  ck==RESERVED_LOC
8a50: 4b 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  K) ){.    assert
8a60: 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41  ( eFileLock==SHA
8a70: 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  RED_LOCK );.    
8a80: 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 65  assert( pFile->e
8a90: 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20  FileLock==0 );. 
8aa0: 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64     assert( pInod
8ab0: 65 2d 3e 6e 53 68 61 72 65 64 3e 30 20 29 3b 0a  e->nShared>0 );.
8ac0: 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
8ad0: 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f  Lock = SHARED_LO
8ae0: 43 4b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e  CK;.    pInode->
8af0: 6e 53 68 61 72 65 64 2b 2b 3b 0a 20 20 20 20 70  nShared++;.    p
8b00: 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a  Inode->nLock++;.
8b10: 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63      goto end_loc
8b20: 6b 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41 20  k;.  }...  /* A 
8b30: 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20  PENDING lock is 
8b40: 6e 65 65 64 65 64 20 62 65 66 6f 72 65 20 61 63  needed before ac
8b50: 71 75 69 72 69 6e 67 20 61 20 53 48 41 52 45 44  quiring a SHARED
8b60: 20 6c 6f 63 6b 20 61 6e 64 20 62 65 66 6f 72 65   lock and before
8b70: 0a 20 20 2a 2a 20 61 63 71 75 69 72 69 6e 67 20  .  ** acquiring 
8b80: 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
8b90: 6b 2e 20 20 46 6f 72 20 74 68 65 20 53 48 41 52  k.  For the SHAR
8ba0: 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20 50 45 4e  ED lock, the PEN
8bb0: 44 49 4e 47 20 77 69 6c 6c 0a 20 20 2a 2a 20 62  DING will.  ** b
8bc0: 65 20 72 65 6c 65 61 73 65 64 2e 0a 20 20 2a 2f  e released..  */
8bd0: 0a 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20  .  lock.l_len = 
8be0: 31 4c 3b 0a 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65  1L;.  lock.l_whe
8bf0: 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a  nce = SEEK_SET;.
8c00: 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d    if( eFileLock=
8c10: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 0a 20 20  =SHARED_LOCK .  
8c20: 20 20 20 20 7c 7c 20 28 65 46 69 6c 65 4c 6f 63      || (eFileLoc
8c30: 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
8c40: 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c  K && pFile->eFil
8c50: 65 4c 6f 63 6b 3c 50 45 4e 44 49 4e 47 5f 4c 4f  eLock<PENDING_LO
8c60: 43 4b 29 0a 20 20 29 7b 0a 20 20 20 20 6c 6f 63  CK).  ){.    loc
8c70: 6b 2e 6c 5f 74 79 70 65 20 3d 20 28 65 46 69 6c  k.l_type = (eFil
8c80: 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
8c90: 43 4b 3f 46 5f 52 44 4c 43 4b 3a 46 5f 57 52 4c  CK?F_RDLCK:F_WRL
8ca0: 43 4b 29 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  CK);.    lock.l_
8cb0: 73 74 61 72 74 20 3d 20 50 45 4e 44 49 4e 47 5f  start = PENDING_
8cc0: 42 59 54 45 3b 0a 20 20 20 20 73 20 3d 20 66 63  BYTE;.    s = fc
8cd0: 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f  ntl(pFile->h, F_
8ce0: 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3b 0a 20  SETLK, &lock);. 
8cf0: 20 20 20 69 66 28 20 73 3d 3d 28 2d 31 29 20 29     if( s==(-1) )
8d00: 7b 0a 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d  {.      tErrno =
8d10: 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63   errno;.      rc
8d20: 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
8d30: 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
8d40: 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
8d50: 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69  R_LOCK);.      i
8d60: 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
8d70: 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20  (rc) ){.        
8d80: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
8d90: 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20   = tErrno;.     
8da0: 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e   }.      goto en
8db0: 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20  d_lock;.    }.  
8dc0: 7d 0a 0a 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74  }...  /* If cont
8dd0: 72 6f 6c 20 67 65 74 73 20 74 6f 20 74 68 69 73  rol gets to this
8de0: 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 61 63 74   point, then act
8df0: 75 61 6c 6c 79 20 67 6f 20 61 68 65 61 64 20 61  ually go ahead a
8e00: 6e 64 20 6d 61 6b 65 0a 20 20 2a 2a 20 6f 70 65  nd make.  ** ope
8e10: 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 63 61  rating system ca
8e20: 6c 6c 73 20 66 6f 72 20 74 68 65 20 73 70 65 63  lls for the spec
8e30: 69 66 69 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2f  ified lock..  */
8e40: 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b  .  if( eFileLock
8e50: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b  ==SHARED_LOCK ){
8e60: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e  .    assert( pIn
8e70: 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20  ode->nShared==0 
8e80: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
8e90: 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
8ea0: 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4e  ==0 );..    /* N
8eb0: 6f 77 20 67 65 74 20 74 68 65 20 72 65 61 64 2d  ow get the read-
8ec0: 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c 6f 63 6b  lock */.    lock
8ed0: 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45  .l_start = SHARE
8ee0: 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 6c 6f 63  D_FIRST;.    loc
8ef0: 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44  k.l_len = SHARED
8f00: 5f 53 49 5a 45 3b 0a 20 20 20 20 69 66 28 20 28  _SIZE;.    if( (
8f10: 73 20 3d 20 66 63 6e 74 6c 28 70 46 69 6c 65 2d  s = fcntl(pFile-
8f20: 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f  >h, F_SETLK, &lo
8f30: 63 6b 29 29 3d 3d 28 2d 31 29 20 29 7b 0a 20 20  ck))==(-1) ){.  
8f40: 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72      tErrno = err
8f50: 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a  no;.    }.    /*
8f60: 20 44 72 6f 70 20 74 68 65 20 74 65 6d 70 6f 72   Drop the tempor
8f70: 61 72 79 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  ary PENDING lock
8f80: 20 2a 2f 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73   */.    lock.l_s
8f90: 74 61 72 74 20 3d 20 50 45 4e 44 49 4e 47 5f 42  tart = PENDING_B
8fa0: 59 54 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  YTE;.    lock.l_
8fb0: 6c 65 6e 20 3d 20 31 4c 3b 0a 20 20 20 20 6c 6f  len = 1L;.    lo
8fc0: 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e  ck.l_type = F_UN
8fd0: 4c 43 4b 3b 0a 20 20 20 20 69 66 28 20 66 63 6e  LCK;.    if( fcn
8fe0: 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53  tl(pFile->h, F_S
8ff0: 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 21 3d 30 20  ETLK, &lock)!=0 
9000: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 20 21  ){.      if( s !
9010: 3d 20 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  = -1 ){.        
9020: 2f 2a 20 54 68 69 73 20 63 6f 75 6c 64 20 68 61  /* This could ha
9030: 70 70 65 6e 20 77 69 74 68 20 61 20 6e 65 74 77  ppen with a netw
9040: 6f 72 6b 20 6d 6f 75 6e 74 20 2a 2f 0a 20 20 20  ork mount */.   
9050: 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72       tErrno = er
9060: 72 6e 6f 3b 20 0a 20 20 20 20 20 20 20 20 72 63  rno; .        rc
9070: 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
9080: 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
9090: 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
90a0: 52 5f 55 4e 4c 4f 43 4b 29 3b 20 0a 20 20 20 20  R_UNLOCK); .    
90b0: 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
90c0: 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20  ERROR(rc) ){.   
90d0: 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61         pFile->la
90e0: 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f  stErrno = tErrno
90f0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
9100: 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63      goto end_loc
9110: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
9120: 0a 20 20 20 20 69 66 28 20 73 3d 3d 28 2d 31 29  .    if( s==(-1)
9130: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
9140: 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
9150: 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c  sixError(tErrno,
9160: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f   SQLITE_IOERR_LO
9170: 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 49  CK);.      if( I
9180: 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29  S_LOCK_ERROR(rc)
9190: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c   ){.        pFil
91a0: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74  e->lastErrno = t
91b0: 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20  Errno;.      }. 
91c0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
91d0: 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
91e0: 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a   = SHARED_LOCK;.
91f0: 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c        pInode->nL
9200: 6f 63 6b 2b 2b 3b 0a 20 20 20 20 20 20 70 49 6e  ock++;.      pIn
9210: 6f 64 65 2d 3e 6e 53 68 61 72 65 64 20 3d 20 31  ode->nShared = 1
9220: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  ;.    }.  }else 
9230: 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45  if( eFileLock==E
9240: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26  XCLUSIVE_LOCK &&
9250: 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
9260: 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20  >1 ){.    /* We 
9270: 61 72 65 20 74 72 79 69 6e 67 20 66 6f 72 20 61  are trying for a
9280: 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
9290: 20 62 75 74 20 61 6e 6f 74 68 65 72 20 74 68 72   but another thr
92a0: 65 61 64 20 69 6e 20 74 68 69 73 0a 20 20 20 20  ead in this.    
92b0: 2a 2a 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20  ** same process 
92c0: 69 73 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67  is still holding
92d0: 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20   a shared lock. 
92e0: 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  */.    rc = SQLI
92f0: 54 45 5f 42 55 53 59 3b 0a 20 20 7d 65 6c 73 65  TE_BUSY;.  }else
9300: 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71  {.    /* The req
9310: 75 65 73 74 20 77 61 73 20 66 6f 72 20 61 20 52  uest was for a R
9320: 45 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55  ESERVED or EXCLU
9330: 53 49 56 45 20 6c 6f 63 6b 2e 20 20 49 74 20 69  SIVE lock.  It i
9340: 73 0a 20 20 20 20 2a 2a 20 61 73 73 75 6d 65 64  s.    ** assumed
9350: 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20 61   that there is a
9360: 20 53 48 41 52 45 44 20 6f 72 20 67 72 65 61 74   SHARED or great
9370: 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66  er lock on the f
9380: 69 6c 65 0a 20 20 20 20 2a 2a 20 61 6c 72 65 61  ile.    ** alrea
9390: 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  dy..    */.    a
93a0: 73 73 65 72 74 28 20 30 21 3d 70 46 69 6c 65 2d  ssert( 0!=pFile-
93b0: 3e 65 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a 20 20  >eFileLock );.  
93c0: 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20    lock.l_type = 
93d0: 46 5f 57 52 4c 43 4b 3b 0a 20 20 20 20 73 77 69  F_WRLCK;.    swi
93e0: 74 63 68 28 20 65 46 69 6c 65 4c 6f 63 6b 20 29  tch( eFileLock )
93f0: 7b 0a 20 20 20 20 20 20 63 61 73 65 20 52 45 53  {.      case RES
9400: 45 52 56 45 44 5f 4c 4f 43 4b 3a 0a 20 20 20 20  ERVED_LOCK:.    
9410: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74      lock.l_start
9420: 20 3d 20 52 45 53 45 52 56 45 44 5f 42 59 54 45   = RESERVED_BYTE
9430: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
9440: 0a 20 20 20 20 20 20 63 61 73 65 20 45 58 43 4c  .      case EXCL
9450: 55 53 49 56 45 5f 4c 4f 43 4b 3a 0a 20 20 20 20  USIVE_LOCK:.    
9460: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74      lock.l_start
9470: 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b   = SHARED_FIRST;
9480: 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  .        lock.l_
9490: 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a  len = SHARED_SIZ
94a0: 45 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  E;.        break
94b0: 3b 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a  ;.      default:
94c0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
94d0: 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 20  0);.    }.    s 
94e0: 3d 20 66 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68  = fcntl(pFile->h
94f0: 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b  , F_SETLK, &lock
9500: 29 3b 0a 20 20 20 20 69 66 28 20 73 3d 3d 28 2d  );.    if( s==(-
9510: 31 29 20 29 7b 0a 20 20 20 20 20 20 74 45 72 72  1) ){.      tErr
9520: 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
9530: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72    rc = sqliteErr
9540: 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72  orFromPosixError
9550: 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f  (tErrno, SQLITE_
9560: 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20  IOERR_LOCK);.   
9570: 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
9580: 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20  RROR(rc) ){.    
9590: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
95a0: 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20  rrno = tErrno;. 
95b0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
95c0: 0a 20 20 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45  .  ..#ifndef NDE
95d0: 42 55 47 0a 20 20 2f 2a 20 53 65 74 20 75 70 20  BUG.  /* Set up 
95e0: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2d  the transaction-
95f0: 63 6f 75 6e 74 65 72 20 63 68 61 6e 67 65 20 63  counter change c
9600: 68 65 63 6b 69 6e 67 20 66 6c 61 67 73 20 77 68  hecking flags wh
9610: 65 6e 0a 20 20 2a 2a 20 74 72 61 6e 73 69 74 69  en.  ** transiti
9620: 6f 6e 69 6e 67 20 66 72 6f 6d 20 61 20 53 48 41  oning from a SHA
9630: 52 45 44 20 74 6f 20 61 20 52 45 53 45 52 56 45  RED to a RESERVE
9640: 44 20 6c 6f 63 6b 2e 20 20 54 68 65 20 63 68 61  D lock.  The cha
9650: 6e 67 65 0a 20 20 2a 2a 20 66 72 6f 6d 20 53 48  nge.  ** from SH
9660: 41 52 45 44 20 74 6f 20 52 45 53 45 52 56 45 44  ARED to RESERVED
9670: 20 6d 61 72 6b 73 20 74 68 65 20 62 65 67 69 6e   marks the begin
9680: 6e 69 6e 67 20 6f 66 20 61 20 6e 6f 72 6d 61 6c  ning of a normal
9690: 0a 20 20 2a 2a 20 77 72 69 74 65 20 6f 70 65 72  .  ** write oper
96a0: 61 74 69 6f 6e 20 28 6e 6f 74 20 61 20 68 6f 74  ation (not a hot
96b0: 20 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63   journal rollbac
96c0: 6b 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  k)..  */.  if( r
96d0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20  c==SQLITE_OK.   
96e0: 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  && pFile->eFileL
96f0: 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock<=SHARED_LOCK
9700: 0a 20 20 20 26 26 20 65 46 69 6c 65 4c 6f 63 6b  .   && eFileLock
9710: 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a  ==RESERVED_LOCK.
9720: 20 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e    ){.    pFile->
9730: 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 20 3d 20  transCntrChng = 
9740: 30 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 64 62  0;.    pFile->db
9750: 55 70 64 61 74 65 20 3d 20 30 3b 0a 20 20 20 20  Update = 0;.    
9760: 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57  pFile->inNormalW
9770: 72 69 74 65 20 3d 20 31 3b 0a 20 20 7d 0a 23 65  rite = 1;.  }.#e
9780: 6e 64 69 66 0a 0a 0a 20 20 69 66 28 20 72 63 3d  ndif...  if( rc=
9790: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
97a0: 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
97b0: 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a  ck = eFileLock;.
97c0: 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c      pInode->eFil
97d0: 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63  eLock = eFileLoc
97e0: 6b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65  k;.  }else if( e
97f0: 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  FileLock==EXCLUS
9800: 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  IVE_LOCK ){.    
9810: 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
9820: 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b   = PENDING_LOCK;
9830: 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69  .    pInode->eFi
9840: 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e 44 49 4e 47  leLock = PENDING
9850: 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a 0a 65 6e 64 5f  _LOCK;.  }..end_
9860: 6c 6f 63 6b 3a 0a 20 20 75 6e 69 78 4c 65 61 76  lock:.  unixLeav
9870: 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53 54 52  eMutex();.  OSTR
9880: 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64  ACE(("LOCK    %d
9890: 20 25 73 20 25 73 20 28 75 6e 69 78 29 5c 6e 22   %s %s (unix)\n"
98a0: 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 61 7a 46 69  , pFile->h, azFi
98b0: 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b  leLock(eFileLock
98c0: 29 2c 20 0a 20 20 20 20 20 20 72 63 3d 3d 53 51  ), .      rc==SQ
98d0: 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a  LITE_OK ? "ok" :
98e0: 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 72   "failed"));.  r
98f0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
9900: 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 66 69 6c  ** Close all fil
9910: 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 61 63  e descriptors ac
9920: 63 75 6d 75 61 74 65 64 20 69 6e 20 74 68 65 20  cumuated in the 
9930: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 2d 3e 70  unixInodeInfo->p
9940: 55 6e 75 73 65 64 20 6c 69 73 74 2e 0a 2a 2a 20  Unused list..** 
9950: 49 66 20 61 6c 6c 20 73 75 63 68 20 66 69 6c 65  If all such file
9960: 20 64 65 73 63 72 69 70 74 6f 72 73 20 61 72 65   descriptors are
9970: 20 63 6c 6f 73 65 64 20 77 69 74 68 6f 75 74 20   closed without 
9980: 65 72 72 6f 72 2c 20 74 68 65 20 6c 69 73 74 20  error, the list 
9990: 69 73 0a 2a 2a 20 63 6c 65 61 72 65 64 20 61 6e  is.** cleared an
99a0: 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  d SQLITE_OK retu
99b0: 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  rned..**.** Othe
99c0: 72 77 69 73 65 2c 20 69 66 20 61 6e 20 65 72 72  rwise, if an err
99d0: 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20  or occurs, then 
99e0: 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6c 6f  successfully clo
99f0: 73 65 64 20 66 69 6c 65 20 64 65 73 63 72 69 70  sed file descrip
9a00: 74 6f 72 0a 2a 2a 20 65 6e 74 72 69 65 73 20 61  tor.** entries a
9a10: 72 65 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20  re removed from 
9a20: 74 68 65 20 6c 69 73 74 2c 20 61 6e 64 20 53 51  the list, and SQ
9a30: 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53 45  LITE_IOERR_CLOSE
9a40: 20 72 65 74 75 72 6e 65 64 2e 20 0a 2a 2a 20 6e   returned. .** n
9a50: 6f 74 20 64 65 6c 65 74 65 64 20 61 6e 64 20 53  ot deleted and S
9a60: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53  QLITE_IOERR_CLOS
9a70: 45 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 20 0a  E returned..*/ .
9a80: 73 74 61 74 69 63 20 69 6e 74 20 63 6c 6f 73 65  static int close
9a90: 50 65 6e 64 69 6e 67 46 64 73 28 75 6e 69 78 46  PendingFds(unixF
9aa0: 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69  ile *pFile){.  i
9ab0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
9ac0: 4b 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e  K;.  unixInodeIn
9ad0: 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69  fo *pInode = pFi
9ae0: 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 55 6e  le->pInode;.  Un
9af0: 69 78 55 6e 75 73 65 64 46 64 20 2a 70 45 72 72  ixUnusedFd *pErr
9b00: 6f 72 20 3d 20 30 3b 0a 20 20 55 6e 69 78 55 6e  or = 0;.  UnixUn
9b10: 75 73 65 64 46 64 20 2a 70 3b 0a 20 20 55 6e 69  usedFd *p;.  Uni
9b20: 78 55 6e 75 73 65 64 46 64 20 2a 70 4e 65 78 74  xUnusedFd *pNext
9b30: 3b 0a 20 20 66 6f 72 28 70 3d 70 49 6e 6f 64 65  ;.  for(p=pInode
9b40: 2d 3e 70 55 6e 75 73 65 64 3b 20 70 3b 20 70 3d  ->pUnused; p; p=
9b50: 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78  pNext){.    pNex
9b60: 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20  t = p->pNext;.  
9b70: 20 20 69 66 28 20 63 6c 6f 73 65 28 70 2d 3e 66    if( close(p->f
9b80: 64 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  d) ){.      pFil
9b90: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65  e->lastErrno = e
9ba0: 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d  rrno;.      rc =
9bb0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c   SQLITE_IOERR_CL
9bc0: 4f 53 45 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4e  OSE;.      p->pN
9bd0: 65 78 74 20 3d 20 70 45 72 72 6f 72 3b 0a 20 20  ext = pError;.  
9be0: 20 20 20 20 70 45 72 72 6f 72 20 3d 20 70 3b 0a      pError = p;.
9bf0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
9c00: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
9c10: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 49  ;.    }.  }.  pI
9c20: 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 20 3d 20  node->pUnused = 
9c30: 70 45 72 72 6f 72 3b 0a 20 20 72 65 74 75 72 6e  pError;.  return
9c40: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64   rc;.}../*.** Ad
9c50: 64 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  d the file descr
9c60: 69 70 74 6f 72 20 75 73 65 64 20 62 79 20 66 69  iptor used by fi
9c70: 6c 65 20 68 61 6e 64 6c 65 20 70 46 69 6c 65 20  le handle pFile 
9c80: 74 6f 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  to the correspon
9c90: 64 69 6e 67 0a 2a 2a 20 70 55 6e 75 73 65 64 20  ding.** pUnused 
9ca0: 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  list..*/.static 
9cb0: 76 6f 69 64 20 73 65 74 50 65 6e 64 69 6e 67 46  void setPendingF
9cc0: 64 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c  d(unixFile *pFil
9cd0: 65 29 7b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49  e){.  unixInodeI
9ce0: 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46  nfo *pInode = pF
9cf0: 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 55  ile->pInode;.  U
9d00: 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70 20 3d  nixUnusedFd *p =
9d10: 20 70 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64 3b   pFile->pUnused;
9d20: 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 49  .  p->pNext = pI
9d30: 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 3b 0a 20  node->pUnused;. 
9d40: 20 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64   pInode->pUnused
9d50: 20 3d 20 70 3b 0a 20 20 70 46 69 6c 65 2d 3e 68   = p;.  pFile->h
9d60: 20 3d 20 2d 31 3b 0a 20 20 70 46 69 6c 65 2d 3e   = -1;.  pFile->
9d70: 70 55 6e 75 73 65 64 20 3d 20 30 3b 0a 7d 0a 0a  pUnused = 0;.}..
9d80: 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20  /*.** Lower the 
9d90: 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e  locking level on
9da0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
9db0: 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c   pFile to eFileL
9dc0: 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a  ock.  eFileLock.
9dd0: 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65  ** must be eithe
9de0: 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41  r NO_LOCK or SHA
9df0: 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20  RED_LOCK..**.** 
9e00: 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  If the locking l
9e10: 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65  evel of the file
9e20: 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61   descriptor is a
9e30: 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c  lready at or bel
9e40: 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73  ow.** the reques
9e50: 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  ted locking leve
9e60: 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  l, this routine 
9e70: 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 0a  is a no-op..** .
9e80: 2a 2a 20 49 66 20 68 61 6e 64 6c 65 4e 46 53 55  ** If handleNFSU
9e90: 6e 6c 6f 63 6b 20 69 73 20 74 72 75 65 2c 20 74  nlock is true, t
9ea0: 68 65 6e 20 6f 6e 20 64 6f 77 6e 67 72 61 64 69  hen on downgradi
9eb0: 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45 5f  ng an EXCLUSIVE_
9ec0: 4c 4f 43 4b 20 74 6f 20 53 48 41 52 45 44 0a 2a  LOCK to SHARED.*
9ed0: 2a 20 74 68 65 20 62 79 74 65 20 72 61 6e 67 65  * the byte range
9ee0: 20 69 73 20 64 69 76 69 64 65 64 20 69 6e 74 6f   is divided into
9ef0: 20 32 20 70 61 72 74 73 20 61 6e 64 20 74 68 65   2 parts and the
9f00: 20 66 69 72 73 74 20 70 61 72 74 20 69 73 20 75   first part is u
9f10: 6e 6c 6f 63 6b 65 64 20 74 68 65 6e 0a 2a 2a 20  nlocked then.** 
9f20: 73 65 74 20 74 6f 20 61 20 72 65 61 64 20 6c 6f  set to a read lo
9f30: 63 6b 2c 20 74 68 65 6e 20 74 68 65 20 6f 74 68  ck, then the oth
9f40: 65 72 20 70 61 72 74 20 69 73 20 73 69 6d 70 6c  er part is simpl
9f50: 79 20 75 6e 6c 6f 63 6b 65 64 2e 20 20 54 68 69  y unlocked.  Thi
9f60: 73 20 77 6f 72 6b 73 20 0a 2a 2a 20 61 72 6f 75  s works .** arou
9f70: 6e 64 20 61 20 62 75 67 20 69 6e 20 42 53 44 20  nd a bug in BSD 
9f80: 4e 46 53 20 6c 6f 63 6b 64 20 28 61 6c 73 6f 20  NFS lockd (also 
9f90: 73 65 65 6e 20 6f 6e 20 4d 61 63 4f 53 58 20 31  seen on MacOSX 1
9fa0: 30 2e 33 2b 29 20 74 68 61 74 20 66 61 69 6c 73  0.3+) that fails
9fb0: 20 74 6f 20 0a 2a 2a 20 72 65 6d 6f 76 65 20 74   to .** remove t
9fc0: 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e  he write lock on
9fd0: 20 61 20 72 65 67 69 6f 6e 20 77 68 65 6e 20 61   a region when a
9fe0: 20 72 65 61 64 20 6c 6f 63 6b 20 69 73 20 73 65   read lock is se
9ff0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
a000: 20 5f 70 6f 73 69 78 55 6e 6c 6f 63 6b 28 73 71   _posixUnlock(sq
a010: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
a020: 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 2c 20 69  int eFileLock, i
a030: 6e 74 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f  nt handleNFSUnlo
a040: 63 6b 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  ck){.  unixFile 
a050: 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
a060: 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78 49 6e  le*)id;.  unixIn
a070: 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b  odeInfo *pInode;
a080: 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20  .  struct flock 
a090: 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20 72 63 20 3d  lock;.  int rc =
a0a0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
a0b0: 74 20 68 3b 0a 20 20 69 6e 74 20 74 45 72 72 6e  t h;.  int tErrn
a0c0: 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o;              
a0d0: 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72          /* Error
a0e0: 20 63 6f 64 65 20 66 72 6f 6d 20 73 79 73 74 65   code from syste
a0f0: 6d 20 63 61 6c 6c 20 65 72 72 6f 72 73 20 2a 2f  m call errors */
a100: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  ..  assert( pFil
a110: 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  e );.  OSTRACE((
a120: 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77  "UNLOCK  %d %d w
a130: 61 73 20 25 64 28 25 64 2c 25 64 29 20 70 69 64  as %d(%d,%d) pid
a140: 3d 25 64 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70  =%d (unix)\n", p
a150: 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f  File->h, eFileLo
a160: 63 6b 2c 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  ck,.      pFile-
a170: 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c  >eFileLock, pFil
a180: 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65  e->pInode->eFile
a190: 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e 70 49 6e  Lock, pFile->pIn
a1a0: 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2c 0a 20 20  ode->nShared,.  
a1b0: 20 20 20 20 67 65 74 70 69 64 28 29 29 29 3b 0a      getpid()));.
a1c0: 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65  .  assert( eFile
a1d0: 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock<=SHARED_LOC
a1e0: 4b 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65  K );.  if( pFile
a1f0: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 3d 65 46 69  ->eFileLock<=eFi
a200: 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65  leLock ){.    re
a210: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
a220: 20 20 7d 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d    }.  unixEnterM
a230: 75 74 65 78 28 29 3b 0a 20 20 68 20 3d 20 70 46  utex();.  h = pF
a240: 69 6c 65 2d 3e 68 3b 0a 20 20 70 49 6e 6f 64 65  ile->h;.  pInode
a250: 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65   = pFile->pInode
a260: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f  ;.  assert( pIno
a270: 64 65 2d 3e 6e 53 68 61 72 65 64 21 3d 30 20 29  de->nShared!=0 )
a280: 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65  ;.  if( pFile->e
a290: 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f  FileLock>SHARED_
a2a0: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73 73 65  LOCK ){.    asse
a2b0: 72 74 28 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c  rt( pInode->eFil
a2c0: 65 4c 6f 63 6b 3d 3d 70 46 69 6c 65 2d 3e 65 46  eLock==pFile->eF
a2d0: 69 6c 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 53  ileLock );.    S
a2e0: 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65  imulateIOErrorBe
a2f0: 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 53 69 6d  nign(1);.    Sim
a300: 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 68 3d  ulateIOError( h=
a310: 28 2d 31 29 20 29 0a 20 20 20 20 53 69 6d 75 6c  (-1) ).    Simul
a320: 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e  ateIOErrorBenign
a330: 28 30 29 3b 0a 0a 23 69 66 6e 64 65 66 20 4e 44  (0);..#ifndef ND
a340: 45 42 55 47 0a 20 20 20 20 2f 2a 20 57 68 65 6e  EBUG.    /* When
a350: 20 72 65 64 75 63 69 6e 67 20 61 20 6c 6f 63 6b   reducing a lock
a360: 20 73 75 63 68 20 74 68 61 74 20 6f 74 68 65 72   such that other
a370: 20 70 72 6f 63 65 73 73 65 73 20 63 61 6e 20 73   processes can s
a380: 74 61 72 74 0a 20 20 20 20 2a 2a 20 72 65 61 64  tart.    ** read
a390: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
a3a0: 20 66 69 6c 65 20 61 67 61 69 6e 2c 20 6d 61 6b   file again, mak
a3b0: 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65 0a  e sure that the.
a3c0: 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
a3d0: 6f 6e 20 63 6f 75 6e 74 65 72 20 77 61 73 20 75  on counter was u
a3e0: 70 64 61 74 65 64 20 69 66 20 61 6e 79 20 70 61  pdated if any pa
a3f0: 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  rt of the databa
a400: 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 63  se.    ** file c
a410: 68 61 6e 67 65 64 2e 20 20 49 66 20 74 68 65 20  hanged.  If the 
a420: 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e  transaction coun
a430: 74 65 72 20 69 73 20 6e 6f 74 20 75 70 64 61 74  ter is not updat
a440: 65 64 2c 0a 20 20 20 20 2a 2a 20 6f 74 68 65 72  ed,.    ** other
a450: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 6f 20   connections to 
a460: 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20 6d 69  the same file mi
a470: 67 68 74 20 6e 6f 74 20 72 65 61 6c 69 7a 65 20  ght not realize 
a480: 74 68 61 74 0a 20 20 20 20 2a 2a 20 74 68 65 20  that.    ** the 
a490: 66 69 6c 65 20 68 61 73 20 63 68 61 6e 67 65 64  file has changed
a4a0: 20 61 6e 64 20 68 65 6e 63 65 20 6d 69 67 68 74   and hence might
a4b0: 20 6e 6f 74 20 6b 6e 6f 77 20 74 6f 20 66 6c 75   not know to flu
a4c0: 73 68 20 74 68 65 69 72 0a 20 20 20 20 2a 2a 20  sh their.    ** 
a4d0: 63 61 63 68 65 2e 20 20 54 68 65 20 75 73 65 20  cache.  The use 
a4e0: 6f 66 20 61 20 73 74 61 6c 65 20 63 61 63 68 65  of a stale cache
a4f0: 20 63 61 6e 20 6c 65 61 64 20 74 6f 20 64 61 74   can lead to dat
a500: 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
a510: 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 20 30 0a 20  ..    */.#if 0. 
a520: 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65     assert( pFile
a530: 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 3d  ->inNormalWrite=
a540: 3d 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70  =0.         || p
a550: 46 69 6c 65 2d 3e 64 62 55 70 64 61 74 65 3d 3d  File->dbUpdate==
a560: 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 46  0.         || pF
a570: 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68  ile->transCntrCh
a580: 6e 67 3d 3d 31 20 29 3b 0a 23 65 6e 64 69 66 0a  ng==1 );.#endif.
a590: 20 20 20 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72      pFile->inNor
a5a0: 6d 61 6c 57 72 69 74 65 20 3d 20 30 3b 0a 23 65  malWrite = 0;.#e
a5b0: 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 64 6f 77  ndif..    /* dow
a5c0: 6e 67 72 61 64 69 6e 67 20 74 6f 20 61 20 73 68  ngrading to a sh
a5d0: 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 4e 46 53  ared lock on NFS
a5e0: 20 69 6e 76 6f 6c 76 65 73 20 63 6c 65 61 72 69   involves cleari
a5f0: 6e 67 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63  ng the write loc
a600: 6b 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72 65 20  k.    ** before 
a610: 65 73 74 61 62 6c 69 73 68 69 6e 67 20 74 68 65  establishing the
a620: 20 72 65 61 64 6c 6f 63 6b 20 2d 20 74 6f 20 61   readlock - to a
a630: 76 6f 69 64 20 61 20 72 61 63 65 20 63 6f 6e 64  void a race cond
a640: 69 74 69 6f 6e 20 77 65 20 64 6f 77 6e 67 72 61  ition we downgra
a650: 64 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c 6f  de.    ** the lo
a660: 63 6b 20 69 6e 20 32 20 62 6c 6f 63 6b 73 2c 20  ck in 2 blocks, 
a670: 73 6f 20 74 68 61 74 20 70 61 72 74 20 6f 66 20  so that part of 
a680: 74 68 65 20 72 61 6e 67 65 20 77 69 6c 6c 20 62  the range will b
a690: 65 20 63 6f 76 65 72 65 64 20 62 79 20 61 20 0a  e covered by a .
a6a0: 20 20 20 20 2a 2a 20 77 72 69 74 65 20 6c 6f 63      ** write loc
a6b0: 6b 20 75 6e 74 69 6c 20 74 68 65 20 72 65 73 74  k until the rest
a6c0: 20 69 73 20 63 6f 76 65 72 65 64 20 62 79 20 61   is covered by a
a6d0: 20 72 65 61 64 20 6c 6f 63 6b 3a 0a 20 20 20 20   read lock:.    
a6e0: 2a 2a 20 20 31 3a 20 20 20 5b 57 57 57 57 57 5d  **  1:   [WWWWW]
a6f0: 0a 20 20 20 20 2a 2a 20 20 32 3a 20 20 20 5b 2e  .    **  2:   [.
a700: 2e 2e 2e 57 5d 0a 20 20 20 20 2a 2a 20 20 33 3a  ...W].    **  3:
a710: 20 20 20 5b 52 52 52 52 57 5d 0a 20 20 20 20 2a     [RRRRW].    *
a720: 2a 20 20 34 3a 20 20 20 5b 52 52 52 52 2e 5d 0a  *  4:   [RRRR.].
a730: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 65      */.    if( e
a740: 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
a750: 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 69  _LOCK ){.      i
a760: 66 28 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f  f( handleNFSUnlo
a770: 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 6f 66  ck ){.        of
a780: 66 5f 74 20 64 69 76 53 69 7a 65 20 3d 20 53 48  f_t divSize = SH
a790: 41 52 45 44 5f 53 49 5a 45 20 2d 20 31 3b 0a 20  ARED_SIZE - 1;. 
a7a0: 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20         .        
a7b0: 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f  lock.l_type = F_
a7c0: 55 4e 4c 43 4b 3b 0a 20 20 20 20 20 20 20 20 6c  UNLCK;.        l
a7d0: 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53  ock.l_whence = S
a7e0: 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20 20  EEK_SET;.       
a7f0: 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
a800: 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20  SHARED_FIRST;.  
a810: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e        lock.l_len
a820: 20 3d 20 64 69 76 53 69 7a 65 3b 0a 20 20 20 20   = divSize;.    
a830: 20 20 20 20 69 66 28 20 66 63 6e 74 6c 28 68 2c      if( fcntl(h,
a840: 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29   F_SETLK, &lock)
a850: 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20  ==(-1) ){.      
a860: 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72      tErrno = err
a870: 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  no;.          rc
a880: 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
a890: 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
a8a0: 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
a8b0: 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  R_UNLOCK);.     
a8c0: 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b       if( IS_LOCK
a8d0: 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20  _ERROR(rc) ){.  
a8e0: 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
a8f0: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72  >lastErrno = tEr
a900: 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  rno;.          }
a910: 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
a920: 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20  end_unlock;.    
a930: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6c 6f      }.        lo
a940: 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44  ck.l_type = F_RD
a950: 4c 43 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63  LCK;.        loc
a960: 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45  k.l_whence = SEE
a970: 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20 20 20 6c  K_SET;.        l
a980: 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48  ock.l_start = SH
a990: 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20  ARED_FIRST;.    
a9a0: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d      lock.l_len =
a9b0: 20 64 69 76 53 69 7a 65 3b 0a 20 20 20 20 20 20   divSize;.      
a9c0: 20 20 69 66 28 20 66 63 6e 74 6c 28 68 2c 20 46    if( fcntl(h, F
a9d0: 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3d 3d  _SETLK, &lock)==
a9e0: 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20  (-1) ){.        
a9f0: 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f    tErrno = errno
aa00: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
aa10: 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d   sqliteErrorFrom
aa20: 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e  PosixError(tErrn
aa30: 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  o, SQLITE_IOERR_
aa40: 52 44 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20  RDLOCK);.       
aa50: 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
aa60: 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20  RROR(rc) ){.    
aa70: 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c          pFile->l
aa80: 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e  astErrno = tErrn
aa90: 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  o;.          }. 
aaa0: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
aab0: 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20  d_unlock;.      
aac0: 20 20 7d 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b    }.        lock
aad0: 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43  .l_type = F_UNLC
aae0: 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e  K;.        lock.
aaf0: 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f  l_whence = SEEK_
ab00: 53 45 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63  SET;.        loc
ab10: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52  k.l_start = SHAR
ab20: 45 44 5f 46 49 52 53 54 2b 64 69 76 53 69 7a 65  ED_FIRST+divSize
ab30: 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  ;.        lock.l
ab40: 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49  _len = SHARED_SI
ab50: 5a 45 2d 64 69 76 53 69 7a 65 3b 0a 20 20 20 20  ZE-divSize;.    
ab60: 20 20 20 20 69 66 28 20 66 63 6e 74 6c 28 68 2c      if( fcntl(h,
ab70: 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29   F_SETLK, &lock)
ab80: 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20  ==(-1) ){.      
ab90: 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72      tErrno = err
aba0: 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  no;.          rc
abb0: 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
abc0: 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
abd0: 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
abe0: 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  R_UNLOCK);.     
abf0: 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b       if( IS_LOCK
ac00: 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20  _ERROR(rc) ){.  
ac10: 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
ac20: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72  >lastErrno = tEr
ac30: 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  rno;.          }
ac40: 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
ac50: 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20  end_unlock;.    
ac60: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
ac70: 65 7b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e  e{.        lock.
ac80: 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b  l_type = F_RDLCK
ac90: 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  ;.        lock.l
aca0: 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
acb0: 45 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b  ET;.        lock
acc0: 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45  .l_start = SHARE
acd0: 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20 20  D_FIRST;.       
ace0: 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48   lock.l_len = SH
acf0: 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20 20  ARED_SIZE;.     
ad00: 20 20 20 69 66 28 20 66 63 6e 74 6c 28 68 2c 20     if( fcntl(h, 
ad10: 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3d  F_SETLK, &lock)=
ad20: 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20  =(-1) ){.       
ad30: 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e     tErrno = errn
ad40: 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  o;.          rc 
ad50: 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  = sqliteErrorFro
ad60: 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72  mPosixError(tErr
ad70: 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  no, SQLITE_IOERR
ad80: 5f 52 44 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  _RDLOCK);.      
ad90: 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
ada0: 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20  ERROR(rc) ){.   
adb0: 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e           pFile->
adc0: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72  lastErrno = tErr
add0: 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  no;.          }.
ade0: 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
adf0: 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20  nd_unlock;.     
ae00: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
ae10: 20 7d 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79   }.    lock.l_ty
ae20: 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20  pe = F_UNLCK;.  
ae30: 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20    lock.l_whence 
ae40: 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20  = SEEK_SET;.    
ae50: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50  lock.l_start = P
ae60: 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20  ENDING_BYTE;.   
ae70: 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 32 4c   lock.l_len = 2L
ae80: 3b 20 20 61 73 73 65 72 74 28 20 50 45 4e 44 49  ;  assert( PENDI
ae90: 4e 47 5f 42 59 54 45 2b 31 3d 3d 52 45 53 45 52  NG_BYTE+1==RESER
aea0: 56 45 44 5f 42 59 54 45 20 29 3b 0a 20 20 20 20  VED_BYTE );.    
aeb0: 69 66 28 20 66 63 6e 74 6c 28 68 2c 20 46 5f 53  if( fcntl(h, F_S
aec0: 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 21 3d 28 2d  ETLK, &lock)!=(-
aed0: 31 29 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 6f  1) ){.      pIno
aee0: 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  de->eFileLock = 
aef0: 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20  SHARED_LOCK;.   
af00: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 74 45   }else{.      tE
af10: 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
af20: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45      rc = sqliteE
af30: 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
af40: 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54  or(tErrno, SQLIT
af50: 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b  E_IOERR_UNLOCK);
af60: 0a 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f  .      if( IS_LO
af70: 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a  CK_ERROR(rc) ){.
af80: 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c          pFile->l
af90: 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e  astErrno = tErrn
afa0: 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  o;.      }.     
afb0: 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b   goto end_unlock
afc0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
afd0: 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f  ( eFileLock==NO_
afe0: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 44  LOCK ){.    /* D
aff0: 65 63 72 65 6d 65 6e 74 20 74 68 65 20 73 68 61  ecrement the sha
b000: 72 65 64 20 6c 6f 63 6b 20 63 6f 75 6e 74 65 72  red lock counter
b010: 2e 20 20 52 65 6c 65 61 73 65 20 74 68 65 20 6c  .  Release the l
b020: 6f 63 6b 20 75 73 69 6e 67 20 61 6e 0a 20 20 20  ock using an.   
b030: 20 2a 2a 20 4f 53 20 63 61 6c 6c 20 6f 6e 6c 79   ** OS call only
b040: 20 77 68 65 6e 20 61 6c 6c 20 74 68 72 65 61 64   when all thread
b050: 73 20 69 6e 20 74 68 69 73 20 73 61 6d 65 20 70  s in this same p
b060: 72 6f 63 65 73 73 20 68 61 76 65 20 72 65 6c 65  rocess have rele
b070: 61 73 65 64 0a 20 20 20 20 2a 2a 20 74 68 65 20  ased.    ** the 
b080: 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  lock..    */.   
b090: 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
b0a0: 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f  --;.    if( pIno
b0b0: 64 65 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29  de->nShared==0 )
b0c0: 7b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74  {.      lock.l_t
b0d0: 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20  ype = F_UNLCK;. 
b0e0: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e       lock.l_when
b0f0: 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20  ce = SEEK_SET;. 
b100: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72       lock.l_star
b110: 74 20 3d 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d  t = lock.l_len =
b120: 20 30 4c 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c   0L;.      Simul
b130: 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e  ateIOErrorBenign
b140: 28 31 29 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c  (1);.      Simul
b150: 61 74 65 49 4f 45 72 72 6f 72 28 20 68 3d 28 2d  ateIOError( h=(-
b160: 31 29 20 29 0a 20 20 20 20 20 20 53 69 6d 75 6c  1) ).      Simul
b170: 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e  ateIOErrorBenign
b180: 28 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 66  (0);.      if( f
b190: 63 6e 74 6c 28 68 2c 20 46 5f 53 45 54 4c 4b 2c  cntl(h, F_SETLK,
b1a0: 20 26 6c 6f 63 6b 29 21 3d 28 2d 31 29 20 29 7b   &lock)!=(-1) ){
b1b0: 0a 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d  .        pInode-
b1c0: 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f  >eFileLock = NO_
b1d0: 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  LOCK;.      }els
b1e0: 65 7b 0a 20 20 20 20 20 20 20 20 74 45 72 72 6e  e{.        tErrn
b1f0: 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
b200: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72     rc = sqliteEr
b210: 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f  rorFromPosixErro
b220: 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45  r(tErrno, SQLITE
b230: 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a  _IOERR_UNLOCK);.
b240: 20 20 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c          if( IS_L
b250: 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b  OCK_ERROR(rc) ){
b260: 0a 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65  .          pFile
b270: 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45  ->lastErrno = tE
b280: 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 7d 0a  rrno;.        }.
b290: 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e          pInode->
b2a0: 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c  eFileLock = NO_L
b2b0: 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 70 46 69  OCK;.        pFi
b2c0: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
b2d0: 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d  NO_LOCK;.      }
b2e0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44  .    }..    /* D
b2f0: 65 63 72 65 6d 65 6e 74 20 74 68 65 20 63 6f 75  ecrement the cou
b300: 6e 74 20 6f 66 20 6c 6f 63 6b 73 20 61 67 61 69  nt of locks agai
b310: 6e 73 74 20 74 68 69 73 20 73 61 6d 65 20 66 69  nst this same fi
b320: 6c 65 2e 20 20 57 68 65 6e 20 74 68 65 0a 20 20  le.  When the.  
b330: 20 20 2a 2a 20 63 6f 75 6e 74 20 72 65 61 63 68    ** count reach
b340: 65 73 20 7a 65 72 6f 2c 20 63 6c 6f 73 65 20 61  es zero, close a
b350: 6e 79 20 6f 74 68 65 72 20 66 69 6c 65 20 64 65  ny other file de
b360: 73 63 72 69 70 74 6f 72 73 20 77 68 6f 73 65 20  scriptors whose 
b370: 63 6c 6f 73 65 0a 20 20 20 20 2a 2a 20 77 61 73  close.    ** was
b380: 20 64 65 66 65 72 72 65 64 20 62 65 63 61 75 73   deferred becaus
b390: 65 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67  e of outstanding
b3a0: 20 6c 6f 63 6b 73 2e 0a 20 20 20 20 2a 2f 0a 20   locks..    */. 
b3b0: 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b     pInode->nLock
b3c0: 2d 2d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  --;.    assert( 
b3d0: 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e 3d 30  pInode->nLock>=0
b3e0: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f   );.    if( pIno
b3f0: 64 65 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 29 7b 0a  de->nLock==0 ){.
b400: 20 20 20 20 20 20 69 6e 74 20 72 63 32 20 3d 20        int rc2 = 
b410: 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64 73 28  closePendingFds(
b420: 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 69 66  pFile);.      if
b430: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
b440: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
b450: 72 63 32 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rc2;.      }.   
b460: 20 7d 0a 20 20 7d 0a 09 0a 65 6e 64 5f 75 6e 6c   }.  }...end_unl
b470: 6f 63 6b 3a 0a 20 20 75 6e 69 78 4c 65 61 76 65  ock:.  unixLeave
b480: 4d 75 74 65 78 28 29 3b 0a 20 20 69 66 28 20 72  Mutex();.  if( r
b490: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70  c==SQLITE_OK ) p
b4a0: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
b4b0: 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 72  = eFileLock;.  r
b4c0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
b4d0: 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63  ** Lower the loc
b4e0: 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69  king level on fi
b4f0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46  le descriptor pF
b500: 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b  ile to eFileLock
b510: 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20  .  eFileLock.** 
b520: 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e  must be either N
b530: 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44  O_LOCK or SHARED
b540: 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  _LOCK..**.** If 
b550: 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
b560: 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65  l of the file de
b570: 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65  scriptor is alre
b580: 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a  ady at or below.
b590: 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ** the requested
b5a0: 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20   locking level, 
b5b0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
b5c0: 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  a no-op..*/.stat
b5d0: 69 63 20 69 6e 74 20 75 6e 69 78 55 6e 6c 6f 63  ic int unixUnloc
b5e0: 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
b5f0: 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63  id, int eFileLoc
b600: 6b 29 7b 0a 20 20 72 65 74 75 72 6e 20 5f 70 6f  k){.  return _po
b610: 73 69 78 55 6e 6c 6f 63 6b 28 69 64 2c 20 65 46  sixUnlock(id, eF
b620: 69 6c 65 4c 6f 63 6b 2c 20 30 29 3b 0a 7d 0a 0a  ileLock, 0);.}..
b630: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
b640: 69 6f 6e 20 70 65 72 66 6f 72 6d 73 20 74 68 65  ion performs the
b650: 20 70 61 72 74 73 20 6f 66 20 74 68 65 20 22 63   parts of the "c
b660: 6c 6f 73 65 20 66 69 6c 65 22 20 6f 70 65 72 61  lose file" opera
b670: 74 69 6f 6e 20 0a 2a 2a 20 63 6f 6d 6d 6f 6e 20  tion .** common 
b680: 74 6f 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 73  to all locking s
b690: 63 68 65 6d 65 73 2e 20 49 74 20 63 6c 6f 73 65  chemes. It close
b6a0: 73 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  s the directory 
b6b0: 61 6e 64 20 66 69 6c 65 0a 2a 2a 20 68 61 6e 64  and file.** hand
b6c0: 6c 65 73 2c 20 69 66 20 74 68 65 79 20 61 72 65  les, if they are
b6d0: 20 76 61 6c 69 64 2c 20 61 6e 64 20 73 65 74 73   valid, and sets
b6e0: 20 61 6c 6c 20 66 69 65 6c 64 73 20 6f 66 20 74   all fields of t
b6f0: 68 65 20 75 6e 69 78 46 69 6c 65 0a 2a 2a 20 73  he unixFile.** s
b700: 74 72 75 63 74 75 72 65 20 74 6f 20 30 2e 0a 2a  tructure to 0..*
b710: 2a 0a 2a 2a 20 49 74 20 69 73 20 2a 6e 6f 74 2a  *.** It is *not*
b720: 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 68 6f   necessary to ho
b730: 6c 64 20 74 68 65 20 6d 75 74 65 78 20 77 68 65  ld the mutex whe
b740: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
b750: 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 65 76 65  s called,.** eve
b760: 6e 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 20 20 41  n on VxWorks.  A
b770: 20 6d 75 74 65 78 20 77 69 6c 6c 20 62 65 20 61   mutex will be a
b780: 63 71 75 69 72 65 64 20 6f 6e 20 56 78 57 6f 72  cquired on VxWor
b790: 6b 73 20 62 79 20 74 68 65 0a 2a 2a 20 76 78 77  ks by the.** vxw
b7a0: 6f 72 6b 73 52 65 6c 65 61 73 65 46 69 6c 65 49  orksReleaseFileI
b7b0: 64 28 29 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a  d() routine..*/.
b7c0: 73 74 61 74 69 63 20 69 6e 74 20 63 6c 6f 73 65  static int close
b7d0: 55 6e 69 78 46 69 6c 65 28 73 71 6c 69 74 65 33  UnixFile(sqlite3
b7e0: 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 75 6e  _file *id){.  un
b7f0: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
b800: 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
b810: 20 69 66 28 20 70 46 69 6c 65 20 29 7b 0a 20 20   if( pFile ){.  
b820: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 64 69 72    if( pFile->dir
b830: 66 64 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  fd>=0 ){.      i
b840: 6e 74 20 65 72 72 20 3d 20 63 6c 6f 73 65 28 70  nt err = close(p
b850: 46 69 6c 65 2d 3e 64 69 72 66 64 29 3b 0a 20 20  File->dirfd);.  
b860: 20 20 20 20 69 66 28 20 65 72 72 20 29 7b 0a 20      if( err ){. 
b870: 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61         pFile->la
b880: 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b  stErrno = errno;
b890: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
b8a0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49 52  SQLITE_IOERR_DIR
b8b0: 5f 43 4c 4f 53 45 3b 0a 20 20 20 20 20 20 7d 65  _CLOSE;.      }e
b8c0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 46 69  lse{.        pFi
b8d0: 6c 65 2d 3e 64 69 72 66 64 3d 2d 31 3b 0a 20 20  le->dirfd=-1;.  
b8e0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
b8f0: 69 66 28 20 70 46 69 6c 65 2d 3e 68 3e 3d 30 20  if( pFile->h>=0 
b900: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 65 72 72  ){.      int err
b910: 20 3d 20 63 6c 6f 73 65 28 70 46 69 6c 65 2d 3e   = close(pFile->
b920: 68 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65 72  h);.      if( er
b930: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69  r ){.        pFi
b940: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
b950: 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 72  errno;.        r
b960: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
b970: 52 52 5f 43 4c 4f 53 45 3b 0a 20 20 20 20 20 20  RR_CLOSE;.      
b980: 7d 0a 20 20 20 20 7d 0a 23 69 66 20 4f 53 5f 56  }.    }.#if OS_V
b990: 58 57 4f 52 4b 53 0a 20 20 20 20 69 66 28 20 70  XWORKS.    if( p
b9a0: 46 69 6c 65 2d 3e 70 49 64 20 29 7b 0a 20 20 20  File->pId ){.   
b9b0: 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 69 73     if( pFile->is
b9c0: 44 65 6c 65 74 65 20 29 7b 0a 20 20 20 20 20 20  Delete ){.      
b9d0: 20 20 75 6e 6c 69 6e 6b 28 70 46 69 6c 65 2d 3e    unlink(pFile->
b9e0: 70 49 64 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e  pId->zCanonicalN
b9f0: 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ame);.      }.  
ba00: 20 20 20 20 76 78 77 6f 72 6b 73 52 65 6c 65 61      vxworksRelea
ba10: 73 65 46 69 6c 65 49 64 28 70 46 69 6c 65 2d 3e  seFileId(pFile->
ba20: 70 49 64 29 3b 0a 20 20 20 20 20 20 70 46 69 6c  pId);.      pFil
ba30: 65 2d 3e 70 49 64 20 3d 20 30 3b 0a 20 20 20 20  e->pId = 0;.    
ba40: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 4f 53 54  }.#endif.    OST
ba50: 52 41 43 45 28 28 22 43 4c 4f 53 45 20 20 20 25  RACE(("CLOSE   %
ba60: 2d 33 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  -3d\n", pFile->h
ba70: 29 29 3b 0a 20 20 20 20 4f 70 65 6e 43 6f 75 6e  ));.    OpenCoun
ba80: 74 65 72 28 2d 31 29 3b 0a 20 20 20 20 73 71 6c  ter(-1);.    sql
ba90: 69 74 65 33 5f 66 72 65 65 28 70 46 69 6c 65 2d  ite3_free(pFile-
baa0: 3e 70 55 6e 75 73 65 64 29 3b 0a 20 20 20 20 6d  >pUnused);.    m
bab0: 65 6d 73 65 74 28 70 46 69 6c 65 2c 20 30 2c 20  emset(pFile, 0, 
bac0: 73 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65 29  sizeof(unixFile)
bad0: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
bae0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
baf0: 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65  .** Close a file
bb00: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
bb10: 75 6e 69 78 43 6c 6f 73 65 28 73 71 6c 69 74 65  unixClose(sqlite
bb20: 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 69  3_file *id){.  i
bb30: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
bb40: 4b 3b 0a 20 20 69 66 28 20 69 64 20 29 7b 0a 20  K;.  if( id ){. 
bb50: 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69     unixFile *pFi
bb60: 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a  le = (unixFile *
bb70: 29 69 64 3b 0a 20 20 20 20 75 6e 69 78 55 6e 6c  )id;.    unixUnl
bb80: 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29  ock(id, NO_LOCK)
bb90: 3b 0a 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d  ;.    unixEnterM
bba0: 75 74 65 78 28 29 3b 0a 20 20 20 20 69 66 28 20  utex();.    if( 
bbb0: 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 26 26  pFile->pInode &&
bbc0: 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e   pFile->pInode->
bbd0: 6e 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 2f  nLock ){.      /
bbe0: 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6f  * If there are o
bbf0: 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73  utstanding locks
bc00: 2c 20 64 6f 20 6e 6f 74 20 61 63 74 75 61 6c 6c  , do not actuall
bc10: 79 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65  y close the file
bc20: 20 6a 75 73 74 0a 20 20 20 20 20 20 2a 2a 20 79   just.      ** y
bc30: 65 74 20 62 65 63 61 75 73 65 20 74 68 61 74 20  et because that 
bc40: 77 6f 75 6c 64 20 63 6c 65 61 72 20 74 68 6f 73  would clear thos
bc50: 65 20 6c 6f 63 6b 73 2e 20 20 49 6e 73 74 65 61  e locks.  Instea
bc60: 64 2c 20 61 64 64 20 74 68 65 20 66 69 6c 65 0a  d, add the file.
bc70: 20 20 20 20 20 20 2a 2a 20 64 65 73 63 72 69 70        ** descrip
bc80: 74 6f 72 20 74 6f 20 70 49 6e 6f 64 65 2d 3e 70  tor to pInode->p
bc90: 55 6e 75 73 65 64 20 6c 69 73 74 2e 20 20 49 74  Unused list.  It
bca0: 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74   will be automat
bcb0: 69 63 61 6c 6c 79 20 63 6c 6f 73 65 64 20 0a 20  ically closed . 
bcc0: 20 20 20 20 20 2a 2a 20 77 68 65 6e 20 74 68 65       ** when the
bcd0: 20 6c 61 73 74 20 6c 6f 63 6b 20 69 73 20 63 6c   last lock is cl
bce0: 65 61 72 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a  eared..      */.
bcf0: 20 20 20 20 20 20 73 65 74 50 65 6e 64 69 6e 67        setPending
bd00: 46 64 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 7d  Fd(pFile);.    }
bd10: 0a 20 20 20 20 72 65 6c 65 61 73 65 49 6e 6f 64  .    releaseInod
bd20: 65 49 6e 66 6f 28 70 46 69 6c 65 2d 3e 70 49 6e  eInfo(pFile->pIn
bd30: 6f 64 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 63  ode);.    rc = c
bd40: 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29  loseUnixFile(id)
bd50: 3b 0a 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d  ;.    unixLeaveM
bd60: 75 74 65 78 28 29 3b 0a 20 20 7d 0a 20 20 72 65  utex();.  }.  re
bd70: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 2a 2a  turn rc;.}../***
bd80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20  *********** End 
bd90: 6f 66 20 74 68 65 20 70 6f 73 69 78 20 61 64 76  of the posix adv
bda0: 69 73 6f 72 79 20 6c 6f 63 6b 20 69 6d 70 6c 65  isory lock imple
bdb0: 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a  mentation ******
bdc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
bdd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
bde0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
bdf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
be00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
be10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a  **********/../**
be20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
be30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
be40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
be50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
be60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
be70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
be80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e 6f 2d 6f  *********** No-o
be90: 70 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a  p Locking ******
bea0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
beb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a  ************.**.
bec0: 2a 2a 20 4f 66 20 74 68 65 20 76 61 72 69 6f 75  ** Of the variou
bed0: 73 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c 65 6d  s locking implem
bee0: 65 6e 74 61 74 69 6f 6e 73 20 61 76 61 69 6c 61  entations availa
bef0: 62 6c 65 2c 20 74 68 69 73 20 69 73 20 62 79 20  ble, this is by 
bf00: 66 61 72 20 74 68 65 0a 2a 2a 20 73 69 6d 70 6c  far the.** simpl
bf10: 65 73 74 3a 20 20 6c 6f 63 6b 69 6e 67 20 69 73  est:  locking is
bf20: 20 69 67 6e 6f 72 65 64 2e 20 20 4e 6f 20 61 74   ignored.  No at
bf30: 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f  tempt is made to
bf40: 20 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61   lock the databa
bf50: 73 65 0a 2a 2a 20 66 69 6c 65 20 66 6f 72 20 72  se.** file for r
bf60: 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e  eading or writin
bf70: 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6c 6f  g..**.** This lo
bf80: 63 6b 69 6e 67 20 6d 6f 64 65 20 69 73 20 61 70  cking mode is ap
bf90: 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 75 73  propriate for us
bfa0: 65 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79 20 64  e on read-only d
bfb0: 61 74 61 62 61 73 65 73 0a 2a 2a 20 28 65 78 3a  atabases.** (ex:
bfc0: 20 64 61 74 61 62 61 73 65 73 20 74 68 61 74 20   databases that 
bfd0: 61 72 65 20 62 75 72 6e 65 64 20 69 6e 74 6f 20  are burned into 
bfe0: 43 44 2d 52 4f 4d 2c 20 66 6f 72 20 65 78 61 6d  CD-ROM, for exam
bff0: 70 6c 65 2e 29 20 20 49 74 20 63 61 6e 0a 2a 2a  ple.)  It can.**
c000: 20 61 6c 73 6f 20 62 65 20 75 73 65 64 20 69 66   also be used if
c010: 20 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e   the application
c020: 20 65 6d 70 6c 6f 79 73 20 73 6f 6d 65 20 65 78   employs some ex
c030: 74 65 72 6e 61 6c 20 6d 65 63 68 61 6e 69 73 6d  ternal mechanism
c040: 20 74 6f 0a 2a 2a 20 70 72 65 76 65 6e 74 20 73   to.** prevent s
c050: 69 6d 75 6c 74 61 6e 65 6f 75 73 20 61 63 63 65  imultaneous acce
c060: 73 73 20 6f 66 20 74 68 65 20 73 61 6d 65 20 64  ss of the same d
c070: 61 74 61 62 61 73 65 20 62 79 20 74 77 6f 20 6f  atabase by two o
c080: 72 20 6d 6f 72 65 0a 2a 2a 20 64 61 74 61 62 61  r more.** databa
c090: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 20  se connections. 
c0a0: 20 42 75 74 20 74 68 65 72 65 20 69 73 20 61 20   But there is a 
c0b0: 73 65 72 69 6f 75 73 20 72 69 73 6b 20 6f 66 20  serious risk of 
c0c0: 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 72 72  database.** corr
c0d0: 75 70 74 69 6f 6e 20 69 66 20 74 68 69 73 20 6c  uption if this l
c0e0: 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 69 73 20 75  ocking mode is u
c0f0: 73 65 64 20 69 6e 20 73 69 74 75 61 74 69 6f 6e  sed in situation
c100: 73 20 77 68 65 72 65 20 6d 75 6c 74 69 70 6c 65  s where multiple
c110: 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e  .** database con
c120: 6e 65 63 74 69 6f 6e 73 20 61 72 65 20 61 63 63  nections are acc
c130: 65 73 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20  essing the same 
c140: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74  database file at
c150: 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 74 69 6d   the same.** tim
c160: 65 20 61 6e 64 20 6f 6e 65 20 6f 72 20 6d 6f 72  e and one or mor
c170: 65 20 6f 66 20 74 68 6f 73 65 20 63 6f 6e 6e 65  e of those conne
c180: 63 74 69 6f 6e 73 20 61 72 65 20 77 72 69 74 69  ctions are writi
c190: 6e 67 2e 0a 2a 2f 0a 0a 73 74 61 74 69 63 20 69  ng..*/..static i
c1a0: 6e 74 20 6e 6f 6c 6f 63 6b 43 68 65 63 6b 52 65  nt nolockCheckRe
c1b0: 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74  servedLock(sqlit
c1c0: 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64  e3_file *NotUsed
c1d0: 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b  , int *pResOut){
c1e0: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
c1f0: 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
c200: 2a 70 52 65 73 4f 75 74 20 3d 20 30 3b 0a 20 20  *pResOut = 0;.  
c210: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
c220: 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 6e  ;.}.static int n
c230: 6f 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69 74 65  olockLock(sqlite
c240: 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64 2c  3_file *NotUsed,
c250: 20 69 6e 74 20 4e 6f 74 55 73 65 64 32 29 7b 0a   int NotUsed2){.
c260: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
c270: 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74  ER2(NotUsed, Not
c280: 55 73 65 64 32 29 3b 0a 20 20 72 65 74 75 72 6e  Used2);.  return
c290: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 73 74   SQLITE_OK;.}.st
c2a0: 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 55  atic int nolockU
c2b0: 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  nlock(sqlite3_fi
c2c0: 6c 65 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74  le *NotUsed, int
c2d0: 20 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20 55 4e   NotUsed2){.  UN
c2e0: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 32 28  USED_PARAMETER2(
c2f0: 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73 65 64  NotUsed, NotUsed
c300: 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  2);.  return SQL
c310: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
c320: 20 43 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 2e   Close the file.
c330: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e  .*/.static int n
c340: 6f 6c 6f 63 6b 43 6c 6f 73 65 28 73 71 6c 69 74  olockClose(sqlit
c350: 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20  e3_file *id) {. 
c360: 20 72 65 74 75 72 6e 20 63 6c 6f 73 65 55 6e 69   return closeUni
c370: 78 46 69 6c 65 28 69 64 29 3b 0a 7d 0a 0a 2f 2a  xFile(id);.}../*
c380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c390: 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6e 6f  ** End of the no
c3a0: 2d 6f 70 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65  -op lock impleme
c3b0: 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a  ntation ********
c3c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
c3d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c3e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c3f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c400: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c410: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f  ************/../
c420: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c430: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c440: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c450: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c460: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
c470: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c480: 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 64  ******** Begin d
c490: 6f 74 2d 66 69 6c 65 20 4c 6f 63 6b 69 6e 67 20  ot-file Locking 
c4a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c4b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
c4c0: 2a 0a 2a 2a 20 54 68 65 20 64 6f 74 66 69 6c 65  *.** The dotfile
c4d0: 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c 65 6d 65   locking impleme
c4e0: 6e 74 61 74 69 6f 6e 20 75 73 65 73 20 74 68 65  ntation uses the
c4f0: 20 65 78 69 73 74 61 6e 63 65 20 6f 66 20 73 65   existance of se
c500: 70 61 72 61 74 65 20 6c 6f 63 6b 0a 2a 2a 20 66  parate lock.** f
c510: 69 6c 65 73 20 69 6e 20 6f 72 64 65 72 20 74 6f  iles in order to
c520: 20 63 6f 6e 74 72 6f 6c 20 61 63 63 65 73 73 20   control access 
c530: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  to the database.
c540: 20 20 54 68 69 73 20 77 6f 72 6b 73 20 6f 6e 20    This works on 
c550: 6a 75 73 74 0a 2a 2a 20 61 62 6f 75 74 20 65 76  just.** about ev
c560: 65 72 79 20 66 69 6c 65 73 79 73 74 65 6d 20 69  ery filesystem i
c570: 6d 61 67 69 6e 61 62 6c 65 2e 20 20 42 75 74 20  maginable.  But 
c580: 74 68 65 72 65 20 61 72 65 20 73 65 72 69 6f 75  there are seriou
c590: 73 20 64 6f 77 6e 73 69 64 65 73 3a 0a 2a 2a 0a  s downsides:.**.
c5a0: 2a 2a 20 20 20 20 28 31 29 20 20 54 68 65 72 65  **    (1)  There
c5b0: 20 69 73 20 7a 65 72 6f 20 63 6f 6e 63 75 72 72   is zero concurr
c5c0: 65 6e 63 79 2e 20 20 41 20 73 69 6e 67 6c 65 20  ency.  A single 
c5d0: 72 65 61 64 65 72 20 62 6c 6f 63 6b 73 20 61 6c  reader blocks al
c5e0: 6c 20 6f 74 68 65 72 0a 2a 2a 20 20 20 20 20 20  l other.**      
c5f0: 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 66     connections f
c600: 72 6f 6d 20 72 65 61 64 69 6e 67 20 6f 72 20 77  rom reading or w
c610: 72 69 74 69 6e 67 20 74 68 65 20 64 61 74 61 62  riting the datab
c620: 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32  ase..**.**    (2
c630: 29 20 20 41 6e 20 61 70 70 6c 69 63 61 74 69 6f  )  An applicatio
c640: 6e 20 63 72 61 73 68 20 6f 72 20 70 6f 77 65 72  n crash or power
c650: 20 6c 6f 73 73 20 63 61 6e 20 6c 65 61 76 65 20   loss can leave 
c660: 73 74 61 6c 65 20 6c 6f 63 6b 20 66 69 6c 65 73  stale lock files
c670: 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 69 74 74  .**         sitt
c680: 69 6e 67 20 61 72 6f 75 6e 64 20 74 68 61 74 20  ing around that 
c690: 6e 65 65 64 20 74 6f 20 62 65 20 63 6c 65 61 72  need to be clear
c6a0: 65 64 20 6d 61 6e 75 61 6c 6c 79 2e 0a 2a 2a 0a  ed manually..**.
c6b0: 2a 2a 20 4e 65 76 65 72 74 68 65 6c 65 73 73 2c  ** Nevertheless,
c6c0: 20 61 20 64 6f 74 6c 6f 63 6b 20 69 73 20 61 6e   a dotlock is an
c6d0: 20 61 70 70 72 6f 70 72 69 61 74 65 20 6c 6f 63   appropriate loc
c6e0: 6b 69 6e 67 20 6d 6f 64 65 20 66 6f 72 20 75 73  king mode for us
c6f0: 65 20 69 66 20 6e 6f 0a 2a 2a 20 6f 74 68 65 72  e if no.** other
c700: 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74 65 67   locking strateg
c710: 79 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 0a  y is available..
c720: 2a 2a 0a 2a 2a 20 44 6f 74 66 69 6c 65 20 6c 6f  **.** Dotfile lo
c730: 63 6b 69 6e 67 20 77 6f 72 6b 73 20 62 79 20 63  cking works by c
c740: 72 65 61 74 69 6e 67 20 61 20 66 69 6c 65 20 69  reating a file i
c750: 6e 20 74 68 65 20 73 61 6d 65 20 64 69 72 65 63  n the same direc
c760: 74 6f 72 79 20 61 73 20 74 68 65 0a 2a 2a 20 64  tory as the.** d
c770: 61 74 61 62 61 73 65 20 61 6e 64 20 77 69 74 68  atabase and with
c780: 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 62   the same name b
c790: 75 74 20 77 69 74 68 20 61 20 22 2e 6c 6f 63 6b  ut with a ".lock
c7a0: 22 20 65 78 74 65 6e 73 69 6f 6e 20 61 64 64 65  " extension adde
c7b0: 64 2e 0a 2a 2a 20 54 68 65 20 65 78 69 73 74 61  d..** The exista
c7c0: 6e 63 65 20 6f 66 20 61 20 6c 6f 63 6b 20 66 69  nce of a lock fi
c7d0: 6c 65 20 69 6d 70 6c 69 65 73 20 61 6e 20 45 58  le implies an EX
c7e0: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 41  CLUSIVE lock.  A
c7f0: 6c 6c 20 6f 74 68 65 72 20 6c 6f 63 6b 0a 2a 2a  ll other lock.**
c800: 20 74 79 70 65 73 20 28 53 48 41 52 45 44 2c 20   types (SHARED, 
c810: 52 45 53 45 52 56 45 44 2c 20 50 45 4e 44 49 4e  RESERVED, PENDIN
c820: 47 29 20 61 72 65 20 6d 61 70 70 65 64 20 69 6e  G) are mapped in
c830: 74 6f 20 45 58 43 4c 55 53 49 56 45 2e 0a 2a 2f  to EXCLUSIVE..*/
c840: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69 6c 65  ../*.** The file
c850: 20 73 75 66 66 69 78 20 61 64 64 65 64 20 74 6f   suffix added to
c860: 20 74 68 65 20 64 61 74 61 20 62 61 73 65 20 66   the data base f
c870: 69 6c 65 6e 61 6d 65 20 69 6e 20 6f 72 64 65 72  ilename in order
c880: 20 74 6f 20 63 72 65 61 74 65 20 74 68 65 0a 2a   to create the.*
c890: 2a 20 6c 6f 63 6b 20 66 69 6c 65 2e 0a 2a 2f 0a  * lock file..*/.
c8a0: 23 64 65 66 69 6e 65 20 44 4f 54 4c 4f 43 4b 5f  #define DOTLOCK_
c8b0: 53 55 46 46 49 58 20 22 2e 6c 6f 63 6b 22 0a 0a  SUFFIX ".lock"..
c8c0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
c8d0: 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74 68 65  ne checks if the
c8e0: 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44  re is a RESERVED
c8f0: 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68   lock held on th
c900: 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66  e specified.** f
c910: 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20 61  ile by this or a
c920: 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  ny other process
c930: 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b  . If such a lock
c940: 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70   is held, set *p
c950: 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e  ResOut.** to a n
c960: 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74  on-zero value ot
c970: 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74  herwise *pResOut
c980: 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e   is set to zero.
c990: 20 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c    The return val
c9a0: 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20  ue.** is set to 
c9b0: 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73  SQLITE_OK unless
c9c0: 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63   an I/O error oc
c9d0: 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b  curs during lock
c9e0: 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a   checking..**.**
c9f0: 20 49 6e 20 64 6f 74 66 69 6c 65 20 6c 6f 63 6b   In dotfile lock
ca00: 69 6e 67 2c 20 65 69 74 68 65 72 20 61 20 6c 6f  ing, either a lo
ca10: 63 6b 20 65 78 69 73 74 73 20 6f 72 20 69 74 20  ck exists or it 
ca20: 64 6f 65 73 20 6e 6f 74 2e 20 20 53 6f 20 69 6e  does not.  So in
ca30: 20 74 68 69 73 0a 2a 2a 20 76 61 72 69 61 74 69   this.** variati
ca40: 6f 6e 20 6f 66 20 43 68 65 63 6b 52 65 73 65 72  on of CheckReser
ca50: 76 65 64 4c 6f 63 6b 28 29 2c 20 2a 70 52 65 73  vedLock(), *pRes
ca60: 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 74 72  Out is set to tr
ca70: 75 65 20 69 66 20 61 6e 79 20 6c 6f 63 6b 0a 2a  ue if any lock.*
ca80: 2a 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65  * is held on the
ca90: 20 66 69 6c 65 20 61 6e 64 20 66 61 6c 73 65 20   file and false 
caa0: 69 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 75  if the file is u
cab0: 6e 6c 6f 63 6b 65 64 2e 0a 2a 2f 0a 73 74 61 74  nlocked..*/.stat
cac0: 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 43 68  ic int dotlockCh
cad0: 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28  eckReservedLock(
cae0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
caf0: 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 20  , int *pResOut) 
cb00: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
cb10: 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65  ITE_OK;.  int re
cb20: 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e  served = 0;.  un
cb30: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
cb40: 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a  (unixFile*)id;..
cb50: 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
cb60: 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
cb70: 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45  _IOERR_CHECKRESE
cb80: 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a  RVEDLOCK; );.  .
cb90: 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
cba0: 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69  );..  /* Check i
cbb0: 66 20 61 20 74 68 72 65 61 64 20 69 6e 20 74 68  f a thread in th
cbc0: 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73  is process holds
cbd0: 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a   such a lock */.
cbe0: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69    if( pFile->eFi
cbf0: 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f  leLock>SHARED_LO
cc00: 43 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 45 69 74  CK ){.    /* Eit
cc10: 68 65 72 20 74 68 69 73 20 63 6f 6e 6e 65 63 74  her this connect
cc20: 69 6f 6e 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65  ion or some othe
cc30: 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 20  r connection in 
cc40: 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73  the same process
cc50: 0a 20 20 20 20 2a 2a 20 68 6f 6c 64 73 20 61 20  .    ** holds a 
cc60: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65  lock on the file
cc70: 2e 20 20 4e 6f 20 6e 65 65 64 20 74 6f 20 63 68  .  No need to ch
cc80: 65 63 6b 20 66 75 72 74 68 65 72 2e 20 2a 2f 0a  eck further. */.
cc90: 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31      reserved = 1
cca0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
ccb0: 2a 20 54 68 65 20 6c 6f 63 6b 20 69 73 20 68 65  * The lock is he
ccc0: 6c 64 20 69 66 20 61 6e 64 20 6f 6e 6c 79 20 69  ld if and only i
ccd0: 66 20 74 68 65 20 6c 6f 63 6b 66 69 6c 65 20 65  f the lockfile e
cce0: 78 69 73 74 73 20 2a 2f 0a 20 20 20 20 63 6f 6e  xists */.    con
ccf0: 73 74 20 63 68 61 72 20 2a 7a 4c 6f 63 6b 46 69  st char *zLockFi
cd00: 6c 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  le = (const char
cd10: 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  *)pFile->locking
cd20: 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 72 65 73  Context;.    res
cd30: 65 72 76 65 64 20 3d 20 61 63 63 65 73 73 28 7a  erved = access(z
cd40: 4c 6f 63 6b 46 69 6c 65 2c 20 30 29 3d 3d 30 3b  LockFile, 0)==0;
cd50: 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28  .  }.  OSTRACE((
cd60: 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64  "TEST WR-LOCK %d
cd70: 20 25 64 20 25 64 20 28 64 6f 74 6c 6f 63 6b 29   %d %d (dotlock)
cd80: 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72  \n", pFile->h, r
cd90: 63 2c 20 72 65 73 65 72 76 65 64 29 29 3b 0a 20  c, reserved));. 
cda0: 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65   *pResOut = rese
cdb0: 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72  rved;.  return r
cdc0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b  c;.}../*.** Lock
cdd0: 20 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74   the file with t
cde0: 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65  he lock specifie
cdf0: 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 65  d by parameter e
ce00: 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a  FileLock - one.*
ce10: 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  * of the followi
ce20: 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31  ng:.**.**     (1
ce30: 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a  ) SHARED_LOCK.**
ce40: 20 20 20 20 20 28 32 29 20 52 45 53 45 52 56 45       (2) RESERVE
ce50: 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33  D_LOCK.**     (3
ce60: 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a  ) PENDING_LOCK.*
ce70: 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c 55 53  *     (4) EXCLUS
ce80: 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53  IVE_LOCK.**.** S
ce90: 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65  ometimes when re
cea0: 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63  questing one loc
ceb0: 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f  k state, additio
cec0: 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a  nal lock states.
ced0: 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64 20  ** are inserted 
cee0: 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65  in between.  The
cef0: 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66   locking might f
cf00: 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68  ail on one of th
cf10: 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73  e later.** trans
cf20: 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74  itions leaving t
cf30: 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69  he lock state di
cf40: 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61  fferent from wha
cf50: 74 20 69 74 20 73 74 61 72 74 65 64 20 62 75 74  t it started but
cf60: 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20  .** still short 
cf70: 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68  of its goal.  Th
cf80: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72  e following char
cf90: 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f  t shows the allo
cfa0: 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  wed.** transitio
cfb0: 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72  ns and the inser
cfc0: 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65  ted intermediate
cfd0: 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20   states:.**.**  
cfe0: 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48    UNLOCKED -> SH
cff0: 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  ARED.**    SHARE
d000: 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a  D -> RESERVED.**
d010: 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50      SHARED -> (P
d020: 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
d030: 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52  SIVE.**    RESER
d040: 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  VED -> (PENDING)
d050: 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
d060: 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45      PENDING -> E
d070: 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54  XCLUSIVE.**.** T
d080: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
d090: 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61   only increase a
d0a0: 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20   lock.  Use the 
d0b0: 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28  sqlite3OsUnlock(
d0c0: 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20  ).** routine to 
d0d0: 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20  lower a locking 
d0e0: 6c 65 76 65 6c 2e 0a 2a 2a 0a 2a 2a 20 57 69 74  level..**.** Wit
d0f0: 68 20 64 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e  h dotfile lockin
d100: 67 2c 20 77 65 20 72 65 61 6c 6c 79 20 6f 6e 6c  g, we really onl
d110: 79 20 73 75 70 70 6f 72 74 20 73 74 61 74 65 20  y support state 
d120: 28 34 29 3a 20 45 58 43 4c 55 53 49 56 45 2e 0a  (4): EXCLUSIVE..
d130: 2a 2a 20 42 75 74 20 77 65 20 74 72 61 63 6b 20  ** But we track 
d140: 74 68 65 20 6f 74 68 65 72 20 6c 6f 63 6b 69 6e  the other lockin
d150: 67 20 6c 65 76 65 6c 73 20 69 6e 74 65 72 6e 61  g levels interna
d160: 6c 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  lly..*/.static i
d170: 6e 74 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 28 73  nt dotlockLock(s
d180: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
d190: 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20   int eFileLock) 
d1a0: 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  {.  unixFile *pF
d1b0: 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
d1c0: 29 69 64 3b 0a 20 20 69 6e 74 20 66 64 3b 0a 20  )id;.  int fd;. 
d1d0: 20 63 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65   char *zLockFile
d1e0: 20 3d 20 28 63 68 61 72 20 2a 29 70 46 69 6c 65   = (char *)pFile
d1f0: 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
d200: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
d210: 49 54 45 5f 4f 4b 3b 0a 0a 0a 20 20 2f 2a 20 49  ITE_OK;...  /* I
d220: 66 20 77 65 20 68 61 76 65 20 61 6e 79 20 6c 6f  f we have any lo
d230: 63 6b 2c 20 74 68 65 6e 20 74 68 65 20 6c 6f 63  ck, then the loc
d240: 6b 20 66 69 6c 65 20 61 6c 72 65 61 64 79 20 65  k file already e
d250: 78 69 73 74 73 2e 20 20 41 6c 6c 20 77 65 20 68  xists.  All we h
d260: 61 76 65 0a 20 20 2a 2a 20 74 6f 20 64 6f 20 69  ave.  ** to do i
d270: 73 20 61 64 6a 75 73 74 20 6f 75 72 20 69 6e 74  s adjust our int
d280: 65 72 6e 61 6c 20 72 65 63 6f 72 64 20 6f 66 20  ernal record of 
d290: 74 68 65 20 6c 6f 63 6b 20 6c 65 76 65 6c 2e 0a  the lock level..
d2a0: 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65    */.  if( pFile
d2b0: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3e 20 4e 4f  ->eFileLock > NO
d2c0: 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46 69  _LOCK ){.    pFi
d2d0: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
d2e0: 65 46 69 6c 65 4c 6f 63 6b 3b 0a 23 69 66 20 21  eFileLock;.#if !
d2f0: 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 20 20 2f  OS_VXWORKS.    /
d300: 2a 20 41 6c 77 61 79 73 20 75 70 64 61 74 65 20  * Always update 
d310: 74 68 65 20 74 69 6d 65 73 74 61 6d 70 20 6f 6e  the timestamp on
d320: 20 74 68 65 20 6f 6c 64 20 66 69 6c 65 20 2a 2f   the old file */
d330: 0a 20 20 20 20 75 74 69 6d 65 73 28 7a 4c 6f 63  .    utimes(zLoc
d340: 6b 46 69 6c 65 2c 20 4e 55 4c 4c 29 3b 0a 23 65  kFile, NULL);.#e
d350: 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20  ndif.    return 
d360: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
d370: 20 0a 20 20 2f 2a 20 67 72 61 62 20 61 6e 20 65   .  /* grab an e
d380: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 2a 2f  xclusive lock */
d390: 0a 20 20 66 64 20 3d 20 6f 70 65 6e 28 7a 4c 6f  .  fd = open(zLo
d3a0: 63 6b 46 69 6c 65 2c 4f 5f 52 44 4f 4e 4c 59 7c  ckFile,O_RDONLY|
d3b0: 4f 5f 43 52 45 41 54 7c 4f 5f 45 58 43 4c 2c 30  O_CREAT|O_EXCL,0
d3c0: 36 30 30 29 3b 0a 20 20 69 66 28 20 66 64 3c 30  600);.  if( fd<0
d3d0: 20 29 7b 0a 20 20 20 20 2f 2a 20 66 61 69 6c 65   ){.    /* faile
d3e0: 64 20 74 6f 20 6f 70 65 6e 2f 63 72 65 61 74 65  d to open/create
d3f0: 20 74 68 65 20 66 69 6c 65 2c 20 73 6f 6d 65 6f   the file, someo
d400: 6e 65 20 65 6c 73 65 20 6d 61 79 20 68 61 76 65  ne else may have
d410: 20 73 74 6f 6c 65 6e 20 74 68 65 20 6c 6f 63 6b   stolen the lock
d420: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 74 45 72 72   */.    int tErr
d430: 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
d440: 69 66 28 20 45 45 58 49 53 54 20 3d 3d 20 74 45  if( EEXIST == tE
d450: 72 72 6e 6f 20 29 7b 0a 20 20 20 20 20 20 72 63  rrno ){.      rc
d460: 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
d470: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
d480: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72     rc = sqliteEr
d490: 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f  rorFromPosixErro
d4a0: 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45  r(tErrno, SQLITE
d4b0: 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20  _IOERR_LOCK);.  
d4c0: 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
d4d0: 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20  ERROR(rc) ){.   
d4e0: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
d4f0: 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a  Errno = tErrno;.
d500: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
d510: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
d520: 20 0a 20 20 69 66 28 20 63 6c 6f 73 65 28 66 64   .  if( close(fd
d530: 29 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  ) ){.    pFile->
d540: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  lastErrno = errn
d550: 6f 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  o;.    rc = SQLI
d560: 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53 45 3b 0a  TE_IOERR_CLOSE;.
d570: 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 67 6f 74 20    }.  .  /* got 
d580: 69 74 2c 20 73 65 74 20 74 68 65 20 74 79 70 65  it, set the type
d590: 20 61 6e 64 20 72 65 74 75 72 6e 20 6f 6b 20 2a   and return ok *
d5a0: 2f 0a 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  /.  pFile->eFile
d5b0: 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b  Lock = eFileLock
d5c0: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
d5d0: 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68  ../*.** Lower th
d5e0: 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
d5f0: 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  on file descript
d600: 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c  or pFile to eFil
d610: 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63  eLock.  eFileLoc
d620: 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74  k.** must be eit
d630: 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53  her NO_LOCK or S
d640: 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a  HARED_LOCK..**.*
d650: 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67  * If the locking
d660: 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69   level of the fi
d670: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73  le descriptor is
d680: 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62   already at or b
d690: 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75  elow.** the requ
d6a0: 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65  ested locking le
d6b0: 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  vel, this routin
d6c0: 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  e is a no-op..**
d6d0: 0a 2a 2a 20 57 68 65 6e 20 74 68 65 20 6c 6f 63  .** When the loc
d6e0: 6b 69 6e 67 20 6c 65 76 65 6c 20 72 65 61 63 68  king level reach
d6f0: 65 73 20 4e 4f 5f 4c 4f 43 4b 2c 20 64 65 6c 65  es NO_LOCK, dele
d700: 74 65 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65  te the lock file
d710: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
d720: 64 6f 74 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71  dotlockUnlock(sq
d730: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
d740: 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b  int eFileLock) {
d750: 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
d760: 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
d770: 69 64 3b 0a 20 20 63 68 61 72 20 2a 7a 4c 6f 63  id;.  char *zLoc
d780: 6b 46 69 6c 65 20 3d 20 28 63 68 61 72 20 2a 29  kFile = (char *)
d790: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
d7a0: 6e 74 65 78 74 3b 0a 0a 20 20 61 73 73 65 72 74  ntext;..  assert
d7b0: 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54  ( pFile );.  OST
d7c0: 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25  RACE(("UNLOCK  %
d7d0: 64 20 25 64 20 77 61 73 20 25 64 20 70 69 64 3d  d %d was %d pid=
d7e0: 25 64 20 28 64 6f 74 6c 6f 63 6b 29 5c 6e 22 2c  %d (dotlock)\n",
d7f0: 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65   pFile->h, eFile
d800: 4c 6f 63 6b 2c 0a 09 20 20 20 70 46 69 6c 65 2d  Lock,..   pFile-
d810: 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 67 65 74 70  >eFileLock, getp
d820: 69 64 28 29 29 29 3b 0a 20 20 61 73 73 65 72 74  id()));.  assert
d830: 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41  ( eFileLock<=SHA
d840: 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20  RED_LOCK );.  . 
d850: 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20 70 6f 73   /* no-op if pos
d860: 73 69 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70  sible */.  if( p
d870: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  File->eFileLock=
d880: 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20  =eFileLock ){.  
d890: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
d8a0: 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 6f  OK;.  }..  /* To
d8b0: 20 64 6f 77 6e 67 72 61 64 65 20 74 6f 20 73 68   downgrade to sh
d8c0: 61 72 65 64 2c 20 73 69 6d 70 6c 79 20 75 70 64  ared, simply upd
d8d0: 61 74 65 20 6f 75 72 20 69 6e 74 65 72 6e 61 6c  ate our internal
d8e0: 20 6e 6f 74 69 6f 6e 20 6f 66 20 74 68 65 0a 20   notion of the. 
d8f0: 20 2a 2a 20 6c 6f 63 6b 20 73 74 61 74 65 2e 20   ** lock state. 
d900: 20 4e 6f 20 6e 65 65 64 20 74 6f 20 6d 65 73 73   No need to mess
d910: 20 77 69 74 68 20 74 68 65 20 66 69 6c 65 20 6f   with the file o
d920: 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 69  n disk..  */.  i
d930: 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  f( eFileLock==SH
d940: 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
d950: 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
d960: 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b  k = SHARED_LOCK;
d970: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
d980: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20  TE_OK;.  }.  .  
d990: 2f 2a 20 54 6f 20 66 75 6c 6c 79 20 75 6e 6c 6f  /* To fully unlo
d9a0: 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  ck the database,
d9b0: 20 64 65 6c 65 74 65 20 74 68 65 20 6c 6f 63 6b   delete the lock
d9c0: 20 66 69 6c 65 20 2a 2f 0a 20 20 61 73 73 65 72   file */.  asser
d9d0: 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f  t( eFileLock==NO
d9e0: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 75  _LOCK );.  if( u
d9f0: 6e 6c 69 6e 6b 28 7a 4c 6f 63 6b 46 69 6c 65 29  nlink(zLockFile)
da00: 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d   ){.    int rc =
da10: 20 30 3b 0a 20 20 20 20 69 6e 74 20 74 45 72 72   0;.    int tErr
da20: 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
da30: 69 66 28 20 45 4e 4f 45 4e 54 20 21 3d 20 74 45  if( ENOENT != tE
da40: 72 72 6e 6f 20 29 7b 0a 20 20 20 20 20 20 72 63  rrno ){.      rc
da50: 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
da60: 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
da70: 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
da80: 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20 7d  R_UNLOCK);.    }
da90: 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b  .    if( IS_LOCK
daa0: 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20  _ERROR(rc) ){.  
dab0: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
dac0: 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20  rrno = tErrno;. 
dad0: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
dae0: 72 63 3b 20 0a 20 20 7d 0a 20 20 70 46 69 6c 65  rc; .  }.  pFile
daf0: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f  ->eFileLock = NO
db00: 5f 4c 4f 43 4b 3b 0a 20 20 72 65 74 75 72 6e 20  _LOCK;.  return 
db10: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
db20: 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65  .** Close a file
db30: 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  .  Make sure the
db40: 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 72   lock has been r
db50: 65 6c 65 61 73 65 64 20 62 65 66 6f 72 65 20 63  eleased before c
db60: 6c 6f 73 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  losing..*/.stati
db70: 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 43 6c 6f  c int dotlockClo
db80: 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  se(sqlite3_file 
db90: 2a 69 64 29 20 7b 0a 20 20 69 6e 74 20 72 63 3b  *id) {.  int rc;
dba0: 0a 20 20 69 66 28 20 69 64 20 29 7b 0a 20 20 20  .  if( id ){.   
dbb0: 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
dbc0: 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
dbd0: 3b 0a 20 20 20 20 64 6f 74 6c 6f 63 6b 55 6e 6c  ;.    dotlockUnl
dbe0: 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29  ock(id, NO_LOCK)
dbf0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
dc00: 65 65 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e  ee(pFile->lockin
dc10: 67 43 6f 6e 74 65 78 74 29 3b 0a 20 20 7d 0a 20  gContext);.  }. 
dc20: 20 72 63 20 3d 20 63 6c 6f 73 65 55 6e 69 78 46   rc = closeUnixF
dc30: 69 6c 65 28 69 64 29 3b 0a 20 20 72 65 74 75 72  ile(id);.  retur
dc40: 6e 20 72 63 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a  n rc;.}./*******
dc50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20  *********** End 
dc60: 6f 66 20 74 68 65 20 64 6f 74 2d 66 69 6c 65 20  of the dot-file 
dc70: 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74  lock implementat
dc80: 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ion ************
dc90: 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
dca0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
dcb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
dcc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
dcd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
dce0: 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a  ******/../******
dcf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
dd00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
dd10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
dd20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
dd30: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
dd40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
dd50: 2a 2a 2a 20 42 65 67 69 6e 20 66 6c 6f 63 6b 20  *** Begin flock 
dd60: 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a  Locking ********
dd70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
dd80: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 55  ********.**.** U
dd90: 73 65 20 74 68 65 20 66 6c 6f 63 6b 28 29 20 73  se the flock() s
dda0: 79 73 74 65 6d 20 63 61 6c 6c 20 74 6f 20 64 6f  ystem call to do
ddb0: 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2e 0a 2a   file locking..*
ddc0: 2a 0a 2a 2a 20 66 6c 6f 63 6b 28 29 20 6c 6f 63  *.** flock() loc
ddd0: 6b 69 6e 67 20 69 73 20 6c 69 6b 65 20 64 6f 74  king is like dot
dde0: 2d 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 6e  -file locking in
ddf0: 20 74 68 61 74 20 74 68 65 20 76 61 72 69 6f 75   that the variou
de00: 73 0a 2a 2a 20 66 69 6e 65 2d 67 72 61 69 6e 20  s.** fine-grain 
de10: 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 73 20 73  locking levels s
de20: 75 70 70 6f 72 74 65 64 20 62 79 20 53 51 4c 69  upported by SQLi
de30: 74 65 20 61 72 65 20 63 6f 6c 6c 61 70 73 65 64  te are collapsed
de40: 20 69 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c   into.** a singl
de50: 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  e exclusive lock
de60: 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
de70: 73 2c 20 53 48 41 52 45 44 2c 20 52 45 53 45 52  s, SHARED, RESER
de80: 56 45 44 2c 20 61 6e 64 0a 2a 2a 20 50 45 4e 44  VED, and.** PEND
de90: 49 4e 47 20 6c 6f 63 6b 73 20 61 72 65 20 74 68  ING locks are th
dea0: 65 20 73 61 6d 65 20 74 68 69 6e 67 20 61 73 20  e same thing as 
deb0: 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
dec0: 6b 2e 20 20 53 51 4c 69 74 65 0a 2a 2a 20 73 74  k.  SQLite.** st
ded0: 69 6c 6c 20 77 6f 72 6b 73 20 77 68 65 6e 20 79  ill works when y
dee0: 6f 75 20 64 6f 20 74 68 69 73 2c 20 62 75 74 20  ou do this, but 
def0: 63 6f 6e 63 75 72 72 65 6e 63 79 20 69 73 20 72  concurrency is r
df00: 65 64 75 63 65 64 20 73 69 6e 63 65 0a 2a 2a 20  educed since.** 
df10: 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 70 72  only a single pr
df20: 6f 63 65 73 73 20 63 61 6e 20 62 65 20 72 65 61  ocess can be rea
df30: 64 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ding the databas
df40: 65 20 61 74 20 61 20 74 69 6d 65 2e 0a 2a 2a 0a  e at a time..**.
df50: 2a 2a 20 4f 6d 69 74 20 74 68 69 73 20 73 65 63  ** Omit this sec
df60: 74 69 6f 6e 20 69 66 20 53 51 4c 49 54 45 5f 45  tion if SQLITE_E
df70: 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
df80: 59 4c 45 20 69 73 20 74 75 72 6e 65 64 20 6f 66  YLE is turned of
df90: 66 20 6f 72 20 69 66 0a 2a 2a 20 63 6f 6d 70 69  f or if.** compi
dfa0: 6c 69 6e 67 20 66 6f 72 20 56 58 57 4f 52 4b 53  ling for VXWORKS
dfb0: 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  ..*/.#if SQLITE_
dfc0: 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
dfd0: 54 59 4c 45 20 26 26 20 21 4f 53 5f 56 58 57 4f  TYLE && !OS_VXWO
dfe0: 52 4b 53 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  RKS../*.** This 
dff0: 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69  routine checks i
e000: 66 20 74 68 65 72 65 20 69 73 20 61 20 52 45 53  f there is a RES
e010: 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20  ERVED lock held 
e020: 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64  on the specified
e030: 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73  .** file by this
e040: 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72   or any other pr
e050: 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68 20 61  ocess. If such a
e060: 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 73   lock is held, s
e070: 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74  et *pResOut.** t
e080: 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c  o a non-zero val
e090: 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70 52  ue otherwise *pR
e0a0: 65 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20  esOut is set to 
e0b0: 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75 72  zero.  The retur
e0c0: 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65  n value.** is se
e0d0: 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75  t to SQLITE_OK u
e0e0: 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72 72  nless an I/O err
e0f0: 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  or occurs during
e100: 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a   lock checking..
e110: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c  */.static int fl
e120: 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64  ockCheckReserved
e130: 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
e140: 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73  e *id, int *pRes
e150: 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  Out){.  int rc =
e160: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
e170: 74 20 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a  t reserved = 0;.
e180: 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
e190: 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
e1a0: 64 3b 0a 20 20 0a 20 20 53 69 6d 75 6c 61 74 65  d;.  .  Simulate
e1b0: 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  IOError( return 
e1c0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45  SQLITE_IOERR_CHE
e1d0: 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20  CKRESERVEDLOCK; 
e1e0: 29 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20  );.  .  assert( 
e1f0: 70 46 69 6c 65 20 29 3b 0a 20 20 0a 20 20 2f 2a  pFile );.  .  /*
e200: 20 43 68 65 63 6b 20 69 66 20 61 20 74 68 72 65   Check if a thre
e210: 61 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65  ad in this proce
e220: 73 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20  ss holds such a 
e230: 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46  lock */.  if( pF
e240: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53  ile->eFileLock>S
e250: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  HARED_LOCK ){.  
e260: 20 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a    reserved = 1;.
e270: 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74 68 65    }.  .  /* Othe
e280: 72 77 69 73 65 20 73 65 65 20 69 66 20 73 6f 6d  rwise see if som
e290: 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  e other process 
e2a0: 68 6f 6c 64 73 20 69 74 2e 20 2a 2f 0a 20 20 69  holds it. */.  i
e2b0: 66 28 20 21 72 65 73 65 72 76 65 64 20 29 7b 0a  f( !reserved ){.
e2c0: 20 20 20 20 2f 2a 20 61 74 74 65 6d 70 74 20 74      /* attempt t
e2d0: 6f 20 67 65 74 20 74 68 65 20 6c 6f 63 6b 20 2a  o get the lock *
e2e0: 2f 0a 20 20 20 20 69 6e 74 20 6c 72 63 20 3d 20  /.    int lrc = 
e2f0: 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20  flock(pFile->h, 
e300: 4c 4f 43 4b 5f 45 58 20 7c 20 4c 4f 43 4b 5f 4e  LOCK_EX | LOCK_N
e310: 42 29 3b 0a 20 20 20 20 69 66 28 20 21 6c 72 63  B);.    if( !lrc
e320: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 67 6f 74   ){.      /* got
e330: 20 74 68 65 20 6c 6f 63 6b 2c 20 75 6e 6c 6f 63   the lock, unloc
e340: 6b 20 69 74 20 2a 2f 0a 20 20 20 20 20 20 6c 72  k it */.      lr
e350: 63 20 3d 20 66 6c 6f 63 6b 28 70 46 69 6c 65 2d  c = flock(pFile-
e360: 3e 68 2c 20 4c 4f 43 4b 5f 55 4e 29 3b 0a 20 20  >h, LOCK_UN);.  
e370: 20 20 20 20 69 66 20 28 20 6c 72 63 20 29 20 7b      if ( lrc ) {
e380: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74 45 72  .        int tEr
e390: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
e3a0: 20 20 20 20 20 2f 2a 20 75 6e 6c 6f 63 6b 20 66       /* unlock f
e3b0: 61 69 6c 65 64 20 77 69 74 68 20 61 6e 20 65 72  ailed with an er
e3c0: 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 6c  ror */.        l
e3d0: 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72  rc = sqliteError
e3e0: 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74  FromPosixError(t
e3f0: 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f  Errno, SQLITE_IO
e400: 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 20 0a 20 20  ERR_UNLOCK); .  
e410: 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43        if( IS_LOC
e420: 4b 5f 45 52 52 4f 52 28 6c 72 63 29 20 29 7b 0a  K_ERROR(lrc) ){.
e430: 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
e440: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72  >lastErrno = tEr
e450: 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 72  rno;.          r
e460: 63 20 3d 20 6c 72 63 3b 0a 20 20 20 20 20 20 20  c = lrc;.       
e470: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
e480: 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 69 6e   else {.      in
e490: 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  t tErrno = errno
e4a0: 3b 0a 20 20 20 20 20 20 72 65 73 65 72 76 65 64  ;.      reserved
e4b0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 2f 2a 20 73   = 1;.      /* s
e4c0: 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 6d 69 67 68  omeone else migh
e4d0: 74 20 68 61 76 65 20 69 74 20 72 65 73 65 72 76  t have it reserv
e4e0: 65 64 20 2a 2f 0a 20 20 20 20 20 20 6c 72 63 20  ed */.      lrc 
e4f0: 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  = sqliteErrorFro
e500: 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72  mPosixError(tErr
e510: 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  no, SQLITE_IOERR
e520: 5f 4c 4f 43 4b 29 3b 20 0a 20 20 20 20 20 20 69  _LOCK); .      i
e530: 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
e540: 28 6c 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20  (lrc) ){.       
e550: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
e560: 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20  o = tErrno;.    
e570: 20 20 20 20 72 63 20 3d 20 6c 72 63 3b 0a 20 20      rc = lrc;.  
e580: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
e590: 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 53 54    OSTRACE(("TEST
e5a0: 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25   WR-LOCK %d %d %
e5b0: 64 20 28 66 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46  d (flock)\n", pF
e5c0: 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65  ile->h, rc, rese
e5d0: 72 76 65 64 29 29 3b 0a 0a 23 69 66 64 65 66 20  rved));..#ifdef 
e5e0: 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c  SQLITE_IGNORE_FL
e5f0: 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a  OCK_LOCK_ERRORS.
e600: 20 20 69 66 28 20 28 72 63 20 26 20 53 51 4c 49    if( (rc & SQLI
e610: 54 45 5f 49 4f 45 52 52 29 20 3d 3d 20 53 51 4c  TE_IOERR) == SQL
e620: 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20  ITE_IOERR ){.   
e630: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
e640: 0a 20 20 20 20 72 65 73 65 72 76 65 64 3d 31 3b  .    reserved=1;
e650: 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  .  }.#endif /* S
e660: 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f  QLITE_IGNORE_FLO
e670: 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20 2a  CK_LOCK_ERRORS *
e680: 2f 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72  /.  *pResOut = r
e690: 65 73 65 72 76 65 64 3b 0a 20 20 72 65 74 75 72  eserved;.  retur
e6a0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  n rc;.}../*.** L
e6b0: 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74  ock the file wit
e6c0: 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69  h the lock speci
e6d0: 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65  fied by paramete
e6e0: 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e  r eFileLock - on
e6f0: 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c  e.** of the foll
e700: 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  owing:.**.**    
e710: 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b   (1) SHARED_LOCK
e720: 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53 45  .**     (2) RESE
e730: 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  RVED_LOCK.**    
e740: 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43   (3) PENDING_LOC
e750: 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43  K.**     (4) EXC
e760: 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a  LUSIVE_LOCK.**.*
e770: 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e  * Sometimes when
e780: 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20   requesting one 
e790: 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69  lock state, addi
e7a0: 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74  tional lock stat
e7b0: 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74  es.** are insert
e7c0: 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20  ed in between.  
e7d0: 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68  The locking migh
e7e0: 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66  t fail on one of
e7f0: 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72   the later.** tr
e800: 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e  ansitions leavin
e810: 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65  g the lock state
e820: 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20   different from 
e830: 77 68 61 74 20 69 74 20 73 74 61 72 74 65 64 20  what it started 
e840: 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f  but.** still sho
e850: 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20  rt of its goal. 
e860: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   The following c
e870: 68 61 72 74 20 73 68 6f 77 73 20 74 68 65 20 61  hart shows the a
e880: 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69  llowed.** transi
e890: 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e  tions and the in
e8a0: 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69  serted intermedi
e8b0: 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a  ate states:.**.*
e8c0: 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e  *    UNLOCKED ->
e8d0: 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48   SHARED.**    SH
e8e0: 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44  ARED -> RESERVED
e8f0: 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e  .**    SHARED ->
e900: 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58   (PENDING) -> EX
e910: 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45  CLUSIVE.**    RE
e920: 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49  SERVED -> (PENDI
e930: 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  NG) -> EXCLUSIVE
e940: 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d  .**    PENDING -
e950: 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a  > EXCLUSIVE.**.*
e960: 2a 20 66 6c 6f 63 6b 28 29 20 6f 6e 6c 79 20 72  * flock() only r
e970: 65 61 6c 6c 79 20 73 75 70 70 6f 72 74 20 45 58  eally support EX
e980: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73 2e 20 20  CLUSIVE locks.  
e990: 57 65 20 74 72 61 63 6b 20 69 6e 74 65 72 6d 65  We track interme
e9a0: 64 69 61 74 65 0a 2a 2a 20 6c 6f 63 6b 20 73 74  diate.** lock st
e9b0: 61 74 65 73 20 69 6e 20 74 68 65 20 73 71 6c 69  ates in the sqli
e9c0: 74 65 33 5f 66 69 6c 65 20 73 74 72 75 63 74 75  te3_file structu
e9d0: 72 65 2c 20 62 75 74 20 61 6c 6c 20 6c 6f 63 6b  re, but all lock
e9e0: 73 20 53 48 41 52 45 44 20 6f 72 0a 2a 2a 20 61  s SHARED or.** a
e9f0: 62 6f 76 65 20 61 72 65 20 72 65 61 6c 6c 79 20  bove are really 
ea00: 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73 20  EXCLUSIVE locks 
ea10: 61 6e 64 20 65 78 63 6c 75 64 65 20 61 6c 6c 20  and exclude all 
ea20: 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 20  other processes 
ea30: 66 72 6f 6d 0a 2a 2a 20 61 63 63 65 73 73 20 74  from.** access t
ea40: 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  he file..**.** T
ea50: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
ea60: 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61   only increase a
ea70: 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20   lock.  Use the 
ea80: 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28  sqlite3OsUnlock(
ea90: 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20  ).** routine to 
eaa0: 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20  lower a locking 
eab0: 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63  level..*/.static
eac0: 20 69 6e 74 20 66 6c 6f 63 6b 4c 6f 63 6b 28 73   int flockLock(s
ead0: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
eae0: 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20   int eFileLock) 
eaf0: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
eb00: 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69  ITE_OK;.  unixFi
eb10: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
eb20: 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 61 73  xFile*)id;..  as
eb30: 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 0a  sert( pFile );..
eb40: 20 20 2f 2a 20 69 66 20 77 65 20 61 6c 72 65 61    /* if we alrea
eb50: 64 79 20 68 61 76 65 20 61 20 6c 6f 63 6b 2c 20  dy have a lock, 
eb60: 69 74 20 69 73 20 65 78 63 6c 75 73 69 76 65 2e  it is exclusive.
eb70: 20 20 0a 20 20 2a 2a 20 4a 75 73 74 20 61 64 6a    .  ** Just adj
eb80: 75 73 74 20 6c 65 76 65 6c 20 61 6e 64 20 70 75  ust level and pu
eb90: 6e 74 20 6f 6e 20 6f 75 74 74 61 20 68 65 72 65  nt on outta here
eba0: 2e 20 2a 2f 0a 20 20 69 66 20 28 70 46 69 6c 65  . */.  if (pFile
ebb0: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3e 20 4e 4f  ->eFileLock > NO
ebc0: 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46 69  _LOCK) {.    pFi
ebd0: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
ebe0: 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 72  eFileLock;.    r
ebf0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
ec00: 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 67 72 61  .  }.  .  /* gra
ec10: 62 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  b an exclusive l
ec20: 6f 63 6b 20 2a 2f 0a 20 20 0a 20 20 69 66 20 28  ock */.  .  if (
ec30: 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20  flock(pFile->h, 
ec40: 4c 4f 43 4b 5f 45 58 20 7c 20 4c 4f 43 4b 5f 4e  LOCK_EX | LOCK_N
ec50: 42 29 29 20 7b 0a 20 20 20 20 69 6e 74 20 74 45  B)) {.    int tE
ec60: 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
ec70: 20 20 2f 2a 20 64 69 64 6e 27 74 20 67 65 74 2c    /* didn't get,
ec80: 20 6d 75 73 74 20 62 65 20 62 75 73 79 20 2a 2f   must be busy */
ec90: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
eca0: 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
ecb0: 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49  ror(tErrno, SQLI
ecc0: 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a  TE_IOERR_LOCK);.
ecd0: 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
ece0: 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20  ERROR(rc) ){.   
ecf0: 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
ed00: 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20  rno = tErrno;.  
ed10: 20 20 7d 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20    }.  } else {. 
ed20: 20 20 20 2f 2a 20 67 6f 74 20 69 74 2c 20 73 65     /* got it, se
ed30: 74 20 74 68 65 20 74 79 70 65 20 61 6e 64 20 72  t the type and r
ed40: 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20 20 20  eturn ok */.    
ed50: 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
ed60: 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20   = eFileLock;.  
ed70: 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f  }.  OSTRACE(("LO
ed80: 43 4b 20 20 20 20 25 64 20 25 73 20 25 73 20 28  CK    %d %s %s (
ed90: 66 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65  flock)\n", pFile
eda0: 2d 3e 68 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28  ->h, azFileLock(
edb0: 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 0a 20 20 20  eFileLock), .   
edc0: 20 20 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49          rc==SQLI
edd0: 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22  TE_OK ? "ok" : "
ede0: 66 61 69 6c 65 64 22 29 29 3b 0a 23 69 66 64 65  failed"));.#ifde
edf0: 66 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f  f SQLITE_IGNORE_
ee00: 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52  FLOCK_LOCK_ERROR
ee10: 53 0a 20 20 69 66 28 20 28 72 63 20 26 20 53 51  S.  if( (rc & SQ
ee20: 4c 49 54 45 5f 49 4f 45 52 52 29 20 3d 3d 20 53  LITE_IOERR) == S
ee30: 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20  QLITE_IOERR ){. 
ee40: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
ee50: 55 53 59 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20  USY;.  }.#endif 
ee60: 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45  /* SQLITE_IGNORE
ee70: 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f  _FLOCK_LOCK_ERRO
ee80: 52 53 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72  RS */.  return r
ee90: 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77  c;.}.../*.** Low
eea0: 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  er the locking l
eeb0: 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73  evel on file des
eec0: 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f  criptor pFile to
eed0: 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69   eFileLock.  eFi
eee0: 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62  leLock.** must b
eef0: 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b  e either NO_LOCK
ef00: 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e   or SHARED_LOCK.
ef10: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f  .**.** If the lo
ef20: 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74  cking level of t
ef30: 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
ef40: 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74  or is already at
ef50: 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65   or below.** the
ef60: 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69   requested locki
ef70: 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72  ng level, this r
ef80: 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
ef90: 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  p..*/.static int
efa0: 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71 6c   flockUnlock(sql
efb0: 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
efc0: 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a  nt eFileLock) {.
efd0: 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
efe0: 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
eff0: 64 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20  d;.  .  assert( 
f000: 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41  pFile );.  OSTRA
f010: 43 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20  CE(("UNLOCK  %d 
f020: 25 64 20 77 61 73 20 25 64 20 70 69 64 3d 25 64  %d was %d pid=%d
f030: 20 28 66 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69   (flock)\n", pFi
f040: 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b  le->h, eFileLock
f050: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69  ,.           pFi
f060: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 67  le->eFileLock, g
f070: 65 74 70 69 64 28 29 29 29 3b 0a 20 20 61 73 73  etpid()));.  ass
f080: 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d  ert( eFileLock<=
f090: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
f0a0: 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20   .  /* no-op if 
f0b0: 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 20 20 69 66  possible */.  if
f0c0: 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ( pFile->eFileLo
f0d0: 63 6b 3d 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b  ck==eFileLock ){
f0e0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
f0f0: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20  TE_OK;.  }.  .  
f100: 2f 2a 20 73 68 61 72 65 64 20 63 61 6e 20 6a 75  /* shared can ju
f110: 73 74 20 62 65 20 73 65 74 20 62 65 63 61 75 73  st be set becaus
f120: 65 20 77 65 20 61 6c 77 61 79 73 20 68 61 76 65  e we always have
f130: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 2a 2f   an exclusive */
f140: 0a 20 20 69 66 20 28 65 46 69 6c 65 4c 6f 63 6b  .  if (eFileLock
f150: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29 20 7b  ==SHARED_LOCK) {
f160: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c  .    pFile->eFil
f170: 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63  eLock = eFileLoc
f180: 6b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  k;.    return SQ
f190: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a  LITE_OK;.  }.  .
f1a0: 20 20 2f 2a 20 6e 6f 2c 20 72 65 61 6c 6c 79 2c    /* no, really,
f1b0: 20 75 6e 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 69 6e   unlock. */.  in
f1c0: 74 20 72 63 20 3d 20 66 6c 6f 63 6b 28 70 46 69  t rc = flock(pFi
f1d0: 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 55 4e 29 3b  le->h, LOCK_UN);
f1e0: 0a 20 20 69 66 20 28 72 63 29 20 7b 0a 20 20 20  .  if (rc) {.   
f1f0: 20 69 6e 74 20 72 2c 20 74 45 72 72 6e 6f 20 3d   int r, tErrno =
f200: 20 65 72 72 6e 6f 3b 0a 20 20 20 20 72 20 3d 20   errno;.    r = 
f210: 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
f220: 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
f230: 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  , SQLITE_IOERR_U
f240: 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20  NLOCK);.    if( 
f250: 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 29  IS_LOCK_ERROR(r)
f260: 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d   ){.      pFile-
f270: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72  >lastErrno = tEr
f280: 72 6e 6f 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65  rno;.    }.#ifde
f290: 66 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f  f SQLITE_IGNORE_
f2a0: 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52  FLOCK_LOCK_ERROR
f2b0: 53 0a 20 20 20 20 69 66 28 20 28 72 20 26 20 53  S.    if( (r & S
f2c0: 51 4c 49 54 45 5f 49 4f 45 52 52 29 20 3d 3d 20  QLITE_IOERR) == 
f2d0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a  SQLITE_IOERR ){.
f2e0: 20 20 20 20 20 20 72 20 3d 20 53 51 4c 49 54 45        r = SQLITE
f2f0: 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a 23 65 6e  _BUSY;.    }.#en
f300: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47  dif /* SQLITE_IG
f310: 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f  NORE_FLOCK_LOCK_
f320: 45 52 52 4f 52 53 20 2a 2f 0a 20 20 20 20 0a 20  ERRORS */.    . 
f330: 20 20 20 72 65 74 75 72 6e 20 72 3b 0a 20 20 7d     return r;.  }
f340: 20 65 6c 73 65 20 7b 0a 20 20 20 20 70 46 69 6c   else {.    pFil
f350: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e  e->eFileLock = N
f360: 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 72 65 74 75  O_LOCK;.    retu
f370: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
f380: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  }.}../*.** Close
f390: 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74   a file..*/.stat
f3a0: 69 63 20 69 6e 74 20 66 6c 6f 63 6b 43 6c 6f 73  ic int flockClos
f3b0: 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
f3c0: 69 64 29 20 7b 0a 20 20 69 66 28 20 69 64 20 29  id) {.  if( id )
f3d0: 7b 0a 20 20 20 20 66 6c 6f 63 6b 55 6e 6c 6f 63  {.    flockUnloc
f3e0: 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a  k(id, NO_LOCK);.
f3f0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 6c 6f    }.  return clo
f400: 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a  seUnixFile(id);.
f410: 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  }..#endif /* SQL
f420: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
f430: 4e 47 5f 53 54 59 4c 45 20 26 26 20 21 4f 53 5f  NG_STYLE && !OS_
f440: 56 58 57 4f 52 4b 20 2a 2f 0a 0a 2f 2a 2a 2a 2a  VXWORK */../****
f450: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
f460: 45 6e 64 20 6f 66 20 74 68 65 20 66 6c 6f 63 6b  End of the flock
f470: 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61   lock implementa
f480: 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  tion ***********
f490: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
f4a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f4b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f4c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f4d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f4e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a  *********/../***
f4f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f500: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f510: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f520: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f530: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
f540: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f550: 2a 2a 2a 2a 20 42 65 67 69 6e 20 4e 61 6d 65 64  **** Begin Named
f560: 20 53 65 6d 61 70 68 6f 72 65 20 4c 6f 63 6b 69   Semaphore Locki
f570: 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ng *************
f580: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a  ***********.**.*
f590: 2a 20 4e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72  * Named semaphor
f5a0: 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6f 6e 6c  e locking is onl
f5b0: 79 20 73 75 70 70 6f 72 74 65 64 20 6f 6e 20 56  y supported on V
f5c0: 78 57 6f 72 6b 73 2e 0a 2a 2a 0a 2a 2a 20 53 65  xWorks..**.** Se
f5d0: 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 20  maphore locking 
f5e0: 69 73 20 6c 69 6b 65 20 64 6f 74 2d 6c 6f 63 6b  is like dot-lock
f5f0: 20 61 6e 64 20 66 6c 6f 63 6b 20 69 6e 20 74 68   and flock in th
f600: 61 74 20 69 74 20 72 65 61 6c 6c 79 20 6f 6e 6c  at it really onl
f610: 79 0a 2a 2a 20 73 75 70 70 6f 72 74 73 20 45 58  y.** supports EX
f620: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 69 6e 67 2e  CLUSIVE locking.
f630: 20 20 4f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20    Only a single 
f640: 70 72 6f 63 65 73 73 20 63 61 6e 20 72 65 61 64  process can read
f650: 20 6f 72 20 77 72 69 74 65 0a 2a 2a 20 74 68 65   or write.** the
f660: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
f670: 74 20 61 20 74 69 6d 65 2e 20 20 54 68 69 73 20  t a time.  This 
f680: 72 65 64 75 63 65 73 20 70 6f 74 65 6e 74 69 61  reduces potentia
f690: 6c 20 63 6f 6e 63 75 72 72 65 6e 63 79 2c 20 62  l concurrency, b
f6a0: 75 74 0a 2a 2a 20 6d 61 6b 65 73 20 74 68 65 20  ut.** makes the 
f6b0: 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74  lock implementat
f6c0: 69 6f 6e 20 6d 75 63 68 20 65 61 73 69 65 72 2e  ion much easier.
f6d0: 0a 2a 2f 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52  .*/.#if OS_VXWOR
f6e0: 4b 53 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  KS../*.** This r
f6f0: 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66  outine checks if
f700: 20 74 68 65 72 65 20 69 73 20 61 20 52 45 53 45   there is a RESE
f710: 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f  RVED lock held o
f720: 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64 0a  n the specified.
f730: 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73 20  ** file by this 
f740: 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f  or any other pro
f750: 63 65 73 73 2e 20 49 66 20 73 75 63 68 20 61 20  cess. If such a 
f760: 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65  lock is held, se
f770: 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f  t *pResOut.** to
f780: 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75   a non-zero valu
f790: 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65  e otherwise *pRe
f7a0: 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a  sOut is set to z
f7b0: 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e  ero.  The return
f7c0: 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74   value.** is set
f7d0: 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e   to SQLITE_OK un
f7e0: 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f  less an I/O erro
f7f0: 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20  r occurs during 
f800: 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a  lock checking..*
f810: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6d  /.static int sem
f820: 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
f830: 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
f840: 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74  id, int *pResOut
f850: 29 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  ) {.  int rc = S
f860: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
f870: 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20  reserved = 0;.  
f880: 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
f890: 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
f8a0: 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ..  SimulateIOEr
f8b0: 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
f8c0: 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45  TE_IOERR_CHECKRE
f8d0: 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20  SERVEDLOCK; );. 
f8e0: 20 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c   .  assert( pFil
f8f0: 65 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  e );..  /* Check
f900: 20 69 66 20 61 20 74 68 72 65 61 64 20 69 6e 20   if a thread in 
f910: 74 68 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c  this process hol
f920: 64 73 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a  ds such a lock *
f930: 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65  /.  if( pFile->e
f940: 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f  FileLock>SHARED_
f950: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 73 65  LOCK ){.    rese
f960: 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  rved = 1;.  }.  
f970: 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 20  .  /* Otherwise 
f980: 73 65 65 20 69 66 20 73 6f 6d 65 20 6f 74 68 65  see if some othe
f990: 72 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20  r process holds 
f9a0: 69 74 2e 20 2a 2f 0a 20 20 69 66 28 20 21 72 65  it. */.  if( !re
f9b0: 73 65 72 76 65 64 20 29 7b 0a 20 20 20 20 73 65  served ){.    se
f9c0: 6d 5f 74 20 2a 70 53 65 6d 20 3d 20 70 46 69 6c  m_t *pSem = pFil
f9d0: 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 3b  e->pInode->pSem;
f9e0: 0a 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74  .    struct stat
f9f0: 20 73 74 61 74 42 75 66 3b 0a 0a 20 20 20 20 69   statBuf;..    i
fa00: 66 28 20 73 65 6d 5f 74 72 79 77 61 69 74 28 70  f( sem_trywait(p
fa10: 53 65 6d 29 3d 3d 2d 31 20 29 7b 0a 20 20 20 20  Sem)==-1 ){.    
fa20: 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65    int tErrno = e
fa30: 72 72 6e 6f 3b 0a 20 20 20 20 20 20 69 66 28 20  rrno;.      if( 
fa40: 45 41 47 41 49 4e 20 21 3d 20 74 45 72 72 6e 6f  EAGAIN != tErrno
fa50: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
fa60: 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d   sqliteErrorFrom
fa70: 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e  PosixError(tErrn
fa80: 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  o, SQLITE_IOERR_
fa90: 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43  CHECKRESERVEDLOC
faa0: 4b 29 3b 0a 20 20 20 20 20 20 20 20 70 46 69 6c  K);.        pFil
fab0: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74  e->lastErrno = t
fac0: 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 20 65  Errno;.      } e
fad0: 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a  lse {.        /*
fae0: 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 68 61   someone else ha
faf0: 73 20 74 68 65 20 6c 6f 63 6b 20 77 68 65 6e 20  s the lock when 
fb00: 77 65 20 61 72 65 20 69 6e 20 4e 4f 5f 4c 4f 43  we are in NO_LOC
fb10: 4b 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 73  K */.        res
fb20: 65 72 76 65 64 20 3d 20 28 70 46 69 6c 65 2d 3e  erved = (pFile->
fb30: 65 46 69 6c 65 4c 6f 63 6b 20 3c 20 53 48 41 52  eFileLock < SHAR
fb40: 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  ED_LOCK);.      
fb50: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
fb60: 20 20 20 2f 2a 20 77 65 20 63 6f 75 6c 64 20 68     /* we could h
fb70: 61 76 65 20 69 74 20 69 66 20 77 65 20 77 61 6e  ave it if we wan
fb80: 74 20 69 74 20 2a 2f 0a 20 20 20 20 20 20 73 65  t it */.      se
fb90: 6d 5f 70 6f 73 74 28 70 53 65 6d 29 3b 0a 20 20  m_post(pSem);.  
fba0: 20 20 7d 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43    }.  }.  OSTRAC
fbb0: 45 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b  E(("TEST WR-LOCK
fbc0: 20 25 64 20 25 64 20 25 64 20 28 73 65 6d 29 5c   %d %d %d (sem)\
fbd0: 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63  n", pFile->h, rc
fbe0: 2c 20 72 65 73 65 72 76 65 64 29 29 3b 0a 0a 20  , reserved));.. 
fbf0: 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65   *pResOut = rese
fc00: 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72  rved;.  return r
fc10: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b  c;.}../*.** Lock
fc20: 20 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74   the file with t
fc30: 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65  he lock specifie
fc40: 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 65  d by parameter e
fc50: 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a  FileLock - one.*
fc60: 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  * of the followi
fc70: 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31  ng:.**.**     (1
fc80: 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a  ) SHARED_LOCK.**
fc90: 20 20 20 20 20 28 32 29 20 52 45 53 45 52 56 45       (2) RESERVE
fca0: 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33  D_LOCK.**     (3
fcb0: 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a  ) PENDING_LOCK.*
fcc0: 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c 55 53  *     (4) EXCLUS
fcd0: 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53  IVE_LOCK.**.** S
fce0: 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65  ometimes when re
fcf0: 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63  questing one loc
fd00: 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f  k state, additio
fd10: 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a  nal lock states.
fd20: 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64 20  ** are inserted 
fd30: 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65  in between.  The
fd40: 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66   locking might f
fd50: 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68  ail on one of th
fd60: 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73  e later.** trans
fd70: 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74  itions leaving t
fd80: 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69  he lock state di
fd90: 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61  fferent from wha
fda0: 74 20 69 74 20 73 74 61 72 74 65 64 20 62 75 74  t it started but
fdb0: 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20  .** still short 
fdc0: 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68  of its goal.  Th
fdd0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72  e following char
fde0: 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f  t shows the allo
fdf0: 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  wed.** transitio
fe00: 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72  ns and the inser
fe10: 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65  ted intermediate
fe20: 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20   states:.**.**  
fe30: 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48    UNLOCKED -> SH
fe40: 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  ARED.**    SHARE
fe50: 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a  D -> RESERVED.**
fe60: 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50      SHARED -> (P
fe70: 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
fe80: 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52  SIVE.**    RESER
fe90: 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  VED -> (PENDING)
fea0: 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
feb0: 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45      PENDING -> E
fec0: 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 53  XCLUSIVE.**.** S
fed0: 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 73 20 6f  emaphore locks o
fee0: 6e 6c 79 20 72 65 61 6c 6c 79 20 73 75 70 70 6f  nly really suppo
fef0: 72 74 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  rt EXCLUSIVE loc
ff00: 6b 73 2e 20 20 57 65 20 74 72 61 63 6b 20 69 6e  ks.  We track in
ff10: 74 65 72 6d 65 64 69 61 74 65 0a 2a 2a 20 6c 6f  termediate.** lo
ff20: 63 6b 20 73 74 61 74 65 73 20 69 6e 20 74 68 65  ck states in the
ff30: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 73 74   sqlite3_file st
ff40: 72 75 63 74 75 72 65 2c 20 62 75 74 20 61 6c 6c  ructure, but all
ff50: 20 6c 6f 63 6b 73 20 53 48 41 52 45 44 20 6f 72   locks SHARED or
ff60: 0a 2a 2a 20 61 62 6f 76 65 20 61 72 65 20 72 65  .** above are re
ff70: 61 6c 6c 79 20 45 58 43 4c 55 53 49 56 45 20 6c  ally EXCLUSIVE l
ff80: 6f 63 6b 73 20 61 6e 64 20 65 78 63 6c 75 64 65  ocks and exclude
ff90: 20 61 6c 6c 20 6f 74 68 65 72 20 70 72 6f 63 65   all other proce
ffa0: 73 73 65 73 20 66 72 6f 6d 0a 2a 2a 20 61 63 63  sses from.** acc
ffb0: 65 73 73 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a  ess the file..**
ffc0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
ffd0: 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65   will only incre
ffe0: 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65  ase a lock.  Use
fff0: 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e   the sqlite3OsUn
10000 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e  lock().** routin
10010 65 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63  e to lower a loc
10020 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73  king level..*/.s
10030 74 61 74 69 63 20 69 6e 74 20 73 65 6d 4c 6f 63  tatic int semLoc
10040 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
10050 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63  id, int eFileLoc
10060 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  k) {.  unixFile 
10070 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
10080 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20 66 64  le*)id;.  int fd
10090 3b 0a 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d 20  ;.  sem_t *pSem 
100a0 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  = pFile->pInode-
100b0 3e 70 53 65 6d 3b 0a 20 20 69 6e 74 20 72 63 20  >pSem;.  int rc 
100c0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
100d0 2f 2a 20 69 66 20 77 65 20 61 6c 72 65 61 64 79  /* if we already
100e0 20 68 61 76 65 20 61 20 6c 6f 63 6b 2c 20 69 74   have a lock, it
100f0 20 69 73 20 65 78 63 6c 75 73 69 76 65 2e 20 20   is exclusive.  
10100 0a 20 20 2a 2a 20 4a 75 73 74 20 61 64 6a 75 73  .  ** Just adjus
10110 74 20 6c 65 76 65 6c 20 61 6e 64 20 70 75 6e 74  t level and punt
10120 20 6f 6e 20 6f 75 74 74 61 20 68 65 72 65 2e 20   on outta here. 
10130 2a 2f 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e  */.  if (pFile->
10140 65 46 69 6c 65 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c  eFileLock > NO_L
10150 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65  OCK) {.    pFile
10160 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46  ->eFileLock = eF
10170 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 72 63 20  ileLock;.    rc 
10180 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
10190 20 67 6f 74 6f 20 73 65 6d 5f 65 6e 64 5f 6c 6f   goto sem_end_lo
101a0 63 6b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  ck;.  }.  .  /* 
101b0 6c 6f 63 6b 20 73 65 6d 61 70 68 6f 72 65 20 6e  lock semaphore n
101c0 6f 77 20 62 75 74 20 62 61 69 6c 20 6f 75 74 20  ow but bail out 
101d0 77 68 65 6e 20 61 6c 72 65 61 64 79 20 6c 6f 63  when already loc
101e0 6b 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 73 65  ked. */.  if( se
101f0 6d 5f 74 72 79 77 61 69 74 28 70 53 65 6d 29 3d  m_trywait(pSem)=
10200 3d 2d 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  =-1 ){.    rc = 
10210 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
10220 20 67 6f 74 6f 20 73 65 6d 5f 65 6e 64 5f 6c 6f   goto sem_end_lo
10230 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 67 6f  ck;.  }..  /* go
10240 74 20 69 74 2c 20 73 65 74 20 74 68 65 20 74 79  t it, set the ty
10250 70 65 20 61 6e 64 20 72 65 74 75 72 6e 20 6f 6b  pe and return ok
10260 20 2a 2f 0a 20 20 70 46 69 6c 65 2d 3e 65 46 69   */.  pFile->eFi
10270 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f  leLock = eFileLo
10280 63 6b 3b 0a 0a 20 73 65 6d 5f 65 6e 64 5f 6c 6f  ck;.. sem_end_lo
10290 63 6b 3a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ck:.  return rc;
102a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20  .}../*.** Lower 
102b0 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
102c0 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69  l on file descri
102d0 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46  ptor pFile to eF
102e0 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c  ileLock.  eFileL
102f0 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65  ock.** must be e
10300 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72  ither NO_LOCK or
10310 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a   SHARED_LOCK..**
10320 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69  .** If the locki
10330 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20  ng level of the 
10340 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
10350 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72  is already at or
10360 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65   below.** the re
10370 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20  quested locking 
10380 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74  level, this rout
10390 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
103a0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
103b0 6d 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  mUnlock(sqlite3_
103c0 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46  file *id, int eF
103d0 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69  ileLock) {.  uni
103e0 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
103f0 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
10400 73 65 6d 5f 74 20 2a 70 53 65 6d 20 3d 20 70 46  sem_t *pSem = pF
10410 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65  ile->pInode->pSe
10420 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46  m;..  assert( pF
10430 69 6c 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ile );.  assert(
10440 20 70 53 65 6d 20 29 3b 0a 20 20 4f 53 54 52 41   pSem );.  OSTRA
10450 43 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20  CE(("UNLOCK  %d 
10460 25 64 20 77 61 73 20 25 64 20 70 69 64 3d 25 64  %d was %d pid=%d
10470 20 28 73 65 6d 29 5c 6e 22 2c 20 70 46 69 6c 65   (sem)\n", pFile
10480 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a  ->h, eFileLock,.
10490 09 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  .   pFile->eFile
104a0 4c 6f 63 6b 2c 20 67 65 74 70 69 64 28 29 29 29  Lock, getpid()))
104b0 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c  ;.  assert( eFil
104c0 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f  eLock<=SHARED_LO
104d0 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f  CK );.  .  /* no
104e0 2d 6f 70 20 69 66 20 70 6f 73 73 69 62 6c 65 20  -op if possible 
104f0 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
10500 65 46 69 6c 65 4c 6f 63 6b 3d 3d 65 46 69 6c 65  eFileLock==eFile
10510 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75  Lock ){.    retu
10520 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
10530 7d 0a 20 20 0a 20 20 2f 2a 20 73 68 61 72 65 64  }.  .  /* shared
10540 20 63 61 6e 20 6a 75 73 74 20 62 65 20 73 65 74   can just be set
10550 20 62 65 63 61 75 73 65 20 77 65 20 61 6c 77 61   because we alwa
10560 79 73 20 68 61 76 65 20 61 6e 20 65 78 63 6c 75  ys have an exclu
10570 73 69 76 65 20 2a 2f 0a 20 20 69 66 20 28 65 46  sive */.  if (eF
10580 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
10590 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c  LOCK) {.    pFil
105a0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65  e->eFileLock = e
105b0 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 72 65  FileLock;.    re
105c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
105d0 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2c 20    }.  .  /* no, 
105e0 72 65 61 6c 6c 79 20 75 6e 6c 6f 63 6b 2e 20 2a  really unlock. *
105f0 2f 0a 20 20 69 66 20 28 20 73 65 6d 5f 70 6f 73  /.  if ( sem_pos
10600 74 28 70 53 65 6d 29 3d 3d 2d 31 20 29 20 7b 0a  t(pSem)==-1 ) {.
10610 20 20 20 20 69 6e 74 20 72 63 2c 20 74 45 72 72      int rc, tErr
10620 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
10630 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72  rc = sqliteError
10640 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74  FromPosixError(t
10650 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f  Errno, SQLITE_IO
10660 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20  ERR_UNLOCK);.   
10670 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
10680 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20  OR(rc) ){.      
10690 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
106a0 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d   = tErrno;.    }
106b0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 20  .    return rc; 
106c0 0a 20 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 65 46  .  }.  pFile->eF
106d0 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43  ileLock = NO_LOC
106e0 4b 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  K;.  return SQLI
106f0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2a  TE_OK;.}../*. **
10700 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 20   Close a file.. 
10710 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
10720 6d 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66  mClose(sqlite3_f
10730 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69 66 28  ile *id) {.  if(
10740 20 69 64 20 29 7b 0a 20 20 20 20 75 6e 69 78 46   id ){.    unixF
10750 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
10760 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20  ixFile*)id;.    
10770 73 65 6d 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f  semUnlock(id, NO
10780 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 61 73 73 65  _LOCK);.    asse
10790 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 20  rt( pFile );.   
107a0 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
107b0 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 4c 6f  );.    releaseLo
107c0 63 6b 49 6e 66 6f 28 70 46 69 6c 65 2d 3e 70 49  ckInfo(pFile->pI
107d0 6e 6f 64 65 29 3b 0a 20 20 20 20 75 6e 69 78 4c  node);.    unixL
107e0 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 20  eaveMutex();.   
107f0 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69   closeUnixFile(i
10800 64 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  d);.  }.  return
10810 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23   SQLITE_OK;.}..#
10820 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f  endif /* OS_VXWO
10830 52 4b 53 20 2a 2f 0a 2f 2a 0a 2a 2a 20 4e 61 6d  RKS */./*.** Nam
10840 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63  ed semaphore loc
10850 6b 69 6e 67 20 69 73 20 6f 6e 6c 79 20 61 76 61  king is only ava
10860 69 6c 61 62 6c 65 20 6f 6e 20 56 78 57 6f 72 6b  ilable on VxWork
10870 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  s..**.**********
10880 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65  ***** End of the
10890 20 6e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65   named semaphore
108a0 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61   lock implementa
108b0 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  tion ***********
108c0 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
108d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
108e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
108f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10900 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10910 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  ****/.../*******
10920 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10930 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10940 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10950 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10960 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
10970 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10980 2a 2a 2a 20 42 65 67 69 6e 20 41 46 50 20 4c 6f  *** Begin AFP Lo
10990 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  cking **********
109a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
109b0 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 41 46  *******.**.** AF
109c0 50 20 69 73 20 74 68 65 20 41 70 70 6c 65 20 46  P is the Apple F
109d0 69 6c 69 6e 67 20 50 72 6f 74 6f 63 6f 6c 2e 20  iling Protocol. 
109e0 20 41 46 50 20 69 73 20 61 20 6e 65 74 77 6f 72   AFP is a networ
109f0 6b 20 66 69 6c 65 73 79 73 74 65 6d 20 66 6f 75  k filesystem fou
10a00 6e 64 0a 2a 2a 20 6f 6e 20 41 70 70 6c 65 20 4d  nd.** on Apple M
10a10 61 63 69 6e 74 6f 73 68 20 63 6f 6d 70 75 74 65  acintosh compute
10a20 72 73 20 2d 20 62 6f 74 68 20 4f 53 39 20 61 6e  rs - both OS9 an
10a30 64 20 4f 53 58 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  d OSX..**.** Thi
10a40 72 64 2d 70 61 72 74 79 20 69 6d 70 6c 65 6d 65  rd-party impleme
10a50 6e 74 61 74 69 6f 6e 73 20 6f 66 20 41 46 50 20  ntations of AFP 
10a60 61 72 65 20 61 76 61 69 6c 61 62 6c 65 2e 20 20  are available.  
10a70 42 75 74 20 74 68 69 73 20 63 6f 64 65 20 68 65  But this code he
10a80 72 65 0a 2a 2a 20 6f 6e 6c 79 20 77 6f 72 6b 73  re.** only works
10a90 20 6f 6e 20 4f 53 58 2e 0a 2a 2f 0a 0a 23 69 66   on OSX..*/..#if
10aa0 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
10ab0 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  __) && SQLITE_EN
10ac0 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
10ad0 4c 45 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 66 70  LE./*.** The afp
10ae0 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 73  LockingContext s
10af0 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e  tructure contain
10b00 73 20 61 6c 6c 20 61 66 70 20 6c 6f 63 6b 20 73  s all afp lock s
10b10 70 65 63 69 66 69 63 20 73 74 61 74 65 0a 2a 2f  pecific state.*/
10b20 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
10b30 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
10b40 74 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74  t afpLockingCont
10b50 65 78 74 3b 0a 73 74 72 75 63 74 20 61 66 70 4c  ext;.struct afpL
10b60 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 7b 0a  ockingContext {.
10b70 20 20 69 6e 74 20 72 65 73 65 72 76 65 64 3b 0a    int reserved;.
10b80 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 64 62    const char *db
10b90 50 61 74 68 3b 20 20 20 20 20 20 20 20 20 20 20  Path;           
10ba0 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
10bb0 20 6f 70 65 6e 20 66 69 6c 65 20 2a 2f 0a 7d 3b   open file */.};
10bc0 0a 0a 73 74 72 75 63 74 20 42 79 74 65 52 61 6e  ..struct ByteRan
10bd0 67 65 4c 6f 63 6b 50 42 32 0a 7b 0a 20 20 75 6e  geLockPB2.{.  un
10be0 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67  signed long long
10bf0 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20   offset;        
10c00 2f 2a 20 6f 66 66 73 65 74 20 74 6f 20 66 69 72  /* offset to fir
10c10 73 74 20 62 79 74 65 20 74 6f 20 6c 6f 63 6b 20  st byte to lock 
10c20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f  */.  unsigned lo
10c30 6e 67 20 6c 6f 6e 67 20 6c 65 6e 67 74 68 3b 20  ng long length; 
10c40 20 20 20 20 20 20 20 2f 2a 20 6e 62 72 20 6f 66         /* nbr of
10c50 20 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20 2a   bytes to lock *
10c60 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  /.  unsigned lon
10c70 67 20 6c 6f 6e 67 20 72 65 74 52 61 6e 67 65 53  g long retRangeS
10c80 74 61 72 74 3b 20 2f 2a 20 6e 62 72 20 6f 66 20  tart; /* nbr of 
10c90 31 73 74 20 62 79 74 65 20 6c 6f 63 6b 65 64 20  1st byte locked 
10ca0 69 66 20 73 75 63 63 65 73 73 66 75 6c 20 2a 2f  if successful */
10cb0 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
10cc0 20 75 6e 4c 6f 63 6b 46 6c 61 67 3b 20 20 20 20   unLockFlag;    
10cd0 20 20 20 20 20 2f 2a 20 31 20 3d 20 75 6e 6c 6f       /* 1 = unlo
10ce0 63 6b 2c 20 30 20 3d 20 6c 6f 63 6b 20 2a 2f 0a  ck, 0 = lock */.
10cf0 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
10d00 73 74 61 72 74 45 6e 64 46 6c 61 67 3b 20 20 20  startEndFlag;   
10d10 20 20 20 20 2f 2a 20 31 3d 72 65 6c 20 74 6f 20      /* 1=rel to 
10d20 65 6e 64 20 6f 66 20 66 6f 72 6b 2c 20 30 3d 72  end of fork, 0=r
10d30 65 6c 20 74 6f 20 73 74 61 72 74 20 2a 2f 0a 20  el to start */. 
10d40 20 69 6e 74 20 66 64 3b 20 20 20 20 20 20 20 20   int fd;        
10d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10d60 20 20 20 2f 2a 20 66 69 6c 65 20 64 65 73 63 20     /* file desc 
10d70 74 6f 20 61 73 73 6f 63 20 74 68 69 73 20 6c 6f  to assoc this lo
10d80 63 6b 20 77 69 74 68 20 2a 2f 0a 7d 3b 0a 0a 23  ck with */.};..#
10d90 64 65 66 69 6e 65 20 61 66 70 66 73 42 79 74 65  define afpfsByte
10da0 52 61 6e 67 65 4c 6f 63 6b 32 46 53 43 54 4c 20  RangeLock2FSCTL 
10db0 20 20 20 20 20 20 20 5f 49 4f 57 52 28 27 7a 27         _IOWR('z'
10dc0 2c 20 32 33 2c 20 73 74 72 75 63 74 20 42 79 74  , 23, struct Byt
10dd0 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32 29 0a 0a  eRangeLockPB2)..
10de0 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20  /*.** This is a 
10df0 75 74 69 6c 69 74 79 20 66 6f 72 20 73 65 74 74  utility for sett
10e00 69 6e 67 20 6f 72 20 63 6c 65 61 72 69 6e 67 20  ing or clearing 
10e10 61 20 62 69 74 2d 72 61 6e 67 65 20 6c 6f 63 6b  a bit-range lock
10e20 20 6f 6e 20 61 6e 0a 2a 2a 20 41 46 50 20 66 69   on an.** AFP fi
10e30 6c 65 73 79 73 74 65 6d 2e 0a 2a 2a 20 0a 2a 2a  lesystem..** .**
10e40 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
10e50 4b 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 53 51  K on success, SQ
10e60 4c 49 54 45 5f 42 55 53 59 20 6f 6e 20 66 61 69  LITE_BUSY on fai
10e70 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lure..*/.static 
10e80 69 6e 74 20 61 66 70 53 65 74 4c 6f 63 6b 28 0a  int afpSetLock(.
10e90 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 61    const char *pa
10ea0 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  th,             
10eb0 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
10ec0 66 69 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65  file to be locke
10ed0 64 20 6f 72 20 75 6e 6c 6f 63 6b 65 64 20 2a 2f  d or unlocked */
10ee0 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
10ef0 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  le,             
10f00 20 20 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20 64    /* Open file d
10f10 65 73 63 72 69 70 74 6f 72 20 6f 6e 20 70 61 74  escriptor on pat
10f20 68 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  h */.  unsigned 
10f30 6c 6f 6e 67 20 6c 6f 6e 67 20 6f 66 66 73 65 74  long long offset
10f40 2c 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62  ,     /* First b
10f50 79 74 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64  yte to be locked
10f60 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c   */.  unsigned l
10f70 6f 6e 67 20 6c 6f 6e 67 20 6c 65 6e 67 74 68 2c  ong long length,
10f80 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
10f90 66 20 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20  f bytes to lock 
10fa0 2a 2f 0a 20 20 69 6e 74 20 73 65 74 4c 6f 63 6b  */.  int setLock
10fb0 46 6c 61 67 20 20 20 20 20 20 20 20 20 20 20 20  Flag            
10fc0 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 73      /* True to s
10fd0 65 74 20 6c 6f 63 6b 2e 20 20 46 61 6c 73 65 20  et lock.  False 
10fe0 74 6f 20 63 6c 65 61 72 20 6c 6f 63 6b 20 2a 2f  to clear lock */
10ff0 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 42 79 74  .){.  struct Byt
11000 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32 20 70 62  eRangeLockPB2 pb
11010 3b 0a 20 20 69 6e 74 20 65 72 72 3b 0a 20 20 0a  ;.  int err;.  .
11020 20 20 70 62 2e 75 6e 4c 6f 63 6b 46 6c 61 67 20    pb.unLockFlag 
11030 3d 20 73 65 74 4c 6f 63 6b 46 6c 61 67 20 3f 20  = setLockFlag ? 
11040 30 20 3a 20 31 3b 0a 20 20 70 62 2e 73 74 61 72  0 : 1;.  pb.star
11050 74 45 6e 64 46 6c 61 67 20 3d 20 30 3b 0a 20 20  tEndFlag = 0;.  
11060 70 62 2e 6f 66 66 73 65 74 20 3d 20 6f 66 66 73  pb.offset = offs
11070 65 74 3b 0a 20 20 70 62 2e 6c 65 6e 67 74 68 20  et;.  pb.length 
11080 3d 20 6c 65 6e 67 74 68 3b 20 0a 20 20 70 62 2e  = length; .  pb.
11090 66 64 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 20  fd = pFile->h;. 
110a0 20 0a 20 20 4f 53 54 52 41 43 45 28 28 22 41 46   .  OSTRACE(("AF
110b0 50 53 45 54 4c 4f 43 4b 20 5b 25 73 5d 20 66 6f  PSETLOCK [%s] fo
110c0 72 20 25 64 25 73 20 69 6e 20 72 61 6e 67 65 20  r %d%s in range 
110d0 25 6c 6c 78 3a 25 6c 6c 78 5c 6e 22 2c 20 0a 20  %llx:%llx\n", . 
110e0 20 20 20 28 73 65 74 4c 6f 63 6b 46 6c 61 67 3f     (setLockFlag?
110f0 22 4f 4e 22 3a 22 4f 46 46 22 29 2c 20 70 46 69  "ON":"OFF"), pFi
11100 6c 65 2d 3e 68 2c 20 28 70 62 2e 66 64 3d 3d 2d  le->h, (pb.fd==-
11110 31 3f 22 5b 74 65 73 74 76 61 6c 2d 31 5d 22 3a  1?"[testval-1]":
11120 22 22 29 2c 0a 20 20 20 20 6f 66 66 73 65 74 2c  ""),.    offset,
11130 20 6c 65 6e 67 74 68 29 29 3b 0a 20 20 65 72 72   length));.  err
11140 20 3d 20 66 73 63 74 6c 28 70 61 74 68 2c 20 61   = fsctl(path, a
11150 66 70 66 73 42 79 74 65 52 61 6e 67 65 4c 6f 63  fpfsByteRangeLoc
11160 6b 32 46 53 43 54 4c 2c 20 26 70 62 2c 20 30 29  k2FSCTL, &pb, 0)
11170 3b 0a 20 20 69 66 20 28 20 65 72 72 3d 3d 2d 31  ;.  if ( err==-1
11180 20 29 20 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b   ) {.    int rc;
11190 0a 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20  .    int tErrno 
111a0 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 4f 53 54  = errno;.    OST
111b0 52 41 43 45 28 28 22 41 46 50 53 45 54 4c 4f 43  RACE(("AFPSETLOC
111c0 4b 20 66 61 69 6c 65 64 20 74 6f 20 66 73 63 74  K failed to fsct
111d0 6c 28 29 20 27 25 73 27 20 25 64 20 25 73 5c 6e  l() '%s' %d %s\n
111e0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
111f0 70 61 74 68 2c 20 74 45 72 72 6e 6f 2c 20 73 74  path, tErrno, st
11200 72 65 72 72 6f 72 28 74 45 72 72 6e 6f 29 29 29  rerror(tErrno)))
11210 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
11220 49 47 4e 4f 52 45 5f 41 46 50 5f 4c 4f 43 4b 5f  IGNORE_AFP_LOCK_
11230 45 52 52 4f 52 53 0a 20 20 20 20 72 63 20 3d 20  ERRORS.    rc = 
11240 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 23 65 6c  SQLITE_BUSY;.#el
11250 73 65 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  se.    rc = sqli
11260 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78  teErrorFromPosix
11270 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 0a 20 20  Error(tErrno,.  
11280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11290 20 20 73 65 74 4c 6f 63 6b 46 6c 61 67 20 3f 20    setLockFlag ? 
112a0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43  SQLITE_IOERR_LOC
112b0 4b 20 3a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  K : SQLITE_IOERR
112c0 5f 55 4e 4c 4f 43 4b 29 3b 0a 23 65 6e 64 69 66  _UNLOCK);.#endif
112d0 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52   /* SQLITE_IGNOR
112e0 45 5f 41 46 50 5f 4c 4f 43 4b 5f 45 52 52 4f 52  E_AFP_LOCK_ERROR
112f0 53 20 2a 2f 0a 20 20 20 20 69 66 28 20 49 53 5f  S */.    if( IS_
11300 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29  LOCK_ERROR(rc) )
11310 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  {.      pFile->l
11320 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e  astErrno = tErrn
11330 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  o;.    }.    ret
11340 75 72 6e 20 72 63 3b 0a 20 20 7d 20 65 6c 73 65  urn rc;.  } else
11350 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51   {.    return SQ
11360 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a  LITE_OK;.  }.}..
11370 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
11380 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74 68 65  ne checks if the
11390 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44  re is a RESERVED
113a0 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68   lock held on th
113b0 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66  e specified.** f
113c0 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20 61  ile by this or a
113d0 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  ny other process
113e0 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b  . If such a lock
113f0 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70   is held, set *p
11400 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e  ResOut.** to a n
11410 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74  on-zero value ot
11420 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74  herwise *pResOut
11430 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e   is set to zero.
11440 20 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c    The return val
11450 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20  ue.** is set to 
11460 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73  SQLITE_OK unless
11470 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63   an I/O error oc
11480 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b  curs during lock
11490 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74   checking..*/.st
114a0 61 74 69 63 20 69 6e 74 20 61 66 70 43 68 65 63  atic int afpChec
114b0 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71  kReservedLock(sq
114c0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
114d0 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20  int *pResOut){. 
114e0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
114f0 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65 72  _OK;.  int reser
11500 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46  ved = 0;.  unixF
11510 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
11520 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 0a 20  ixFile*)id;.  . 
11530 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
11540 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ( return SQLITE_
11550 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52  IOERR_CHECKRESER
11560 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20  VEDLOCK; );.  . 
11570 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
11580 3b 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f  ;.  afpLockingCo
11590 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 20 3d  ntext *context =
115a0 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74   (afpLockingCont
115b0 65 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f  ext *) pFile->lo
115c0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20  ckingContext;.  
115d0 69 66 28 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73  if( context->res
115e0 65 72 76 65 64 20 29 7b 0a 20 20 20 20 2a 70 52  erved ){.    *pR
115f0 65 73 4f 75 74 20 3d 20 31 3b 0a 20 20 20 20 72  esOut = 1;.    r
11600 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
11610 0a 20 20 7d 0a 20 20 75 6e 69 78 45 6e 74 65 72  .  }.  unixEnter
11620 4d 75 74 65 78 28 29 3b 20 2f 2a 20 42 65 63 61  Mutex(); /* Beca
11630 75 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  use pFile->pInod
11640 65 20 69 73 20 73 68 61 72 65 64 20 61 63 72 6f  e is shared acro
11650 73 73 20 74 68 72 65 61 64 73 20 2a 2f 0a 20 20  ss threads */.  
11660 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61  .  /* Check if a
11670 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 20   thread in this 
11680 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75  process holds su
11690 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69  ch a lock */.  i
116a0 66 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  f( pFile->pInode
116b0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52  ->eFileLock>SHAR
116c0 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72  ED_LOCK ){.    r
116d0 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d  eserved = 1;.  }
116e0 0a 20 20 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69  .  .  /* Otherwi
116f0 73 65 20 73 65 65 20 69 66 20 73 6f 6d 65 20 6f  se see if some o
11700 74 68 65 72 20 70 72 6f 63 65 73 73 20 68 6f 6c  ther process hol
11710 64 73 20 69 74 2e 0a 20 20 20 2a 2f 0a 20 20 69  ds it..   */.  i
11720 66 28 20 21 72 65 73 65 72 76 65 64 20 29 7b 0a  f( !reserved ){.
11730 20 20 20 20 2f 2a 20 6c 6f 63 6b 20 74 68 65 20      /* lock the 
11740 52 45 53 45 52 56 45 44 20 62 79 74 65 20 2a 2f  RESERVED byte */
11750 0a 20 20 20 20 69 6e 74 20 6c 72 63 20 3d 20 61  .    int lrc = a
11760 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78  fpSetLock(contex
11770 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65  t->dbPath, pFile
11780 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c  , RESERVED_BYTE,
11790 20 31 2c 31 29 3b 20 20 0a 20 20 20 20 69 66 28   1,1);  .    if(
117a0 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 6c 72 63 20   SQLITE_OK==lrc 
117b0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 69 66 20 77  ){.      /* if w
117c0 65 20 73 75 63 63 65 65 64 65 64 20 69 6e 20 74  e succeeded in t
117d0 61 6b 69 6e 67 20 74 68 65 20 72 65 73 65 72 76  aking the reserv
117e0 65 64 20 6c 6f 63 6b 2c 20 75 6e 6c 6f 63 6b 20  ed lock, unlock 
117f0 69 74 20 74 6f 20 72 65 73 74 6f 72 65 0a 20 20  it to restore.  
11800 20 20 20 20 2a 2a 20 74 68 65 20 6f 72 69 67 69      ** the origi
11810 6e 61 6c 20 73 74 61 74 65 20 2a 2f 0a 20 20 20  nal state */.   
11820 20 20 20 6c 72 63 20 3d 20 61 66 70 53 65 74 4c     lrc = afpSetL
11830 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50  ock(context->dbP
11840 61 74 68 2c 20 70 46 69 6c 65 2c 20 52 45 53 45  ath, pFile, RESE
11850 52 56 45 44 5f 42 59 54 45 2c 20 31 2c 20 30 29  RVED_BYTE, 1, 0)
11860 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20  ;.    } else {. 
11870 20 20 20 20 20 2f 2a 20 69 66 20 77 65 20 66 61       /* if we fa
11880 69 6c 65 64 20 74 6f 20 67 65 74 20 74 68 65 20  iled to get the 
11890 6c 6f 63 6b 20 74 68 65 6e 20 73 6f 6d 65 6f 6e  lock then someon
118a0 65 20 65 6c 73 65 20 6d 75 73 74 20 68 61 76 65  e else must have
118b0 20 69 74 20 2a 2f 0a 20 20 20 20 20 20 72 65 73   it */.      res
118c0 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d  erved = 1;.    }
118d0 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b  .    if( IS_LOCK
118e0 5f 45 52 52 4f 52 28 6c 72 63 29 20 29 7b 0a 20  _ERROR(lrc) ){. 
118f0 20 20 20 20 20 72 63 3d 6c 72 63 3b 0a 20 20 20       rc=lrc;.   
11900 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 75 6e 69 78   }.  }.  .  unix
11910 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
11920 4f 53 54 52 41 43 45 28 28 22 54 45 53 54 20 57  OSTRACE(("TEST W
11930 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 20  R-LOCK %d %d %d 
11940 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  (afp)\n", pFile-
11950 3e 68 2c 20 72 63 2c 20 72 65 73 65 72 76 65 64  >h, rc, reserved
11960 29 29 3b 0a 20 20 0a 20 20 2a 70 52 65 73 4f 75  ));.  .  *pResOu
11970 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20 20  t = reserved;.  
11980 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
11990 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c  .** Lock the fil
119a0 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20  e with the lock 
119b0 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61 72  specified by par
119c0 61 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b  ameter eFileLock
119d0 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65   - one.** of the
119e0 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
119f0 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45 44  *     (1) SHARED
11a00 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29  _LOCK.**     (2)
11a10 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a   RESERVED_LOCK.*
11a20 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e  *     (3) PENDIN
11a30 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34  G_LOCK.**     (4
11a40 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ) EXCLUSIVE_LOCK
11a50 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73  .**.** Sometimes
11a60 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67   when requesting
11a70 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c   one lock state,
11a80 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b   additional lock
11a90 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69   states.** are i
11aa0 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77 65  nserted in betwe
11ab0 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67  en.  The locking
11ac0 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f   might fail on o
11ad0 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a  ne of the later.
11ae0 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c  ** transitions l
11af0 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20  eaving the lock 
11b00 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74 20  state different 
11b10 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61  from what it sta
11b20 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c  rted but.** stil
11b30 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67  l short of its g
11b40 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  oal.  The follow
11b50 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73 20  ing chart shows 
11b60 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74  the allowed.** t
11b70 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74  ransitions and t
11b80 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65  he inserted inte
11b90 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73 3a  rmediate states:
11ba0 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b  .**.**    UNLOCK
11bb0 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20  ED -> SHARED.** 
11bc0 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53     SHARED -> RES
11bd0 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52  ERVED.**    SHAR
11be0 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20  ED -> (PENDING) 
11bf0 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  -> EXCLUSIVE.** 
11c00 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28     RESERVED -> (
11c10 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c  PENDING) -> EXCL
11c20 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44  USIVE.**    PEND
11c30 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  ING -> EXCLUSIVE
11c40 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
11c50 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e  ine will only in
11c60 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20  crease a lock.  
11c70 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 4f  Use the sqlite3O
11c80 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75  sUnlock().** rou
11c90 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61 20  tine to lower a 
11ca0 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a  locking level..*
11cb0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66 70  /.static int afp
11cc0 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
11cd0 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65  e *id, int eFile
11ce0 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72 63 20  Lock){.  int rc 
11cf0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75  = SQLITE_OK;.  u
11d00 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
11d10 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
11d20 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20    unixInodeInfo 
11d30 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d  *pInode = pFile-
11d40 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 66 70 4c 6f  >pInode;.  afpLo
11d50 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 63 6f  ckingContext *co
11d60 6e 74 65 78 74 20 3d 20 28 61 66 70 4c 6f 63 6b  ntext = (afpLock
11d70 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 20 70 46  ingContext *) pF
11d80 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
11d90 65 78 74 3b 0a 20 20 0a 20 20 61 73 73 65 72 74  ext;.  .  assert
11da0 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54  ( pFile );.  OST
11db0 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25  RACE(("LOCK    %
11dc0 64 20 25 73 20 77 61 73 20 25 73 28 25 73 2c 25  d %s was %s(%s,%
11dd0 64 29 20 70 69 64 3d 25 64 20 28 61 66 70 29 5c  d) pid=%d (afp)\
11de0 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20  n", pFile->h,.  
11df0 20 20 20 20 20 20 20 20 20 61 7a 46 69 6c 65 4c           azFileL
11e00 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20  ock(eFileLock), 
11e10 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65  azFileLock(pFile
11e20 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c 0a 20 20  ->eFileLock),.  
11e30 20 20 20 20 20 20 20 20 20 61 7a 46 69 6c 65 4c           azFileL
11e40 6f 63 6b 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c  ock(pInode->eFil
11e50 65 4c 6f 63 6b 29 2c 20 70 49 6e 6f 64 65 2d 3e  eLock), pInode->
11e60 6e 53 68 61 72 65 64 20 2c 20 67 65 74 70 69 64  nShared , getpid
11e70 28 29 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  ()));..  /* If t
11e80 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20  here is already 
11e90 61 20 6c 6f 63 6b 20 6f 66 20 74 68 69 73 20 74  a lock of this t
11ea0 79 70 65 20 6f 72 20 6d 6f 72 65 20 72 65 73 74  ype or more rest
11eb0 72 69 63 74 69 76 65 20 6f 6e 20 74 68 65 0a 20  rictive on the. 
11ec0 20 2a 2a 20 75 6e 69 78 46 69 6c 65 2c 20 64 6f   ** unixFile, do
11ed0 20 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e 27 74 20   nothing. Don't 
11ee0 75 73 65 20 74 68 65 20 61 66 70 5f 65 6e 64 5f  use the afp_end_
11ef0 6c 6f 63 6b 3a 20 65 78 69 74 20 70 61 74 68 2c  lock: exit path,
11f00 20 61 73 0a 20 20 2a 2a 20 75 6e 69 78 45 6e 74   as.  ** unixEnt
11f10 65 72 4d 75 74 65 78 28 29 20 68 61 73 6e 27 74  erMutex() hasn't
11f20 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 79 65 74   been called yet
11f30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ..  */.  if( pFi
11f40 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 65  le->eFileLock>=e
11f50 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  FileLock ){.    
11f60 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20  OSTRACE(("LOCK  
11f70 20 20 25 64 20 25 73 20 6f 6b 20 28 61 6c 72 65    %d %s ok (alre
11f80 61 64 79 20 68 65 6c 64 29 20 28 61 66 70 29 5c  ady held) (afp)\
11f90 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20  n", pFile->h,.  
11fa0 20 20 20 20 20 20 20 20 20 61 7a 46 69 6c 65 4c           azFileL
11fb0 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 29 29  ock(eFileLock)))
11fc0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
11fd0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f  ITE_OK;.  }..  /
11fe0 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
11ff0 6c 6f 63 6b 69 6e 67 20 73 65 71 75 65 6e 63 65  locking sequence
12000 20 69 73 20 63 6f 72 72 65 63 74 0a 20 20 2a 2a   is correct.  **
12010 20 20 28 31 29 20 57 65 20 6e 65 76 65 72 20 6d    (1) We never m
12020 6f 76 65 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65  ove from unlocke
12030 64 20 74 6f 20 61 6e 79 74 68 69 6e 67 20 68 69  d to anything hi
12040 67 68 65 72 20 74 68 61 6e 20 73 68 61 72 65 64  gher than shared
12050 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28 32 29   lock..  **  (2)
12060 20 53 51 4c 69 74 65 20 6e 65 76 65 72 20 65 78   SQLite never ex
12070 70 6c 69 63 69 74 6c 79 20 72 65 71 75 65 73 74  plicitly request
12080 73 20 61 20 70 65 6e 64 69 67 20 6c 6f 63 6b 2e  s a pendig lock.
12090 0a 20 20 2a 2a 20 20 28 33 29 20 41 20 73 68 61  .  **  (3) A sha
120a0 72 65 64 20 6c 6f 63 6b 20 69 73 20 61 6c 77 61  red lock is alwa
120b0 79 73 20 68 65 6c 64 20 77 68 65 6e 20 61 20 72  ys held when a r
120c0 65 73 65 72 76 65 20 6c 6f 63 6b 20 69 73 20 72  eserve lock is r
120d0 65 71 75 65 73 74 65 64 2e 0a 20 20 2a 2f 0a 20  equested..  */. 
120e0 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e   assert( pFile->
120f0 65 46 69 6c 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f  eFileLock!=NO_LO
12100 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3d  CK || eFileLock=
12110 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
12120 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c    assert( eFileL
12130 6f 63 6b 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43  ock!=PENDING_LOC
12140 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65  K );.  assert( e
12150 46 69 6c 65 4c 6f 63 6b 21 3d 52 45 53 45 52 56  FileLock!=RESERV
12160 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c 65  ED_LOCK || pFile
12170 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41  ->eFileLock==SHA
12180 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20  RED_LOCK );.  . 
12190 20 2f 2a 20 54 68 69 73 20 6d 75 74 65 78 20 69   /* This mutex i
121a0 73 20 6e 65 65 64 65 64 20 62 65 63 61 75 73 65  s needed because
121b0 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 69   pFile->pInode i
121c0 73 20 73 68 61 72 65 64 20 61 63 72 6f 73 73 20  s shared across 
121d0 74 68 72 65 61 64 73 0a 20 20 2a 2f 0a 20 20 75  threads.  */.  u
121e0 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
121f0 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c  .  pInode = pFil
12200 65 2d 3e 70 49 6e 6f 64 65 3b 0a 0a 20 20 2f 2a  e->pInode;..  /*
12210 20 49 66 20 73 6f 6d 65 20 74 68 72 65 61 64 20   If some thread 
12220 75 73 69 6e 67 20 74 68 69 73 20 50 49 44 20 68  using this PID h
12230 61 73 20 61 20 6c 6f 63 6b 20 76 69 61 20 61 20  as a lock via a 
12240 64 69 66 66 65 72 65 6e 74 20 75 6e 69 78 46 69  different unixFi
12250 6c 65 2a 0a 20 20 2a 2a 20 68 61 6e 64 6c 65 20  le*.  ** handle 
12260 74 68 61 74 20 70 72 65 63 6c 75 64 65 73 20 74  that precludes t
12270 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63  he requested loc
12280 6b 2c 20 72 65 74 75 72 6e 20 42 55 53 59 2e 0a  k, return BUSY..
12290 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 46 69 6c    */.  if( (pFil
122a0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 70 49  e->eFileLock!=pI
122b0 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  node->eFileLock 
122c0 26 26 20 0a 20 20 20 20 20 20 20 28 70 49 6e 6f  && .       (pIno
122d0 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 50  de->eFileLock>=P
122e0 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 7c 7c 20 65  ENDING_LOCK || e
122f0 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f  FileLock>SHARED_
12300 4c 4f 43 4b 29 29 0a 20 20 20 20 20 29 7b 0a 20  LOCK)).     ){. 
12310 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
12320 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20 61 66  USY;.    goto af
12330 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a  p_end_lock;.  }.
12340 20 20 0a 20 20 2f 2a 20 49 66 20 61 20 53 48 41    .  /* If a SHA
12350 52 45 44 20 6c 6f 63 6b 20 69 73 20 72 65 71 75  RED lock is requ
12360 65 73 74 65 64 2c 20 61 6e 64 20 73 6f 6d 65 20  ested, and some 
12370 74 68 72 65 61 64 20 75 73 69 6e 67 20 74 68 69  thread using thi
12380 73 20 50 49 44 20 61 6c 72 65 61 64 79 0a 20 20  s PID already.  
12390 2a 2a 20 68 61 73 20 61 20 53 48 41 52 45 44 20  ** has a SHARED 
123a0 6f 72 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b  or RESERVED lock
123b0 2c 20 74 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74  , then increment
123c0 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
123d0 73 20 61 6e 64 0a 20 20 2a 2a 20 72 65 74 75 72  s and.  ** retur
123e0 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 20 20 2a  n SQLITE_OK..  *
123f0 2f 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63  /.  if( eFileLoc
12400 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26  k==SHARED_LOCK &
12410 26 20 0a 20 20 20 20 20 28 70 49 6e 6f 64 65 2d  & .     (pInode-
12420 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52  >eFileLock==SHAR
12430 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64  ED_LOCK || pInod
12440 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45  e->eFileLock==RE
12450 53 45 52 56 45 44 5f 4c 4f 43 4b 29 20 29 7b 0a  SERVED_LOCK) ){.
12460 20 20 20 20 61 73 73 65 72 74 28 20 65 46 69 6c      assert( eFil
12470 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
12480 43 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  CK );.    assert
12490 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ( pFile->eFileLo
124a0 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  ck==0 );.    ass
124b0 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68  ert( pInode->nSh
124c0 61 72 65 64 3e 30 20 29 3b 0a 20 20 20 20 70 46  ared>0 );.    pF
124d0 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
124e0 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20   SHARED_LOCK;.  
124f0 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65    pInode->nShare
12500 64 2b 2b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d  d++;.    pInode-
12510 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 67 6f  >nLock++;.    go
12520 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b  to afp_end_lock;
12530 0a 20 20 7d 0a 20 20 20 20 0a 20 20 2f 2a 20 41  .  }.    .  /* A
12540 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73   PENDING lock is
12550 20 6e 65 65 64 65 64 20 62 65 66 6f 72 65 20 61   needed before a
12560 63 71 75 69 72 69 6e 67 20 61 20 53 48 41 52 45  cquiring a SHARE
12570 44 20 6c 6f 63 6b 20 61 6e 64 20 62 65 66 6f 72  D lock and befor
12580 65 0a 20 20 2a 2a 20 61 63 71 75 69 72 69 6e 67  e.  ** acquiring
12590 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
125a0 63 6b 2e 20 20 46 6f 72 20 74 68 65 20 53 48 41  ck.  For the SHA
125b0 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20 50 45  RED lock, the PE
125c0 4e 44 49 4e 47 20 77 69 6c 6c 0a 20 20 2a 2a 20  NDING will.  ** 
125d0 62 65 20 72 65 6c 65 61 73 65 64 2e 0a 20 20 2a  be released..  *
125e0 2f 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63  /.  if( eFileLoc
125f0 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 0a  k==SHARED_LOCK .
12600 20 20 20 20 20 20 7c 7c 20 28 65 46 69 6c 65 4c        || (eFileL
12610 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
12620 4f 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65 46  OCK && pFile->eF
12630 69 6c 65 4c 6f 63 6b 3c 50 45 4e 44 49 4e 47 5f  ileLock<PENDING_
12640 4c 4f 43 4b 29 0a 20 20 29 7b 0a 20 20 20 20 69  LOCK).  ){.    i
12650 6e 74 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 66  nt failed;.    f
12660 61 69 6c 65 64 20 3d 20 61 66 70 53 65 74 4c 6f  ailed = afpSetLo
12670 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61  ck(context->dbPa
12680 74 68 2c 20 70 46 69 6c 65 2c 20 50 45 4e 44 49  th, pFile, PENDI
12690 4e 47 5f 42 59 54 45 2c 20 31 2c 20 31 29 3b 0a  NG_BYTE, 1, 1);.
126a0 20 20 20 20 69 66 20 28 66 61 69 6c 65 64 29 20      if (failed) 
126b0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 61 69  {.      rc = fai
126c0 6c 65 64 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  led;.      goto 
126d0 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20  afp_end_lock;.  
126e0 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20    }.  }.  .  /* 
126f0 49 66 20 63 6f 6e 74 72 6f 6c 20 67 65 74 73 20  If control gets 
12700 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74  to this point, t
12710 68 65 6e 20 61 63 74 75 61 6c 6c 79 20 67 6f 20  hen actually go 
12720 61 68 65 61 64 20 61 6e 64 20 6d 61 6b 65 0a 20  ahead and make. 
12730 20 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 73 79   ** operating sy
12740 73 74 65 6d 20 63 61 6c 6c 73 20 66 6f 72 20 74  stem calls for t
12750 68 65 20 73 70 65 63 69 66 69 65 64 20 6c 6f 63  he specified loc
12760 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 46  k..  */.  if( eF
12770 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
12780 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20  LOCK ){.    int 
12790 6c 72 63 31 2c 20 6c 72 63 32 2c 20 6c 72 63 31  lrc1, lrc2, lrc1
127a0 45 72 72 6e 6f 3b 0a 20 20 20 20 6c 6f 6e 67 20  Errno;.    long 
127b0 6c 6b 2c 20 6d 61 73 6b 3b 0a 20 20 20 20 0a 20  lk, mask;.    . 
127c0 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64     assert( pInod
127d0 65 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29 3b  e->nShared==0 );
127e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e  .    assert( pIn
127f0 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ode->eFileLock==
12800 30 20 29 3b 0a 20 20 20 20 20 20 20 20 0a 20 20  0 );.        .  
12810 20 20 6d 61 73 6b 20 3d 20 28 73 69 7a 65 6f 66    mask = (sizeof
12820 28 6c 6f 6e 67 29 3d 3d 38 29 20 3f 20 4c 41 52  (long)==8) ? LAR
12830 47 45 53 54 5f 49 4e 54 36 34 20 3a 20 30 78 37  GEST_INT64 : 0x7
12840 66 66 66 66 66 66 66 3b 0a 20 20 20 20 2f 2a 20  fffffff;.    /* 
12850 4e 6f 77 20 67 65 74 20 74 68 65 20 72 65 61 64  Now get the read
12860 2d 6c 6f 63 6b 20 53 48 41 52 45 44 5f 4c 4f 43  -lock SHARED_LOC
12870 4b 20 2a 2f 0a 20 20 20 20 2f 2a 20 6e 6f 74 65  K */.    /* note
12880 20 74 68 61 74 20 74 68 65 20 71 75 61 6c 69 74   that the qualit
12890 79 20 6f 66 20 74 68 65 20 72 61 6e 64 6f 6d 6e  y of the randomn
128a0 65 73 73 20 64 6f 65 73 6e 27 74 20 6d 61 74 74  ess doesn't matt
128b0 65 72 20 74 68 61 74 20 6d 75 63 68 20 2a 2f 0a  er that much */.
128c0 20 20 20 20 6c 6b 20 3d 20 72 61 6e 64 6f 6d 28      lk = random(
128d0 29 3b 20 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e  ); .    pInode->
128e0 73 68 61 72 65 64 42 79 74 65 20 3d 20 28 6c 6b  sharedByte = (lk
128f0 20 26 20 6d 61 73 6b 29 25 28 53 48 41 52 45 44   & mask)%(SHARED
12900 5f 53 49 5a 45 20 2d 20 31 29 3b 0a 20 20 20 20  _SIZE - 1);.    
12910 6c 72 63 31 20 3d 20 61 66 70 53 65 74 4c 6f 63  lrc1 = afpSetLoc
12920 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74  k(context->dbPat
12930 68 2c 20 70 46 69 6c 65 2c 20 0a 20 20 20 20 20  h, pFile, .     
12940 20 20 20 20 20 53 48 41 52 45 44 5f 46 49 52 53       SHARED_FIRS
12950 54 2b 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64  T+pInode->shared
12960 42 79 74 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20  Byte, 1, 1);.   
12970 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
12980 4f 52 28 6c 72 63 31 29 20 29 7b 0a 20 20 20 20  OR(lrc1) ){.    
12990 20 20 6c 72 63 31 45 72 72 6e 6f 20 3d 20 70 46    lrc1Errno = pF
129a0 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a  ile->lastErrno;.
129b0 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 44 72 6f      }.    /* Dro
129c0 70 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  p the temporary 
129d0 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 2a 2f 0a  PENDING lock */.
129e0 20 20 20 20 6c 72 63 32 20 3d 20 61 66 70 53 65      lrc2 = afpSe
129f0 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64  tLock(context->d
12a00 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 50 45  bPath, pFile, PE
12a10 4e 44 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20 30  NDING_BYTE, 1, 0
12a20 29 3b 0a 20 20 20 20 0a 20 20 20 20 69 66 28 20  );.    .    if( 
12a30 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72  IS_LOCK_ERROR(lr
12a40 63 31 29 20 29 20 7b 0a 20 20 20 20 20 20 70 46  c1) ) {.      pF
12a50 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
12a60 20 6c 72 63 31 45 72 72 6e 6f 3b 0a 20 20 20 20   lrc1Errno;.    
12a70 20 20 72 63 20 3d 20 6c 72 63 31 3b 0a 20 20 20    rc = lrc1;.   
12a80 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f     goto afp_end_
12a90 6c 6f 63 6b 3b 0a 20 20 20 20 7d 20 65 6c 73 65  lock;.    } else
12aa0 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
12ab0 4f 52 28 6c 72 63 32 29 20 29 7b 0a 20 20 20 20  OR(lrc2) ){.    
12ac0 20 20 72 63 20 3d 20 6c 72 63 32 3b 0a 20 20 20    rc = lrc2;.   
12ad0 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f     goto afp_end_
12ae0 6c 6f 63 6b 3b 0a 20 20 20 20 7d 20 65 6c 73 65  lock;.    } else
12af0 20 69 66 28 20 6c 72 63 31 20 21 3d 20 53 51 4c   if( lrc1 != SQL
12b00 49 54 45 5f 4f 4b 20 29 20 7b 0a 20 20 20 20 20  ITE_OK ) {.     
12b10 20 72 63 20 3d 20 6c 72 63 31 3b 0a 20 20 20 20   rc = lrc1;.    
12b20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 70  } else {.      p
12b30 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
12b40 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20  = SHARED_LOCK;. 
12b50 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f       pInode->nLo
12b60 63 6b 2b 2b 3b 0a 20 20 20 20 20 20 70 49 6e 6f  ck++;.      pIno
12b70 64 65 2d 3e 6e 53 68 61 72 65 64 20 3d 20 31 3b  de->nShared = 1;
12b80 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
12b90 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58  f( eFileLock==EX
12ba0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20  CLUSIVE_LOCK && 
12bb0 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e  pInode->nShared>
12bc0 31 20 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20 61  1 ){.    /* We a
12bd0 72 65 20 74 72 79 69 6e 67 20 66 6f 72 20 61 6e  re trying for an
12be0 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20   exclusive lock 
12bf0 62 75 74 20 61 6e 6f 74 68 65 72 20 74 68 72 65  but another thre
12c00 61 64 20 69 6e 20 74 68 69 73 0a 20 20 20 20 20  ad in this.     
12c10 2a 2a 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20  ** same process 
12c20 69 73 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67  is still holding
12c30 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20   a shared lock. 
12c40 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  */.    rc = SQLI
12c50 54 45 5f 42 55 53 59 3b 0a 20 20 7d 65 6c 73 65  TE_BUSY;.  }else
12c60 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71  {.    /* The req
12c70 75 65 73 74 20 77 61 73 20 66 6f 72 20 61 20 52  uest was for a R
12c80 45 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55  ESERVED or EXCLU
12c90 53 49 56 45 20 6c 6f 63 6b 2e 20 20 49 74 20 69  SIVE lock.  It i
12ca0 73 0a 20 20 20 20 2a 2a 20 61 73 73 75 6d 65 64  s.    ** assumed
12cb0 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20 61   that there is a
12cc0 20 53 48 41 52 45 44 20 6f 72 20 67 72 65 61 74   SHARED or great
12cd0 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66  er lock on the f
12ce0 69 6c 65 0a 20 20 20 20 2a 2a 20 61 6c 72 65 61  ile.    ** alrea
12cf0 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  dy..    */.    i
12d00 6e 74 20 66 61 69 6c 65 64 20 3d 20 30 3b 0a 20  nt failed = 0;. 
12d10 20 20 20 61 73 73 65 72 74 28 20 30 21 3d 70 46     assert( 0!=pF
12d20 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 29  ile->eFileLock )
12d30 3b 0a 20 20 20 20 69 66 20 28 65 46 69 6c 65 4c  ;.    if (eFileL
12d40 6f 63 6b 20 3e 3d 20 52 45 53 45 52 56 45 44 5f  ock >= RESERVED_
12d50 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65  LOCK && pFile->e
12d60 46 69 6c 65 4c 6f 63 6b 20 3c 20 52 45 53 45 52  FileLock < RESER
12d70 56 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20  VED_LOCK) {.    
12d80 20 20 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61      /* Acquire a
12d90 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 2a   RESERVED lock *
12da0 2f 0a 20 20 20 20 20 20 20 20 66 61 69 6c 65 64  /.        failed
12db0 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f   = afpSetLock(co
12dc0 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70  ntext->dbPath, p
12dd0 46 69 6c 65 2c 20 52 45 53 45 52 56 45 44 5f 42  File, RESERVED_B
12de0 59 54 45 2c 20 31 2c 31 29 3b 0a 20 20 20 20 20  YTE, 1,1);.     
12df0 20 69 66 28 20 21 66 61 69 6c 65 64 20 29 7b 0a   if( !failed ){.
12e00 20 20 20 20 20 20 20 20 63 6f 6e 74 65 78 74 2d          context-
12e10 3e 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20  >reserved = 1;. 
12e20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
12e30 20 69 66 20 28 21 66 61 69 6c 65 64 20 26 26 20   if (!failed && 
12e40 65 46 69 6c 65 4c 6f 63 6b 20 3d 3d 20 45 58 43  eFileLock == EXC
12e50 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 20 7b 0a 20  LUSIVE_LOCK) {. 
12e60 20 20 20 20 20 2f 2a 20 41 63 71 75 69 72 65 20       /* Acquire 
12e70 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
12e80 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 0a 20 20  k */.        .  
12e90 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68      /* Remove th
12ea0 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 62 65  e shared lock be
12eb0 66 6f 72 65 20 74 72 79 69 6e 67 20 74 68 65 20  fore trying the 
12ec0 72 61 6e 67 65 2e 20 20 77 65 27 6c 6c 20 6e 65  range.  we'll ne
12ed0 65 64 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20  ed to .      ** 
12ee0 72 65 65 73 74 61 62 6c 69 73 68 20 74 68 65 20  reestablish the 
12ef0 73 68 61 72 65 64 20 6c 6f 63 6b 20 69 66 20 77  shared lock if w
12f00 65 20 63 61 6e 27 74 20 67 65 74 20 74 68 65 20  e can't get the 
12f10 20 61 66 70 55 6e 6c 6f 63 6b 0a 20 20 20 20 20   afpUnlock.     
12f20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21 28   */.      if( !(
12f30 66 61 69 6c 65 64 20 3d 20 61 66 70 53 65 74 4c  failed = afpSetL
12f40 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50  ock(context->dbP
12f50 61 74 68 2c 20 70 46 69 6c 65 2c 20 53 48 41 52  ath, pFile, SHAR
12f60 45 44 5f 46 49 52 53 54 20 2b 0a 20 20 20 20 20  ED_FIRST +.     
12f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12f80 20 20 20 20 70 49 6e 6f 64 65 2d 3e 73 68 61 72      pInode->shar
12f90 65 64 42 79 74 65 2c 20 31 2c 20 30 29 29 20 29  edByte, 1, 0)) )
12fa0 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 66 61  {.        int fa
12fb0 69 6c 65 64 32 20 3d 20 53 51 4c 49 54 45 5f 4f  iled2 = SQLITE_O
12fc0 4b 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 6e 6f  K;.        /* no
12fd0 77 20 61 74 74 65 6d 6d 70 74 20 74 6f 20 67 65  w attemmpt to ge
12fe0 74 20 74 68 65 20 65 78 63 6c 75 73 69 76 65 20  t the exclusive 
12ff0 6c 6f 63 6b 20 72 61 6e 67 65 20 2a 2f 0a 20 20  lock range */.  
13000 20 20 20 20 20 20 66 61 69 6c 65 64 20 3d 20 61        failed = a
13010 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78  fpSetLock(contex
13020 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65  t->dbPath, pFile
13030 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20  , SHARED_FIRST, 
13040 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13060 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 31 29 3b  SHARED_SIZE, 1);
13070 0a 20 20 20 20 20 20 20 20 69 66 28 20 66 61 69  .        if( fai
13080 6c 65 64 20 26 26 20 28 66 61 69 6c 65 64 32 20  led && (failed2 
13090 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e  = afpSetLock(con
130a0 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46  text->dbPath, pF
130b0 69 6c 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ile, .          
130c0 20 20 20 20 20 20 20 20 20 20 20 20 20 53 48 41               SHA
130d0 52 45 44 5f 46 49 52 53 54 20 2b 20 70 49 6e 6f  RED_FIRST + pIno
130e0 64 65 2d 3e 73 68 61 72 65 64 42 79 74 65 2c 20  de->sharedByte, 
130f0 31 2c 20 31 29 29 20 29 7b 0a 20 20 20 20 20 20  1, 1)) ){.      
13100 20 20 20 20 2f 2a 20 43 61 6e 27 74 20 72 65 65      /* Can't ree
13110 73 74 61 62 6c 69 73 68 20 74 68 65 20 73 68 61  stablish the sha
13120 72 65 64 20 6c 6f 63 6b 2e 20 20 53 71 6c 69 74  red lock.  Sqlit
13130 65 20 63 61 6e 27 74 20 64 65 61 6c 2c 20 74 68  e can't deal, th
13140 69 73 20 69 73 0a 20 20 20 20 20 20 20 20 20 20  is is.          
13150 2a 2a 20 61 20 63 72 69 74 69 63 61 6c 20 49 2f  ** a critical I/
13160 4f 20 65 72 72 6f 72 0a 20 20 20 20 20 20 20 20  O error.        
13170 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72    */.          r
13180 63 20 3d 20 28 28 66 61 69 6c 65 64 20 26 20 53  c = ((failed & S
13190 51 4c 49 54 45 5f 49 4f 45 52 52 29 20 3d 3d 20  QLITE_IOERR) == 
131a0 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 20 3f 20  SQLITE_IOERR) ? 
131b0 66 61 69 6c 65 64 32 20 3a 20 0a 20 20 20 20 20  failed2 : .     
131c0 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
131d0 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20  _IOERR_LOCK;.   
131e0 20 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70 5f         goto afp_
131f0 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 20 20  end_lock;.      
13200 20 20 7d 20 0a 20 20 20 20 20 20 7d 65 6c 73 65    } .      }else
13210 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 66  {.        rc = f
13220 61 69 6c 65 64 3b 20 0a 20 20 20 20 20 20 7d 0a  ailed; .      }.
13230 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 66 61      }.    if( fa
13240 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 72 63  iled ){.      rc
13250 20 3d 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d   = failed;.    }
13260 0a 20 20 7d 0a 20 20 0a 20 20 69 66 28 20 72 63  .  }.  .  if( rc
13270 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
13280 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
13290 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b  ock = eFileLock;
132a0 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69  .    pInode->eFi
132b0 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f  leLock = eFileLo
132c0 63 6b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ck;.  }else if( 
132d0 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55  eFileLock==EXCLU
132e0 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  SIVE_LOCK ){.   
132f0 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
13300 6b 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  k = PENDING_LOCK
13310 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46  ;.    pInode->eF
13320 69 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e 44 49 4e  ileLock = PENDIN
13330 47 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a 20 20 0a 61  G_LOCK;.  }.  .a
13340 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 75  fp_end_lock:.  u
13350 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
13360 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43  .  OSTRACE(("LOC
13370 4b 20 20 20 20 25 64 20 25 73 20 25 73 20 28 61  K    %d %s %s (a
13380 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  fp)\n", pFile->h
13390 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69  , azFileLock(eFi
133a0 6c 65 4c 6f 63 6b 29 2c 20 0a 20 20 20 20 20 20  leLock), .      
133b0 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b     rc==SQLITE_OK
133c0 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65   ? "ok" : "faile
133d0 64 22 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  d"));.  return r
133e0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65  c;.}../*.** Lowe
133f0 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  r the locking le
13400 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63  vel on file desc
13410 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20  riptor pFile to 
13420 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c  eFileLock.  eFil
13430 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65  eLock.** must be
13440 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20   either NO_LOCK 
13450 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a  or SHARED_LOCK..
13460 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63  **.** If the loc
13470 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68  king level of th
13480 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
13490 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20  r is already at 
134a0 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20  or below.** the 
134b0 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e  requested lockin
134c0 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f  g level, this ro
134d0 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
134e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
134f0 61 66 70 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65  afpUnlock(sqlite
13500 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
13510 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 69  eFileLock) {.  i
13520 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
13530 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  K;.  unixFile *p
13540 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
13550 2a 29 69 64 3b 0a 20 20 75 6e 69 78 49 6e 6f 64  *)id;.  unixInod
13560 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a 20  eInfo *pInode;. 
13570 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65   afpLockingConte
13580 78 74 20 2a 63 6f 6e 74 65 78 74 20 3d 20 28 61  xt *context = (a
13590 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
135a0 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69   *) pFile->locki
135b0 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 69 6e 74  ngContext;.  int
135c0 20 73 6b 69 70 53 68 61 72 65 64 20 3d 20 30 3b   skipShared = 0;
135d0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
135e0 45 53 54 0a 20 20 69 6e 74 20 68 20 3d 20 70 46  EST.  int h = pF
135f0 69 6c 65 2d 3e 68 3b 0a 23 65 6e 64 69 66 0a 0a  ile->h;.#endif..
13600 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
13610 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55  );.  OSTRACE(("U
13620 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73  NLOCK  %d %d was
13630 20 25 64 28 25 64 2c 25 64 29 20 70 69 64 3d 25   %d(%d,%d) pid=%
13640 64 20 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c  d (afp)\n", pFil
13650 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c  e->h, eFileLock,
13660 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c  .           pFil
13670 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 70 46  e->eFileLock, pF
13680 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69  ile->pInode->eFi
13690 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e 70  leLock, pFile->p
136a0 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2c 0a  Inode->nShared,.
136b0 20 20 20 20 20 20 20 20 20 20 20 67 65 74 70 69             getpi
136c0 64 28 29 29 29 3b 0a 0a 20 20 61 73 73 65 72 74  d()));..  assert
136d0 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41  ( eFileLock<=SHA
136e0 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66  RED_LOCK );.  if
136f0 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ( pFile->eFileLo
13700 63 6b 3c 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b  ck<=eFileLock ){
13710 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
13720 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 75 6e 69  TE_OK;.  }.  uni
13730 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  xEnterMutex();. 
13740 20 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d   pInode = pFile-
13750 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 73 73 65 72  >pInode;.  asser
13760 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72  t( pInode->nShar
13770 65 64 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  ed!=0 );.  if( p
13780 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e  File->eFileLock>
13790 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20  SHARED_LOCK ){. 
137a0 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64     assert( pInod
137b0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 70 46  e->eFileLock==pF
137c0 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 29  ile->eFileLock )
137d0 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f  ;.    SimulateIO
137e0 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a  ErrorBenign(1);.
137f0 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72      SimulateIOEr
13800 72 6f 72 28 20 68 3d 28 2d 31 29 20 29 0a 20 20  ror( h=(-1) ).  
13810 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
13820 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20  rBenign(0);.    
13830 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
13840 20 20 20 20 2f 2a 20 57 68 65 6e 20 72 65 64 75      /* When redu
13850 63 69 6e 67 20 61 20 6c 6f 63 6b 20 73 75 63 68  cing a lock such
13860 20 74 68 61 74 20 6f 74 68 65 72 20 70 72 6f 63   that other proc
13870 65 73 73 65 73 20 63 61 6e 20 73 74 61 72 74 0a  esses can start.
13880 20 20 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 74      ** reading t
13890 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
138a0 20 61 67 61 69 6e 2c 20 6d 61 6b 65 20 73 75 72   again, make sur
138b0 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 2a  e that the.    *
138c0 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f  * transaction co
138d0 75 6e 74 65 72 20 77 61 73 20 75 70 64 61 74 65  unter was update
138e0 64 20 69 66 20 61 6e 79 20 70 61 72 74 20 6f 66  d if any part of
138f0 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20   the database.  
13900 20 20 2a 2a 20 66 69 6c 65 20 63 68 61 6e 67 65    ** file change
13910 64 2e 20 20 49 66 20 74 68 65 20 74 72 61 6e 73  d.  If the trans
13920 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 69  action counter i
13930 73 20 6e 6f 74 20 75 70 64 61 74 65 64 2c 0a 20  s not updated,. 
13940 20 20 20 2a 2a 20 6f 74 68 65 72 20 63 6f 6e 6e     ** other conn
13950 65 63 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 73  ections to the s
13960 61 6d 65 20 66 69 6c 65 20 6d 69 67 68 74 20 6e  ame file might n
13970 6f 74 20 72 65 61 6c 69 7a 65 20 74 68 61 74 0a  ot realize that.
13980 20 20 20 20 2a 2a 20 74 68 65 20 66 69 6c 65 20      ** the file 
13990 68 61 73 20 63 68 61 6e 67 65 64 20 61 6e 64 20  has changed and 
139a0 68 65 6e 63 65 20 6d 69 67 68 74 20 6e 6f 74 20  hence might not 
139b0 6b 6e 6f 77 20 74 6f 20 66 6c 75 73 68 20 74 68  know to flush th
139c0 65 69 72 0a 20 20 20 20 2a 2a 20 63 61 63 68 65  eir.    ** cache
139d0 2e 20 20 54 68 65 20 75 73 65 20 6f 66 20 61 20  .  The use of a 
139e0 73 74 61 6c 65 20 63 61 63 68 65 20 63 61 6e 20  stale cache can 
139f0 6c 65 61 64 20 74 6f 20 64 61 74 61 62 61 73 65  lead to database
13a00 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20   corruption..   
13a10 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
13a20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57  pFile->inNormalW
13a30 72 69 74 65 3d 3d 30 0a 20 20 20 20 20 20 20 20  rite==0.        
13a40 20 20 20 7c 7c 20 70 46 69 6c 65 2d 3e 64 62 55     || pFile->dbU
13a50 70 64 61 74 65 3d 3d 30 0a 20 20 20 20 20 20 20  pdate==0.       
13a60 20 20 20 20 7c 7c 20 70 46 69 6c 65 2d 3e 74 72      || pFile->tr
13a70 61 6e 73 43 6e 74 72 43 68 6e 67 3d 3d 31 20 29  ansCntrChng==1 )
13a80 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 69 6e 4e  ;.    pFile->inN
13a90 6f 72 6d 61 6c 57 72 69 74 65 20 3d 20 30 3b 0a  ormalWrite = 0;.
13aa0 23 65 6e 64 69 66 0a 20 20 20 20 0a 20 20 20 20  #endif.    .    
13ab0 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  if( pFile->eFile
13ac0 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
13ad0 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  LOCK ){.      rc
13ae0 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f   = afpSetLock(co
13af0 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70  ntext->dbPath, p
13b00 46 69 6c 65 2c 20 53 48 41 52 45 44 5f 46 49 52  File, SHARED_FIR
13b10 53 54 2c 20 53 48 41 52 45 44 5f 53 49 5a 45 2c  ST, SHARED_SIZE,
13b20 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   0);.      if( r
13b30 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
13b40 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52  (eFileLock==SHAR
13b50 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64  ED_LOCK || pInod
13b60 65 2d 3e 6e 53 68 61 72 65 64 3e 31 29 20 29 7b  e->nShared>1) ){
13b70 0a 20 20 20 20 20 20 20 20 2f 2a 20 6f 6e 6c 79  .        /* only
13b80 20 72 65 2d 65 73 74 61 62 6c 69 73 68 20 74 68   re-establish th
13b90 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 69 66  e shared lock if
13ba0 20 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a 20 20   necessary */.  
13bb0 20 20 20 20 20 20 69 6e 74 20 73 68 61 72 65 64        int shared
13bc0 4c 6f 63 6b 42 79 74 65 20 3d 20 53 48 41 52 45  LockByte = SHARE
13bd0 44 5f 46 49 52 53 54 2b 70 49 6e 6f 64 65 2d 3e  D_FIRST+pInode->
13be0 73 68 61 72 65 64 42 79 74 65 3b 0a 20 20 20 20  sharedByte;.    
13bf0 20 20 20 20 72 63 20 3d 20 61 66 70 53 65 74 4c      rc = afpSetL
13c00 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50  ock(context->dbP
13c10 61 74 68 2c 20 70 46 69 6c 65 2c 20 73 68 61 72  ath, pFile, shar
13c20 65 64 4c 6f 63 6b 42 79 74 65 2c 20 31 2c 20 31  edLockByte, 1, 1
13c30 29 3b 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  );.      } else 
13c40 7b 0a 20 20 20 20 20 20 20 20 73 6b 69 70 53 68  {.        skipSh
13c50 61 72 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  ared = 1;.      
13c60 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
13c70 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
13c80 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
13c90 6b 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20  k>=PENDING_LOCK 
13ca0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61 66  ){.      rc = af
13cb0 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  pSetLock(context
13cc0 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
13cd0 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 31   PENDING_BYTE, 1
13ce0 2c 20 30 29 3b 0a 20 20 20 20 7d 20 0a 20 20 20  , 0);.    } .   
13cf0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
13d00 4f 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69  OK && pFile->eFi
13d10 6c 65 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44  leLock>=RESERVED
13d20 5f 4c 4f 43 4b 20 26 26 20 63 6f 6e 74 65 78 74  _LOCK && context
13d30 2d 3e 72 65 73 65 72 76 65 64 20 29 7b 0a 20 20  ->reserved ){.  
13d40 20 20 20 20 72 63 20 3d 20 61 66 70 53 65 74 4c      rc = afpSetL
13d50 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50  ock(context->dbP
13d60 61 74 68 2c 20 70 46 69 6c 65 2c 20 52 45 53 45  ath, pFile, RESE
13d70 52 56 45 44 5f 42 59 54 45 2c 20 31 2c 20 30 29  RVED_BYTE, 1, 0)
13d80 3b 0a 20 20 20 20 20 20 69 66 28 20 21 72 63 20  ;.      if( !rc 
13d90 29 7b 20 0a 20 20 20 20 20 20 20 20 63 6f 6e 74  ){ .        cont
13da0 65 78 74 2d 3e 72 65 73 65 72 76 65 64 20 3d 20  ext->reserved = 
13db0 30 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0; .      }.    
13dc0 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
13dd0 4c 49 54 45 5f 4f 4b 20 26 26 20 28 65 46 69 6c  LITE_OK && (eFil
13de0 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
13df0 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 6e 53  CK || pInode->nS
13e00 68 61 72 65 64 3e 31 29 29 7b 0a 20 20 20 20 20  hared>1)){.     
13e10 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f   pInode->eFileLo
13e20 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b  ck = SHARED_LOCK
13e30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
13e40 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
13e50 26 26 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f  && eFileLock==NO
13e60 5f 4c 4f 43 4b 20 29 7b 0a 0a 20 20 20 20 2f 2a  _LOCK ){..    /*
13e70 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 73   Decrement the s
13e80 68 61 72 65 64 20 6c 6f 63 6b 20 63 6f 75 6e 74  hared lock count
13e90 65 72 2e 20 20 52 65 6c 65 61 73 65 20 74 68 65  er.  Release the
13ea0 20 6c 6f 63 6b 20 75 73 69 6e 67 20 61 6e 0a 20   lock using an. 
13eb0 20 20 20 2a 2a 20 4f 53 20 63 61 6c 6c 20 6f 6e     ** OS call on
13ec0 6c 79 20 77 68 65 6e 20 61 6c 6c 20 74 68 72 65  ly when all thre
13ed0 61 64 73 20 69 6e 20 74 68 69 73 20 73 61 6d 65  ads in this same
13ee0 20 70 72 6f 63 65 73 73 20 68 61 76 65 20 72 65   process have re
13ef0 6c 65 61 73 65 64 0a 20 20 20 20 2a 2a 20 74 68  leased.    ** th
13f00 65 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20  e lock..    */. 
13f10 20 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67     unsigned long
13f20 20 6c 6f 6e 67 20 73 68 61 72 65 64 4c 6f 63 6b   long sharedLock
13f30 42 79 74 65 20 3d 20 53 48 41 52 45 44 5f 46 49  Byte = SHARED_FI
13f40 52 53 54 2b 70 49 6e 6f 64 65 2d 3e 73 68 61 72  RST+pInode->shar
13f50 65 64 42 79 74 65 3b 0a 20 20 20 20 70 49 6e 6f  edByte;.    pIno
13f60 64 65 2d 3e 6e 53 68 61 72 65 64 2d 2d 3b 0a 20  de->nShared--;. 
13f70 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e     if( pInode->n
13f80 53 68 61 72 65 64 3d 3d 30 20 29 7b 0a 20 20 20  Shared==0 ){.   
13f90 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
13fa0 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20  orBenign(1);.   
13fb0 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
13fc0 6f 72 28 20 68 3d 28 2d 31 29 20 29 0a 20 20 20  or( h=(-1) ).   
13fd0 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
13fe0 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20  orBenign(0);.   
13ff0 20 20 20 69 66 28 20 21 73 6b 69 70 53 68 61 72     if( !skipShar
14000 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  ed ){.        rc
14010 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f   = afpSetLock(co
14020 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70  ntext->dbPath, p
14030 46 69 6c 65 2c 20 73 68 61 72 65 64 4c 6f 63 6b  File, sharedLock
14040 42 79 74 65 2c 20 31 2c 20 30 29 3b 0a 20 20 20  Byte, 1, 0);.   
14050 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21     }.      if( !
14060 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49  rc ){.        pI
14070 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  node->eFileLock 
14080 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20  = NO_LOCK;.     
14090 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
140a0 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20  ock = NO_LOCK;. 
140b0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
140c0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
140d0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 6f  OK ){.      pIno
140e0 64 65 2d 3e 6e 4c 6f 63 6b 2d 2d 3b 0a 20 20 20  de->nLock--;.   
140f0 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64     assert( pInod
14100 65 2d 3e 6e 4c 6f 63 6b 3e 3d 30 20 29 3b 0a 20  e->nLock>=0 );. 
14110 20 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d       if( pInode-
14120 3e 6e 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20  >nLock==0 ){.   
14130 20 20 20 20 20 72 63 20 3d 20 63 6c 6f 73 65 50       rc = closeP
14140 65 6e 64 69 6e 67 46 64 73 28 70 46 69 6c 65 29  endingFds(pFile)
14150 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
14160 20 20 7d 0a 20 20 0a 20 20 75 6e 69 78 4c 65 61    }.  .  unixLea
14170 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 69 66 28  veMutex();.  if(
14180 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
14190 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
141a0 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20  k = eFileLock;. 
141b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
141c0 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c  *.** Close a fil
141d0 65 20 26 20 63 6c 65 61 6e 75 70 20 41 46 50 20  e & cleanup AFP 
141e0 73 70 65 63 69 66 69 63 20 6c 6f 63 6b 69 6e 67  specific locking
141f0 20 63 6f 6e 74 65 78 74 20 0a 2a 2f 0a 73 74 61   context .*/.sta
14200 74 69 63 20 69 6e 74 20 61 66 70 43 6c 6f 73 65  tic int afpClose
14210 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
14220 64 29 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  d) {.  int rc = 
14230 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
14240 20 69 64 20 29 7b 0a 20 20 20 20 75 6e 69 78 46   id ){.    unixF
14250 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
14260 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20  ixFile*)id;.    
14270 61 66 70 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f  afpUnlock(id, NO
14280 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 75 6e 69 78  _LOCK);.    unix
14290 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
142a0 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 49 6e    if( pFile->pIn
142b0 6f 64 65 20 26 26 20 70 46 69 6c 65 2d 3e 70 49  ode && pFile->pI
142c0 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 20 29 7b 0a 20  node->nLock ){. 
142d0 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65       /* If there
142e0 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67   are outstanding
142f0 20 6c 6f 63 6b 73 2c 20 64 6f 20 6e 6f 74 20 61   locks, do not a
14300 63 74 75 61 6c 6c 79 20 63 6c 6f 73 65 20 74 68  ctually close th
14310 65 20 66 69 6c 65 20 6a 75 73 74 0a 20 20 20 20  e file just.    
14320 20 20 2a 2a 20 79 65 74 20 62 65 63 61 75 73 65    ** yet because
14330 20 74 68 61 74 20 77 6f 75 6c 64 20 63 6c 65 61   that would clea
14340 72 20 74 68 6f 73 65 20 6c 6f 63 6b 73 2e 20 20  r those locks.  
14350 49 6e 73 74 65 61 64 2c 20 61 64 64 20 74 68 65  Instead, add the
14360 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 64   file.      ** d
14370 65 73 63 72 69 70 74 6f 72 20 74 6f 20 70 49 6e  escriptor to pIn
14380 6f 64 65 2d 3e 61 50 65 6e 64 69 6e 67 2e 20 20  ode->aPending.  
14390 49 74 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d  It will be autom
143a0 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65 64 20  atically closed 
143b0 77 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 74 68  when.      ** th
143c0 65 20 6c 61 73 74 20 6c 6f 63 6b 20 69 73 20 63  e last lock is c
143d0 6c 65 61 72 65 64 2e 0a 20 20 20 20 20 20 2a 2f  leared..      */
143e0 0a 20 20 20 20 20 20 73 65 74 50 65 6e 64 69 6e  .      setPendin
143f0 67 46 64 28 70 46 69 6c 65 29 3b 0a 20 20 20 20  gFd(pFile);.    
14400 7d 0a 20 20 20 20 72 65 6c 65 61 73 65 4c 6f 63  }.    releaseLoc
14410 6b 49 6e 66 6f 28 70 46 69 6c 65 2d 3e 70 49 6e  kInfo(pFile->pIn
14420 6f 64 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ode);.    sqlite
14430 33 5f 66 72 65 65 28 70 46 69 6c 65 2d 3e 6c 6f  3_free(pFile->lo
14440 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3b 0a 20  ckingContext);. 
14450 20 20 20 72 63 20 3d 20 63 6c 6f 73 65 55 6e 69     rc = closeUni
14460 78 46 69 6c 65 28 69 64 29 3b 0a 20 20 20 20 75  xFile(id);.    u
14470 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
14480 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
14490 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 64  ;.}..#endif /* d
144a0 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
144b0 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42  ) && SQLITE_ENAB
144c0 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
144d0 20 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 6f   */./*.** The co
144e0 64 65 20 61 62 6f 76 65 20 69 73 20 74 68 65 20  de above is the 
144f0 41 46 50 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65  AFP lock impleme
14500 6e 74 61 74 69 6f 6e 2e 20 20 54 68 65 20 63 6f  ntation.  The co
14510 64 65 20 69 73 20 73 70 65 63 69 66 69 63 0a 2a  de is specific.*
14520 2a 20 74 6f 20 4d 61 63 4f 53 58 20 61 6e 64 20  * to MacOSX and 
14530 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e  does not work on
14540 20 6f 74 68 65 72 20 75 6e 69 78 20 70 6c 61 74   other unix plat
14550 66 6f 72 6d 73 2e 20 20 4e 6f 20 61 6c 74 65 72  forms.  No alter
14560 6e 61 74 69 76 65 0a 2a 2a 20 69 73 20 61 76 61  native.** is ava
14570 69 6c 61 62 6c 65 2e 20 20 49 66 20 79 6f 75 20  ilable.  If you 
14580 64 6f 6e 27 74 20 63 6f 6d 70 69 6c 65 20 66 6f  don't compile fo
14590 72 20 61 20 6d 61 63 2c 20 74 68 65 6e 20 74 68  r a mac, then th
145a0 65 20 22 75 6e 69 78 2d 61 66 70 22 0a 2a 2a 20  e "unix-afp".** 
145b0 56 46 53 20 69 73 20 6e 6f 74 20 61 76 61 69 6c  VFS is not avail
145c0 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  able..**.*******
145d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45  ************** E
145e0 6e 64 20 6f 66 20 74 68 65 20 41 46 50 20 6c 6f  nd of the AFP lo
145f0 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ck implementatio
14600 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  n **************
14610 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
14620 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14630 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14640 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14650 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14660 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a  *******/../*****
14670 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14680 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14690 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
146a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
146b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
146c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
146d0 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 4e 46 53 20  ***** Begin NFS 
146e0 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a  Locking ********
146f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14700 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 23 69 66 20 64  ********/..#if d
14710 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
14720 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42  ) && SQLITE_ENAB
14730 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
14740 0a 2f 2a 0a 20 2a 2a 20 4c 6f 77 65 72 20 74 68  ./*. ** Lower th
14750 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
14760 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  on file descript
14770 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c  or pFile to eFil
14780 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63  eLock.  eFileLoc
14790 6b 0a 20 2a 2a 20 6d 75 73 74 20 62 65 20 65 69  k. ** must be ei
147a0 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20  ther NO_LOCK or 
147b0 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 20 2a 2a  SHARED_LOCK.. **
147c0 0a 20 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b  . ** If the lock
147d0 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65  ing level of the
147e0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
147f0 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f   is already at o
14800 72 20 62 65 6c 6f 77 0a 20 2a 2a 20 74 68 65 20  r below. ** the 
14810 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e  requested lockin
14820 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f  g level, this ro
14830 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
14840 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  .. */.static int
14850 20 6e 66 73 55 6e 6c 6f 63 6b 28 73 71 6c 69 74   nfsUnlock(sqlit
14860 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
14870 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20 72   eFileLock){.  r
14880 65 74 75 72 6e 20 5f 70 6f 73 69 78 55 6e 6c 6f  eturn _posixUnlo
14890 63 6b 28 69 64 2c 20 65 46 69 6c 65 4c 6f 63 6b  ck(id, eFileLock
148a0 2c 20 31 29 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20  , 1);.}..#endif 
148b0 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  /* defined(__APP
148c0 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f  LE__) && SQLITE_
148d0 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
148e0 54 59 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68  TYLE */./*.** Th
148f0 65 20 63 6f 64 65 20 61 62 6f 76 65 20 69 73 20  e code above is 
14900 74 68 65 20 4e 46 53 20 6c 6f 63 6b 20 69 6d 70  the NFS lock imp
14910 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 20 54 68  lementation.  Th
14920 65 20 63 6f 64 65 20 69 73 20 73 70 65 63 69 66  e code is specif
14930 69 63 0a 2a 2a 20 74 6f 20 4d 61 63 4f 53 58 20  ic.** to MacOSX 
14940 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72  and does not wor
14950 6b 20 6f 6e 20 6f 74 68 65 72 20 75 6e 69 78 20  k on other unix 
14960 70 6c 61 74 66 6f 72 6d 73 2e 20 20 4e 6f 20 61  platforms.  No a
14970 6c 74 65 72 6e 61 74 69 76 65 0a 2a 2a 20 69 73  lternative.** is
14980 20 61 76 61 69 6c 61 62 6c 65 2e 20 20 0a 2a 2a   available.  .**
14990 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
149a0 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68  ****** End of th
149b0 65 20 4e 46 53 20 6c 6f 63 6b 20 69 6d 70 6c 65  e NFS lock imple
149c0 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a  mentation ******
149d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
149e0 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
149f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14a00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14a10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14a20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
14a30 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
14a40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14a50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14a60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14a70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14a80 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
14a90 2a 2a 20 4e 6f 6e 2d 6c 6f 63 6b 69 6e 67 20 73  ** Non-locking s
14aa0 71 6c 69 74 65 33 5f 66 69 6c 65 20 6d 65 74 68  qlite3_file meth
14ab0 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ods ************
14ac0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14ad0 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 78 74  *.**.** The next
14ae0 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74 61 69   division contai
14af0 6e 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ns implementatio
14b00 6e 73 20 66 6f 72 20 61 6c 6c 20 6d 65 74 68 6f  ns for all metho
14b10 64 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20 73 71  ds of the .** sq
14b20 6c 69 74 65 33 5f 66 69 6c 65 20 6f 62 6a 65 63  lite3_file objec
14b30 74 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 65  t other than the
14b40 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73   locking methods
14b50 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 0a 2a  .  The locking.*
14b60 2a 20 6d 65 74 68 6f 64 73 20 77 65 72 65 20 64  * methods were d
14b70 65 66 69 6e 65 64 20 69 6e 20 64 69 76 69 73 69  efined in divisi
14b80 6f 6e 73 20 61 62 6f 76 65 20 28 6f 6e 65 20 6c  ons above (one l
14b90 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 20 70 65  ocking method pe
14ba0 72 0a 2a 2a 20 64 69 76 69 73 69 6f 6e 29 2e 20  r.** division). 
14bb0 20 54 68 6f 73 65 20 6d 65 74 68 6f 64 73 20 74   Those methods t
14bc0 68 61 74 20 61 72 65 20 63 6f 6d 6d 6f 6e 20 74  hat are common t
14bd0 6f 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6d 6f  o all locking mo
14be0 64 65 73 0a 2a 2a 20 61 72 65 20 67 61 74 68 65  des.** are gathe
14bf0 72 20 74 6f 67 65 74 68 65 72 20 69 6e 74 6f 20  r together into 
14c00 74 68 69 73 20 64 69 76 69 73 69 6f 6e 2e 0a 2a  this division..*
14c10 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74 6f  /../*.** Seek to
14c20 20 74 68 65 20 6f 66 66 73 65 74 20 70 61 73 73   the offset pass
14c30 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
14c40 20 61 72 67 75 6d 65 6e 74 2c 20 74 68 65 6e 20   argument, then 
14c50 72 65 61 64 20 63 6e 74 20 0a 2a 2a 20 62 79 74  read cnt .** byt
14c60 65 73 20 69 6e 74 6f 20 70 42 75 66 2e 20 52 65  es into pBuf. Re
14c70 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
14c80 6f 66 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c  of bytes actuall
14c90 79 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 4e 42  y read..**.** NB
14ca0 3a 20 20 49 66 20 79 6f 75 20 64 65 66 69 6e 65  :  If you define
14cb0 20 55 53 45 5f 50 52 45 41 44 20 6f 72 20 55 53   USE_PREAD or US
14cc0 45 5f 50 52 45 41 44 36 34 2c 20 74 68 65 6e 20  E_PREAD64, then 
14cd0 69 74 20 6d 69 67 68 74 20 61 6c 73 6f 0a 2a 2a  it might also.**
14ce0 20 62 65 20 6e 65 63 65 73 73 61 72 79 20 74 6f   be necessary to
14cf0 20 64 65 66 69 6e 65 20 5f 58 4f 50 45 4e 5f 53   define _XOPEN_S
14d00 4f 55 52 43 45 20 74 6f 20 62 65 20 35 30 30 2e  OURCE to be 500.
14d10 20 20 54 68 69 73 20 76 61 72 69 65 73 20 66 72    This varies fr
14d20 6f 6d 0a 2a 2a 20 6f 6e 65 20 73 79 73 74 65 6d  om.** one system
14d30 20 74 6f 20 61 6e 6f 74 68 65 72 2e 20 20 53 69   to another.  Si
14d40 6e 63 65 20 53 51 4c 69 74 65 20 64 6f 65 73 20  nce SQLite does 
14d50 6e 6f 74 20 64 65 66 69 6e 65 20 55 53 45 5f 50  not define USE_P
14d60 52 45 41 44 0a 2a 2a 20 61 6e 79 20 61 6e 79 20  READ.** any any 
14d70 66 6f 72 6d 20 62 79 20 64 65 66 61 75 6c 74 2c  form by default,
14d80 20 77 65 20 77 69 6c 6c 20 6e 6f 74 20 61 74 74   we will not att
14d90 65 6d 70 74 20 74 6f 20 64 65 66 69 6e 65 20 5f  empt to define _
14da0 58 4f 50 45 4e 5f 53 4f 55 52 43 45 2e 0a 2a 2a  XOPEN_SOURCE..**
14db0 20 53 65 65 20 74 69 63 6b 65 74 73 20 23 32 37   See tickets #27
14dc0 34 31 20 61 6e 64 20 23 32 36 38 31 2e 0a 2a 2a  41 and #2681..**
14dd0 0a 2a 2a 20 54 6f 20 61 76 6f 69 64 20 73 74 6f  .** To avoid sto
14de0 6d 70 69 6e 67 20 74 68 65 20 65 72 72 6e 6f 20  mping the errno 
14df0 76 61 6c 75 65 20 6f 6e 20 61 20 66 61 69 6c 65  value on a faile
14e00 64 20 72 65 61 64 20 74 68 65 20 6c 61 73 74 45  d read the lastE
14e10 72 72 6e 6f 20 76 61 6c 75 65 0a 2a 2a 20 69 73  rrno value.** is
14e20 20 73 65 74 20 62 65 66 6f 72 65 20 72 65 74 75   set before retu
14e30 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  rning..*/.static
14e40 20 69 6e 74 20 73 65 65 6b 41 6e 64 52 65 61 64   int seekAndRead
14e50 28 75 6e 69 78 46 69 6c 65 20 2a 69 64 2c 20 73  (unixFile *id, s
14e60 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66  qlite3_int64 off
14e70 73 65 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 2c  set, void *pBuf,
14e80 20 69 6e 74 20 63 6e 74 29 7b 0a 20 20 69 6e 74   int cnt){.  int
14e90 20 67 6f 74 3b 0a 23 69 66 20 28 21 64 65 66 69   got;.#if (!defi
14ea0 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29 20 26  ned(USE_PREAD) &
14eb0 26 20 21 64 65 66 69 6e 65 64 28 55 53 45 5f 50  & !defined(USE_P
14ec0 52 45 41 44 36 34 29 29 0a 20 20 69 36 34 20 6e  READ64)).  i64 n
14ed0 65 77 4f 66 66 73 65 74 3b 0a 23 65 6e 64 69 66  ewOffset;.#endif
14ee0 0a 20 20 54 49 4d 45 52 5f 53 54 41 52 54 3b 0a  .  TIMER_START;.
14ef0 23 69 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f  #if defined(USE_
14f00 50 52 45 41 44 29 0a 20 20 67 6f 74 20 3d 20 70  PREAD).  got = p
14f10 72 65 61 64 28 69 64 2d 3e 68 2c 20 70 42 75 66  read(id->h, pBuf
14f20 2c 20 63 6e 74 2c 20 6f 66 66 73 65 74 29 3b 0a  , cnt, offset);.
14f30 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
14f40 72 28 20 67 6f 74 20 3d 20 2d 31 20 29 3b 0a 23  r( got = -1 );.#
14f50 65 6c 69 66 20 64 65 66 69 6e 65 64 28 55 53 45  elif defined(USE
14f60 5f 50 52 45 41 44 36 34 29 0a 20 20 67 6f 74 20  _PREAD64).  got 
14f70 3d 20 70 72 65 61 64 36 34 28 69 64 2d 3e 68 2c  = pread64(id->h,
14f80 20 70 42 75 66 2c 20 63 6e 74 2c 20 6f 66 66 73   pBuf, cnt, offs
14f90 65 74 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49  et);.  SimulateI
14fa0 4f 45 72 72 6f 72 28 20 67 6f 74 20 3d 20 2d 31  OError( got = -1
14fb0 20 29 3b 0a 23 65 6c 73 65 0a 20 20 6e 65 77 4f   );.#else.  newO
14fc0 66 66 73 65 74 20 3d 20 6c 73 65 65 6b 28 69 64  ffset = lseek(id
14fd0 2d 3e 68 2c 20 6f 66 66 73 65 74 2c 20 53 45 45  ->h, offset, SEE
14fe0 4b 5f 53 45 54 29 3b 0a 20 20 53 69 6d 75 6c 61  K_SET);.  Simula
14ff0 74 65 49 4f 45 72 72 6f 72 28 20 6e 65 77 4f 66  teIOError( newOf
15000 66 73 65 74 2d 2d 20 29 3b 0a 20 20 69 66 28 20  fset-- );.  if( 
15010 6e 65 77 4f 66 66 73 65 74 21 3d 6f 66 66 73 65  newOffset!=offse
15020 74 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 65 77  t ){.    if( new
15030 4f 66 66 73 65 74 20 3d 3d 20 2d 31 20 29 7b 0a  Offset == -1 ){.
15040 20 20 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65        ((unixFile
15050 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f  *)id)->lastErrno
15060 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 7d 65   = errno;.    }e
15070 6c 73 65 7b 0a 20 20 20 20 20 20 28 28 75 6e 69  lse{.      ((uni
15080 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74  xFile*)id)->last
15090 45 72 72 6e 6f 20 3d 20 30 3b 09 09 09 0a 20 20  Errno = 0;....  
150a0 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 2d    }.    return -
150b0 31 3b 0a 20 20 7d 0a 20 20 67 6f 74 20 3d 20 72  1;.  }.  got = r
150c0 65 61 64 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c  ead(id->h, pBuf,
150d0 20 63 6e 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20   cnt);.#endif.  
150e0 54 49 4d 45 52 5f 45 4e 44 3b 0a 20 20 69 66 28  TIMER_END;.  if(
150f0 20 67 6f 74 3c 30 20 29 7b 0a 20 20 20 20 28 28   got<0 ){.    ((
15100 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c  unixFile*)id)->l
15110 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  astErrno = errno
15120 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28  ;.  }.  OSTRACE(
15130 28 22 52 45 41 44 20 20 20 20 25 2d 33 64 20 25  ("READ    %-3d %
15140 35 64 20 25 37 6c 6c 64 20 25 6c 6c 75 5c 6e 22  5d %7lld %llu\n"
15150 2c 20 69 64 2d 3e 68 2c 20 67 6f 74 2c 20 6f 66  , id->h, got, of
15160 66 73 65 74 2c 20 54 49 4d 45 52 5f 45 4c 41 50  fset, TIMER_ELAP
15170 53 45 44 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  SED));.  return 
15180 67 6f 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  got;.}../*.** Re
15190 61 64 20 64 61 74 61 20 66 72 6f 6d 20 61 20 66  ad data from a f
151a0 69 6c 65 20 69 6e 74 6f 20 61 20 62 75 66 66 65  ile into a buffe
151b0 72 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  r.  Return SQLIT
151c0 45 5f 4f 4b 20 69 66 20 61 6c 6c 0a 2a 2a 20 62  E_OK if all.** b
151d0 79 74 65 73 20 77 65 72 65 20 72 65 61 64 20 73  ytes were read s
151e0 75 63 63 65 73 73 66 75 6c 6c 79 20 61 6e 64 20  uccessfully and 
151f0 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 69 66 20  SQLITE_IOERR if 
15200 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a  anything goes.**
15210 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69   wrong..*/.stati
15220 63 20 69 6e 74 20 75 6e 69 78 52 65 61 64 28 0a  c int unixRead(.
15230 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
15240 69 64 2c 20 0a 20 20 76 6f 69 64 20 2a 70 42 75  id, .  void *pBu
15250 66 2c 20 0a 20 20 69 6e 74 20 61 6d 74 2c 0a 20  f, .  int amt,. 
15260 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f   sqlite3_int64 o
15270 66 66 73 65 74 0a 29 7b 0a 20 20 75 6e 69 78 46  ffset.){.  unixF
15280 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
15290 69 78 46 69 6c 65 20 2a 29 69 64 3b 0a 20 20 69  ixFile *)id;.  i
152a0 6e 74 20 67 6f 74 3b 0a 20 20 61 73 73 65 72 74  nt got;.  assert
152b0 28 20 69 64 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  ( id );..  /* If
152c0 20 74 68 69 73 20 69 73 20 61 20 64 61 74 61 62   this is a datab
152d0 61 73 65 20 66 69 6c 65 20 28 6e 6f 74 20 61 20  ase file (not a 
152e0 6a 6f 75 72 6e 61 6c 2c 20 6d 61 73 74 65 72 2d  journal, master-
152f0 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 65 6d 70 0a  journal or temp.
15300 20 20 2a 2a 20 66 69 6c 65 29 2c 20 74 68 65 20    ** file), the 
15310 62 79 74 65 73 20 69 6e 20 74 68 65 20 6c 6f 63  bytes in the loc
15320 6b 69 6e 67 20 72 61 6e 67 65 20 73 68 6f 75 6c  king range shoul
15330 64 20 6e 65 76 65 72 20 62 65 20 72 65 61 64 20  d never be read 
15340 6f 72 20 77 72 69 74 74 65 6e 2e 20 2a 2f 0a 23  or written. */.#
15350 69 66 20 30 0a 20 20 61 73 73 65 72 74 28 20 70  if 0.  assert( p
15360 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64 3d 3d 30  File->pUnused==0
15370 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66 66 73 65  .       || offse
15380 74 3e 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 2b  t>=PENDING_BYTE+
15390 35 31 32 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66  512.       || of
153a0 66 73 65 74 2b 61 6d 74 3c 3d 50 45 4e 44 49 4e  fset+amt<=PENDIN
153b0 47 5f 42 59 54 45 20 0a 20 20 29 3b 0a 23 65 6e  G_BYTE .  );.#en
153c0 64 69 66 0a 0a 20 20 67 6f 74 20 3d 20 73 65 65  dif..  got = see
153d0 6b 41 6e 64 52 65 61 64 28 70 46 69 6c 65 2c 20  kAndRead(pFile, 
153e0 6f 66 66 73 65 74 2c 20 70 42 75 66 2c 20 61 6d  offset, pBuf, am
153f0 74 29 3b 0a 20 20 69 66 28 20 67 6f 74 3d 3d 61  t);.  if( got==a
15400 6d 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  mt ){.    return
15410 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65   SQLITE_OK;.  }e
15420 6c 73 65 20 69 66 28 20 67 6f 74 3c 30 20 29 7b  lse if( got<0 ){
15430 0a 20 20 20 20 2f 2a 20 6c 61 73 74 45 72 72 6e  .    /* lastErrn
15440 6f 20 73 65 74 20 62 79 20 73 65 65 6b 41 6e 64  o set by seekAnd
15450 52 65 61 64 20 2a 2f 0a 20 20 20 20 72 65 74 75  Read */.    retu
15460 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
15470 52 45 41 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  READ;.  }else{. 
15480 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
15490 72 6e 6f 20 3d 20 30 3b 20 2f 2a 20 6e 6f 74 20  rno = 0; /* not 
154a0 61 20 73 79 73 74 65 6d 20 65 72 72 6f 72 20 2a  a system error *
154b0 2f 0a 20 20 20 20 2f 2a 20 55 6e 72 65 61 64 20  /.    /* Unread 
154c0 70 61 72 74 73 20 6f 66 20 74 68 65 20 62 75 66  parts of the buf
154d0 66 65 72 20 6d 75 73 74 20 62 65 20 7a 65 72 6f  fer must be zero
154e0 2d 66 69 6c 6c 65 64 20 2a 2f 0a 20 20 20 20 6d  -filled */.    m
154f0 65 6d 73 65 74 28 26 28 28 63 68 61 72 2a 29 70  emset(&((char*)p
15500 42 75 66 29 5b 67 6f 74 5d 2c 20 30 2c 20 61 6d  Buf)[got], 0, am
15510 74 2d 67 6f 74 29 3b 0a 20 20 20 20 72 65 74 75  t-got);.    retu
15520 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
15530 53 48 4f 52 54 5f 52 45 41 44 3b 0a 20 20 7d 0a  SHORT_READ;.  }.
15540 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74 6f  }../*.** Seek to
15550 20 74 68 65 20 6f 66 66 73 65 74 20 69 6e 20 69   the offset in i
15560 64 2d 3e 6f 66 66 73 65 74 20 74 68 65 6e 20 72  d->offset then r
15570 65 61 64 20 63 6e 74 20 62 79 74 65 73 20 69 6e  ead cnt bytes in
15580 74 6f 20 70 42 75 66 2e 0a 2a 2a 20 52 65 74 75  to pBuf..** Retu
15590 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
155a0 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20   bytes actually 
155b0 72 65 61 64 2e 20 20 55 70 64 61 74 65 20 74 68  read.  Update th
155c0 65 20 6f 66 66 73 65 74 2e 0a 2a 2a 0a 2a 2a 20  e offset..**.** 
155d0 54 6f 20 61 76 6f 69 64 20 73 74 6f 6d 70 69 6e  To avoid stompin
155e0 67 20 74 68 65 20 65 72 72 6e 6f 20 76 61 6c 75  g the errno valu
155f0 65 20 6f 6e 20 61 20 66 61 69 6c 65 64 20 77 72  e on a failed wr
15600 69 74 65 20 74 68 65 20 6c 61 73 74 45 72 72 6e  ite the lastErrn
15610 6f 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65  o value.** is se
15620 74 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  t before returni
15630 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
15640 74 20 73 65 65 6b 41 6e 64 57 72 69 74 65 28 75  t seekAndWrite(u
15650 6e 69 78 46 69 6c 65 20 2a 69 64 2c 20 69 36 34  nixFile *id, i64
15660 20 6f 66 66 73 65 74 2c 20 63 6f 6e 73 74 20 76   offset, const v
15670 6f 69 64 20 2a 70 42 75 66 2c 20 69 6e 74 20 63  oid *pBuf, int c
15680 6e 74 29 7b 0a 20 20 69 6e 74 20 67 6f 74 3b 0a  nt){.  int got;.
15690 23 69 66 20 28 21 64 65 66 69 6e 65 64 28 55 53  #if (!defined(US
156a0 45 5f 50 52 45 41 44 29 20 26 26 20 21 64 65 66  E_PREAD) && !def
156b0 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 36 34  ined(USE_PREAD64
156c0 29 29 0a 20 20 69 36 34 20 6e 65 77 4f 66 66 73  )).  i64 newOffs
156d0 65 74 3b 0a 23 65 6e 64 69 66 0a 20 20 54 49 4d  et;.#endif.  TIM
156e0 45 52 5f 53 54 41 52 54 3b 0a 23 69 66 20 64 65  ER_START;.#if de
156f0 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29  fined(USE_PREAD)
15700 0a 20 20 67 6f 74 20 3d 20 70 77 72 69 74 65 28  .  got = pwrite(
15710 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74  id->h, pBuf, cnt
15720 2c 20 6f 66 66 73 65 74 29 3b 0a 23 65 6c 69 66  , offset);.#elif
15730 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45   defined(USE_PRE
15740 41 44 36 34 29 0a 20 20 67 6f 74 20 3d 20 70 77  AD64).  got = pw
15750 72 69 74 65 36 34 28 69 64 2d 3e 68 2c 20 70 42  rite64(id->h, pB
15760 75 66 2c 20 63 6e 74 2c 20 6f 66 66 73 65 74 29  uf, cnt, offset)
15770 3b 0a 23 65 6c 73 65 0a 20 20 6e 65 77 4f 66 66  ;.#else.  newOff
15780 73 65 74 20 3d 20 6c 73 65 65 6b 28 69 64 2d 3e  set = lseek(id->
15790 68 2c 20 6f 66 66 73 65 74 2c 20 53 45 45 4b 5f  h, offset, SEEK_
157a0 53 45 54 29 3b 0a 20 20 69 66 28 20 6e 65 77 4f  SET);.  if( newO
157b0 66 66 73 65 74 21 3d 6f 66 66 73 65 74 20 29 7b  ffset!=offset ){
157c0 0a 20 20 20 20 69 66 28 20 6e 65 77 4f 66 66 73  .    if( newOffs
157d0 65 74 20 3d 3d 20 2d 31 20 29 7b 0a 20 20 20 20  et == -1 ){.    
157e0 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64    ((unixFile*)id
157f0 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65  )->lastErrno = e
15800 72 72 6e 6f 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  rrno;.    }else{
15810 0a 20 20 20 20 20 20 28 28 75 6e 69 78 46 69 6c  .      ((unixFil
15820 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e  e*)id)->lastErrn
15830 6f 20 3d 20 30 3b 09 09 09 0a 20 20 20 20 7d 0a  o = 0;....    }.
15840 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20      return -1;. 
15850 20 7d 0a 20 20 67 6f 74 20 3d 20 77 72 69 74 65   }.  got = write
15860 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e  (id->h, pBuf, cn
15870 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20 54 49 4d  t);.#endif.  TIM
15880 45 52 5f 45 4e 44 3b 0a 20 20 69 66 28 20 67 6f  ER_END;.  if( go
15890 74 3c 30 20 29 7b 0a 20 20 20 20 28 28 75 6e 69  t<0 ){.    ((uni
158a0 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74  xFile*)id)->last
158b0 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
158c0 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22   }..  OSTRACE(("
158d0 57 52 49 54 45 20 20 20 25 2d 33 64 20 25 35 64  WRITE   %-3d %5d
158e0 20 25 37 6c 6c 64 20 25 6c 6c 75 5c 6e 22 2c 20   %7lld %llu\n", 
158f0 69 64 2d 3e 68 2c 20 67 6f 74 2c 20 6f 66 66 73  id->h, got, offs
15900 65 74 2c 20 54 49 4d 45 52 5f 45 4c 41 50 53 45  et, TIMER_ELAPSE
15910 44 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 67 6f  D));.  return go
15920 74 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  t;.}.../*.** Wri
15930 74 65 20 64 61 74 61 20 66 72 6f 6d 20 61 20 62  te data from a b
15940 75 66 66 65 72 20 69 6e 74 6f 20 61 20 66 69 6c  uffer into a fil
15950 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  e.  Return SQLIT
15960 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 0a  E_OK on success.
15970 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72  ** or some other
15980 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 6e 20 66   error code on f
15990 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69  ailure..*/.stati
159a0 63 20 69 6e 74 20 75 6e 69 78 57 72 69 74 65 28  c int unixWrite(
159b0 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
159c0 2a 69 64 2c 20 0a 20 20 63 6f 6e 73 74 20 76 6f  *id, .  const vo
159d0 69 64 20 2a 70 42 75 66 2c 20 0a 20 20 69 6e 74  id *pBuf, .  int
159e0 20 61 6d 74 2c 0a 20 20 73 71 6c 69 74 65 33 5f   amt,.  sqlite3_
159f0 69 6e 74 36 34 20 6f 66 66 73 65 74 20 0a 29 7b  int64 offset .){
15a00 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
15a10 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
15a20 69 64 3b 0a 20 20 69 6e 74 20 77 72 6f 74 65 20  id;.  int wrote 
15a30 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 69  = 0;.  assert( i
15a40 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  d );.  assert( a
15a50 6d 74 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  mt>0 );..  /* If
15a60 20 74 68 69 73 20 69 73 20 61 20 64 61 74 61 62   this is a datab
15a70 61 73 65 20 66 69 6c 65 20 28 6e 6f 74 20 61 20  ase file (not a 
15a80 6a 6f 75 72 6e 61 6c 2c 20 6d 61 73 74 65 72 2d  journal, master-
15a90 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 65 6d 70 0a  journal or temp.
15aa0 20 20 2a 2a 20 66 69 6c 65 29 2c 20 74 68 65 20    ** file), the 
15ab0 62 79 74 65 73 20 69 6e 20 74 68 65 20 6c 6f 63  bytes in the loc
15ac0 6b 69 6e 67 20 72 61 6e 67 65 20 73 68 6f 75 6c  king range shoul
15ad0 64 20 6e 65 76 65 72 20 62 65 20 72 65 61 64 20  d never be read 
15ae0 6f 72 20 77 72 69 74 74 65 6e 2e 20 2a 2f 0a 23  or written. */.#
15af0 69 66 20 30 0a 20 20 61 73 73 65 72 74 28 20 70  if 0.  assert( p
15b00 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64 3d 3d 30  File->pUnused==0
15b10 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66 66 73 65  .       || offse
15b20 74 3e 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 2b  t>=PENDING_BYTE+
15b30 35 31 32 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66  512.       || of
15b40 66 73 65 74 2b 61 6d 74 3c 3d 50 45 4e 44 49 4e  fset+amt<=PENDIN
15b50 47 5f 42 59 54 45 20 0a 20 20 29 3b 0a 23 65 6e  G_BYTE .  );.#en
15b60 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45  dif..#ifndef NDE
15b70 42 55 47 0a 20 20 2f 2a 20 49 66 20 77 65 20 61  BUG.  /* If we a
15b80 72 65 20 64 6f 69 6e 67 20 61 20 6e 6f 72 6d 61  re doing a norma
15b90 6c 20 77 72 69 74 65 20 74 6f 20 61 20 64 61 74  l write to a dat
15ba0 61 62 61 73 65 20 66 69 6c 65 20 28 61 73 20 6f  abase file (as o
15bb0 70 70 6f 73 65 64 20 74 6f 0a 20 20 2a 2a 20 64  pposed to.  ** d
15bc0 6f 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  oing a hot-journ
15bd0 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 61  al rollback or a
15be0 20 77 72 69 74 65 20 74 6f 20 73 6f 6d 65 20 66   write to some f
15bf0 69 6c 65 20 6f 74 68 65 72 20 74 68 61 6e 20 61  ile other than a
15c00 0a 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20 64 61 74  .  ** normal dat
15c10 61 62 61 73 65 20 66 69 6c 65 29 20 74 68 65 6e  abase file) then
15c20 20 72 65 63 6f 72 64 20 74 68 65 20 66 61 63 74   record the fact
15c30 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61   that the databa
15c40 73 65 0a 20 20 2a 2a 20 68 61 73 20 63 68 61 6e  se.  ** has chan
15c50 67 65 64 2e 20 20 49 66 20 74 68 65 20 74 72 61  ged.  If the tra
15c60 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72  nsaction counter
15c70 20 69 73 20 6d 6f 64 69 66 69 65 64 2c 20 72 65   is modified, re
15c80 63 6f 72 64 20 74 68 61 74 0a 20 20 2a 2a 20 66  cord that.  ** f
15c90 61 63 74 20 74 6f 6f 2e 0a 20 20 2a 2f 0a 20 20  act too..  */.  
15ca0 69 66 28 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72  if( pFile->inNor
15cb0 6d 61 6c 57 72 69 74 65 20 29 7b 0a 20 20 20 20  malWrite ){.    
15cc0 70 46 69 6c 65 2d 3e 64 62 55 70 64 61 74 65 20  pFile->dbUpdate 
15cd0 3d 20 31 3b 20 20 2f 2a 20 54 68 65 20 64 61 74  = 1;  /* The dat
15ce0 61 62 61 73 65 20 68 61 73 20 62 65 65 6e 20 6d  abase has been m
15cf0 6f 64 69 66 69 65 64 20 2a 2f 0a 20 20 20 20 69  odified */.    i
15d00 66 28 20 6f 66 66 73 65 74 3c 3d 32 34 20 26 26  f( offset<=24 &&
15d10 20 6f 66 66 73 65 74 2b 61 6d 74 3e 3d 32 37 20   offset+amt>=27 
15d20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 3b  ){.      int rc;
15d30 0a 20 20 20 20 20 20 63 68 61 72 20 6f 6c 64 43  .      char oldC
15d40 6e 74 72 5b 34 5d 3b 0a 20 20 20 20 20 20 53 69  ntr[4];.      Si
15d50 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
15d60 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 72 63  ign(1);.      rc
15d70 20 3d 20 73 65 65 6b 41 6e 64 52 65 61 64 28 70   = seekAndRead(p
15d80 46 69 6c 65 2c 20 32 34 2c 20 6f 6c 64 43 6e 74  File, 24, oldCnt
15d90 72 2c 20 34 29 3b 0a 20 20 20 20 20 20 53 69 6d  r, 4);.      Sim
15da0 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69  ulateIOErrorBeni
15db0 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 69 66 28  gn(0);.      if(
15dc0 20 72 63 21 3d 34 20 7c 7c 20 6d 65 6d 63 6d 70   rc!=4 || memcmp
15dd0 28 6f 6c 64 43 6e 74 72 2c 20 26 28 28 63 68 61  (oldCntr, &((cha
15de0 72 2a 29 70 42 75 66 29 5b 32 34 2d 6f 66 66 73  r*)pBuf)[24-offs
15df0 65 74 5d 2c 20 34 29 21 3d 30 20 29 7b 0a 20 20  et], 4)!=0 ){.  
15e00 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 74 72 61        pFile->tra
15e10 6e 73 43 6e 74 72 43 68 6e 67 20 3d 20 31 3b 20  nsCntrChng = 1; 
15e20 20 2f 2a 20 54 68 65 20 74 72 61 6e 73 61 63 74   /* The transact
15e30 69 6f 6e 20 63 6f 75 6e 74 65 72 20 68 61 73 20  ion counter has 
15e40 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20 20 20 20  changed */.     
15e50 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e   }.    }.  }.#en
15e60 64 69 66 0a 0a 20 20 77 68 69 6c 65 28 20 61 6d  dif..  while( am
15e70 74 3e 30 20 26 26 20 28 77 72 6f 74 65 20 3d 20  t>0 && (wrote = 
15e80 73 65 65 6b 41 6e 64 57 72 69 74 65 28 70 46 69  seekAndWrite(pFi
15e90 6c 65 2c 20 6f 66 66 73 65 74 2c 20 70 42 75 66  le, offset, pBuf
15ea0 2c 20 61 6d 74 29 29 3e 30 20 29 7b 0a 20 20 20  , amt))>0 ){.   
15eb0 20 61 6d 74 20 2d 3d 20 77 72 6f 74 65 3b 0a 20   amt -= wrote;. 
15ec0 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 77 72 6f     offset += wro
15ed0 74 65 3b 0a 20 20 20 20 70 42 75 66 20 3d 20 26  te;.    pBuf = &
15ee0 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b 77 72  ((char*)pBuf)[wr
15ef0 6f 74 65 5d 3b 0a 20 20 7d 0a 20 20 53 69 6d 75  ote];.  }.  Simu
15f00 6c 61 74 65 49 4f 45 72 72 6f 72 28 28 20 77 72  lateIOError(( wr
15f10 6f 74 65 3d 28 2d 31 29 2c 20 61 6d 74 3d 31 20  ote=(-1), amt=1 
15f20 29 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 44 69  ));.  SimulateDi
15f30 73 6b 66 75 6c 6c 45 72 72 6f 72 28 28 20 77 72  skfullError(( wr
15f40 6f 74 65 3d 30 2c 20 61 6d 74 3d 31 20 29 29 3b  ote=0, amt=1 ));
15f50 0a 20 20 69 66 28 20 61 6d 74 3e 30 20 29 7b 0a  .  if( amt>0 ){.
15f60 20 20 20 20 69 66 28 20 77 72 6f 74 65 3c 30 20      if( wrote<0 
15f70 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6c 61 73 74  ){.      /* last
15f80 45 72 72 6e 6f 20 73 65 74 20 62 79 20 73 65 65  Errno set by see
15f90 6b 41 6e 64 57 72 69 74 65 20 2a 2f 0a 20 20 20  kAndWrite */.   
15fa0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
15fb0 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b 0a 20 20  _IOERR_WRITE;.  
15fc0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
15fd0 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
15fe0 3d 20 30 3b 20 2f 2a 20 6e 6f 74 20 61 20 73 79  = 0; /* not a sy
15ff0 73 74 65 6d 20 65 72 72 6f 72 20 2a 2f 0a 20 20  stem error */.  
16000 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
16010 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20  E_FULL;.    }.  
16020 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
16030 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  E_OK;.}..#ifdef 
16040 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a  SQLITE_TEST./*.*
16050 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62  * Count the numb
16060 65 72 20 6f 66 20 66 75 6c 6c 73 79 6e 63 73 20  er of fullsyncs 
16070 61 6e 64 20 6e 6f 72 6d 61 6c 20 73 79 6e 63 73  and normal syncs
16080 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20  .  This is used 
16090 74 6f 20 74 65 73 74 0a 2a 2a 20 74 68 61 74 20  to test.** that 
160a0 73 79 6e 63 73 20 61 6e 64 20 66 75 6c 6c 73 79  syncs and fullsy
160b0 6e 63 73 20 61 72 65 20 6f 63 63 75 72 72 69 6e  ncs are occurrin
160c0 67 20 61 74 20 74 68 65 20 72 69 67 68 74 20 74  g at the right t
160d0 69 6d 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  imes..*/.int sql
160e0 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 20  ite3_sync_count 
160f0 3d 20 30 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33  = 0;.int sqlite3
16100 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 20  _fullsync_count 
16110 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  = 0;.#endif../*.
16120 2a 2a 20 57 65 20 64 6f 20 6e 6f 74 20 74 72 75  ** We do not tru
16130 73 74 20 73 79 73 74 65 6d 73 20 74 6f 20 70 72  st systems to pr
16140 6f 76 69 64 65 20 61 20 77 6f 72 6b 69 6e 67 20  ovide a working 
16150 66 64 61 74 61 73 79 6e 63 28 29 2e 20 20 53 6f  fdatasync().  So
16160 6d 65 20 64 6f 2e 0a 2a 2a 20 4f 74 68 65 72 73  me do..** Others
16170 20 64 6f 20 6e 6f 2e 20 20 54 6f 20 62 65 20 73   do no.  To be s
16180 61 66 65 2c 20 77 65 20 77 69 6c 6c 20 73 74 69  afe, we will sti
16190 63 6b 20 77 69 74 68 20 74 68 65 20 28 73 6c 6f  ck with the (slo
161a0 77 65 72 29 20 66 73 79 6e 63 28 29 2e 0a 2a 2a  wer) fsync()..**
161b0 20 49 66 20 79 6f 75 20 6b 6e 6f 77 20 74 68 61   If you know tha
161c0 74 20 79 6f 75 72 20 73 79 73 74 65 6d 20 64 6f  t your system do
161d0 65 73 20 73 75 70 70 6f 72 74 20 66 64 61 74 61  es support fdata
161e0 73 79 6e 63 28 29 20 63 6f 72 72 65 63 74 6c 79  sync() correctly
161f0 2c 0a 2a 2a 20 74 68 65 6e 20 73 69 6d 70 6c 79  ,.** then simply
16200 20 63 6f 6d 70 69 6c 65 20 77 69 74 68 20 2d 44   compile with -D
16210 66 64 61 74 61 73 79 6e 63 3d 66 64 61 74 61 73  fdatasync=fdatas
16220 79 6e 63 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69  ync.*/.#if !defi
16230 6e 65 64 28 66 64 61 74 61 73 79 6e 63 29 20 26  ned(fdatasync) &
16240 26 20 21 64 65 66 69 6e 65 64 28 5f 5f 6c 69 6e  & !defined(__lin
16250 75 78 5f 5f 29 0a 23 20 64 65 66 69 6e 65 20 66  ux__).# define f
16260 64 61 74 61 73 79 6e 63 20 66 73 79 6e 63 0a 23  datasync fsync.#
16270 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66  endif../*.** Def
16280 69 6e 65 20 48 41 56 45 5f 46 55 4c 4c 46 53 59  ine HAVE_FULLFSY
16290 4e 43 20 74 6f 20 30 20 6f 72 20 31 20 64 65 70  NC to 0 or 1 dep
162a0 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65  ending on whethe
162b0 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20 74 68 65 20  r or not.** the 
162c0 46 5f 46 55 4c 4c 46 53 59 4e 43 20 6d 61 63 72  F_FULLFSYNC macr
162d0 6f 20 69 73 20 64 65 66 69 6e 65 64 2e 20 20 46  o is defined.  F
162e0 5f 46 55 4c 4c 46 53 59 4e 43 20 69 73 20 63 75  _FULLFSYNC is cu
162f0 72 72 65 6e 74 6c 79 0a 2a 2a 20 6f 6e 6c 79 20  rrently.** only 
16300 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 4d 61 63  available on Mac
16310 20 4f 53 20 58 2e 20 20 42 75 74 20 74 68 61 74   OS X.  But that
16320 20 63 6f 75 6c 64 20 63 68 61 6e 67 65 2e 0a 2a   could change..*
16330 2f 0a 23 69 66 64 65 66 20 46 5f 46 55 4c 4c 46  /.#ifdef F_FULLF
16340 53 59 4e 43 0a 23 20 64 65 66 69 6e 65 20 48 41  SYNC.# define HA
16350 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 31 0a 23  VE_FULLFSYNC 1.#
16360 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 48 41  else.# define HA
16370 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 30 0a 23  VE_FULLFSYNC 0.#
16380 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  endif.../*.** Th
16390 65 20 66 73 79 6e 63 28 29 20 73 79 73 74 65 6d  e fsync() system
163a0 20 63 61 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 77   call does not w
163b0 6f 72 6b 20 61 73 20 61 64 76 65 72 74 69 73 65  ork as advertise
163c0 64 20 6f 6e 20 6d 61 6e 79 0a 2a 2a 20 75 6e 69  d on many.** uni
163d0 78 20 73 79 73 74 65 6d 73 2e 20 20 54 68 65 20  x systems.  The 
163e0 66 6f 6c 6c 6f 77 69 6e 67 20 70 72 6f 63 65 64  following proced
163f0 75 72 65 20 69 73 20 61 6e 20 61 74 74 65 6d 70  ure is an attemp
16400 74 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20 69 74 20  t to make.** it 
16410 77 6f 72 6b 20 62 65 74 74 65 72 2e 0a 2a 2a 0a  work better..**.
16420 2a 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 4e 4f  ** The SQLITE_NO
16430 5f 53 59 4e 43 20 6d 61 63 72 6f 20 64 69 73 61  _SYNC macro disa
16440 62 6c 65 73 20 61 6c 6c 20 66 73 79 6e 63 28 29  bles all fsync()
16450 73 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 66  s.  This is usef
16460 75 6c 0a 2a 2a 20 66 6f 72 20 74 65 73 74 69 6e  ul.** for testin
16470 67 20 77 68 65 6e 20 77 65 20 77 61 6e 74 20 74  g when we want t
16480 6f 20 72 75 6e 20 74 68 72 6f 75 67 68 20 74 68  o run through th
16490 65 20 74 65 73 74 20 73 75 69 74 65 20 71 75 69  e test suite qui
164a0 63 6b 6c 79 2e 0a 2a 2a 20 59 6f 75 20 61 72 65  ckly..** You are
164b0 20 73 74 72 6f 6e 67 6c 79 20 61 64 76 69 73 65   strongly advise
164c0 64 20 2a 6e 6f 74 2a 20 74 6f 20 64 65 70 6c 6f  d *not* to deplo
164d0 79 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4e 4f  y with SQLITE_NO
164e0 5f 53 59 4e 43 0a 2a 2a 20 65 6e 61 62 6c 65 64  _SYNC.** enabled
164f0 2c 20 68 6f 77 65 76 65 72 2c 20 73 69 6e 63 65  , however, since
16500 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4e 4f 5f   with SQLITE_NO_
16510 53 59 4e 43 20 65 6e 61 62 6c 65 64 2c 20 61 6e  SYNC enabled, an
16520 20 4f 53 20 63 72 61 73 68 0a 2a 2a 20 6f 72 20   OS crash.** or 
16530 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 77 69  power failure wi
16540 6c 6c 20 6c 69 6b 65 6c 79 20 63 6f 72 72 75 70  ll likely corrup
16550 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  t the database f
16560 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74  ile..**.** SQLit
16570 65 20 73 65 74 73 20 74 68 65 20 64 61 74 61 4f  e sets the dataO
16580 6e 6c 79 20 66 6c 61 67 20 69 66 20 74 68 65 20  nly flag if the 
16590 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65  size of the file
165a0 20 69 73 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a   is unchanged..*
165b0 2a 20 54 68 65 20 69 64 65 61 20 62 65 68 69 6e  * The idea behin
165c0 64 20 64 61 74 61 4f 6e 6c 79 20 69 73 20 74 68  d dataOnly is th
165d0 61 74 20 69 74 20 73 68 6f 75 6c 64 20 6f 6e 6c  at it should onl
165e0 79 20 77 72 69 74 65 20 74 68 65 20 66 69 6c 65  y write the file
165f0 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20 74 6f 20 64   content.** to d
16600 69 73 6b 2c 20 6e 6f 74 20 74 68 65 20 69 6e 6f  isk, not the ino
16610 64 65 2e 20 20 57 65 20 6f 6e 6c 79 20 73 65 74  de.  We only set
16620 20 64 61 74 61 4f 6e 6c 79 20 69 66 20 74 68 65   dataOnly if the
16630 20 66 69 6c 65 20 73 69 7a 65 20 69 73 20 0a 2a   file size is .*
16640 2a 20 75 6e 63 68 61 6e 67 65 64 20 73 69 6e 63  * unchanged sinc
16650 65 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20  e the file size 
16660 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 69  is part of the i
16670 6e 6f 64 65 2e 20 20 48 6f 77 65 76 65 72 2c 20  node.  However, 
16680 0a 2a 2a 20 54 65 64 20 54 73 27 6f 20 74 65 6c  .** Ted Ts'o tel
16690 6c 73 20 75 73 20 74 68 61 74 20 66 64 61 74 61  ls us that fdata
166a0 73 79 6e 63 28 29 20 77 69 6c 6c 20 61 6c 73 6f  sync() will also
166b0 20 77 72 69 74 65 20 74 68 65 20 69 6e 6f 64 65   write the inode
166c0 20 69 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20   if the.** file 
166d0 73 69 7a 65 20 68 61 73 20 63 68 61 6e 67 65 64  size has changed
166e0 2e 20 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 6c  .  The only real
166f0 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77   difference betw
16700 65 65 6e 20 66 64 61 74 61 73 79 6e 63 28 29 0a  een fdatasync().
16710 2a 2a 20 61 6e 64 20 66 73 79 6e 63 28 29 2c 20  ** and fsync(), 
16720 54 65 64 20 74 65 6c 6c 73 20 75 73 2c 20 69 73  Ted tells us, is
16730 20 74 68 61 74 20 66 64 61 74 61 73 79 6e 63 28   that fdatasync(
16740 29 20 77 69 6c 6c 20 6e 6f 74 20 66 6c 75 73 68  ) will not flush
16750 20 74 68 65 0a 2a 2a 20 69 6e 6f 64 65 20 69 66   the.** inode if
16760 20 74 68 65 20 6d 74 69 6d 65 20 6f 72 20 6f 77   the mtime or ow
16770 6e 65 72 20 6f 72 20 6f 74 68 65 72 20 69 6e 6f  ner or other ino
16780 64 65 20 61 74 74 72 69 62 75 74 65 73 20 68 61  de attributes ha
16790 76 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 20 57  ve changed..** W
167a0 65 20 6f 6e 6c 79 20 63 61 72 65 20 61 62 6f 75  e only care abou
167b0 74 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 2c  t the file size,
167c0 20 6e 6f 74 20 74 68 65 20 6f 74 68 65 72 20 66   not the other f
167d0 69 6c 65 20 61 74 74 72 69 62 75 74 65 73 2c 20  ile attributes, 
167e0 73 6f 0a 2a 2a 20 61 73 20 66 61 72 20 61 73 20  so.** as far as 
167f0 53 51 4c 69 74 65 20 69 73 20 63 6f 6e 63 65 72  SQLite is concer
16800 6e 65 64 2c 20 61 6e 20 66 64 61 74 61 73 79 6e  ned, an fdatasyn
16810 63 28 29 20 69 73 20 61 6c 77 61 79 73 20 61 64  c() is always ad
16820 65 71 75 61 74 65 2e 0a 2a 2a 20 53 6f 2c 20 77  equate..** So, w
16830 65 20 61 6c 77 61 79 73 20 75 73 65 20 66 64 61  e always use fda
16840 74 61 73 79 6e 63 28 29 20 69 66 20 69 74 20 69  tasync() if it i
16850 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 72 65 67  s available, reg
16860 61 72 64 6c 65 73 73 20 6f 66 0a 2a 2a 20 74 68  ardless of.** th
16870 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 64  e value of the d
16880 61 74 61 4f 6e 6c 79 20 66 6c 61 67 2e 0a 2a 2f  ataOnly flag..*/
16890 0a 73 74 61 74 69 63 20 69 6e 74 20 66 75 6c 6c  .static int full
168a0 5f 66 73 79 6e 63 28 69 6e 74 20 66 64 2c 20 69  _fsync(int fd, i
168b0 6e 74 20 66 75 6c 6c 53 79 6e 63 2c 20 69 6e 74  nt fullSync, int
168c0 20 64 61 74 61 4f 6e 6c 79 29 7b 0a 20 20 69 6e   dataOnly){.  in
168d0 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  t rc;..  /* The 
168e0 66 6f 6c 6c 6f 77 69 6e 67 20 22 69 66 64 65 66  following "ifdef
168f0 2f 65 6c 69 66 2f 65 6c 73 65 2f 22 20 62 6c 6f  /elif/else/" blo
16900 63 6b 20 68 61 73 20 74 68 65 20 73 61 6d 65 20  ck has the same 
16910 73 74 72 75 63 74 75 72 65 20 61 73 0a 20 20 2a  structure as.  *
16920 2a 20 74 68 65 20 6f 6e 65 20 62 65 6c 6f 77 2e  * the one below.
16930 20 49 74 20 69 73 20 72 65 70 6c 69 63 61 74 65   It is replicate
16940 64 20 68 65 72 65 20 73 6f 6c 65 6c 79 20 74 6f  d here solely to
16950 20 61 76 6f 69 64 20 63 6c 75 74 74 65 72 69 6e   avoid clutterin
16960 67 20 0a 20 20 2a 2a 20 75 70 20 74 68 65 20 72  g .  ** up the r
16970 65 61 6c 20 63 6f 64 65 20 77 69 74 68 20 74 68  eal code with th
16980 65 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54  e UNUSED_PARAMET
16990 45 52 28 29 20 6d 61 63 72 6f 73 2e 0a 20 20 2a  ER() macros..  *
169a0 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
169b0 4e 4f 5f 53 59 4e 43 0a 20 20 55 4e 55 53 45 44  NO_SYNC.  UNUSED
169c0 5f 50 41 52 41 4d 45 54 45 52 28 66 64 29 3b 0a  _PARAMETER(fd);.
169d0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
169e0 45 52 28 66 75 6c 6c 53 79 6e 63 29 3b 0a 20 20  ER(fullSync);.  
169f0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
16a00 28 64 61 74 61 4f 6e 6c 79 29 3b 0a 23 65 6c 69  (dataOnly);.#eli
16a10 66 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43  f HAVE_FULLFSYNC
16a20 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
16a30 54 45 52 28 64 61 74 61 4f 6e 6c 79 29 3b 0a 23  TER(dataOnly);.#
16a40 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41  else.  UNUSED_PA
16a50 52 41 4d 45 54 45 52 28 66 75 6c 6c 53 79 6e 63  RAMETER(fullSync
16a60 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
16a70 4d 45 54 45 52 28 64 61 74 61 4f 6e 6c 79 29 3b  METER(dataOnly);
16a80 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52 65  .#endif..  /* Re
16a90 63 6f 72 64 20 74 68 65 20 6e 75 6d 62 65 72 20  cord the number 
16aa0 6f 66 20 74 69 6d 65 73 20 74 68 61 74 20 77 65  of times that we
16ab0 20 64 6f 20 61 20 6e 6f 72 6d 61 6c 20 66 73 79   do a normal fsy
16ac0 6e 63 28 29 20 61 6e 64 20 0a 20 20 2a 2a 20 46  nc() and .  ** F
16ad0 55 4c 4c 53 59 4e 43 2e 20 20 54 68 69 73 20 69  ULLSYNC.  This i
16ae0 73 20 75 73 65 64 20 64 75 72 69 6e 67 20 74 65  s used during te
16af0 73 74 69 6e 67 20 74 6f 20 76 65 72 69 66 79 20  sting to verify 
16b00 74 68 61 74 20 74 68 69 73 20 70 72 6f 63 65 64  that this proced
16b10 75 72 65 0a 20 20 2a 2a 20 67 65 74 73 20 63 61  ure.  ** gets ca
16b20 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 63 6f  lled with the co
16b30 72 72 65 63 74 20 61 72 67 75 6d 65 6e 74 73 2e  rrect arguments.
16b40 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  .  */.#ifdef SQL
16b50 49 54 45 5f 54 45 53 54 0a 20 20 69 66 28 20 66  ITE_TEST.  if( f
16b60 75 6c 6c 53 79 6e 63 20 29 20 73 71 6c 69 74 65  ullSync ) sqlite
16b70 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74  3_fullsync_count
16b80 2b 2b 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 79  ++;.  sqlite3_sy
16b90 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64  nc_count++;.#end
16ba0 69 66 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 63  if..  /* If we c
16bb0 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 74 68 65  ompiled with the
16bc0 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20   SQLITE_NO_SYNC 
16bd0 66 6c 61 67 2c 20 74 68 65 6e 20 73 79 6e 63 69  flag, then synci
16be0 6e 67 20 69 73 20 61 0a 20 20 2a 2a 20 6e 6f 2d  ng is a.  ** no-
16bf0 6f 70 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53  op.  */.#ifdef S
16c00 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20  QLITE_NO_SYNC.  
16c10 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
16c20 23 65 6c 69 66 20 48 41 56 45 5f 46 55 4c 4c 46  #elif HAVE_FULLF
16c30 53 59 4e 43 0a 20 20 69 66 28 20 66 75 6c 6c 53  SYNC.  if( fullS
16c40 79 6e 63 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ync ){.    rc = 
16c50 66 63 6e 74 6c 28 66 64 2c 20 46 5f 46 55 4c 4c  fcntl(fd, F_FULL
16c60 46 53 59 4e 43 2c 20 30 29 3b 0a 20 20 7d 65 6c  FSYNC, 0);.  }el
16c70 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a  se{.    rc = 1;.
16c80 20 20 7d 0a 20 20 2f 2a 20 49 66 20 74 68 65 20    }.  /* If the 
16c90 46 55 4c 4c 46 53 59 4e 43 20 66 61 69 6c 65 64  FULLFSYNC failed
16ca0 2c 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 61  , fall back to a
16cb0 74 74 65 6d 70 74 69 6e 67 20 61 6e 20 66 73 79  ttempting an fsy
16cc0 6e 63 28 29 2e 0a 20 20 2a 2a 20 49 74 20 73 68  nc()..  ** It sh
16cd0 6f 75 6c 64 6e 27 74 20 62 65 20 70 6f 73 73 69  ouldn't be possi
16ce0 62 6c 65 20 66 6f 72 20 66 75 6c 6c 66 73 79 6e  ble for fullfsyn
16cf0 63 20 74 6f 20 66 61 69 6c 20 6f 6e 20 74 68 65  c to fail on the
16d00 20 6c 6f 63 61 6c 20 0a 20 20 2a 2a 20 66 69 6c   local .  ** fil
16d10 65 20 73 79 73 74 65 6d 20 28 6f 6e 20 4f 53 58  e system (on OSX
16d20 29 2c 20 73 6f 20 66 61 69 6c 75 72 65 20 69 6e  ), so failure in
16d30 64 69 63 61 74 65 73 20 74 68 61 74 20 46 55 4c  dicates that FUL
16d40 4c 46 53 59 4e 43 0a 20 20 2a 2a 20 69 73 6e 27  LFSYNC.  ** isn'
16d50 74 20 73 75 70 70 6f 72 74 65 64 20 66 6f 72 20  t supported for 
16d60 74 68 69 73 20 66 69 6c 65 20 73 79 73 74 65 6d  this file system
16d70 2e 20 53 6f 2c 20 61 74 74 65 6d 70 74 20 61 6e  . So, attempt an
16d80 20 66 73 79 6e 63 20 0a 20 20 2a 2a 20 61 6e 64   fsync .  ** and
16d90 20 28 66 6f 72 20 6e 6f 77 29 20 69 67 6e 6f 72   (for now) ignor
16da0 65 20 74 68 65 20 6f 76 65 72 68 65 61 64 20 6f  e the overhead o
16db0 66 20 61 20 73 75 70 65 72 66 6c 75 6f 75 73 20  f a superfluous 
16dc0 66 63 6e 74 6c 20 63 61 6c 6c 2e 20 20 0a 20 20  fcntl call.  .  
16dd0 2a 2a 20 49 74 27 64 20 62 65 20 62 65 74 74 65  ** It'd be bette
16de0 72 20 74 6f 20 64 65 74 65 63 74 20 66 75 6c 6c  r to detect full
16df0 66 73 79 6e 63 20 73 75 70 70 6f 72 74 20 6f 6e  fsync support on
16e00 63 65 20 61 6e 64 20 61 76 6f 69 64 20 0a 20 20  ce and avoid .  
16e10 2a 2a 20 74 68 65 20 66 63 6e 74 6c 20 63 61 6c  ** the fcntl cal
16e20 6c 20 65 76 65 72 79 20 74 69 6d 65 20 73 79 6e  l every time syn
16e30 63 20 69 73 20 63 61 6c 6c 65 64 2e 0a 20 20 2a  c is called..  *
16e40 2f 0a 20 20 69 66 28 20 72 63 20 29 20 72 63 20  /.  if( rc ) rc 
16e50 3d 20 66 73 79 6e 63 28 66 64 29 3b 0a 0a 23 65  = fsync(fd);..#e
16e60 6c 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50  lif defined(__AP
16e70 50 4c 45 5f 5f 29 0a 20 20 2f 2a 20 66 64 61 74  PLE__).  /* fdat
16e80 61 73 79 6e 63 28 29 20 6f 6e 20 48 46 53 2b 20  async() on HFS+ 
16e90 64 6f 65 73 6e 27 74 20 79 65 74 20 66 6c 75 73  doesn't yet flus
16ea0 68 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20  h the file size 
16eb0 69 66 20 69 74 20 63 68 61 6e 67 65 64 20 63 6f  if it changed co
16ec0 72 72 65 63 74 6c 79 0a 20 20 2a 2a 20 73 6f 20  rrectly.  ** so 
16ed0 63 75 72 72 65 6e 74 6c 79 20 77 65 20 64 65 66  currently we def
16ee0 61 75 6c 74 20 74 6f 20 74 68 65 20 6d 61 63 72  ault to the macr
16ef0 6f 20 74 68 61 74 20 72 65 64 65 66 69 6e 65 73  o that redefines
16f00 20 66 64 61 74 61 73 79 6e 63 20 74 6f 20 66 73   fdatasync to fs
16f10 79 6e 63 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  ync.  */.  rc = 
16f20 66 73 79 6e 63 28 66 64 29 3b 0a 23 65 6c 73 65  fsync(fd);.#else
16f30 20 0a 20 20 72 63 20 3d 20 66 64 61 74 61 73 79   .  rc = fdatasy
16f40 6e 63 28 66 64 29 3b 0a 23 69 66 20 4f 53 5f 56  nc(fd);.#if OS_V
16f50 58 57 4f 52 4b 53 0a 20 20 69 66 28 20 72 63 3d  XWORKS.  if( rc=
16f60 3d 2d 31 20 26 26 20 65 72 72 6e 6f 3d 3d 45 4e  =-1 && errno==EN
16f70 4f 54 53 55 50 20 29 7b 0a 20 20 20 20 72 63 20  OTSUP ){.    rc 
16f80 3d 20 66 73 79 6e 63 28 66 64 29 3b 0a 20 20 7d  = fsync(fd);.  }
16f90 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58  .#endif /* OS_VX
16fa0 57 4f 52 4b 53 20 2a 2f 0a 23 65 6e 64 69 66 20  WORKS */.#endif 
16fb0 2f 2a 20 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /* ifdef SQLITE_
16fc0 4e 4f 5f 53 59 4e 43 20 65 6c 69 66 20 48 41 56  NO_SYNC elif HAV
16fd0 45 5f 46 55 4c 4c 46 53 59 4e 43 20 2a 2f 0a 0a  E_FULLFSYNC */..
16fe0 20 20 69 66 28 20 4f 53 5f 56 58 57 4f 52 4b 53    if( OS_VXWORKS
16ff0 20 26 26 20 72 63 21 3d 20 2d 31 20 29 7b 0a 20   && rc!= -1 ){. 
17000 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 7d 0a 20     rc = 0;.  }. 
17010 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
17020 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 61  *.** Make sure a
17030 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 61 20 70  ll writes to a p
17040 61 72 74 69 63 75 6c 61 72 20 66 69 6c 65 20 61  articular file a
17050 72 65 20 63 6f 6d 6d 69 74 74 65 64 20 74 6f 20  re committed to 
17060 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64  disk..**.** If d
17070 61 74 61 4f 6e 6c 79 3d 3d 30 20 74 68 65 6e 20  ataOnly==0 then 
17080 62 6f 74 68 20 74 68 65 20 66 69 6c 65 20 69 74  both the file it
17090 73 65 6c 66 20 61 6e 64 20 69 74 73 20 6d 65 74  self and its met
170a0 61 64 61 74 61 20 28 66 69 6c 65 0a 2a 2a 20 73  adata (file.** s
170b0 69 7a 65 2c 20 61 63 63 65 73 73 20 74 69 6d 65  ize, access time
170c0 2c 20 65 74 63 29 20 61 72 65 20 73 79 6e 63 65  , etc) are synce
170d0 64 2e 20 20 49 66 20 64 61 74 61 4f 6e 6c 79 21  d.  If dataOnly!
170e0 3d 30 20 74 68 65 6e 20 6f 6e 6c 79 20 74 68 65  =0 then only the
170f0 0a 2a 2a 20 66 69 6c 65 20 64 61 74 61 20 69 73  .** file data is
17100 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 55   synced..**.** U
17110 6e 64 65 72 20 55 6e 69 78 2c 20 61 6c 73 6f 20  nder Unix, also 
17120 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74  make sure that t
17130 68 65 20 64 69 72 65 63 74 6f 72 79 20 65 6e 74  he directory ent
17140 72 79 20 66 6f 72 20 74 68 65 20 66 69 6c 65 0a  ry for the file.
17150 2a 2a 20 68 61 73 20 62 65 65 6e 20 63 72 65 61  ** has been crea
17160 74 65 64 20 62 79 20 66 73 79 6e 63 2d 69 6e 67  ted by fsync-ing
17170 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 74   the directory t
17180 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
17190 20 66 69 6c 65 2e 0a 2a 2a 20 49 66 20 77 65 20   file..** If we 
171a0 64 6f 20 6e 6f 74 20 64 6f 20 74 68 69 73 20 61  do not do this a
171b0 6e 64 20 77 65 20 65 6e 63 6f 75 6e 74 65 72 20  nd we encounter 
171c0 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 2c  a power failure,
171d0 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 0a 2a   the directory.*
171e0 2a 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20  * entry for the 
171f0 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 6e 6f  journal might no
17200 74 20 65 78 69 73 74 20 61 66 74 65 72 20 77 65  t exist after we
17210 20 72 65 62 6f 6f 74 2e 20 20 54 68 65 20 6e 65   reboot.  The ne
17220 78 74 0a 2a 2a 20 53 51 4c 69 74 65 20 74 6f 20  xt.** SQLite to 
17230 61 63 63 65 73 73 20 74 68 65 20 66 69 6c 65 20  access the file 
17240 77 69 6c 6c 20 6e 6f 74 20 6b 6e 6f 77 20 74 68  will not know th
17250 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 65  at the journal e
17260 78 69 73 74 73 20 28 62 65 63 61 75 73 65 0a 2a  xists (because.*
17270 2a 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  * the directory 
17280 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 6a 6f  entry for the jo
17290 75 72 6e 61 6c 20 77 61 73 20 6e 65 76 65 72 20  urnal was never 
172a0 63 72 65 61 74 65 64 29 20 61 6e 64 20 74 68 65  created) and the
172b0 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20   transaction.** 
172c0 77 69 6c 6c 20 6e 6f 74 20 72 6f 6c 6c 20 62 61  will not roll ba
172d0 63 6b 20 2d 20 70 6f 73 73 69 62 6c 79 20 6c 65  ck - possibly le
172e0 61 64 69 6e 67 20 74 6f 20 64 61 74 61 62 61 73  ading to databas
172f0 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f  e corruption..*/
17300 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
17310 53 79 6e 63 28 73 71 6c 69 74 65 33 5f 66 69 6c  Sync(sqlite3_fil
17320 65 20 2a 69 64 2c 20 69 6e 74 20 66 6c 61 67 73  e *id, int flags
17330 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75  ){.  int rc;.  u
17340 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
17350 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
17360 0a 20 20 69 6e 74 20 69 73 44 61 74 61 4f 6e 6c  .  int isDataOnl
17370 79 20 3d 20 28 66 6c 61 67 73 26 53 51 4c 49 54  y = (flags&SQLIT
17380 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 29  E_SYNC_DATAONLY)
17390 3b 0a 20 20 69 6e 74 20 69 73 46 75 6c 6c 73 79  ;.  int isFullsy
173a0 6e 63 20 3d 20 28 66 6c 61 67 73 26 30 78 30 46  nc = (flags&0x0F
173b0 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46  )==SQLITE_SYNC_F
173c0 55 4c 4c 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  ULL;..  /* Check
173d0 20 74 68 61 74 20 6f 6e 65 20 6f 66 20 53 51 4c   that one of SQL
173e0 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20  ITE_SYNC_NORMAL 
173f0 6f 72 20 46 55 4c 4c 20 77 61 73 20 70 61 73 73  or FULL was pass
17400 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 28  ed */.  assert((
17410 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51 4c  flags&0x0F)==SQL
17420 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 0a  ITE_SYNC_NORMAL.
17430 20 20 20 20 20 20 7c 7c 20 28 66 6c 61 67 73 26        || (flags&
17440 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59  0x0F)==SQLITE_SY
17450 4e 43 5f 46 55 4c 4c 0a 20 20 29 3b 0a 0a 20 20  NC_FULL.  );..  
17460 2f 2a 20 55 6e 69 78 20 63 61 6e 6e 6f 74 2c 20  /* Unix cannot, 
17470 62 75 74 20 73 6f 6d 65 20 73 79 73 74 65 6d 73  but some systems
17480 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49   may return SQLI
17490 54 45 5f 46 55 4c 4c 20 66 72 6f 6d 20 68 65 72  TE_FULL from her
174a0 65 2e 20 54 68 69 73 0a 20 20 2a 2a 20 6c 69 6e  e. This.  ** lin
174b0 65 20 69 73 20 74 6f 20 74 65 73 74 20 74 68 61  e is to test tha
174c0 74 20 64 6f 69 6e 67 20 73 6f 20 64 6f 65 73 20  t doing so does 
174d0 6e 6f 74 20 63 61 75 73 65 20 61 6e 79 20 70 72  not cause any pr
174e0 6f 62 6c 65 6d 73 2e 0a 20 20 2a 2f 0a 20 20 53  oblems..  */.  S
174f0 69 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45  imulateDiskfullE
17500 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c  rror( return SQL
17510 49 54 45 5f 46 55 4c 4c 20 29 3b 0a 0a 20 20 61  ITE_FULL );..  a
17520 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
17530 20 20 4f 53 54 52 41 43 45 28 28 22 53 59 4e 43    OSTRACE(("SYNC
17540 20 20 20 20 25 2d 33 64 5c 6e 22 2c 20 70 46 69      %-3d\n", pFi
17550 6c 65 2d 3e 68 29 29 3b 0a 20 20 72 63 20 3d 20  le->h));.  rc = 
17560 66 75 6c 6c 5f 66 73 79 6e 63 28 70 46 69 6c 65  full_fsync(pFile
17570 2d 3e 68 2c 20 69 73 46 75 6c 6c 73 79 6e 63 2c  ->h, isFullsync,
17580 20 69 73 44 61 74 61 4f 6e 6c 79 29 3b 0a 20 20   isDataOnly);.  
17590 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
175a0 20 72 63 3d 31 20 29 3b 0a 20 20 69 66 28 20 72   rc=1 );.  if( r
175b0 63 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  c ){.    pFile->
175c0 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  lastErrno = errn
175d0 6f 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  o;.    return SQ
175e0 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 59 4e 43  LITE_IOERR_FSYNC
175f0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 46 69 6c  ;.  }.  if( pFil
17600 65 2d 3e 64 69 72 66 64 3e 3d 30 20 29 7b 0a 20  e->dirfd>=0 ){. 
17610 20 20 20 69 6e 74 20 65 72 72 3b 0a 20 20 20 20     int err;.    
17620 4f 53 54 52 41 43 45 28 28 22 44 49 52 53 59 4e  OSTRACE(("DIRSYN
17630 43 20 25 2d 33 64 20 28 68 61 76 65 5f 66 75 6c  C %-3d (have_ful
17640 6c 66 73 79 6e 63 3d 25 64 20 66 75 6c 6c 73 79  lfsync=%d fullsy
17650 6e 63 3d 25 64 29 5c 6e 22 2c 20 70 46 69 6c 65  nc=%d)\n", pFile
17660 2d 3e 64 69 72 66 64 2c 0a 20 20 20 20 20 20 20  ->dirfd,.       
17670 20 20 20 20 20 48 41 56 45 5f 46 55 4c 4c 46 53       HAVE_FULLFS
17680 59 4e 43 2c 20 69 73 46 75 6c 6c 73 79 6e 63 29  YNC, isFullsync)
17690 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
176a0 45 5f 44 49 53 41 42 4c 45 5f 44 49 52 53 59 4e  E_DISABLE_DIRSYN
176b0 43 0a 20 20 20 20 2f 2a 20 54 68 65 20 64 69 72  C.    /* The dir
176c0 65 63 74 6f 72 79 20 73 79 6e 63 20 69 73 20 6f  ectory sync is o
176d0 6e 6c 79 20 61 74 74 65 6d 70 74 65 64 20 69 66  nly attempted if
176e0 20 66 75 6c 6c 5f 66 73 79 6e 63 20 69 73 0a 20   full_fsync is. 
176f0 20 20 20 2a 2a 20 74 75 72 6e 65 64 20 6f 66 66     ** turned off
17700 20 6f 72 20 75 6e 61 76 61 69 6c 61 62 6c 65 2e   or unavailable.
17710 20 20 49 66 20 61 20 66 75 6c 6c 5f 66 73 79 6e    If a full_fsyn
17720 63 20 6f 63 63 75 72 72 65 64 20 61 62 6f 76 65  c occurred above
17730 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68  ,.    ** then th
17740 65 20 64 69 72 65 63 74 6f 72 79 20 73 79 6e 63  e directory sync
17750 20 69 73 20 73 75 70 65 72 66 6c 75 6f 75 73 2e   is superfluous.
17760 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
17770 28 21 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43  (!HAVE_FULLFSYNC
17780 20 7c 7c 20 21 69 73 46 75 6c 6c 73 79 6e 63 29   || !isFullsync)
17790 20 26 26 20 66 75 6c 6c 5f 66 73 79 6e 63 28 70   && full_fsync(p
177a0 46 69 6c 65 2d 3e 64 69 72 66 64 2c 30 2c 30 29  File->dirfd,0,0)
177b0 20 29 7b 0a 20 20 20 20 20 20 20 2f 2a 0a 20 20   ){.       /*.  
177c0 20 20 20 20 20 2a 2a 20 57 65 20 68 61 76 65 20       ** We have 
177d0 72 65 63 65 69 76 65 64 20 6d 75 6c 74 69 70 6c  received multipl
177e0 65 20 72 65 70 6f 72 74 73 20 6f 66 20 66 73 79  e reports of fsy
177f0 6e 63 28 29 20 72 65 74 75 72 6e 69 6e 67 0a 20  nc() returning. 
17800 20 20 20 20 20 20 2a 2a 20 65 72 72 6f 72 73 20        ** errors 
17810 77 68 65 6e 20 61 70 70 6c 69 65 64 20 74 6f 20  when applied to 
17820 64 69 72 65 63 74 6f 72 69 65 73 20 6f 6e 20 63  directories on c
17830 65 72 74 61 69 6e 20 66 69 6c 65 20 73 79 73 74  ertain file syst
17840 65 6d 73 2e 0a 20 20 20 20 20 20 20 2a 2a 20 41  ems..       ** A
17850 20 66 61 69 6c 65 64 20 64 69 72 65 63 74 6f 72   failed director
17860 79 20 73 79 6e 63 20 69 73 20 6e 6f 74 20 61 20  y sync is not a 
17870 62 69 67 20 64 65 61 6c 2e 20 20 53 6f 20 69 74  big deal.  So it
17880 20 73 65 65 6d 73 0a 20 20 20 20 20 20 20 2a 2a   seems.       **
17890 20 62 65 74 74 65 72 20 74 6f 20 69 67 6e 6f 72   better to ignor
178a0 65 20 74 68 65 20 65 72 72 6f 72 2e 20 20 54 69  e the error.  Ti
178b0 63 6b 65 74 20 23 31 36 35 37 0a 20 20 20 20 20  cket #1657.     
178c0 20 20 2a 2f 0a 20 20 20 20 20 20 20 2f 2a 20 70    */.       /* p
178d0 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
178e0 3d 20 65 72 72 6e 6f 3b 20 2a 2f 0a 20 20 20 20  = errno; */.    
178f0 20 20 20 2f 2a 20 72 65 74 75 72 6e 20 53 51 4c     /* return SQL
17900 49 54 45 5f 49 4f 45 52 52 3b 20 2a 2f 0a 20 20  ITE_IOERR; */.  
17910 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 65    }.#endif.    e
17920 72 72 20 3d 20 63 6c 6f 73 65 28 70 46 69 6c 65  rr = close(pFile
17930 2d 3e 64 69 72 66 64 29 3b 20 2f 2a 20 4f 6e 6c  ->dirfd); /* Onl
17940 79 20 6e 65 65 64 20 74 6f 20 73 79 6e 63 20 6f  y need to sync o
17950 6e 63 65 2c 20 73 6f 20 63 6c 6f 73 65 20 74 68  nce, so close th
17960 65 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 72 72  e */.    if( err
17970 3d 3d 30 20 29 7b 20 20 20 20 20 20 20 20 20 20  ==0 ){          
17980 20 20 20 20 2f 2a 20 64 69 72 65 63 74 6f 72 79      /* directory
17990 20 77 68 65 6e 20 77 65 20 61 72 65 20 64 6f 6e   when we are don
179a0 65 20 2a 2f 0a 20 20 20 20 20 20 70 46 69 6c 65  e */.      pFile
179b0 2d 3e 64 69 72 66 64 20 3d 20 2d 31 3b 0a 20 20  ->dirfd = -1;.  
179c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
179d0 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
179e0 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72  = errno;.      r
179f0 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
17a00 5f 44 49 52 5f 43 4c 4f 53 45 3b 0a 20 20 20 20  _DIR_CLOSE;.    
17a10 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
17a20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e  c;.}../*.** Trun
17a30 63 61 74 65 20 61 6e 20 6f 70 65 6e 20 66 69 6c  cate an open fil
17a40 65 20 74 6f 20 61 20 73 70 65 63 69 66 69 65 64  e to a specified
17a50 20 73 69 7a 65 0a 2a 2f 0a 73 74 61 74 69 63 20   size.*/.static 
17a60 69 6e 74 20 75 6e 69 78 54 72 75 6e 63 61 74 65  int unixTruncate
17a70 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
17a80 64 2c 20 69 36 34 20 6e 42 79 74 65 29 7b 0a 20  d, i64 nByte){. 
17a90 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72   int rc;.  asser
17aa0 74 28 20 69 64 20 29 3b 0a 20 20 53 69 6d 75 6c  t( id );.  Simul
17ab0 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75  ateIOError( retu
17ac0 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
17ad0 54 52 55 4e 43 41 54 45 20 29 3b 0a 20 20 72 63  TRUNCATE );.  rc
17ae0 20 3d 20 66 74 72 75 6e 63 61 74 65 28 28 28 75   = ftruncate(((u
17af0 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 68 2c  nixFile*)id)->h,
17b00 20 28 6f 66 66 5f 74 29 6e 42 79 74 65 29 3b 0a   (off_t)nByte);.
17b10 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
17b20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d  ((unixFile*)id)-
17b30 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72  >lastErrno = err
17b40 6e 6f 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  no;.    return S
17b50 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e  QLITE_IOERR_TRUN
17b60 43 41 54 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 23  CATE;.  }else{.#
17b70 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
17b80 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 64    /* If we are d
17b90 6f 69 6e 67 20 61 20 6e 6f 72 6d 61 6c 20 77 72  oing a normal wr
17ba0 69 74 65 20 74 6f 20 61 20 64 61 74 61 62 61 73  ite to a databas
17bb0 65 20 66 69 6c 65 20 28 61 73 20 6f 70 70 6f 73  e file (as oppos
17bc0 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 64 6f 69  ed to.    ** doi
17bd0 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ng a hot-journal
17be0 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 61 20 77   rollback or a w
17bf0 72 69 74 65 20 74 6f 20 73 6f 6d 65 20 66 69 6c  rite to some fil
17c00 65 20 6f 74 68 65 72 20 74 68 61 6e 20 61 0a 20  e other than a. 
17c10 20 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20 64 61 74     ** normal dat
17c20 61 62 61 73 65 20 66 69 6c 65 29 20 61 6e 64 20  abase file) and 
17c30 77 65 20 74 72 75 6e 63 61 74 65 20 74 68 65 20  we truncate the 
17c40 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20 6c 65 6e  file to zero len
17c50 67 74 68 2c 0a 20 20 20 20 2a 2a 20 74 68 61 74  gth,.    ** that
17c60 20 65 66 66 65 63 74 69 76 65 6c 79 20 75 70 64   effectively upd
17c70 61 74 65 73 20 74 68 65 20 63 68 61 6e 67 65 20  ates the change 
17c80 63 6f 75 6e 74 65 72 2e 20 20 54 68 69 73 20 6d  counter.  This m
17c90 69 67 68 74 20 68 61 70 70 65 6e 0a 20 20 20 20  ight happen.    
17ca0 2a 2a 20 77 68 65 6e 20 72 65 73 74 6f 72 69 6e  ** when restorin
17cb0 67 20 61 20 64 61 74 61 62 61 73 65 20 75 73 69  g a database usi
17cc0 6e 67 20 74 68 65 20 62 61 63 6b 75 70 20 41 50  ng the backup AP
17cd0 49 20 66 72 6f 6d 20 61 20 7a 65 72 6f 2d 6c 65  I from a zero-le
17ce0 6e 67 74 68 0a 20 20 20 20 2a 2a 20 73 6f 75 72  ngth.    ** sour
17cf0 63 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ce..    */.    i
17d00 66 28 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69  f( ((unixFile*)i
17d10 64 29 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74  d)->inNormalWrit
17d20 65 20 26 26 20 6e 42 79 74 65 3d 3d 30 20 29 7b  e && nByte==0 ){
17d30 0a 20 20 20 20 20 20 28 28 75 6e 69 78 46 69 6c  .      ((unixFil
17d40 65 2a 29 69 64 29 2d 3e 74 72 61 6e 73 43 6e 74  e*)id)->transCnt
17d50 72 43 68 6e 67 20 3d 20 31 3b 0a 20 20 20 20 7d  rChng = 1;.    }
17d60 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 72 65 74  .#endif..    ret
17d70 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
17d80 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65   }.}../*.** Dete
17d90 72 6d 69 6e 65 20 74 68 65 20 63 75 72 72 65 6e  rmine the curren
17da0 74 20 73 69 7a 65 20 6f 66 20 61 20 66 69 6c 65  t size of a file
17db0 20 69 6e 20 62 79 74 65 73 0a 2a 2f 0a 73 74 61   in bytes.*/.sta
17dc0 74 69 63 20 69 6e 74 20 75 6e 69 78 46 69 6c 65  tic int unixFile
17dd0 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  Size(sqlite3_fil
17de0 65 20 2a 69 64 2c 20 69 36 34 20 2a 70 53 69 7a  e *id, i64 *pSiz
17df0 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  e){.  int rc;.  
17e00 73 74 72 75 63 74 20 73 74 61 74 20 62 75 66 3b  struct stat buf;
17e10 0a 20 20 61 73 73 65 72 74 28 20 69 64 20 29 3b  .  assert( id );
17e20 0a 20 20 72 63 20 3d 20 66 73 74 61 74 28 28 28  .  rc = fstat(((
17e30 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 68  unixFile*)id)->h
17e40 2c 20 26 62 75 66 29 3b 0a 20 20 53 69 6d 75 6c  , &buf);.  Simul
17e50 61 74 65 49 4f 45 72 72 6f 72 28 20 72 63 3d 31  ateIOError( rc=1
17e60 20 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 30 20   );.  if( rc!=0 
17e70 29 7b 0a 20 20 20 20 28 28 75 6e 69 78 46 69 6c  ){.    ((unixFil
17e80 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e  e*)id)->lastErrn
17e90 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 72  o = errno;.    r
17ea0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
17eb0 52 52 5f 46 53 54 41 54 3b 0a 20 20 7d 0a 20 20  RR_FSTAT;.  }.  
17ec0 2a 70 53 69 7a 65 20 3d 20 62 75 66 2e 73 74 5f  *pSize = buf.st_
17ed0 73 69 7a 65 3b 0a 0a 20 20 2f 2a 20 57 68 65 6e  size;..  /* When
17ee0 20 6f 70 65 6e 69 6e 67 20 61 20 7a 65 72 6f 2d   opening a zero-
17ef0 73 69 7a 65 20 64 61 74 61 62 61 73 65 2c 20 74  size database, t
17f00 68 65 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f  he findInodeInfo
17f10 28 29 20 70 72 6f 63 65 64 75 72 65 0a 20 20 2a  () procedure.  *
17f20 2a 20 77 72 69 74 65 73 20 61 20 73 69 6e 67 6c  * writes a singl
17f30 65 20 62 79 74 65 20 69 6e 74 6f 20 74 68 61 74  e byte into that
17f40 20 66 69 6c 65 20 69 6e 20 6f 72 64 65 72 20 74   file in order t
17f50 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 61 20  o work around a 
17f60 62 75 67 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20  bug.  ** in the 
17f70 4f 53 2d 58 20 6d 73 64 6f 73 20 66 69 6c 65 73  OS-X msdos files
17f80 79 73 74 65 6d 2e 20 20 49 6e 20 6f 72 64 65 72  ystem.  In order
17f90 20 74 6f 20 61 76 6f 69 64 20 70 72 6f 62 6c 65   to avoid proble
17fa0 6d 73 20 77 69 74 68 20 75 70 70 65 72 0a 20 20  ms with upper.  
17fb0 2a 2a 20 6c 61 79 65 72 73 2c 20 77 65 20 6e 65  ** layers, we ne
17fc0 65 64 20 74 6f 20 72 65 70 6f 72 74 20 74 68 69  ed to report thi
17fd0 73 20 66 69 6c 65 20 73 69 7a 65 20 61 73 20 7a  s file size as z
17fe0 65 72 6f 20 65 76 65 6e 20 74 68 6f 75 67 68 20  ero even though 
17ff0 69 74 20 69 73 0a 20 20 2a 2a 20 72 65 61 6c 6c  it is.  ** reall
18000 79 20 31 2e 20 20 20 54 69 63 6b 65 74 20 23 33  y 1.   Ticket #3
18010 32 36 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  260..  */.  if( 
18020 2a 70 53 69 7a 65 3d 3d 31 20 29 20 2a 70 53 69  *pSize==1 ) *pSi
18030 7a 65 20 3d 20 30 3b 0a 0a 0a 20 20 72 65 74 75  ze = 0;...  retu
18040 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
18050 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
18060 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
18070 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50   && defined(__AP
18080 50 4c 45 5f 5f 29 0a 2f 2a 0a 2a 2a 20 48 61 6e  PLE__)./*.** Han
18090 64 6c 65 72 20 66 6f 72 20 70 72 6f 78 79 2d 6c  dler for proxy-l
180a0 6f 63 6b 69 6e 67 20 66 69 6c 65 2d 63 6f 6e 74  ocking file-cont
180b0 72 6f 6c 20 76 65 72 62 73 2e 20 20 44 65 66 69  rol verbs.  Defi
180c0 6e 65 64 20 62 65 6c 6f 77 20 69 6e 20 74 68 65  ned below in the
180d0 0a 2a 2a 20 70 72 6f 78 79 69 6e 67 20 6c 6f 63  .** proxying loc
180e0 6b 69 6e 67 20 64 69 76 69 73 69 6f 6e 2e 0a 2a  king division..*
180f0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  /.static int pro
18100 78 79 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 73 71  xyFileControl(sq
18110 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 69 6e 74 2c  lite3_file*,int,
18120 76 6f 69 64 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a  void*);.#endif..
18130 0a 2f 2a 0a 2a 2a 20 49 6e 66 6f 72 6d 61 74 69  ./*.** Informati
18140 6f 6e 20 61 6e 64 20 63 6f 6e 74 72 6f 6c 20 6f  on and control o
18150 66 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20 68  f an open file h
18160 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  andle..*/.static
18170 20 69 6e 74 20 75 6e 69 78 46 69 6c 65 43 6f 6e   int unixFileCon
18180 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c  trol(sqlite3_fil
18190 65 20 2a 69 64 2c 20 69 6e 74 20 6f 70 2c 20 76  e *id, int op, v
181a0 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 73 77  oid *pArg){.  sw
181b0 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20  itch( op ){.    
181c0 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
181d0 4c 5f 4c 4f 43 4b 53 54 41 54 45 3a 20 7b 0a 20  L_LOCKSTATE: {. 
181e0 20 20 20 20 20 2a 28 69 6e 74 2a 29 70 41 72 67       *(int*)pArg
181f0 20 3d 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69   = ((unixFile*)i
18200 64 29 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20  d)->eFileLock;. 
18210 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
18220 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
18230 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4c 41 53   case SQLITE_LAS
18240 54 5f 45 52 52 4e 4f 3a 20 7b 0a 20 20 20 20 20  T_ERRNO: {.     
18250 20 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d 20 28   *(int*)pArg = (
18260 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e  (unixFile*)id)->
18270 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20  lastErrno;.     
18280 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
18290 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  K;.    }.    cas
182a0 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53  e SQLITE_FCNTL_S
182b0 49 5a 45 5f 48 49 4e 54 3a 20 7b 0a 23 69 66 20  IZE_HINT: {.#if 
182c0 30 20 2f 2a 20 4e 6f 20 70 65 72 66 6f 72 6d 61  0 /* No performa
182d0 6e 63 65 20 61 64 76 61 6e 74 61 67 65 20 73 65  nce advantage se
182e0 65 6e 20 6f 6e 20 4c 69 6e 75 78 20 2a 2f 0a 20  en on Linux */. 
182f0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74       sqlite3_int
18300 36 34 20 73 7a 46 69 6c 65 20 3d 20 2a 28 73 71  64 szFile = *(sq
18310 6c 69 74 65 33 5f 69 6e 74 36 34 2a 29 70 41 72  lite3_int64*)pAr
18320 67 3b 0a 20 20 20 20 20 20 75 6e 69 78 46 69 6c  g;.      unixFil
18330 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
18340 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20 20 20  File*)id;.      
18350 66 74 72 75 6e 63 61 74 65 28 70 46 69 6c 65 2d  ftruncate(pFile-
18360 3e 68 2c 20 73 7a 46 69 6c 65 29 3b 0a 23 65 6e  >h, szFile);.#en
18370 64 69 66 0a 20 20 20 20 20 20 72 65 74 75 72 6e  dif.      return
18380 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
18390 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  }.#ifndef NDEBUG
183a0 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65  .    /* The page
183b0 72 20 63 61 6c 6c 73 20 74 68 69 73 20 6d 65 74  r calls this met
183c0 68 6f 64 20 74 6f 20 73 69 67 6e 61 6c 20 74 68  hod to signal th
183d0 61 74 20 69 74 20 68 61 73 20 64 6f 6e 65 0a 20  at it has done. 
183e0 20 20 20 2a 2a 20 61 20 72 6f 6c 6c 62 61 63 6b     ** a rollback
183f0 20 61 6e 64 20 74 68 61 74 20 74 68 65 20 64 61   and that the da
18400 74 61 62 61 73 65 20 69 73 20 74 68 65 72 65 66  tabase is theref
18410 6f 72 65 20 75 6e 63 68 61 6e 67 65 64 20 61 6e  ore unchanged an
18420 64 0a 20 20 20 20 2a 2a 20 69 74 20 68 65 6e 63  d.    ** it henc
18430 65 20 69 74 20 69 73 20 4f 4b 20 66 6f 72 20 74  e it is OK for t
18440 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  he transaction c
18450 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 74 6f  hange counter to
18460 20 62 65 0a 20 20 20 20 2a 2a 20 75 6e 63 68 61   be.    ** uncha
18470 6e 67 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  nged..    */.   
18480 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
18490 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44 3a  TL_DB_UNCHANGED:
184a0 20 7b 0a 20 20 20 20 20 20 28 28 75 6e 69 78 46   {.      ((unixF
184b0 69 6c 65 2a 29 69 64 29 2d 3e 64 62 55 70 64 61  ile*)id)->dbUpda
184c0 74 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65  te = 0;.      re
184d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
184e0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66      }.#endif.#if
184f0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
18500 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20  OCKING_STYLE && 
18510 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
18520 5f 29 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  _).    case SQLI
18530 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59  TE_SET_LOCKPROXY
18540 46 49 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 53  FILE:.    case S
18550 51 4c 49 54 45 5f 47 45 54 5f 4c 4f 43 4b 50 52  QLITE_GET_LOCKPR
18560 4f 58 59 46 49 4c 45 3a 20 7b 0a 20 20 20 20 20  OXYFILE: {.     
18570 20 72 65 74 75 72 6e 20 70 72 6f 78 79 46 69 6c   return proxyFil
18580 65 43 6f 6e 74 72 6f 6c 28 69 64 2c 6f 70 2c 70  eControl(id,op,p
18590 41 72 67 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  Arg);.    }.#end
185a0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41  if /* SQLITE_ENA
185b0 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
185c0 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41  E && defined(__A
185d0 50 50 4c 45 5f 5f 29 20 2a 2f 0a 20 20 7d 0a 20  PPLE__) */.  }. 
185e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
185f0 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  RROR;.}../*.** R
18600 65 74 75 72 6e 20 74 68 65 20 73 65 63 74 6f 72  eturn the sector
18610 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6f   size in bytes o
18620 66 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  f the underlying
18630 20 62 6c 6f 63 6b 20 64 65 76 69 63 65 20 66 6f   block device fo
18640 72 0a 2a 2a 20 74 68 65 20 73 70 65 63 69 66 69  r.** the specifi
18650 65 64 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73  ed file. This is
18660 20 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20 35   almost always 5
18670 31 32 20 62 79 74 65 73 2c 20 62 75 74 20 6d 61  12 bytes, but ma
18680 79 20 62 65 0a 2a 2a 20 6c 61 72 67 65 72 20 66  y be.** larger f
18690 6f 72 20 73 6f 6d 65 20 64 65 76 69 63 65 73 2e  or some devices.
186a0 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 63 6f  .**.** SQLite co
186b0 64 65 20 61 73 73 75 6d 65 73 20 74 68 69 73 20  de assumes this 
186c0 66 75 6e 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20  function cannot 
186d0 66 61 69 6c 2e 20 49 74 20 61 6c 73 6f 20 61 73  fail. It also as
186e0 73 75 6d 65 73 20 74 68 61 74 0a 2a 2a 20 69 66  sumes that.** if
186f0 20 74 77 6f 20 66 69 6c 65 73 20 61 72 65 20 63   two files are c
18700 72 65 61 74 65 64 20 69 6e 20 74 68 65 20 73 61  reated in the sa
18710 6d 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 64  me file-system d
18720 69 72 65 63 74 6f 72 79 20 28 69 2e 65 2e 0a 2a  irectory (i.e..*
18730 2a 20 61 20 64 61 74 61 62 61 73 65 20 61 6e 64  * a database and
18740 20 69 74 73 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   its journal fil
18750 65 29 20 74 68 61 74 20 74 68 65 20 73 65 63 74  e) that the sect
18760 6f 72 20 73 69 7a 65 20 77 69 6c 6c 20 62 65 20  or size will be 
18770 74 68 65 0a 2a 2a 20 73 61 6d 65 20 66 6f 72 20  the.** same for 
18780 62 6f 74 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  both..*/.static 
18790 69 6e 74 20 75 6e 69 78 53 65 63 74 6f 72 53 69  int unixSectorSi
187a0 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ze(sqlite3_file 
187b0 2a 4e 6f 74 55 73 65 64 29 7b 0a 20 20 55 4e 55  *NotUsed){.  UNU
187c0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
187d0 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e  tUsed);.  return
187e0 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
187f0 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 7d 0a 0a  SECTOR_SIZE;.}..
18800 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
18810 20 64 65 76 69 63 65 20 63 68 61 72 61 63 74 65   device characte
18820 72 69 73 74 69 63 73 20 66 6f 72 20 74 68 65 20  ristics for the 
18830 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20 61 6c  file. This is al
18840 77 61 79 73 20 30 20 66 6f 72 20 75 6e 69 78 2e  ways 0 for unix.
18850 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
18860 6e 69 78 44 65 76 69 63 65 43 68 61 72 61 63 74  nixDeviceCharact
18870 65 72 69 73 74 69 63 73 28 73 71 6c 69 74 65 33  eristics(sqlite3
18880 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64 29 7b  _file *NotUsed){
18890 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
188a0 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
188b0 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 23 69 66  return 0;.}..#if
188c0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
188d0 5f 57 41 4c 0a 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a  _WAL.../*.** Obj
188e0 65 63 74 20 75 73 65 64 20 74 6f 20 72 65 70 72  ect used to repr
188f0 65 73 65 6e 74 20 61 6e 20 73 68 61 72 65 64 20  esent an shared 
18900 6d 65 6d 6f 72 79 20 62 75 66 66 65 72 2e 20 20  memory buffer.  
18910 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 6d 75 6c 74  .**.** When mult
18920 69 70 6c 65 20 74 68 72 65 61 64 73 20 61 6c 6c  iple threads all
18930 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 20 73   reference the s
18940 61 6d 65 20 77 61 6c 2d 69 6e 64 65 78 2c 20 65  ame wal-index, e
18950 61 63 68 20 74 68 72 65 61 64 0a 2a 2a 20 68 61  ach thread.** ha
18960 73 20 69 74 73 20 6f 77 6e 20 75 6e 69 78 53 68  s its own unixSh
18970 6d 20 6f 62 6a 65 63 74 2c 20 62 75 74 20 74 68  m object, but th
18980 65 79 20 61 6c 6c 20 70 6f 69 6e 74 20 74 6f 20  ey all point to 
18990 61 20 73 69 6e 67 6c 65 20 69 6e 73 74 61 6e 63  a single instanc
189a0 65 0a 2a 2a 20 6f 66 20 74 68 69 73 20 75 6e 69  e.** of this uni
189b0 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 2e  xShmNode object.
189c0 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
189d0 2c 20 65 61 63 68 20 77 61 6c 2d 69 6e 64 65 78  , each wal-index
189e0 20 69 73 20 6f 70 65 6e 65 64 0a 2a 2a 20 6f 6e   is opened.** on
189f0 6c 79 20 6f 6e 63 65 20 70 65 72 20 70 72 6f 63  ly once per proc
18a00 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 45 61 63 68 20  ess..**.** Each 
18a10 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65  unixShmNode obje
18a20 63 74 20 69 73 20 63 6f 6e 6e 65 63 74 65 64 20  ct is connected 
18a30 74 6f 20 61 20 73 69 6e 67 6c 65 20 75 6e 69 78  to a single unix
18a40 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74  InodeInfo object
18a50 2e 0a 2a 2a 20 57 65 20 63 6f 75 6c 64 20 63 6f  ..** We could co
18a60 61 6c 65 73 63 65 20 74 68 69 73 20 6f 62 6a 65  alesce this obje
18a70 63 74 20 69 6e 74 6f 20 75 6e 69 78 49 6e 6f 64  ct into unixInod
18a80 65 49 6e 66 6f 2c 20 62 75 74 20 74 68 61 74 20  eInfo, but that 
18a90 77 6f 75 6c 64 20 6d 65 61 6e 0a 2a 2a 20 65 76  would mean.** ev
18aa0 65 72 79 20 6f 70 65 6e 20 66 69 6c 65 20 74 68  ery open file th
18ab0 61 74 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  at does not use 
18ac0 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 28 69  shared memory (i
18ad0 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 6d  n other words, m
18ae0 6f 73 74 0a 2a 2a 20 6f 70 65 6e 20 66 69 6c 65  ost.** open file
18af0 73 29 20 77 6f 75 6c 64 20 68 61 76 65 20 74 6f  s) would have to
18b00 20 63 61 72 72 79 20 61 72 6f 75 6e 64 20 74 68   carry around th
18b10 69 73 20 65 78 74 72 61 20 69 6e 66 6f 72 6d 61  is extra informa
18b20 74 69 6f 6e 2e 20 20 53 6f 0a 2a 2a 20 74 68 65  tion.  So.** the
18b30 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f   unixInodeInfo o
18b40 62 6a 65 63 74 20 63 6f 6e 74 61 69 6e 73 20 61  bject contains a
18b50 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 69 73   pointer to this
18b60 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a   unixShmNode obj
18b70 65 63 74 0a 2a 2a 20 61 6e 64 20 74 68 65 20 75  ect.** and the u
18b80 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63  nixShmNode objec
18b90 74 20 69 73 20 63 72 65 61 74 65 64 20 6f 6e 6c  t is created onl
18ba0 79 20 77 68 65 6e 20 6e 65 65 64 65 64 2e 0a 2a  y when needed..*
18bb0 2a 0a 2a 2a 20 75 6e 69 78 4d 75 74 65 78 48 65  *.** unixMutexHe
18bc0 6c 64 28 29 20 6d 75 73 74 20 62 65 20 74 72 75  ld() must be tru
18bd0 65 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20  e when creating 
18be0 6f 72 20 64 65 73 74 72 6f 79 69 6e 67 0a 2a 2a  or destroying.**
18bf0 20 74 68 69 73 20 6f 62 6a 65 63 74 20 6f 72 20   this object or 
18c00 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20 6f 72  while reading or
18c10 20 77 72 69 74 69 6e 67 20 74 68 65 20 66 6f 6c   writing the fol
18c20 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 3a 0a 2a  lowing fields:.*
18c30 2a 0a 2a 2a 20 20 20 20 20 20 6e 52 65 66 0a 2a  *.**      nRef.*
18c40 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
18c50 6e 67 20 66 69 65 6c 64 73 20 61 72 65 20 72 65  ng fields are re
18c60 61 64 2d 6f 6e 6c 79 20 61 66 74 65 72 20 74 68  ad-only after th
18c70 65 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61  e object is crea
18c80 74 65 64 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 20 20  ted:.** .**     
18c90 20 66 69 64 0a 2a 2a 20 20 20 20 20 20 7a 46 69   fid.**      zFi
18ca0 6c 65 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 45 69 74  lename.**.** Eit
18cb0 68 65 72 20 75 6e 69 78 53 68 6d 4e 6f 64 65 2e  her unixShmNode.
18cc0 6d 75 74 65 78 20 6d 75 73 74 20 62 65 20 68 65  mutex must be he
18cd0 6c 64 20 6f 72 20 75 6e 69 78 53 68 6d 4e 6f 64  ld or unixShmNod
18ce0 65 2e 6e 52 65 66 3d 3d 30 20 61 6e 64 0a 2a 2a  e.nRef==0 and.**
18cf0 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29   unixMutexHeld()
18d00 20 69 73 20 74 72 75 65 20 77 68 65 6e 20 72 65   is true when re
18d10 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67  ading or writing
18d20 20 61 6e 79 20 6f 74 68 65 72 20 66 69 65 6c 64   any other field
18d30 0a 2a 2a 20 69 6e 20 74 68 69 73 20 73 74 72 75  .** in this stru
18d40 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20  cture..**.** To 
18d50 61 76 6f 69 64 20 64 65 61 64 6c 6f 63 6b 73 2c  avoid deadlocks,
18d60 20 6d 75 74 65 78 20 61 6e 64 20 6d 75 74 65 78   mutex and mutex
18d70 42 75 66 20 61 72 65 20 61 6c 77 61 79 73 20 72  Buf are always r
18d80 65 6c 65 61 73 65 64 20 69 6e 20 74 68 65 0a 2a  eleased in the.*
18d90 2a 20 72 65 76 65 72 73 65 20 6f 72 64 65 72 20  * reverse order 
18da0 74 68 61 74 20 74 68 65 79 20 61 72 65 20 61 63  that they are ac
18db0 71 75 69 72 65 64 2e 20 20 6d 75 74 65 78 42 75  quired.  mutexBu
18dc0 66 20 69 73 20 61 6c 77 61 79 73 20 61 63 71 75  f is always acqu
18dd0 69 72 65 64 0a 2a 2a 20 66 69 72 73 74 20 61 6e  ired.** first an
18de0 64 20 72 65 6c 65 61 73 65 64 20 6c 61 73 74 2e  d released last.
18df0 20 20 54 68 69 73 20 69 6e 76 61 72 69 61 6e 74    This invariant
18e00 20 69 73 20 63 68 65 63 6b 20 62 79 20 61 73 73   is check by ass
18e10 65 72 74 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65  erting.** sqlite
18e20 33 5f 6d 75 74 65 78 5f 6e 6f 74 68 65 6c 64 28  3_mutex_notheld(
18e30 29 20 6f 6e 20 6d 75 74 65 78 20 77 68 65 6e 65  ) on mutex whene
18e40 76 65 72 20 6d 75 74 65 78 42 75 66 20 69 73 20  ver mutexBuf is 
18e50 61 63 71 75 69 72 65 64 20 6f 72 0a 2a 2a 20 72  acquired or.** r
18e60 65 6c 65 61 73 65 64 2e 0a 2a 2f 0a 73 74 72 75  eleased..*/.stru
18e70 63 74 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 7b  ct unixShmNode {
18e80 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  .  unixInodeInfo
18e90 20 2a 70 49 6e 6f 64 65 3b 20 20 20 20 20 2f 2a   *pInode;     /*
18ea0 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 74   unixInodeInfo t
18eb0 68 61 74 20 6f 77 6e 73 20 74 68 69 73 20 53 48  hat owns this SH
18ec0 4d 20 6e 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69  M node */.  sqli
18ed0 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78  te3_mutex *mutex
18ee0 3b 20 20 20 20 20 20 2f 2a 20 4d 75 74 65 78 20  ;      /* Mutex 
18ef0 74 6f 20 61 63 63 65 73 73 20 74 68 69 73 20 6f  to access this o
18f00 62 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74  bject */.  sqlit
18f10 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 42  e3_mutex *mutexB
18f20 75 66 3b 20 20 20 2f 2a 20 4d 75 74 65 78 20 74  uf;   /* Mutex t
18f30 6f 20 61 63 63 65 73 73 20 7a 42 75 66 5b 5d 20  o access zBuf[] 
18f40 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65  */.  char *zFile
18f50 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  name;           
18f60 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6d  /* Name of the m
18f70 6d 61 70 70 65 64 20 66 69 6c 65 20 2a 2f 0a 20  mapped file */. 
18f80 20 69 6e 74 20 68 3b 20 20 20 20 20 20 20 20 20   int h;         
18f90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
18fa0 70 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70  pen file descrip
18fb0 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 4d  tor */.  int szM
18fc0 61 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ap;             
18fd0 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
18fe0 68 65 20 6d 61 70 70 69 6e 67 20 69 6e 74 6f 20  he mapping into 
18ff0 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 63 68 61 72  memory */.  char
19000 20 2a 70 4d 4d 61 70 42 75 66 3b 20 20 20 20 20   *pMMapBuf;     
19010 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20         /* Where 
19020 63 75 72 72 65 6e 74 6c 79 20 6d 6d 61 70 70 65  currently mmappe
19030 64 28 29 2e 20 20 4e 55 4c 4c 20 69 66 20 75 6e  d().  NULL if un
19040 6d 61 70 70 65 64 20 2a 2f 0a 20 20 69 6e 74 20  mapped */.  int 
19050 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20 20 20  nRef;           
19060 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
19070 20 6f 66 20 75 6e 69 78 53 68 6d 20 6f 62 6a 65   of unixShm obje
19080 63 74 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  cts pointing to 
19090 74 68 69 73 20 2a 2f 0a 20 20 75 6e 69 78 53 68  this */.  unixSh
190a0 6d 20 2a 70 46 69 72 73 74 3b 20 20 20 20 20 20  m *pFirst;      
190b0 20 20 20 20 20 2f 2a 20 41 6c 6c 20 75 6e 69 78       /* All unix
190c0 53 68 6d 20 6f 62 6a 65 63 74 73 20 70 6f 69 6e  Shm objects poin
190d0 74 69 6e 67 20 74 6f 20 74 68 69 73 20 2a 2f 0a  ting to this */.
190e0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
190f0 42 55 47 0a 20 20 75 38 20 65 78 63 6c 4d 61 73  BUG.  u8 exclMas
19100 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
19110 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 65 78 63 6c   /* Mask of excl
19120 75 73 69 76 65 20 6c 6f 63 6b 73 20 68 65 6c 64  usive locks held
19130 20 2a 2f 0a 20 20 75 38 20 73 68 61 72 65 64 4d   */.  u8 sharedM
19140 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ask;            
19150 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 73 68 61 72   /* Mask of shar
19160 65 64 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f  ed locks held */
19170 0a 20 20 75 38 20 6e 65 78 74 53 68 6d 49 64 3b  .  u8 nextShmId;
19180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19190 20 4e 65 78 74 20 61 76 61 69 6c 61 62 6c 65 20   Next available 
191a0 75 6e 69 78 53 68 6d 2e 69 64 20 76 61 6c 75 65  unixShm.id value
191b0 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f   */.#endif.};../
191c0 2a 0a 2a 2a 20 53 74 72 75 63 74 75 72 65 20 75  *.** Structure u
191d0 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 20 62  sed internally b
191e0 79 20 74 68 69 73 20 56 46 53 20 74 6f 20 72 65  y this VFS to re
191f0 63 6f 72 64 20 74 68 65 20 73 74 61 74 65 20 6f  cord the state o
19200 66 20 61 6e 0a 2a 2a 20 6f 70 65 6e 20 73 68 61  f an.** open sha
19210 72 65 64 20 6d 65 6d 6f 72 79 20 63 6f 6e 6e 65  red memory conne
19220 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ction..**.** The
19230 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64   following field
19240 73 20 61 72 65 20 69 6e 69 74 69 61 6c 69 7a 65  s are initialize
19250 64 20 77 68 65 6e 20 74 68 69 73 20 6f 62 6a 65  d when this obje
19260 63 74 20 69 73 20 63 72 65 61 74 65 64 20 61 6e  ct is created an
19270 64 0a 2a 2a 20 61 72 65 20 72 65 61 64 2d 6f 6e  d.** are read-on
19280 6c 79 20 74 68 65 72 65 61 66 74 65 72 3a 0a 2a  ly thereafter:.*
19290 2a 0a 2a 2a 20 20 20 20 75 6e 69 78 53 68 6d 2e  *.**    unixShm.
192a0 70 46 69 6c 65 0a 2a 2a 20 20 20 20 75 6e 69 78  pFile.**    unix
192b0 53 68 6d 2e 69 64 0a 2a 2a 0a 2a 2a 20 41 6c 6c  Shm.id.**.** All
192c0 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20 61 72   other fields ar
192d0 65 20 72 65 61 64 2f 77 72 69 74 65 2e 20 20 54  e read/write.  T
192e0 68 65 20 75 6e 69 78 53 68 6d 2e 70 46 69 6c 65  he unixShm.pFile
192f0 2d 3e 6d 75 74 65 78 20 6d 75 73 74 20 62 65 20  ->mutex must be 
19300 68 65 6c 64 0a 2a 2a 20 77 68 69 6c 65 20 61 63  held.** while ac
19310 63 65 73 73 69 6e 67 20 61 6e 79 20 72 65 61 64  cessing any read
19320 2f 77 72 69 74 65 20 66 69 65 6c 64 73 2e 0a 2a  /write fields..*
19330 2f 0a 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d  /.struct unixShm
19340 20 7b 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65   {.  unixShmNode
19350 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20   *pShmNode;     
19360 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e  /* The underlyin
19370 67 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62  g unixShmNode ob
19380 6a 65 63 74 20 2a 2f 0a 20 20 75 6e 69 78 53 68  ject */.  unixSh
19390 6d 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20  m *pNext;       
193a0 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 75 6e 69       /* Next uni
193b0 78 53 68 6d 20 77 69 74 68 20 74 68 65 20 73 61  xShm with the sa
193c0 6d 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a  me unixShmNode *
193d0 2f 0a 20 20 75 38 20 6c 6f 63 6b 53 74 61 74 65  /.  u8 lockState
193e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
193f0 2a 20 43 75 72 72 65 6e 74 20 6c 6f 63 6b 20 73  * Current lock s
19400 74 61 74 65 20 2a 2f 0a 20 20 75 38 20 68 61 73  tate */.  u8 has
19410 4d 75 74 65 78 3b 20 20 20 20 20 20 20 20 20 20  Mutex;          
19420 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
19430 68 6f 6c 64 69 6e 67 20 74 68 65 20 75 6e 69 78  holding the unix
19440 53 68 6d 4e 6f 64 65 20 6d 75 74 65 78 20 2a 2f  ShmNode mutex */
19450 0a 20 20 75 38 20 68 61 73 4d 75 74 65 78 42 75  .  u8 hasMutexBu
19460 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  f;            /*
19470 20 54 72 75 65 20 69 66 20 68 6f 6c 64 69 6e 67   True if holding
19480 20 70 46 69 6c 65 2d 3e 6d 75 74 65 78 42 75 66   pFile->mutexBuf
19490 20 2a 2f 0a 20 20 75 38 20 73 68 61 72 65 64 4d   */.  u8 sharedM
194a0 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ask;            
194b0 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 73 68 61 72   /* Mask of shar
194c0 65 64 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f  ed locks held */
194d0 0a 20 20 75 38 20 65 78 63 6c 4d 61 73 6b 3b 20  .  u8 exclMask; 
194e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
194f0 20 4d 61 73 6b 20 6f 66 20 65 78 63 6c 75 73 69   Mask of exclusi
19500 76 65 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f  ve locks held */
19510 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
19520 45 42 55 47 0a 20 20 75 38 20 69 64 3b 20 20 20  EBUG.  u8 id;   
19530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19540 20 20 2f 2a 20 49 64 20 6f 66 20 74 68 69 73 20    /* Id of this 
19550 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 69  connection withi
19560 6e 20 69 74 73 20 75 6e 69 78 53 68 6d 4e 6f 64  n its unixShmNod
19570 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a  e */.#endif.};..
19580 2f 2a 0a 2a 2a 20 53 69 7a 65 20 69 6e 63 72 65  /*.** Size incre
19590 6d 65 6e 74 20 62 79 20 77 68 69 63 68 20 73 68  ment by which sh
195a0 61 72 65 64 20 6d 65 6d 6f 72 79 20 67 72 6f 77  ared memory grow
195b0 73 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 51 4c  s.*/.#define SQL
195c0 49 54 45 5f 55 4e 49 58 5f 53 48 4d 5f 49 4e 43  ITE_UNIX_SHM_INC
195d0 52 20 20 34 30 39 36 0a 0a 2f 2a 0a 2a 2a 20 43  R  4096../*.** C
195e0 6f 6e 73 74 61 6e 74 73 20 75 73 65 64 20 66 6f  onstants used fo
195f0 72 20 6c 6f 63 6b 69 6e 67 0a 2a 2f 0a 23 64 65  r locking.*/.#de
19600 66 69 6e 65 20 55 4e 49 58 5f 53 48 4d 5f 42 41  fine UNIX_SHM_BA
19610 53 45 20 20 20 20 20 20 38 30 20 20 20 20 20 20  SE      80      
19620 20 20 2f 2a 20 42 79 74 65 20 6f 66 66 73 65 74    /* Byte offset
19630 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 6c 6f   of the first lo
19640 63 6b 20 62 79 74 65 20 2a 2f 0a 23 64 65 66 69  ck byte */.#defi
19650 6e 65 20 55 4e 49 58 5f 53 48 4d 5f 44 4d 53 20  ne UNIX_SHM_DMS 
19660 20 20 20 20 20 20 30 78 30 31 20 20 20 20 20 20        0x01      
19670 2f 2a 20 4d 61 73 6b 20 66 6f 72 20 44 65 61 64  /* Mask for Dead
19680 2d 4d 61 6e 2d 53 77 69 74 63 68 20 6c 6f 63 6b  -Man-Switch lock
19690 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49 58   */.#define UNIX
196a0 5f 53 48 4d 5f 41 20 20 20 20 20 20 20 20 20 30  _SHM_A         0
196b0 78 31 30 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b  x10      /* Mask
196c0 20 66 6f 72 20 72 65 67 69 6f 6e 20 6c 6f 63 6b   for region lock
196d0 73 2e 2e 2e 20 2a 2f 0a 23 64 65 66 69 6e 65 20  s... */.#define 
196e0 55 4e 49 58 5f 53 48 4d 5f 42 20 20 20 20 20 20  UNIX_SHM_B      
196f0 20 20 20 30 78 32 30 0a 23 64 65 66 69 6e 65 20     0x20.#define 
19700 55 4e 49 58 5f 53 48 4d 5f 43 20 20 20 20 20 20  UNIX_SHM_C      
19710 20 20 20 30 78 34 30 0a 23 64 65 66 69 6e 65 20     0x40.#define 
19720 55 4e 49 58 5f 53 48 4d 5f 44 20 20 20 20 20 20  UNIX_SHM_D      
19730 20 20 20 30 78 38 30 0a 0a 23 69 66 64 65 66 20     0x80..#ifdef 
19740 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a  SQLITE_DEBUG./*.
19750 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
19760 74 65 72 20 74 6f 20 61 20 6e 75 6c 2d 74 65 72  ter to a nul-ter
19770 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67 20 69  minated string i
19780 6e 20 73 74 61 74 69 63 20 6d 65 6d 6f 72 79 20  n static memory 
19790 74 68 61 74 0a 2a 2a 20 64 65 73 63 72 69 62 65  that.** describe
197a0 73 20 61 20 6c 6f 63 6b 69 6e 67 20 6d 61 73 6b  s a locking mask
197b0 2e 20 20 54 68 65 20 73 74 72 69 6e 67 20 69 73  .  The string is
197c0 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 4d 53   of the form "MS
197d0 41 42 43 44 22 20 77 69 74 68 0a 2a 2a 20 65 61  ABCD" with.** ea
197e0 63 68 20 63 68 61 72 61 63 74 65 72 20 72 65 70  ch character rep
197f0 72 65 73 65 6e 74 69 6e 67 20 61 20 6c 6f 63 6b  resenting a lock
19800 2e 20 20 22 4d 22 20 66 6f 72 20 4d 55 54 45 58  .  "M" for MUTEX
19810 2c 20 22 53 22 20 66 6f 72 20 44 4d 53 2c 20 0a  , "S" for DMS, .
19820 2a 2a 20 61 6e 64 20 22 41 22 20 74 68 72 6f 75  ** and "A" throu
19830 67 68 20 22 44 22 20 66 6f 72 20 74 68 65 20 72  gh "D" for the r
19840 65 67 69 6f 6e 20 6c 6f 63 6b 73 2e 20 20 49 66  egion locks.  If
19850 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c   a lock is held,
19860 20 74 68 65 0a 2a 2a 20 6c 65 74 74 65 72 20 69   the.** letter i
19870 73 20 73 68 6f 77 6e 2e 20 20 49 66 20 74 68 65  s shown.  If the
19880 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 68 65 6c   lock is not hel
19890 64 2c 20 74 68 65 20 6c 65 74 74 65 72 20 69 73  d, the letter is
198a0 20 63 6f 6e 76 65 72 74 65 64 0a 2a 2a 20 74 6f   converted.** to
198b0 20 22 2e 22 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73   "."..**.** This
198c0 20 72 6f 75 74 69 6e 65 20 69 73 20 66 6f 72 20   routine is for 
198d0 64 65 62 75 67 67 69 6e 67 20 70 75 72 70 6f 73  debugging purpos
198e0 65 73 20 6f 6e 6c 79 20 61 6e 64 20 64 6f 65 73  es only and does
198f0 20 6e 6f 74 20 61 70 70 65 61 72 0a 2a 2a 20 69   not appear.** i
19900 6e 20 61 20 70 72 6f 64 75 63 74 69 6f 6e 20 62  n a production b
19910 75 69 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  uild..*/.static 
19920 63 6f 6e 73 74 20 63 68 61 72 20 2a 75 6e 69 78  const char *unix
19930 53 68 6d 4c 6f 63 6b 53 74 72 69 6e 67 28 75 38  ShmLockString(u8
19940 20 6d 61 73 6b 29 7b 0a 20 20 73 74 61 74 69 63   mask){.  static
19950 20 63 68 61 72 20 7a 42 75 66 5b 34 38 5d 3b 0a   char zBuf[48];.
19960 20 20 73 74 61 74 69 63 20 69 6e 74 20 69 42 75    static int iBu
19970 66 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a  f = 0;.  char *z
19980 3b 0a 0a 20 20 7a 20 3d 20 26 7a 42 75 66 5b 69  ;..  z = &zBuf[i
19990 42 75 66 5d 3b 0a 20 20 69 42 75 66 20 2b 3d 20  Buf];.  iBuf += 
199a0 38 3b 0a 20 20 69 66 28 20 69 42 75 66 3e 3d 73  8;.  if( iBuf>=s
199b0 69 7a 65 6f 66 28 7a 42 75 66 29 20 29 20 69 42  izeof(zBuf) ) iB
199c0 75 66 20 3d 20 30 3b 0a 0a 20 20 7a 5b 30 5d 20  uf = 0;..  z[0] 
199d0 3d 20 28 6d 61 73 6b 20 26 20 55 4e 49 58 5f 53  = (mask & UNIX_S
199e0 48 4d 5f 44 4d 53 29 20 20 20 3f 20 27 53 27 20  HM_DMS)   ? 'S' 
199f0 3a 20 27 2e 27 3b 0a 20 20 7a 5b 31 5d 20 3d 20  : '.';.  z[1] = 
19a00 28 6d 61 73 6b 20 26 20 55 4e 49 58 5f 53 48 4d  (mask & UNIX_SHM
19a10 5f 41 29 20 20 20 20 20 3f 20 27 41 27 20 3a 20  _A)     ? 'A' : 
19a20 27 2e 27 3b 0a 20 20 7a 5b 32 5d 20 3d 20 28 6d  '.';.  z[2] = (m
19a30 61 73 6b 20 26 20 55 4e 49 58 5f 53 48 4d 5f 42  ask & UNIX_SHM_B
19a40 29 20 20 20 20 20 3f 20 27 42 27 20 3a 20 27 2e  )     ? 'B' : '.
19a50 27 3b 0a 20 20 7a 5b 33 5d 20 3d 20 28 6d 61 73  ';.  z[3] = (mas
19a60 6b 20 26 20 55 4e 49 58 5f 53 48 4d 5f 43 29 20  k & UNIX_SHM_C) 
19a70 20 20 20 20 3f 20 27 43 27 20 3a 20 27 2e 27 3b      ? 'C' : '.';
19a80 0a 20 20 7a 5b 34 5d 20 3d 20 28 6d 61 73 6b 20  .  z[4] = (mask 
19a90 26 20 55 4e 49 58 5f 53 48 4d 5f 44 29 20 20 20  & UNIX_SHM_D)   
19aa0 20 20 3f 20 27 44 27 20 3a 20 27 2e 27 3b 0a 20    ? 'D' : '.';. 
19ab0 20 7a 5b 35 5d 20 3d 20 30 3b 0a 20 20 72 65 74   z[5] = 0;.  ret
19ac0 75 72 6e 20 7a 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn z;.}.#endif 
19ad0 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  /* SQLITE_DEBUG 
19ae0 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 6c 79 20  */../*.** Apply 
19af0 70 6f 73 69 78 20 61 64 76 69 73 6f 72 79 20 6c  posix advisory l
19b00 6f 63 6b 73 20 66 6f 72 20 61 6c 6c 20 62 79 74  ocks for all byt
19b10 65 73 20 69 64 65 6e 74 69 66 69 65 64 20 69 6e  es identified in
19b20 20 6c 6f 63 6b 4d 61 73 6b 2e 0a 2a 2a 0a 2a 2a   lockMask..**.**
19b30 20 6c 6f 63 6b 4d 61 73 6b 20 6d 69 67 68 74 20   lockMask might 
19b40 63 6f 6e 74 61 69 6e 20 6d 75 6c 74 69 70 6c 65  contain multiple
19b50 20 62 69 74 73 20 62 75 74 20 61 6c 6c 20 62 69   bits but all bi
19b60 74 73 20 61 72 65 20 67 75 61 72 61 6e 74 65 65  ts are guarantee
19b70 64 0a 2a 2a 20 74 6f 20 62 65 20 63 6f 6e 74 69  d.** to be conti
19b80 67 75 6f 75 73 2e 0a 2a 2a 0a 2a 2a 20 4c 6f 63  guous..**.** Loc
19b90 6b 73 20 62 6c 6f 63 6b 20 69 66 20 74 68 65 20  ks block if the 
19ba0 6d 61 73 6b 20 69 73 20 65 78 61 63 74 6c 79 20  mask is exactly 
19bb0 55 4e 49 58 5f 53 48 4d 5f 43 20 61 6e 64 20 61  UNIX_SHM_C and a
19bc0 72 65 20 6e 6f 6e 2d 62 6c 6f 63 6b 69 6e 67 0a  re non-blocking.
19bd0 2a 2a 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f  ** otherwise..*/
19be0 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
19bf0 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 0a 20  ShmSystemLock(. 
19c00 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53   unixShmNode *pS
19c10 68 6d 4e 6f 64 65 2c 20 2f 2a 20 41 70 70 6c 79  hmNode, /* Apply
19c20 20 6c 6f 63 6b 73 20 74 6f 20 74 68 69 73 20 6f   locks to this o
19c30 70 65 6e 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  pen shared-memor
19c40 79 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 69  y segment */.  i
19c50 6e 74 20 6c 6f 63 6b 54 79 70 65 2c 20 20 20 20  nt lockType,    
19c60 20 20 20 20 20 20 2f 2a 20 46 5f 55 4e 4c 43 4b        /* F_UNLCK
19c70 2c 20 46 5f 52 44 4c 43 4b 2c 20 6f 72 20 46 5f  , F_RDLCK, or F_
19c80 57 52 4c 43 4b 20 2a 2f 0a 20 20 75 38 20 6c 6f  WRLCK */.  u8 lo
19c90 63 6b 4d 61 73 6b 20 20 20 20 20 20 20 20 20 20  ckMask          
19ca0 20 20 2f 2a 20 57 68 69 63 68 20 62 79 74 65 73    /* Which bytes
19cb0 20 74 6f 20 6c 6f 63 6b 20 6f 72 20 75 6e 6c 6f   to lock or unlo
19cc0 63 6b 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63  ck */.){.  struc
19cd0 74 20 66 6c 6f 63 6b 20 66 3b 20 20 20 20 20 20  t flock f;      
19ce0 20 2f 2a 20 54 68 65 20 70 6f 73 69 78 20 61 64   /* The posix ad
19cf0 76 69 73 6f 72 79 20 6c 6f 63 6b 69 6e 67 20 73  visory locking s
19d00 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 69 6e  tructure */.  in
19d10 74 20 6c 6f 63 6b 4f 70 3b 20 20 20 20 20 20 20  t lockOp;       
19d20 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 63 6f 64      /* The opcod
19d30 65 20 66 6f 72 20 66 63 6e 74 6c 28 29 20 2a 2f  e for fcntl() */
19d40 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
19d50 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
19d60 65 74 20 69 6e 74 6f 20 74 68 65 20 6c 6f 63 6b  et into the lock
19d70 69 6e 67 20 62 79 74 65 20 72 61 6e 67 65 20 2a  ing byte range *
19d80 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
19d90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
19da0 75 6c 74 20 63 6f 64 65 20 66 6f 72 6d 20 66 63  ult code form fc
19db0 6e 74 6c 28 29 20 2a 2f 0a 20 20 75 38 20 6d 61  ntl() */.  u8 ma
19dc0 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  sk;             
19dd0 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 62 69 74 73   /* Mask of bits
19de0 20 69 6e 20 6c 6f 63 6b 4d 61 73 6b 20 2a 2f 0a   in lockMask */.
19df0 0a 20 20 2f 2a 20 41 63 63 65 73 73 20 74 6f 20  .  /* Access to 
19e00 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  the unixShmNode 
19e10 6f 62 6a 65 63 74 20 69 73 20 73 65 72 69 61 6c  object is serial
19e20 69 7a 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  ized by the call
19e30 65 72 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  er */.  assert( 
19e40 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
19e50 6c 64 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  ld(pShmNode->mut
19e60 65 78 29 20 7c 7c 20 70 53 68 6d 4e 6f 64 65 2d  ex) || pShmNode-
19e70 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 0a 20 20 2f  >nRef==0 );..  /
19e80 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
19e90 20 6c 6f 63 6b 69 6e 67 20 70 61 72 61 6d 65 74   locking paramet
19ea0 65 72 73 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28  ers */.  memset(
19eb0 26 66 2c 20 30 2c 20 73 69 7a 65 6f 66 28 66 29  &f, 0, sizeof(f)
19ec0 29 3b 0a 20 20 66 2e 6c 5f 74 79 70 65 20 3d 20  );.  f.l_type = 
19ed0 6c 6f 63 6b 54 79 70 65 3b 0a 20 20 66 2e 6c 5f  lockType;.  f.l_
19ee0 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45  whence = SEEK_SE
19ef0 54 3b 0a 20 20 69 66 28 20 6c 6f 63 6b 4d 61 73  T;.  if( lockMas
19f00 6b 3d 3d 55 4e 49 58 5f 53 48 4d 5f 43 20 26 26  k==UNIX_SHM_C &&
19f10 20 6c 6f 63 6b 54 79 70 65 21 3d 46 5f 55 4e 4c   lockType!=F_UNL
19f20 43 4b 20 29 7b 0a 20 20 20 20 6c 6f 63 6b 4f 70  CK ){.    lockOp
19f30 20 3d 20 46 5f 53 45 54 4c 4b 57 3b 0a 20 20 20   = F_SETLKW;.   
19f40 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4c   OSTRACE(("SHM-L
19f50 4f 43 4b 20 72 65 71 75 65 73 74 69 6e 67 20 62  OCK requesting b
19f60 6c 6f 63 6b 69 6e 67 20 6c 6f 63 6b 5c 6e 22 29  locking lock\n")
19f70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
19f80 6c 6f 63 6b 4f 70 20 3d 20 46 5f 53 45 54 4c 4b  lockOp = F_SETLK
19f90 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 64  ;.  }..  /* Find
19fa0 20 74 68 65 20 66 69 72 73 74 20 62 69 74 20 69   the first bit i
19fb0 6e 20 6c 6f 63 6b 4d 61 73 6b 20 74 68 61 74 20  n lockMask that 
19fc0 69 73 20 73 65 74 20 2a 2f 0a 20 20 66 6f 72 28  is set */.  for(
19fd0 69 3d 30 2c 20 6d 61 73 6b 3d 30 78 30 31 3b 20  i=0, mask=0x01; 
19fe0 6d 61 73 6b 21 3d 30 20 26 26 20 28 6c 6f 63 6b  mask!=0 && (lock
19ff0 4d 61 73 6b 26 6d 61 73 6b 29 3d 3d 30 3b 20 6d  Mask&mask)==0; m
1a000 61 73 6b 20 3c 3c 3d 20 31 2c 20 69 2b 2b 29 7b  ask <<= 1, i++){
1a010 7d 0a 20 20 61 73 73 65 72 74 28 20 6d 61 73 6b  }.  assert( mask
1a020 21 3d 30 20 29 3b 0a 20 20 66 2e 6c 5f 73 74 61  !=0 );.  f.l_sta
1a030 72 74 20 3d 20 69 2b 55 4e 49 58 5f 53 48 4d 5f  rt = i+UNIX_SHM_
1a040 42 41 53 45 3b 0a 20 20 66 2e 6c 5f 6c 65 6e 20  BASE;.  f.l_len 
1a050 3d 20 31 3b 0a 0a 20 20 2f 2a 20 45 78 74 65 6e  = 1;..  /* Exten
1a060 64 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 72 61  d the locking ra
1a070 6e 67 65 20 66 6f 72 20 65 61 63 68 20 61 64 64  nge for each add
1a080 69 74 69 6f 6e 61 6c 20 62 69 74 20 74 68 61 74  itional bit that
1a090 20 69 73 20 73 65 74 20 2a 2f 0a 20 20 6d 61 73   is set */.  mas
1a0a0 6b 20 3c 3c 3d 20 31 3b 0a 20 20 77 68 69 6c 65  k <<= 1;.  while
1a0b0 28 20 6d 61 73 6b 21 3d 30 20 26 26 20 28 6c 6f  ( mask!=0 && (lo
1a0c0 63 6b 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d  ckMask & mask)!=
1a0d0 30 20 29 7b 0a 20 20 20 20 66 2e 6c 5f 6c 65 6e  0 ){.    f.l_len
1a0e0 2b 2b 3b 0a 20 20 20 20 6d 61 73 6b 20 3c 3c 3d  ++;.    mask <<=
1a0f0 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 56 65   1;.  }..  /* Ve
1a100 72 69 66 79 20 74 68 61 74 20 61 6c 6c 20 62 69  rify that all bi
1a110 74 73 20 73 65 74 20 69 6e 20 6c 6f 63 6b 4d 61  ts set in lockMa
1a120 73 6b 20 61 72 65 20 63 6f 6e 74 69 67 75 6f 75  sk are contiguou
1a130 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6d  s */.  assert( m
1a140 61 73 6b 3d 3d 30 20 7c 7c 20 28 6c 6f 63 6b 4d  ask==0 || (lockM
1a150 61 73 6b 20 26 20 7e 28 6d 61 73 6b 20 7c 20 28  ask & ~(mask | (
1a160 6d 61 73 6b 2d 31 29 29 29 3d 3d 30 20 29 3b 0a  mask-1)))==0 );.
1a170 0a 20 20 2f 2a 20 41 63 71 75 69 72 65 20 74 68  .  /* Acquire th
1a180 65 20 73 79 73 74 65 6d 2d 6c 65 76 65 6c 20 6c  e system-level l
1a190 6f 63 6b 20 2a 2f 0a 20 20 72 63 20 3d 20 66 63  ock */.  rc = fc
1a1a0 6e 74 6c 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c  ntl(pShmNode->h,
1a1b0 20 6c 6f 63 6b 4f 70 2c 20 26 66 29 3b 0a 20 20   lockOp, &f);.  
1a1c0 72 63 20 3d 20 28 72 63 21 3d 28 2d 31 29 29 20  rc = (rc!=(-1)) 
1a1d0 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 53 51  ? SQLITE_OK : SQ
1a1e0 4c 49 54 45 5f 42 55 53 59 3b 0a 0a 20 20 2f 2a  LITE_BUSY;..  /*
1a1f0 20 55 70 64 61 74 65 20 74 68 65 20 67 6c 6f 62   Update the glob
1a200 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 20 61 6e  al lock state an
1a210 64 20 64 6f 20 64 65 62 75 67 20 74 72 61 63 69  d do debug traci
1a220 6e 67 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  ng */.#ifdef SQL
1a230 49 54 45 5f 44 45 42 55 47 0a 20 20 4f 53 54 52  ITE_DEBUG.  OSTR
1a240 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20 22  ACE(("SHM-LOCK "
1a250 29 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  ));.  if( rc==SQ
1a260 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
1a270 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 55  f( lockType==F_U
1a280 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 4f 53  NLCK ){.      OS
1a290 54 52 41 43 45 28 28 22 75 6e 6c 6f 63 6b 20 6f  TRACE(("unlock o
1a2a0 6b 22 29 29 3b 0a 20 20 20 20 20 20 70 53 68 6d  k"));.      pShm
1a2b0 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61 73 6b 20 26  Node->exclMask &
1a2c0 3d 20 7e 6c 6f 63 6b 4d 61 73 6b 3b 0a 20 20 20  = ~lockMask;.   
1a2d0 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 68 61     pShmNode->sha
1a2e0 72 65 64 4d 61 73 6b 20 26 3d 20 7e 6c 6f 63 6b  redMask &= ~lock
1a2f0 4d 61 73 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 20  Mask;.    }else 
1a300 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f  if( lockType==F_
1a310 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 4f  RDLCK ){.      O
1a320 53 54 52 41 43 45 28 28 22 72 65 61 64 2d 6c 6f  STRACE(("read-lo
1a330 63 6b 20 6f 6b 22 29 29 3b 0a 20 20 20 20 20 20  ck ok"));.      
1a340 70 53 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61  pShmNode->exclMa
1a350 73 6b 20 26 3d 20 7e 6c 6f 63 6b 4d 61 73 6b 3b  sk &= ~lockMask;
1a360 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  .      pShmNode-
1a370 3e 73 68 61 72 65 64 4d 61 73 6b 20 7c 3d 20 6c  >sharedMask |= l
1a380 6f 63 6b 4d 61 73 6b 3b 0a 20 20 20 20 7d 65 6c  ockMask;.    }el
1a390 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
1a3a0 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 57 52  ( lockType==F_WR
1a3b0 4c 43 4b 20 29 3b 0a 20 20 20 20 20 20 4f 53 54  LCK );.      OST
1a3c0 52 41 43 45 28 28 22 77 72 69 74 65 2d 6c 6f 63  RACE(("write-loc
1a3d0 6b 20 6f 6b 22 29 29 3b 0a 20 20 20 20 20 20 70  k ok"));.      p
1a3e0 53 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61 73  ShmNode->exclMas
1a3f0 6b 20 7c 3d 20 6c 6f 63 6b 4d 61 73 6b 3b 0a 20  k |= lockMask;. 
1a400 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73       pShmNode->s
1a410 68 61 72 65 64 4d 61 73 6b 20 26 3d 20 7e 6c 6f  haredMask &= ~lo
1a420 63 6b 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20  ckMask;.    }.  
1a430 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 6c  }else{.    if( l
1a440 6f 63 6b 54 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b  ockType==F_UNLCK
1a450 20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43   ){.      OSTRAC
1a460 45 28 28 22 75 6e 6c 6f 63 6b 20 66 61 69 6c 65  E(("unlock faile
1a470 64 22 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  d"));.    }else 
1a480 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f  if( lockType==F_
1a490 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 4f  RDLCK ){.      O
1a4a0 53 54 52 41 43 45 28 28 22 72 65 61 64 2d 6c 6f  STRACE(("read-lo
1a4b0 63 6b 20 66 61 69 6c 65 64 22 29 29 3b 0a 20 20  ck failed"));.  
1a4c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
1a4d0 73 73 65 72 74 28 20 6c 6f 63 6b 54 79 70 65 3d  ssert( lockType=
1a4e0 3d 46 5f 57 52 4c 43 4b 20 29 3b 0a 20 20 20 20  =F_WRLCK );.    
1a4f0 20 20 4f 53 54 52 41 43 45 28 28 22 77 72 69 74    OSTRACE(("writ
1a500 65 2d 6c 6f 63 6b 20 66 61 69 6c 65 64 22 29 29  e-lock failed"))
1a510 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 4f 53  ;.    }.  }.  OS
1a520 54 52 41 43 45 28 28 22 20 2d 20 63 68 61 6e 67  TRACE((" - chang
1a530 65 20 72 65 71 75 65 73 74 65 64 20 25 73 20 2d  e requested %s -
1a540 20 61 66 74 65 72 77 61 72 64 73 20 25 73 3a 25   afterwards %s:%
1a550 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\n",.          
1a560 20 75 6e 69 78 53 68 6d 4c 6f 63 6b 53 74 72 69   unixShmLockStri
1a570 6e 67 28 6c 6f 63 6b 4d 61 73 6b 29 2c 0a 20 20  ng(lockMask),.  
1a580 20 20 20 20 20 20 20 20 20 75 6e 69 78 53 68 6d           unixShm
1a590 4c 6f 63 6b 53 74 72 69 6e 67 28 70 53 68 6d 4e  LockString(pShmN
1a5a0 6f 64 65 2d 3e 73 68 61 72 65 64 4d 61 73 6b 29  ode->sharedMask)
1a5b0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 75 6e 69  ,.           uni
1a5c0 78 53 68 6d 4c 6f 63 6b 53 74 72 69 6e 67 28 70  xShmLockString(p
1a5d0 53 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61 73  ShmNode->exclMas
1a5e0 6b 29 29 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  k)));.#endif..  
1a5f0 72 65 74 75 72 6e 20 72 63 3b 20 20 20 20 20 20  return rc;      
1a600 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20    .}../*.** For 
1a610 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 2c 20 75 6e  connection p, un
1a620 6c 6f 63 6b 20 61 6c 6c 20 6f 66 20 74 68 65 20  lock all of the 
1a630 6c 6f 63 6b 73 20 69 64 65 6e 74 69 66 69 65 64  locks identified
1a640 20 62 79 20 74 68 65 20 75 6e 6c 6f 63 6b 4d 61   by the unlockMa
1a650 73 6b 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 2e  sk.** parameter.
1a660 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
1a670 6e 69 78 53 68 6d 55 6e 6c 6f 63 6b 28 0a 20 20  nixShmUnlock(.  
1a680 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68  unixShmNode *pSh
1a690 6d 4e 6f 64 65 2c 20 20 20 2f 2a 20 54 68 65 20  mNode,   /* The 
1a6a0 75 6e 64 65 72 6c 79 69 6e 67 20 73 68 61 72 65  underlying share
1a6b0 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f  d-memory file */
1a6c0 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 2c 20 20  .  unixShm *p,  
1a6d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1a6e0 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f  he connection to
1a6f0 20 62 65 20 75 6e 6c 6f 63 6b 65 64 20 2a 2f 0a   be unlocked */.
1a700 20 20 75 38 20 75 6e 6c 6f 63 6b 4d 61 73 6b 20    u8 unlockMask 
1a710 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
1a720 73 6b 20 6f 66 20 6c 6f 63 6b 73 20 74 6f 20 62  sk of locks to b
1a730 65 20 75 6e 6c 6f 63 6b 65 64 20 2a 2f 0a 29 7b  e unlocked */.){
1a740 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
1a750 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a  /* Result code *
1a760 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 58 3b  /.  unixShm *pX;
1a770 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
1a780 6f 76 65 72 20 61 6c 6c 20 73 69 62 6c 69 6e 67  over all sibling
1a790 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a   connections */.
1a7a0 20 20 75 38 20 61 6c 6c 4d 61 73 6b 3b 20 20 2f    u8 allMask;  /
1a7b0 2a 20 55 6e 69 6f 6e 20 6f 66 20 6c 6f 63 6b 73  * Union of locks
1a7c0 20 68 65 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74   held by connect
1a7d0 69 6f 6e 73 20 6f 74 68 65 72 20 74 68 61 6e 20  ions other than 
1a7e0 22 70 22 20 2a 2f 0a 0a 20 20 2f 2a 20 41 63 63  "p" */..  /* Acc
1a7f0 65 73 73 20 74 6f 20 74 68 65 20 75 6e 69 78 53  ess to the unixS
1a800 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 69 73  hmNode object is
1a810 20 73 65 72 69 61 6c 69 7a 65 64 20 62 79 20 74   serialized by t
1a820 68 65 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 61  he caller */.  a
1a830 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
1a840 75 74 65 78 5f 68 65 6c 64 28 70 53 68 6d 4e 6f  utex_held(pShmNo
1a850 64 65 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20  de->mutex) );.. 
1a860 20 2f 2a 20 43 6f 6d 70 75 74 65 20 6c 6f 63 6b   /* Compute lock
1a870 73 20 68 65 6c 64 20 62 79 20 73 69 62 6c 69 6e  s held by siblin
1a880 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f  g connections */
1a890 0a 20 20 61 6c 6c 4d 61 73 6b 20 3d 20 30 3b 0a  .  allMask = 0;.
1a8a0 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64    for(pX=pShmNod
1a8b0 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20 70  e->pFirst; pX; p
1a8c0 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  X=pX->pNext){.  
1a8d0 20 20 69 66 28 20 70 58 3d 3d 70 20 29 20 63 6f    if( pX==p ) co
1a8e0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65  ntinue;.    asse
1a8f0 72 74 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73  rt( (pX->exclMas
1a900 6b 20 26 20 28 70 2d 3e 65 78 63 6c 4d 61 73 6b  k & (p->exclMask
1a910 7c 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 29 29  |p->sharedMask))
1a920 3d 3d 30 20 29 3b 0a 20 20 20 20 61 6c 6c 4d 61  ==0 );.    allMa
1a930 73 6b 20 7c 3d 20 70 58 2d 3e 73 68 61 72 65 64  sk |= pX->shared
1a940 4d 61 73 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  Mask;.  }..  /* 
1a950 55 6e 6c 6f 63 6b 20 74 68 65 20 73 79 73 74 65  Unlock the syste
1a960 6d 2d 6c 65 76 65 6c 20 6c 6f 63 6b 73 20 2a 2f  m-level locks */
1a970 0a 20 20 69 66 28 20 28 75 6e 6c 6f 63 6b 4d 61  .  if( (unlockMa
1a980 73 6b 20 26 20 61 6c 6c 4d 61 73 6b 29 21 3d 75  sk & allMask)!=u
1a990 6e 6c 6f 63 6b 4d 61 73 6b 20 29 7b 0a 20 20 20  nlockMask ){.   
1a9a0 20 72 63 20 3d 20 75 6e 69 78 53 68 6d 53 79 73   rc = unixShmSys
1a9b0 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65  temLock(pShmNode
1a9c0 2c 20 46 5f 55 4e 4c 43 4b 2c 20 75 6e 6c 6f 63  , F_UNLCK, unloc
1a9d0 6b 4d 61 73 6b 20 26 20 7e 61 6c 6c 4d 61 73 6b  kMask & ~allMask
1a9e0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1a9f0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1aa00 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e 64 6f 20 74    }..  /* Undo t
1aa10 68 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 73 20 2a  he local locks *
1aa20 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  /.  if( rc==SQLI
1aa30 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 2d 3e  TE_OK ){.    p->
1aa40 65 78 63 6c 4d 61 73 6b 20 26 3d 20 7e 75 6e 6c  exclMask &= ~unl
1aa50 6f 63 6b 4d 61 73 6b 3b 0a 20 20 20 20 70 2d 3e  ockMask;.    p->
1aa60 73 68 61 72 65 64 4d 61 73 6b 20 26 3d 20 7e 75  sharedMask &= ~u
1aa70 6e 6c 6f 63 6b 4d 61 73 6b 3b 0a 20 20 7d 20 0a  nlockMask;.  } .
1aa80 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1aa90 2f 2a 0a 2a 2a 20 47 65 74 20 72 65 61 64 65 72  /*.** Get reader
1aaa0 20 6c 6f 63 6b 73 20 66 6f 72 20 63 6f 6e 6e 65   locks for conne
1aab0 63 74 69 6f 6e 20 70 20 6f 6e 20 61 6c 6c 20 6c  ction p on all l
1aac0 6f 63 6b 73 20 69 6e 20 74 68 65 20 72 65 61 64  ocks in the read
1aad0 4d 61 73 6b 20 70 61 72 61 6d 65 74 65 72 2e 0a  Mask parameter..
1aae0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
1aaf0 69 78 53 68 6d 53 68 61 72 65 64 4c 6f 63 6b 28  ixShmSharedLock(
1ab00 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a  .  unixShmNode *
1ab10 70 53 68 6d 4e 6f 64 65 2c 20 20 20 2f 2a 20 54  pShmNode,   /* T
1ab20 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 73 68  he underlying sh
1ab30 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65  ared-memory file
1ab40 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70   */.  unixShm *p
1ab50 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
1ab60 2a 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  * The connection
1ab70 20 74 6f 20 67 65 74 20 74 68 65 20 73 68 61 72   to get the shar
1ab80 65 64 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 75 38  ed locks */.  u8
1ab90 20 72 65 61 64 4d 61 73 6b 20 20 20 20 20 20 20   readMask       
1aba0 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
1abb0 66 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 74  f shared locks t
1abc0 6f 20 62 65 20 61 63 71 75 69 72 65 64 20 2a 2f  o be acquired */
1abd0 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  .){.  int rc;   
1abe0 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63       /* Result c
1abf0 6f 64 65 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d  ode */.  unixShm
1ac00 20 2a 70 58 3b 20 20 20 2f 2a 20 46 6f 72 20 6c   *pX;   /* For l
1ac10 6f 6f 70 69 6e 67 20 6f 76 65 72 20 61 6c 6c 20  ooping over all 
1ac20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69  sibling connecti
1ac30 6f 6e 73 20 2a 2f 0a 20 20 75 38 20 61 6c 6c 53  ons */.  u8 allS
1ac40 68 61 72 65 64 3b 20 20 2f 2a 20 55 6e 69 6f 6e  hared;  /* Union
1ac50 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62   of locks held b
1ac60 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 74  y connections ot
1ac70 68 65 72 20 74 68 61 6e 20 22 70 22 20 2a 2f 0a  her than "p" */.
1ac80 0a 20 20 2f 2a 20 41 63 63 65 73 73 20 74 6f 20  .  /* Access to 
1ac90 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  the unixShmNode 
1aca0 6f 62 6a 65 63 74 20 69 73 20 73 65 72 69 61 6c  object is serial
1acb0 69 7a 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  ized by the call
1acc0 65 72 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  er */.  assert( 
1acd0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
1ace0 6c 64 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  ld(pShmNode->mut
1acf0 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6e  ex) );..  /* Fin
1ad00 64 20 6f 75 74 20 77 68 69 63 68 20 73 68 61 72  d out which shar
1ad10 65 64 20 6c 6f 63 6b 73 20 61 72 65 20 61 6c 72  ed locks are alr
1ad20 65 61 64 79 20 68 65 6c 64 20 62 79 20 73 69 62  eady held by sib
1ad30 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  ling connections
1ad40 2e 0a 20 20 2a 2a 20 49 66 20 61 6e 79 20 73 69  ..  ** If any si
1ad50 62 6c 69 6e 67 20 61 6c 72 65 61 64 79 20 68 6f  bling already ho
1ad60 6c 64 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65  lds an exclusive
1ad70 20 6c 6f 63 6b 2c 20 67 6f 20 61 68 65 61 64 20   lock, go ahead 
1ad80 61 6e 64 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20  and return.  ** 
1ad90 53 51 4c 49 54 45 5f 42 55 53 59 2e 0a 20 20 2a  SQLITE_BUSY..  *
1ada0 2f 0a 20 20 61 6c 6c 53 68 61 72 65 64 20 3d 20  /.  allShared = 
1adb0 30 3b 0a 20 20 66 6f 72 28 70 58 3d 70 53 68 6d  0;.  for(pX=pShm
1adc0 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70 58  Node->pFirst; pX
1add0 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b  ; pX=pX->pNext){
1ade0 0a 20 20 20 20 69 66 28 20 70 58 3d 3d 70 20 29  .    if( pX==p )
1adf0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
1ae00 66 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b  f( (pX->exclMask
1ae10 20 26 20 72 65 61 64 4d 61 73 6b 29 21 3d 30 20   & readMask)!=0 
1ae20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
1ae30 42 55 53 59 3b 0a 20 20 20 20 61 6c 6c 53 68 61  BUSY;.    allSha
1ae40 72 65 64 20 7c 3d 20 70 58 2d 3e 73 68 61 72 65  red |= pX->share
1ae50 64 4d 61 73 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  dMask;.  }..  /*
1ae60 20 47 65 74 20 73 68 61 72 65 64 20 6c 6f 63 6b   Get shared lock
1ae70 73 20 61 74 20 74 68 65 20 73 79 73 74 65 6d 20  s at the system 
1ae80 6c 65 76 65 6c 2c 20 69 66 20 6e 65 63 65 73 73  level, if necess
1ae90 61 72 79 20 2a 2f 0a 20 20 69 66 28 20 28 7e 61  ary */.  if( (~a
1aea0 6c 6c 53 68 61 72 65 64 29 20 26 20 72 65 61 64  llShared) & read
1aeb0 4d 61 73 6b 20 29 7b 0a 20 20 20 20 72 63 20 3d  Mask ){.    rc =
1aec0 20 75 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f   unixShmSystemLo
1aed0 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 46 5f 52  ck(pShmNode, F_R
1aee0 44 4c 43 4b 2c 20 72 65 61 64 4d 61 73 6b 29 3b  DLCK, readMask);
1aef0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
1af00 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1af10 7d 0a 0a 20 20 2f 2a 20 47 65 74 20 74 68 65 20  }..  /* Get the 
1af20 6c 6f 63 61 6c 20 73 68 61 72 65 64 20 6c 6f 63  local shared loc
1af30 6b 73 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d  ks */.  if( rc==
1af40 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1af50 20 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 7c   p->sharedMask |
1af60 3d 20 72 65 61 64 4d 61 73 6b 3b 0a 20 20 7d 0a  = readMask;.  }.
1af70 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1af80 2f 2a 0a 2a 2a 20 46 6f 72 20 63 6f 6e 6e 65 63  /*.** For connec
1af90 74 69 6f 6e 20 70 2c 20 67 65 74 20 61 6e 20 65  tion p, get an e
1afa0 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e  xclusive lock on
1afb0 20 61 6c 6c 20 6c 6f 63 6b 73 20 69 64 65 6e 74   all locks ident
1afc0 69 66 69 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20  ified in.** the 
1afd0 77 72 69 74 65 4d 61 73 6b 20 70 61 72 61 6d 65  writeMask parame
1afe0 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ter..*/.static i
1aff0 6e 74 20 75 6e 69 78 53 68 6d 45 78 63 6c 75 73  nt unixShmExclus
1b000 69 76 65 4c 6f 63 6b 28 0a 20 20 75 6e 69 78 53  iveLock(.  unixS
1b010 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65  hmNode *pShmNode
1b020 2c 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65  ,    /* The unde
1b030 72 6c 79 69 6e 67 20 73 68 61 72 65 64 2d 6d 65  rlying shared-me
1b040 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 75  mory file */.  u
1b050 6e 69 78 53 68 6d 20 2a 70 2c 20 20 20 20 20 20  nixShm *p,      
1b060 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1b070 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 67 65  connection to ge
1b080 74 20 74 68 65 20 65 78 63 6c 75 73 69 76 65 20  t the exclusive 
1b090 6c 6f 63 6b 73 20 2a 2f 0a 20 20 75 38 20 77 72  locks */.  u8 wr
1b0a0 69 74 65 4d 61 73 6b 20 20 20 20 20 20 20 20 20  iteMask         
1b0b0 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
1b0c0 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20  exclusive locks 
1b0d0 74 6f 20 62 65 20 61 63 71 75 69 72 65 64 20 2a  to be acquired *
1b0e0 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  /.){.  int rc;  
1b0f0 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
1b100 63 6f 64 65 20 2a 2f 0a 20 20 75 6e 69 78 53 68  code */.  unixSh
1b110 6d 20 2a 70 58 3b 20 20 20 2f 2a 20 46 6f 72 20  m *pX;   /* For 
1b120 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 61 6c 6c  looping over all
1b130 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74   sibling connect
1b140 69 6f 6e 73 20 2a 2f 0a 0a 20 20 2f 2a 20 41 63  ions */..  /* Ac
1b150 63 65 73 73 20 74 6f 20 74 68 65 20 75 6e 69 78  cess to the unix
1b160 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 69  ShmNode object i
1b170 73 20 73 65 72 69 61 6c 69 7a 65 64 20 62 79 20  s serialized by 
1b180 74 68 65 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20  the caller */.  
1b190 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
1b1a0 6d 75 74 65 78 5f 68 65 6c 64 28 70 53 68 6d 4e  mutex_held(pShmN
1b1b0 6f 64 65 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a  ode->mutex) );..
1b1c0 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 6e    /* Make sure n
1b1d0 6f 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63  o sibling connec
1b1e0 74 69 6f 6e 73 20 68 6f 6c 64 20 6c 6f 63 6b 73  tions hold locks
1b1f0 20 74 68 61 74 20 77 69 6c 6c 20 62 6c 6f 63 6b   that will block
1b200 20 74 68 69 73 0a 20 20 2a 2a 20 6c 6f 63 6b 2e   this.  ** lock.
1b210 20 20 49 66 20 61 6e 79 20 64 6f 2c 20 72 65 74    If any do, ret
1b220 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 20  urn SQLITE_BUSY 
1b230 72 69 67 68 74 20 61 77 61 79 2e 0a 20 20 2a 2f  right away..  */
1b240 0a 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f  .  for(pX=pShmNo
1b250 64 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20  de->pFirst; pX; 
1b260 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20  pX=pX->pNext){. 
1b270 20 20 20 69 66 28 20 70 58 3d 3d 70 20 29 20 63     if( pX==p ) c
1b280 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
1b290 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26   (pX->exclMask &
1b2a0 20 77 72 69 74 65 4d 61 73 6b 29 21 3d 30 20 29   writeMask)!=0 )
1b2b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
1b2c0 55 53 59 3b 0a 20 20 20 20 69 66 28 20 28 70 58  USY;.    if( (pX
1b2d0 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 20 77  ->sharedMask & w
1b2e0 72 69 74 65 4d 61 73 6b 29 21 3d 30 20 29 20 72  riteMask)!=0 ) r
1b2f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
1b300 59 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 74  Y;.  }..  /* Get
1b310 20 74 68 65 20 65 78 63 6c 75 73 69 76 65 20 6c   the exclusive l
1b320 6f 63 6b 73 20 61 74 20 74 68 65 20 73 79 73 74  ocks at the syst
1b330 65 6d 20 6c 65 76 65 6c 2e 20 20 54 68 65 6e 20  em level.  Then 
1b340 69 66 20 73 75 63 63 65 73 73 66 75 6c 0a 20 20  if successful.  
1b350 2a 2a 20 61 6c 73 6f 20 6d 61 72 6b 20 74 68 65  ** also mark the
1b360 20 6c 6f 63 61 6c 20 63 6f 6e 6e 65 63 74 69 6f   local connectio
1b370 6e 20 61 73 20 62 65 69 6e 67 20 6c 6f 63 6b 65  n as being locke
1b380 64 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 75  d..  */.  rc = u
1b390 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b  nixShmSystemLock
1b3a0 28 70 53 68 6d 4e 6f 64 65 2c 20 46 5f 57 52 4c  (pShmNode, F_WRL
1b3b0 43 4b 2c 20 77 72 69 74 65 4d 61 73 6b 29 3b 0a  CK, writeMask);.
1b3c0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1b3d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 2d 3e 73 68  _OK ){.    p->sh
1b3e0 61 72 65 64 4d 61 73 6b 20 26 3d 20 7e 77 72 69  aredMask &= ~wri
1b3f0 74 65 4d 61 73 6b 3b 0a 20 20 20 20 70 2d 3e 65  teMask;.    p->e
1b400 78 63 6c 4d 61 73 6b 20 7c 3d 20 77 72 69 74 65  xclMask |= write
1b410 4d 61 73 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Mask;.  }.  retu
1b420 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1b430 50 75 72 67 65 20 74 68 65 20 75 6e 69 78 53 68  Purge the unixSh
1b440 6d 4e 6f 64 65 4c 69 73 74 20 6c 69 73 74 20 6f  mNodeList list o
1b450 66 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 77 69  f all entries wi
1b460 74 68 20 75 6e 69 78 53 68 6d 4e 6f 64 65 2e 6e  th unixShmNode.n
1b470 52 65 66 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20 54 68  Ref==0..**.** Th
1b480 69 73 20 69 73 20 6e 6f 74 20 61 20 56 46 53 20  is is not a VFS 
1b490 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6d 65  shared-memory me
1b4a0 74 68 6f 64 3b 20 69 74 20 69 73 20 61 20 75 74  thod; it is a ut
1b4b0 69 6c 69 74 79 20 66 75 6e 63 74 69 6f 6e 20 63  ility function c
1b4c0 61 6c 6c 65 64 0a 2a 2a 20 62 79 20 56 46 53 20  alled.** by VFS 
1b4d0 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6d 65  shared-memory me
1b4e0 74 68 6f 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  thods..*/.static
1b4f0 20 76 6f 69 64 20 75 6e 69 78 53 68 6d 50 75 72   void unixShmPur
1b500 67 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 64  ge(unixFile *pFd
1b510 29 7b 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65  ){.  unixShmNode
1b520 20 2a 70 20 3d 20 70 46 64 2d 3e 70 49 6e 6f 64   *p = pFd->pInod
1b530 65 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 61  e->pShmNode;.  a
1b540 73 73 65 72 74 28 20 75 6e 69 78 4d 75 74 65 78  ssert( unixMutex
1b550 48 65 6c 64 28 29 20 29 3b 0a 20 20 69 66 28 20  Held() );.  if( 
1b560 70 20 26 26 20 70 2d 3e 6e 52 65 66 3d 3d 30 20  p && p->nRef==0 
1b570 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
1b580 2d 3e 70 49 6e 6f 64 65 3d 3d 70 46 64 2d 3e 70  ->pInode==pFd->p
1b590 49 6e 6f 64 65 20 29 3b 0a 20 20 20 20 69 66 28  Inode );.    if(
1b5a0 20 70 2d 3e 6d 75 74 65 78 20 29 20 73 71 6c 69   p->mutex ) sqli
1b5b0 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 70  te3_mutex_free(p
1b5c0 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 69 66  ->mutex);.    if
1b5d0 28 20 70 2d 3e 6d 75 74 65 78 42 75 66 20 29 20  ( p->mutexBuf ) 
1b5e0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72  sqlite3_mutex_fr
1b5f0 65 65 28 70 2d 3e 6d 75 74 65 78 42 75 66 29 3b  ee(p->mutexBuf);
1b600 0a 20 20 20 20 69 66 28 20 70 2d 3e 68 3e 3d 30  .    if( p->h>=0
1b610 20 29 20 63 6c 6f 73 65 28 70 2d 3e 68 29 3b 0a   ) close(p->h);.
1b620 20 20 20 20 70 2d 3e 70 49 6e 6f 64 65 2d 3e 70      p->pInode->p
1b630 53 68 6d 4e 6f 64 65 20 3d 20 30 3b 0a 20 20 20  ShmNode = 0;.   
1b640 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
1b650 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f  ;.  }.}../*.** O
1b660 70 65 6e 20 61 20 73 68 61 72 65 64 2d 6d 65 6d  pen a shared-mem
1b670 6f 72 79 20 61 72 65 61 2e 20 20 54 68 69 73 20  ory area.  This 
1b680 70 61 72 74 69 63 75 6c 61 72 20 69 6d 70 6c 65  particular imple
1b690 6d 65 6e 74 61 74 69 6f 6e 20 75 73 65 73 0a 2a  mentation uses.*
1b6a0 2a 20 6d 6d 61 70 70 65 64 20 66 69 6c 65 73 2e  * mmapped files.
1b6b0 0a 2a 2a 0a 2a 2a 20 7a 4e 61 6d 65 20 69 73 20  .**.** zName is 
1b6c0 61 20 66 69 6c 65 6e 61 6d 65 20 75 73 65 64 20  a filename used 
1b6d0 74 6f 20 69 64 65 6e 74 69 66 79 20 74 68 65 20  to identify the 
1b6e0 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 61 72  shared-memory ar
1b6f0 65 61 2e 20 20 54 68 65 0a 2a 2a 20 69 6d 70 6c  ea.  The.** impl
1b700 65 6d 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20  ementation does 
1b710 6e 6f 74 20 28 61 6e 64 20 70 65 72 68 61 70 73  not (and perhaps
1b720 20 73 68 6f 75 6c 64 20 6e 6f 74 29 20 75 73 65   should not) use
1b730 20 74 68 69 73 20 6e 61 6d 65 0a 2a 2a 20 64 69   this name.** di
1b740 72 65 63 74 6c 79 2c 20 62 75 74 20 72 61 74 68  rectly, but rath
1b750 65 72 20 75 73 65 20 69 74 20 61 73 20 61 20 74  er use it as a t
1b760 65 6d 70 6c 61 74 65 20 66 6f 72 20 66 69 6e 64  emplate for find
1b770 69 6e 67 20 61 6e 20 61 70 70 72 6f 70 72 69 61  ing an appropria
1b780 74 65 0a 2a 2a 20 6e 61 6d 65 20 66 6f 72 20 74  te.** name for t
1b790 68 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  he shared-memory
1b7a0 20 73 74 6f 72 61 67 65 2e 20 20 49 6e 20 74 68   storage.  In th
1b7b0 69 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  is implementatio
1b7c0 6e 2c 20 74 68 65 0a 2a 2a 20 73 74 72 69 6e 67  n, the.** string
1b7d0 20 22 2d 69 6e 64 65 78 22 20 69 73 20 61 70 70   "-index" is app
1b7e0 65 6e 64 65 64 20 74 6f 20 7a 4e 61 6d 65 20 61  ended to zName a
1b7f0 6e 64 20 75 73 65 64 20 61 73 20 74 68 65 20 6e  nd used as the n
1b800 61 6d 65 20 6f 66 20 74 68 65 0a 2a 2a 20 6d 6d  ame of the.** mm
1b810 61 70 70 65 64 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  apped file..**.*
1b820 2a 20 57 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61  * When opening a
1b830 20 6e 65 77 20 73 68 61 72 65 64 2d 6d 65 6d 6f   new shared-memo
1b840 72 79 20 66 69 6c 65 2c 20 69 66 20 6e 6f 20 6f  ry file, if no o
1b850 74 68 65 72 20 69 6e 73 74 61 6e 63 65 73 20 6f  ther instances o
1b860 66 20 74 68 61 74 0a 2a 2a 20 66 69 6c 65 20 61  f that.** file a
1b870 72 65 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65  re currently ope
1b880 6e 2c 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65  n, in this proce
1b890 73 73 20 6f 72 20 69 6e 20 6f 74 68 65 72 20 70  ss or in other p
1b8a0 72 6f 63 65 73 73 65 73 2c 20 74 68 65 6e 0a 2a  rocesses, then.*
1b8b0 2a 20 74 68 65 20 66 69 6c 65 20 6d 75 73 74 20  * the file must 
1b8c0 62 65 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20  be truncated to 
1b8d0 7a 65 72 6f 20 6c 65 6e 67 74 68 20 6f 72 20 68  zero length or h
1b8e0 61 76 65 20 69 74 73 20 68 65 61 64 65 72 20 63  ave its header c
1b8f0 6c 65 61 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  leared..*/.stati
1b900 63 20 69 6e 74 20 75 6e 69 78 53 68 6d 4f 70 65  c int unixShmOpe
1b910 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  n(.  sqlite3_fil
1b920 65 20 2a 66 64 20 20 20 20 20 20 2f 2a 20 54 68  e *fd      /* Th
1b930 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
1b940 72 20 6f 66 20 74 68 65 20 61 73 73 6f 63 69 61  r of the associa
1b950 74 65 64 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  ted database */.
1b960 29 7b 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78  ){.  struct unix
1b970 53 68 6d 20 2a 70 20 3d 20 30 3b 20 20 20 20 20  Shm *p = 0;     
1b980 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
1b990 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65 20  onnection to be 
1b9a0 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 73 74 72 75  opened */.  stru
1b9b0 63 74 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a  ct unixShmNode *
1b9c0 70 53 68 6d 4e 6f 64 65 20 3d 20 30 3b 20 20 2f  pShmNode = 0;  /
1b9d0 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  * The underlying
1b9e0 20 6d 6d 61 70 70 65 64 20 66 69 6c 65 20 2a 2f   mmapped file */
1b9f0 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
1ba00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba10 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
1ba20 63 6f 64 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  code */.  struct
1ba30 20 75 6e 69 78 46 69 6c 65 20 2a 70 44 62 46 64   unixFile *pDbFd
1ba40 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
1ba50 55 6e 64 65 72 6c 79 69 6e 67 20 64 61 74 61 62  Underlying datab
1ba60 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  ase file */.  in
1ba70 74 20 6e 50 61 74 68 3b 20 20 20 20 20 20 20 20  t nPath;        
1ba80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba90 20 2f 2a 20 53 69 7a 65 20 6f 66 20 70 44 62 46   /* Size of pDbF
1baa0 64 2d 3e 7a 50 61 74 68 20 69 6e 20 62 79 74 65  d->zPath in byte
1bab0 73 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  s */..  /* Alloc
1bac0 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 74 68  ate space for th
1bad0 65 20 6e 65 77 20 73 71 6c 69 74 65 33 5f 73 68  e new sqlite3_sh
1bae0 6d 20 6f 62 6a 65 63 74 2e 0a 20 20 2a 2f 0a 20  m object..  */. 
1baf0 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c   p = sqlite3_mal
1bb00 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 29 20  loc( sizeof(*p) 
1bb10 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  );.  if( p==0 ) 
1bb20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
1bb30 4d 45 4d 3b 0a 20 20 6d 65 6d 73 65 74 28 70 2c  MEM;.  memset(p,
1bb40 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b   0, sizeof(*p));
1bb50 0a 20 20 70 44 62 46 64 20 3d 20 28 73 74 72 75  .  pDbFd = (stru
1bb60 63 74 20 75 6e 69 78 46 69 6c 65 2a 29 66 64 3b  ct unixFile*)fd;
1bb70 0a 20 20 61 73 73 65 72 74 28 20 70 44 62 46 64  .  assert( pDbFd
1bb80 2d 3e 70 53 68 6d 3d 3d 30 20 29 3b 0a 0a 20 20  ->pShm==0 );..  
1bb90 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
1bba0 69 66 20 61 20 75 6e 69 78 53 68 6d 4e 6f 64 65  if a unixShmNode
1bbb0 20 6f 62 6a 65 63 74 20 61 6c 72 65 61 64 79 20   object already 
1bbc0 65 78 69 73 74 73 2e 20 20 52 65 75 73 65 20 61  exists.  Reuse a
1bbd0 6e 20 65 78 69 73 74 69 6e 67 0a 20 20 2a 2a 20  n existing.  ** 
1bbe0 6f 6e 65 20 69 66 20 70 72 65 73 65 6e 74 2e 20  one if present. 
1bbf0 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e   Create a new on
1bc00 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a  e if necessary..
1bc10 20 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72    */.  unixEnter
1bc20 4d 75 74 65 78 28 29 3b 0a 20 20 70 53 68 6d 4e  Mutex();.  pShmN
1bc30 6f 64 65 20 3d 20 70 44 62 46 64 2d 3e 70 49 6e  ode = pDbFd->pIn
1bc40 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20  ode->pShmNode;. 
1bc50 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 30   if( pShmNode==0
1bc60 20 29 7b 0a 20 20 20 20 6e 50 61 74 68 20 3d 20   ){.    nPath = 
1bc70 73 74 72 6c 65 6e 28 70 44 62 46 64 2d 3e 7a 50  strlen(pDbFd->zP
1bc80 61 74 68 29 3b 0a 20 20 20 20 70 53 68 6d 4e 6f  ath);.    pShmNo
1bc90 64 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  de = sqlite3_mal
1bca0 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 53 68  loc( sizeof(*pSh
1bcb0 6d 4e 6f 64 65 29 20 2b 20 6e 50 61 74 68 20 2b  mNode) + nPath +
1bcc0 20 31 35 20 29 3b 0a 20 20 20 20 69 66 28 20 70   15 );.    if( p
1bcd0 53 68 6d 4e 6f 64 65 3d 3d 30 20 29 7b 0a 20 20  ShmNode==0 ){.  
1bce0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1bcf0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74  NOMEM;.      got
1bd00 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a  o shm_open_err;.
1bd10 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74      }.    memset
1bd20 28 70 53 68 6d 4e 6f 64 65 2c 20 30 2c 20 73 69  (pShmNode, 0, si
1bd30 7a 65 6f 66 28 2a 70 53 68 6d 4e 6f 64 65 29 29  zeof(*pShmNode))
1bd40 3b 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e  ;.    pShmNode->
1bd50 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 28 63 68 61  zFilename = (cha
1bd60 72 2a 29 26 70 53 68 6d 4e 6f 64 65 5b 31 5d 3b  r*)&pShmNode[1];
1bd70 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
1bd80 72 69 6e 74 66 28 6e 50 61 74 68 2b 31 35 2c 20  rintf(nPath+15, 
1bd90 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e  pShmNode->zFilen
1bda0 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ame,.           
1bdb0 20 20 20 20 20 20 20 20 20 20 22 25 73 2d 77 61            "%s-wa
1bdc0 6c 2d 69 6e 64 65 78 22 2c 20 70 44 62 46 64 2d  l-index", pDbFd-
1bdd0 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 70 53 68  >zPath);.    pSh
1bde0 6d 4e 6f 64 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20  mNode->h = -1;. 
1bdf0 20 20 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65     pDbFd->pInode
1be00 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d 20 70 53 68  ->pShmNode = pSh
1be10 6d 4e 6f 64 65 3b 0a 20 20 20 20 70 53 68 6d 4e  mNode;.    pShmN
1be20 6f 64 65 2d 3e 70 49 6e 6f 64 65 20 3d 20 70 44  ode->pInode = pD
1be30 62 46 64 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 20  bFd->pInode;.   
1be40 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78   pShmNode->mutex
1be50 20 3d 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78   = sqlite3_mutex
1be60 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  _alloc(SQLITE_MU
1be70 54 45 58 5f 46 41 53 54 29 3b 0a 20 20 20 20 69  TEX_FAST);.    i
1be80 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  f( pShmNode->mut
1be90 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  ex==0 ){.      r
1bea0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
1beb0 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d  ;.      goto shm
1bec0 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d  _open_err;.    }
1bed0 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d  .    pShmNode->m
1bee0 75 74 65 78 42 75 66 20 3d 20 73 71 6c 69 74 65  utexBuf = sqlite
1bef0 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51  3_mutex_alloc(SQ
1bf00 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41 53 54 29  LITE_MUTEX_FAST)
1bf10 3b 0a 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f  ;.    if( pShmNo
1bf20 64 65 2d 3e 6d 75 74 65 78 42 75 66 3d 3d 30 20  de->mutexBuf==0 
1bf30 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
1bf40 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
1bf50 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f    goto shm_open_
1bf60 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  err;.    }..    
1bf70 70 53 68 6d 4e 6f 64 65 2d 3e 68 20 3d 20 6f 70  pShmNode->h = op
1bf80 65 6e 28 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69  en(pShmNode->zFi
1bf90 6c 65 6e 61 6d 65 2c 20 4f 5f 52 44 57 52 7c 4f  lename, O_RDWR|O
1bfa0 5f 43 52 45 41 54 2c 20 30 36 36 34 29 3b 0a 20  _CREAT, 0664);. 
1bfb0 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d     if( pShmNode-
1bfc0 3e 68 3c 30 20 29 7b 0a 20 20 20 20 20 20 72 63  >h<0 ){.      rc
1bfd0 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50   = SQLITE_CANTOP
1bfe0 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67  EN_BKPT;.      g
1bff0 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72  oto shm_open_err
1c000 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1c010 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
1c020 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  another process 
1c030 69 73 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 64  is holding the d
1c040 65 61 64 2d 6d 61 6e 20 73 77 69 74 63 68 2e 0a  ead-man switch..
1c050 20 20 20 20 2a 2a 20 49 66 20 6e 6f 74 2c 20 74      ** If not, t
1c060 72 75 6e 63 61 74 65 20 74 68 65 20 66 69 6c 65  runcate the file
1c070 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68 2e   to zero length.
1c080 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20   .    */.    rc 
1c090 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
1c0a0 20 69 66 28 20 75 6e 69 78 53 68 6d 53 79 73 74   if( unixShmSyst
1c0b0 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c  emLock(pShmNode,
1c0c0 20 46 5f 57 52 4c 43 4b 2c 20 55 4e 49 58 5f 53   F_WRLCK, UNIX_S
1c0d0 48 4d 5f 44 4d 53 29 3d 3d 53 51 4c 49 54 45 5f  HM_DMS)==SQLITE_
1c0e0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  OK ){.      if( 
1c0f0 66 74 72 75 6e 63 61 74 65 28 70 53 68 6d 4e 6f  ftruncate(pShmNo
1c100 64 65 2d 3e 68 2c 20 30 29 20 29 7b 0a 20 20 20  de->h, 0) ){.   
1c110 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1c120 5f 49 4f 45 52 52 3b 0a 20 20 20 20 20 20 7d 0a  _IOERR;.      }.
1c130 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
1c140 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1c150 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 53 68       rc = unixSh
1c160 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d  mSystemLock(pShm
1c170 4e 6f 64 65 2c 20 46 5f 52 44 4c 43 4b 2c 20 55  Node, F_RDLCK, U
1c180 4e 49 58 5f 53 48 4d 5f 44 4d 53 29 3b 0a 20 20  NIX_SHM_DMS);.  
1c190 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 20 29    }.    if( rc )
1c1a0 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65   goto shm_open_e
1c1b0 72 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61  rr;.  }..  /* Ma
1c1c0 6b 65 20 74 68 65 20 6e 65 77 20 63 6f 6e 6e 65  ke the new conne
1c1d0 63 74 69 6f 6e 20 61 20 63 68 69 6c 64 20 6f 66  ction a child of
1c1e0 20 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65   the unixShmNode
1c1f0 20 2a 2f 0a 20 20 70 2d 3e 70 53 68 6d 4e 6f 64   */.  p->pShmNod
1c200 65 20 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a 20 20  e = pShmNode;.  
1c210 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 68 6d 4e  p->pNext = pShmN
1c220 6f 64 65 2d 3e 70 46 69 72 73 74 3b 0a 23 69 66  ode->pFirst;.#if
1c230 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
1c240 0a 20 20 70 2d 3e 69 64 20 3d 20 70 53 68 6d 4e  .  p->id = pShmN
1c250 6f 64 65 2d 3e 6e 65 78 74 53 68 6d 49 64 2b 2b  ode->nextShmId++
1c260 3b 0a 23 65 6e 64 69 66 0a 20 20 70 53 68 6d 4e  ;.#endif.  pShmN
1c270 6f 64 65 2d 3e 70 46 69 72 73 74 20 3d 20 70 3b  ode->pFirst = p;
1c280 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  .  pShmNode->nRe
1c290 66 2b 2b 3b 0a 20 20 70 44 62 46 64 2d 3e 70 53  f++;.  pDbFd->pS
1c2a0 68 6d 20 3d 20 70 3b 0a 20 20 75 6e 69 78 4c 65  hm = p;.  unixLe
1c2b0 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 72 65  aveMutex();.  re
1c2c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1c2d0 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20  .  /* Jump here 
1c2e0 6f 6e 20 61 6e 79 20 65 72 72 6f 72 20 2a 2f 0a  on any error */.
1c2f0 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3a 0a 20 20  shm_open_err:.  
1c300 75 6e 69 78 53 68 6d 50 75 72 67 65 28 70 44 62  unixShmPurge(pDb
1c310 46 64 29 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  Fd);       /* Th
1c320 69 73 20 63 61 6c 6c 20 66 72 65 65 73 20 70 53  is call frees pS
1c330 68 6d 4e 6f 64 65 20 69 66 20 72 65 71 75 69 72  hmNode if requir
1c340 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ed */.  sqlite3_
1c350 66 72 65 65 28 70 29 3b 0a 20 20 75 6e 69 78 4c  free(p);.  unixL
1c360 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 72  eaveMutex();.  r
1c370 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1c380 2a 2a 20 43 6c 6f 73 65 20 61 20 63 6f 6e 6e 65  ** Close a conne
1c390 63 74 69 6f 6e 20 74 6f 20 73 68 61 72 65 64 2d  ction to shared-
1c3a0 6d 65 6d 6f 72 79 2e 20 20 44 65 6c 65 74 65 20  memory.  Delete 
1c3b0 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 0a  the underlying .
1c3c0 2a 2a 20 73 74 6f 72 61 67 65 20 69 66 20 64 65  ** storage if de
1c3d0 6c 65 74 65 46 6c 61 67 20 69 73 20 74 72 75 65  leteFlag is true
1c3e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1c3f0 75 6e 69 78 53 68 6d 43 6c 6f 73 65 28 0a 20 20  unixShmClose(.  
1c400 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
1c410 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ,          /* Th
1c420 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61 74  e underlying dat
1c430 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
1c440 69 6e 74 20 64 65 6c 65 74 65 46 6c 61 67 20 20  int deleteFlag  
1c450 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65             /* De
1c460 6c 65 74 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f  lete shared-memo
1c470 72 79 20 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b  ry if true */.){
1c480 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 3b 20 20  .  unixShm *p;  
1c490 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1c4a0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62   connection to b
1c4b0 65 20 63 6c 6f 73 65 64 20 2a 2f 0a 20 20 75 6e  e closed */.  un
1c4c0 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e  ixShmNode *pShmN
1c4d0 6f 64 65 3b 20 2f 2a 20 54 68 65 20 75 6e 64 65  ode; /* The unde
1c4e0 72 6c 79 69 6e 67 20 73 68 61 72 65 64 2d 6d 65  rlying shared-me
1c4f0 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 75  mory file */.  u
1c500 6e 69 78 53 68 6d 20 2a 2a 70 70 3b 20 20 20 20  nixShm **pp;    
1c510 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f        /* For loo
1c520 70 69 6e 67 20 6f 76 65 72 20 73 69 62 6c 69 6e  ping over siblin
1c530 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f  g connections */
1c540 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 44 62  .  unixFile *pDb
1c550 46 64 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  Fd;       /* The
1c560 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61 74 61   underlying data
1c570 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20  base file */..  
1c580 70 44 62 46 64 20 3d 20 28 75 6e 69 78 46 69 6c  pDbFd = (unixFil
1c590 65 2a 29 66 64 3b 0a 20 20 70 20 3d 20 70 44 62  e*)fd;.  p = pDb
1c5a0 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 69 66 28 20  Fd->pShm;.  if( 
1c5b0 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  p==0 ) return SQ
1c5c0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 53 68 6d 4e  LITE_OK;.  pShmN
1c5d0 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64  ode = p->pShmNod
1c5e0 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 53  e;..  assert( pS
1c5f0 68 6d 4e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70  hmNode==pDbFd->p
1c600 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 20  Inode->pShmNode 
1c610 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 68  );.  assert( pSh
1c620 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64 65 3d 3d 70  mNode->pInode==p
1c630 44 62 46 64 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a  DbFd->pInode );.
1c640 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61  .  /* Verify tha
1c650 74 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  t the connection
1c660 20 62 65 69 6e 67 20 63 6c 6f 73 65 64 20 68 6f   being closed ho
1c670 6c 64 73 20 6e 6f 20 6c 6f 63 6b 73 20 2a 2f 0a  lds no locks */.
1c680 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 78 63    assert( p->exc
1c690 6c 4d 61 73 6b 3d 3d 30 20 29 3b 0a 20 20 61 73  lMask==0 );.  as
1c6a0 73 65 72 74 28 20 70 2d 3e 73 68 61 72 65 64 4d  sert( p->sharedM
1c6b0 61 73 6b 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  ask==0 );..  /* 
1c6c0 52 65 6d 6f 76 65 20 63 6f 6e 6e 65 63 74 69 6f  Remove connectio
1c6d0 6e 20 70 20 66 72 6f 6d 20 74 68 65 20 73 65 74  n p from the set
1c6e0 20 6f 66 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20   of connections 
1c6f0 61 73 73 6f 63 69 61 74 65 64 0a 20 20 2a 2a 20  associated.  ** 
1c700 77 69 74 68 20 70 53 68 6d 4e 6f 64 65 20 2a 2f  with pShmNode */
1c710 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
1c720 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d  _enter(pShmNode-
1c730 3e 6d 75 74 65 78 29 3b 0a 20 20 66 6f 72 28 70  >mutex);.  for(p
1c740 70 3d 26 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69  p=&pShmNode->pFi
1c750 72 73 74 3b 20 28 2a 70 70 29 21 3d 70 3b 20 70  rst; (*pp)!=p; p
1c760 70 20 3d 20 26 28 2a 70 70 29 2d 3e 70 4e 65 78  p = &(*pp)->pNex
1c770 74 29 7b 7d 0a 20 20 2a 70 70 20 3d 20 70 2d 3e  t){}.  *pp = p->
1c780 70 4e 65 78 74 3b 0a 0a 20 20 2f 2a 20 46 72 65  pNext;..  /* Fre
1c790 65 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  e the connection
1c7a0 20 70 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f   p */.  sqlite3_
1c7b0 66 72 65 65 28 70 29 3b 0a 20 20 70 44 62 46 64  free(p);.  pDbFd
1c7c0 2d 3e 70 53 68 6d 20 3d 20 30 3b 0a 20 20 73 71  ->pShm = 0;.  sq
1c7d0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
1c7e0 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  e(pShmNode->mute
1c7f0 78 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 53 68  x);..  /* If pSh
1c800 6d 4e 6f 64 65 2d 3e 6e 52 65 66 20 68 61 73 20  mNode->nRef has 
1c810 72 65 61 63 68 65 64 20 30 2c 20 74 68 65 6e 20  reached 0, then 
1c820 63 6c 6f 73 65 20 74 68 65 20 75 6e 64 65 72 6c  close the underl
1c830 79 69 6e 67 0a 20 20 2a 2a 20 73 68 61 72 65 64  ying.  ** shared
1c840 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2c 20 74 6f  -memory file, to
1c850 6f 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72  o */.  unixEnter
1c860 4d 75 74 65 78 28 29 3b 0a 20 20 61 73 73 65 72  Mutex();.  asser
1c870 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  t( pShmNode->nRe
1c880 66 3e 30 20 29 3b 0a 20 20 70 53 68 6d 4e 6f 64  f>0 );.  pShmNod
1c890 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28  e->nRef--;.  if(
1c8a0 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3d   pShmNode->nRef=
1c8b0 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 64 65  =0 ){.    if( de
1c8c0 6c 65 74 65 46 6c 61 67 20 29 20 75 6e 6c 69 6e  leteFlag ) unlin
1c8d0 6b 28 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c  k(pShmNode->zFil
1c8e0 65 6e 61 6d 65 29 3b 0a 20 20 20 20 75 6e 69 78  ename);.    unix
1c8f0 53 68 6d 50 75 72 67 65 28 70 44 62 46 64 29 3b  ShmPurge(pDbFd);
1c900 0a 20 20 7d 0a 20 20 75 6e 69 78 4c 65 61 76 65  .  }.  unixLeave
1c910 4d 75 74 65 78 28 29 3b 0a 0a 20 20 72 65 74 75  Mutex();..  retu
1c920 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1c930 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 73 20 74  ./*.** Changes t
1c940 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 75  he size of the u
1c950 6e 64 65 72 6c 79 69 6e 67 20 73 74 6f 72 61 67  nderlying storag
1c960 65 20 66 6f 72 20 20 61 20 73 68 61 72 65 64 2d  e for  a shared-
1c970 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74 2e 0a  memory segment..
1c980 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 71 53 69 7a  **.** The reqSiz
1c990 65 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74  e parameter is t
1c9a0 68 65 20 6e 65 77 20 72 65 71 75 65 73 74 65 64  he new requested
1c9b0 20 73 69 7a 65 20 6f 66 20 74 68 65 20 73 68 61   size of the sha
1c9c0 72 65 64 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 20 54  red memory..** T
1c9d0 68 69 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  his implementati
1c9e0 6f 6e 20 69 73 20 66 72 65 65 20 74 6f 20 69 6e  on is free to in
1c9f0 63 72 65 61 73 65 20 74 68 65 20 73 68 61 72 65  crease the share
1ca00 64 20 6d 65 6d 6f 72 79 20 73 69 7a 65 20 74 6f  d memory size to
1ca10 0a 2a 2a 20 61 6e 79 20 61 6d 6f 75 6e 74 20 67  .** any amount g
1ca20 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65  reater than or e
1ca30 71 75 61 6c 20 74 6f 20 72 65 71 53 69 7a 65 2e  qual to reqSize.
1ca40 20 20 49 66 20 74 68 65 20 73 68 61 72 65 64 20    If the shared 
1ca50 6d 65 6d 6f 72 79 20 69 73 0a 2a 2a 20 61 6c 72  memory is.** alr
1ca60 65 61 64 79 20 61 73 20 62 69 67 20 6f 72 20 62  eady as big or b
1ca70 69 67 67 65 72 20 61 73 20 72 65 71 53 69 7a 65  igger as reqSize
1ca80 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
1ca90 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a  s a no-op..**.**
1caa0 20 54 68 65 20 72 65 71 53 69 7a 65 20 70 61 72   The reqSize par
1cab0 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 6d 69  ameter is the mi
1cac0 6e 69 6d 75 6d 20 73 69 7a 65 20 72 65 71 75 65  nimum size reque
1cad0 73 74 65 64 2e 20 20 54 68 65 20 69 6d 70 6c 65  sted.  The imple
1cae0 6d 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 69 73 20  mentation.** is 
1caf0 66 72 65 65 20 74 6f 20 65 78 70 61 6e 64 20 74  free to expand t
1cb00 68 65 20 73 74 6f 72 61 67 65 20 74 6f 20 73 6f  he storage to so
1cb10 6d 65 20 6c 61 72 67 65 72 20 61 6d 6f 75 6e 74  me larger amount
1cb20 20 69 66 20 69 74 20 63 68 6f 6f 73 65 73 2e 0a   if it chooses..
1cb30 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
1cb40 69 78 53 68 6d 53 69 7a 65 28 0a 20 20 73 71 6c  ixShmSize(.  sql
1cb50 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20  ite3_file *fd,  
1cb60 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 70         /* The op
1cb70 65 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  en database file
1cb80 20 68 6f 6c 64 69 6e 67 20 53 48 4d 20 2a 2f 0a   holding SHM */.
1cb90 20 20 69 6e 74 20 72 65 71 53 69 7a 65 2c 20 20    int reqSize,  
1cba0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1cbb0 65 71 75 65 73 74 65 64 20 73 69 7a 65 2e 20 20  equested size.  
1cbc0 2d 31 20 66 6f 72 20 71 75 65 72 79 20 6f 6e 6c  -1 for query onl
1cbd0 79 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 4e 65 77  y */.  int *pNew
1cbe0 53 69 7a 65 20 20 20 20 20 20 20 20 20 20 20 20  Size            
1cbf0 20 2f 2a 20 57 72 69 74 65 20 6e 65 77 20 73 69   /* Write new si
1cc00 7a 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  ze here */.){.  
1cc10 75 6e 69 78 46 69 6c 65 20 2a 70 44 62 46 64 20  unixFile *pDbFd 
1cc20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 66 64 3b  = (unixFile*)fd;
1cc30 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 20 3d 20  .  unixShm *p = 
1cc40 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 75  pDbFd->pShm;.  u
1cc50 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d  nixShmNode *pShm
1cc60 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f  Node = p->pShmNo
1cc70 64 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  de;.  int rc = S
1cc80 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73 74 72 75  QLITE_OK;.  stru
1cc90 63 74 20 73 74 61 74 20 73 53 74 61 74 3b 0a 0a  ct stat sStat;..
1cca0 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f    assert( pShmNo
1ccb0 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64  de==pDbFd->pInod
1ccc0 65 2d 3e 70 53 68 6d 4e 6f 64 65 20 29 3b 0a 20  e->pShmNode );. 
1ccd0 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64   assert( pShmNod
1cce0 65 2d 3e 70 49 6e 6f 64 65 3d 3d 70 44 62 46 64  e->pInode==pDbFd
1ccf0 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a 0a 20 20 77  ->pInode );..  w
1cd00 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 69  hile( 1 ){.    i
1cd10 66 28 20 66 73 74 61 74 28 70 53 68 6d 4e 6f 64  f( fstat(pShmNod
1cd20 65 2d 3e 68 2c 20 26 73 53 74 61 74 29 3d 3d 30  e->h, &sStat)==0
1cd30 20 29 7b 0a 20 20 20 20 20 20 2a 70 4e 65 77 53   ){.      *pNewS
1cd40 69 7a 65 20 3d 20 28 69 6e 74 29 73 53 74 61 74  ize = (int)sStat
1cd50 2e 73 74 5f 73 69 7a 65 3b 0a 20 20 20 20 20 20  .st_size;.      
1cd60 69 66 28 20 72 65 71 53 69 7a 65 3c 3d 28 69 6e  if( reqSize<=(in
1cd70 74 29 73 53 74 61 74 2e 73 74 5f 73 69 7a 65 20  t)sStat.st_size 
1cd80 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 65 6c  ) break;.    }el
1cd90 73 65 7b 0a 20 20 20 20 20 20 2a 70 4e 65 77 53  se{.      *pNewS
1cda0 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  ize = 0;.      r
1cdb0 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
1cdc0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1cdd0 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 66 74     }.    rc = ft
1cde0 72 75 6e 63 61 74 65 28 70 53 68 6d 4e 6f 64 65  runcate(pShmNode
1cdf0 2d 3e 68 2c 20 72 65 71 53 69 7a 65 29 3b 0a 20  ->h, reqSize);. 
1ce00 20 20 20 72 65 71 53 69 7a 65 20 3d 20 2d 31 3b     reqSize = -1;
1ce10 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
1ce20 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 61 70 20  ;.}.../*.** Map 
1ce30 74 68 65 20 73 68 61 72 65 64 20 73 74 6f 72 61  the shared stora
1ce40 67 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 20  ge into memory. 
1ce50 0a 2a 2a 0a 2a 2a 20 49 66 20 72 65 71 4d 61 70  .**.** If reqMap
1ce60 53 69 7a 65 20 69 73 20 70 6f 73 69 74 69 76 65  Size is positive
1ce70 2c 20 74 68 65 6e 20 61 6e 20 61 74 74 65 6d 70  , then an attemp
1ce80 74 20 69 73 20 6d 61 64 65 20 74 6f 20 6d 61 6b  t is made to mak
1ce90 65 20 74 68 65 0a 2a 2a 20 6d 61 70 70 69 6e 67  e the.** mapping
1cea0 20 61 74 20 6c 65 61 73 74 20 72 65 71 4d 61 70   at least reqMap
1ceb0 53 69 7a 65 20 62 79 74 65 73 20 69 6e 20 73 69  Size bytes in si
1cec0 7a 65 2e 20 20 48 6f 77 65 76 65 72 2c 20 74 68  ze.  However, th
1ced0 65 20 6d 61 70 70 69 6e 67 0a 2a 2a 20 77 69 6c  e mapping.** wil
1cee0 6c 20 6e 65 76 65 72 20 62 65 20 6c 61 72 67 65  l never be large
1cef0 72 20 74 68 61 6e 20 74 68 65 20 73 69 7a 65 20  r than the size 
1cf00 6f 66 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  of the underlyin
1cf10 67 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 0a  g shared memory.
1cf20 2a 2a 20 61 73 20 73 65 74 20 62 79 20 70 72 69  ** as set by pri
1cf30 6f 72 20 63 61 6c 6c 73 20 74 6f 20 78 53 68 6d  or calls to xShm
1cf40 53 69 7a 65 28 29 2e 20 20 0a 2a 2a 0a 2a 2a 20  Size().  .**.** 
1cf50 2a 70 70 42 75 66 20 69 73 20 6d 61 64 65 20 74  *ppBuf is made t
1cf60 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6d  o point to the m
1cf70 65 6d 6f 72 79 20 77 68 69 63 68 20 69 73 20 61  emory which is a
1cf80 20 6d 61 70 70 69 6e 67 20 6f 66 20 74 68 65 0a   mapping of the.
1cf90 2a 2a 20 75 6e 64 65 72 6c 79 69 6e 67 20 73 74  ** underlying st
1cfa0 6f 72 61 67 65 2e 20 20 41 20 6d 75 74 65 78 20  orage.  A mutex 
1cfb0 69 73 20 61 63 71 75 69 72 65 64 20 74 6f 20 70  is acquired to p
1cfc0 72 65 76 65 6e 74 20 6f 74 68 65 72 20 74 68 72  revent other thr
1cfd0 65 61 64 73 0a 2a 2a 20 66 72 6f 6d 20 72 75 6e  eads.** from run
1cfe0 6e 69 6e 67 20 77 68 69 6c 65 20 2a 70 70 42 75  ning while *ppBu
1cff0 66 20 69 73 20 69 6e 20 75 73 65 20 69 6e 20 6f  f is in use in o
1d000 72 64 65 72 20 74 6f 20 70 72 65 76 65 6e 74 20  rder to prevent 
1d010 6f 74 68 65 72 20 74 68 72 65 61 64 73 0a 2a 2a  other threads.**
1d020 20 72 65 6d 61 70 70 69 6e 67 20 2a 70 70 42 75   remapping *ppBu
1d030 66 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72  f out from under
1d040 20 74 68 69 73 20 74 68 72 65 61 64 2e 20 20 54   this thread.  T
1d050 68 65 20 75 6e 69 78 53 68 6d 52 65 6c 65 61 73  he unixShmReleas
1d060 65 28 29 0a 2a 2a 20 63 61 6c 6c 20 77 69 6c 6c  e().** call will
1d070 20 72 65 6c 65 61 73 65 20 74 68 65 20 6d 75 74   release the mut
1d080 65 78 2e 20 20 48 6f 77 65 76 65 72 2c 20 69 66  ex.  However, if
1d090 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20   the lock state 
1d0a0 69 73 20 43 48 45 43 4b 50 4f 49 4e 54 2c 0a 2a  is CHECKPOINT,.*
1d0b0 2a 20 74 68 65 20 6d 75 74 65 78 20 69 73 20 6e  * the mutex is n
1d0c0 6f 74 20 61 63 71 75 69 72 65 64 20 62 65 63 61  ot acquired beca
1d0d0 75 73 65 20 43 48 45 43 4b 50 4f 49 4e 54 20 77  use CHECKPOINT w
1d0e0 69 6c 6c 20 6e 65 76 65 72 20 72 65 6d 61 70 20  ill never remap 
1d0f0 74 68 65 0a 2a 2a 20 62 75 66 66 65 72 2e 20 20  the.** buffer.  
1d100 52 45 43 4f 56 45 52 20 6d 69 67 68 74 20 72 65  RECOVER might re
1d110 6d 61 70 2c 20 74 68 6f 75 67 68 2c 20 73 6f 20  map, though, so 
1d120 43 48 45 43 4b 50 4f 49 4e 54 20 77 69 6c 6c 20  CHECKPOINT will 
1d130 61 63 71 75 69 72 65 0a 2a 2a 20 74 68 65 20 6d  acquire.** the m
1d140 75 74 65 78 20 69 66 20 61 6e 64 20 77 68 65 6e  utex if and when
1d150 20 69 74 20 70 72 6f 6d 6f 74 65 73 20 74 6f 20   it promotes to 
1d160 52 45 43 4f 56 45 52 2e 0a 2a 2a 0a 2a 2a 20 52  RECOVER..**.** R
1d170 45 43 4f 56 45 52 20 6e 65 65 64 73 20 74 6f 20  ECOVER needs to 
1d180 62 65 20 61 74 6f 6d 69 63 2e 20 20 54 68 65 20  be atomic.  The 
1d190 73 61 6d 65 20 6d 75 74 65 78 20 74 68 61 74 20  same mutex that 
1d1a0 70 72 65 76 65 6e 74 73 20 2a 70 70 42 75 66 20  prevents *ppBuf 
1d1b0 66 72 6f 6d 0a 2a 2a 20 62 65 69 6e 67 20 72 65  from.** being re
1d1c0 6d 61 70 70 65 64 20 61 6c 73 6f 20 70 72 65 76  mapped also prev
1d1d0 65 6e 74 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f  ents more than o
1d1e0 6e 65 20 74 68 72 65 61 64 20 66 72 6f 6d 20 62  ne thread from b
1d1f0 65 69 6e 67 20 69 6e 0a 2a 2a 20 52 45 43 4f 56  eing in.** RECOV
1d200 45 52 20 61 74 20 61 20 74 69 6d 65 2e 20 20 42  ER at a time.  B
1d210 75 74 2c 20 52 45 43 4f 56 45 52 20 73 6f 6d 65  ut, RECOVER some
1d220 74 69 6d 65 73 20 77 61 6e 74 73 20 74 6f 20 72  times wants to r
1d230 65 6d 61 70 20 69 74 73 65 6c 66 2e 0a 2a 2a 20  emap itself..** 
1d240 54 6f 20 70 72 65 76 65 6e 74 20 52 45 43 4f 56  To prevent RECOV
1d250 45 52 20 66 72 6f 6d 20 6c 6f 73 69 6e 67 20 69  ER from losing i
1d260 74 73 20 6c 6f 63 6b 20 77 68 69 6c 65 20 72 65  ts lock while re
1d270 6d 61 70 70 69 6e 67 2c 20 74 68 65 0a 2a 2a 20  mapping, the.** 
1d280 6d 75 74 65 78 20 69 73 20 6e 6f 74 20 72 65 6c  mutex is not rel
1d290 65 61 73 65 64 20 62 79 20 75 6e 69 78 53 68 6d  eased by unixShm
1d2a0 52 65 6c 65 61 73 65 28 29 20 77 68 65 6e 20 69  Release() when i
1d2b0 6e 20 52 45 43 4f 56 45 52 2e 0a 2a 2a 0a 2a 2a  n RECOVER..**.**
1d2c0 20 2a 70 4e 65 77 4d 61 70 53 69 7a 65 20 69 73   *pNewMapSize is
1d2d0 20 73 65 74 20 74 6f 20 74 68 65 20 73 69 7a 65   set to the size
1d2e0 20 6f 66 20 74 68 65 20 6d 61 70 70 69 6e 67 2e   of the mapping.
1d2f0 20 20 55 73 75 61 6c 6c 79 20 2a 70 4e 65 77 4d    Usually *pNewM
1d300 61 70 53 69 7a 65 0a 2a 2a 20 77 69 6c 6c 20 62  apSize.** will b
1d310 65 20 72 65 71 4d 61 70 53 69 7a 65 20 6f 72 20  e reqMapSize or 
1d320 6c 61 72 67 65 72 2c 20 74 68 6f 75 67 68 20 69  larger, though i
1d330 74 20 63 6f 75 6c 64 20 62 65 20 73 6d 61 6c 6c  t could be small
1d340 65 72 20 69 66 20 74 68 65 0a 2a 2a 20 75 6e 64  er if the.** und
1d350 65 72 6c 79 69 6e 67 20 73 68 61 72 65 64 20 6d  erlying shared m
1d360 65 6d 6f 72 79 20 68 61 73 20 6e 65 76 65 72 20  emory has never 
1d370 62 65 65 6e 20 65 6e 6c 61 72 67 65 64 20 74 6f  been enlarged to
1d380 20 72 65 71 4d 61 70 53 69 7a 65 20 62 79 74 65   reqMapSize byte
1d390 73 0a 2a 2a 20 62 79 20 70 72 69 6f 72 20 63 61  s.** by prior ca
1d3a0 6c 6c 73 20 74 6f 20 78 53 68 6d 53 69 7a 65 28  lls to xShmSize(
1d3b0 29 2e 0a 2a 2a 0a 2a 2a 20 2a 70 70 42 75 66 20  )..**.** *ppBuf 
1d3c0 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 61 6e  might be NULL an
1d3d0 64 20 7a 65 72 6f 20 69 66 20 6e 6f 20 73 70 61  d zero if no spa
1d3e0 63 65 20 68 61 73 0a 2a 2a 20 79 65 74 20 62 65  ce has.** yet be
1d3f0 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f 20  en allocated to 
1d400 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 73  the underlying s
1d410 74 6f 72 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69  torage..*/.stati
1d420 63 20 69 6e 74 20 75 6e 69 78 53 68 6d 47 65 74  c int unixShmGet
1d430 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  (.  sqlite3_file
1d440 20 2a 66 64 2c 20 20 20 20 20 20 20 20 2f 2a 20   *fd,        /* 
1d450 44 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 6f  Database file ho
1d460 6c 64 69 6e 67 20 73 68 61 72 65 64 20 6d 65 6d  lding shared mem
1d470 6f 72 79 20 2a 2f 0a 20 20 69 6e 74 20 72 65 71  ory */.  int req
1d480 4d 61 70 53 69 7a 65 2c 20 20 20 20 20 20 20 20  MapSize,        
1d490 20 20 2f 2a 20 52 65 71 75 65 73 74 65 64 20 73    /* Requested s
1d4a0 69 7a 65 20 6f 66 20 6d 61 70 70 69 6e 67 2e 20  ize of mapping. 
1d4b0 2d 31 20 6d 65 61 6e 73 20 64 6f 6e 27 74 20 63  -1 means don't c
1d4c0 61 72 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 4e  are */.  int *pN
1d4d0 65 77 4d 61 70 53 69 7a 65 2c 20 20 20 20 20 20  ewMapSize,      
1d4e0 20 20 2f 2a 20 57 72 69 74 65 20 6e 65 77 20 73    /* Write new s
1d4f0 69 7a 65 20 6f 66 20 6d 61 70 70 69 6e 67 20 68  ize of mapping h
1d500 65 72 65 20 2a 2f 0a 20 20 76 6f 69 64 20 76 6f  ere */.  void vo
1d510 6c 61 74 69 6c 65 20 2a 2a 70 70 42 75 66 20 20  latile **ppBuf  
1d520 20 20 2f 2a 20 57 72 69 74 65 20 6d 61 70 70 69    /* Write mappi
1d530 6e 67 20 62 75 66 66 65 72 20 6f 72 69 67 69 6e  ng buffer origin
1d540 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e   here */.){.  un
1d550 69 78 46 69 6c 65 20 2a 70 44 62 46 64 20 3d 20  ixFile *pDbFd = 
1d560 28 75 6e 69 78 46 69 6c 65 2a 29 66 64 3b 0a 20  (unixFile*)fd;. 
1d570 20 75 6e 69 78 53 68 6d 20 2a 70 20 3d 20 70 44   unixShm *p = pD
1d580 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 75 6e 69  bFd->pShm;.  uni
1d590 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f  xShmNode *pShmNo
1d5a0 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65  de = p->pShmNode
1d5b0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
1d5c0 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72  ITE_OK;..  asser
1d5d0 74 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 70 44 62  t( pShmNode==pDb
1d5e0 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d  Fd->pInode->pShm
1d5f0 4e 6f 64 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Node );.  assert
1d600 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f  ( pShmNode->pIno
1d610 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64  de==pDbFd->pInod
1d620 65 20 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 6c  e );..  if( p->l
1d630 6f 63 6b 53 74 61 74 65 21 3d 53 51 4c 49 54 45  ockState!=SQLITE
1d640 5f 53 48 4d 5f 43 48 45 43 4b 50 4f 49 4e 54 20  _SHM_CHECKPOINT 
1d650 26 26 20 70 2d 3e 68 61 73 4d 75 74 65 78 42 75  && p->hasMutexBu
1d660 66 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65  f==0 ){.    asse
1d670 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
1d680 78 5f 6e 6f 74 68 65 6c 64 28 70 53 68 6d 4e 6f  x_notheld(pShmNo
1d690 64 65 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  de->mutex) );.  
1d6a0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
1d6b0 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e  enter(pShmNode->
1d6c0 6d 75 74 65 78 42 75 66 29 3b 0a 20 20 20 20 70  mutexBuf);.    p
1d6d0 2d 3e 68 61 73 4d 75 74 65 78 42 75 66 20 3d 20  ->hasMutexBuf = 
1d6e0 31 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  1;.  }.  sqlite3
1d6f0 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68  _mutex_enter(pSh
1d700 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20  mNode->mutex);. 
1d710 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 73   if( pShmNode->s
1d720 7a 4d 61 70 3d 3d 30 20 7c 7c 20 72 65 71 4d 61  zMap==0 || reqMa
1d730 70 53 69 7a 65 3e 70 53 68 6d 4e 6f 64 65 2d 3e  pSize>pShmNode->
1d740 73 7a 4d 61 70 20 29 7b 0a 20 20 20 20 69 6e 74  szMap ){.    int
1d750 20 61 63 74 75 61 6c 53 69 7a 65 3b 0a 20 20 20   actualSize;.   
1d760 20 69 66 28 20 75 6e 69 78 53 68 6d 53 69 7a 65   if( unixShmSize
1d770 28 66 64 2c 20 2d 31 2c 20 26 61 63 74 75 61 6c  (fd, -1, &actual
1d780 53 69 7a 65 29 21 3d 53 51 4c 49 54 45 5f 4f 4b  Size)!=SQLITE_OK
1d790 20 29 7b 0a 20 20 20 20 20 20 61 63 74 75 61 6c   ){.      actual
1d7a0 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Size = 0;.    }.
1d7b0 20 20 20 20 72 65 71 4d 61 70 53 69 7a 65 20 3d      reqMapSize =
1d7c0 20 61 63 74 75 61 6c 53 69 7a 65 3b 0a 20 20 20   actualSize;.   
1d7d0 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 70   if( pShmNode->p
1d7e0 4d 4d 61 70 42 75 66 20 7c 7c 20 72 65 71 4d 61  MMapBuf || reqMa
1d7f0 70 53 69 7a 65 3c 3d 30 20 29 7b 0a 20 20 20 20  pSize<=0 ){.    
1d800 20 20 6d 75 6e 6d 61 70 28 70 53 68 6d 4e 6f 64    munmap(pShmNod
1d810 65 2d 3e 70 4d 4d 61 70 42 75 66 2c 20 70 53 68  e->pMMapBuf, pSh
1d820 6d 4e 6f 64 65 2d 3e 73 7a 4d 61 70 29 3b 0a 20  mNode->szMap);. 
1d830 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 65 71     }.    if( req
1d840 4d 61 70 53 69 7a 65 3e 30 20 29 7b 0a 20 20 20  MapSize>0 ){.   
1d850 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 4d 4d     pShmNode->pMM
1d860 61 70 42 75 66 20 3d 20 6d 6d 61 70 28 30 2c 20  apBuf = mmap(0, 
1d870 72 65 71 4d 61 70 53 69 7a 65 2c 20 50 52 4f 54  reqMapSize, PROT
1d880 5f 52 45 41 44 7c 50 52 4f 54 5f 57 52 49 54 45  _READ|PROT_WRITE
1d890 2c 20 4d 41 50 5f 53 48 41 52 45 44 2c 0a 20 20  , MAP_SHARED,.  
1d8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d8b0 20 20 20 20 20 20 20 20 20 20 20 70 53 68 6d 4e             pShmN
1d8c0 6f 64 65 2d 3e 68 2c 20 30 29 3b 0a 20 20 20 20  ode->h, 0);.    
1d8d0 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a 4d 61    pShmNode->szMa
1d8e0 70 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 4d  p = pShmNode->pM
1d8f0 4d 61 70 42 75 66 20 3f 20 72 65 71 4d 61 70 53  MapBuf ? reqMapS
1d900 69 7a 65 20 3a 20 30 3b 0a 20 20 20 20 7d 65 6c  ize : 0;.    }el
1d910 73 65 7b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f  se{.      pShmNo
1d920 64 65 2d 3e 70 4d 4d 61 70 42 75 66 20 3d 20 30  de->pMMapBuf = 0
1d930 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65  ;.      pShmNode
1d940 2d 3e 73 7a 4d 61 70 20 3d 20 30 3b 0a 20 20 20  ->szMap = 0;.   
1d950 20 7d 0a 20 20 7d 0a 20 20 2a 70 4e 65 77 4d 61   }.  }.  *pNewMa
1d960 70 53 69 7a 65 20 3d 20 70 53 68 6d 4e 6f 64 65  pSize = pShmNode
1d970 2d 3e 73 7a 4d 61 70 3b 0a 20 20 2a 70 70 42 75  ->szMap;.  *ppBu
1d980 66 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 4d  f = pShmNode->pM
1d990 4d 61 70 42 75 66 3b 0a 20 20 73 71 6c 69 74 65  MapBuf;.  sqlite
1d9a0 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53  3_mutex_leave(pS
1d9b0 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a  hmNode->mutex);.
1d9c0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1d9d0 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 74 68  /*.** Release th
1d9e0 65 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74  e lock held on t
1d9f0 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  he shared memory
1da00 20 73 65 67 6d 65 6e 74 20 74 6f 20 74 68 61 74   segment to that
1da10 20 6f 74 68 65 72 0a 2a 2a 20 74 68 72 65 61 64   other.** thread
1da20 73 20 61 72 65 20 66 72 65 65 20 74 6f 20 72 65  s are free to re
1da30 73 69 7a 65 20 69 74 20 69 66 20 6e 65 63 65 73  size it if neces
1da40 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  sary..**.** If t
1da50 68 65 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 63  he lock is not c
1da60 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 2c 20 74  urrently held, t
1da70 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
1da80 20 68 61 72 6d 6c 65 73 73 20 6e 6f 2d 6f 70 2e   harmless no-op.
1da90 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 68  .**.** If the sh
1daa0 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6f 62 6a 65  ared-memory obje
1dab0 63 74 20 69 73 20 69 6e 20 6c 6f 63 6b 20 73 74  ct is in lock st
1dac0 61 74 65 20 52 45 43 4f 56 45 52 2c 20 74 68 65  ate RECOVER, the
1dad0 6e 20 77 65 20 64 6f 20 6e 6f 74 0a 2a 2a 20 72  n we do not.** r
1dae0 65 61 6c 6c 79 20 77 61 6e 74 20 74 6f 20 72 65  eally want to re
1daf0 6c 65 61 73 65 20 74 68 65 20 6c 6f 63 6b 2c 20  lease the lock, 
1db00 73 6f 20 69 6e 20 74 68 61 74 20 63 61 73 65 20  so in that case 
1db10 74 6f 6f 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  too, this routin
1db20 65 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  e.** is a no-op.
1db30 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
1db40 6e 69 78 53 68 6d 52 65 6c 65 61 73 65 28 73 71  nixShmRelease(sq
1db50 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 29 7b  lite3_file *fd){
1db60 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 44 62  .  unixFile *pDb
1db70 46 64 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  Fd = (unixFile*)
1db80 66 64 3b 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70  fd;.  unixShm *p
1db90 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a   = pDbFd->pShm;.
1dba0 0a 20 20 69 66 28 20 70 2d 3e 68 61 73 4d 75 74  .  if( p->hasMut
1dbb0 65 78 42 75 66 20 26 26 20 70 2d 3e 6c 6f 63 6b  exBuf && p->lock
1dbc0 53 74 61 74 65 21 3d 53 51 4c 49 54 45 5f 53 48  State!=SQLITE_SH
1dbd0 4d 5f 52 45 43 4f 56 45 52 20 29 7b 0a 20 20 20  M_RECOVER ){.   
1dbe0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1dbf0 5f 6d 75 74 65 78 5f 6e 6f 74 68 65 6c 64 28 70  _mutex_notheld(p
1dc00 2d 3e 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  ->pShmNode->mute
1dc10 78 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  x) );.    sqlite
1dc20 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 2d  3_mutex_leave(p-
1dc30 3e 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78  >pShmNode->mutex
1dc40 42 75 66 29 3b 0a 20 20 20 20 70 2d 3e 68 61 73  Buf);.    p->has
1dc50 4d 75 74 65 78 42 75 66 20 3d 20 30 3b 0a 20 20  MutexBuf = 0;.  
1dc60 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
1dc70 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  E_OK;.}../*.** S
1dc80 79 6d 62 6f 6c 69 63 20 6e 61 6d 65 73 20 66 6f  ymbolic names fo
1dc90 72 20 4c 4f 43 4b 20 73 74 61 74 65 73 20 75 73  r LOCK states us
1dca0 65 64 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67  ed for debugging
1dcb0 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
1dcc0 54 45 5f 44 45 42 55 47 0a 73 74 61 74 69 63 20  TE_DEBUG.static 
1dcd0 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 4c 6b  const char *azLk
1dce0 4e 61 6d 65 5b 5d 20 3d 20 7b 0a 20 20 22 55 4e  Name[] = {.  "UN
1dcf0 4c 4f 43 4b 22 2c 0a 20 20 22 52 45 41 44 22 2c  LOCK",.  "READ",
1dd00 0a 20 20 22 52 45 41 44 5f 46 55 4c 4c 22 2c 0a  .  "READ_FULL",.
1dd10 20 20 22 57 52 49 54 45 22 2c 0a 20 20 22 50 45    "WRITE",.  "PE
1dd20 4e 44 49 4e 47 22 2c 0a 20 20 22 43 48 45 43 4b  NDING",.  "CHECK
1dd30 50 4f 49 4e 54 22 2c 0a 20 20 22 52 45 43 4f 56  POINT",.  "RECOV
1dd40 45 52 22 0a 7d 3b 0a 23 65 6e 64 69 66 0a 0a 0a  ER".};.#endif...
1dd50 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
1dd60 20 6c 6f 63 6b 20 73 74 61 74 65 20 66 6f 72 20   lock state for 
1dd70 61 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  a shared-memory 
1dd80 73 65 67 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  segment..*/.stat
1dd90 69 63 20 69 6e 74 20 75 6e 69 78 53 68 6d 4c 6f  ic int unixShmLo
1dda0 63 6b 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  ck(.  sqlite3_fi
1ddb0 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20  le *fd,         
1ddc0 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c   /* Database fil
1ddd0 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 68  e holding the sh
1dde0 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20  ared memory */. 
1ddf0 20 69 6e 74 20 64 65 73 69 72 65 64 4c 6f 63 6b   int desiredLock
1de00 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  ,           /* O
1de10 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 53 48 4d  ne of SQLITE_SHM
1de20 5f 78 78 78 78 78 20 6c 6f 63 6b 69 6e 67 20 73  _xxxxx locking s
1de30 74 61 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 2a  tates */.  int *
1de40 70 47 6f 74 4c 6f 63 6b 20 20 20 20 20 20 20 20  pGotLock        
1de50 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 63        /* The loc
1de60 6b 20 79 6f 75 20 61 63 74 75 61 6c 6c 79 20 67  k you actually g
1de70 6f 74 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 46  ot */.){.  unixF
1de80 69 6c 65 20 2a 70 44 62 46 64 20 3d 20 28 75 6e  ile *pDbFd = (un
1de90 69 78 46 69 6c 65 2a 29 66 64 3b 0a 20 20 75 6e  ixFile*)fd;.  un
1dea0 69 78 53 68 6d 20 2a 70 20 3d 20 70 44 62 46 64  ixShm *p = pDbFd
1deb0 2d 3e 70 53 68 6d 3b 0a 20 20 75 6e 69 78 53 68  ->pShm;.  unixSh
1dec0 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 20  mNode *pShmNode 
1ded0 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20  = p->pShmNode;. 
1dee0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1def0 5f 50 52 4f 54 4f 43 4f 4c 3b 0a 0a 20 20 61 73  _PROTOCOL;..  as
1df00 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 3d 3d  sert( pShmNode==
1df10 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70  pDbFd->pInode->p
1df20 53 68 6d 4e 6f 64 65 20 29 3b 0a 20 20 61 73 73  ShmNode );.  ass
1df30 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 70  ert( pShmNode->p
1df40 49 6e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49  Inode==pDbFd->pI
1df50 6e 6f 64 65 20 29 3b 0a 0a 20 20 2f 2a 20 4e 6f  node );..  /* No
1df60 74 65 20 74 68 61 74 20 53 51 4c 49 54 45 5f 53  te that SQLITE_S
1df70 48 4d 5f 52 45 41 44 5f 46 55 4c 4c 20 61 6e 64  HM_READ_FULL and
1df80 20 53 51 4c 49 54 45 5f 53 48 4d 5f 50 45 4e 44   SQLITE_SHM_PEND
1df90 49 4e 47 20 61 72 65 20 6e 65 76 65 72 0a 20 20  ING are never.  
1dfa0 2a 2a 20 64 69 72 65 63 74 6c 79 20 72 65 71 75  ** directly requ
1dfb0 65 73 74 65 64 3b 20 74 68 65 79 20 61 72 65 20  ested; they are 
1dfc0 73 69 64 65 20 65 66 66 65 63 74 73 20 66 72 6f  side effects fro
1dfd0 6d 20 72 65 71 75 65 73 74 69 6e 67 0a 20 20 2a  m requesting.  *
1dfe0 2a 20 53 51 4c 49 54 45 5f 53 48 4d 5f 52 45 41  * SQLITE_SHM_REA
1dff0 44 20 61 6e 64 20 53 51 4c 49 54 45 5f 53 48 4d  D and SQLITE_SHM
1e000 5f 43 48 45 43 4b 50 4f 49 4e 54 2c 20 72 65 73  _CHECKPOINT, res
1e010 70 65 63 74 69 76 65 6c 79 2e 0a 20 20 2a 2f 0a  pectively..  */.
1e020 20 20 61 73 73 65 72 74 28 20 64 65 73 69 72 65    assert( desire
1e030 64 4c 6f 63 6b 3d 3d 53 51 4c 49 54 45 5f 53 48  dLock==SQLITE_SH
1e040 4d 5f 55 4e 4c 4f 43 4b 0a 20 20 20 20 20 20 20  M_UNLOCK.       
1e050 7c 7c 20 64 65 73 69 72 65 64 4c 6f 63 6b 3d 3d  || desiredLock==
1e060 53 51 4c 49 54 45 5f 53 48 4d 5f 52 45 41 44 0a  SQLITE_SHM_READ.
1e070 20 20 20 20 20 20 20 7c 7c 20 64 65 73 69 72 65         || desire
1e080 64 4c 6f 63 6b 3d 3d 53 51 4c 49 54 45 5f 53 48  dLock==SQLITE_SH
1e090 4d 5f 57 52 49 54 45 0a 20 20 20 20 20 20 20 7c  M_WRITE.       |
1e0a0 7c 20 64 65 73 69 72 65 64 4c 6f 63 6b 3d 3d 53  | desiredLock==S
1e0b0 51 4c 49 54 45 5f 53 48 4d 5f 43 48 45 43 4b 50  QLITE_SHM_CHECKP
1e0c0 4f 49 4e 54 0a 20 20 20 20 20 20 20 7c 7c 20 64  OINT.       || d
1e0d0 65 73 69 72 65 64 4c 6f 63 6b 3d 3d 53 51 4c 49  esiredLock==SQLI
1e0e0 54 45 5f 53 48 4d 5f 52 45 43 4f 56 45 52 20 29  TE_SHM_RECOVER )
1e0f0 3b 0a 0a 20 20 2f 2a 20 52 65 74 75 72 6e 20 64  ;..  /* Return d
1e100 69 72 65 63 74 6c 79 20 69 66 20 74 68 69 73 20  irectly if this 
1e110 69 73 20 6a 75 73 74 20 61 20 6c 6f 63 6b 20 73  is just a lock s
1e120 74 61 74 65 20 71 75 65 72 79 2c 20 6f 72 20 69  tate query, or i
1e130 66 0a 20 20 2a 2a 20 74 68 65 20 63 6f 6e 6e 65  f.  ** the conne
1e140 63 74 69 6f 6e 20 69 73 20 61 6c 72 65 61 64 79  ction is already
1e150 20 69 6e 20 74 68 65 20 64 65 73 69 72 65 64 20   in the desired 
1e160 6c 6f 63 6b 69 6e 67 20 73 74 61 74 65 2e 0a 20  locking state.. 
1e170 20 2a 2f 0a 20 20 69 66 28 20 64 65 73 69 72 65   */.  if( desire
1e180 64 4c 6f 63 6b 3d 3d 70 2d 3e 6c 6f 63 6b 53 74  dLock==p->lockSt
1e190 61 74 65 0a 20 20 20 7c 7c 20 28 64 65 73 69 72  ate.   || (desir
1e1a0 65 64 4c 6f 63 6b 3d 3d 53 51 4c 49 54 45 5f 53  edLock==SQLITE_S
1e1b0 48 4d 5f 52 45 41 44 20 26 26 20 70 2d 3e 6c 6f  HM_READ && p->lo
1e1c0 63 6b 53 74 61 74 65 3d 3d 53 51 4c 49 54 45 5f  ckState==SQLITE_
1e1d0 53 48 4d 5f 52 45 41 44 5f 46 55 4c 4c 29 0a 20  SHM_READ_FULL). 
1e1e0 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28   ){.    OSTRACE(
1e1f0 28 22 53 48 4d 2d 4c 4f 43 4b 20 73 68 6d 69 64  ("SHM-LOCK shmid
1e200 2d 25 64 2c 20 70 69 64 2d 25 64 20 72 65 71 75  -%d, pid-%d requ
1e210 65 73 74 20 25 73 20 61 6e 64 20 67 6f 74 20 25  est %s and got %
1e220 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\n",.          
1e230 20 20 20 70 2d 3e 69 64 2c 20 67 65 74 70 69 64     p->id, getpid
1e240 28 29 2c 20 61 7a 4c 6b 4e 61 6d 65 5b 64 65 73  (), azLkName[des
1e250 69 72 65 64 4c 6f 63 6b 5d 2c 20 61 7a 4c 6b 4e  iredLock], azLkN
1e260 61 6d 65 5b 70 2d 3e 6c 6f 63 6b 53 74 61 74 65  ame[p->lockState
1e270 5d 29 29 3b 0a 20 20 20 20 69 66 28 20 70 47 6f  ]));.    if( pGo
1e280 74 4c 6f 63 6b 20 29 20 2a 70 47 6f 74 4c 6f 63  tLock ) *pGotLoc
1e290 6b 20 3d 20 70 2d 3e 6c 6f 63 6b 53 74 61 74 65  k = p->lockState
1e2a0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
1e2b0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 4f  ITE_OK;.  }..  O
1e2c0 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43  STRACE(("SHM-LOC
1e2d0 4b 20 73 68 6d 69 64 2d 25 64 2c 20 70 69 64 2d  K shmid-%d, pid-
1e2e0 25 64 20 72 65 71 75 65 73 74 20 25 73 2d 3e 25  %d request %s->%
1e2f0 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\n",.          
1e300 20 20 70 2d 3e 69 64 2c 20 67 65 74 70 69 64 28    p->id, getpid(
1e310 29 2c 20 61 7a 4c 6b 4e 61 6d 65 5b 70 2d 3e 6c  ), azLkName[p->l
1e320 6f 63 6b 53 74 61 74 65 5d 2c 20 61 7a 4c 6b 4e  ockState], azLkN
1e330 61 6d 65 5b 64 65 73 69 72 65 64 4c 6f 63 6b 5d  ame[desiredLock]
1e340 29 29 3b 0a 20 20 0a 20 20 69 66 28 20 64 65 73  ));.  .  if( des
1e350 69 72 65 64 4c 6f 63 6b 3d 3d 53 51 4c 49 54 45  iredLock==SQLITE
1e360 5f 53 48 4d 5f 52 45 43 4f 56 45 52 20 26 26 20  _SHM_RECOVER && 
1e370 21 70 2d 3e 68 61 73 4d 75 74 65 78 42 75 66 20  !p->hasMutexBuf 
1e380 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  ){.    assert( s
1e390 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6e 6f 74  qlite3_mutex_not
1e3a0 68 65 6c 64 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d  held(pShmNode->m
1e3b0 75 74 65 78 29 20 29 3b 0a 20 20 20 20 73 71 6c  utex) );.    sql
1e3c0 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
1e3d0 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78  (pShmNode->mutex
1e3e0 42 75 66 29 3b 0a 20 20 20 20 70 2d 3e 68 61 73  Buf);.    p->has
1e3f0 4d 75 74 65 78 42 75 66 20 3d 20 31 3b 0a 20 20  MutexBuf = 1;.  
1e400 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  }.  sqlite3_mute
1e410 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65  x_enter(pShmNode
1e420 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 73 77 69 74  ->mutex);.  swit
1e430 63 68 28 20 64 65 73 69 72 65 64 4c 6f 63 6b 20  ch( desiredLock 
1e440 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  ){.    case SQLI
1e450 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 3a 20 7b  TE_SHM_UNLOCK: {
1e460 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1e470 2d 3e 6c 6f 63 6b 53 74 61 74 65 21 3d 53 51 4c  ->lockState!=SQL
1e480 49 54 45 5f 53 48 4d 5f 52 45 43 4f 56 45 52 20  ITE_SHM_RECOVER 
1e490 29 3b 0a 20 20 20 20 20 20 75 6e 69 78 53 68 6d  );.      unixShm
1e4a0 55 6e 6c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c  Unlock(pShmNode,
1e4b0 20 70 2c 20 55 4e 49 58 5f 53 48 4d 5f 41 7c 55   p, UNIX_SHM_A|U
1e4c0 4e 49 58 5f 53 48 4d 5f 42 7c 55 4e 49 58 5f 53  NIX_SHM_B|UNIX_S
1e4d0 48 4d 5f 43 7c 55 4e 49 58 5f 53 48 4d 5f 44 29  HM_C|UNIX_SHM_D)
1e4e0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  ;.      rc = SQL
1e4f0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 70 2d  ITE_OK;.      p-
1e500 3e 6c 6f 63 6b 53 74 61 74 65 20 3d 20 53 51 4c  >lockState = SQL
1e510 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 3b 0a  ITE_SHM_UNLOCK;.
1e520 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1e530 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
1e540 54 45 5f 53 48 4d 5f 52 45 41 44 3a 20 7b 0a 20  TE_SHM_READ: {. 
1e550 20 20 20 20 20 69 66 28 20 70 2d 3e 6c 6f 63 6b       if( p->lock
1e560 53 74 61 74 65 3d 3d 53 51 4c 49 54 45 5f 53 48  State==SQLITE_SH
1e570 4d 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  M_UNLOCK ){.    
1e580 20 20 20 20 69 6e 74 20 6e 41 74 74 65 6d 70 74      int nAttempt
1e590 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  ;.        rc = S
1e5a0 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
1e5b0 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6c      assert( p->l
1e5c0 6f 63 6b 53 74 61 74 65 3d 3d 53 51 4c 49 54 45  ockState==SQLITE
1e5d0 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20  _SHM_UNLOCK );. 
1e5e0 20 20 20 20 20 20 20 66 6f 72 28 6e 41 74 74 65         for(nAtte
1e5f0 6d 70 74 3d 30 3b 20 6e 41 74 74 65 6d 70 74 3c  mpt=0; nAttempt<
1e600 35 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  5 && rc==SQLITE_
1e610 42 55 53 59 3b 20 6e 41 74 74 65 6d 70 74 2b 2b  BUSY; nAttempt++
1e620 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
1e630 3d 20 75 6e 69 78 53 68 6d 53 68 61 72 65 64 4c  = unixShmSharedL
1e640 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 70 2c  ock(pShmNode, p,
1e650 20 55 4e 49 58 5f 53 48 4d 5f 41 7c 55 4e 49 58   UNIX_SHM_A|UNIX
1e660 5f 53 48 4d 5f 42 29 3b 0a 20 20 20 20 20 20 20  _SHM_B);.       
1e670 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1e680 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20  E_BUSY ){.      
1e690 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 53        rc = unixS
1e6a0 68 6d 53 68 61 72 65 64 4c 6f 63 6b 28 70 53 68  hmSharedLock(pSh
1e6b0 6d 4e 6f 64 65 2c 20 70 2c 20 55 4e 49 58 5f 53  mNode, p, UNIX_S
1e6c0 48 4d 5f 44 29 3b 0a 20 20 20 20 20 20 20 20 20  HM_D);.         
1e6d0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1e6e0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1e6f0 20 20 20 20 20 20 70 2d 3e 6c 6f 63 6b 53 74 61        p->lockSta
1e700 74 65 20 3d 20 53 51 4c 49 54 45 5f 53 48 4d 5f  te = SQLITE_SHM_
1e710 52 45 41 44 5f 46 55 4c 4c 3b 0a 20 20 20 20 20  READ_FULL;.     
1e720 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1e730 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1e740 20 20 20 20 20 20 75 6e 69 78 53 68 6d 55 6e 6c        unixShmUnl
1e750 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 70 2c  ock(pShmNode, p,
1e760 20 55 4e 49 58 5f 53 48 4d 5f 42 29 3b 0a 20 20   UNIX_SHM_B);.  
1e770 20 20 20 20 20 20 20 20 20 20 70 2d 3e 6c 6f 63            p->loc
1e780 6b 53 74 61 74 65 20 3d 20 53 51 4c 49 54 45 5f  kState = SQLITE_
1e790 53 48 4d 5f 52 45 41 44 3b 0a 20 20 20 20 20 20  SHM_READ;.      
1e7a0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
1e7b0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1e7c0 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6c      assert( p->l
1e7d0 6f 63 6b 53 74 61 74 65 3d 3d 53 51 4c 49 54 45  ockState==SQLITE
1e7e0 5f 53 48 4d 5f 57 52 49 54 45 0a 20 20 20 20 20  _SHM_WRITE.     
1e7f0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e            || p->
1e800 6c 6f 63 6b 53 74 61 74 65 3d 3d 53 51 4c 49 54  lockState==SQLIT
1e810 45 5f 53 48 4d 5f 52 45 43 4f 56 45 52 20 29 3b  E_SHM_RECOVER );
1e820 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e  .        rc = un
1e830 69 78 53 68 6d 53 68 61 72 65 64 4c 6f 63 6b 28  ixShmSharedLock(
1e840 70 53 68 6d 4e 6f 64 65 2c 20 70 2c 20 55 4e 49  pShmNode, p, UNI
1e850 58 5f 53 48 4d 5f 41 29 3b 0a 20 20 20 20 20 20  X_SHM_A);.      
1e860 20 20 75 6e 69 78 53 68 6d 55 6e 6c 6f 63 6b 28    unixShmUnlock(
1e870 70 53 68 6d 4e 6f 64 65 2c 20 70 2c 20 55 4e 49  pShmNode, p, UNI
1e880 58 5f 53 48 4d 5f 43 7c 55 4e 49 58 5f 53 48 4d  X_SHM_C|UNIX_SHM
1e890 5f 44 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  _D);.        p->
1e8a0 6c 6f 63 6b 53 74 61 74 65 20 3d 20 53 51 4c 49  lockState = SQLI
1e8b0 54 45 5f 53 48 4d 5f 52 45 41 44 3b 0a 20 20 20  TE_SHM_READ;.   
1e8c0 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
1e8d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1e8e0 20 53 51 4c 49 54 45 5f 53 48 4d 5f 57 52 49 54   SQLITE_SHM_WRIT
1e8f0 45 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  E: {.      asser
1e900 74 28 20 70 2d 3e 6c 6f 63 6b 53 74 61 74 65 3d  t( p->lockState=
1e910 3d 53 51 4c 49 54 45 5f 53 48 4d 5f 52 45 41 44  =SQLITE_SHM_READ
1e920 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
1e930 7c 7c 20 70 2d 3e 6c 6f 63 6b 53 74 61 74 65 3d  || p->lockState=
1e940 3d 53 51 4c 49 54 45 5f 53 48 4d 5f 52 45 41 44  =SQLITE_SHM_READ
1e950 5f 46 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 72  _FULL );.      r
1e960 63 20 3d 20 75 6e 69 78 53 68 6d 45 78 63 6c 75  c = unixShmExclu
1e970 73 69 76 65 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64  siveLock(pShmNod
1e980 65 2c 20 70 2c 20 55 4e 49 58 5f 53 48 4d 5f 43  e, p, UNIX_SHM_C
1e990 7c 55 4e 49 58 5f 53 48 4d 5f 44 29 3b 0a 20 20  |UNIX_SHM_D);.  
1e9a0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1e9b0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1e9c0 20 70 2d 3e 6c 6f 63 6b 53 74 61 74 65 20 3d 20   p->lockState = 
1e9d0 53 51 4c 49 54 45 5f 53 48 4d 5f 57 52 49 54 45  SQLITE_SHM_WRITE
1e9e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1e9f0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1ea00 20 63 61 73 65 20 53 51 4c 49 54 45 5f 53 48 4d   case SQLITE_SHM
1ea10 5f 43 48 45 43 4b 50 4f 49 4e 54 3a 20 7b 0a 20  _CHECKPOINT: {. 
1ea20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
1ea30 6c 6f 63 6b 53 74 61 74 65 3d 3d 53 51 4c 49 54  lockState==SQLIT
1ea40 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 0a 20 20 20  E_SHM_UNLOCK.   
1ea50 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6c 6f          || p->lo
1ea60 63 6b 53 74 61 74 65 3d 3d 53 51 4c 49 54 45 5f  ckState==SQLITE_
1ea70 53 48 4d 5f 50 45 4e 44 49 4e 47 0a 20 20 20 20  SHM_PENDING.    
1ea80 20 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70    );.      if( p
1ea90 2d 3e 6c 6f 63 6b 53 74 61 74 65 3d 3d 53 51 4c  ->lockState==SQL
1eaa0 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 29  ITE_SHM_UNLOCK )
1eab0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 75  {.        rc = u
1eac0 6e 69 78 53 68 6d 45 78 63 6c 75 73 69 76 65 4c  nixShmExclusiveL
1ead0 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 70 2c  ock(pShmNode, p,
1eae0 20 55 4e 49 58 5f 53 48 4d 5f 42 7c 55 4e 49 58   UNIX_SHM_B|UNIX
1eaf0 5f 53 48 4d 5f 43 29 3b 0a 20 20 20 20 20 20 20  _SHM_C);.       
1eb00 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1eb10 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
1eb20 70 2d 3e 6c 6f 63 6b 53 74 61 74 65 20 3d 20 53  p->lockState = S
1eb30 51 4c 49 54 45 5f 53 48 4d 5f 50 45 4e 44 49 4e  QLITE_SHM_PENDIN
1eb40 47 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  G;.        }.   
1eb50 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
1eb60 2d 3e 6c 6f 63 6b 53 74 61 74 65 3d 3d 53 51 4c  ->lockState==SQL
1eb70 49 54 45 5f 53 48 4d 5f 50 45 4e 44 49 4e 47 20  ITE_SHM_PENDING 
1eb80 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1eb90 75 6e 69 78 53 68 6d 45 78 63 6c 75 73 69 76 65  unixShmExclusive
1eba0 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 70  Lock(pShmNode, p
1ebb0 2c 20 55 4e 49 58 5f 53 48 4d 5f 41 29 3b 0a 20  , UNIX_SHM_A);. 
1ebc0 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
1ebd0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1ebe0 20 20 20 20 20 20 70 2d 3e 6c 6f 63 6b 53 74 61        p->lockSta
1ebf0 74 65 20 3d 20 53 51 4c 49 54 45 5f 53 48 4d 5f  te = SQLITE_SHM_
1ec00 43 48 45 43 4b 50 4f 49 4e 54 3b 0a 20 20 20 20  CHECKPOINT;.    
1ec10 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1ec20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1ec30 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
1ec40 20 20 20 20 20 20 61 73 73 65 72 74 28 20 64 65        assert( de
1ec50 73 69 72 65 64 4c 6f 63 6b 3d 3d 53 51 4c 49 54  siredLock==SQLIT
1ec60 45 5f 53 48 4d 5f 52 45 43 4f 56 45 52 20 29 3b  E_SHM_RECOVER );
1ec70 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1ec80 2d 3e 6c 6f 63 6b 53 74 61 74 65 3d 3d 53 51 4c  ->lockState==SQL
1ec90 49 54 45 5f 53 48 4d 5f 52 45 41 44 0a 20 20 20  ITE_SHM_READ.   
1eca0 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6c 6f          || p->lo
1ecb0 63 6b 53 74 61 74 65 3d 3d 53 51 4c 49 54 45 5f  ckState==SQLITE_
1ecc0 53 48 4d 5f 52 45 41 44 5f 46 55 4c 4c 0a 20 20  SHM_READ_FULL.  
1ecd0 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61 73 73      );.      ass
1ece0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
1ecf0 65 78 5f 68 65 6c 64 28 70 53 68 6d 4e 6f 64 65  ex_held(pShmNode
1ed00 2d 3e 6d 75 74 65 78 42 75 66 29 20 29 3b 0a 20  ->mutexBuf) );. 
1ed10 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 53 68       rc = unixSh
1ed20 6d 45 78 63 6c 75 73 69 76 65 4c 6f 63 6b 28 70  mExclusiveLock(p
1ed30 53 68 6d 4e 6f 64 65 2c 20 70 2c 20 55 4e 49 58  ShmNode, p, UNIX
1ed40 5f 53 48 4d 5f 43 29 3b 0a 20 20 20 20 20 20 69  _SHM_C);.      i
1ed50 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1ed60 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c   ){.        p->l
1ed70 6f 63 6b 53 74 61 74 65 20 3d 20 53 51 4c 49 54  ockState = SQLIT
1ed80 45 5f 53 48 4d 5f 52 45 43 4f 56 45 52 3b 0a 20  E_SHM_RECOVER;. 
1ed90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
1eda0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
1edb0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
1edc0 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  ave(pShmNode->mu
1edd0 74 65 78 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  tex);.  OSTRACE(
1ede0 28 22 53 48 4d 2d 4c 4f 43 4b 20 73 68 6d 69 64  ("SHM-LOCK shmid
1edf0 2d 25 64 2c 20 70 69 64 2d 25 64 20 67 6f 74 20  -%d, pid-%d got 
1ee00 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %s\n",.         
1ee10 20 20 70 2d 3e 69 64 2c 20 67 65 74 70 69 64 28    p->id, getpid(
1ee20 29 2c 20 61 7a 4c 6b 4e 61 6d 65 5b 70 2d 3e 6c  ), azLkName[p->l
1ee30 6f 63 6b 53 74 61 74 65 5d 29 29 3b 0a 20 20 69  ockState]));.  i
1ee40 66 28 20 70 47 6f 74 4c 6f 63 6b 20 29 20 2a 70  f( pGotLock ) *p
1ee50 47 6f 74 4c 6f 63 6b 20 3d 20 70 2d 3e 6c 6f 63  GotLock = p->loc
1ee60 6b 53 74 61 74 65 3b 0a 20 20 72 65 74 75 72 6e  kState;.  return
1ee70 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d   rc;.}../*.** Im
1ee80 70 6c 65 6d 65 6e 74 20 61 20 6d 65 6d 6f 72 79  plement a memory
1ee90 20 62 61 72 72 69 65 72 20 6f 72 20 6d 65 6d 6f   barrier or memo
1eea0 72 79 20 66 65 6e 63 65 20 6f 6e 20 73 68 61 72  ry fence on shar
1eeb0 65 64 20 6d 65 6d 6f 72 79 2e 20 20 0a 2a 2a 0a  ed memory.  .**.
1eec0 2a 2a 20 41 6c 6c 20 6c 6f 61 64 73 20 61 6e 64  ** All loads and
1eed0 20 73 74 6f 72 65 73 20 62 65 67 75 6e 20 62 65   stores begun be
1eee0 66 6f 72 65 20 74 68 65 20 62 61 72 72 69 65 72  fore the barrier
1eef0 20 6d 75 73 74 20 63 6f 6d 70 6c 65 74 65 20 62   must complete b
1ef00 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 20 6c 6f 61  efore.** any loa
1ef10 64 20 6f 72 20 73 74 6f 72 65 20 62 65 67 75 6e  d or store begun
1ef20 20 61 66 74 65 72 20 74 68 65 20 62 61 72 72 69   after the barri
1ef30 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  er..*/.static vo
1ef40 69 64 20 75 6e 69 78 53 68 6d 42 61 72 72 69 65  id unixShmBarrie
1ef50 72 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  r(.  sqlite3_fil
1ef60 65 20 2a 66 64 20 20 20 20 20 20 20 20 20 20 20  e *fd           
1ef70 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c 65  /* Database file
1ef80 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 68 61   holding the sha
1ef90 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 29 7b  red memory */.){
1efa0 0a 23 69 66 64 65 66 20 5f 5f 47 4e 55 43 5f 5f  .#ifdef __GNUC__
1efb0 0a 20 20 5f 5f 73 79 6e 63 5f 73 79 6e 63 68 72  .  __sync_synchr
1efc0 6f 6e 69 7a 65 28 29 3b 0a 23 65 6c 73 65 0a 20  onize();.#else. 
1efd0 20 75 6e 69 78 4d 75 74 65 78 45 6e 74 65 72 28   unixMutexEnter(
1efe0 29 3b 0a 20 20 75 6e 69 78 4d 75 74 65 78 4c 65  );.  unixMutexLe
1eff0 61 76 65 28 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a  ave();.#endif.}.
1f000 0a 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  ..#else.# define
1f010 20 75 6e 69 78 53 68 6d 4f 70 65 6e 20 20 20 20   unixShmOpen    
1f020 30 0a 23 20 64 65 66 69 6e 65 20 75 6e 69 78 53  0.# define unixS
1f030 68 6d 53 69 7a 65 20 20 20 20 30 0a 23 20 64 65  hmSize    0.# de
1f040 66 69 6e 65 20 75 6e 69 78 53 68 6d 47 65 74 20  fine unixShmGet 
1f050 20 20 20 20 30 0a 23 20 64 65 66 69 6e 65 20 75      0.# define u
1f060 6e 69 78 53 68 6d 52 65 6c 65 61 73 65 20 30 0a  nixShmRelease 0.
1f070 23 20 64 65 66 69 6e 65 20 75 6e 69 78 53 68 6d  # define unixShm
1f080 4c 6f 63 6b 20 20 20 20 30 0a 23 20 64 65 66 69  Lock    0.# defi
1f090 6e 65 20 75 6e 69 78 53 68 6d 42 61 72 72 69 65  ne unixShmBarrie
1f0a0 72 20 30 0a 23 20 64 65 66 69 6e 65 20 75 6e 69  r 0.# define uni
1f0b0 78 53 68 6d 43 6c 6f 73 65 20 20 20 30 0a 23 65  xShmClose   0.#e
1f0c0 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20  ndif /* #ifndef 
1f0d0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20  SQLITE_OMIT_WAL 
1f0e0 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65 20 65  */../*.** Here e
1f0f0 6e 64 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e  nds the implemen
1f100 74 61 74 69 6f 6e 20 6f 66 20 61 6c 6c 20 73 71  tation of all sq
1f110 6c 69 74 65 33 5f 66 69 6c 65 20 6d 65 74 68 6f  lite3_file metho
1f120 64 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ds..**.*********
1f130 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e  ************* En
1f140 64 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 4d  d sqlite3_file M
1f150 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ethods *********
1f160 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f170 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
1f180 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f190 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f1a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f1b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f1c0 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68  *****/../*.** Th
1f1d0 69 73 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74  is division cont
1f1e0 61 69 6e 73 20 64 65 66 69 6e 69 74 69 6f 6e 73  ains definitions
1f1f0 20 6f 66 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d   of sqlite3_io_m
1f200 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 73 20 74  ethods objects t
1f210 68 61 74 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74  hat.** implement
1f220 20 76 61 72 69 6f 75 73 20 66 69 6c 65 20 6c 6f   various file lo
1f230 63 6b 69 6e 67 20 73 74 72 61 74 65 67 69 65 73  cking strategies
1f240 2e 20 20 49 74 20 61 6c 73 6f 20 63 6f 6e 74 61  .  It also conta
1f250 69 6e 73 20 64 65 66 69 6e 69 74 69 6f 6e 73 0a  ins definitions.
1f260 2a 2a 20 6f 66 20 22 66 69 6e 64 65 72 22 20 66  ** of "finder" f
1f270 75 6e 63 74 69 6f 6e 73 2e 20 20 41 20 66 69 6e  unctions.  A fin
1f280 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 69 73 20  der-function is 
1f290 75 73 65 64 20 74 6f 20 6c 6f 63 61 74 65 20 74  used to locate t
1f2a0 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 0a 2a  he appropriate.*
1f2b0 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  * sqlite3_io_met
1f2c0 68 6f 64 73 20 6f 62 6a 65 63 74 20 66 6f 72 20  hods object for 
1f2d0 61 20 70 61 72 74 69 63 75 6c 61 72 20 64 61 74  a particular dat
1f2e0 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68 65  abase file.  The
1f2f0 20 70 41 70 70 44 61 74 61 0a 2a 2a 20 66 69 65   pAppData.** fie
1f300 6c 64 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65  ld of the sqlite
1f310 33 5f 76 66 73 20 56 46 53 20 6f 62 6a 65 63 74  3_vfs VFS object
1f320 73 20 61 72 65 20 69 6e 69 74 69 61 6c 69 7a 65  s are initialize
1f330 64 20 74 6f 20 62 65 20 70 6f 69 6e 74 65 72 73  d to be pointers
1f340 20 74 6f 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65   to.** the corre
1f350 63 74 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69  ct finder-functi
1f360 6f 6e 20 66 6f 72 20 74 68 61 74 20 56 46 53 2e  on for that VFS.
1f370 0a 2a 2a 0a 2a 2a 20 4d 6f 73 74 20 66 69 6e 64  .**.** Most find
1f380 65 72 20 66 75 6e 63 74 69 6f 6e 73 20 72 65 74  er functions ret
1f390 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
1f3a0 20 61 20 66 69 78 65 64 20 73 71 6c 69 74 65 33   a fixed sqlite3
1f3b0 5f 69 6f 5f 6d 65 74 68 6f 64 73 0a 2a 2a 20 6f  _io_methods.** o
1f3c0 62 6a 65 63 74 2e 20 20 54 68 65 20 6f 6e 6c 79  bject.  The only
1f3d0 20 69 6e 74 65 72 65 73 74 69 6e 67 20 66 69 6e   interesting fin
1f3e0 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 69 73 20  der-function is 
1f3f0 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72  autolockIoFinder
1f400 2c 20 77 68 69 63 68 0a 2a 2a 20 6c 6f 6f 6b 73  , which.** looks
1f410 20 61 74 20 74 68 65 20 66 69 6c 65 73 79 73 74   at the filesyst
1f420 65 6d 20 74 79 70 65 20 61 6e 64 20 74 72 69 65  em type and trie
1f430 73 20 74 6f 20 67 75 65 73 73 20 74 68 65 20 62  s to guess the b
1f440 65 73 74 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73  est locking.** s
1f450 74 72 61 74 65 67 79 20 66 72 6f 6d 20 74 68 61  trategy from tha
1f460 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 66 69 6e  t..**.** For fin
1f470 64 65 72 2d 66 75 6e 74 69 6f 6e 20 46 2c 20 74  der-funtion F, t
1f480 77 6f 20 6f 62 6a 65 63 74 73 20 61 72 65 20 63  wo objects are c
1f490 72 65 61 74 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20  reated:.**.**   
1f4a0 20 28 31 29 20 54 68 65 20 72 65 61 6c 20 66 69   (1) The real fi
1f4b0 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 6e 61  nder-function na
1f4c0 6d 65 64 20 22 46 49 6d 70 74 28 29 22 2e 0a 2a  med "FImpt()"..*
1f4d0 2a 0a 2a 2a 20 20 20 20 28 32 29 20 41 20 63 6f  *.**    (2) A co
1f4e0 6e 73 74 61 6e 74 20 70 6f 69 6e 74 65 72 20 74  nstant pointer t
1f4f0 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  o this function 
1f500 6e 61 6d 65 64 20 6a 75 73 74 20 22 46 22 2e 0a  named just "F"..
1f510 2a 2a 0a 2a 2a 0a 2a 2a 20 41 20 70 6f 69 6e 74  **.**.** A point
1f520 65 72 20 74 6f 20 74 68 65 20 46 20 70 6f 69 6e  er to the F poin
1f530 74 65 72 20 69 73 20 75 73 65 64 20 61 73 20 74  ter is used as t
1f540 68 65 20 70 41 70 70 44 61 74 61 20 76 61 6c 75  he pAppData valu
1f550 65 20 66 6f 72 20 56 46 53 0a 2a 2a 20 6f 62 6a  e for VFS.** obj
1f560 65 63 74 73 2e 20 20 57 65 20 68 61 76 65 20 74  ects.  We have t
1f570 6f 20 64 6f 20 74 68 69 73 20 69 6e 73 74 65 61  o do this instea
1f580 64 20 6f 66 20 6c 65 74 74 69 6e 67 20 70 41 70  d of letting pAp
1f590 70 44 61 74 61 20 70 6f 69 6e 74 0a 2a 2a 20 64  pData point.** d
1f5a0 69 72 65 63 74 6c 79 20 61 74 20 74 68 65 20 66  irectly at the f
1f5b0 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 73  inder-function s
1f5c0 69 6e 63 65 20 43 39 30 20 72 75 6c 65 73 20 70  ince C90 rules p
1f5d0 72 65 76 65 6e 74 20 61 20 76 6f 69 64 2a 0a 2a  revent a void*.*
1f5e0 2a 20 66 72 6f 6d 20 62 65 20 63 61 73 74 20 69  * from be cast i
1f5f0 6e 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 70  nto a function p
1f600 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a  ointer..**.**.**
1f610 20 45 61 63 68 20 69 6e 73 74 61 6e 63 65 20 6f   Each instance o
1f620 66 20 74 68 69 73 20 6d 61 63 72 6f 20 67 65 6e  f this macro gen
1f630 65 72 61 74 65 73 20 74 77 6f 20 6f 62 6a 65 63  erates two objec
1f640 74 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 41  ts:.**.**   *  A
1f650 20 63 6f 6e 73 74 61 6e 74 20 73 71 6c 69 74 65   constant sqlite
1f660 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a  3_io_methods obj
1f670 65 63 74 20 63 61 6c 6c 20 4d 45 54 48 4f 44 20  ect call METHOD 
1f680 74 68 61 74 20 68 61 73 20 6c 6f 63 6b 69 6e 67  that has locking
1f690 0a 2a 2a 20 20 20 20 20 20 6d 65 74 68 6f 64 73  .**      methods
1f6a0 20 43 4c 4f 53 45 2c 20 4c 4f 43 4b 2c 20 55 4e   CLOSE, LOCK, UN
1f6b0 4c 4f 43 4b 2c 20 43 4b 52 45 53 4c 4f 43 4b 2e  LOCK, CKRESLOCK.
1f6c0 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 41 6e 20 49  .**.**   *  An I
1f6d0 2f 4f 20 6d 65 74 68 6f 64 20 66 69 6e 64 65 72  /O method finder
1f6e0 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64   function called
1f6f0 20 46 49 4e 44 45 52 20 74 68 61 74 20 72 65 74   FINDER that ret
1f700 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 0a 2a  urns a pointer.*
1f710 2a 20 20 20 20 20 20 74 6f 20 74 68 65 20 4d 45  *      to the ME
1f720 54 48 4f 44 20 6f 62 6a 65 63 74 20 69 6e 20 74  THOD object in t
1f730 68 65 20 70 72 65 76 69 6f 75 73 20 62 75 6c 6c  he previous bull
1f740 65 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 49  et..*/.#define I
1f750 4f 4d 45 54 48 4f 44 53 28 46 49 4e 44 45 52 2c  OMETHODS(FINDER,
1f760 20 4d 45 54 48 4f 44 2c 20 56 45 52 53 49 4f 4e   METHOD, VERSION
1f770 2c 20 43 4c 4f 53 45 2c 20 4c 4f 43 4b 2c 20 55  , CLOSE, LOCK, U
1f780 4e 4c 4f 43 4b 2c 20 43 4b 4c 4f 43 4b 29 20 20  NLOCK, CKLOCK)  
1f790 20 20 20 20 5c 0a 73 74 61 74 69 63 20 63 6f 6e      \.static con
1f7a0 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  st sqlite3_io_me
1f7b0 74 68 6f 64 73 20 4d 45 54 48 4f 44 20 3d 20 7b  thods METHOD = {
1f7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f7e0 20 20 20 5c 0a 20 20 20 56 45 52 53 49 4f 4e 2c     \.   VERSION,
1f7f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f800 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20      /* iVersion 
1f810 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
1f820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f830 20 20 5c 0a 20 20 20 43 4c 4f 53 45 2c 20 20 20    \.   CLOSE,   
1f840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f850 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 2a 2f 20     /* xClose */ 
1f860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f880 20 5c 0a 20 20 20 75 6e 69 78 52 65 61 64 2c 20   \.   unixRead, 
1f890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f8a0 20 20 2f 2a 20 78 52 65 61 64 20 2a 2f 20 20 20    /* xRead */   
1f8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f8d0 5c 0a 20 20 20 75 6e 69 78 57 72 69 74 65 2c 20  \.   unixWrite, 
1f8e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f8f0 20 2f 2a 20 78 57 72 69 74 65 20 2a 2f 20 20 20   /* xWrite */   
1f900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
1f920 0a 20 20 20 75 6e 69 78 54 72 75 6e 63 61 74 65  .   unixTruncate
1f930 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1f940 2f 2a 20 78 54 72 75 6e 63 61 74 65 20 2a 2f 20  /* xTruncate */ 
1f950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
1f970 20 20 20 75 6e 69 78 53 79 6e 63 2c 20 20 20 20     unixSync,    
1f980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f990 2a 20 78 53 79 6e 63 20 2a 2f 20 20 20 20 20 20  * xSync */      
1f9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
1f9c0 20 20 75 6e 69 78 46 69 6c 65 53 69 7a 65 2c 20    unixFileSize, 
1f9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f9e0 20 78 46 69 6c 65 53 69 7a 65 20 2a 2f 20 20 20   xFileSize */   
1f9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa00 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
1fa10 20 4c 4f 43 4b 2c 20 20 20 20 20 20 20 20 20 20   LOCK,          
1fa20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1fa30 78 4c 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20 20  xLock */        
1fa40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa50 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
1fa60 55 4e 4c 4f 43 4b 2c 20 20 20 20 20 20 20 20 20  UNLOCK,         
1fa70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
1fa80 55 6e 6c 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20  Unlock */       
1fa90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1faa0 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 43            \.   C
1fab0 4b 4c 4f 43 4b 2c 20 20 20 20 20 20 20 20 20 20  KLOCK,          
1fac0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
1fad0 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
1fae0 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
1faf0 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e           \.   un
1fb00 69 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 2c 20 20  ixFileControl,  
1fb10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69            /* xFi
1fb20 6c 65 43 6f 6e 74 72 6f 6c 20 2a 2f 20 20 20 20  leControl */    
1fb30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb40 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69          \.   uni
1fb50 78 53 65 63 74 6f 72 53 69 7a 65 2c 20 20 20 20  xSectorSize,    
1fb60 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 65 63           /* xSec
1fb70 74 6f 72 53 69 7a 65 20 2a 2f 20 20 20 20 20 20  torSize */      
1fb80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb90 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78         \.   unix
1fba0 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
1fbb0 73 74 69 63 73 2c 20 20 2f 2a 20 78 44 65 76 69  stics,  /* xDevi
1fbc0 63 65 43 61 70 61 62 69 6c 69 74 69 65 73 20 2a  ceCapabilities *
1fbd0 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
1fbe0 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53        \.   unixS
1fbf0 68 6d 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20  hmOpen,         
1fc00 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4f 70         /* xShmOp
1fc10 65 6e 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  en */           
1fc20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fc30 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 68       \.   unixSh
1fc40 6d 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20  mSize,          
1fc50 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 53 69 7a        /* xShmSiz
1fc60 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  e */            
1fc70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fc80 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 68 6d      \.   unixShm
1fc90 47 65 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  Get,            
1fca0 20 20 20 20 20 2f 2a 20 78 53 68 6d 47 65 74 20       /* xShmGet 
1fcb0 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
1fcc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fcd0 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 68 6d 52     \.   unixShmR
1fce0 65 6c 65 61 73 65 2c 20 20 20 20 20 20 20 20 20  elease,         
1fcf0 20 20 20 20 2f 2a 20 78 53 68 6d 52 65 6c 65 61      /* xShmRelea
1fd00 73 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  se */           
1fd10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fd20 20 20 5c 0a 20 20 20 75 6e 69 78 53 68 6d 4c 6f    \.   unixShmLo
1fd30 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
1fd40 20 20 20 2f 2a 20 78 53 68 6d 4c 6f 63 6b 20 2a     /* xShmLock *
1fd50 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
1fd60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fd70 20 5c 0a 20 20 20 75 6e 69 78 53 68 6d 42 61 72   \.   unixShmBar
1fd80 72 69 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  rier,           
1fd90 20 20 2f 2a 20 78 53 68 6d 42 61 72 72 69 65 72    /* xShmBarrier
1fda0 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
1fdb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fdc0 5c 0a 20 20 20 75 6e 69 78 53 68 6d 43 6c 6f 73  \.   unixShmClos
1fdd0 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
1fde0 20 2f 2a 20 78 53 68 6d 43 6c 6f 73 65 20 2a 2f   /* xShmClose */
1fdf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
1fe10 0a 7d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  .};             
1fe20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
1fe60 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c  static const sql
1fe70 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
1fe80 2a 46 49 4e 44 45 52 23 23 49 6d 70 6c 28 63 6f  *FINDER##Impl(co
1fe90 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 75 6e 69  nst char *z, uni
1fea0 78 46 69 6c 65 20 2a 70 29 7b 20 20 20 5c 0a 20  xFile *p){   \. 
1feb0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
1fec0 52 28 7a 29 3b 20 55 4e 55 53 45 44 5f 50 41 52  R(z); UNUSED_PAR
1fed0 41 4d 45 54 45 52 28 70 29 3b 20 20 20 20 20 20  AMETER(p);      
1fee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fef0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
1ff00 72 65 74 75 72 6e 20 26 4d 45 54 48 4f 44 3b 20  return &METHOD; 
1ff10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ff20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ff30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ff40 20 20 20 20 20 20 20 20 20 20 20 5c 0a 7d 20 20             \.}  
1ff50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ff60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ff70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ff80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ff90 20 20 20 20 20 20 20 20 20 20 5c 0a 73 74 61 74            \.stat
1ffa0 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ic const sqlite3
1ffb0 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 28 2a 63  _io_methods *(*c
1ffc0 6f 6e 73 74 20 46 49 4e 44 45 52 29 28 63 6f 6e  onst FINDER)(con
1ffd0 73 74 20 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c  st char*,unixFil
1ffe0 65 20 2a 70 29 20 20 20 20 5c 0a 20 20 20 20 3d  e *p)    \.    =
1fff0 20 46 49 4e 44 45 52 23 23 49 6d 70 6c 3b 0a 0a   FINDER##Impl;..
20000 2f 2a 0a 2a 2a 20 48 65 72 65 20 61 72 65 20 61  /*.** Here are a
20010 6c 6c 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65  ll of the sqlite
20020 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a  3_io_methods obj
20030 65 63 74 73 20 66 6f 72 20 65 61 63 68 20 6f 66  ects for each of
20040 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20   the.** locking 
20050 73 74 72 61 74 65 67 69 65 73 2e 20 20 46 75 6e  strategies.  Fun
20060 63 74 69 6f 6e 73 20 74 68 61 74 20 72 65 74 75  ctions that retu
20070 72 6e 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 74  rn pointers to t
20080 68 65 73 65 20 6d 65 74 68 6f 64 73 0a 2a 2a 20  hese methods.** 
20090 61 72 65 20 61 6c 73 6f 20 63 72 65 61 74 65 64  are also created
200a0 2e 0a 2a 2f 0a 49 4f 4d 45 54 48 4f 44 53 28 0a  ..*/.IOMETHODS(.
200b0 20 20 70 6f 73 69 78 49 6f 46 69 6e 64 65 72 2c    posixIoFinder,
200c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
200d0 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e  inder function n
200e0 61 6d 65 20 2a 2f 0a 20 20 70 6f 73 69 78 49 6f  ame */.  posixIo
200f0 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20  Methods,        
20100 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f     /* sqlite3_io
20110 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20  _methods object 
20120 6e 61 6d 65 20 2a 2f 0a 20 20 32 2c 20 20 20 20  name */.  2,    
20130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20140 20 20 20 20 2f 2a 20 53 68 6d 4f 70 65 6e 20 69      /* ShmOpen i
20150 73 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 75  s enabled */.  u
20160 6e 69 78 43 6c 6f 73 65 2c 20 20 20 20 20 20 20  nixClose,       
20170 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f           /* xClo
20180 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75  se method */.  u
20190 6e 69 78 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20  nixLock,        
201a0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63           /* xLoc
201b0 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e  k method */.  un
201c0 69 78 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20  ixUnlock,       
201d0 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f          /* xUnlo
201e0 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75  ck method */.  u
201f0 6e 69 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  nixCheckReserved
20200 4c 6f 63 6b 20 20 20 20 20 2f 2a 20 78 43 68 65  Lock     /* xChe
20210 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d  ckReservedLock m
20220 65 74 68 6f 64 20 2a 2f 0a 29 0a 49 4f 4d 45 54  ethod */.).IOMET
20230 48 4f 44 53 28 0a 20 20 6e 6f 6c 6f 63 6b 49 6f  HODS(.  nolockIo
20240 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20  Finder,         
20250 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63    /* Finder func
20260 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 6e  tion name */.  n
20270 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 2c 20  olockIoMethods, 
20280 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69           /* sqli
20290 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f  te3_io_methods o
202a0 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20  bject name */.  
202b0 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1,              
202c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68 6d            /* Shm
202d0 4f 70 65 6e 20 69 73 20 64 69 73 61 62 6c 65 64  Open is disabled
202e0 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 43 6c 6f 73   */.  nolockClos
202f0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
20300 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64  /* xClose method
20310 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b   */.  nolockLock
20320 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
20330 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  /* xLock method 
20340 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 55 6e 6c 6f 63  */.  nolockUnloc
20350 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  k,             /
20360 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64  * xUnlock method
20370 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 43 68 65 63   */.  nolockChec
20380 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 20 20  kReservedLock   
20390 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65  /* xCheckReserve
203a0 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  dLock method */.
203b0 29 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 64  ).IOMETHODS(.  d
203c0 6f 74 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20  otlockIoFinder, 
203d0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64           /* Find
203e0 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  er function name
203f0 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 49 6f 4d   */.  dotlockIoM
20400 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20  ethods,         
20410 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  /* sqlite3_io_me
20420 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d  thods object nam
20430 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20  e */.  1,       
20440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20450 20 2f 2a 20 53 68 6d 4f 70 65 6e 20 69 73 20 64   /* ShmOpen is d
20460 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 64 6f 74  isabled */.  dot
20470 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20 20 20 20 20  lockClose,      
20480 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65         /* xClose
20490 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 64 6f 74   method */.  dot
204a0 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20 20 20 20  lockLock,       
204b0 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20         /* xLock 
204c0 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 64 6f 74 6c  method */.  dotl
204d0 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20  ockUnlock,      
204e0 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b        /* xUnlock
204f0 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 64 6f 74   method */.  dot
20500 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65  lockCheckReserve
20510 64 4c 6f 63 6b 20 20 2f 2a 20 78 43 68 65 63 6b  dLock  /* xCheck
20520 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74  ReservedLock met
20530 68 6f 64 20 2a 2f 0a 29 0a 0a 23 69 66 20 53 51  hod */.)..#if SQ
20540 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
20550 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 21 4f 53  ING_STYLE && !OS
20560 5f 56 58 57 4f 52 4b 53 0a 49 4f 4d 45 54 48 4f  _VXWORKS.IOMETHO
20570 44 53 28 0a 20 20 66 6c 6f 63 6b 49 6f 46 69 6e  DS(.  flockIoFin
20580 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  der,            
20590 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69  /* Finder functi
205a0 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 66 6c 6f  on name */.  flo
205b0 63 6b 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20  ckIoMethods,    
205c0 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65         /* sqlite
205d0 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a  3_io_methods obj
205e0 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c  ect name */.  1,
205f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20600 20 20 20 20 20 20 20 20 2f 2a 20 53 68 6d 4f 70          /* ShmOp
20610 65 6e 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a  en is disabled *
20620 2f 0a 20 20 66 6c 6f 63 6b 43 6c 6f 73 65 2c 20  /.  flockClose, 
20630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20640 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a   xClose method *
20650 2f 0a 20 20 66 6c 6f 63 6b 4c 6f 63 6b 2c 20 20  /.  flockLock,  
20660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20670 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f   xLock method */
20680 0a 20 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20  .  flockUnlock, 
20690 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
206a0 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  xUnlock method *
206b0 2f 0a 20 20 66 6c 6f 63 6b 43 68 65 63 6b 52 65  /.  flockCheckRe
206c0 73 65 72 76 65 64 4c 6f 63 6b 20 20 20 20 2f 2a  servedLock    /*
206d0 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
206e0 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a  ock method */.).
206f0 23 65 6e 64 69 66 0a 0a 23 69 66 20 4f 53 5f 56  #endif..#if OS_V
20700 58 57 4f 52 4b 53 0a 49 4f 4d 45 54 48 4f 44 53  XWORKS.IOMETHODS
20710 28 0a 20 20 73 65 6d 49 6f 46 69 6e 64 65 72 2c  (.  semIoFinder,
20720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20730 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e   Finder function
20740 20 6e 61 6d 65 20 2a 2f 0a 20 20 73 65 6d 49 6f   name */.  semIo
20750 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20  Methods,        
20760 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f       /* sqlite3_
20770 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63  io_methods objec
20780 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20  t name */.  1,  
20790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
207a0 20 20 20 20 20 20 2f 2a 20 53 68 6d 4f 70 65 6e        /* ShmOpen
207b0 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a   is disabled */.
207c0 20 20 73 65 6d 43 6c 6f 73 65 2c 20 20 20 20 20    semClose,     
207d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
207e0 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a  Close method */.
207f0 20 20 73 65 6d 4c 6f 63 6b 2c 20 20 20 20 20 20    semLock,      
20800 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
20810 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  Lock method */. 
20820 20 73 65 6d 55 6e 6c 6f 63 6b 2c 20 20 20 20 20   semUnlock,     
20830 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55             /* xU
20840 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  nlock method */.
20850 20 20 73 65 6d 43 68 65 63 6b 52 65 73 65 72 76    semCheckReserv
20860 65 64 4c 6f 63 6b 20 20 20 20 20 20 2f 2a 20 78  edLock      /* x
20870 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
20880 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65  k method */.).#e
20890 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e 65  ndif..#if define
208a0 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20  d(__APPLE__) && 
208b0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
208c0 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 49 4f 4d 45  CKING_STYLE.IOME
208d0 54 48 4f 44 53 28 0a 20 20 61 66 70 49 6f 46 69  THODS(.  afpIoFi
208e0 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  nder,           
208f0 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e     /* Finder fun
20900 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  ction name */.  
20910 61 66 70 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20  afpIoMethods,   
20920 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c            /* sql
20930 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
20940 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20  object name */. 
20950 20 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   1,             
20960 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68             /* Sh
20970 6d 4f 70 65 6e 20 69 73 20 64 69 73 61 62 6c 65  mOpen is disable
20980 64 20 2a 2f 0a 20 20 61 66 70 43 6c 6f 73 65 2c  d */.  afpClose,
20990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
209a0 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f   /* xClose metho
209b0 64 20 2a 2f 0a 20 20 61 66 70 4c 6f 63 6b 2c 20  d */.  afpLock, 
209c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
209d0 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64   /* xLock method
209e0 20 2a 2f 0a 20 20 61 66 70 55 6e 6c 6f 63 6b 2c   */.  afpUnlock,
209f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20a00 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f  /* xUnlock metho
20a10 64 20 2a 2f 0a 20 20 61 66 70 43 68 65 63 6b 52  d */.  afpCheckR
20a20 65 73 65 72 76 65 64 4c 6f 63 6b 20 20 20 20 20  eservedLock     
20a30 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76   /* xCheckReserv
20a40 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f  edLock method */
20a50 0a 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .).#endif../*.**
20a60 20 54 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b 69   The proxy locki
20a70 6e 67 20 6d 65 74 68 6f 64 20 69 73 20 61 20 22  ng method is a "
20a80 73 75 70 65 72 2d 6d 65 74 68 6f 64 22 20 69 6e  super-method" in
20a90 20 74 68 65 20 73 65 6e 73 65 20 74 68 61 74 20   the sense that 
20aa0 69 74 0a 2a 2a 20 6f 70 65 6e 73 20 73 65 63 6f  it.** opens seco
20ab0 6e 64 61 72 79 20 66 69 6c 65 20 64 65 73 63 72  ndary file descr
20ac0 69 70 74 6f 72 73 20 66 6f 72 20 74 68 65 20 63  iptors for the c
20ad0 6f 6e 63 68 20 61 6e 64 20 6c 6f 63 6b 20 66 69  onch and lock fi
20ae0 6c 65 73 20 61 6e 64 0a 2a 2a 20 69 74 20 75 73  les and.** it us
20af0 65 73 20 70 72 6f 78 79 2c 20 64 6f 74 2d 66 69  es proxy, dot-fi
20b00 6c 65 2c 20 41 46 50 2c 20 61 6e 64 20 66 6c 6f  le, AFP, and flo
20b10 63 6b 28 29 20 6c 6f 63 6b 69 6e 67 20 6d 65 74  ck() locking met
20b20 68 6f 64 73 20 6f 6e 20 74 68 6f 73 65 0a 2a 2a  hods on those.**
20b30 20 73 65 63 6f 6e 64 61 72 79 20 66 69 6c 65 73   secondary files
20b40 2e 20 20 46 6f 72 20 74 68 69 73 20 72 65 61 73  .  For this reas
20b50 6f 6e 2c 20 74 68 65 20 64 69 76 69 73 69 6f 6e  on, the division
20b60 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73   that implements
20b70 0a 2a 2a 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e  .** proxy lockin
20b80 67 20 69 73 20 6c 6f 63 61 74 65 64 20 6d 75 63  g is located muc
20b90 68 20 66 75 72 74 68 65 72 20 64 6f 77 6e 20 69  h further down i
20ba0 6e 20 74 68 65 20 66 69 6c 65 2e 20 20 42 75 74  n the file.  But
20bb0 20 77 65 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 67   we need.** to g
20bc0 6f 20 61 68 65 61 64 20 61 6e 64 20 64 65 66 69  o ahead and defi
20bd0 6e 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69  ne the sqlite3_i
20be0 6f 5f 6d 65 74 68 6f 64 73 20 61 6e 64 20 66 69  o_methods and fi
20bf0 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  nder function.**
20c00 20 66 6f 72 20 70 72 6f 78 79 20 6c 6f 63 6b 69   for proxy locki
20c10 6e 67 20 68 65 72 65 2e 20 20 53 6f 20 77 65 20  ng here.  So we 
20c20 66 6f 72 77 61 72 64 20 64 65 63 6c 61 72 65 20  forward declare 
20c30 74 68 65 20 49 2f 4f 20 6d 65 74 68 6f 64 73 2e  the I/O methods.
20c40 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .*/.#if defined(
20c50 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51  __APPLE__) && SQ
20c60 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
20c70 49 4e 47 5f 53 54 59 4c 45 0a 73 74 61 74 69 63  ING_STYLE.static
20c80 20 69 6e 74 20 70 72 6f 78 79 43 6c 6f 73 65 28   int proxyClose(
20c90 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 3b 0a  sqlite3_file*);.
20ca0 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
20cb0 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
20cc0 65 2a 2c 20 69 6e 74 29 3b 0a 73 74 61 74 69 63  e*, int);.static
20cd0 20 69 6e 74 20 70 72 6f 78 79 55 6e 6c 6f 63 6b   int proxyUnlock
20ce0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20  (sqlite3_file*, 
20cf0 69 6e 74 29 3b 0a 73 74 61 74 69 63 20 69 6e 74  int);.static int
20d00 20 70 72 6f 78 79 43 68 65 63 6b 52 65 73 65 72   proxyCheckReser
20d10 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  vedLock(sqlite3_
20d20 66 69 6c 65 2a 2c 20 69 6e 74 2a 29 3b 0a 49 4f  file*, int*);.IO
20d30 4d 45 54 48 4f 44 53 28 0a 20 20 70 72 6f 78 79  METHODS(.  proxy
20d40 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20  IoFinder,       
20d50 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66       /* Finder f
20d60 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a  unction name */.
20d70 20 20 70 72 6f 78 79 49 6f 4d 65 74 68 6f 64 73    proxyIoMethods
20d80 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73  ,           /* s
20d90 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
20da0 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f  s object name */
20db0 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20 20 20  .  1,           
20dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20dd0 53 68 6d 4f 70 65 6e 20 69 73 20 64 69 73 61 62  ShmOpen is disab
20de0 6c 65 64 20 2a 2f 0a 20 20 70 72 6f 78 79 43 6c  led */.  proxyCl
20df0 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ose,            
20e00 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74     /* xClose met
20e10 68 6f 64 20 2a 2f 0a 20 20 70 72 6f 78 79 4c 6f  hod */.  proxyLo
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 4c 6f 63 6b 20 6d 65 74 68     /* xLock meth
20e40 6f 64 20 2a 2f 0a 20 20 70 72 6f 78 79 55 6e 6c  od */.  proxyUnl
20e50 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
20e60 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74    /* xUnlock met
20e70 68 6f 64 20 2a 2f 0a 20 20 70 72 6f 78 79 43 68  hod */.  proxyCh
20e80 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20  eckReservedLock 
20e90 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65     /* xCheckRese
20ea0 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  rvedLock method 
20eb0 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20  */.).#endif../* 
20ec0 6e 66 73 20 6c 6f 63 6b 64 20 6f 6e 20 4f 53 58  nfs lockd on OSX
20ed0 20 31 30 2e 33 2b 20 64 6f 65 73 6e 27 74 20 63   10.3+ doesn't c
20ee0 6c 65 61 72 20 77 72 69 74 65 20 6c 6f 63 6b 73  lear write locks
20ef0 20 77 68 65 6e 20 61 20 72 65 61 64 20 6c 6f 63   when a read loc
20f00 6b 20 69 73 20 73 65 74 20 2a 2f 0a 23 69 66 20  k is set */.#if 
20f10 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
20f20 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  _) && SQLITE_ENA
20f30 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
20f40 45 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 6e  E.IOMETHODS(.  n
20f50 66 73 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20  fsIoFinder,     
20f60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e            /* Fin
20f70 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  der function nam
20f80 65 20 2a 2f 0a 20 20 6e 66 73 49 6f 4d 65 74 68  e */.  nfsIoMeth
20f90 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ods,            
20fa0 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f    /* sqlite3_io_
20fb0 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e  methods object n
20fc0 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20  ame */.  1,     
20fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20fe0 20 20 20 20 2f 2a 20 53 68 6d 4f 70 65 6e 20 69      /* ShmOpen i
20ff0 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20  s disabled */.  
21000 75 6e 69 78 43 6c 6f 73 65 2c 20 20 20 20 20 20  unixClose,      
21010 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
21020 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lose method */. 
21030 20 75 6e 69 78 4c 6f 63 6b 2c 20 20 20 20 20 20   unixLock,      
21040 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
21050 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  Lock method */. 
21060 20 6e 66 73 55 6e 6c 6f 63 6b 2c 20 20 20 20 20   nfsUnlock,     
21070 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
21080 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f  Unlock method */
21090 0a 20 20 75 6e 69 78 43 68 65 63 6b 52 65 73 65  .  unixCheckRese
210a0 72 76 65 64 4c 6f 63 6b 20 20 20 20 20 20 2f 2a  rvedLock      /*
210b0 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
210c0 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a  ock method */.).
210d0 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69  #endif..#if defi
210e0 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26  ned(__APPLE__) &
210f0 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  & SQLITE_ENABLE_
21100 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a  LOCKING_STYLE./*
21110 20 0a 2a 2a 20 54 68 69 73 20 22 66 69 6e 64 65   .** This "finde
21120 72 22 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65  r" function atte
21130 6d 70 74 73 20 74 6f 20 64 65 74 65 72 6d 69 6e  mpts to determin
21140 65 20 74 68 65 20 62 65 73 74 20 6c 6f 63 6b 69  e the best locki
21150 6e 67 20 73 74 72 61 74 65 67 79 20 0a 2a 2a 20  ng strategy .** 
21160 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65  for the database
21170 20 66 69 6c 65 20 22 66 69 6c 65 50 61 74 68 22   file "filePath"
21180 2e 20 20 49 74 20 74 68 65 6e 20 72 65 74 75 72  .  It then retur
21190 6e 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69  ns the sqlite3_i
211a0 6f 5f 6d 65 74 68 6f 64 73 0a 2a 2a 20 6f 62 6a  o_methods.** obj
211b0 65 63 74 20 74 68 61 74 20 69 6d 70 6c 65 6d 65  ect that impleme
211c0 6e 74 73 20 74 68 61 74 20 73 74 72 61 74 65 67  nts that strateg
211d0 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  y..**.** This is
211e0 20 66 6f 72 20 4d 61 63 4f 53 58 20 6f 6e 6c 79   for MacOSX only
211f0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
21200 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  t sqlite3_io_met
21210 68 6f 64 73 20 2a 61 75 74 6f 6c 6f 63 6b 49 6f  hods *autolockIo
21220 46 69 6e 64 65 72 49 6d 70 6c 28 0a 20 20 63 6f  FinderImpl(.  co
21230 6e 73 74 20 63 68 61 72 20 2a 66 69 6c 65 50 61  nst char *filePa
21240 74 68 2c 20 20 20 20 2f 2a 20 6e 61 6d 65 20 6f  th,    /* name o
21250 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
21260 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c  ile */.  unixFil
21270 65 20 2a 70 4e 65 77 20 20 20 20 20 20 20 20 20  e *pNew         
21280 20 20 2f 2a 20 6f 70 65 6e 20 66 69 6c 65 20 6f    /* open file o
21290 62 6a 65 63 74 20 66 6f 72 20 74 68 65 20 64 61  bject for the da
212a0 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 29  tabase file */.)
212b0 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  {.  static const
212c0 20 73 74 72 75 63 74 20 4d 61 70 70 69 6e 67 20   struct Mapping 
212d0 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
212e0 20 2a 7a 46 69 6c 65 73 79 73 74 65 6d 3b 20 20   *zFilesystem;  
212f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
21300 69 6c 65 73 79 73 74 65 6d 20 74 79 70 65 20 6e  ilesystem type n
21310 61 6d 65 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74  ame */.    const
21320 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
21330 6f 64 73 20 2a 70 4d 65 74 68 6f 64 73 3b 20 20  ods *pMethods;  
21340 20 2f 2a 20 41 70 70 72 6f 70 72 69 61 74 65 20   /* Appropriate 
21350 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 20 2a  locking method *
21360 2f 0a 20 20 7d 20 61 4d 61 70 5b 5d 20 3d 20 7b  /.  } aMap[] = {
21370 0a 20 20 20 20 7b 20 22 68 66 73 22 2c 20 20 20  .    { "hfs",   
21380 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73   &posixIoMethods
21390 20 7d 2c 0a 20 20 20 20 7b 20 22 75 66 73 22 2c   },.    { "ufs",
213a0 20 20 20 20 26 70 6f 73 69 78 49 6f 4d 65 74 68      &posixIoMeth
213b0 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20 22 61 66  ods },.    { "af
213c0 70 66 73 22 2c 20 20 26 61 66 70 49 6f 4d 65 74  pfs",  &afpIoMet
213d0 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20 22 73  hods },.    { "s
213e0 6d 62 66 73 22 2c 20 20 26 61 66 70 49 6f 4d 65  mbfs",  &afpIoMe
213f0 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20 22  thods },.    { "
21400 77 65 62 64 61 76 22 2c 20 26 6e 6f 6c 6f 63 6b  webdav", &nolock
21410 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20  IoMethods },.   
21420 20 7b 20 30 2c 20 30 20 7d 0a 20 20 7d 3b 0a 20   { 0, 0 }.  };. 
21430 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74   int i;.  struct
21440 20 73 74 61 74 66 73 20 66 73 49 6e 66 6f 3b 0a   statfs fsInfo;.
21450 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c    struct flock l
21460 6f 63 6b 49 6e 66 6f 3b 0a 0a 20 20 69 66 28 20  ockInfo;..  if( 
21470 21 66 69 6c 65 50 61 74 68 20 29 7b 0a 20 20 20  !filePath ){.   
21480 20 2f 2a 20 49 66 20 66 69 6c 65 50 61 74 68 3d   /* If filePath=
21490 3d 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e 73  =NULL that means
214a0 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20   we are dealing 
214b0 77 69 74 68 20 61 20 74 72 61 6e 73 69 65 6e 74  with a transient
214c0 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68 61   file.    ** tha
214d0 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20  t does not need 
214e0 74 6f 20 62 65 20 6c 6f 63 6b 65 64 2e 20 2a 2f  to be locked. */
214f0 0a 20 20 20 20 72 65 74 75 72 6e 20 26 6e 6f 6c  .    return &nol
21500 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20  ockIoMethods;.  
21510 7d 0a 20 20 69 66 28 20 73 74 61 74 66 73 28 66  }.  if( statfs(f
21520 69 6c 65 50 61 74 68 2c 20 26 66 73 49 6e 66 6f  ilePath, &fsInfo
21530 29 20 21 3d 20 2d 31 20 29 7b 0a 20 20 20 20 69  ) != -1 ){.    i
21540 66 28 20 66 73 49 6e 66 6f 2e 66 5f 66 6c 61 67  f( fsInfo.f_flag
21550 73 20 26 20 4d 4e 54 5f 52 44 4f 4e 4c 59 20 29  s & MNT_RDONLY )
21560 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 26  {.      return &
21570 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b  nolockIoMethods;
21580 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
21590 3d 30 3b 20 61 4d 61 70 5b 69 5d 2e 7a 46 69 6c  =0; aMap[i].zFil
215a0 65 73 79 73 74 65 6d 3b 20 69 2b 2b 29 7b 0a 20  esystem; i++){. 
215b0 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28       if( strcmp(
215c0 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e  fsInfo.f_fstypen
215d0 61 6d 65 2c 20 61 4d 61 70 5b 69 5d 2e 7a 46 69  ame, aMap[i].zFi
215e0 6c 65 73 79 73 74 65 6d 29 3d 3d 30 20 29 7b 0a  lesystem)==0 ){.
215f0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 61          return a
21600 4d 61 70 5b 69 5d 2e 70 4d 65 74 68 6f 64 73 3b  Map[i].pMethods;
21610 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
21620 20 7d 0a 0a 20 20 2f 2a 20 44 65 66 61 75 6c 74   }..  /* Default
21630 20 63 61 73 65 2e 20 48 61 6e 64 6c 65 73 2c 20   case. Handles, 
21640 61 6d 6f 6e 67 73 74 20 6f 74 68 65 72 73 2c 20  amongst others, 
21650 22 6e 66 73 22 2e 0a 20 20 2a 2a 20 54 65 73 74  "nfs"..  ** Test
21660 20 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b   byte-range lock
21670 20 75 73 69 6e 67 20 66 63 6e 74 6c 28 29 2e 20   using fcntl(). 
21680 49 66 20 74 68 65 20 63 61 6c 6c 20 73 75 63 63  If the call succ
21690 65 65 64 73 2c 20 0a 20 20 2a 2a 20 61 73 73 75  eeds, .  ** assu
216a0 6d 65 20 74 68 61 74 20 74 68 65 20 66 69 6c 65  me that the file
216b0 2d 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 73  -system supports
216c0 20 50 4f 53 49 58 20 73 74 79 6c 65 20 6c 6f 63   POSIX style loc
216d0 6b 73 2e 20 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b  ks. .  */.  lock
216e0 49 6e 66 6f 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a  Info.l_len = 1;.
216f0 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 73 74 61    lockInfo.l_sta
21700 72 74 20 3d 20 30 3b 0a 20 20 6c 6f 63 6b 49 6e  rt = 0;.  lockIn
21710 66 6f 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45  fo.l_whence = SE
21720 45 4b 5f 53 45 54 3b 0a 20 20 6c 6f 63 6b 49 6e  EK_SET;.  lockIn
21730 66 6f 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44  fo.l_type = F_RD
21740 4c 43 4b 3b 0a 20 20 69 66 28 20 66 63 6e 74 6c  LCK;.  if( fcntl
21750 28 70 4e 65 77 2d 3e 68 2c 20 46 5f 47 45 54 4c  (pNew->h, F_GETL
21760 4b 2c 20 26 6c 6f 63 6b 49 6e 66 6f 29 21 3d 2d  K, &lockInfo)!=-
21770 31 20 29 20 7b 0a 20 20 20 20 69 66 28 20 73 74  1 ) {.    if( st
21780 72 63 6d 70 28 66 73 49 6e 66 6f 2e 66 5f 66 73  rcmp(fsInfo.f_fs
21790 74 79 70 65 6e 61 6d 65 2c 20 22 6e 66 73 22 29  typename, "nfs")
217a0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ==0 ){.      ret
217b0 75 72 6e 20 26 6e 66 73 49 6f 4d 65 74 68 6f 64  urn &nfsIoMethod
217c0 73 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  s;.    } else {.
217d0 20 20 20 20 20 20 72 65 74 75 72 6e 20 26 70 6f        return &po
217e0 73 69 78 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20  sixIoMethods;.  
217f0 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
21800 20 72 65 74 75 72 6e 20 26 64 6f 74 6c 6f 63 6b   return &dotlock
21810 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 7d  IoMethods;.  }.}
21820 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71  .static const sq
21830 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
21840 20 0a 20 20 2a 28 2a 63 6f 6e 73 74 20 61 75 74   .  *(*const aut
21850 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 29 28 63  olockIoFinder)(c
21860 6f 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69 78 46  onst char*,unixF
21870 69 6c 65 2a 29 20 3d 20 61 75 74 6f 6c 6f 63 6b  ile*) = autolock
21880 49 6f 46 69 6e 64 65 72 49 6d 70 6c 3b 0a 0a 23  IoFinderImpl;..#
21890 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64  endif /* defined
218a0 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53  (__APPLE__) && S
218b0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
218c0 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a 23  KING_STYLE */..#
218d0 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 20 26 26  if OS_VXWORKS &&
218e0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
218f0 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 20  OCKING_STYLE./* 
21900 0a 2a 2a 20 54 68 69 73 20 22 66 69 6e 64 65 72  .** This "finder
21910 22 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d  " function attem
21920 70 74 73 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  pts to determine
21930 20 74 68 65 20 62 65 73 74 20 6c 6f 63 6b 69 6e   the best lockin
21940 67 20 73 74 72 61 74 65 67 79 20 0a 2a 2a 20 66  g strategy .** f
21950 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20  or the database 
21960 66 69 6c 65 20 22 66 69 6c 65 50 61 74 68 22 2e  file "filePath".
21970 20 20 49 74 20 74 68 65 6e 20 72 65 74 75 72 6e    It then return
21980 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6f  s the sqlite3_io
21990 5f 6d 65 74 68 6f 64 73 0a 2a 2a 20 6f 62 6a 65  _methods.** obje
219a0 63 74 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e  ct that implemen
219b0 74 73 20 74 68 61 74 20 73 74 72 61 74 65 67 79  ts that strategy
219c0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ..**.** This is 
219d0 66 6f 72 20 56 58 57 6f 72 6b 73 20 6f 6e 6c 79  for VXWorks only
219e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
219f0 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  t sqlite3_io_met
21a00 68 6f 64 73 20 2a 61 75 74 6f 6c 6f 63 6b 49 6f  hods *autolockIo
21a10 46 69 6e 64 65 72 49 6d 70 6c 28 0a 20 20 63 6f  FinderImpl(.  co
21a20 6e 73 74 20 63 68 61 72 20 2a 66 69 6c 65 50 61  nst char *filePa
21a30 74 68 2c 20 20 20 20 2f 2a 20 6e 61 6d 65 20 6f  th,    /* name o
21a40 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
21a50 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c  ile */.  unixFil
21a60 65 20 2a 70 4e 65 77 20 20 20 20 20 20 20 20 20  e *pNew         
21a70 20 20 2f 2a 20 74 68 65 20 6f 70 65 6e 20 66 69    /* the open fi
21a80 6c 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a  le object */.){.
21a90 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c    struct flock l
21aa0 6f 63 6b 49 6e 66 6f 3b 0a 0a 20 20 69 66 28 20  ockInfo;..  if( 
21ab0 21 66 69 6c 65 50 61 74 68 20 29 7b 0a 20 20 20  !filePath ){.   
21ac0 20 2f 2a 20 49 66 20 66 69 6c 65 50 61 74 68 3d   /* If filePath=
21ad0 3d 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e 73  =NULL that means
21ae0 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20   we are dealing 
21af0 77 69 74 68 20 61 20 74 72 61 6e 73 69 65 6e 74  with a transient
21b00 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68 61   file.    ** tha
21b10 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20  t does not need 
21b20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 2e 20 2a 2f  to be locked. */
21b30 0a 20 20 20 20 72 65 74 75 72 6e 20 26 6e 6f 6c  .    return &nol
21b40 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20  ockIoMethods;.  
21b50 7d 0a 0a 20 20 2f 2a 20 54 65 73 74 20 69 66 20  }..  /* Test if 
21b60 66 63 6e 74 6c 28 29 20 69 73 20 73 75 70 70 6f  fcntl() is suppo
21b70 72 74 65 64 20 61 6e 64 20 75 73 65 20 50 4f 53  rted and use POS
21b80 49 58 20 73 74 79 6c 65 20 6c 6f 63 6b 73 2e 0a  IX style locks..
21b90 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 20 66    ** Otherwise f
21ba0 61 6c 6c 20 62 61 63 6b 20 74 6f 20 74 68 65 20  all back to the 
21bb0 6e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20  named semaphore 
21bc0 6d 65 74 68 6f 64 2e 0a 20 20 2a 2f 0a 20 20 6c  method..  */.  l
21bd0 6f 63 6b 49 6e 66 6f 2e 6c 5f 6c 65 6e 20 3d 20  ockInfo.l_len = 
21be0 31 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f  1;.  lockInfo.l_
21bf0 73 74 61 72 74 20 3d 20 30 3b 0a 20 20 6c 6f 63  start = 0;.  loc
21c00 6b 49 6e 66 6f 2e 6c 5f 77 68 65 6e 63 65 20 3d  kInfo.l_whence =
21c10 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 6c 6f 63   SEEK_SET;.  loc
21c20 6b 49 6e 66 6f 2e 6c 5f 74 79 70 65 20 3d 20 46  kInfo.l_type = F
21c30 5f 52 44 4c 43 4b 3b 0a 20 20 69 66 28 20 66 63  _RDLCK;.  if( fc
21c40 6e 74 6c 28 70 4e 65 77 2d 3e 68 2c 20 46 5f 47  ntl(pNew->h, F_G
21c50 45 54 4c 4b 2c 20 26 6c 6f 63 6b 49 6e 66 6f 29  ETLK, &lockInfo)
21c60 21 3d 2d 31 20 29 20 7b 0a 20 20 20 20 72 65 74  !=-1 ) {.    ret
21c70 75 72 6e 20 26 70 6f 73 69 78 49 6f 4d 65 74 68  urn &posixIoMeth
21c80 6f 64 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ods;.  }else{.  
21c90 20 20 72 65 74 75 72 6e 20 26 73 65 6d 49 6f 4d    return &semIoM
21ca0 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 7d 0a 73 74  ethods;.  }.}.st
21cb0 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74  atic const sqlit
21cc0 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 0a 20  e3_io_methods . 
21cd0 20 2a 28 2a 63 6f 6e 73 74 20 61 75 74 6f 6c 6f   *(*const autolo
21ce0 63 6b 49 6f 46 69 6e 64 65 72 29 28 63 6f 6e 73  ckIoFinder)(cons
21cf0 74 20 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65  t char*,unixFile
21d00 2a 29 20 3d 20 61 75 74 6f 6c 6f 63 6b 49 6f 46  *) = autolockIoF
21d10 69 6e 64 65 72 49 6d 70 6c 3b 0a 0a 23 65 6e 64  inderImpl;..#end
21d20 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53  if /* OS_VXWORKS
21d30 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
21d40 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
21d50 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 61 62 73  */../*.** An abs
21d60 74 72 61 63 74 20 74 79 70 65 20 66 6f 72 20 61  tract type for a
21d70 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 49 4f   pointer to a IO
21d80 20 6d 65 74 68 6f 64 20 66 69 6e 64 65 72 20 66   method finder f
21d90 75 6e 63 74 69 6f 6e 3a 0a 2a 2f 0a 74 79 70 65  unction:.*/.type
21da0 64 65 66 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  def const sqlite
21db0 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 28 2a  3_io_methods *(*
21dc0 66 69 6e 64 65 72 5f 74 79 70 65 29 28 63 6f 6e  finder_type)(con
21dd0 73 74 20 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c  st char*,unixFil
21de0 65 2a 29 3b 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  e*);.../********
21df0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21e00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21e10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21e20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21e30 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
21e40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21e50 2a 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65  * sqlite3_vfs me
21e60 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  thods **********
21e70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21e80 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 64 69  **.**.** This di
21e90 76 69 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20  vision contains 
21ea0 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  the implementati
21eb0 6f 6e 20 6f 66 20 6d 65 74 68 6f 64 73 20 6f 6e  on of methods on
21ec0 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f   the.** sqlite3_
21ed0 76 66 73 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 0a  vfs object..*/..
21ee0 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65  /*.** Initialize
21ef0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
21f00 20 74 68 65 20 75 6e 69 78 46 69 6c 65 20 73 74   the unixFile st
21f10 72 75 63 74 75 72 65 20 70 6f 69 6e 74 65 64 20  ructure pointed 
21f20 74 6f 20 62 79 20 70 49 64 2e 0a 2a 2f 0a 73 74  to by pId..*/.st
21f30 61 74 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e 55  atic int fillInU
21f40 6e 69 78 46 69 6c 65 28 0a 20 20 73 71 6c 69 74  nixFile(.  sqlit
21f50 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20  e3_vfs *pVfs,   
21f60 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
21f70 20 76 66 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20   vfs object */. 
21f80 20 69 6e 74 20 68 2c 20 20 20 20 20 20 20 20 20   int h,         
21f90 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e           /* Open
21fa0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
21fb0 20 6f 66 20 66 69 6c 65 20 62 65 69 6e 67 20 6f   of file being o
21fc0 70 65 6e 65 64 20 2a 2f 0a 20 20 69 6e 74 20 64  pened */.  int d
21fd0 69 72 66 64 2c 20 20 20 20 20 20 20 20 20 20 20  irfd,           
21fe0 20 20 20 2f 2a 20 44 69 72 65 63 74 6f 72 79 20     /* Directory 
21ff0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
22000 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  */.  sqlite3_fil
22010 65 20 2a 70 49 64 2c 20 20 20 20 20 20 2f 2a 20  e *pId,      /* 
22020 57 72 69 74 65 20 74 6f 20 74 68 65 20 75 6e 69  Write to the uni
22030 78 46 69 6c 65 20 73 74 72 75 63 74 75 72 65 20  xFile structure 
22040 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  here */.  const 
22050 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
22060 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
22070 20 66 69 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e   file being open
22080 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 4c 6f  ed */.  int noLo
22090 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
220a0 2f 2a 20 4f 6d 69 74 20 6c 6f 63 6b 69 6e 67 20  /* Omit locking 
220b0 69 66 20 74 72 75 65 20 2a 2f 0a 20 20 69 6e 74  if true */.  int
220c0 20 69 73 44 65 6c 65 74 65 20 20 20 20 20 20 20   isDelete       
220d0 20 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 6f       /* Delete o
220e0 6e 20 63 6c 6f 73 65 20 69 66 20 74 72 75 65 20  n close if true 
220f0 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 73 71  */.){.  const sq
22100 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
22110 20 2a 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3b   *pLockingStyle;
22120 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e 65  .  unixFile *pNe
22130 77 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29  w = (unixFile *)
22140 70 49 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  pId;.  int rc = 
22150 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73  SQLITE_OK;..  as
22160 73 65 72 74 28 20 70 4e 65 77 2d 3e 70 49 6e 6f  sert( pNew->pIno
22170 64 65 3d 3d 4e 55 4c 4c 20 29 3b 0a 0a 20 20 2f  de==NULL );..  /
22180 2a 20 50 61 72 61 6d 65 74 65 72 20 69 73 44 65  * Parameter isDe
22190 6c 65 74 65 20 69 73 20 6f 6e 6c 79 20 75 73 65  lete is only use
221a0 64 20 6f 6e 20 76 78 77 6f 72 6b 73 2e 20 45 78  d on vxworks. Ex
221b0 70 72 65 73 73 20 74 68 69 73 20 65 78 70 6c 69  press this expli
221c0 63 69 74 6c 79 20 0a 20 20 2a 2a 20 68 65 72 65  citly .  ** here
221d0 20 74 6f 20 70 72 65 76 65 6e 74 20 63 6f 6d 70   to prevent comp
221e0 69 6c 65 72 20 77 61 72 6e 69 6e 67 73 20 61 62  iler warnings ab
221f0 6f 75 74 20 75 6e 75 73 65 64 20 70 61 72 61 6d  out unused param
22200 65 74 65 72 73 2e 0a 20 20 2a 2f 0a 20 20 55 4e  eters..  */.  UN
22210 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 69  USED_PARAMETER(i
22220 73 44 65 6c 65 74 65 29 3b 0a 0a 20 20 4f 53 54  sDelete);..  OST
22230 52 41 43 45 28 28 22 4f 50 45 4e 20 20 20 20 25  RACE(("OPEN    %
22240 2d 33 64 20 25 73 5c 6e 22 2c 20 68 2c 20 7a 46  -3d %s\n", h, zF
22250 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 70 4e 65  ilename));.  pNe
22260 77 2d 3e 68 20 3d 20 68 3b 0a 20 20 70 4e 65 77  w->h = h;.  pNew
22270 2d 3e 64 69 72 66 64 20 3d 20 64 69 72 66 64 3b  ->dirfd = dirfd;
22280 0a 20 20 70 4e 65 77 2d 3e 66 69 6c 65 46 6c 61  .  pNew->fileFla
22290 67 73 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74  gs = 0;.  assert
222a0 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c  ( zFilename==0 |
222b0 7c 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d  | zFilename[0]==
222c0 27 2f 27 20 29 3b 20 20 2f 2a 20 4e 65 76 65 72  '/' );  /* Never
222d0 20 61 20 72 65 6c 61 74 69 76 65 20 70 61 74 68   a relative path
222e0 6e 61 6d 65 20 2a 2f 0a 20 20 70 4e 65 77 2d 3e  name */.  pNew->
222f0 7a 50 61 74 68 20 3d 20 7a 46 69 6c 65 6e 61 6d  zPath = zFilenam
22300 65 3b 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52  e;..#if OS_VXWOR
22310 4b 53 0a 20 20 70 4e 65 77 2d 3e 70 49 64 20 3d  KS.  pNew->pId =
22320 20 76 78 77 6f 72 6b 73 46 69 6e 64 46 69 6c 65   vxworksFindFile
22330 49 64 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  Id(zFilename);. 
22340 20 69 66 28 20 70 4e 65 77 2d 3e 70 49 64 3d 3d   if( pNew->pId==
22350 30 20 29 7b 0a 20 20 20 20 6e 6f 4c 6f 63 6b 20  0 ){.    noLock 
22360 3d 20 31 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  = 1;.    rc = SQ
22370 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
22380 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 6e 6f  #endif..  if( no
22390 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70 4c 6f 63  Lock ){.    pLoc
223a0 6b 69 6e 67 53 74 79 6c 65 20 3d 20 26 6e 6f 6c  kingStyle = &nol
223b0 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20  ockIoMethods;.  
223c0 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4c 6f 63 6b  }else{.    pLock
223d0 69 6e 67 53 74 79 6c 65 20 3d 20 28 2a 2a 28 66  ingStyle = (**(f
223e0 69 6e 64 65 72 5f 74 79 70 65 2a 29 70 56 66 73  inder_type*)pVfs
223f0 2d 3e 70 41 70 70 44 61 74 61 29 28 7a 46 69 6c  ->pAppData)(zFil
22400 65 6e 61 6d 65 2c 20 70 4e 65 77 29 3b 0a 23 69  ename, pNew);.#i
22410 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
22420 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20  LOCKING_STYLE.  
22430 20 20 2f 2a 20 43 61 63 68 65 20 7a 46 69 6c 65    /* Cache zFile
22440 6e 61 6d 65 20 69 6e 20 74 68 65 20 6c 6f 63 6b  name in the lock
22450 69 6e 67 20 63 6f 6e 74 65 78 74 20 28 41 46 50  ing context (AFP
22460 20 61 6e 64 20 64 6f 74 6c 6f 63 6b 20 6f 76 65   and dotlock ove
22470 72 72 69 64 65 29 20 66 6f 72 0a 20 20 20 20 2a  rride) for.    *
22480 2a 20 70 72 6f 78 79 4c 6f 63 6b 20 61 63 74 69  * proxyLock acti
22490 76 61 74 69 6f 6e 20 69 73 20 70 6f 73 73 69 62  vation is possib
224a0 6c 65 20 28 72 65 6d 6f 74 65 20 70 72 6f 78 79  le (remote proxy
224b0 20 69 73 20 62 61 73 65 64 20 6f 6e 20 64 62 20   is based on db 
224c0 6e 61 6d 65 29 0a 20 20 20 20 2a 2a 20 7a 46 69  name).    ** zFi
224d0 6c 65 6e 61 6d 65 20 72 65 6d 61 69 6e 73 20 76  lename remains v
224e0 61 6c 69 64 20 75 6e 74 69 6c 20 66 69 6c 65 20  alid until file 
224f0 69 73 20 63 6c 6f 73 65 64 2c 20 74 6f 20 73 75  is closed, to su
22500 70 70 6f 72 74 20 2a 2f 0a 20 20 20 20 70 4e 65  pport */.    pNe
22510 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  w->lockingContex
22520 74 20 3d 20 28 76 6f 69 64 2a 29 7a 46 69 6c 65  t = (void*)zFile
22530 6e 61 6d 65 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  name;.#endif.  }
22540 0a 0a 20 20 69 66 28 20 70 4c 6f 63 6b 69 6e 67  ..  if( pLocking
22550 53 74 79 6c 65 20 3d 3d 20 26 70 6f 73 69 78 49  Style == &posixI
22560 6f 4d 65 74 68 6f 64 73 0a 23 69 66 20 64 65 66  oMethods.#if def
22570 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
22580 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
22590 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20  _LOCKING_STYLE. 
225a0 20 20 20 7c 7c 20 70 4c 6f 63 6b 69 6e 67 53 74     || pLockingSt
225b0 79 6c 65 20 3d 3d 20 26 6e 66 73 49 6f 4d 65 74  yle == &nfsIoMet
225c0 68 6f 64 73 0a 23 65 6e 64 69 66 0a 20 20 29 7b  hods.#endif.  ){
225d0 0a 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75  .    unixEnterMu
225e0 74 65 78 28 29 3b 0a 20 20 20 20 72 63 20 3d 20  tex();.    rc = 
225f0 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 70 4e  findInodeInfo(pN
22600 65 77 2c 20 26 70 4e 65 77 2d 3e 70 49 6e 6f 64  ew, &pNew->pInod
22610 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
22620 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
22630 20 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f     /* If an erro
22640 72 20 6f 63 63 75 72 65 64 20 69 6e 20 66 69 6e  r occured in fin
22650 64 49 6e 6f 64 65 49 6e 66 6f 28 29 2c 20 63 6c  dInodeInfo(), cl
22660 6f 73 65 20 74 68 65 20 66 69 6c 65 20 64 65 73  ose the file des
22670 63 72 69 70 74 6f 72 0a 20 20 20 20 20 20 2a 2a  criptor.      **
22680 20 69 6d 6d 65 64 69 61 74 65 6c 79 2c 20 62 65   immediately, be
22690 66 6f 72 65 20 72 65 6c 65 61 73 69 6e 67 20 74  fore releasing t
226a0 68 65 20 6d 75 74 65 78 2e 20 66 69 6e 64 49 6e  he mutex. findIn
226b0 6f 64 65 49 6e 66 6f 28 29 20 6d 61 79 20 66 61  odeInfo() may fa
226c0 69 6c 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 74  il.      ** in t
226d0 77 6f 20 73 63 65 6e 61 72 69 6f 73 3a 0a 20 20  wo scenarios:.  
226e0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
226f0 20 20 28 61 29 20 41 20 63 61 6c 6c 20 74 6f 20    (a) A call to 
22700 66 73 74 61 74 28 29 20 66 61 69 6c 65 64 2e 0a  fstat() failed..
22710 20 20 20 20 20 20 2a 2a 20 20 20 28 62 29 20 41        **   (b) A
22720 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 65 64 2e 0a   malloc failed..
22730 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
22740 2a 20 53 63 65 6e 61 72 69 6f 20 28 62 29 20 6d  * Scenario (b) m
22750 61 79 20 6f 6e 6c 79 20 6f 63 63 75 72 20 69 66  ay only occur if
22760 20 74 68 65 20 70 72 6f 63 65 73 73 20 69 73 20   the process is 
22770 68 6f 6c 64 69 6e 67 20 6e 6f 20 6f 74 68 65 72  holding no other
22780 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 64  .      ** file d
22790 65 73 63 72 69 70 74 6f 72 73 20 6f 70 65 6e 20  escriptors open 
227a0 6f 6e 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65  on the same file
227b0 2e 20 49 66 20 74 68 65 72 65 20 77 65 72 65 20  . If there were 
227c0 6f 74 68 65 72 20 66 69 6c 65 0a 20 20 20 20 20  other file.     
227d0 20 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 73 20   ** descriptors 
227e0 6f 6e 20 74 68 69 73 20 66 69 6c 65 2c 20 74 68  on this file, th
227f0 65 6e 20 6e 6f 20 6d 61 6c 6c 6f 63 20 77 6f 75  en no malloc wou
22800 6c 64 20 62 65 20 72 65 71 75 69 72 65 64 20 62  ld be required b
22810 79 0a 20 20 20 20 20 20 2a 2a 20 66 69 6e 64 49  y.      ** findI
22820 6e 6f 64 65 49 6e 66 6f 28 29 2e 20 49 66 20 74  nodeInfo(). If t
22830 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65 2c  his is the case,
22840 20 69 74 20 69 73 20 71 75 69 74 65 20 73 61 66   it is quite saf
22850 65 20 74 6f 20 63 6c 6f 73 65 0a 20 20 20 20 20  e to close.     
22860 20 2a 2a 20 68 61 6e 64 6c 65 20 68 20 2d 20 61   ** handle h - a
22870 73 20 69 74 20 69 73 20 67 75 61 72 61 6e 74 65  s it is guarante
22880 65 64 20 74 68 61 74 20 6e 6f 20 70 6f 73 69 78  ed that no posix
22890 20 6c 6f 63 6b 73 20 77 69 6c 6c 20 62 65 20 72   locks will be r
228a0 65 6c 65 61 73 65 64 0a 20 20 20 20 20 20 2a 2a  eleased.      **
228b0 20 62 79 20 64 6f 69 6e 67 20 73 6f 2e 0a 20 20   by doing so..  
228c0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
228d0 49 66 20 73 63 65 6e 61 72 69 6f 20 28 61 29 20  If scenario (a) 
228e0 63 61 75 73 65 64 20 74 68 65 20 65 72 72 6f 72  caused the error
228f0 20 74 68 65 6e 20 74 68 69 6e 67 73 20 61 72 65   then things are
22900 20 6e 6f 74 20 73 6f 20 73 61 66 65 2e 20 54 68   not so safe. Th
22910 65 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70 6c 69  e.      ** impli
22920 63 69 74 20 61 73 73 75 6d 70 74 69 6f 6e 20 68  cit assumption h
22930 65 72 65 20 69 73 20 74 68 61 74 20 69 66 20 66  ere is that if f
22940 73 74 61 74 28 29 20 66 61 69 6c 73 2c 20 74 68  stat() fails, th
22950 69 6e 67 73 20 61 72 65 20 69 6e 0a 20 20 20 20  ings are in.    
22960 20 20 2a 2a 20 73 75 63 68 20 62 61 64 20 73 68    ** such bad sh
22970 61 70 65 20 74 68 61 74 20 64 72 6f 70 70 69 6e  ape that droppin
22980 67 20 61 20 6c 6f 63 6b 20 6f 72 20 74 77 6f 20  g a lock or two 
22990 64 6f 65 73 6e 27 74 20 6d 61 74 74 65 72 20 6d  doesn't matter m
229a0 75 63 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  uch..      */.  
229b0 20 20 20 20 63 6c 6f 73 65 28 68 29 3b 0a 20 20      close(h);.  
229c0 20 20 20 20 68 20 3d 20 2d 31 3b 0a 20 20 20 20      h = -1;.    
229d0 7d 0a 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d  }.    unixLeaveM
229e0 75 74 65 78 28 29 3b 0a 20 20 7d 0a 0a 23 69 66  utex();.  }..#if
229f0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
22a00 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20  OCKING_STYLE && 
22a10 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
22a20 5f 29 0a 20 20 65 6c 73 65 20 69 66 28 20 70 4c  _).  else if( pL
22a30 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26  ockingStyle == &
22a40 61 66 70 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a  afpIoMethods ){.
22a50 20 20 20 20 2f 2a 20 41 46 50 20 6c 6f 63 6b 69      /* AFP locki
22a60 6e 67 20 75 73 65 73 20 74 68 65 20 66 69 6c 65  ng uses the file
22a70 20 70 61 74 68 20 73 6f 20 69 74 20 6e 65 65 64   path so it need
22a80 73 20 74 6f 20 62 65 20 69 6e 63 6c 75 64 65 64  s to be included
22a90 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 61   in.    ** the a
22aa0 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
22ab0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 66 70  ..    */.    afp
22ac0 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
22ad0 70 43 74 78 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  pCtx;.    pNew->
22ae0 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d  lockingContext =
22af0 20 70 43 74 78 20 3d 20 73 71 6c 69 74 65 33 5f   pCtx = sqlite3_
22b00 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a  malloc( sizeof(*
22b10 70 43 74 78 29 20 29 3b 0a 20 20 20 20 69 66 28  pCtx) );.    if(
22b20 20 70 43 74 78 3d 3d 30 20 29 7b 0a 20 20 20 20   pCtx==0 ){.    
22b30 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
22b40 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  MEM;.    }else{.
22b50 20 20 20 20 20 20 2f 2a 20 4e 42 3a 20 7a 46 69        /* NB: zFi
22b60 6c 65 6e 61 6d 65 20 65 78 69 73 74 73 20 61 6e  lename exists an
22b70 64 20 72 65 6d 61 69 6e 73 20 76 61 6c 69 64 20  d remains valid 
22b80 75 6e 74 69 6c 20 74 68 65 20 66 69 6c 65 20 69  until the file i
22b90 73 20 63 6c 6f 73 65 64 0a 20 20 20 20 20 20 2a  s closed.      *
22ba0 2a 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 72  * according to r
22bb0 65 71 75 69 72 65 6d 65 6e 74 20 46 31 31 31 34  equirement F1114
22bc0 31 2e 20 20 53 6f 20 77 65 20 64 6f 20 6e 6f 74  1.  So we do not
22bd0 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65 20 61 0a   need to make a.
22be0 20 20 20 20 20 20 2a 2a 20 63 6f 70 79 20 6f 66        ** copy of
22bf0 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 2e 20 2a   the filename. *
22c00 2f 0a 20 20 20 20 20 20 70 43 74 78 2d 3e 64 62  /.      pCtx->db
22c10 50 61 74 68 20 3d 20 7a 46 69 6c 65 6e 61 6d 65  Path = zFilename
22c20 3b 0a 20 20 20 20 20 20 70 43 74 78 2d 3e 72 65  ;.      pCtx->re
22c30 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 20 20  served = 0;.    
22c40 20 20 73 72 61 6e 64 6f 6d 64 65 76 28 29 3b 0a    srandomdev();.
22c50 20 20 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d        unixEnterM
22c60 75 74 65 78 28 29 3b 0a 20 20 20 20 20 20 72 63  utex();.      rc
22c70 20 3d 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f   = findInodeInfo
22c80 28 70 4e 65 77 2c 20 26 70 4e 65 77 2d 3e 70 49  (pNew, &pNew->pI
22c90 6e 6f 64 65 29 3b 0a 20 20 20 20 20 20 69 66 28  node);.      if(
22ca0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
22cb0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
22cc0 33 5f 66 72 65 65 28 70 4e 65 77 2d 3e 6c 6f 63  3_free(pNew->loc
22cd0 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3b 0a 20 20  kingContext);.  
22ce0 20 20 20 20 20 20 63 6c 6f 73 65 28 68 29 3b 0a        close(h);.
22cf0 20 20 20 20 20 20 20 20 68 20 3d 20 2d 31 3b 0a          h = -1;.
22d00 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 75 6e        }.      un
22d10 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 20  ixLeaveMutex(); 
22d20 20 20 20 20 20 20 20 0a 20 20 20 20 7d 0a 20 20         .    }.  
22d30 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 65 6c 73 65  }.#endif..  else
22d40 20 69 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79   if( pLockingSty
22d50 6c 65 20 3d 3d 20 26 64 6f 74 6c 6f 63 6b 49 6f  le == &dotlockIo
22d60 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f  Methods ){.    /
22d70 2a 20 44 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e  * Dotfile lockin
22d80 67 20 75 73 65 73 20 74 68 65 20 66 69 6c 65 20  g uses the file 
22d90 70 61 74 68 20 73 6f 20 69 74 20 6e 65 65 64 73  path so it needs
22da0 20 74 6f 20 62 65 20 69 6e 63 6c 75 64 65 64 20   to be included 
22db0 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 6f  in.    ** the do
22dc0 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74  tlockLockingCont
22dd0 65 78 74 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ext .    */.    
22de0 63 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 3b  char *zLockFile;
22df0 0a 20 20 20 20 69 6e 74 20 6e 46 69 6c 65 6e 61  .    int nFilena
22e00 6d 65 3b 0a 20 20 20 20 6e 46 69 6c 65 6e 61 6d  me;.    nFilenam
22e10 65 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28  e = (int)strlen(
22e20 7a 46 69 6c 65 6e 61 6d 65 29 20 2b 20 36 3b 0a  zFilename) + 6;.
22e30 20 20 20 20 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20      zLockFile = 
22e40 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f  (char *)sqlite3_
22e50 6d 61 6c 6c 6f 63 28 6e 46 69 6c 65 6e 61 6d 65  malloc(nFilename
22e60 29 3b 0a 20 20 20 20 69 66 28 20 7a 4c 6f 63 6b  );.    if( zLock
22e70 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  File==0 ){.     
22e80 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
22e90 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  EM;.    }else{. 
22ea0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
22eb0 72 69 6e 74 66 28 6e 46 69 6c 65 6e 61 6d 65 2c  rintf(nFilename,
22ec0 20 7a 4c 6f 63 6b 46 69 6c 65 2c 20 22 25 73 22   zLockFile, "%s"
22ed0 20 44 4f 54 4c 4f 43 4b 5f 53 55 46 46 49 58 2c   DOTLOCK_SUFFIX,
22ee0 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20   zFilename);.   
22ef0 20 7d 0a 20 20 20 20 70 4e 65 77 2d 3e 6c 6f 63   }.    pNew->loc
22f00 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20 7a 4c  kingContext = zL
22f10 6f 63 6b 46 69 6c 65 3b 0a 20 20 7d 0a 0a 23 69  ockFile;.  }..#i
22f20 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 65  f OS_VXWORKS.  e
22f30 6c 73 65 20 69 66 28 20 70 4c 6f 63 6b 69 6e 67  lse if( pLocking
22f40 53 74 79 6c 65 20 3d 3d 20 26 73 65 6d 49 6f 4d  Style == &semIoM
22f50 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f 2a  ethods ){.    /*
22f60 20 4e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65   Named semaphore
22f70 20 6c 6f 63 6b 69 6e 67 20 75 73 65 73 20 74 68   locking uses th
22f80 65 20 66 69 6c 65 20 70 61 74 68 20 73 6f 20 69  e file path so i
22f90 74 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20  t needs to be.  
22fa0 20 20 2a 2a 20 69 6e 63 6c 75 64 65 64 20 69 6e    ** included in
22fb0 20 74 68 65 20 73 65 6d 4c 6f 63 6b 69 6e 67 43   the semLockingC
22fc0 6f 6e 74 65 78 74 0a 20 20 20 20 2a 2f 0a 20 20  ontext.    */.  
22fd0 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
22fe0 28 29 3b 0a 20 20 20 20 72 63 20 3d 20 66 69 6e  ();.    rc = fin
22ff0 64 49 6e 6f 64 65 49 6e 66 6f 28 70 4e 65 77 2c  dInodeInfo(pNew,
23000 20 26 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 29 3b   &pNew->pInode);
23010 0a 20 20 20 20 69 66 28 20 28 72 63 3d 3d 53 51  .    if( (rc==SQ
23020 4c 49 54 45 5f 4f 4b 29 20 26 26 20 28 70 4e 65  LITE_OK) && (pNe
23030 77 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 3d  w->pInode->pSem=
23040 3d 4e 55 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20  =NULL) ){.      
23050 63 68 61 72 20 2a 7a 53 65 6d 4e 61 6d 65 20 3d  char *zSemName =
23060 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 61   pNew->pInode->a
23070 53 65 6d 4e 61 6d 65 3b 0a 20 20 20 20 20 20 69  SemName;.      i
23080 6e 74 20 6e 3b 0a 20 20 20 20 20 20 73 71 6c 69  nt n;.      sqli
23090 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 41 58  te3_snprintf(MAX
230a0 5f 50 41 54 48 4e 41 4d 45 2c 20 7a 53 65 6d 4e  _PATHNAME, zSemN
230b0 61 6d 65 2c 20 22 2f 25 73 2e 73 65 6d 22 2c 0a  ame, "/%s.sem",.
230c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
230d0 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 49 64         pNew->pId
230e0 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65  ->zCanonicalName
230f0 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 20 6e 3d  );.      for( n=
23100 31 3b 20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d 3b 20  1; zSemName[n]; 
23110 6e 2b 2b 20 29 0a 20 20 20 20 20 20 20 20 69 66  n++ ).        if
23120 28 20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d 3d 3d 27  ( zSemName[n]=='
23130 2f 27 20 29 20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d  /' ) zSemName[n]
23140 20 3d 20 27 5f 27 3b 0a 20 20 20 20 20 20 70 4e   = '_';.      pN
23150 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d  ew->pInode->pSem
23160 20 3d 20 73 65 6d 5f 6f 70 65 6e 28 7a 53 65 6d   = sem_open(zSem
23170 4e 61 6d 65 2c 20 4f 5f 43 52 45 41 54 2c 20 30  Name, O_CREAT, 0
23180 36 36 36 2c 20 31 29 3b 0a 20 20 20 20 20 20 69  666, 1);.      i
23190 66 28 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d  f( pNew->pInode-
231a0 3e 70 53 65 6d 20 3d 3d 20 53 45 4d 5f 46 41 49  >pSem == SEM_FAI
231b0 4c 45 44 20 29 7b 0a 20 20 20 20 20 20 20 20 72  LED ){.        r
231c0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
231d0 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
231e0 70 49 6e 6f 64 65 2d 3e 61 53 65 6d 4e 61 6d 65  pInode->aSemName
231f0 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20  [0] = '\0';.    
23200 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e    }.    }.    un
23210 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
23220 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20    }.#endif.  .  
23230 70 4e 65 77 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  pNew->lastErrno 
23240 3d 20 30 3b 0a 23 69 66 20 4f 53 5f 56 58 57 4f  = 0;.#if OS_VXWO
23250 52 4b 53 0a 20 20 69 66 28 20 72 63 21 3d 53 51  RKS.  if( rc!=SQ
23260 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
23270 66 28 20 68 3e 3d 30 20 29 20 63 6c 6f 73 65 28  f( h>=0 ) close(
23280 68 29 3b 0a 20 20 20 20 68 20 3d 20 2d 31 3b 0a  h);.    h = -1;.
23290 20 20 20 20 75 6e 6c 69 6e 6b 28 7a 46 69 6c 65      unlink(zFile
232a0 6e 61 6d 65 29 3b 0a 20 20 20 20 69 73 44 65 6c  name);.    isDel
232b0 65 74 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70  ete = 0;.  }.  p
232c0 4e 65 77 2d 3e 69 73 44 65 6c 65 74 65 20 3d 20  New->isDelete = 
232d0 69 73 44 65 6c 65 74 65 3b 0a 23 65 6e 64 69 66  isDelete;.#endif
232e0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
232f0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
23300 64 69 72 66 64 3e 3d 30 20 29 20 63 6c 6f 73 65  dirfd>=0 ) close
23310 28 64 69 72 66 64 29 3b 20 2f 2a 20 73 69 6c 65  (dirfd); /* sile
23320 6e 74 20 6c 65 61 6b 20 69 66 20 66 61 69 6c 2c  nt leak if fail,
23330 20 61 6c 72 65 61 64 79 20 69 6e 20 65 72 72 6f   already in erro
23340 72 20 2a 2f 0a 20 20 20 20 69 66 28 20 68 3e 3d  r */.    if( h>=
23350 30 20 29 20 63 6c 6f 73 65 28 68 29 3b 0a 20 20  0 ) close(h);.  
23360 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4e 65 77 2d  }else{.    pNew-
23370 3e 70 4d 65 74 68 6f 64 20 3d 20 70 4c 6f 63 6b  >pMethod = pLock
23380 69 6e 67 53 74 79 6c 65 3b 0a 20 20 20 20 4f 70  ingStyle;.    Op
23390 65 6e 43 6f 75 6e 74 65 72 28 2b 31 29 3b 0a 20  enCounter(+1);. 
233a0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
233b0 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20  }../*.** Open a 
233c0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
233d0 74 6f 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  to the directory
233e0 20 63 6f 6e 74 61 69 6e 69 6e 67 20 66 69 6c 65   containing file
233f0 20 7a 46 69 6c 65 6e 61 6d 65 2e 0a 2a 2a 20 49   zFilename..** I
23400 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 2a 70  f successful, *p
23410 46 64 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  Fd is set to the
23420 20 6f 70 65 6e 65 64 20 66 69 6c 65 20 64 65 73   opened file des
23430 63 72 69 70 74 6f 72 20 61 6e 64 0a 2a 2a 20 53  criptor and.** S
23440 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
23450 72 6e 65 64 2e 20 49 66 20 61 6e 20 65 72 72 6f  rned. If an erro
23460 72 20 6f 63 63 75 72 73 2c 20 65 69 74 68 65 72  r occurs, either
23470 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a   SQLITE_NOMEM.**
23480 20 6f 72 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f   or SQLITE_CANTO
23490 50 45 4e 20 69 73 20 72 65 74 75 72 6e 65 64 20  PEN is returned 
234a0 61 6e 64 20 2a 70 46 64 20 69 73 20 73 65 74 20  and *pFd is set 
234b0 74 6f 20 61 6e 20 75 6e 64 65 66 69 6e 65 64 0a  to an undefined.
234c0 2a 2a 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20  ** value..**.** 
234d0 49 66 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  If SQLITE_OK is 
234e0 72 65 74 75 72 6e 65 64 2c 20 74 68 65 20 63 61  returned, the ca
234f0 6c 6c 65 72 20 69 73 20 72 65 73 70 6f 6e 73 69  ller is responsi
23500 62 6c 65 20 66 6f 72 20 63 6c 6f 73 69 6e 67 0a  ble for closing.
23510 2a 2a 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  ** the file desc
23520 72 69 70 74 6f 72 20 2a 70 46 64 20 75 73 69 6e  riptor *pFd usin
23530 67 20 63 6c 6f 73 65 28 29 2e 0a 2a 2f 0a 73 74  g close()..*/.st
23540 61 74 69 63 20 69 6e 74 20 6f 70 65 6e 44 69 72  atic int openDir
23550 65 63 74 6f 72 79 28 63 6f 6e 73 74 20 63 68 61  ectory(const cha
23560 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 69 6e  r *zFilename, in
23570 74 20 2a 70 46 64 29 7b 0a 20 20 69 6e 74 20 69  t *pFd){.  int i
23580 69 3b 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d 31  i;.  int fd = -1
23590 3b 0a 20 20 63 68 61 72 20 7a 44 69 72 6e 61 6d  ;.  char zDirnam
235a0 65 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 31  e[MAX_PATHNAME+1
235b0 5d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e  ];..  sqlite3_sn
235c0 70 72 69 6e 74 66 28 4d 41 58 5f 50 41 54 48 4e  printf(MAX_PATHN
235d0 41 4d 45 2c 20 7a 44 69 72 6e 61 6d 65 2c 20 22  AME, zDirname, "
235e0 25 73 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b  %s", zFilename);
235f0 0a 20 20 66 6f 72 28 69 69 3d 28 69 6e 74 29 73  .  for(ii=(int)s
23600 74 72 6c 65 6e 28 7a 44 69 72 6e 61 6d 65 29 3b  trlen(zDirname);
23610 20 69 69 3e 31 20 26 26 20 7a 44 69 72 6e 61 6d   ii>1 && zDirnam
23620 65 5b 69 69 5d 21 3d 27 2f 27 3b 20 69 69 2d 2d  e[ii]!='/'; ii--
23630 29 3b 0a 20 20 69 66 28 20 69 69 3e 30 20 29 7b  );.  if( ii>0 ){
23640 0a 20 20 20 20 7a 44 69 72 6e 61 6d 65 5b 69 69  .    zDirname[ii
23650 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 66 64  ] = '\0';.    fd
23660 20 3d 20 6f 70 65 6e 28 7a 44 69 72 6e 61 6d 65   = open(zDirname
23670 2c 20 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f 42 49 4e  , O_RDONLY|O_BIN
23680 41 52 59 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  ARY, 0);.    if(
23690 20 66 64 3e 3d 30 20 29 7b 0a 23 69 66 64 65 66   fd>=0 ){.#ifdef
236a0 20 46 44 5f 43 4c 4f 45 58 45 43 0a 20 20 20 20   FD_CLOEXEC.    
236b0 20 20 66 63 6e 74 6c 28 66 64 2c 20 46 5f 53 45    fcntl(fd, F_SE
236c0 54 46 44 2c 20 66 63 6e 74 6c 28 66 64 2c 20 46  TFD, fcntl(fd, F
236d0 5f 47 45 54 46 44 2c 20 30 29 20 7c 20 46 44 5f  _GETFD, 0) | FD_
236e0 43 4c 4f 45 58 45 43 29 3b 0a 23 65 6e 64 69 66  CLOEXEC);.#endif
236f0 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
23700 22 4f 50 45 4e 44 49 52 20 25 2d 33 64 20 25 73  "OPENDIR %-3d %s
23710 5c 6e 22 2c 20 66 64 2c 20 7a 44 69 72 6e 61 6d  \n", fd, zDirnam
23720 65 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  e));.    }.  }. 
23730 20 2a 70 46 64 20 3d 20 66 64 3b 0a 20 20 72 65   *pFd = fd;.  re
23740 74 75 72 6e 20 28 66 64 3e 3d 30 3f 53 51 4c 49  turn (fd>=0?SQLI
23750 54 45 5f 4f 4b 3a 53 51 4c 49 54 45 5f 43 41 4e  TE_OK:SQLITE_CAN
23760 54 4f 50 45 4e 5f 42 4b 50 54 29 3b 0a 7d 0a 0a  TOPEN_BKPT);.}..
23770 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 74  /*.** Create a t
23780 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 6e 61  emporary file na
23790 6d 65 20 69 6e 20 7a 42 75 66 2e 20 20 7a 42 75  me in zBuf.  zBu
237a0 66 20 6d 75 73 74 20 62 65 20 61 6c 6c 6f 63 61  f must be alloca
237b0 74 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 63 61  ted.** by the ca
237c0 6c 6c 69 6e 67 20 70 72 6f 63 65 73 73 20 61 6e  lling process an
237d0 64 20 6d 75 73 74 20 62 65 20 62 69 67 20 65 6e  d must be big en
237e0 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 61 74 20  ough to hold at 
237f0 6c 65 61 73 74 0a 2a 2a 20 70 56 66 73 2d 3e 6d  least.** pVfs->m
23800 78 50 61 74 68 6e 61 6d 65 20 62 79 74 65 73 2e  xPathname bytes.
23810 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67  .*/.static int g
23820 65 74 54 65 6d 70 6e 61 6d 65 28 69 6e 74 20 6e  etTempname(int n
23830 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29  Buf, char *zBuf)
23840 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  {.  static const
23850 20 63 68 61 72 20 2a 61 7a 44 69 72 73 5b 5d 20   char *azDirs[] 
23860 3d 20 7b 0a 20 20 20 20 20 30 2c 0a 20 20 20 20  = {.     0,.    
23870 20 30 2c 0a 20 20 20 20 20 22 2f 76 61 72 2f 74   0,.     "/var/t
23880 6d 70 22 2c 0a 20 20 20 20 20 22 2f 75 73 72 2f  mp",.     "/usr/
23890 74 6d 70 22 2c 0a 20 20 20 20 20 22 2f 74 6d 70  tmp",.     "/tmp
238a0 22 2c 0a 20 20 20 20 20 22 2e 22 2c 0a 20 20 7d  ",.     ".",.  }
238b0 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  ;.  static const
238c0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 7a   unsigned char z
238d0 43 68 61 72 73 5b 5d 20 3d 0a 20 20 20 20 22 61  Chars[] =.    "a
238e0 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71  bcdefghijklmnopq
238f0 72 73 74 75 76 77 78 79 7a 22 0a 20 20 20 20 22  rstuvwxyz".    "
23900 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50  ABCDEFGHIJKLMNOP
23910 51 52 53 54 55 56 57 58 59 5a 22 0a 20 20 20 20  QRSTUVWXYZ".    
23920 22 30 31 32 33 34 35 36 37 38 39 22 3b 0a 20 20  "0123456789";.  
23930 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 2c 20  unsigned int i, 
23940 6a 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74  j;.  struct stat
23950 20 62 75 66 3b 0a 20 20 63 6f 6e 73 74 20 63 68   buf;.  const ch
23960 61 72 20 2a 7a 44 69 72 20 3d 20 22 2e 22 3b 0a  ar *zDir = ".";.
23970 0a 20 20 2f 2a 20 49 74 27 73 20 6f 64 64 20 74  .  /* It's odd t
23980 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e 20 69 6f  o simulate an io
23990 2d 65 72 72 6f 72 20 68 65 72 65 2c 20 62 75 74  -error here, but
239a0 20 72 65 61 6c 6c 79 20 74 68 69 73 20 69 73 20   really this is 
239b0 6a 75 73 74 0a 20 20 2a 2a 20 75 73 69 6e 67 20  just.  ** using 
239c0 74 68 65 20 69 6f 2d 65 72 72 6f 72 20 69 6e 66  the io-error inf
239d0 72 61 73 74 72 75 63 74 75 72 65 20 74 6f 20 74  rastructure to t
239e0 65 73 74 20 74 68 61 74 20 53 51 4c 69 74 65 20  est that SQLite 
239f0 68 61 6e 64 6c 65 73 20 74 68 69 73 0a 20 20 2a  handles this.  *
23a00 2a 20 66 75 6e 63 74 69 6f 6e 20 66 61 69 6c 69  * function faili
23a10 6e 67 2e 20 0a 20 20 2a 2f 0a 20 20 53 69 6d 75  ng. .  */.  Simu
23a20 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74  lateIOError( ret
23a30 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
23a40 20 29 3b 0a 0a 20 20 61 7a 44 69 72 73 5b 30 5d   );..  azDirs[0]
23a50 20 3d 20 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f   = sqlite3_temp_
23a60 64 69 72 65 63 74 6f 72 79 3b 0a 20 20 69 66 20  directory;.  if 
23a70 28 4e 55 4c 4c 20 3d 3d 20 61 7a 44 69 72 73 5b  (NULL == azDirs[
23a80 31 5d 29 20 7b 0a 20 20 20 20 61 7a 44 69 72 73  1]) {.    azDirs
23a90 5b 31 5d 20 3d 20 67 65 74 65 6e 76 28 22 54 4d  [1] = getenv("TM
23aa0 50 44 49 52 22 29 3b 0a 20 20 7d 0a 20 20 0a 20  PDIR");.  }.  . 
23ab0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65   for(i=0; i<size
23ac0 6f 66 28 61 7a 44 69 72 73 29 2f 73 69 7a 65 6f  of(azDirs)/sizeo
23ad0 66 28 61 7a 44 69 72 73 5b 30 5d 29 3b 20 69 2b  f(azDirs[0]); i+
23ae0 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 7a 44 69  +){.    if( azDi
23af0 72 73 5b 69 5d 3d 3d 30 20 29 20 63 6f 6e 74 69  rs[i]==0 ) conti
23b00 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 73 74 61  nue;.    if( sta
23b10 74 28 61 7a 44 69 72 73 5b 69 5d 2c 20 26 62 75  t(azDirs[i], &bu
23b20 66 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  f) ) continue;. 
23b30 20 20 20 69 66 28 20 21 53 5f 49 53 44 49 52 28     if( !S_ISDIR(
23b40 62 75 66 2e 73 74 5f 6d 6f 64 65 29 20 29 20 63  buf.st_mode) ) c
23b50 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
23b60 20 61 63 63 65 73 73 28 61 7a 44 69 72 73 5b 69   access(azDirs[i
23b70 5d 2c 20 30 37 29 20 29 20 63 6f 6e 74 69 6e 75  ], 07) ) continu
23b80 65 3b 0a 20 20 20 20 7a 44 69 72 20 3d 20 61 7a  e;.    zDir = az
23b90 44 69 72 73 5b 69 5d 3b 0a 20 20 20 20 62 72 65  Dirs[i];.    bre
23ba0 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68  ak;.  }..  /* Ch
23bb0 65 63 6b 20 74 68 61 74 20 74 68 65 20 6f 75 74  eck that the out
23bc0 70 75 74 20 62 75 66 66 65 72 20 69 73 20 6c 61  put buffer is la
23bd0 72 67 65 20 65 6e 6f 75 67 68 20 66 6f 72 20 74  rge enough for t
23be0 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  he temporary fil
23bf0 65 20 0a 20 20 2a 2a 20 6e 61 6d 65 2e 20 49 66  e .  ** name. If
23c00 20 69 74 20 69 73 20 6e 6f 74 2c 20 72 65 74 75   it is not, retu
23c10 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e  rn SQLITE_ERROR.
23c20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 73 74 72  .  */.  if( (str
23c30 6c 65 6e 28 7a 44 69 72 29 20 2b 20 73 74 72 6c  len(zDir) + strl
23c40 65 6e 28 53 51 4c 49 54 45 5f 54 45 4d 50 5f 46  en(SQLITE_TEMP_F
23c50 49 4c 45 5f 50 52 45 46 49 58 29 20 2b 20 31 37  ILE_PREFIX) + 17
23c60 29 20 3e 3d 20 28 73 69 7a 65 5f 74 29 6e 42 75  ) >= (size_t)nBu
23c70 66 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  f ){.    return 
23c80 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
23c90 7d 0a 0a 20 20 64 6f 7b 0a 20 20 20 20 73 71 6c  }..  do{.    sql
23ca0 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42  ite3_snprintf(nB
23cb0 75 66 2d 31 37 2c 20 7a 42 75 66 2c 20 22 25 73  uf-17, zBuf, "%s
23cc0 2f 22 53 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49  /"SQLITE_TEMP_FI
23cd0 4c 45 5f 50 52 45 46 49 58 2c 20 7a 44 69 72 29  LE_PREFIX, zDir)
23ce0 3b 0a 20 20 20 20 6a 20 3d 20 28 69 6e 74 29 73  ;.    j = (int)s
23cf0 74 72 6c 65 6e 28 7a 42 75 66 29 3b 0a 20 20 20  trlen(zBuf);.   
23d00 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e   sqlite3_randomn
23d10 65 73 73 28 31 35 2c 20 26 7a 42 75 66 5b 6a 5d  ess(15, &zBuf[j]
23d20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
23d30 69 3c 31 35 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b  i<15; i++, j++){
23d40 0a 20 20 20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d  .      zBuf[j] =
23d50 20 28 63 68 61 72 29 7a 43 68 61 72 73 5b 20 28   (char)zChars[ (
23d60 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 7a  (unsigned char)z
23d70 42 75 66 5b 6a 5d 29 25 28 73 69 7a 65 6f 66 28  Buf[j])%(sizeof(
23d80 7a 43 68 61 72 73 29 2d 31 29 20 5d 3b 0a 20 20  zChars)-1) ];.  
23d90 20 20 7d 0a 20 20 20 20 7a 42 75 66 5b 6a 5d 20    }.    zBuf[j] 
23da0 3d 20 30 3b 0a 20 20 7d 77 68 69 6c 65 28 20 61  = 0;.  }while( a
23db0 63 63 65 73 73 28 7a 42 75 66 2c 30 29 3d 3d 30  ccess(zBuf,0)==0
23dc0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   );.  return SQL
23dd0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53  ITE_OK;.}..#if S
23de0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
23df0 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65  KING_STYLE && de
23e00 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
23e10 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65 20 74  ./*.** Routine t
23e20 6f 20 74 72 61 6e 73 66 6f 72 6d 20 61 20 75 6e  o transform a un
23e30 69 78 46 69 6c 65 20 69 6e 74 6f 20 61 20 70 72  ixFile into a pr
23e40 6f 78 79 2d 6c 6f 63 6b 69 6e 67 20 75 6e 69 78  oxy-locking unix
23e50 46 69 6c 65 2e 0a 2a 2a 20 49 6d 70 6c 65 6d 65  File..** Impleme
23e60 6e 74 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 70  ntation in the p
23e70 72 6f 78 79 2d 6c 6f 63 6b 20 64 69 76 69 73 69  roxy-lock divisi
23e80 6f 6e 2c 20 62 75 74 20 75 73 65 64 20 62 79 20  on, but used by 
23e90 75 6e 69 78 4f 70 65 6e 28 29 0a 2a 2a 20 69 66  unixOpen().** if
23ea0 20 53 51 4c 49 54 45 5f 50 52 45 46 45 52 5f 50   SQLITE_PREFER_P
23eb0 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 20 69 73 20  ROXY_LOCKING is 
23ec0 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  defined..*/.stat
23ed0 69 63 20 69 6e 74 20 70 72 6f 78 79 54 72 61 6e  ic int proxyTran
23ee0 73 66 6f 72 6d 55 6e 69 78 46 69 6c 65 28 75 6e  sformUnixFile(un
23ef0 69 78 46 69 6c 65 2a 2c 20 63 6f 6e 73 74 20 63  ixFile*, const c
23f00 68 61 72 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f  har*);.#endif../
23f10 2a 0a 2a 2a 20 53 65 61 72 63 68 20 66 6f 72 20  *.** Search for 
23f20 61 6e 20 75 6e 75 73 65 64 20 66 69 6c 65 20 64  an unused file d
23f30 65 73 63 72 69 70 74 6f 72 20 74 68 61 74 20 77  escriptor that w
23f40 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68 65  as opened on the
23f50 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 66 69   database .** fi
23f60 6c 65 20 28 6e 6f 74 20 61 20 6a 6f 75 72 6e 61  le (not a journa
23f70 6c 20 6f 72 20 6d 61 73 74 65 72 2d 6a 6f 75 72  l or master-jour
23f80 6e 61 6c 20 66 69 6c 65 29 20 69 64 65 6e 74 69  nal file) identi
23f90 66 69 65 64 20 62 79 20 70 61 74 68 6e 61 6d 65  fied by pathname
23fa0 0a 2a 2a 20 7a 50 61 74 68 20 77 69 74 68 20 53  .** zPath with S
23fb0 51 4c 49 54 45 5f 4f 50 45 4e 5f 58 58 58 20 66  QLITE_OPEN_XXX f
23fc0 6c 61 67 73 20 6d 61 74 63 68 69 6e 67 20 74 68  lags matching th
23fd0 6f 73 65 20 70 61 73 73 65 64 20 61 73 20 74 68  ose passed as th
23fe0 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 61 72 67 75  e second.** argu
23ff0 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e  ment to this fun
24000 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 53 75 63  ction..**.** Suc
24010 68 20 61 20 66 69 6c 65 20 64 65 73 63 72 69 70  h a file descrip
24020 74 6f 72 20 6d 61 79 20 65 78 69 73 74 20 69 66  tor may exist if
24030 20 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e   a database conn
24040 65 63 74 69 6f 6e 20 77 61 73 20 63 6c 6f 73 65  ection was close
24050 64 0a 2a 2a 20 62 75 74 20 74 68 65 20 61 73 73  d.** but the ass
24060 6f 63 69 61 74 65 64 20 66 69 6c 65 20 64 65 73  ociated file des
24070 63 72 69 70 74 6f 72 20 63 6f 75 6c 64 20 6e 6f  criptor could no
24080 74 20 62 65 20 63 6c 6f 73 65 64 20 62 65 63 61  t be closed beca
24090 75 73 65 20 73 6f 6d 65 0a 2a 2a 20 6f 74 68 65  use some.** othe
240a0 72 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  r file descripto
240b0 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73 61  r open on the sa
240c0 6d 65 20 66 69 6c 65 20 69 73 20 68 6f 6c 64 69  me file is holdi
240d0 6e 67 20 61 20 66 69 6c 65 2d 6c 6f 63 6b 2e 0a  ng a file-lock..
240e0 2a 2a 20 52 65 66 65 72 20 74 6f 20 63 6f 6d 6d  ** Refer to comm
240f0 65 6e 74 73 20 69 6e 20 74 68 65 20 75 6e 69 78  ents in the unix
24100 43 6c 6f 73 65 28 29 20 66 75 6e 63 74 69 6f 6e  Close() function
24110 20 61 6e 64 20 74 68 65 20 6c 65 6e 67 74 68 79   and the lengthy
24120 20 63 6f 6d 6d 65 6e 74 0a 2a 2a 20 64 65 73 63   comment.** desc
24130 72 69 62 69 6e 67 20 22 50 6f 73 69 78 20 41 64  ribing "Posix Ad
24140 76 69 73 6f 72 79 20 4c 6f 63 6b 69 6e 67 22 20  visory Locking" 
24150 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
24160 74 68 69 73 20 66 69 6c 65 20 66 6f 72 20 0a 2a  this file for .*
24170 2a 20 66 75 72 74 68 65 72 20 64 65 74 61 69 6c  * further detail
24180 73 2e 20 41 6c 73 6f 2c 20 74 69 63 6b 65 74 20  s. Also, ticket 
24190 23 34 30 31 38 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  #4018..**.** If 
241a0 61 20 73 75 69 74 61 62 6c 65 20 66 69 6c 65 20  a suitable file 
241b0 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 66 6f  descriptor is fo
241c0 75 6e 64 2c 20 74 68 65 6e 20 69 74 20 69 73 20  und, then it is 
241d0 72 65 74 75 72 6e 65 64 2e 20 49 66 20 6e 6f 0a  returned. If no.
241e0 2a 2a 20 73 75 63 68 20 66 69 6c 65 20 64 65 73  ** such file des
241f0 63 72 69 70 74 6f 72 20 69 73 20 6c 6f 63 61 74  criptor is locat
24200 65 64 2c 20 2d 31 20 69 73 20 72 65 74 75 72 6e  ed, -1 is return
24210 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 55 6e  ed..*/.static Un
24220 69 78 55 6e 75 73 65 64 46 64 20 2a 66 69 6e 64  ixUnusedFd *find
24230 52 65 75 73 61 62 6c 65 46 64 28 63 6f 6e 73 74  ReusableFd(const
24240 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 69 6e   char *zPath, in
24250 74 20 66 6c 61 67 73 29 7b 0a 20 20 55 6e 69 78  t flags){.  Unix
24260 55 6e 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65  UnusedFd *pUnuse
24270 64 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 44 6f 20  d = 0;..  /* Do 
24280 6e 6f 74 20 73 65 61 72 63 68 20 66 6f 72 20 61  not search for a
24290 6e 20 75 6e 75 73 65 64 20 66 69 6c 65 20 64 65  n unused file de
242a0 73 63 72 69 70 74 6f 72 20 6f 6e 20 76 78 77 6f  scriptor on vxwo
242b0 72 6b 73 2e 20 4e 6f 74 20 62 65 63 61 75 73 65  rks. Not because
242c0 0a 20 20 2a 2a 20 76 78 77 6f 72 6b 73 20 77 6f  .  ** vxworks wo
242d0 75 6c 64 20 6e 6f 74 20 62 65 6e 65 66 69 74 20  uld not benefit 
242e0 66 72 6f 6d 20 74 68 65 20 63 68 61 6e 67 65 20  from the change 
242f0 28 69 74 20 6d 69 67 68 74 2c 20 77 65 27 72 65  (it might, we're
24300 20 6e 6f 74 20 73 75 72 65 29 2c 0a 20 20 2a 2a   not sure),.  **
24310 20 62 75 74 20 62 65 63 61 75 73 65 20 6e 6f 20   but because no 
24320 77 61 79 20 74 6f 20 74 65 73 74 20 69 74 20 69  way to test it i
24330 73 20 63 75 72 72 65 6e 74 6c 79 20 61 76 61 69  s currently avai
24340 6c 61 62 6c 65 2e 20 49 74 20 69 73 20 62 65 74  lable. It is bet
24350 74 65 72 20 0a 20 20 2a 2a 20 6e 6f 74 20 74 6f  ter .  ** not to
24360 20 72 69 73 6b 20 62 72 65 61 6b 69 6e 67 20 76   risk breaking v
24370 78 77 6f 72 6b 73 20 73 75 70 70 6f 72 74 20 66  xworks support f
24380 6f 72 20 74 68 65 20 73 61 6b 65 20 6f 66 20 73  or the sake of s
24390 75 63 68 20 61 6e 20 6f 62 73 63 75 72 65 20 0a  uch an obscure .
243a0 20 20 2a 2a 20 66 65 61 74 75 72 65 2e 20 20 2a    ** feature.  *
243b0 2f 0a 23 69 66 20 21 4f 53 5f 56 58 57 4f 52 4b  /.#if !OS_VXWORK
243c0 53 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 20  S.  struct stat 
243d0 73 53 74 61 74 3b 20 20 20 20 20 20 20 20 20 20  sStat;          
243e0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
243f0 6c 74 73 20 6f 66 20 73 74 61 74 28 29 20 63 61  lts of stat() ca
24400 6c 6c 20 2a 2f 0a 0a 20 20 2f 2a 20 41 20 73 74  ll */..  /* A st
24410 61 74 28 29 20 63 61 6c 6c 20 6d 61 79 20 66 61  at() call may fa
24420 69 6c 20 66 6f 72 20 76 61 72 69 6f 75 73 20 72  il for various r
24430 65 61 73 6f 6e 73 2e 20 49 66 20 74 68 69 73 20  easons. If this 
24440 68 61 70 70 65 6e 73 2c 20 69 74 20 69 73 0a 20  happens, it is. 
24450 20 2a 2a 20 61 6c 6d 6f 73 74 20 63 65 72 74 61   ** almost certa
24460 69 6e 20 74 68 61 74 20 61 6e 20 6f 70 65 6e 28  in that an open(
24470 29 20 63 61 6c 6c 20 6f 6e 20 74 68 65 20 73 61  ) call on the sa
24480 6d 65 20 70 61 74 68 20 77 69 6c 6c 20 61 6c 73  me path will als
24490 6f 20 66 61 69 6c 2e 0a 20 20 2a 2a 20 46 6f 72  o fail..  ** For
244a0 20 74 68 69 73 20 72 65 61 73 6f 6e 2c 20 69 66   this reason, if
244b0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
244c0 20 69 6e 20 74 68 65 20 73 74 61 74 28 29 20 63   in the stat() c
244d0 61 6c 6c 20 68 65 72 65 2c 20 69 74 20 69 73 0a  all here, it is.
244e0 20 20 2a 2a 20 69 67 6e 6f 72 65 64 20 61 6e 64    ** ignored and
244f0 20 2d 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e   -1 is returned.
24500 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c   The caller will
24510 20 74 72 79 20 74 6f 20 6f 70 65 6e 20 61 20 6e   try to open a n
24520 65 77 20 66 69 6c 65 0a 20 20 2a 2a 20 64 65 73  ew file.  ** des
24530 63 72 69 70 74 6f 72 20 6f 6e 20 74 68 65 20 73  criptor on the s
24540 61 6d 65 20 70 61 74 68 2c 20 66 61 69 6c 2c 20  ame path, fail, 
24550 61 6e 64 20 72 65 74 75 72 6e 20 61 6e 20 65 72  and return an er
24560 72 6f 72 20 74 6f 20 53 51 4c 69 74 65 2e 0a 20  ror to SQLite.. 
24570 20 2a 2a 0a 20 20 2a 2a 20 45 76 65 6e 20 69 66   **.  ** Even if
24580 20 61 20 73 75 62 73 65 71 75 65 6e 74 20 6f 70   a subsequent op
24590 65 6e 28 29 20 63 61 6c 6c 20 64 6f 65 73 20 73  en() call does s
245a0 75 63 63 65 65 64 2c 20 74 68 65 20 63 6f 6e 73  ucceed, the cons
245b0 65 71 75 65 6e 63 65 73 20 6f 66 0a 20 20 2a 2a  equences of.  **
245c0 20 6e 6f 74 20 73 65 61 72 63 68 69 6e 67 20 66   not searching f
245d0 6f 72 20 61 20 72 65 73 75 73 61 62 6c 65 20 66  or a resusable f
245e0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 61  ile descriptor a
245f0 72 65 20 6e 6f 74 20 64 69 72 65 2e 20 20 2a 2f  re not dire.  */
24600 0a 20 20 69 66 28 20 30 3d 3d 73 74 61 74 28 7a  .  if( 0==stat(z
24610 50 61 74 68 2c 20 26 73 53 74 61 74 29 20 29 7b  Path, &sStat) ){
24620 0a 20 20 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e  .    unixInodeIn
24630 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a 0a 20 20 20  fo *pInode;..   
24640 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
24650 29 3b 0a 20 20 20 20 70 49 6e 6f 64 65 20 3d 20  );.    pInode = 
24660 69 6e 6f 64 65 4c 69 73 74 3b 0a 20 20 20 20 77  inodeList;.    w
24670 68 69 6c 65 28 20 70 49 6e 6f 64 65 20 26 26 20  hile( pInode && 
24680 28 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2e  (pInode->fileId.
24690 64 65 76 21 3d 73 53 74 61 74 2e 73 74 5f 64 65  dev!=sStat.st_de
246a0 76 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v.              
246b0 20 20 20 20 20 20 20 7c 7c 20 70 49 6e 6f 64 65         || pInode
246c0 2d 3e 66 69 6c 65 49 64 2e 69 6e 6f 21 3d 73 53  ->fileId.ino!=sS
246d0 74 61 74 2e 73 74 5f 69 6e 6f 29 20 29 7b 0a 20  tat.st_ino) ){. 
246e0 20 20 20 20 20 20 70 49 6e 6f 64 65 20 3d 20 70        pInode = p
246f0 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a 20 20  Inode->pNext;.  
24700 20 20 7d 0a 20 20 20 20 69 66 28 20 70 49 6e 6f    }.    if( pIno
24710 64 65 20 29 7b 0a 20 20 20 20 20 20 55 6e 69 78  de ){.      Unix
24720 55 6e 75 73 65 64 46 64 20 2a 2a 70 70 3b 0a 20  UnusedFd **pp;. 
24730 20 20 20 20 20 66 6f 72 28 70 70 3d 26 70 49 6e       for(pp=&pIn
24740 6f 64 65 2d 3e 70 55 6e 75 73 65 64 3b 20 2a 70  ode->pUnused; *p
24750 70 20 26 26 20 28 2a 70 70 29 2d 3e 66 6c 61 67  p && (*pp)->flag
24760 73 21 3d 66 6c 61 67 73 3b 20 70 70 3d 26 28 28  s!=flags; pp=&((
24770 2a 70 70 29 2d 3e 70 4e 65 78 74 29 29 3b 0a 20  *pp)->pNext));. 
24780 20 20 20 20 20 70 55 6e 75 73 65 64 20 3d 20 2a       pUnused = *
24790 70 70 3b 0a 20 20 20 20 20 20 69 66 28 20 70 55  pp;.      if( pU
247a0 6e 75 73 65 64 20 29 7b 0a 20 20 20 20 20 20 20  nused ){.       
247b0 20 2a 70 70 20 3d 20 70 55 6e 75 73 65 64 2d 3e   *pp = pUnused->
247c0 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20  pNext;.      }. 
247d0 20 20 20 7d 0a 20 20 20 20 75 6e 69 78 4c 65 61     }.    unixLea
247e0 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a 23  veMutex();.  }.#
247f0 65 6e 64 69 66 20 20 20 20 2f 2a 20 69 66 20 21  endif    /* if !
24800 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 20 20  OS_VXWORKS */.  
24810 72 65 74 75 72 6e 20 70 55 6e 75 73 65 64 3b 0a  return pUnused;.
24820 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68  }../*.** Open th
24830 65 20 66 69 6c 65 20 7a 50 61 74 68 2e 0a 2a 2a  e file zPath..**
24840 20 0a 2a 2a 20 50 72 65 76 69 6f 75 73 6c 79 2c   .** Previously,
24850 20 74 68 65 20 53 51 4c 69 74 65 20 4f 53 20 6c   the SQLite OS l
24860 61 79 65 72 20 75 73 65 64 20 74 68 72 65 65 20  ayer used three 
24870 66 75 6e 63 74 69 6f 6e 73 20 69 6e 20 70 6c 61  functions in pla
24880 63 65 20 6f 66 20 74 68 69 73 0a 2a 2a 20 6f 6e  ce of this.** on
24890 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73 71 6c  e:.**.**     sql
248a0 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 57 72  ite3OsOpenReadWr
248b0 69 74 65 28 29 3b 0a 2a 2a 20 20 20 20 20 73 71  ite();.**     sq
248c0 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 4f  lite3OsOpenReadO
248d0 6e 6c 79 28 29 3b 0a 2a 2a 20 20 20 20 20 73 71  nly();.**     sq
248e0 6c 69 74 65 33 4f 73 4f 70 65 6e 45 78 63 6c 75  lite3OsOpenExclu
248f0 73 69 76 65 28 29 3b 0a 2a 2a 0a 2a 2a 20 54 68  sive();.**.** Th
24900 65 73 65 20 63 61 6c 6c 73 20 63 6f 72 72 65 73  ese calls corres
24910 70 6f 6e 64 20 74 6f 20 74 68 65 20 66 6f 6c 6c  pond to the foll
24920 6f 77 69 6e 67 20 63 6f 6d 62 69 6e 61 74 69 6f  owing combinatio
24930 6e 73 20 6f 66 20 66 6c 61 67 73 3a 0a 2a 2a 0a  ns of flags:.**.
24940 2a 2a 20 20 20 20 20 52 65 61 64 57 72 69 74 65  **     ReadWrite
24950 28 29 20 2d 3e 20 20 20 20 20 28 52 45 41 44 57  () ->     (READW
24960 52 49 54 45 20 7c 20 43 52 45 41 54 45 29 0a 2a  RITE | CREATE).*
24970 2a 20 20 20 20 20 52 65 61 64 4f 6e 6c 79 28 29  *     ReadOnly()
24980 20 20 2d 3e 20 20 20 20 20 28 52 45 41 44 4f 4e    ->     (READON
24990 4c 59 29 20 0a 2a 2a 20 20 20 20 20 4f 70 65 6e  LY) .**     Open
249a0 45 78 63 6c 75 73 69 76 65 28 29 20 2d 3e 20 28  Exclusive() -> (
249b0 52 45 41 44 57 52 49 54 45 20 7c 20 43 52 45 41  READWRITE | CREA
249c0 54 45 20 7c 20 45 58 43 4c 55 53 49 56 45 29 0a  TE | EXCLUSIVE).
249d0 2a 2a 0a 2a 2a 20 54 68 65 20 6f 6c 64 20 4f 70  **.** The old Op
249e0 65 6e 45 78 63 6c 75 73 69 76 65 28 29 20 61 63  enExclusive() ac
249f0 63 65 70 74 65 64 20 61 20 62 6f 6f 6c 65 61 6e  cepted a boolean
24a00 20 61 72 67 75 6d 65 6e 74 20 2d 20 22 64 65 6c   argument - "del
24a10 46 6c 61 67 22 2e 20 49 66 0a 2a 2a 20 74 72 75  Flag". If.** tru
24a20 65 2c 20 74 68 65 20 66 69 6c 65 20 77 61 73 20  e, the file was 
24a30 63 6f 6e 66 69 67 75 72 65 64 20 74 6f 20 62 65  configured to be
24a40 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64   automatically d
24a50 65 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65 0a  eleted when the.
24a60 2a 2a 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 63  ** file handle c
24a70 6c 6f 73 65 64 2e 20 54 6f 20 61 63 68 69 65 76  losed. To achiev
24a80 65 20 74 68 65 20 73 61 6d 65 20 65 66 66 65 63  e the same effec
24a90 74 20 75 73 69 6e 67 20 74 68 69 73 20 6e 65 77  t using this new
24aa0 20 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65 2c 20   .** interface, 
24ab0 61 64 64 20 74 68 65 20 44 45 4c 45 54 45 4f 4e  add the DELETEON
24ac0 43 4c 4f 53 45 20 66 6c 61 67 20 74 6f 20 74 68  CLOSE flag to th
24ad0 6f 73 65 20 73 70 65 63 69 66 69 65 64 20 61 62  ose specified ab
24ae0 6f 76 65 20 66 6f 72 20 0a 2a 2a 20 4f 70 65 6e  ove for .** Open
24af0 45 78 63 6c 75 73 69 76 65 28 29 2e 0a 2a 2f 0a  Exclusive()..*/.
24b00 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4f  static int unixO
24b10 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  pen(.  sqlite3_v
24b20 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20  fs *pVfs,       
24b30 20 20 20 20 2f 2a 20 54 68 65 20 56 46 53 20 66      /* The VFS f
24b40 6f 72 20 77 68 69 63 68 20 74 68 69 73 20 69 73  or which this is
24b50 20 74 68 65 20 78 4f 70 65 6e 20 6d 65 74 68 6f   the xOpen metho
24b60 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  d */.  const cha
24b70 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20  r *zPath,       
24b80 20 20 20 20 2f 2a 20 50 61 74 68 6e 61 6d 65 20      /* Pathname 
24b90 6f 66 20 66 69 6c 65 20 74 6f 20 62 65 20 6f 70  of file to be op
24ba0 65 6e 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ened */.  sqlite
24bb0 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20  3_file *pFile,  
24bc0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69         /* The fi
24bd0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f  le descriptor to
24be0 20 62 65 20 66 69 6c 6c 65 64 20 69 6e 20 2a 2f   be filled in */
24bf0 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20  .  int flags,   
24c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24c10 2f 2a 20 49 6e 70 75 74 20 66 6c 61 67 73 20 74  /* Input flags t
24c20 6f 20 63 6f 6e 74 72 6f 6c 20 74 68 65 20 6f 70  o control the op
24c30 65 6e 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 2a  ening */.  int *
24c40 70 4f 75 74 46 6c 61 67 73 20 20 20 20 20 20 20  pOutFlags       
24c50 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75          /* Outpu
24c60 74 20 66 6c 61 67 73 20 72 65 74 75 72 6e 65 64  t flags returned
24c70 20 74 6f 20 53 51 4c 69 74 65 20 63 6f 72 65 20   to SQLite core 
24c80 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65  */.){.  unixFile
24c90 20 2a 70 20 3d 20 28 75 6e 69 78 46 69 6c 65 20   *p = (unixFile 
24ca0 2a 29 70 46 69 6c 65 3b 0a 20 20 69 6e 74 20 66  *)pFile;.  int f
24cb0 64 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20  d = -1;         
24cc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
24cd0 65 20 64 65 73 63 72 69 70 74 6f 72 20 72 65 74  e descriptor ret
24ce0 75 72 6e 65 64 20 62 79 20 6f 70 65 6e 28 29 20  urned by open() 
24cf0 2a 2f 0a 20 20 69 6e 74 20 64 69 72 66 64 20 3d  */.  int dirfd =
24d00 20 2d 31 3b 20 20 20 20 20 20 20 20 20 20 20 20   -1;            
24d10 20 20 20 20 2f 2a 20 44 69 72 65 63 74 6f 72 79      /* Directory
24d20 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
24d30 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 65 6e 46 6c   */.  int openFl
24d40 61 67 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ags = 0;        
24d50 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 74 6f       /* Flags to
24d60 20 70 61 73 73 20 74 6f 20 6f 70 65 6e 28 29 20   pass to open() 
24d70 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70 65 20 3d  */.  int eType =
24d80 20 66 6c 61 67 73 26 30 78 46 46 46 46 46 46 30   flags&0xFFFFFF0
24d90 30 3b 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 66  0;  /* Type of f
24da0 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20  ile to open */. 
24db0 20 69 6e 74 20 6e 6f 4c 6f 63 6b 3b 20 20 20 20   int noLock;    
24dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24dd0 2f 2a 20 54 72 75 65 20 74 6f 20 6f 6d 69 74 20  /* True to omit 
24de0 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69 74 69 76  locking primitiv
24df0 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  es */.  int rc =
24e00 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
24e10 20 20 20 20 20 20 20 2f 2a 20 46 75 6e 63 74 69         /* Functi
24e20 6f 6e 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a  on Return Code *
24e30 2f 0a 0a 20 20 69 6e 74 20 69 73 45 78 63 6c 75  /..  int isExclu
24e40 73 69 76 65 20 20 3d 20 28 66 6c 61 67 73 20 26  sive  = (flags &
24e50 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43   SQLITE_OPEN_EXC
24e60 4c 55 53 49 56 45 29 3b 0a 20 20 69 6e 74 20 69  LUSIVE);.  int i
24e70 73 44 65 6c 65 74 65 20 20 20 20 20 3d 20 28 66  sDelete     = (f
24e80 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
24e90 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45  EN_DELETEONCLOSE
24ea0 29 3b 0a 20 20 69 6e 74 20 69 73 43 72 65 61 74  );.  int isCreat
24eb0 65 20 20 20 20 20 3d 20 28 66 6c 61 67 73 20 26  e     = (flags &
24ec0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45   SQLITE_OPEN_CRE
24ed0 41 54 45 29 3b 0a 20 20 69 6e 74 20 69 73 52 65  ATE);.  int isRe
24ee0 61 64 6f 6e 6c 79 20 20 20 3d 20 28 66 6c 61 67  adonly   = (flag
24ef0 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
24f00 52 45 41 44 4f 4e 4c 59 29 3b 0a 20 20 69 6e 74  READONLY);.  int
24f10 20 69 73 52 65 61 64 57 72 69 74 65 20 20 3d 20   isReadWrite  = 
24f20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
24f30 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 29 3b  OPEN_READWRITE);
24f40 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
24f50 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
24f60 0a 20 20 69 6e 74 20 69 73 41 75 74 6f 50 72 6f  .  int isAutoPro
24f70 78 79 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53  xy  = (flags & S
24f80 51 4c 49 54 45 5f 4f 50 45 4e 5f 41 55 54 4f 50  QLITE_OPEN_AUTOP
24f90 52 4f 58 59 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  ROXY);.#endif.. 
24fa0 20 2f 2a 20 49 66 20 63 72 65 61 74 69 6e 67 20   /* If creating 
24fb0 61 20 6d 61 73 74 65 72 20 6f 72 20 6d 61 69 6e  a master or main
24fc0 2d 66 69 6c 65 20 6a 6f 75 72 6e 61 6c 2c 20 74  -file journal, t
24fd0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c  his function wil
24fe0 6c 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 66 69  l open.  ** a fi
24ff0 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 20 6f 6e  le-descriptor on
25000 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 74   the directory t
25010 6f 6f 2e 20 54 68 65 20 66 69 72 73 74 20 74 69  oo. The first ti
25020 6d 65 20 75 6e 69 78 53 79 6e 63 28 29 0a 20 20  me unixSync().  
25030 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65  ** is called the
25040 20 64 69 72 65 63 74 6f 72 79 20 66 69 6c 65 20   directory file 
25050 64 65 73 63 72 69 70 74 6f 72 20 77 69 6c 6c 20  descriptor will 
25060 62 65 20 66 73 79 6e 63 28 29 65 64 20 61 6e 64  be fsync()ed and
25070 20 63 6c 6f 73 65 28 29 64 2e 0a 20 20 2a 2f 0a   close()d..  */.
25080 20 20 69 6e 74 20 69 73 4f 70 65 6e 44 69 72 65    int isOpenDire
25090 63 74 6f 72 79 20 3d 20 28 69 73 43 72 65 61 74  ctory = (isCreat
250a0 65 20 26 26 20 0a 20 20 20 20 20 20 28 65 54 79  e && .      (eTy
250b0 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
250c0 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 7c  MASTER_JOURNAL |
250d0 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
250e0 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
250f0 4c 29 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  L).  );..  /* If
25100 20 61 72 67 75 6d 65 6e 74 20 7a 50 61 74 68 20   argument zPath 
25110 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65  is a NULL pointe
25120 72 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  r, this function
25130 20 69 73 20 72 65 71 75 69 72 65 64 20 74 6f 20   is required to 
25140 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 74 65 6d 70  open.  ** a temp
25150 6f 72 61 72 79 20 66 69 6c 65 2e 20 55 73 65 20  orary file. Use 
25160 74 68 69 73 20 62 75 66 66 65 72 20 74 6f 20 73  this buffer to s
25170 74 6f 72 65 20 74 68 65 20 66 69 6c 65 20 6e 61  tore the file na
25180 6d 65 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 63 68  me in..  */.  ch
25190 61 72 20 7a 54 6d 70 6e 61 6d 65 5b 4d 41 58 5f  ar zTmpname[MAX_
251a0 50 41 54 48 4e 41 4d 45 2b 31 5d 3b 0a 20 20 63  PATHNAME+1];.  c
251b0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
251c0 20 3d 20 7a 50 61 74 68 3b 0a 0a 20 20 2f 2a 20   = zPath;..  /* 
251d0 43 68 65 63 6b 20 74 68 65 20 66 6f 6c 6c 6f 77  Check the follow
251e0 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73 20 61  ing statements a
251f0 72 65 20 74 72 75 65 3a 20 0a 20 20 2a 2a 0a 20  re true: .  **. 
25200 20 2a 2a 20 20 20 28 61 29 20 45 78 61 63 74 6c   **   (a) Exactl
25210 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 52 45 41  y one of the REA
25220 44 57 52 49 54 45 20 61 6e 64 20 52 45 41 44 4f  DWRITE and READO
25230 4e 4c 59 20 66 6c 61 67 73 20 6d 75 73 74 20 62  NLY flags must b
25240 65 20 73 65 74 2c 20 61 6e 64 20 0a 20 20 2a 2a  e set, and .  **
25250 20 20 20 28 62 29 20 69 66 20 43 52 45 41 54 45     (b) if CREATE
25260 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 52 45   is set, then RE
25270 41 44 57 52 49 54 45 20 6d 75 73 74 20 61 6c 73  ADWRITE must als
25280 6f 20 62 65 20 73 65 74 2c 20 61 6e 64 0a 20 20  o be set, and.  
25290 2a 2a 20 20 20 28 63 29 20 69 66 20 45 58 43 4c  **   (c) if EXCL
252a0 55 53 49 56 45 20 69 73 20 73 65 74 2c 20 74 68  USIVE is set, th
252b0 65 6e 20 43 52 45 41 54 45 20 6d 75 73 74 20 61  en CREATE must a
252c0 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20 20 2a 2a  lso be set..  **
252d0 20 20 20 28 64 29 20 69 66 20 44 45 4c 45 54 45     (d) if DELETE
252e0 4f 4e 43 4c 4f 53 45 20 69 73 20 73 65 74 2c 20  ONCLOSE is set, 
252f0 74 68 65 6e 20 43 52 45 41 54 45 20 6d 75 73 74  then CREATE must
25300 20 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20 20   also be set..  
25310 2a 2f 0a 20 20 61 73 73 65 72 74 28 28 69 73 52  */.  assert((isR
25320 65 61 64 6f 6e 6c 79 3d 3d 30 20 7c 7c 20 69 73  eadonly==0 || is
25330 52 65 61 64 57 72 69 74 65 3d 3d 30 29 20 26 26  ReadWrite==0) &&
25340 20 28 69 73 52 65 61 64 57 72 69 74 65 20 7c 7c   (isReadWrite ||
25350 20 69 73 52 65 61 64 6f 6e 6c 79 29 29 3b 0a 20   isReadonly));. 
25360 20 61 73 73 65 72 74 28 69 73 43 72 65 61 74 65   assert(isCreate
25370 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64 57 72 69  ==0 || isReadWri
25380 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73  te);.  assert(is
25390 45 78 63 6c 75 73 69 76 65 3d 3d 30 20 7c 7c 20  Exclusive==0 || 
253a0 69 73 43 72 65 61 74 65 29 3b 0a 20 20 61 73 73  isCreate);.  ass
253b0 65 72 74 28 69 73 44 65 6c 65 74 65 3d 3d 30 20  ert(isDelete==0 
253c0 7c 7c 20 69 73 43 72 65 61 74 65 29 3b 0a 0a 20  || isCreate);.. 
253d0 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 44 42 2c   /* The main DB,
253e0 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 61   main journal, a
253f0 6e 64 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  nd master journa
25400 6c 20 61 72 65 20 6e 65 76 65 72 20 61 75 74 6f  l are never auto
25410 6d 61 74 69 63 61 6c 6c 79 0a 20 20 2a 2a 20 64  matically.  ** d
25420 65 6c 65 74 65 64 2e 20 4e 6f 72 20 61 72 65 20  eleted. Nor are 
25430 74 68 65 79 20 65 76 65 72 20 74 65 6d 70 6f 72  they ever tempor
25440 61 72 79 20 66 69 6c 65 73 2e 20 20 2a 2f 0a 20  ary files.  */. 
25450 20 61 73 73 65 72 74 28 20 28 21 69 73 44 65 6c   assert( (!isDel
25460 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c  ete && zName) ||
25470 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f   eType!=SQLITE_O
25480 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 29 3b 0a 20  PEN_MAIN_DB );. 
25490 20 61 73 73 65 72 74 28 20 28 21 69 73 44 65 6c   assert( (!isDel
254a0 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c  ete && zName) ||
254b0 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f   eType!=SQLITE_O
254c0 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
254d0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 21   );.  assert( (!
254e0 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d  isDelete && zNam
254f0 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c  e) || eType!=SQL
25500 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f  ITE_OPEN_MASTER_
25510 4a 4f 55 52 4e 41 4c 20 29 3b 0a 0a 20 20 2f 2a  JOURNAL );..  /*
25520 20 41 73 73 65 72 74 20 74 68 61 74 20 74 68 65   Assert that the
25530 20 75 70 70 65 72 20 6c 61 79 65 72 20 68 61 73   upper layer has
25540 20 73 65 74 20 6f 6e 65 20 6f 66 20 74 68 65 20   set one of the 
25550 22 66 69 6c 65 2d 74 79 70 65 22 20 66 6c 61 67  "file-type" flag
25560 73 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  s. */.  assert( 
25570 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
25580 45 4e 5f 4d 41 49 4e 5f 44 42 20 20 20 20 20 20  EN_MAIN_DB      
25590 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
255a0 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 20 0a 20  _OPEN_TEMP_DB . 
255b0 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d        || eType==
255c0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
255d0 5f 4a 4f 55 52 4e 41 4c 20 7c 7c 20 65 54 79 70  _JOURNAL || eTyp
255e0 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54  e==SQLITE_OPEN_T
255f0 45 4d 50 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20  EMP_JOURNAL .   
25600 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51      || eType==SQ
25610 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55  LITE_OPEN_SUBJOU
25620 52 4e 41 4c 20 20 20 7c 7c 20 65 54 79 70 65 3d  RNAL   || eType=
25630 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53  =SQLITE_OPEN_MAS
25640 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20  TER_JOURNAL .   
25650 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51      || eType==SQ
25660 4c 49 54 45 5f 4f 50 45 4e 5f 54 52 41 4e 53 49  LITE_OPEN_TRANSI
25670 45 4e 54 5f 44 42 0a 20 20 29 3b 0a 0a 20 20 6d  ENT_DB.  );..  m
25680 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65  emset(p, 0, size
25690 6f 66 28 75 6e 69 78 46 69 6c 65 29 29 3b 0a 0a  of(unixFile));..
256a0 20 20 69 66 28 20 65 54 79 70 65 3d 3d 53 51 4c    if( eType==SQL
256b0 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
256c0 20 29 7b 0a 20 20 20 20 55 6e 69 78 55 6e 75 73   ){.    UnixUnus
256d0 65 64 46 64 20 2a 70 55 6e 75 73 65 64 3b 0a 20  edFd *pUnused;. 
256e0 20 20 20 70 55 6e 75 73 65 64 20 3d 20 66 69 6e     pUnused = fin
256f0 64 52 65 75 73 61 62 6c 65 46 64 28 7a 4e 61 6d  dReusableFd(zNam
25700 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 69  e, flags);.    i
25710 66 28 20 70 55 6e 75 73 65 64 20 29 7b 0a 20 20  f( pUnused ){.  
25720 20 20 20 20 66 64 20 3d 20 70 55 6e 75 73 65 64      fd = pUnused
25730 2d 3e 66 64 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ->fd;.    }else{
25740 0a 20 20 20 20 20 20 70 55 6e 75 73 65 64 20 3d  .      pUnused =
25750 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
25760 73 69 7a 65 6f 66 28 2a 70 55 6e 75 73 65 64 29  sizeof(*pUnused)
25770 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 55  );.      if( !pU
25780 6e 75 73 65 64 20 29 7b 0a 20 20 20 20 20 20 20  nused ){.       
25790 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
257a0 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OMEM;.      }.  
257b0 20 20 7d 0a 20 20 20 20 70 2d 3e 70 55 6e 75 73    }.    p->pUnus
257c0 65 64 20 3d 20 70 55 6e 75 73 65 64 3b 0a 20 20  ed = pUnused;.  
257d0 7d 65 6c 73 65 20 69 66 28 20 21 7a 4e 61 6d 65  }else if( !zName
257e0 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 7a 4e   ){.    /* If zN
257f0 61 6d 65 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65  ame is NULL, the
25800 20 75 70 70 65 72 20 6c 61 79 65 72 20 69 73 20   upper layer is 
25810 72 65 71 75 65 73 74 69 6e 67 20 61 20 74 65 6d  requesting a tem
25820 70 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 61  p file. */.    a
25830 73 73 65 72 74 28 69 73 44 65 6c 65 74 65 20 26  ssert(isDelete &
25840 26 20 21 69 73 4f 70 65 6e 44 69 72 65 63 74 6f  & !isOpenDirecto
25850 72 79 29 3b 0a 20 20 20 20 72 63 20 3d 20 67 65  ry);.    rc = ge
25860 74 54 65 6d 70 6e 61 6d 65 28 4d 41 58 5f 50 41  tTempname(MAX_PA
25870 54 48 4e 41 4d 45 2b 31 2c 20 7a 54 6d 70 6e 61  THNAME+1, zTmpna
25880 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  me);.    if( rc!
25890 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
258a0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
258b0 20 20 20 7d 0a 20 20 20 20 7a 4e 61 6d 65 20 3d     }.    zName =
258c0 20 7a 54 6d 70 6e 61 6d 65 3b 0a 20 20 7d 0a 0a   zTmpname;.  }..
258d0 20 20 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 74    /* Determine t
258e0 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
258f0 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 20  flags parameter 
25900 70 61 73 73 65 64 20 74 6f 20 50 4f 53 49 58 20  passed to POSIX 
25910 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 6f 70  function.  ** op
25920 65 6e 28 29 2e 20 54 68 65 73 65 20 6d 75 73 74  en(). These must
25930 20 62 65 20 63 61 6c 63 75 6c 61 74 65 64 20 65   be calculated e
25940 76 65 6e 20 69 66 20 6f 70 65 6e 28 29 20 69 73  ven if open() is
25950 20 6e 6f 74 20 63 61 6c 6c 65 64 2c 20 61 73 0a   not called, as.
25960 20 20 2a 2a 20 74 68 65 79 20 6d 61 79 20 62 65    ** they may be
25970 20 73 74 6f 72 65 64 20 61 73 20 70 61 72 74 20   stored as part 
25980 6f 66 20 74 68 65 20 66 69 6c 65 20 68 61 6e 64  of the file hand
25990 6c 65 20 61 6e 64 20 75 73 65 64 20 62 79 20 74  le and used by t
259a0 68 65 20 0a 20 20 2a 2a 20 27 63 6f 6e 63 68 20  he .  ** 'conch 
259b0 66 69 6c 65 27 20 6c 6f 63 6b 69 6e 67 20 66 75  file' locking fu
259c0 6e 63 74 69 6f 6e 73 20 6c 61 74 65 72 20 6f 6e  nctions later on
259d0 2e 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 52 65  .  */.  if( isRe
259e0 61 64 6f 6e 6c 79 20 29 20 20 6f 70 65 6e 46 6c  adonly )  openFl
259f0 61 67 73 20 7c 3d 20 4f 5f 52 44 4f 4e 4c 59 3b  ags |= O_RDONLY;
25a00 0a 20 20 69 66 28 20 69 73 52 65 61 64 57 72 69  .  if( isReadWri
25a10 74 65 20 29 20 6f 70 65 6e 46 6c 61 67 73 20 7c  te ) openFlags |
25a20 3d 20 4f 5f 52 44 57 52 3b 0a 20 20 69 66 28 20  = O_RDWR;.  if( 
25a30 69 73 43 72 65 61 74 65 20 29 20 20 20 20 6f 70  isCreate )    op
25a40 65 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f 43 52 45  enFlags |= O_CRE
25a50 41 54 3b 0a 20 20 69 66 28 20 69 73 45 78 63 6c  AT;.  if( isExcl
25a60 75 73 69 76 65 20 29 20 6f 70 65 6e 46 6c 61 67  usive ) openFlag
25a70 73 20 7c 3d 20 28 4f 5f 45 58 43 4c 7c 4f 5f 4e  s |= (O_EXCL|O_N
25a80 4f 46 4f 4c 4c 4f 57 29 3b 0a 20 20 6f 70 65 6e  OFOLLOW);.  open
25a90 46 6c 61 67 73 20 7c 3d 20 28 4f 5f 4c 41 52 47  Flags |= (O_LARG
25aa0 45 46 49 4c 45 7c 4f 5f 42 49 4e 41 52 59 29 3b  EFILE|O_BINARY);
25ab0 0a 0a 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a  ..  if( fd<0 ){.
25ac0 20 20 20 20 6d 6f 64 65 5f 74 20 6f 70 65 6e 4d      mode_t openM
25ad0 6f 64 65 20 3d 20 28 69 73 44 65 6c 65 74 65 3f  ode = (isDelete?
25ae0 30 36 30 30 3a 53 51 4c 49 54 45 5f 44 45 46 41  0600:SQLITE_DEFA
25af0 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53  ULT_FILE_PERMISS
25b00 49 4f 4e 53 29 3b 0a 20 20 20 20 66 64 20 3d 20  IONS);.    fd = 
25b10 6f 70 65 6e 28 7a 4e 61 6d 65 2c 20 6f 70 65 6e  open(zName, open
25b20 46 6c 61 67 73 2c 20 6f 70 65 6e 4d 6f 64 65 29  Flags, openMode)
25b30 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  ;.    OSTRACE(("
25b40 4f 50 45 4e 58 20 20 20 25 2d 33 64 20 25 73 20  OPENX   %-3d %s 
25b50 30 25 6f 5c 6e 22 2c 20 66 64 2c 20 7a 4e 61 6d  0%o\n", fd, zNam
25b60 65 2c 20 6f 70 65 6e 46 6c 61 67 73 29 29 3b 0a  e, openFlags));.
25b70 20 20 20 20 69 66 28 20 66 64 3c 30 20 26 26 20      if( fd<0 && 
25b80 65 72 72 6e 6f 21 3d 45 49 53 44 49 52 20 26 26  errno!=EISDIR &&
25b90 20 69 73 52 65 61 64 57 72 69 74 65 20 26 26 20   isReadWrite && 
25ba0 21 69 73 45 78 63 6c 75 73 69 76 65 20 29 7b 0a  !isExclusive ){.
25bb0 20 20 20 20 20 20 2f 2a 20 46 61 69 6c 65 64 20        /* Failed 
25bc0 74 6f 20 6f 70 65 6e 20 74 68 65 20 66 69 6c 65  to open the file
25bd0 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20   for read/write 
25be0 61 63 63 65 73 73 2e 20 54 72 79 20 72 65 61 64  access. Try read
25bf0 2d 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20 20 20 20  -only. */.      
25c00 66 6c 61 67 73 20 26 3d 20 7e 28 53 51 4c 49 54  flags &= ~(SQLIT
25c10 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
25c20 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45  |SQLITE_OPEN_CRE
25c30 41 54 45 29 3b 0a 20 20 20 20 20 20 6f 70 65 6e  ATE);.      open
25c40 46 6c 61 67 73 20 26 3d 20 7e 28 4f 5f 52 44 57  Flags &= ~(O_RDW
25c50 52 7c 4f 5f 43 52 45 41 54 29 3b 0a 20 20 20 20  R|O_CREAT);.    
25c60 20 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54    flags |= SQLIT
25c70 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b  E_OPEN_READONLY;
25c80 0a 20 20 20 20 20 20 6f 70 65 6e 46 6c 61 67 73  .      openFlags
25c90 20 7c 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20 20   |= O_RDONLY;.  
25ca0 20 20 20 20 66 64 20 3d 20 6f 70 65 6e 28 7a 4e      fd = open(zN
25cb0 61 6d 65 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20  ame, openFlags, 
25cc0 6f 70 65 6e 4d 6f 64 65 29 3b 0a 20 20 20 20 7d  openMode);.    }
25cd0 0a 20 20 20 20 69 66 28 20 66 64 3c 30 20 29 7b  .    if( fd<0 ){
25ce0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
25cf0 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54  TE_CANTOPEN_BKPT
25d00 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f 70 65  ;.      goto ope
25d10 6e 5f 66 69 6e 69 73 68 65 64 3b 0a 20 20 20 20  n_finished;.    
25d20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  }.  }.  assert( 
25d30 66 64 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  fd>=0 );.  if( p
25d40 4f 75 74 46 6c 61 67 73 20 29 7b 0a 20 20 20 20  OutFlags ){.    
25d50 2a 70 4f 75 74 46 6c 61 67 73 20 3d 20 66 6c 61  *pOutFlags = fla
25d60 67 73 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  gs;.  }..  if( p
25d70 2d 3e 70 55 6e 75 73 65 64 20 29 7b 0a 20 20 20  ->pUnused ){.   
25d80 20 70 2d 3e 70 55 6e 75 73 65 64 2d 3e 66 64 20   p->pUnused->fd 
25d90 3d 20 66 64 3b 0a 20 20 20 20 70 2d 3e 70 55 6e  = fd;.    p->pUn
25da0 75 73 65 64 2d 3e 66 6c 61 67 73 20 3d 20 66 6c  used->flags = fl
25db0 61 67 73 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ags;.  }..  if( 
25dc0 69 73 44 65 6c 65 74 65 20 29 7b 0a 23 69 66 20  isDelete ){.#if 
25dd0 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 20 20 7a  OS_VXWORKS.    z
25de0 50 61 74 68 20 3d 20 7a 4e 61 6d 65 3b 0a 23 65  Path = zName;.#e
25df0 6c 73 65 0a 20 20 20 20 75 6e 6c 69 6e 6b 28 7a  lse.    unlink(z
25e00 4e 61 6d 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20  Name);.#endif.  
25e10 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  }.#if SQLITE_ENA
25e20 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
25e30 45 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 70 2d  E.  else{.    p-
25e40 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 6f 70 65  >openFlags = ope
25e50 6e 46 6c 61 67 73 3b 0a 20 20 7d 0a 23 65 6e 64  nFlags;.  }.#end
25e60 69 66 0a 0a 20 20 69 66 28 20 69 73 4f 70 65 6e  if..  if( isOpen
25e70 44 69 72 65 63 74 6f 72 79 20 29 7b 0a 20 20 20  Directory ){.   
25e80 20 72 63 20 3d 20 6f 70 65 6e 44 69 72 65 63 74   rc = openDirect
25e90 6f 72 79 28 7a 50 61 74 68 2c 20 26 64 69 72 66  ory(zPath, &dirf
25ea0 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  d);.    if( rc!=
25eb0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
25ec0 20 20 20 2f 2a 20 49 74 20 69 73 20 73 61 66 65     /* It is safe
25ed0 20 74 6f 20 63 6c 6f 73 65 20 66 64 20 61 74 20   to close fd at 
25ee0 74 68 69 73 20 70 6f 69 6e 74 2c 20 62 65 63 61  this point, beca
25ef0 75 73 65 20 69 74 20 69 73 20 67 75 61 72 61 6e  use it is guaran
25f00 74 65 65 64 20 6e 6f 74 0a 20 20 20 20 20 20 2a  teed not.      *
25f10 2a 20 74 6f 20 62 65 20 6f 70 65 6e 20 6f 6e 20  * to be open on 
25f20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  a database file.
25f30 20 49 66 20 69 74 20 77 65 72 65 20 6f 70 65 6e   If it were open
25f40 20 6f 6e 20 61 20 64 61 74 61 62 61 73 65 20 66   on a database f
25f50 69 6c 65 2c 0a 20 20 20 20 20 20 2a 2a 20 69 74  ile,.      ** it
25f60 20 77 6f 75 6c 64 20 6e 6f 74 20 62 65 20 73 61   would not be sa
25f70 66 65 20 74 6f 20 63 6c 6f 73 65 20 61 73 20 74  fe to close as t
25f80 68 69 73 20 77 6f 75 6c 64 20 72 65 6c 65 61 73  his would releas
25f90 65 20 61 6e 79 20 6c 6f 63 6b 73 20 68 65 6c 64  e any locks held
25fa0 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65  .      ** on the
25fb0 20 66 69 6c 65 20 62 79 20 74 68 69 73 20 70 72   file by this pr
25fc0 6f 63 65 73 73 2e 20 20 2a 2f 0a 20 20 20 20 20  ocess.  */.     
25fd0 20 61 73 73 65 72 74 28 20 65 54 79 70 65 21 3d   assert( eType!=
25fe0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
25ff0 5f 44 42 20 29 3b 0a 20 20 20 20 20 20 63 6c 6f  _DB );.      clo
26000 73 65 28 66 64 29 3b 20 20 20 20 20 20 20 20 20  se(fd);         
26010 20 20 20 20 2f 2a 20 73 69 6c 65 6e 74 6c 79 20      /* silently 
26020 6c 65 61 6b 20 69 66 20 66 61 69 6c 2c 20 61 6c  leak if fail, al
26030 72 65 61 64 79 20 69 6e 20 65 72 72 6f 72 20 2a  ready in error *
26040 2f 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f 70 65  /.      goto ope
26050 6e 5f 66 69 6e 69 73 68 65 64 3b 0a 20 20 20 20  n_finished;.    
26060 7d 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 46 44  }.  }..#ifdef FD
26070 5f 43 4c 4f 45 58 45 43 0a 20 20 66 63 6e 74 6c  _CLOEXEC.  fcntl
26080 28 66 64 2c 20 46 5f 53 45 54 46 44 2c 20 66 63  (fd, F_SETFD, fc
26090 6e 74 6c 28 66 64 2c 20 46 5f 47 45 54 46 44 2c  ntl(fd, F_GETFD,
260a0 20 30 29 20 7c 20 46 44 5f 43 4c 4f 45 58 45 43   0) | FD_CLOEXEC
260b0 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 6e 6f 4c  );.#endif..  noL
260c0 6f 63 6b 20 3d 20 65 54 79 70 65 21 3d 53 51 4c  ock = eType!=SQL
260d0 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
260e0 3b 0a 0a 20 20 0a 23 69 66 20 64 65 66 69 6e 65  ;..  .#if define
260f0 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 7c 7c 20  d(__APPLE__) || 
26100 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
26110 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 73 74  CKING_STYLE.  st
26120 72 75 63 74 20 73 74 61 74 66 73 20 66 73 49 6e  ruct statfs fsIn
26130 66 6f 3b 0a 20 20 69 66 28 20 66 73 74 61 74 66  fo;.  if( fstatf
26140 73 28 66 64 2c 20 26 66 73 49 6e 66 6f 29 20 3d  s(fd, &fsInfo) =
26150 3d 20 2d 31 20 29 7b 0a 20 20 20 20 28 28 75 6e  = -1 ){.    ((un
26160 69 78 46 69 6c 65 2a 29 70 46 69 6c 65 29 2d 3e  ixFile*)pFile)->
26170 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  lastErrno = errn
26180 6f 3b 0a 20 20 20 20 69 66 28 20 64 69 72 66 64  o;.    if( dirfd
26190 3e 3d 30 20 29 20 63 6c 6f 73 65 28 64 69 72 66  >=0 ) close(dirf
261a0 64 29 3b 20 2f 2a 20 73 69 6c 65 6e 74 6c 79 20  d); /* silently 
261b0 6c 65 61 6b 20 69 66 20 66 61 69 6c 2c 20 69 6e  leak if fail, in
261c0 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 63 6c   error */.    cl
261d0 6f 73 65 28 66 64 29 3b 20 2f 2a 20 73 69 6c 65  ose(fd); /* sile
261e0 6e 74 6c 79 20 6c 65 61 6b 20 69 66 20 66 61 69  ntly leak if fai
261f0 6c 2c 20 69 6e 20 65 72 72 6f 72 20 2a 2f 0a 20  l, in error */. 
26200 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
26210 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 3b 0a 20  _IOERR_ACCESS;. 
26220 20 7d 0a 20 20 69 66 20 28 30 20 3d 3d 20 73 74   }.  if (0 == st
26230 72 6e 63 6d 70 28 22 6d 73 64 6f 73 22 2c 20 66  rncmp("msdos", f
26240 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61  sInfo.f_fstypena
26250 6d 65 2c 20 35 29 29 20 7b 0a 20 20 20 20 28 28  me, 5)) {.    ((
26260 75 6e 69 78 46 69 6c 65 2a 29 70 46 69 6c 65 29  unixFile*)pFile)
26270 2d 3e 66 73 46 6c 61 67 73 20 7c 3d 20 53 51 4c  ->fsFlags |= SQL
26280 49 54 45 5f 46 53 46 4c 41 47 53 5f 49 53 5f 4d  ITE_FSFLAGS_IS_M
26290 53 44 4f 53 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  SDOS;.  }.#endif
262a0 0a 20 20 0a 23 69 66 20 53 51 4c 49 54 45 5f 45  .  .#if SQLITE_E
262b0 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
262c0 59 4c 45 0a 23 69 66 20 53 51 4c 49 54 45 5f 50  YLE.#if SQLITE_P
262d0 52 45 46 45 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b  REFER_PROXY_LOCK
262e0 49 4e 47 0a 20 20 69 73 41 75 74 6f 50 72 6f 78  ING.  isAutoProx
262f0 79 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 20 20  y = 1;.#endif.  
26300 69 66 28 20 69 73 41 75 74 6f 50 72 6f 78 79 20  if( isAutoProxy 
26310 26 26 20 28 7a 50 61 74 68 21 3d 4e 55 4c 4c 29  && (zPath!=NULL)
26320 20 26 26 20 28 21 6e 6f 4c 6f 63 6b 29 20 26 26   && (!noLock) &&
26330 20 70 56 66 73 2d 3e 78 4f 70 65 6e 20 29 7b 0a   pVfs->xOpen ){.
26340 20 20 20 20 63 68 61 72 20 2a 65 6e 76 66 6f 72      char *envfor
26350 63 65 20 3d 20 67 65 74 65 6e 76 28 22 53 51 4c  ce = getenv("SQL
26360 49 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f  ITE_FORCE_PROXY_
26370 4c 4f 43 4b 49 4e 47 22 29 3b 0a 20 20 20 20 69  LOCKING");.    i
26380 6e 74 20 75 73 65 50 72 6f 78 79 20 3d 20 30 3b  nt useProxy = 0;
26390 0a 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ..    /* SQLITE_
263a0 46 4f 52 43 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b  FORCE_PROXY_LOCK
263b0 49 4e 47 3d 3d 31 20 6d 65 61 6e 73 20 66 6f 72  ING==1 means for
263c0 63 65 20 61 6c 77 61 79 73 20 75 73 65 20 70 72  ce always use pr
263d0 6f 78 79 2c 20 30 20 6d 65 61 6e 73 20 0a 20 20  oxy, 0 means .  
263e0 20 20 2a 2a 20 6e 65 76 65 72 20 75 73 65 20 70    ** never use p
263f0 72 6f 78 79 2c 20 4e 55 4c 4c 20 6d 65 61 6e 73  roxy, NULL means
26400 20 75 73 65 20 70 72 6f 78 79 20 66 6f 72 20 6e   use proxy for n
26410 6f 6e 2d 6c 6f 63 61 6c 20 66 69 6c 65 73 20 6f  on-local files o
26420 6e 6c 79 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28  nly.  */.    if(
26430 20 65 6e 76 66 6f 72 63 65 21 3d 4e 55 4c 4c 20   envforce!=NULL 
26440 29 7b 0a 20 20 20 20 20 20 75 73 65 50 72 6f 78  ){.      useProx
26450 79 20 3d 20 61 74 6f 69 28 65 6e 76 66 6f 72 63  y = atoi(envforc
26460 65 29 3e 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  e)>0;.    }else{
26470 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 73 74  .      struct st
26480 61 74 66 73 20 66 73 49 6e 66 6f 3b 0a 20 20 20  atfs fsInfo;.   
26490 20 20 20 69 66 28 20 73 74 61 74 66 73 28 7a 50     if( statfs(zP
264a0 61 74 68 2c 20 26 66 73 49 6e 66 6f 29 20 3d 3d  ath, &fsInfo) ==
264b0 20 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 2f   -1 ){.        /
264c0 2a 20 49 6e 20 74 68 65 6f 72 79 2c 20 74 68 65  * In theory, the
264d0 20 63 6c 6f 73 65 28 66 64 29 20 63 61 6c 6c 20   close(fd) call 
264e0 69 73 20 73 75 62 2d 6f 70 74 69 6d 61 6c 2e 20  is sub-optimal. 
264f0 49 66 20 74 68 65 20 66 69 6c 65 20 6f 70 65 6e  If the file open
26500 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 69  ed.        ** wi
26510 74 68 20 66 64 20 69 73 20 61 20 64 61 74 61 62  th fd is a datab
26520 61 73 65 20 66 69 6c 65 2c 20 61 6e 64 20 74 68  ase file, and th
26530 65 72 65 20 61 72 65 20 6f 74 68 65 72 20 63 6f  ere are other co
26540 6e 6e 65 63 74 69 6f 6e 73 20 6f 70 65 6e 0a 20  nnections open. 
26550 20 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 61         ** on tha
26560 74 20 66 69 6c 65 20 74 68 61 74 20 61 72 65 20  t file that are 
26570 63 75 72 72 65 6e 74 6c 79 20 68 6f 6c 64 69 6e  currently holdin
26580 67 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73  g advisory locks
26590 20 6f 6e 20 69 74 2c 0a 20 20 20 20 20 20 20 20   on it,.        
265a0 2a 2a 20 74 68 65 6e 20 74 68 65 20 63 61 6c 6c  ** then the call
265b0 20 74 6f 20 63 6c 6f 73 65 28 29 20 77 69 6c 6c   to close() will
265c0 20 63 61 6e 63 65 6c 20 74 68 6f 73 65 20 6c 6f   cancel those lo
265d0 63 6b 73 2e 20 49 6e 20 70 72 61 63 74 69 63 65  cks. In practice
265e0 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 65 27  ,.        ** we'
265f0 72 65 20 61 73 73 75 6d 69 6e 67 20 74 68 61 74  re assuming that
26600 20 73 74 61 74 66 73 28 29 20 64 6f 65 73 6e 27   statfs() doesn'
26610 74 20 66 61 69 6c 20 76 65 72 79 20 6f 66 74 65  t fail very ofte
26620 6e 2e 20 41 74 20 6c 65 61 73 74 0a 20 20 20 20  n. At least.    
26630 20 20 20 20 2a 2a 20 6e 6f 74 20 77 68 69 6c 65      ** not while
26640 20 6f 74 68 65 72 20 66 69 6c 65 20 64 65 73 63   other file desc
26650 72 69 70 74 6f 72 73 20 6f 70 65 6e 65 64 20 62  riptors opened b
26660 79 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65  y the same proce
26670 73 73 20 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a  ss on.        **
26680 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20 61   the same file a
26690 72 65 20 77 6f 72 6b 69 6e 67 2e 20 20 2a 2f 0a  re working.  */.
266a0 20 20 20 20 20 20 20 20 70 2d 3e 6c 61 73 74 45          p->lastE
266b0 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
266c0 20 20 20 20 20 20 69 66 28 20 64 69 72 66 64 3e        if( dirfd>
266d0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
266e0 63 6c 6f 73 65 28 64 69 72 66 64 29 3b 20 2f 2a  close(dirfd); /*
266f0 20 73 69 6c 65 6e 74 6c 79 20 6c 65 61 6b 20 69   silently leak i
26700 66 20 66 61 69 6c 2c 20 69 6e 20 65 72 72 6f 72  f fail, in error
26710 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   */.        }.  
26720 20 20 20 20 20 20 63 6c 6f 73 65 28 66 64 29 3b        close(fd);
26730 20 2f 2a 20 73 69 6c 65 6e 74 6c 79 20 6c 65 61   /* silently lea
26740 6b 20 69 66 20 66 61 69 6c 2c 20 69 6e 20 65 72  k if fail, in er
26750 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  ror */.        r
26760 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
26770 5f 41 43 43 45 53 53 3b 0a 20 20 20 20 20 20 20  _ACCESS;.       
26780 20 67 6f 74 6f 20 6f 70 65 6e 5f 66 69 6e 69 73   goto open_finis
26790 68 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  hed;.      }.   
267a0 20 20 20 75 73 65 50 72 6f 78 79 20 3d 20 21 28     useProxy = !(
267b0 66 73 49 6e 66 6f 2e 66 5f 66 6c 61 67 73 26 4d  fsInfo.f_flags&M
267c0 4e 54 5f 4c 4f 43 41 4c 29 3b 0a 20 20 20 20 7d  NT_LOCAL);.    }
267d0 0a 20 20 20 20 69 66 28 20 75 73 65 50 72 6f 78  .    if( useProx
267e0 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  y ){.      rc = 
267f0 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 28 70  fillInUnixFile(p
26800 56 66 73 2c 20 66 64 2c 20 64 69 72 66 64 2c 20  Vfs, fd, dirfd, 
26810 70 46 69 6c 65 2c 20 7a 50 61 74 68 2c 20 6e 6f  pFile, zPath, no
26820 4c 6f 63 6b 2c 20 69 73 44 65 6c 65 74 65 29 3b  Lock, isDelete);
26830 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
26840 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
26850 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79 54 72      rc = proxyTr
26860 61 6e 73 66 6f 72 6d 55 6e 69 78 46 69 6c 65 28  ansformUnixFile(
26870 28 75 6e 69 78 46 69 6c 65 2a 29 70 46 69 6c 65  (unixFile*)pFile
26880 2c 20 22 3a 61 75 74 6f 3a 22 29 3b 0a 20 20 20  , ":auto:");.   
26890 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
268a0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
268b0 20 20 20 20 2f 2a 20 55 73 65 20 75 6e 69 78 43      /* Use unixC
268c0 6c 6f 73 65 20 74 6f 20 63 6c 65 61 6e 20 75 70  lose to clean up
268d0 20 74 68 65 20 72 65 73 6f 75 72 63 65 73 20 61   the resources a
268e0 64 64 65 64 20 69 6e 20 66 69 6c 6c 49 6e 55 6e  dded in fillInUn
268f0 69 78 46 69 6c 65 20 0a 20 20 20 20 20 20 20 20  ixFile .        
26900 20 20 2a 2a 20 61 6e 64 20 63 6c 65 61 72 20 61    ** and clear a
26910 6c 6c 20 74 68 65 20 73 74 72 75 63 74 75 72 65  ll the structure
26920 27 73 20 72 65 66 65 72 65 6e 63 65 73 2e 20 20  's references.  
26930 53 70 65 63 69 66 69 63 61 6c 6c 79 2c 20 0a 20  Specifically, . 
26940 20 20 20 20 20 20 20 20 20 2a 2a 20 70 46 69 6c           ** pFil
26950 65 2d 3e 70 4d 65 74 68 6f 64 73 20 77 69 6c 6c  e->pMethods will
26960 20 62 65 20 4e 55 4c 4c 20 73 6f 20 73 71 6c 69   be NULL so sqli
26970 74 65 33 4f 73 43 6c 6f 73 65 20 77 69 6c 6c 20  te3OsClose will 
26980 62 65 20 61 20 6e 6f 2d 6f 70 20 0a 20 20 20 20  be a no-op .    
26990 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
269a0 20 20 20 75 6e 69 78 43 6c 6f 73 65 28 70 46 69     unixClose(pFi
269b0 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  le);.          r
269c0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
269d0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
269e0 20 20 67 6f 74 6f 20 6f 70 65 6e 5f 66 69 6e 69    goto open_fini
269f0 73 68 65 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  shed;.    }.  }.
26a00 23 65 6e 64 69 66 0a 20 20 0a 20 20 72 63 20 3d  #endif.  .  rc =
26a10 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 28   fillInUnixFile(
26a20 70 56 66 73 2c 20 66 64 2c 20 64 69 72 66 64 2c  pVfs, fd, dirfd,
26a30 20 70 46 69 6c 65 2c 20 7a 50 61 74 68 2c 20 6e   pFile, zPath, n
26a40 6f 4c 6f 63 6b 2c 20 69 73 44 65 6c 65 74 65 29  oLock, isDelete)
26a50 3b 0a 6f 70 65 6e 5f 66 69 6e 69 73 68 65 64 3a  ;.open_finished:
26a60 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
26a70 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
26a80 74 65 33 5f 66 72 65 65 28 70 2d 3e 70 55 6e 75  te3_free(p->pUnu
26a90 73 65 64 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  sed);.  }.  retu
26aa0 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
26ab0 20 44 65 6c 65 74 65 20 74 68 65 20 66 69 6c 65   Delete the file
26ac0 20 61 74 20 7a 50 61 74 68 2e 20 49 66 20 74 68   at zPath. If th
26ad0 65 20 64 69 72 53 79 6e 63 20 61 72 67 75 6d 65  e dirSync argume
26ae0 6e 74 20 69 73 20 74 72 75 65 2c 20 66 73 79 6e  nt is true, fsyn
26af0 63 28 29 0a 2a 2a 20 74 68 65 20 64 69 72 65 63  c().** the direc
26b00 74 6f 72 79 20 61 66 74 65 72 20 64 65 6c 65 74  tory after delet
26b10 69 6e 67 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2f  ing the file..*/
26b20 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
26b30 44 65 6c 65 74 65 28 0a 20 20 73 71 6c 69 74 65  Delete(.  sqlite
26b40 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20  3_vfs *NotUsed, 
26b50 20 20 20 20 2f 2a 20 56 46 53 20 63 6f 6e 74 61      /* VFS conta
26b60 69 6e 69 6e 67 20 74 68 69 73 20 61 73 20 74 68  ining this as th
26b70 65 20 78 44 65 6c 65 74 65 20 6d 65 74 68 6f 64  e xDelete method
26b80 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
26b90 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20   *zPath,        
26ba0 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69 6c 65 20  /* Name of file 
26bb0 74 6f 20 62 65 20 64 65 6c 65 74 65 64 20 2a 2f  to be deleted */
26bc0 0a 20 20 69 6e 74 20 64 69 72 53 79 6e 63 20 20  .  int dirSync  
26bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26be0 49 66 20 74 72 75 65 2c 20 66 73 79 6e 63 28 29  If true, fsync()
26bf0 20 64 69 72 65 63 74 6f 72 79 20 61 66 74 65 72   directory after
26c00 20 64 65 6c 65 74 69 6e 67 20 66 69 6c 65 20 2a   deleting file *
26c10 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
26c20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 55 4e 55  SQLITE_OK;.  UNU
26c30 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
26c40 74 55 73 65 64 29 3b 0a 20 20 53 69 6d 75 6c 61  tUsed);.  Simula
26c50 74 65 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e  teIOError(return
26c60 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45   SQLITE_IOERR_DE
26c70 4c 45 54 45 29 3b 0a 20 20 75 6e 6c 69 6e 6b 28  LETE);.  unlink(
26c80 7a 50 61 74 68 29 3b 0a 23 69 66 6e 64 65 66 20  zPath);.#ifndef 
26c90 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 44  SQLITE_DISABLE_D
26ca0 49 52 53 59 4e 43 0a 20 20 69 66 28 20 64 69 72  IRSYNC.  if( dir
26cb0 53 79 6e 63 20 29 7b 0a 20 20 20 20 69 6e 74 20  Sync ){.    int 
26cc0 66 64 3b 0a 20 20 20 20 72 63 20 3d 20 6f 70 65  fd;.    rc = ope
26cd0 6e 44 69 72 65 63 74 6f 72 79 28 7a 50 61 74 68  nDirectory(zPath
26ce0 2c 20 26 66 64 29 3b 0a 20 20 20 20 69 66 28 20  , &fd);.    if( 
26cf0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
26d00 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
26d10 20 20 20 20 20 20 69 66 28 20 66 73 79 6e 63 28        if( fsync(
26d20 66 64 29 3d 3d 2d 31 20 29 0a 23 65 6c 73 65 0a  fd)==-1 ).#else.
26d30 20 20 20 20 20 20 69 66 28 20 66 73 79 6e 63 28        if( fsync(
26d40 66 64 29 20 29 0a 23 65 6e 64 69 66 0a 20 20 20  fd) ).#endif.   
26d50 20 20 20 7b 0a 20 20 20 20 20 20 20 20 72 63 20     {.        rc 
26d60 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44  = SQLITE_IOERR_D
26d70 49 52 5f 46 53 59 4e 43 3b 0a 20 20 20 20 20 20  IR_FSYNC;.      
26d80 7d 0a 20 20 20 20 20 20 69 66 28 20 63 6c 6f 73  }.      if( clos
26d90 65 28 66 64 29 26 26 21 72 63 20 29 7b 0a 20 20  e(fd)&&!rc ){.  
26da0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
26db0 45 5f 49 4f 45 52 52 5f 44 49 52 5f 43 4c 4f 53  E_IOERR_DIR_CLOS
26dc0 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  E;.      }.    }
26dd0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65  .  }.#endif.  re
26de0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
26df0 2a 20 54 65 73 74 20 74 68 65 20 65 78 69 73 74  * Test the exist
26e00 61 6e 63 65 20 6f 66 20 6f 72 20 61 63 63 65 73  ance of or acces
26e10 73 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 6f 66  s permissions of
26e20 20 66 69 6c 65 20 7a 50 61 74 68 2e 20 54 68 65   file zPath. The
26e30 0a 2a 2a 20 74 65 73 74 20 70 65 72 66 6f 72 6d  .** test perform
26e40 65 64 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 68  ed depends on th
26e50 65 20 76 61 6c 75 65 20 6f 66 20 66 6c 61 67 73  e value of flags
26e60 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 51 4c 49  :.**.**     SQLI
26e70 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53  TE_ACCESS_EXISTS
26e80 3a 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68  : Return 1 if th
26e90 65 20 66 69 6c 65 20 65 78 69 73 74 73 0a 2a 2a  e file exists.**
26ea0 20 20 20 20 20 53 51 4c 49 54 45 5f 41 43 43 45       SQLITE_ACCE
26eb0 53 53 5f 52 45 41 44 57 52 49 54 45 3a 20 52 65  SS_READWRITE: Re
26ec0 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 66 69  turn 1 if the fi
26ed0 6c 65 20 69 73 20 72 65 61 64 20 61 6e 64 20 77  le is read and w
26ee0 72 69 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 20  ritable..**     
26ef0 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45  SQLITE_ACCESS_RE
26f00 41 44 4f 4e 4c 59 3a 20 52 65 74 75 72 6e 20 31  ADONLY: Return 1
26f10 20 69 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   if the file is 
26f20 72 65 61 64 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  readable..**.** 
26f30 4f 74 68 65 72 77 69 73 65 20 72 65 74 75 72 6e  Otherwise return
26f40 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e   0..*/.static in
26f50 74 20 75 6e 69 78 41 63 63 65 73 73 28 0a 20 20  t unixAccess(.  
26f60 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74  sqlite3_vfs *Not
26f70 55 73 65 64 2c 20 20 20 2f 2a 20 54 68 65 20 56  Used,   /* The V
26f80 46 53 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  FS containing th
26f90 69 73 20 78 41 63 63 65 73 73 20 6d 65 74 68 6f  is xAccess metho
26fa0 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  d */.  const cha
26fb0 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 2f  r *zPath,      /
26fc0 2a 20 50 61 74 68 20 6f 66 20 74 68 65 20 66 69  * Path of the fi
26fd0 6c 65 20 74 6f 20 65 78 61 6d 69 6e 65 20 2a 2f  le to examine */
26fe0 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20  .  int flags,   
26ff0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68             /* Wh
27000 61 74 20 64 6f 20 77 65 20 77 61 6e 74 20 74 6f  at do we want to
27010 20 6c 65 61 72 6e 20 61 62 6f 75 74 20 74 68 65   learn about the
27020 20 7a 50 61 74 68 20 66 69 6c 65 3f 20 2a 2f 0a   zPath file? */.
27030 20 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 20 20    int *pResOut  
27040 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
27050 74 65 20 72 65 73 75 6c 74 20 62 6f 6f 6c 65 61  te result boolea
27060 6e 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  n here */.){.  i
27070 6e 74 20 61 6d 6f 64 65 20 3d 20 30 3b 0a 20 20  nt amode = 0;.  
27080 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
27090 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 53 69 6d  (NotUsed);.  Sim
270a0 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65  ulateIOError( re
270b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
270c0 52 5f 41 43 43 45 53 53 3b 20 29 3b 0a 20 20 73  R_ACCESS; );.  s
270d0 77 69 74 63 68 28 20 66 6c 61 67 73 20 29 7b 0a  witch( flags ){.
270e0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
270f0 41 43 43 45 53 53 5f 45 58 49 53 54 53 3a 0a 20  ACCESS_EXISTS:. 
27100 20 20 20 20 20 61 6d 6f 64 65 20 3d 20 46 5f 4f       amode = F_O
27110 4b 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  K;.      break;.
27120 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
27130 41 43 43 45 53 53 5f 52 45 41 44 57 52 49 54 45  ACCESS_READWRITE
27140 3a 0a 20 20 20 20 20 20 61 6d 6f 64 65 20 3d 20  :.      amode = 
27150 57 5f 4f 4b 7c 52 5f 4f 4b 3b 0a 20 20 20 20 20  W_OK|R_OK;.     
27160 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
27170 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52   SQLITE_ACCESS_R
27180 45 41 44 3a 0a 20 20 20 20 20 20 61 6d 6f 64 65  EAD:.      amode
27190 20 3d 20 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 62   = R_OK;.      b
271a0 72 65 61 6b 3b 0a 0a 20 20 20 20 64 65 66 61 75  reak;..    defau
271b0 6c 74 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74  lt:.      assert
271c0 28 21 22 49 6e 76 61 6c 69 64 20 66 6c 61 67 73  (!"Invalid flags
271d0 20 61 72 67 75 6d 65 6e 74 22 29 3b 0a 20 20 7d   argument");.  }
271e0 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 28 61  .  *pResOut = (a
271f0 63 63 65 73 73 28 7a 50 61 74 68 2c 20 61 6d 6f  ccess(zPath, amo
27200 64 65 29 3d 3d 30 29 3b 0a 20 20 72 65 74 75 72  de)==0);.  retur
27210 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
27220 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20 61 20 72 65  ./*.** Turn a re
27230 6c 61 74 69 76 65 20 70 61 74 68 6e 61 6d 65 20  lative pathname 
27240 69 6e 74 6f 20 61 20 66 75 6c 6c 20 70 61 74 68  into a full path
27250 6e 61 6d 65 2e 20 54 68 65 20 72 65 6c 61 74 69  name. The relati
27260 76 65 20 70 61 74 68 0a 2a 2a 20 69 73 20 73 74  ve path.** is st
27270 6f 72 65 64 20 61 73 20 61 20 6e 75 6c 2d 74 65  ored as a nul-te
27280 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67 20  rminated string 
27290 69 6e 20 74 68 65 20 62 75 66 66 65 72 20 70 6f  in the buffer po
272a0 69 6e 74 65 64 20 74 6f 20 62 79 0a 2a 2a 20 7a  inted to by.** z
272b0 50 61 74 68 2e 20 0a 2a 2a 0a 2a 2a 20 7a 4f 75  Path. .**.** zOu
272c0 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 62 75  t points to a bu
272d0 66 66 65 72 20 6f 66 20 61 74 20 6c 65 61 73 74  ffer of at least
272e0 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 6d 78 50   sqlite3_vfs.mxP
272f0 61 74 68 6e 61 6d 65 20 62 79 74 65 73 20 0a 2a  athname bytes .*
27300 2a 20 28 69 6e 20 74 68 69 73 20 63 61 73 65 2c  * (in this case,
27310 20 4d 41 58 5f 50 41 54 48 4e 41 4d 45 20 62 79   MAX_PATHNAME by
27320 74 65 73 29 2e 20 54 68 65 20 66 75 6c 6c 2d 70  tes). The full-p
27330 61 74 68 20 69 73 20 77 72 69 74 74 65 6e 20 74  ath is written t
27340 6f 0a 2a 2a 20 74 68 69 73 20 62 75 66 66 65 72  o.** this buffer
27350 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
27360 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
27370 20 75 6e 69 78 46 75 6c 6c 50 61 74 68 6e 61 6d   unixFullPathnam
27380 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  e(.  sqlite3_vfs
27390 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20 20   *pVfs,         
273a0 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
273b0 20 76 66 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20   vfs object */. 
273c0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
273d0 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  th,            /
273e0 2a 20 50 6f 73 73 69 62 6c 79 20 72 65 6c 61 74  * Possibly relat
273f0 69 76 65 20 69 6e 70 75 74 20 70 61 74 68 20 2a  ive input path *
27400 2f 0a 20 20 69 6e 74 20 6e 4f 75 74 2c 20 20 20  /.  int nOut,   
27410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27420 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6f 75 74    /* Size of out
27430 70 75 74 20 62 75 66 66 65 72 20 69 6e 20 62 79  put buffer in by
27440 74 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  tes */.  char *z
27450 4f 75 74 20 20 20 20 20 20 20 20 20 20 20 20 20  Out             
27460 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74         /* Output
27470 20 62 75 66 66 65 72 20 2a 2f 0a 29 7b 0a 0a 20   buffer */.){.. 
27480 20 2f 2a 20 49 74 27 73 20 6f 64 64 20 74 6f 20   /* It's odd to 
27490 73 69 6d 75 6c 61 74 65 20 61 6e 20 69 6f 2d 65  simulate an io-e
274a0 72 72 6f 72 20 68 65 72 65 2c 20 62 75 74 20 72  rror here, but r
274b0 65 61 6c 6c 79 20 74 68 69 73 20 69 73 20 6a 75  eally this is ju
274c0 73 74 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74 68  st.  ** using th
274d0 65 20 69 6f 2d 65 72 72 6f 72 20 69 6e 66 72 61  e io-error infra
274e0 73 74 72 75 63 74 75 72 65 20 74 6f 20 74 65 73  structure to tes
274f0 74 20 74 68 61 74 20 53 51 4c 69 74 65 20 68 61  t that SQLite ha
27500 6e 64 6c 65 73 20 74 68 69 73 0a 20 20 2a 2a 20  ndles this.  ** 
27510 66 75 6e 63 74 69 6f 6e 20 66 61 69 6c 69 6e 67  function failing
27520 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
27530 63 6f 75 6c 64 20 66 61 69 6c 20 69 66 2c 20 66  could fail if, f
27540 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 0a  or example, the.
27550 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 77 6f 72    ** current wor
27560 6b 69 6e 67 20 64 69 72 65 63 74 6f 72 79 20 68  king directory h
27570 61 73 20 62 65 65 6e 20 75 6e 6c 69 6e 6b 65 64  as been unlinked
27580 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74  ..  */.  Simulat
27590 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
275a0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b   SQLITE_ERROR );
275b0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 56 66 73  ..  assert( pVfs
275c0 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 3d 3d 4d 41  ->mxPathname==MA
275d0 58 5f 50 41 54 48 4e 41 4d 45 20 29 3b 0a 20 20  X_PATHNAME );.  
275e0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
275f0 28 70 56 66 73 29 3b 0a 0a 20 20 7a 4f 75 74 5b  (pVfs);..  zOut[
27600 6e 4f 75 74 2d 31 5d 20 3d 20 27 5c 30 27 3b 0a  nOut-1] = '\0';.
27610 20 20 69 66 28 20 7a 50 61 74 68 5b 30 5d 3d 3d    if( zPath[0]==
27620 27 2f 27 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  '/' ){.    sqlit
27630 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4f 75 74  e3_snprintf(nOut
27640 2c 20 7a 4f 75 74 2c 20 22 25 73 22 2c 20 7a 50  , zOut, "%s", zP
27650 61 74 68 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ath);.  }else{. 
27660 20 20 20 69 6e 74 20 6e 43 77 64 3b 0a 20 20 20     int nCwd;.   
27670 20 69 66 28 20 67 65 74 63 77 64 28 7a 4f 75 74   if( getcwd(zOut
27680 2c 20 6e 4f 75 74 2d 31 29 3d 3d 30 20 29 7b 0a  , nOut-1)==0 ){.
27690 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
276a0 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50  ITE_CANTOPEN_BKP
276b0 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43 77  T;.    }.    nCw
276c0 64 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28  d = (int)strlen(
276d0 7a 4f 75 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  zOut);.    sqlit
276e0 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4f 75 74  e3_snprintf(nOut
276f0 2d 6e 43 77 64 2c 20 26 7a 4f 75 74 5b 6e 43 77  -nCwd, &zOut[nCw
27700 64 5d 2c 20 22 2f 25 73 22 2c 20 7a 50 61 74 68  d], "/%s", zPath
27710 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
27720 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 23  SQLITE_OK;.}...#
27730 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
27740 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f  IT_LOAD_EXTENSIO
27750 4e 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63  N./*.** Interfac
27760 65 73 20 66 6f 72 20 6f 70 65 6e 69 6e 67 20 61  es for opening a
27770 20 73 68 61 72 65 64 20 6c 69 62 72 61 72 79 2c   shared library,
27780 20 66 69 6e 64 69 6e 67 20 65 6e 74 72 79 20 70   finding entry p
27790 6f 69 6e 74 73 0a 2a 2a 20 77 69 74 68 69 6e 20  oints.** within 
277a0 74 68 65 20 73 68 61 72 65 64 20 6c 69 62 72 61  the shared libra
277b0 72 79 2c 20 61 6e 64 20 63 6c 6f 73 69 6e 67 20  ry, and closing 
277c0 74 68 65 20 73 68 61 72 65 64 20 6c 69 62 72 61  the shared libra
277d0 72 79 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20  ry..*/.#include 
277e0 3c 64 6c 66 63 6e 2e 68 3e 0a 73 74 61 74 69 63  <dlfcn.h>.static
277f0 20 76 6f 69 64 20 2a 75 6e 69 78 44 6c 4f 70 65   void *unixDlOpe
27800 6e 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e  n(sqlite3_vfs *N
27810 6f 74 55 73 65 64 2c 20 63 6f 6e 73 74 20 63 68  otUsed, const ch
27820 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a  ar *zFilename){.
27830 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
27840 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72  ER(NotUsed);.  r
27850 65 74 75 72 6e 20 64 6c 6f 70 65 6e 28 7a 46 69  eturn dlopen(zFi
27860 6c 65 6e 61 6d 65 2c 20 52 54 4c 44 5f 4e 4f 57  lename, RTLD_NOW
27870 20 7c 20 52 54 4c 44 5f 47 4c 4f 42 41 4c 29 3b   | RTLD_GLOBAL);
27880 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 51 4c 69 74 65  .}../*.** SQLite
27890 20 63 61 6c 6c 73 20 74 68 69 73 20 66 75 6e 63   calls this func
278a0 74 69 6f 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79  tion immediately
278b0 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f   after a call to
278c0 20 75 6e 69 78 44 6c 53 79 6d 28 29 20 6f 72 0a   unixDlSym() or.
278d0 2a 2a 20 75 6e 69 78 44 6c 4f 70 65 6e 28 29 20  ** unixDlOpen() 
278e0 66 61 69 6c 73 20 28 72 65 74 75 72 6e 73 20 61  fails (returns a
278f0 20 6e 75 6c 6c 20 70 6f 69 6e 74 65 72 29 2e 20   null pointer). 
27900 49 66 20 61 20 6d 6f 72 65 20 64 65 74 61 69 6c  If a more detail
27910 65 64 20 65 72 72 6f 72 0a 2a 2a 20 6d 65 73 73  ed error.** mess
27920 61 67 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65  age is available
27930 2c 20 69 74 20 69 73 20 77 72 69 74 74 65 6e 20  , it is written 
27940 74 6f 20 7a 42 75 66 4f 75 74 2e 20 49 66 20 6e  to zBufOut. If n
27950 6f 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a  o error message.
27960 2a 2a 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c  ** is available,
27970 20 7a 42 75 66 4f 75 74 20 69 73 20 6c 65 66 74   zBufOut is left
27980 20 75 6e 6d 6f 64 69 66 69 65 64 20 61 6e 64 20   unmodified and 
27990 53 51 4c 69 74 65 20 75 73 65 73 20 61 20 64 65  SQLite uses a de
279a0 66 61 75 6c 74 0a 2a 2a 20 65 72 72 6f 72 20 6d  fault.** error m
279b0 65 73 73 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69  essage..*/.stati
279c0 63 20 76 6f 69 64 20 75 6e 69 78 44 6c 45 72 72  c void unixDlErr
279d0 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  or(sqlite3_vfs *
279e0 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 6e 42 75  NotUsed, int nBu
279f0 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 4f 75 74  f, char *zBufOut
27a00 29 7b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 3b  ){.  char *zErr;
27a10 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
27a20 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
27a30 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
27a40 3b 0a 20 20 7a 45 72 72 20 3d 20 64 6c 65 72 72  ;.  zErr = dlerr
27a50 6f 72 28 29 3b 0a 20 20 69 66 28 20 7a 45 72 72  or();.  if( zErr
27a60 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
27a70 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2c 20 7a  snprintf(nBuf, z
27a80 42 75 66 4f 75 74 2c 20 22 25 73 22 2c 20 7a 45  BufOut, "%s", zE
27a90 72 72 29 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 4c  rr);.  }.  unixL
27aa0 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 7d 0a 73  eaveMutex();.}.s
27ab0 74 61 74 69 63 20 76 6f 69 64 20 28 2a 75 6e 69  tatic void (*uni
27ac0 78 44 6c 53 79 6d 28 73 71 6c 69 74 65 33 5f 76  xDlSym(sqlite3_v
27ad0 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 76 6f 69  fs *NotUsed, voi
27ae0 64 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  d *p, const char
27af0 2a 7a 53 79 6d 29 29 28 76 6f 69 64 29 7b 0a 20  *zSym))(void){. 
27b00 20 2f 2a 20 0a 20 20 2a 2a 20 47 43 43 20 77 69   /* .  ** GCC wi
27b10 74 68 20 2d 70 65 64 61 6e 74 69 63 2d 65 72 72  th -pedantic-err
27b20 6f 72 73 20 73 61 79 73 20 74 68 61 74 20 43 39  ors says that C9
27b30 30 20 64 6f 65 73 20 6e 6f 74 20 61 6c 6c 6f 77  0 does not allow
27b40 20 61 20 76 6f 69 64 2a 20 74 6f 20 62 65 0a 20   a void* to be. 
27b50 20 2a 2a 20 63 61 73 74 20 69 6e 74 6f 20 61 20   ** cast into a 
27b60 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e  pointer to a fun
27b70 63 74 69 6f 6e 2e 20 20 41 6e 64 20 79 65 74 20  ction.  And yet 
27b80 74 68 65 20 6c 69 62 72 61 72 79 20 64 6c 73 79  the library dlsy
27b90 6d 28 29 20 72 6f 75 74 69 6e 65 0a 20 20 2a 2a  m() routine.  **
27ba0 20 72 65 74 75 72 6e 73 20 61 20 76 6f 69 64 2a   returns a void*
27bb0 20 77 68 69 63 68 20 69 73 20 72 65 61 6c 6c 79   which is really
27bc0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
27bd0 66 75 6e 63 74 69 6f 6e 2e 20 20 53 6f 20 68 6f  function.  So ho
27be0 77 20 64 6f 20 77 65 0a 20 20 2a 2a 20 75 73 65  w do we.  ** use
27bf0 20 64 6c 73 79 6d 28 29 20 77 69 74 68 20 2d 70   dlsym() with -p
27c00 65 64 61 6e 74 69 63 2d 65 72 72 6f 72 73 3f 0a  edantic-errors?.
27c10 20 20 2a 2a 0a 20 20 2a 2a 20 56 61 72 69 61 62    **.  ** Variab
27c20 6c 65 20 78 20 62 65 6c 6f 77 20 69 73 20 64 65  le x below is de
27c30 66 69 6e 65 64 20 74 6f 20 62 65 20 61 20 70 6f  fined to be a po
27c40 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74  inter to a funct
27c50 69 6f 6e 20 74 61 6b 69 6e 67 0a 20 20 2a 2a 20  ion taking.  ** 
27c60 70 61 72 61 6d 65 74 65 72 73 20 76 6f 69 64 2a  parameters void*
27c70 20 61 6e 64 20 63 6f 6e 73 74 20 63 68 61 72 2a   and const char*
27c80 20 61 6e 64 20 72 65 74 75 72 6e 69 6e 67 20 61   and returning a
27c90 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 75   pointer to a fu
27ca0 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 57 65 20  nction..  ** We 
27cb0 69 6e 69 74 69 61 6c 69 7a 65 20 78 20 62 79 20  initialize x by 
27cc0 61 73 73 69 67 6e 69 6e 67 20 69 74 20 61 20 70  assigning it a p
27cd0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 64 6c  ointer to the dl
27ce0 73 79 6d 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a  sym() function..
27cf0 20 20 2a 2a 20 28 54 68 61 74 20 61 73 73 69 67    ** (That assig
27d00 6e 6d 65 6e 74 20 72 65 71 75 69 72 65 73 20 61  nment requires a
27d10 20 63 61 73 74 2e 29 20 20 54 68 65 6e 20 77 65   cast.)  Then we
27d20 20 63 61 6c 6c 20 74 68 65 20 66 75 6e 63 74 69   call the functi
27d30 6f 6e 20 74 68 61 74 0a 20 20 2a 2a 20 78 20 70  on that.  ** x p
27d40 6f 69 6e 74 73 20 74 6f 2e 20 20 0a 20 20 2a 2a  oints to.  .  **
27d50 0a 20 20 2a 2a 20 54 68 69 73 20 77 6f 72 6b 2d  .  ** This work-
27d60 61 72 6f 75 6e 64 20 69 73 20 75 6e 6c 69 6b 65  around is unlike
27d70 6c 79 20 74 6f 20 77 6f 72 6b 20 63 6f 72 72 65  ly to work corre
27d80 63 74 6c 79 20 6f 6e 20 61 6e 79 20 73 79 73 74  ctly on any syst
27d90 65 6d 20 77 68 65 72 65 0a 20 20 2a 2a 20 79 6f  em where.  ** yo
27da0 75 20 72 65 61 6c 6c 79 20 63 61 6e 6e 6f 74 20  u really cannot 
27db0 63 61 73 74 20 61 20 66 75 6e 63 74 69 6f 6e 20  cast a function 
27dc0 70 6f 69 6e 74 65 72 20 69 6e 74 6f 20 76 6f 69  pointer into voi
27dd0 64 2a 2e 20 20 42 75 74 20 74 68 65 6e 2c 20 6f  d*.  But then, o
27de0 6e 20 74 68 65 0a 20 20 2a 2a 20 6f 74 68 65 72  n the.  ** other
27df0 20 68 61 6e 64 2c 20 64 6c 73 79 6d 28 29 20 77   hand, dlsym() w
27e00 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20  ill not work on 
27e10 73 75 63 68 20 61 20 73 79 73 74 65 6d 20 65 69  such a system ei
27e20 74 68 65 72 2c 20 73 6f 20 77 65 20 68 61 76 65  ther, so we have
27e30 0a 20 20 2a 2a 20 6e 6f 74 20 72 65 61 6c 6c 79  .  ** not really
27e40 20 6c 6f 73 74 20 61 6e 79 74 68 69 6e 67 2e 0a   lost anything..
27e50 20 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 28 2a    */.  void (*(*
27e60 78 29 28 76 6f 69 64 2a 2c 63 6f 6e 73 74 20 63  x)(void*,const c
27e70 68 61 72 2a 29 29 28 76 6f 69 64 29 3b 0a 20 20  har*))(void);.  
27e80 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
27e90 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 78 20 3d  (NotUsed);.  x =
27ea0 20 28 76 6f 69 64 28 2a 28 2a 29 28 76 6f 69 64   (void(*(*)(void
27eb0 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 29 28  *,const char*))(
27ec0 76 6f 69 64 29 29 64 6c 73 79 6d 3b 0a 20 20 72  void))dlsym;.  r
27ed0 65 74 75 72 6e 20 28 2a 78 29 28 70 2c 20 7a 53  eturn (*x)(p, zS
27ee0 79 6d 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  ym);.}.static vo
27ef0 69 64 20 75 6e 69 78 44 6c 43 6c 6f 73 65 28 73  id unixDlClose(s
27f00 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55  qlite3_vfs *NotU
27f10 73 65 64 2c 20 76 6f 69 64 20 2a 70 48 61 6e 64  sed, void *pHand
27f20 6c 65 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  le){.  UNUSED_PA
27f30 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
27f40 3b 0a 20 20 64 6c 63 6c 6f 73 65 28 70 48 61 6e  ;.  dlclose(pHan
27f50 64 6c 65 29 3b 0a 7d 0a 23 65 6c 73 65 20 2f 2a  dle);.}.#else /*
27f60 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   if SQLITE_OMIT_
27f70 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 20 69  LOAD_EXTENSION i
27f80 73 20 64 65 66 69 6e 65 64 3a 20 2a 2f 0a 20 20  s defined: */.  
27f90 23 64 65 66 69 6e 65 20 75 6e 69 78 44 6c 4f 70  #define unixDlOp
27fa0 65 6e 20 20 30 0a 20 20 23 64 65 66 69 6e 65 20  en  0.  #define 
27fb0 75 6e 69 78 44 6c 45 72 72 6f 72 20 30 0a 20 20  unixDlError 0.  
27fc0 23 64 65 66 69 6e 65 20 75 6e 69 78 44 6c 53 79  #define unixDlSy
27fd0 6d 20 20 20 30 0a 20 20 23 64 65 66 69 6e 65 20  m   0.  #define 
27fe0 75 6e 69 78 44 6c 43 6c 6f 73 65 20 30 0a 23 65  unixDlClose 0.#e
27ff0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  ndif../*.** Writ
28000 65 20 6e 42 75 66 20 62 79 74 65 73 20 6f 66 20  e nBuf bytes of 
28010 72 61 6e 64 6f 6d 20 64 61 74 61 20 74 6f 20 74  random data to t
28020 68 65 20 73 75 70 70 6c 69 65 64 20 62 75 66 66  he supplied buff
28030 65 72 20 7a 42 75 66 2e 0a 2a 2f 0a 73 74 61 74  er zBuf..*/.stat
28040 69 63 20 69 6e 74 20 75 6e 69 78 52 61 6e 64 6f  ic int unixRando
28050 6d 6e 65 73 73 28 73 71 6c 69 74 65 33 5f 76 66  mness(sqlite3_vf
28060 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20  s *NotUsed, int 
28070 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66  nBuf, char *zBuf
28080 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
28090 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
280a0 20 20 61 73 73 65 72 74 28 28 73 69 7a 65 5f 74    assert((size_t
280b0 29 6e 42 75 66 3e 3d 28 73 69 7a 65 6f 66 28 74  )nBuf>=(sizeof(t
280c0 69 6d 65 5f 74 29 2b 73 69 7a 65 6f 66 28 69 6e  ime_t)+sizeof(in
280d0 74 29 29 29 3b 0a 0a 20 20 2f 2a 20 57 65 20 68  t)));..  /* We h
280e0 61 76 65 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a  ave to initializ
280f0 65 20 7a 42 75 66 20 74 6f 20 70 72 65 76 65 6e  e zBuf to preven
28100 74 20 76 61 6c 67 72 69 6e 64 20 66 72 6f 6d 20  t valgrind from 
28110 72 65 70 6f 72 74 69 6e 67 0a 20 20 2a 2a 20 65  reporting.  ** e
28120 72 72 6f 72 73 2e 20 20 54 68 65 20 72 65 70 6f  rrors.  The repo
28130 72 74 73 20 69 73 73 75 65 64 20 62 79 20 76 61  rts issued by va
28140 6c 67 72 69 6e 64 20 61 72 65 20 69 6e 63 6f 72  lgrind are incor
28150 72 65 63 74 20 2d 20 77 65 20 77 6f 75 6c 64 0a  rect - we would.
28160 20 20 2a 2a 20 70 72 65 66 65 72 20 74 68 61 74    ** prefer that
28170 20 74 68 65 20 72 61 6e 64 6f 6d 6e 65 73 73 20   the randomness 
28180 62 65 20 69 6e 63 72 65 61 73 65 64 20 62 79 20  be increased by 
28190 6d 61 6b 69 6e 67 20 75 73 65 20 6f 66 20 74 68  making use of th
281a0 65 0a 20 20 2a 2a 20 75 6e 69 6e 69 74 69 61 6c  e.  ** uninitial
281b0 69 7a 65 64 20 73 70 61 63 65 20 69 6e 20 7a 42  ized space in zB
281c0 75 66 20 2d 20 62 75 74 20 76 61 6c 67 72 69 6e  uf - but valgrin
281d0 64 20 65 72 72 6f 72 73 20 74 65 6e 64 20 74 6f  d errors tend to
281e0 20 77 6f 72 72 79 0a 20 20 2a 2a 20 73 6f 6d 65   worry.  ** some
281f0 20 75 73 65 72 73 2e 20 20 52 61 74 68 65 72 20   users.  Rather 
28200 74 68 61 6e 20 61 72 67 75 65 2c 20 69 74 20 73  than argue, it s
28210 65 65 6d 73 20 65 61 73 69 65 72 20 6a 75 73 74  eems easier just
28220 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 0a 20   to initialize. 
28230 20 2a 2a 20 74 68 65 20 77 68 6f 6c 65 20 61 72   ** the whole ar
28240 72 61 79 20 61 6e 64 20 73 69 6c 65 6e 63 65 20  ray and silence 
28250 76 61 6c 67 72 69 6e 64 2c 20 65 76 65 6e 20 69  valgrind, even i
28260 66 20 74 68 61 74 20 6d 65 61 6e 73 20 6c 65 73  f that means les
28270 73 20 72 61 6e 64 6f 6d 6e 65 73 73 0a 20 20 2a  s randomness.  *
28280 2a 20 69 6e 20 74 68 65 20 72 61 6e 64 6f 6d 20  * in the random 
28290 73 65 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  seed..  **.  ** 
282a0 57 68 65 6e 20 74 65 73 74 69 6e 67 2c 20 69 6e  When testing, in
282b0 69 74 69 61 6c 69 7a 69 6e 67 20 7a 42 75 66 5b  itializing zBuf[
282c0 5d 20 74 6f 20 7a 65 72 6f 20 69 73 20 61 6c 6c  ] to zero is all
282d0 20 77 65 20 64 6f 2e 20 20 54 68 61 74 20 6d 65   we do.  That me
282e0 61 6e 73 0a 20 20 2a 2a 20 74 68 61 74 20 77 65  ans.  ** that we
282f0 20 61 6c 77 61 79 73 20 75 73 65 20 74 68 65 20   always use the 
28300 73 61 6d 65 20 72 61 6e 64 6f 6d 20 6e 75 6d 62  same random numb
28310 65 72 20 73 65 71 75 65 6e 63 65 2e 20 20 54 68  er sequence.  Th
28320 69 73 20 6d 61 6b 65 73 20 74 68 65 0a 20 20 2a  is makes the.  *
28330 2a 20 74 65 73 74 73 20 72 65 70 65 61 74 61 62  * tests repeatab
28340 6c 65 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65  le..  */.  memse
28350 74 28 7a 42 75 66 2c 20 30 2c 20 6e 42 75 66 29  t(zBuf, 0, nBuf)
28360 3b 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ;.#if !defined(S
28370 51 4c 49 54 45 5f 54 45 53 54 29 0a 20 20 7b 0a  QLITE_TEST).  {.
28380 20 20 20 20 69 6e 74 20 70 69 64 2c 20 66 64 3b      int pid, fd;
28390 0a 20 20 20 20 66 64 20 3d 20 6f 70 65 6e 28 22  .    fd = open("
283a0 2f 64 65 76 2f 75 72 61 6e 64 6f 6d 22 2c 20 4f  /dev/urandom", O
283b0 5f 52 44 4f 4e 4c 59 29 3b 0a 20 20 20 20 69 66  _RDONLY);.    if
283c0 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 20 20  ( fd<0 ){.      
283d0 74 69 6d 65 5f 74 20 74 3b 0a 20 20 20 20 20 20  time_t t;.      
283e0 74 69 6d 65 28 26 74 29 3b 0a 20 20 20 20 20 20  time(&t);.      
283f0 6d 65 6d 63 70 79 28 7a 42 75 66 2c 20 26 74 2c  memcpy(zBuf, &t,
28400 20 73 69 7a 65 6f 66 28 74 29 29 3b 0a 20 20 20   sizeof(t));.   
28410 20 20 20 70 69 64 20 3d 20 67 65 74 70 69 64 28     pid = getpid(
28420 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  );.      memcpy(
28430 26 7a 42 75 66 5b 73 69 7a 65 6f 66 28 74 29 5d  &zBuf[sizeof(t)]
28440 2c 20 26 70 69 64 2c 20 73 69 7a 65 6f 66 28 70  , &pid, sizeof(p
28450 69 64 29 29 3b 0a 20 20 20 20 20 20 61 73 73 65  id));.      asse
28460 72 74 28 20 73 69 7a 65 6f 66 28 74 29 2b 73 69  rt( sizeof(t)+si
28470 7a 65 6f 66 28 70 69 64 29 3c 3d 28 73 69 7a 65  zeof(pid)<=(size
28480 5f 74 29 6e 42 75 66 20 29 3b 0a 20 20 20 20 20  _t)nBuf );.     
28490 20 6e 42 75 66 20 3d 20 73 69 7a 65 6f 66 28 74   nBuf = sizeof(t
284a0 29 20 2b 20 73 69 7a 65 6f 66 28 70 69 64 29 3b  ) + sizeof(pid);
284b0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
284c0 20 20 6e 42 75 66 20 3d 20 72 65 61 64 28 66 64    nBuf = read(fd
284d0 2c 20 7a 42 75 66 2c 20 6e 42 75 66 29 3b 0a 20  , zBuf, nBuf);. 
284e0 20 20 20 20 20 63 6c 6f 73 65 28 66 64 29 3b 0a       close(fd);.
284f0 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
28500 0a 20 20 72 65 74 75 72 6e 20 6e 42 75 66 3b 0a  .  return nBuf;.
28510 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20  }.../*.** Sleep 
28520 66 6f 72 20 61 20 6c 69 74 74 6c 65 20 77 68 69  for a little whi
28530 6c 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  le.  Return the 
28540 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65 20 73  amount of time s
28550 6c 65 70 74 2e 0a 2a 2a 20 54 68 65 20 61 72 67  lept..** The arg
28560 75 6d 65 6e 74 20 69 73 20 74 68 65 20 6e 75 6d  ument is the num
28570 62 65 72 20 6f 66 20 6d 69 63 72 6f 73 65 63 6f  ber of microseco
28580 6e 64 73 20 77 65 20 77 61 6e 74 20 74 6f 20 73  nds we want to s
28590 6c 65 65 70 2e 0a 2a 2a 20 54 68 65 20 72 65 74  leep..** The ret
285a0 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74 68 65  urn value is the
285b0 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 63 72 6f   number of micro
285c0 73 65 63 6f 6e 64 73 20 6f 66 20 73 6c 65 65 70  seconds of sleep
285d0 20 61 63 74 75 61 6c 6c 79 0a 2a 2a 20 72 65 71   actually.** req
285e0 75 65 73 74 65 64 20 66 72 6f 6d 20 74 68 65 20  uested from the 
285f0 75 6e 64 65 72 6c 79 69 6e 67 20 6f 70 65 72 61  underlying opera
28600 74 69 6e 67 20 73 79 73 74 65 6d 2c 20 61 20 6e  ting system, a n
28610 75 6d 62 65 72 20 77 68 69 63 68 0a 2a 2a 20 6d  umber which.** m
28620 69 67 68 74 20 62 65 20 67 72 65 61 74 65 72 20  ight be greater 
28630 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
28640 20 74 68 65 20 61 72 67 75 6d 65 6e 74 2c 20 62   the argument, b
28650 75 74 20 6e 6f 74 20 6c 65 73 73 0a 2a 2a 20 74  ut not less.** t
28660 68 61 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74  han the argument
28670 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
28680 75 6e 69 78 53 6c 65 65 70 28 73 71 6c 69 74 65  unixSleep(sqlite
28690 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20  3_vfs *NotUsed, 
286a0 69 6e 74 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73  int microseconds
286b0 29 7b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b  ){.#if OS_VXWORK
286c0 53 0a 20 20 73 74 72 75 63 74 20 74 69 6d 65 73  S.  struct times
286d0 70 65 63 20 73 70 3b 0a 0a 20 20 73 70 2e 74 76  pec sp;..  sp.tv
286e0 5f 73 65 63 20 3d 20 6d 69 63 72 6f 73 65 63 6f  _sec = microseco
286f0 6e 64 73 20 2f 20 31 30 30 30 30 30 30 3b 0a 20  nds / 1000000;. 
28700 20 73 70 2e 74 76 5f 6e 73 65 63 20 3d 20 28 6d   sp.tv_nsec = (m
28710 69 63 72 6f 73 65 63 6f 6e 64 73 20 25 20 31 30  icroseconds % 10
28720 30 30 30 30 30 29 20 2a 20 31 30 30 30 3b 0a 20  00000) * 1000;. 
28730 20 6e 61 6e 6f 73 6c 65 65 70 28 26 73 70 2c 20   nanosleep(&sp, 
28740 4e 55 4c 4c 29 3b 0a 20 20 55 4e 55 53 45 44 5f  NULL);.  UNUSED_
28750 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
28760 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 6d 69 63  d);.  return mic
28770 72 6f 73 65 63 6f 6e 64 73 3b 0a 23 65 6c 69 66  roseconds;.#elif
28780 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f 55 53   defined(HAVE_US
28790 4c 45 45 50 29 20 26 26 20 48 41 56 45 5f 55 53  LEEP) && HAVE_US
287a0 4c 45 45 50 0a 20 20 75 73 6c 65 65 70 28 6d 69  LEEP.  usleep(mi
287b0 63 72 6f 73 65 63 6f 6e 64 73 29 3b 0a 20 20 55  croseconds);.  U
287c0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
287d0 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75  NotUsed);.  retu
287e0 72 6e 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 3b  rn microseconds;
287f0 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 73 65 63  .#else.  int sec
28800 6f 6e 64 73 20 3d 20 28 6d 69 63 72 6f 73 65 63  onds = (microsec
28810 6f 6e 64 73 2b 39 39 39 39 39 39 29 2f 31 30 30  onds+999999)/100
28820 30 30 30 30 3b 0a 20 20 73 6c 65 65 70 28 73 65  0000;.  sleep(se
28830 63 6f 6e 64 73 29 3b 0a 20 20 55 4e 55 53 45 44  conds);.  UNUSED
28840 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
28850 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 65  ed);.  return se
28860 63 6f 6e 64 73 2a 31 30 30 30 30 30 30 3b 0a 23  conds*1000000;.#
28870 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  endif.}../*.** T
28880 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72  he following var
28890 69 61 62 6c 65 2c 20 69 66 20 73 65 74 20 74 6f  iable, if set to
288a0 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75   a non-zero valu
288b0 65 2c 20 69 73 20 69 6e 74 65 72 70 72 65 74 65  e, is interprete
288c0 64 20 61 73 0a 2a 2a 20 74 68 65 20 6e 75 6d 62  d as.** the numb
288d0 65 72 20 6f 66 20 73 65 63 6f 6e 64 73 20 73 69  er of seconds si
288e0 6e 63 65 20 31 39 37 30 20 61 6e 64 20 69 73 20  nce 1970 and is 
288f0 75 73 65 64 20 74 6f 20 73 65 74 20 74 68 65 20  used to set the 
28900 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20 73 71 6c  result of.** sql
28910 69 74 65 33 4f 73 43 75 72 72 65 6e 74 54 69 6d  ite3OsCurrentTim
28920 65 28 29 20 64 75 72 69 6e 67 20 74 65 73 74 69  e() during testi
28930 6e 67 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  ng..*/.#ifdef SQ
28940 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71  LITE_TEST.int sq
28950 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69  lite3_current_ti
28960 6d 65 20 3d 20 30 3b 20 20 2f 2a 20 46 61 6b 65  me = 0;  /* Fake
28970 20 73 79 73 74 65 6d 20 74 69 6d 65 20 69 6e 20   system time in 
28980 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 31 39  seconds since 19
28990 37 30 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f  70. */.#endif../
289a0 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 63 75  *.** Find the cu
289b0 72 72 65 6e 74 20 74 69 6d 65 20 28 69 6e 20 55  rrent time (in U
289c0 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e  niversal Coordin
289d0 61 74 65 64 20 54 69 6d 65 29 2e 20 20 57 72 69  ated Time).  Wri
289e0 74 65 20 69 6e 74 6f 20 2a 70 69 4e 6f 77 0a 2a  te into *piNow.*
289f0 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 69  * the current ti
28a00 6d 65 20 61 6e 64 20 64 61 74 65 20 61 73 20 61  me and date as a
28a10 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62   Julian Day numb
28a20 65 72 20 74 69 6d 65 73 20 38 36 5f 34 30 30 5f  er times 86_400_
28a30 30 30 30 2e 20 20 49 6e 0a 2a 2a 20 6f 74 68 65  000.  In.** othe
28a40 72 20 77 6f 72 64 73 2c 20 77 72 69 74 65 20 69  r words, write i
28a50 6e 74 6f 20 2a 70 69 4e 6f 77 20 74 68 65 20 6e  nto *piNow the n
28a60 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65  umber of millise
28a70 63 6f 6e 64 73 20 73 69 6e 63 65 20 74 68 65 20  conds since the 
28a80 4a 75 6c 69 61 6e 0a 2a 2a 20 65 70 6f 63 68 20  Julian.** epoch 
28a90 6f 66 20 6e 6f 6f 6e 20 69 6e 20 47 72 65 65 6e  of noon in Green
28aa0 77 69 63 68 20 6f 6e 20 4e 6f 76 65 6d 62 65 72  wich on November
28ab0 20 32 34 2c 20 34 37 31 34 20 42 2e 43 20 61 63   24, 4714 B.C ac
28ac0 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 0a 2a  cording to the.*
28ad0 2a 20 70 72 6f 6c 65 70 74 69 63 20 47 72 65 67  * proleptic Greg
28ae0 6f 72 69 61 6e 20 63 61 6c 65 6e 64 61 72 2e 0a  orian calendar..
28af0 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73  **.** On success
28b00 2c 20 72 65 74 75 72 6e 20 30 2e 20 20 52 65 74  , return 0.  Ret
28b10 75 72 6e 20 31 20 69 66 20 74 68 65 20 74 69 6d  urn 1 if the tim
28b20 65 20 61 6e 64 20 64 61 74 65 20 63 61 6e 6e 6f  e and date canno
28b30 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73  t be found..*/.s
28b40 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 43 75  tatic int unixCu
28b50 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 28 73  rrentTimeInt64(s
28b60 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55  qlite3_vfs *NotU
28b70 73 65 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74  sed, sqlite3_int
28b80 36 34 20 2a 70 69 4e 6f 77 29 7b 0a 20 20 73 74  64 *piNow){.  st
28b90 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74  atic const sqlit
28ba0 65 33 5f 69 6e 74 36 34 20 75 6e 69 78 45 70 6f  e3_int64 unixEpo
28bb0 63 68 20 3d 20 32 34 34 30 35 38 37 35 2a 28 73  ch = 24405875*(s
28bc0 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 38 36 34  qlite3_int64)864
28bd0 30 30 30 30 3b 0a 23 69 66 20 64 65 66 69 6e 65  0000;.#if define
28be0 64 28 4e 4f 5f 47 45 54 54 4f 44 29 0a 20 20 74  d(NO_GETTOD).  t
28bf0 69 6d 65 5f 74 20 74 3b 0a 20 20 74 69 6d 65 28  ime_t t;.  time(
28c00 26 74 29 3b 0a 20 20 2a 70 69 4e 6f 77 20 3d 20  &t);.  *piNow = 
28c10 28 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29  ((sqlite3_int64)
28c20 69 29 2a 31 30 30 30 20 2b 20 75 6e 69 78 45 70  i)*1000 + unixEp
28c30 6f 63 68 3b 0a 23 65 6c 69 66 20 4f 53 5f 56 58  och;.#elif OS_VX
28c40 57 4f 52 4b 53 0a 20 20 73 74 72 75 63 74 20 74  WORKS.  struct t
28c50 69 6d 65 73 70 65 63 20 73 4e 6f 77 3b 0a 20 20  imespec sNow;.  
28c60 63 6c 6f 63 6b 5f 67 65 74 74 69 6d 65 28 43 4c  clock_gettime(CL
28c70 4f 43 4b 5f 52 45 41 4c 54 49 4d 45 2c 20 26 73  OCK_REALTIME, &s
28c80 4e 6f 77 29 3b 0a 20 20 2a 70 69 4e 6f 77 20 3d  Now);.  *piNow =
28c90 20 75 6e 69 78 45 70 6f 63 68 20 2b 20 31 30 30   unixEpoch + 100
28ca0 30 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  0*(sqlite3_int64
28cb0 29 73 4e 6f 77 2e 74 76 5f 73 65 63 20 2b 20 73  )sNow.tv_sec + s
28cc0 4e 6f 77 2e 74 76 5f 6e 73 65 63 2f 31 30 30 30  Now.tv_nsec/1000
28cd0 30 30 30 3b 0a 23 65 6c 73 65 0a 20 20 73 74 72  000;.#else.  str
28ce0 75 63 74 20 74 69 6d 65 76 61 6c 20 73 4e 6f 77  uct timeval sNow
28cf0 3b 0a 20 20 67 65 74 74 69 6d 65 6f 66 64 61 79  ;.  gettimeofday
28d00 28 26 73 4e 6f 77 2c 20 30 29 3b 0a 20 20 2a 70  (&sNow, 0);.  *p
28d10 69 4e 6f 77 20 3d 20 75 6e 69 78 45 70 6f 63 68  iNow = unixEpoch
28d20 20 2b 20 31 30 30 30 2a 28 73 71 6c 69 74 65 33   + 1000*(sqlite3
28d30 5f 69 6e 74 36 34 29 73 4e 6f 77 2e 74 76 5f 73  _int64)sNow.tv_s
28d40 65 63 20 2b 20 73 4e 6f 77 2e 74 76 5f 75 73 65  ec + sNow.tv_use
28d50 63 2f 31 30 30 30 3b 0a 23 65 6e 64 69 66 0a 0a  c/1000;.#endif..
28d60 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
28d70 53 54 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ST.  if( sqlite3
28d80 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 29 7b  _current_time ){
28d90 0a 20 20 20 20 2a 70 69 4e 6f 77 20 3d 20 31 30  .    *piNow = 10
28da0 30 30 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36  00*(sqlite3_int6
28db0 34 29 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e  4)sqlite3_curren
28dc0 74 5f 74 69 6d 65 20 2b 20 75 6e 69 78 45 70 6f  t_time + unixEpo
28dd0 63 68 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ch;.  }.#endif. 
28de0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
28df0 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65  R(NotUsed);.  re
28e00 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
28e10 20 46 69 6e 64 20 74 68 65 20 63 75 72 72 65 6e   Find the curren
28e20 74 20 74 69 6d 65 20 28 69 6e 20 55 6e 69 76 65  t time (in Unive
28e30 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65 64  rsal Coordinated
28e40 20 54 69 6d 65 29 2e 20 20 57 72 69 74 65 20 74   Time).  Write t
28e50 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 74 69  he.** current ti
28e60 6d 65 20 61 6e 64 20 64 61 74 65 20 61 73 20 61  me and date as a
28e70 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62   Julian Day numb
28e80 65 72 20 69 6e 74 6f 20 2a 70 72 4e 6f 77 20 61  er into *prNow a
28e90 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20 30 2e 20  nd.** return 0. 
28ea0 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65   Return 1 if the
28eb0 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 63   time and date c
28ec0 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a  annot be found..
28ed0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
28ee0 69 78 43 75 72 72 65 6e 74 54 69 6d 65 28 73 71  ixCurrentTime(sq
28ef0 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73  lite3_vfs *NotUs
28f00 65 64 2c 20 64 6f 75 62 6c 65 20 2a 70 72 4e 6f  ed, double *prNo
28f10 77 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  w){.  sqlite3_in
28f20 74 36 34 20 69 3b 0a 20 20 75 6e 69 78 43 75 72  t64 i;.  unixCur
28f30 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 28 30 2c  rentTimeInt64(0,
28f40 20 26 69 29 3b 0a 20 20 2a 70 72 4e 6f 77 20 3d   &i);.  *prNow =
28f50 20 69 2f 38 36 34 30 30 30 30 30 2e 30 3b 0a 20   i/86400000.0;. 
28f60 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
28f70 0a 2a 2a 20 57 65 20 61 64 64 65 64 20 74 68 65  .** We added the
28f80 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29   xGetLastError()
28f90 20 6d 65 74 68 6f 64 20 77 69 74 68 20 74 68 65   method with the
28fa0 20 69 6e 74 65 6e 74 69 6f 6e 20 6f 66 20 70 72   intention of pr
28fb0 6f 76 69 64 69 6e 67 0a 2a 2a 20 62 65 74 74 65  oviding.** bette
28fc0 72 20 6c 6f 77 2d 6c 65 76 65 6c 20 65 72 72 6f  r low-level erro
28fd0 72 20 6d 65 73 73 61 67 65 73 20 77 68 65 6e 20  r messages when 
28fe0 6f 70 65 72 61 74 69 6e 67 2d 73 79 73 74 65 6d  operating-system
28ff0 20 70 72 6f 62 6c 65 6d 73 20 63 6f 6d 65 20 75   problems come u
29000 70 0a 2a 2a 20 64 75 72 69 6e 67 20 53 51 4c 69  p.** during SQLi
29010 74 65 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 42  te operation.  B
29020 75 74 20 73 6f 20 66 61 72 2c 20 6e 6f 6e 65 20  ut so far, none 
29030 6f 66 20 74 68 61 74 20 68 61 73 20 62 65 65 6e  of that has been
29040 20 69 6d 70 6c 65 6d 65 6e 74 65 64 0a 2a 2a 20   implemented.** 
29050 69 6e 20 74 68 65 20 63 6f 72 65 2e 20 20 53 6f  in the core.  So
29060 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
29070 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 2e 20 20   never called.  
29080 46 6f 72 20 6e 6f 77 2c 20 69 74 20 69 73 20 6d  For now, it is m
29090 65 72 65 6c 79 0a 2a 2a 20 61 20 70 6c 61 63 65  erely.** a place
290a0 2d 68 6f 6c 64 65 72 2e 0a 2a 2f 0a 73 74 61 74  -holder..*/.stat
290b0 69 63 20 69 6e 74 20 75 6e 69 78 47 65 74 4c 61  ic int unixGetLa
290c0 73 74 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f  stError(sqlite3_
290d0 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e  vfs *NotUsed, in
290e0 74 20 4e 6f 74 55 73 65 64 32 2c 20 63 68 61 72  t NotUsed2, char
290f0 20 2a 4e 6f 74 55 73 65 64 33 29 7b 0a 20 20 55   *NotUsed3){.  U
29100 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
29110 4e 6f 74 55 73 65 64 29 3b 0a 20 20 55 4e 55 53  NotUsed);.  UNUS
29120 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
29130 55 73 65 64 32 29 3b 0a 20 20 55 4e 55 53 45 44  Used2);.  UNUSED
29140 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
29150 65 64 33 29 3b 0a 20 20 72 65 74 75 72 6e 20 30  ed3);.  return 0
29160 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a 2a 2a  ;.}.../*.*******
29170 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29180 2a 20 45 6e 64 20 6f 66 20 73 71 6c 69 74 65 33  * End of sqlite3
29190 5f 76 66 73 20 6d 65 74 68 6f 64 73 20 2a 2a 2a  _vfs methods ***
291a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
291b0 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
291c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
291d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
291e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
291f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29200 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a  *******/../*****
29210 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29220 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29230 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29240 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29250 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
29260 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29270 2a 2a 2a 2a 20 42 65 67 69 6e 20 50 72 6f 78 79  **** Begin Proxy
29280 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a   Locking *******
29290 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
292a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20  *********.**.** 
292b0 50 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73  Proxy locking is
292c0 20 61 20 22 75 62 65 72 2d 6c 6f 63 6b 69 6e 67   a "uber-locking
292d0 2d 6d 65 74 68 6f 64 22 20 69 6e 20 74 68 69 73  -method" in this
292e0 20 73 65 6e 73 65 3a 20 20 49 74 20 75 73 65 73   sense:  It uses
292f0 20 74 68 65 0a 2a 2a 20 6f 74 68 65 72 20 6c 6f   the.** other lo
29300 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73 20 6f 6e  cking methods on
29310 20 73 65 63 6f 6e 64 61 72 79 20 6c 6f 63 6b 20   secondary lock 
29320 66 69 6c 65 73 2e 20 20 50 72 6f 78 79 20 6c 6f  files.  Proxy lo
29330 63 6b 69 6e 67 20 69 73 20 61 0a 2a 2a 20 6d 65  cking is a.** me
29340 74 61 2d 6c 61 79 65 72 20 6f 76 65 72 20 74 6f  ta-layer over to
29350 70 20 6f 66 20 74 68 65 20 70 72 69 6d 69 74 69  p of the primiti
29360 76 65 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c 65  ve locking imple
29370 6d 65 6e 74 65 64 20 61 62 6f 76 65 2e 20 20 46  mented above.  F
29380 6f 72 0a 2a 2a 20 74 68 69 73 20 72 65 61 73 6f  or.** this reaso
29390 6e 2c 20 74 68 65 20 64 69 76 69 73 69 6f 6e 20  n, the division 
293a0 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20  that implements 
293b0 6f 66 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67  of proxy locking
293c0 20 69 73 20 64 65 66 65 72 72 65 64 0a 2a 2a 20   is deferred.** 
293d0 75 6e 74 69 6c 20 6c 61 74 65 20 69 6e 20 74 68  until late in th
293e0 65 20 66 69 6c 65 20 28 68 65 72 65 29 20 61 66  e file (here) af
293f0 74 65 72 20 61 6c 6c 20 6f 66 20 74 68 65 20 6f  ter all of the o
29400 74 68 65 72 20 49 2f 4f 20 6d 65 74 68 6f 64 73  ther I/O methods
29410 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20 64 65   have.** been de
29420 66 69 6e 65 64 20 2d 20 73 6f 20 74 68 61 74 20  fined - so that 
29430 74 68 65 20 70 72 69 6d 69 74 69 76 65 20 6c 6f  the primitive lo
29440 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73 20 61 72  cking methods ar
29450 65 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 61  e available.** a
29460 73 20 73 65 72 76 69 63 65 73 20 74 6f 20 68 65  s services to he
29470 6c 70 20 77 69 74 68 20 74 68 65 20 69 6d 70 6c  lp with the impl
29480 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 70 72  ementation of pr
29490 6f 78 79 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2a 0a  oxy locking..**.
294a0 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64  ****.**.** The d
294b0 65 66 61 75 6c 74 20 6c 6f 63 6b 69 6e 67 20 73  efault locking s
294c0 63 68 65 6d 65 73 20 69 6e 20 53 51 4c 69 74 65  chemes in SQLite
294d0 20 75 73 65 20 62 79 74 65 2d 72 61 6e 67 65 20   use byte-range 
294e0 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 0a 2a 2a 20  locks on the.** 
294f0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
29500 20 63 6f 6f 72 64 69 6e 61 74 65 20 73 61 66 65   coordinate safe
29510 2c 20 63 6f 6e 63 75 72 72 65 6e 74 20 61 63 63  , concurrent acc
29520 65 73 73 20 62 79 20 6d 75 6c 74 69 70 6c 65 20  ess by multiple 
29530 72 65 61 64 65 72 73 0a 2a 2a 20 61 6e 64 20 77  readers.** and w
29540 72 69 74 65 72 73 20 5b 68 74 74 70 3a 2f 2f 73  riters [http://s
29550 71 6c 69 74 65 2e 6f 72 67 2f 6c 6f 63 6b 69 6e  qlite.org/lockin
29560 67 76 33 2e 68 74 6d 6c 5d 2e 20 20 54 68 65 20  gv3.html].  The 
29570 66 69 76 65 20 66 69 6c 65 20 6c 6f 63 6b 69 6e  five file lockin
29580 67 0a 2a 2a 20 73 74 61 74 65 73 20 28 55 4e 4c  g.** states (UNL
29590 4f 43 4b 45 44 2c 20 50 45 4e 44 49 4e 47 2c 20  OCKED, PENDING, 
295a0 53 48 41 52 45 44 2c 20 52 45 53 45 52 56 45 44  SHARED, RESERVED
295b0 2c 20 45 58 43 4c 55 53 49 56 45 29 20 61 72 65  , EXCLUSIVE) are
295c0 20 69 6d 70 6c 65 6d 65 6e 74 65 64 0a 2a 2a 20   implemented.** 
295d0 61 73 20 50 4f 53 49 58 20 72 65 61 64 20 26 20  as POSIX read & 
295e0 77 72 69 74 65 20 6c 6f 63 6b 73 20 6f 76 65 72  write locks over
295f0 20 66 69 78 65 64 20 73 65 74 20 6f 66 20 6c 6f   fixed set of lo
29600 63 61 74 69 6f 6e 73 20 28 76 69 61 20 66 73 63  cations (via fsc
29610 74 6c 29 2c 0a 2a 2a 20 6f 6e 20 41 46 50 20 61  tl),.** on AFP a
29620 6e 64 20 53 4d 42 20 6f 6e 6c 79 20 65 78 63 6c  nd SMB only excl
29630 75 73 69 76 65 20 62 79 74 65 2d 72 61 6e 67 65  usive byte-range
29640 20 6c 6f 63 6b 73 20 61 72 65 20 61 76 61 69 6c   locks are avail
29650 61 62 6c 65 20 76 69 61 20 66 73 63 74 6c 0a 2a  able via fsctl.*
29660 2a 20 77 69 74 68 20 5f 49 4f 57 52 28 27 7a 27  * with _IOWR('z'
29670 2c 20 32 33 2c 20 73 74 72 75 63 74 20 42 79 74  , 23, struct Byt
29680 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32 29 20 74  eRangeLockPB2) t
29690 6f 20 74 72 61 63 6b 20 74 68 65 20 73 61 6d 65  o track the same
296a0 20 35 20 73 74 61 74 65 73 2e 0a 2a 2a 20 54 6f   5 states..** To
296b0 20 73 69 6d 75 6c 61 74 65 20 61 20 46 5f 52 44   simulate a F_RD
296c0 4c 43 4b 20 6f 6e 20 74 68 65 20 73 68 61 72 65  LCK on the share
296d0 64 20 72 61 6e 67 65 2c 20 6f 6e 20 41 46 50 20  d range, on AFP 
296e0 61 20 72 61 6e 64 6f 6d 6c 79 20 73 65 6c 65 63  a randomly selec
296f0 74 65 64 0a 2a 2a 20 61 64 64 72 65 73 73 20 69  ted.** address i
29700 6e 20 74 68 65 20 73 68 61 72 65 64 20 72 61 6e  n the shared ran
29710 67 65 20 69 73 20 74 61 6b 65 6e 20 66 6f 72 20  ge is taken for 
29720 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74  a SHARED lock, t
29730 68 65 20 65 6e 74 69 72 65 0a 2a 2a 20 73 68 61  he entire.** sha
29740 72 65 64 20 72 61 6e 67 65 20 69 73 20 74 61 6b  red range is tak
29750 65 6e 20 66 6f 72 20 61 6e 20 45 58 43 4c 55 53  en for an EXCLUS
29760 49 56 45 20 6c 6f 63 6b 29 3a 0a 2a 2a 0a 2a 2a  IVE lock):.**.**
29770 20 20 20 20 20 20 50 45 4e 44 49 4e 47 5f 42 59        PENDING_BY
29780 54 45 20 20 20 20 20 20 20 20 30 78 34 30 30 30  TE        0x4000
29790 30 30 30 30 09 09 20 20 20 09 0a 2a 2a 20 20 20  0000..   ..**   
297a0 20 20 20 52 45 53 45 52 56 45 44 5f 42 59 54 45     RESERVED_BYTE
297b0 20 20 20 20 20 20 20 30 78 34 30 30 30 30 30 30         0x4000000
297c0 31 0a 2a 2a 20 20 20 20 20 20 53 48 41 52 45 44  1.**      SHARED
297d0 5f 52 41 4e 47 45 20 20 20 20 20 20 20 20 30 78  _RANGE        0x
297e0 34 30 30 30 30 30 30 32 20 2d 3e 20 30 78 34 30  40000002 -> 0x40
297f0 30 30 30 32 30 30 0a 2a 2a 0a 2a 2a 20 54 68 69  000200.**.** Thi
29800 73 20 77 6f 72 6b 73 20 77 65 6c 6c 20 6f 6e 20  s works well on 
29810 74 68 65 20 6c 6f 63 61 6c 20 66 69 6c 65 20 73  the local file s
29820 79 73 74 65 6d 2c 20 62 75 74 20 73 68 6f 77 73  ystem, but shows
29830 20 61 20 6e 65 61 72 6c 79 20 31 30 30 78 0a 2a   a nearly 100x.*
29840 2a 20 73 6c 6f 77 64 6f 77 6e 20 69 6e 20 72 65  * slowdown in re
29850 61 64 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f  ad performance o
29860 6e 20 41 46 50 20 62 65 63 61 75 73 65 20 74 68  n AFP because th
29870 65 20 41 46 50 20 63 6c 69 65 6e 74 20 64 69 73  e AFP client dis
29880 61 62 6c 65 73 0a 2a 2a 20 74 68 65 20 72 65 61  ables.** the rea
29890 64 20 63 61 63 68 65 20 77 68 65 6e 20 62 79 74  d cache when byt
298a0 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 73 20 61 72  e-range locks ar
298b0 65 20 70 72 65 73 65 6e 74 2e 20 20 45 6e 61 62  e present.  Enab
298c0 6c 69 6e 67 20 74 68 65 20 72 65 61 64 0a 2a 2a  ling the read.**
298d0 20 63 61 63 68 65 20 65 78 70 6f 73 65 73 20 61   cache exposes a
298e0 20 63 61 63 68 65 20 63 6f 68 65 72 65 6e 63 79   cache coherency
298f0 20 70 72 6f 62 6c 65 6d 20 74 68 61 74 20 69 73   problem that is
29900 20 70 72 65 73 65 6e 74 20 6f 6e 20 61 6c 6c 20   present on all 
29910 4f 53 20 58 0a 2a 2a 20 73 75 70 70 6f 72 74 65  OS X.** supporte
29920 64 20 6e 65 74 77 6f 72 6b 20 66 69 6c 65 20 73  d network file s
29930 79 73 74 65 6d 73 2e 20 20 4e 46 53 20 61 6e 64  ystems.  NFS and
29940 20 41 46 50 20 62 6f 74 68 20 6f 62 73 65 72 76   AFP both observ
29950 65 20 74 68 65 0a 2a 2a 20 63 6c 6f 73 65 2d 74  e the.** close-t
29960 6f 2d 6f 70 65 6e 20 73 65 6d 61 6e 74 69 63 73  o-open semantics
29970 20 66 6f 72 20 65 6e 73 75 72 69 6e 67 20 63 61   for ensuring ca
29980 63 68 65 20 63 6f 68 65 72 65 6e 63 79 0a 2a 2a  che coherency.**
29990 20 5b 68 74 74 70 3a 2f 2f 6e 66 73 2e 73 6f 75   [http://nfs.sou
299a0 72 63 65 66 6f 72 67 65 2e 6e 65 74 2f 23 66 61  rceforge.net/#fa
299b0 71 5f 61 38 5d 2c 20 77 68 69 63 68 20 64 6f 65  q_a8], which doe
299c0 73 20 6e 6f 74 20 65 66 66 65 63 74 69 76 65 6c  s not effectivel
299d0 79 0a 2a 2a 20 61 64 64 72 65 73 73 20 74 68 65  y.** address the
299e0 20 72 65 71 75 69 72 65 6d 65 6e 74 73 20 66 6f   requirements fo
299f0 72 20 63 6f 6e 63 75 72 72 65 6e 74 20 64 61 74  r concurrent dat
29a00 61 62 61 73 65 20 61 63 63 65 73 73 20 62 79 20  abase access by 
29a10 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 72 65 61 64  multiple.** read
29a20 65 72 73 20 61 6e 64 20 77 72 69 74 65 72 73 0a  ers and writers.
29a30 2a 2a 20 5b 68 74 74 70 3a 2f 2f 77 77 77 2e 6e  ** [http://www.n
29a40 61 62 62 6c 65 2e 63 6f 6d 2f 53 51 4c 69 74 65  abble.com/SQLite
29a50 2d 6f 6e 2d 4e 46 53 2d 63 61 63 68 65 2d 63 6f  -on-NFS-cache-co
29a60 68 65 72 65 6e 63 79 2d 74 64 31 35 36 35 35 37  herency-td156557
29a70 30 31 2e 68 74 6d 6c 5d 2e 0a 2a 2a 0a 2a 2a 20  01.html]..**.** 
29a80 54 6f 20 61 64 64 72 65 73 73 20 74 68 65 20 70  To address the p
29a90 65 72 66 6f 72 6d 61 6e 63 65 20 61 6e 64 20 63  erformance and c
29aa0 61 63 68 65 20 63 6f 68 65 72 65 6e 63 79 20 69  ache coherency i
29ab0 73 73 75 65 73 2c 20 70 72 6f 78 79 20 66 69 6c  ssues, proxy fil
29ac0 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 63 68 61  e locking.** cha
29ad0 6e 67 65 73 20 74 68 65 20 77 61 79 20 64 61 74  nges the way dat
29ae0 61 62 61 73 65 20 61 63 63 65 73 73 20 69 73 20  abase access is 
29af0 63 6f 6e 74 72 6f 6c 6c 65 64 20 62 79 20 6c 69  controlled by li
29b00 6d 69 74 69 6e 67 20 61 63 63 65 73 73 20 74 6f  miting access to
29b10 20 61 0a 2a 2a 20 73 69 6e 67 6c 65 20 68 6f 73   a.** single hos
29b20 74 20 61 74 20 61 20 74 69 6d 65 20 61 6e 64 20  t at a time and 
29b30 6d 6f 76 69 6e 67 20 66 69 6c 65 20 6c 6f 63 6b  moving file lock
29b40 73 20 6f 66 66 20 6f 66 20 74 68 65 20 64 61 74  s off of the dat
29b50 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20 61 6e  abase file.** an
29b60 64 20 6f 6e 74 6f 20 61 20 70 72 6f 78 79 20 66  d onto a proxy f
29b70 69 6c 65 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c  ile on the local
29b80 20 66 69 6c 65 20 73 79 73 74 65 6d 2e 20 20 0a   file system.  .
29b90 2a 2a 0a 2a 2a 0a 2a 2a 20 55 73 69 6e 67 20 70  **.**.** Using p
29ba0 72 6f 78 79 20 6c 6f 63 6b 73 0a 2a 2a 20 2d 2d  roxy locks.** --
29bb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
29bc0 2a 2a 0a 2a 2a 20 43 20 41 50 49 73 0a 2a 2a 0a  **.** C APIs.**.
29bd0 2a 2a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  **  sqlite3_file
29be0 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 64 62 6e  _control(db, dbn
29bf0 61 6d 65 2c 20 53 51 4c 49 54 45 5f 53 45 54 5f  ame, SQLITE_SET_
29c00 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 2c 0a 2a  LOCKPROXYFILE,.*
29c10 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
29c20 20 20 20 20 20 20 20 20 3c 70 72 6f 78 79 5f 70          <proxy_p
29c30 61 74 68 3e 20 7c 20 22 3a 61 75 74 6f 3a 22 29  ath> | ":auto:")
29c40 3b 0a 2a 2a 20 20 73 71 6c 69 74 65 33 5f 66 69  ;.**  sqlite3_fi
29c50 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 64  le_control(db, d
29c60 62 6e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 47 45  bname, SQLITE_GE
29c70 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 2c  T_LOCKPROXYFILE,
29c80 20 26 3c 70 72 6f 78 79 5f 70 61 74 68 3e 29 3b   &<proxy_path>);
29c90 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 53 51 4c 20 70 72  .**.**.** SQL pr
29ca0 61 67 6d 61 73 0a 2a 2a 0a 2a 2a 20 20 50 52 41  agmas.**.**  PRA
29cb0 47 4d 41 20 5b 64 61 74 61 62 61 73 65 2e 5d 6c  GMA [database.]l
29cc0 6f 63 6b 5f 70 72 6f 78 79 5f 66 69 6c 65 3d 3c  ock_proxy_file=<
29cd0 70 72 6f 78 79 5f 70 61 74 68 3e 20 7c 20 3a 61  proxy_path> | :a
29ce0 75 74 6f 3a 0a 2a 2a 20 20 50 52 41 47 4d 41 20  uto:.**  PRAGMA 
29cf0 5b 64 61 74 61 62 61 73 65 2e 5d 6c 6f 63 6b 5f  [database.]lock_
29d00 70 72 6f 78 79 5f 66 69 6c 65 0a 2a 2a 0a 2a 2a  proxy_file.**.**
29d10 20 53 70 65 63 69 66 79 69 6e 67 20 22 3a 61 75   Specifying ":au
29d20 74 6f 3a 22 20 6d 65 61 6e 73 20 74 68 61 74 20  to:" means that 
29d30 69 66 20 74 68 65 72 65 20 69 73 20 61 20 63 6f  if there is a co
29d40 6e 63 68 20 66 69 6c 65 20 77 69 74 68 20 61 20  nch file with a 
29d50 6d 61 74 63 68 69 6e 67 0a 2a 2a 20 68 6f 73 74  matching.** host
29d60 20 49 44 20 69 6e 20 69 74 2c 20 74 68 65 20 70   ID in it, the p
29d70 72 6f 78 79 20 70 61 74 68 20 69 6e 20 74 68 65  roxy path in the
29d80 20 63 6f 6e 63 68 20 66 69 6c 65 20 77 69 6c 6c   conch file will
29d90 20 62 65 20 75 73 65 64 2c 20 6f 74 68 65 72 77   be used, otherw
29da0 69 73 65 0a 2a 2a 20 61 20 70 72 6f 78 79 20 70  ise.** a proxy p
29db0 61 74 68 20 62 61 73 65 64 20 6f 6e 20 74 68 65  ath based on the
29dc0 20 75 73 65 72 27 73 20 74 65 6d 70 20 64 69 72   user's temp dir
29dd0 0a 2a 2a 20 28 76 69 61 20 63 6f 6e 66 73 74 72  .** (via confstr
29de0 28 5f 43 53 5f 44 41 52 57 49 4e 5f 55 53 45 52  (_CS_DARWIN_USER
29df0 5f 54 45 4d 50 5f 44 49 52 2c 2e 2e 2e 29 29 20  _TEMP_DIR,...)) 
29e00 77 69 6c 6c 20 62 65 20 75 73 65 64 20 61 6e 64  will be used and
29e10 20 74 68 65 0a 2a 2a 20 61 63 74 75 61 6c 20 70   the.** actual p
29e20 72 6f 78 79 20 66 69 6c 65 20 6e 61 6d 65 20 69  roxy file name i
29e30 73 20 67 65 6e 65 72 61 74 65 64 20 66 72 6f 6d  s generated from
29e40 20 74 68 65 20 6e 61 6d 65 20 61 6e 64 20 70 61   the name and pa
29e50 74 68 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74  th of the.** dat
29e60 61 62 61 73 65 20 66 69 6c 65 2e 20 20 46 6f 72  abase file.  For
29e70 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20   example:.**.** 
29e80 20 20 20 20 20 20 46 6f 72 20 64 61 74 61 62 61        For databa
29e90 73 65 20 70 61 74 68 20 22 2f 55 73 65 72 73 2f  se path "/Users/
29ea0 6d 65 2f 66 6f 6f 2e 64 62 22 20 0a 2a 2a 20 20  me/foo.db" .**  
29eb0 20 20 20 20 20 54 68 65 20 6c 6f 63 6b 20 70 61       The lock pa
29ec0 74 68 20 77 69 6c 6c 20 62 65 20 22 3c 74 6d 70  th will be "<tmp
29ed0 64 69 72 3e 2f 73 71 6c 69 74 65 70 6c 6f 63 6b  dir>/sqliteplock
29ee0 73 2f 5f 55 73 65 72 73 5f 6d 65 5f 66 6f 6f 2e  s/_Users_me_foo.
29ef0 64 62 3a 61 75 74 6f 3a 22 29 0a 2a 2a 0a 2a 2a  db:auto:").**.**
29f00 20 4f 6e 63 65 20 61 20 6c 6f 63 6b 20 70 72 6f   Once a lock pro
29f10 78 79 20 69 73 20 63 6f 6e 66 69 67 75 72 65 64  xy is configured
29f20 20 66 6f 72 20 61 20 64 61 74 61 62 61 73 65 20   for a database 
29f30 63 6f 6e 6e 65 63 74 69 6f 6e 2c 20 69 74 20 63  connection, it c
29f40 61 6e 20 6e 6f 74 0a 2a 2a 20 62 65 20 72 65 6d  an not.** be rem
29f50 6f 76 65 64 2c 20 68 6f 77 65 76 65 72 20 69 74  oved, however it
29f60 20 6d 61 79 20 62 65 20 73 77 69 74 63 68 65 64   may be switched
29f70 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e 74 20   to a different 
29f80 70 72 6f 78 79 20 70 61 74 68 20 76 69 61 0a 2a  proxy path via.*
29f90 2a 20 74 68 65 20 61 62 6f 76 65 20 41 50 49 73  * the above APIs
29fa0 20 28 61 73 73 75 6d 69 6e 67 20 74 68 65 20 63   (assuming the c
29fb0 6f 6e 63 68 20 66 69 6c 65 20 69 73 20 6e 6f 74  onch file is not
29fc0 20 62 65 69 6e 67 20 68 65 6c 64 20 62 79 20 61   being held by a
29fd0 6e 6f 74 68 65 72 0a 2a 2a 20 63 6f 6e 6e 65 63  nother.** connec
29fe0 74 69 6f 6e 20 6f 72 20 70 72 6f 63 65 73 73 29  tion or process)
29ff0 2e 20 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 48 6f 77 20  . .**.**.** How 
2a000 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 77 6f  proxy locking wo
2a010 72 6b 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  rks.** ---------
2a020 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a  --------------.*
2a030 2a 0a 2a 2a 20 50 72 6f 78 79 20 66 69 6c 65 20  *.** Proxy file 
2a040 6c 6f 63 6b 69 6e 67 20 72 65 6c 69 65 73 20 70  locking relies p
2a050 72 69 6d 61 72 69 6c 79 20 6f 6e 20 74 77 6f 20  rimarily on two 
2a060 6e 65 77 20 73 75 70 70 6f 72 74 69 6e 67 20 66  new supporting f
2a070 69 6c 65 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 20 2a  iles: .**.**   *
2a080 20 20 63 6f 6e 63 68 20 66 69 6c 65 20 74 6f 20    conch file to 
2a090 6c 69 6d 69 74 20 61 63 63 65 73 73 20 74 6f 20  limit access to 
2a0a0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2a0b0 65 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 68 6f  e to a single ho
2a0c0 73 74 0a 2a 2a 20 20 20 20 20 20 61 74 20 61 20  st.**      at a 
2a0d0 74 69 6d 65 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20  time.**.**   *  
2a0e0 70 72 6f 78 79 20 66 69 6c 65 20 74 6f 20 61 63  proxy file to ac
2a0f0 74 20 61 73 20 61 20 70 72 6f 78 79 20 66 6f 72  t as a proxy for
2a100 20 74 68 65 20 61 64 76 69 73 6f 72 79 20 6c 6f   the advisory lo
2a110 63 6b 73 20 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a 20  cks normally.** 
2a120 20 20 20 20 20 74 61 6b 65 6e 20 6f 6e 20 74 68       taken on th
2a130 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 0a 2a 2a  e database.**.**
2a140 20 54 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20   The conch file 
2a150 2d 20 74 6f 20 75 73 65 20 61 20 70 72 6f 78 79  - to use a proxy
2a160 20 66 69 6c 65 2c 20 73 71 6c 69 74 65 20 6d 75   file, sqlite mu
2a170 73 74 20 66 69 72 73 74 20 22 68 6f 6c 64 20 74  st first "hold t
2a180 68 65 20 63 6f 6e 63 68 22 0a 2a 2a 20 62 79 20  he conch".** by 
2a190 74 61 6b 69 6e 67 20 61 6e 20 73 71 6c 69 74 65  taking an sqlite
2a1a0 2d 73 74 79 6c 65 20 73 68 61 72 65 64 20 6c 6f  -style shared lo
2a1b0 63 6b 20 6f 6e 20 74 68 65 20 63 6f 6e 63 68 20  ck on the conch 
2a1c0 66 69 6c 65 2c 20 72 65 61 64 69 6e 67 20 74 68  file, reading th
2a1d0 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 61 6e  e.** contents an
2a1e0 64 20 63 6f 6d 70 61 72 69 6e 67 20 74 68 65 20  d comparing the 
2a1f0 68 6f 73 74 27 73 20 75 6e 69 71 75 65 20 68 6f  host's unique ho
2a200 73 74 20 49 44 20 28 73 65 65 20 62 65 6c 6f 77  st ID (see below
2a210 29 20 61 6e 64 20 6c 6f 63 6b 0a 2a 2a 20 70 72  ) and lock.** pr
2a220 6f 78 79 20 70 61 74 68 20 61 67 61 69 6e 73 74  oxy path against
2a230 20 74 68 65 20 76 61 6c 75 65 73 20 73 74 6f 72   the values stor
2a240 65 64 20 69 6e 20 74 68 65 20 63 6f 6e 63 68 2e  ed in the conch.
2a250 20 20 54 68 65 20 63 6f 6e 63 68 20 66 69 6c 65    The conch file
2a260 20 69 73 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e   is.** stored in
2a270 20 74 68 65 20 73 61 6d 65 20 64 69 72 65 63 74   the same direct
2a280 6f 72 79 20 61 73 20 74 68 65 20 64 61 74 61 62  ory as the datab
2a290 61 73 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65  ase file and the
2a2a0 20 66 69 6c 65 20 6e 61 6d 65 0a 2a 2a 20 69 73   file name.** is
2a2b0 20 70 61 74 74 65 72 6e 65 64 20 61 66 74 65 72   patterned after
2a2c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2a2d0 6c 65 20 6e 61 6d 65 20 61 73 20 22 2e 3c 64 61  le name as ".<da
2a2e0 74 61 62 61 73 65 6e 61 6d 65 3e 2d 63 6f 6e 63  tabasename>-conc
2a2f0 68 22 2e 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f  h"..** If the co
2a300 6e 63 68 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f  nch file does no
2a310 74 20 65 78 69 73 74 2c 20 6f 72 20 69 74 27 73  t exist, or it's
2a320 20 63 6f 6e 74 65 6e 74 73 20 64 6f 20 6e 6f 74   contents do not
2a330 20 6d 61 74 63 68 20 74 68 65 0a 2a 2a 20 68 6f   match the.** ho
2a340 73 74 20 49 44 20 61 6e 64 2f 6f 72 20 70 72 6f  st ID and/or pro
2a350 78 79 20 70 61 74 68 2c 20 74 68 65 6e 20 74 68  xy path, then th
2a360 65 20 6c 6f 63 6b 20 69 73 20 65 73 63 61 6c 61  e lock is escala
2a370 74 65 64 20 74 6f 20 61 6e 20 65 78 63 6c 75 73  ted to an exclus
2a380 69 76 65 0a 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20  ive.** lock and 
2a390 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 63  the conch file c
2a3a0 6f 6e 74 65 6e 74 73 20 69 73 20 75 70 64 61 74  ontents is updat
2a3b0 65 64 20 77 69 74 68 20 74 68 65 20 68 6f 73 74  ed with the host
2a3c0 20 49 44 20 61 6e 64 20 70 72 6f 78 79 0a 2a 2a   ID and proxy.**
2a3d0 20 70 61 74 68 20 61 6e 64 20 74 68 65 20 6c 6f   path and the lo
2a3e0 63 6b 20 69 73 20 64 6f 77 6e 67 72 61 64 65 64  ck is downgraded
2a3f0 20 74 6f 20 61 20 73 68 61 72 65 64 20 6c 6f 63   to a shared loc
2a400 6b 20 61 67 61 69 6e 2e 20 20 49 66 20 74 68 65  k again.  If the
2a410 20 63 6f 6e 63 68 0a 2a 2a 20 69 73 20 68 65 6c   conch.** is hel
2a420 64 20 62 79 20 61 6e 6f 74 68 65 72 20 70 72 6f  d by another pro
2a430 63 65 73 73 20 28 77 69 74 68 20 61 20 73 68 61  cess (with a sha
2a440 72 65 64 20 6c 6f 63 6b 29 2c 20 74 68 65 20 65  red lock), the e
2a450 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 0a 2a 2a  xclusive lock.**
2a460 20 77 69 6c 6c 20 66 61 69 6c 20 61 6e 64 20 53   will fail and S
2a470 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65  QLITE_BUSY is re
2a480 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  turned..**.** Th
2a490 65 20 70 72 6f 78 79 20 66 69 6c 65 20 2d 20 61  e proxy file - a
2a4a0 20 73 69 6e 67 6c 65 2d 62 79 74 65 20 66 69 6c   single-byte fil
2a4b0 65 20 75 73 65 64 20 66 6f 72 20 61 6c 6c 20 61  e used for all a
2a4c0 64 76 69 73 6f 72 79 20 66 69 6c 65 20 6c 6f 63  dvisory file loc
2a4d0 6b 73 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20 74  ks.** normally t
2a4e0 61 6b 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61  aken on the data
2a4f0 62 61 73 65 20 66 69 6c 65 2e 20 20 20 54 68 69  base file.   Thi
2a500 73 20 61 6c 6c 6f 77 73 20 66 6f 72 20 73 61 66  s allows for saf
2a510 65 20 73 68 61 72 69 6e 67 0a 2a 2a 20 6f 66 20  e sharing.** of 
2a520 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2a530 65 20 66 6f 72 20 6d 75 6c 74 69 70 6c 65 20 72  e for multiple r
2a540 65 61 64 65 72 73 20 61 6e 64 20 77 72 69 74 65  eaders and write
2a550 72 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 0a 2a  rs on the same.*
2a560 2a 20 68 6f 73 74 20 28 74 68 65 20 63 6f 6e 63  * host (the conc
2a570 68 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 74  h ensures that t
2a580 68 65 79 20 61 6c 6c 20 75 73 65 20 74 68 65 20  hey all use the 
2a590 73 61 6d 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 20  same local lock 
2a5a0 66 69 6c 65 29 2e 0a 2a 2a 0a 2a 2a 20 52 65 71  file)..**.** Req
2a5b0 75 65 73 74 69 6e 67 20 74 68 65 20 6c 6f 63 6b  uesting the lock
2a5c0 20 70 72 6f 78 79 20 64 6f 65 73 20 6e 6f 74 20   proxy does not 
2a5d0 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 61 6b 65  immediately take
2a5e0 20 74 68 65 20 63 6f 6e 63 68 2c 20 69 74 20 69   the conch, it i
2a5f0 73 0a 2a 2a 20 6f 6e 6c 79 20 74 61 6b 65 6e 20  s.** only taken 
2a600 77 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 72  when the first r
2a610 65 71 75 65 73 74 20 74 6f 20 6c 6f 63 6b 20 64  equest to lock d
2a620 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
2a630 6d 61 64 65 2e 20 20 0a 2a 2a 20 54 68 69 73 20  made.  .** This 
2a640 6d 61 74 63 68 65 73 20 74 68 65 20 73 65 6d 61  matches the sema
2a650 6e 74 69 63 73 20 6f 66 20 74 68 65 20 74 72 61  ntics of the tra
2a660 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 69 6e 67  ditional locking
2a670 20 62 65 68 61 76 69 6f 72 2c 20 77 68 65 72 65   behavior, where
2a680 0a 2a 2a 20 6f 70 65 6e 69 6e 67 20 61 20 63 6f  .** opening a co
2a690 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 61 20 64 61  nnection to a da
2a6a0 74 61 62 61 73 65 20 66 69 6c 65 20 64 6f 65 73  tabase file does
2a6b0 20 6e 6f 74 20 74 61 6b 65 20 61 20 6c 6f 63 6b   not take a lock
2a6c0 20 6f 6e 20 69 74 2e 0a 2a 2a 20 54 68 65 20 73   on it..** The s
2a6d0 68 61 72 65 64 20 6c 6f 63 6b 20 61 6e 64 20 61  hared lock and a
2a6e0 6e 20 6f 70 65 6e 20 66 69 6c 65 20 64 65 73 63  n open file desc
2a6f0 72 69 70 74 6f 72 20 61 72 65 20 6d 61 69 6e 74  riptor are maint
2a700 61 69 6e 65 64 20 75 6e 74 69 6c 20 0a 2a 2a 20  ained until .** 
2a710 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74  the connection t
2a720 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  o the database i
2a730 73 20 63 6c 6f 73 65 64 2e 20 0a 2a 2a 0a 2a 2a  s closed. .**.**
2a740 20 54 68 65 20 70 72 6f 78 79 20 66 69 6c 65 20   The proxy file 
2a750 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c  and the lock fil
2a760 65 20 61 72 65 20 6e 65 76 65 72 20 64 65 6c 65  e are never dele
2a770 74 65 64 20 73 6f 20 74 68 65 79 20 6f 6e 6c 79  ted so they only
2a780 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20 63   need.** to be c
2a790 72 65 61 74 65 64 20 74 68 65 20 66 69 72 73 74  reated the first
2a7a0 20 74 69 6d 65 20 74 68 65 79 20 61 72 65 20 75   time they are u
2a7b0 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 66 69  sed..**.** Confi
2a7c0 67 75 72 61 74 69 6f 6e 20 6f 70 74 69 6f 6e 73  guration options
2a7d0 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .** ------------
2a7e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20  ---------.**.** 
2a7f0 20 53 51 4c 49 54 45 5f 50 52 45 46 45 52 5f 50   SQLITE_PREFER_P
2a800 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 0a 2a 2a 0a  ROXY_LOCKING.**.
2a810 2a 2a 20 20 20 20 20 20 20 44 61 74 61 62 61 73  **       Databas
2a820 65 20 66 69 6c 65 73 20 61 63 63 65 73 73 65 64  e files accessed
2a830 20 6f 6e 20 6e 6f 6e 2d 6c 6f 63 61 6c 20 66 69   on non-local fi
2a840 6c 65 20 73 79 73 74 65 6d 73 20 61 72 65 0a 2a  le systems are.*
2a850 2a 20 20 20 20 20 20 20 61 75 74 6f 6d 61 74 69  *       automati
2a860 63 61 6c 6c 79 20 63 6f 6e 66 69 67 75 72 65 64  cally configured
2a870 20 66 6f 72 20 70 72 6f 78 79 20 6c 6f 63 6b 69   for proxy locki
2a880 6e 67 2c 20 6c 6f 63 6b 20 66 69 6c 65 73 20 61  ng, lock files a
2a890 72 65 0a 2a 2a 20 20 20 20 20 20 20 6e 61 6d 65  re.**       name
2a8a0 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  d automatically 
2a8b0 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20 6c  using the same l
2a8c0 6f 67 69 63 20 61 73 0a 2a 2a 20 20 20 20 20 20  ogic as.**      
2a8d0 20 50 52 41 47 4d 41 20 6c 6f 63 6b 5f 70 72 6f   PRAGMA lock_pro
2a8e0 78 79 5f 66 69 6c 65 3d 22 3a 61 75 74 6f 3a 22  xy_file=":auto:"
2a8f0 0a 2a 2a 20 20 20 20 0a 2a 2a 20 20 53 51 4c 49  .**    .**  SQLI
2a900 54 45 5f 50 52 4f 58 59 5f 44 45 42 55 47 0a 2a  TE_PROXY_DEBUG.*
2a910 2a 0a 2a 2a 20 20 20 20 20 20 20 45 6e 61 62 6c  *.**       Enabl
2a920 65 73 20 74 68 65 20 6c 6f 67 67 69 6e 67 20 6f  es the logging o
2a930 66 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73  f error messages
2a940 20 64 75 72 69 6e 67 20 68 6f 73 74 20 69 64 20   during host id 
2a950 66 69 6c 65 0a 2a 2a 20 20 20 20 20 20 20 72 65  file.**       re
2a960 74 72 69 65 76 61 6c 20 61 6e 64 20 63 72 65 61  trieval and crea
2a970 74 69 6f 6e 0a 2a 2a 0a 2a 2a 20 20 4c 4f 43 4b  tion.**.**  LOCK
2a980 50 52 4f 58 59 44 49 52 0a 2a 2a 0a 2a 2a 20 20  PROXYDIR.**.**  
2a990 20 20 20 20 20 4f 76 65 72 72 69 64 65 73 20 74       Overrides t
2a9a0 68 65 20 64 65 66 61 75 6c 74 20 64 69 72 65 63  he default direc
2a9b0 74 6f 72 79 20 75 73 65 64 20 66 6f 72 20 6c 6f  tory used for lo
2a9c0 63 6b 20 70 72 6f 78 79 20 66 69 6c 65 73 20 74  ck proxy files t
2a9d0 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 61 72 65  hat.**       are
2a9e0 20 6e 61 6d 65 64 20 61 75 74 6f 6d 61 74 69 63   named automatic
2a9f0 61 6c 6c 79 20 76 69 61 20 74 68 65 20 22 3a 61  ally via the ":a
2aa00 75 74 6f 3a 22 20 73 65 74 74 69 6e 67 0a 2a 2a  uto:" setting.**
2aa10 0a 2a 2a 20 20 53 51 4c 49 54 45 5f 44 45 46 41  .**  SQLITE_DEFA
2aa20 55 4c 54 5f 50 52 4f 58 59 44 49 52 5f 50 45 52  ULT_PROXYDIR_PER
2aa30 4d 49 53 53 49 4f 4e 53 0a 2a 2a 0a 2a 2a 20 20  MISSIONS.**.**  
2aa40 20 20 20 20 20 50 65 72 6d 69 73 73 69 6f 6e 73       Permissions
2aa50 20 74 6f 20 75 73 65 20 77 68 65 6e 20 63 72 65   to use when cre
2aa60 61 74 69 6e 67 20 61 20 64 69 72 65 63 74 6f 72  ating a director
2aa70 79 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 74 68  y for storing th
2aa80 65 0a 2a 2a 20 20 20 20 20 20 20 6c 6f 63 6b 20  e.**       lock 
2aa90 70 72 6f 78 79 20 66 69 6c 65 73 2c 20 6f 6e 6c  proxy files, onl
2aaa0 79 20 75 73 65 64 20 77 68 65 6e 20 4c 4f 43 4b  y used when LOCK
2aab0 50 52 4f 58 59 44 49 52 20 69 73 20 6e 6f 74 20  PROXYDIR is not 
2aac0 73 65 74 2e 0a 2a 2a 20 20 20 20 0a 2a 2a 20 20  set..**    .**  
2aad0 20 20 0a 2a 2a 20 41 73 20 6d 65 6e 74 69 6f 6e    .** As mention
2aae0 65 64 20 61 62 6f 76 65 2c 20 77 68 65 6e 20 63  ed above, when c
2aaf0 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 53 51 4c  ompiled with SQL
2ab00 49 54 45 5f 50 52 45 46 45 52 5f 50 52 4f 58 59  ITE_PREFER_PROXY
2ab10 5f 4c 4f 43 4b 49 4e 47 2c 0a 2a 2a 20 73 65 74  _LOCKING,.** set
2ab20 74 69 6e 67 20 74 68 65 20 65 6e 76 69 72 6f 6e  ting the environ
2ab30 6d 65 6e 74 20 76 61 72 69 61 62 6c 65 20 53 51  ment variable SQ
2ab40 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59  LITE_FORCE_PROXY
2ab50 5f 4c 4f 43 4b 49 4e 47 20 74 6f 20 31 20 77 69  _LOCKING to 1 wi
2ab60 6c 6c 0a 2a 2a 20 66 6f 72 63 65 20 70 72 6f 78  ll.** force prox
2ab70 79 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 62 65 20  y locking to be 
2ab80 75 73 65 64 20 66 6f 72 20 65 76 65 72 79 20 64  used for every d
2ab90 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 70 65  atabase file ope
2aba0 6e 65 64 2c 20 61 6e 64 20 30 0a 2a 2a 20 77 69  ned, and 0.** wi
2abb0 6c 6c 20 66 6f 72 63 65 20 61 75 74 6f 6d 61 74  ll force automat
2abc0 69 63 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67  ic proxy locking
2abd0 20 74 6f 20 62 65 20 64 69 73 61 62 6c 65 64 20   to be disabled 
2abe0 66 6f 72 20 61 6c 6c 20 64 61 74 61 62 61 73 65  for all database
2abf0 0a 2a 2a 20 66 69 6c 65 73 20 28 65 78 70 6c 69  .** files (expli
2ac00 63 69 74 79 20 63 61 6c 6c 69 6e 67 20 74 68 65  city calling the
2ac10 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b   SQLITE_SET_LOCK
2ac20 50 52 4f 58 59 46 49 4c 45 20 70 72 61 67 6d 61  PROXYFILE pragma
2ac30 20 6f 72 0a 2a 2a 20 73 71 6c 69 74 65 5f 66 69   or.** sqlite_fi
2ac40 6c 65 5f 63 6f 6e 74 72 6f 6c 20 41 50 49 20 69  le_control API i
2ac50 73 20 6e 6f 74 20 61 66 66 65 63 74 65 64 20 62  s not affected b
2ac60 79 20 53 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50  y SQLITE_FORCE_P
2ac70 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 29 2e 0a 2a  ROXY_LOCKING)..*
2ac80 2f 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 78 79 20 6c  /../*.** Proxy l
2ac90 6f 63 6b 69 6e 67 20 69 73 20 6f 6e 6c 79 20 61  ocking is only a
2aca0 76 61 69 6c 61 62 6c 65 20 6f 6e 20 4d 61 63 4f  vailable on MacO
2acb0 53 58 20 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e  SX .*/.#if defin
2acc0 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26  ed(__APPLE__) &&
2acd0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
2ace0 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 0a 2f 2a  OCKING_STYLE../*
2acf0 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79 4c 6f 63  .** The proxyLoc
2ad00 6b 69 6e 67 43 6f 6e 74 65 78 74 20 68 61 73 20  kingContext has 
2ad10 74 68 65 20 70 61 74 68 20 61 6e 64 20 66 69 6c  the path and fil
2ad20 65 20 73 74 72 75 63 74 75 72 65 73 20 66 6f 72  e structures for
2ad30 20 74 68 65 20 72 65 6d 6f 74 65 20 0a 2a 2a 20   the remote .** 
2ad40 61 6e 64 20 6c 6f 63 61 6c 20 70 72 6f 78 79 20  and local proxy 
2ad50 66 69 6c 65 73 20 69 6e 20 69 74 0a 2a 2f 0a 74  files in it.*/.t
2ad60 79 70 65 64 65 66 20 73 74 72 75 63 74 20 70 72  ypedef struct pr
2ad70 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  oxyLockingContex
2ad80 74 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f  t proxyLockingCo
2ad90 6e 74 65 78 74 3b 0a 73 74 72 75 63 74 20 70 72  ntext;.struct pr
2ada0 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  oxyLockingContex
2adb0 74 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  t {.  unixFile *
2adc0 63 6f 6e 63 68 46 69 6c 65 3b 20 20 20 20 20 20  conchFile;      
2add0 20 20 20 2f 2a 20 4f 70 65 6e 20 63 6f 6e 63 68     /* Open conch
2ade0 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20   file */.  char 
2adf0 2a 63 6f 6e 63 68 46 69 6c 65 50 61 74 68 3b 20  *conchFilePath; 
2ae00 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
2ae10 6f 66 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c  of the conch fil
2ae20 65 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20  e */.  unixFile 
2ae30 2a 6c 6f 63 6b 50 72 6f 78 79 3b 20 20 20 20 20  *lockProxy;     
2ae40 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70 72 6f 78      /* Open prox
2ae50 79 20 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a 20  y lock file */. 
2ae60 20 63 68 61 72 20 2a 6c 6f 63 6b 50 72 6f 78 79   char *lockProxy
2ae70 50 61 74 68 3b 20 20 20 20 20 20 20 20 20 2f 2a  Path;         /*
2ae80 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 70 72 6f   Name of the pro
2ae90 78 79 20 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a  xy lock file */.
2aea0 20 20 63 68 61 72 20 2a 64 62 50 61 74 68 3b 20    char *dbPath; 
2aeb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2aec0 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f 70  * Name of the op
2aed0 65 6e 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  en file */.  int
2aee0 20 63 6f 6e 63 68 48 65 6c 64 3b 20 20 20 20 20   conchHeld;     
2aef0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 69            /* 1 i
2af00 66 20 74 68 65 20 63 6f 6e 63 68 20 69 73 20 68  f the conch is h
2af10 65 6c 64 2c 20 2d 31 20 69 66 20 6c 6f 63 6b 6c  eld, -1 if lockl
2af20 65 73 73 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 6f  ess */.  void *o
2af30 6c 64 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ldLockingContext
2af40 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61  ;     /* Origina
2af50 6c 20 6c 6f 63 6b 69 6e 67 63 6f 6e 74 65 78 74  l lockingcontext
2af60 20 74 6f 20 72 65 73 74 6f 72 65 20 6f 6e 20 63   to restore on c
2af70 6c 6f 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  lose */.  sqlite
2af80 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 63 6f 6e  3_io_methods con
2af90 73 74 20 2a 70 4f 6c 64 4d 65 74 68 6f 64 3b 20  st *pOldMethod; 
2afa0 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20      /* Original 
2afb0 49 2f 4f 20 6d 65 74 68 6f 64 73 20 66 6f 72 20  I/O methods for 
2afc0 63 6c 6f 73 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20  close */.};../* 
2afd0 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79 20 6c 6f  .** The proxy lo
2afe0 63 6b 20 66 69 6c 65 20 70 61 74 68 20 66 6f 72  ck file path for
2aff0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 74   the database at
2b000 20 64 62 50 61 74 68 20 69 73 20 77 72 69 74 74   dbPath is writt
2b010 65 6e 20 69 6e 74 6f 20 6c 50 61 74 68 2c 20 0a  en into lPath, .
2b020 2a 2a 20 77 68 69 63 68 20 6d 75 73 74 20 70 6f  ** which must po
2b030 69 6e 74 20 74 6f 20 76 61 6c 69 64 2c 20 77 72  int to valid, wr
2b040 69 74 61 62 6c 65 20 6d 65 6d 6f 72 79 20 6c 61  itable memory la
2b050 72 67 65 20 65 6e 6f 75 67 68 20 66 6f 72 20 61  rge enough for a
2b060 20 6d 61 78 4c 65 6e 20 6c 65 6e 67 74 68 0a 2a   maxLen length.*
2b070 2a 20 66 69 6c 65 20 70 61 74 68 2e 20 0a 2a 2f  * file path. .*/
2b080 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
2b090 79 47 65 74 4c 6f 63 6b 50 61 74 68 28 63 6f 6e  yGetLockPath(con
2b0a0 73 74 20 63 68 61 72 20 2a 64 62 50 61 74 68 2c  st char *dbPath,
2b0b0 20 63 68 61 72 20 2a 6c 50 61 74 68 2c 20 73 69   char *lPath, si
2b0c0 7a 65 5f 74 20 6d 61 78 4c 65 6e 29 7b 0a 20 20  ze_t maxLen){.  
2b0d0 69 6e 74 20 6c 65 6e 3b 0a 20 20 69 6e 74 20 64  int len;.  int d
2b0e0 62 4c 65 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a  bLen;.  int i;..
2b0f0 23 69 66 64 65 66 20 4c 4f 43 4b 50 52 4f 58 59  #ifdef LOCKPROXY
2b100 44 49 52 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c  DIR.  len = strl
2b110 63 70 79 28 6c 50 61 74 68 2c 20 4c 4f 43 4b 50  cpy(lPath, LOCKP
2b120 52 4f 58 59 44 49 52 2c 20 6d 61 78 4c 65 6e 29  ROXYDIR, maxLen)
2b130 3b 0a 23 65 6c 73 65 0a 23 20 69 66 64 65 66 20  ;.#else.# ifdef 
2b140 5f 43 53 5f 44 41 52 57 49 4e 5f 55 53 45 52 5f  _CS_DARWIN_USER_
2b150 54 45 4d 50 5f 44 49 52 0a 20 20 7b 0a 20 20 20  TEMP_DIR.  {.   
2b160 20 69 66 28 20 21 63 6f 6e 66 73 74 72 28 5f 43   if( !confstr(_C
2b170 53 5f 44 41 52 57 49 4e 5f 55 53 45 52 5f 54 45  S_DARWIN_USER_TE
2b180 4d 50 5f 44 49 52 2c 20 6c 50 61 74 68 2c 20 6d  MP_DIR, lPath, m
2b190 61 78 4c 65 6e 29 20 29 7b 0a 20 20 20 20 20 20  axLen) ){.      
2b1a0 4f 53 54 52 41 43 45 28 28 22 47 45 54 4c 4f 43  OSTRACE(("GETLOC
2b1b0 4b 50 41 54 48 20 20 66 61 69 6c 65 64 20 25 73  KPATH  failed %s
2b1c0 20 65 72 72 6e 6f 3d 25 64 20 70 69 64 3d 25 64   errno=%d pid=%d
2b1d0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
2b1e0 20 20 20 20 6c 50 61 74 68 2c 20 65 72 72 6e 6f      lPath, errno
2b1f0 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a 20 20  , getpid()));.  
2b200 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2b210 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20  E_IOERR_LOCK;.  
2b220 20 20 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 73 74    }.    len = st
2b230 72 6c 63 61 74 28 6c 50 61 74 68 2c 20 22 73 71  rlcat(lPath, "sq
2b240 6c 69 74 65 70 6c 6f 63 6b 73 22 2c 20 6d 61 78  liteplocks", max
2b250 4c 65 6e 29 3b 20 20 20 20 0a 20 20 7d 0a 23 20  Len);    .  }.# 
2b260 65 6c 73 65 0a 20 20 6c 65 6e 20 3d 20 73 74 72  else.  len = str
2b270 6c 63 70 79 28 6c 50 61 74 68 2c 20 22 2f 74 6d  lcpy(lPath, "/tm
2b280 70 2f 22 2c 20 6d 61 78 4c 65 6e 29 3b 0a 23 20  p/", maxLen);.# 
2b290 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 20 20  endif.#endif..  
2b2a0 69 66 28 20 6c 50 61 74 68 5b 6c 65 6e 2d 31 5d  if( lPath[len-1]
2b2b0 21 3d 27 2f 27 20 29 7b 0a 20 20 20 20 6c 65 6e  !='/' ){.    len
2b2c0 20 3d 20 73 74 72 6c 63 61 74 28 6c 50 61 74 68   = strlcat(lPath
2b2d0 2c 20 22 2f 22 2c 20 6d 61 78 4c 65 6e 29 3b 0a  , "/", maxLen);.
2b2e0 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 74 72 61 6e    }.  .  /* tran
2b2f0 73 66 6f 72 6d 20 74 68 65 20 64 62 20 70 61 74  sform the db pat
2b300 68 20 74 6f 20 61 20 75 6e 69 71 75 65 20 63 61  h to a unique ca
2b310 63 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 64 62  che name */.  db
2b320 4c 65 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65  Len = (int)strle
2b330 6e 28 64 62 50 61 74 68 29 3b 0a 20 20 66 6f 72  n(dbPath);.  for
2b340 28 20 69 3d 30 3b 20 69 3c 64 62 4c 65 6e 20 26  ( i=0; i<dbLen &
2b350 26 20 28 69 2b 6c 65 6e 2b 37 29 3c 6d 61 78 4c  & (i+len+7)<maxL
2b360 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68  en; i++){.    ch
2b370 61 72 20 63 20 3d 20 64 62 50 61 74 68 5b 69 5d  ar c = dbPath[i]
2b380 3b 0a 20 20 20 20 6c 50 61 74 68 5b 69 2b 6c 65  ;.    lPath[i+le
2b390 6e 5d 20 3d 20 28 63 3d 3d 27 2f 27 29 3f 27 5f  n] = (c=='/')?'_
2b3a0 27 3a 63 3b 0a 20 20 7d 0a 20 20 6c 50 61 74 68  ':c;.  }.  lPath
2b3b0 5b 69 2b 6c 65 6e 5d 3d 27 5c 30 27 3b 0a 20 20  [i+len]='\0';.  
2b3c0 73 74 72 6c 63 61 74 28 6c 50 61 74 68 2c 20 22  strlcat(lPath, "
2b3d0 3a 61 75 74 6f 3a 22 2c 20 6d 61 78 4c 65 6e 29  :auto:", maxLen)
2b3e0 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 47 45  ;.  OSTRACE(("GE
2b3f0 54 4c 4f 43 4b 50 41 54 48 20 20 70 72 6f 78 79  TLOCKPATH  proxy
2b400 20 6c 6f 63 6b 20 70 61 74 68 3d 25 73 20 70 69   lock path=%s pi
2b410 64 3d 25 64 5c 6e 22 2c 20 6c 50 61 74 68 2c 20  d=%d\n", lPath, 
2b420 67 65 74 70 69 64 28 29 29 29 3b 0a 20 20 72 65  getpid()));.  re
2b430 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2b440 7d 0a 0a 2f 2a 20 0a 20 2a 2a 20 43 72 65 61 74  }../* . ** Creat
2b450 65 73 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65  es the lock file
2b460 20 61 6e 64 20 61 6e 79 20 6d 69 73 73 69 6e 67   and any missing
2b470 20 64 69 72 65 63 74 6f 72 69 65 73 20 69 6e 20   directories in 
2b480 6c 6f 63 6b 50 61 74 68 0a 20 2a 2f 0a 73 74 61  lockPath. */.sta
2b490 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43 72 65  tic int proxyCre
2b4a0 61 74 65 4c 6f 63 6b 50 61 74 68 28 63 6f 6e 73  ateLockPath(cons
2b4b0 74 20 63 68 61 72 20 2a 6c 6f 63 6b 50 61 74 68  t char *lockPath
2b4c0 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6c 65 6e 3b  ){.  int i, len;
2b4d0 0a 20 20 63 68 61 72 20 62 75 66 5b 4d 41 58 50  .  char buf[MAXP
2b4e0 41 54 48 4c 45 4e 5d 3b 0a 20 20 69 6e 74 20 73  ATHLEN];.  int s
2b4f0 74 61 72 74 20 3d 20 30 3b 0a 20 20 0a 20 20 61  tart = 0;.  .  a
2b500 73 73 65 72 74 28 6c 6f 63 6b 50 61 74 68 21 3d  ssert(lockPath!=
2b510 4e 55 4c 4c 29 3b 0a 20 20 2f 2a 20 74 72 79 20  NULL);.  /* try 
2b520 74 6f 20 63 72 65 61 74 65 20 61 6c 6c 20 74 68  to create all th
2b530 65 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 64  e intermediate d
2b540 69 72 65 63 74 6f 72 69 65 73 20 2a 2f 0a 20 20  irectories */.  
2b550 6c 65 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65  len = (int)strle
2b560 6e 28 6c 6f 63 6b 50 61 74 68 29 3b 0a 20 20 62  n(lockPath);.  b
2b570 75 66 5b 30 5d 20 3d 20 6c 6f 63 6b 50 61 74 68  uf[0] = lockPath
2b580 5b 30 5d 3b 0a 20 20 66 6f 72 28 20 69 3d 31 3b  [0];.  for( i=1;
2b590 20 69 3c 6c 65 6e 3b 20 69 2b 2b 20 29 7b 0a 20   i<len; i++ ){. 
2b5a0 20 20 20 69 66 28 20 6c 6f 63 6b 50 61 74 68 5b     if( lockPath[
2b5b0 69 5d 20 3d 3d 20 27 2f 27 20 26 26 20 28 69 20  i] == '/' && (i 
2b5c0 2d 20 73 74 61 72 74 20 3e 20 30 29 20 29 7b 0a  - start > 0) ){.
2b5d0 20 20 20 20 20 20 2f 2a 20 6f 6e 6c 79 20 6d 6b        /* only mk
2b5e0 64 69 72 20 69 66 20 6c 65 61 66 20 64 69 72 20  dir if leaf dir 
2b5f0 21 3d 20 22 2e 22 20 6f 72 20 22 2f 22 20 6f 72  != "." or "/" or
2b600 20 22 2e 2e 22 20 2a 2f 0a 20 20 20 20 20 20 69   ".." */.      i
2b610 66 28 20 69 2d 73 74 61 72 74 3e 32 20 7c 7c 20  f( i-start>2 || 
2b620 28 69 2d 73 74 61 72 74 3d 3d 31 20 26 26 20 62  (i-start==1 && b
2b630 75 66 5b 73 74 61 72 74 5d 20 21 3d 20 27 2e 27  uf[start] != '.'
2b640 20 26 26 20 62 75 66 5b 73 74 61 72 74 5d 20 21   && buf[start] !
2b650 3d 20 27 2f 27 29 20 0a 20 20 20 20 20 20 20 20  = '/') .        
2b660 20 7c 7c 20 28 69 2d 73 74 61 72 74 3d 3d 32 20   || (i-start==2 
2b670 26 26 20 62 75 66 5b 73 74 61 72 74 5d 20 21 3d  && buf[start] !=
2b680 20 27 2e 27 20 26 26 20 62 75 66 5b 73 74 61 72   '.' && buf[star
2b690 74 2b 31 5d 20 21 3d 20 27 2e 27 29 20 29 7b 0a  t+1] != '.') ){.
2b6a0 20 20 20 20 20 20 20 20 62 75 66 5b 69 5d 3d 27          buf[i]='
2b6b0 5c 30 27 3b 0a 20 20 20 20 20 20 20 20 69 66 28  \0';.        if(
2b6c0 20 6d 6b 64 69 72 28 62 75 66 2c 20 53 51 4c 49   mkdir(buf, SQLI
2b6d0 54 45 5f 44 45 46 41 55 4c 54 5f 50 52 4f 58 59  TE_DEFAULT_PROXY
2b6e0 44 49 52 5f 50 45 52 4d 49 53 53 49 4f 4e 53 29  DIR_PERMISSIONS)
2b6f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
2b700 74 20 65 72 72 3d 65 72 72 6e 6f 3b 0a 20 20 20  t err=errno;.   
2b710 20 20 20 20 20 20 20 69 66 28 20 65 72 72 21 3d         if( err!=
2b720 45 45 58 49 53 54 20 29 20 7b 0a 20 20 20 20 20  EEXIST ) {.     
2b730 20 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28         OSTRACE((
2b740 22 43 52 45 41 54 45 4c 4f 43 4b 50 41 54 48 20  "CREATELOCKPATH 
2b750 20 46 41 49 4c 45 44 20 63 72 65 61 74 69 6e 67   FAILED creating
2b760 20 25 73 2c 20 22 0a 20 20 20 20 20 20 20 20 20   %s, ".         
2b770 20 20 20 20 20 20 20 20 20 20 20 20 22 27 25 73              "'%s
2b780 27 20 70 72 6f 78 79 20 6c 6f 63 6b 20 70 61 74  ' proxy lock pat
2b790 68 3d 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c 0a  h=%s pid=%d\n",.
2b7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b7b0 20 20 20 20 20 62 75 66 2c 20 73 74 72 65 72 72       buf, strerr
2b7c0 6f 72 28 65 72 72 29 2c 20 6c 6f 63 6b 50 61 74  or(err), lockPat
2b7d0 68 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a 20  h, getpid()));. 
2b7e0 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
2b7f0 6e 20 65 72 72 3b 0a 20 20 20 20 20 20 20 20 20  n err;.         
2b800 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
2b810 20 20 20 7d 0a 20 20 20 20 20 20 73 74 61 72 74     }.      start
2b820 3d 69 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  =i+1;.    }.    
2b830 62 75 66 5b 69 5d 20 3d 20 6c 6f 63 6b 50 61 74  buf[i] = lockPat
2b840 68 5b 69 5d 3b 0a 20 20 7d 0a 20 20 4f 53 54 52  h[i];.  }.  OSTR
2b850 41 43 45 28 28 22 43 52 45 41 54 45 4c 4f 43 4b  ACE(("CREATELOCK
2b860 50 41 54 48 20 20 70 72 6f 78 79 20 6c 6f 63 6b  PATH  proxy lock
2b870 20 70 61 74 68 3d 25 73 20 70 69 64 3d 25 64 5c   path=%s pid=%d\
2b880 6e 22 2c 20 6c 6f 63 6b 50 61 74 68 2c 20 67 65  n", lockPath, ge
2b890 74 70 69 64 28 29 29 29 3b 0a 20 20 72 65 74 75  tpid()));.  retu
2b8a0 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rn 0;.}../*.** C
2b8b0 72 65 61 74 65 20 61 20 6e 65 77 20 56 46 53 20  reate a new VFS 
2b8c0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
2b8d0 28 73 74 6f 72 65 64 20 69 6e 20 6d 65 6d 6f 72  (stored in memor
2b8e0 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a  y obtained from.
2b8f0 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  ** sqlite3_mallo
2b900 63 29 20 61 6e 64 20 6f 70 65 6e 20 74 68 65 20  c) and open the 
2b910 66 69 6c 65 20 6e 61 6d 65 64 20 22 70 61 74 68  file named "path
2b920 22 20 69 6e 20 74 68 65 20 66 69 6c 65 20 64 65  " in the file de
2b930 73 63 72 69 70 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20  scriptor..**.** 
2b940 54 68 65 20 63 61 6c 6c 65 72 20 69 73 20 72 65  The caller is re
2b950 73 70 6f 6e 73 69 62 6c 65 20 6e 6f 74 20 6f 6e  sponsible not on
2b960 6c 79 20 66 6f 72 20 63 6c 6f 73 69 6e 67 20 74  ly for closing t
2b970 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
2b980 6f 72 0a 2a 2a 20 62 75 74 20 61 6c 73 6f 20 66  or.** but also f
2b990 6f 72 20 66 72 65 65 69 6e 67 20 74 68 65 20 6d  or freeing the m
2b9a0 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64  emory associated
2b9b0 20 77 69 74 68 20 74 68 65 20 66 69 6c 65 20 64   with the file d
2b9c0 65 73 63 72 69 70 74 6f 72 2e 0a 2a 2f 0a 73 74  escriptor..*/.st
2b9d0 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43 72  atic int proxyCr
2b9e0 65 61 74 65 55 6e 69 78 46 69 6c 65 28 0a 20 20  eateUnixFile(.  
2b9f0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 61    const char *pa
2ba00 74 68 2c 20 20 20 20 20 20 20 20 2f 2a 20 70 61  th,        /* pa
2ba10 74 68 20 66 6f 72 20 74 68 65 20 6e 65 77 20 75  th for the new u
2ba20 6e 69 78 46 69 6c 65 20 2a 2f 0a 20 20 20 20 75  nixFile */.    u
2ba30 6e 69 78 46 69 6c 65 20 2a 2a 70 70 46 69 6c 65  nixFile **ppFile
2ba40 2c 20 20 20 20 20 20 20 2f 2a 20 75 6e 69 78 46  ,       /* unixF
2ba50 69 6c 65 20 63 72 65 61 74 65 64 20 61 6e 64 20  ile created and 
2ba60 72 65 74 75 72 6e 65 64 20 62 79 20 72 65 66 20  returned by ref 
2ba70 2a 2f 0a 20 20 20 20 69 6e 74 20 69 73 6c 6f 63  */.    int isloc
2ba80 6b 66 69 6c 65 20 20 20 20 20 20 20 20 20 20 20  kfile           
2ba90 2f 2a 20 69 66 20 6e 6f 6e 20 7a 65 72 6f 20 6d  /* if non zero m
2baa0 69 73 73 69 6e 67 20 64 69 72 73 20 77 69 6c 6c  issing dirs will
2bab0 20 62 65 20 63 72 65 61 74 65 64 20 2a 2f 0a 29   be created */.)
2bac0 20 7b 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d 31   {.  int fd = -1
2bad0 3b 0a 20 20 69 6e 74 20 64 69 72 66 64 20 3d 20  ;.  int dirfd = 
2bae0 2d 31 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  -1;.  unixFile *
2baf0 70 4e 65 77 3b 0a 20 20 69 6e 74 20 72 63 20 3d  pNew;.  int rc =
2bb00 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
2bb10 74 20 6f 70 65 6e 46 6c 61 67 73 20 3d 20 4f 5f  t openFlags = O_
2bb20 52 44 57 52 20 7c 20 4f 5f 43 52 45 41 54 3b 0a  RDWR | O_CREAT;.
2bb30 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 64 75    sqlite3_vfs du
2bb40 6d 6d 79 56 66 73 3b 0a 20 20 69 6e 74 20 74 65  mmyVfs;.  int te
2bb50 72 72 6e 6f 20 3d 20 30 3b 0a 20 20 55 6e 69 78  rrno = 0;.  Unix
2bb60 55 6e 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65  UnusedFd *pUnuse
2bb70 64 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 2f 2a 20  d = NULL;..  /* 
2bb80 31 2e 20 66 69 72 73 74 20 74 72 79 20 74 6f 20  1. first try to 
2bb90 6f 70 65 6e 2f 63 72 65 61 74 65 20 74 68 65 20  open/create the 
2bba0 66 69 6c 65 0a 20 20 2a 2a 20 32 2e 20 69 66 20  file.  ** 2. if 
2bbb0 74 68 61 74 20 66 61 69 6c 73 2c 20 61 6e 64 20  that fails, and 
2bbc0 74 68 69 73 20 69 73 20 61 20 6c 6f 63 6b 20 66  this is a lock f
2bbd0 69 6c 65 20 28 6e 6f 74 2d 63 6f 6e 63 68 29 2c  ile (not-conch),
2bbe0 20 74 72 79 20 63 72 65 61 74 69 6e 67 0a 20 20   try creating.  
2bbf0 2a 2a 20 74 68 65 20 70 61 72 65 6e 74 20 64 69  ** the parent di
2bc00 72 65 63 74 6f 72 69 65 73 20 61 6e 64 20 74 68  rectories and th
2bc10 65 6e 20 74 72 79 20 61 67 61 69 6e 2e 0a 20 20  en try again..  
2bc20 2a 2a 20 33 2e 20 69 66 20 74 68 61 74 20 66 61  ** 3. if that fa
2bc30 69 6c 73 2c 20 74 72 79 20 74 6f 20 6f 70 65 6e  ils, try to open
2bc40 20 74 68 65 20 66 69 6c 65 20 72 65 61 64 2d 6f   the file read-o
2bc50 6e 6c 79 0a 20 20 2a 2a 20 6f 74 68 65 72 77 69  nly.  ** otherwi
2bc60 73 65 20 72 65 74 75 72 6e 20 42 55 53 59 20 28  se return BUSY (
2bc70 69 66 20 6c 6f 63 6b 20 66 69 6c 65 29 20 6f 72  if lock file) or
2bc80 20 43 41 4e 54 4f 50 45 4e 20 66 6f 72 20 74 68   CANTOPEN for th
2bc90 65 20 63 6f 6e 63 68 20 66 69 6c 65 0a 20 20 2a  e conch file.  *
2bca0 2f 0a 20 20 70 55 6e 75 73 65 64 20 3d 20 66 69  /.  pUnused = fi
2bcb0 6e 64 52 65 75 73 61 62 6c 65 46 64 28 70 61 74  ndReusableFd(pat
2bcc0 68 2c 20 6f 70 65 6e 46 6c 61 67 73 29 3b 0a 20  h, openFlags);. 
2bcd0 20 69 66 28 20 70 55 6e 75 73 65 64 20 29 7b 0a   if( pUnused ){.
2bce0 20 20 20 20 66 64 20 3d 20 70 55 6e 75 73 65 64      fd = pUnused
2bcf0 2d 3e 66 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ->fd;.  }else{. 
2bd00 20 20 20 70 55 6e 75 73 65 64 20 3d 20 73 71 6c     pUnused = sql
2bd10 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65  ite3_malloc(size
2bd20 6f 66 28 2a 70 55 6e 75 73 65 64 29 29 3b 0a 20  of(*pUnused));. 
2bd30 20 20 20 69 66 28 20 21 70 55 6e 75 73 65 64 20     if( !pUnused 
2bd40 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
2bd50 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
2bd60 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 66 64    }.  }.  if( fd
2bd70 3c 30 20 29 7b 0a 20 20 20 20 66 64 20 3d 20 6f  <0 ){.    fd = o
2bd80 70 65 6e 28 70 61 74 68 2c 20 6f 70 65 6e 46 6c  pen(path, openFl
2bd90 61 67 73 2c 20 53 51 4c 49 54 45 5f 44 45 46 41  ags, SQLITE_DEFA
2bda0 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53  ULT_FILE_PERMISS
2bdb0 49 4f 4e 53 29 3b 0a 20 20 20 20 74 65 72 72 6e  IONS);.    terrn
2bdc0 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 69  o = errno;.    i
2bdd0 66 28 20 66 64 3c 30 20 26 26 20 65 72 72 6e 6f  f( fd<0 && errno
2bde0 3d 3d 45 4e 4f 45 4e 54 20 26 26 20 69 73 6c 6f  ==ENOENT && islo
2bdf0 63 6b 66 69 6c 65 20 29 7b 0a 20 20 20 20 20 20  ckfile ){.      
2be00 69 66 28 20 70 72 6f 78 79 43 72 65 61 74 65 4c  if( proxyCreateL
2be10 6f 63 6b 50 61 74 68 28 70 61 74 68 29 20 3d 3d  ockPath(path) ==
2be20 20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20   SQLITE_OK ){.  
2be30 20 20 20 20 20 20 66 64 20 3d 20 6f 70 65 6e 28        fd = open(
2be40 70 61 74 68 2c 20 6f 70 65 6e 46 6c 61 67 73 2c  path, openFlags,
2be50 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
2be60 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53  FILE_PERMISSIONS
2be70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
2be80 0a 20 20 7d 0a 20 20 69 66 28 20 66 64 3c 30 20  .  }.  if( fd<0 
2be90 29 7b 0a 20 20 20 20 6f 70 65 6e 46 6c 61 67 73  ){.    openFlags
2bea0 20 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20 20 20   = O_RDONLY;.   
2beb0 20 66 64 20 3d 20 6f 70 65 6e 28 70 61 74 68 2c   fd = open(path,
2bec0 20 6f 70 65 6e 46 6c 61 67 73 2c 20 53 51 4c 49   openFlags, SQLI
2bed0 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f  TE_DEFAULT_FILE_
2bee0 50 45 52 4d 49 53 53 49 4f 4e 53 29 3b 0a 20 20  PERMISSIONS);.  
2bef0 20 20 74 65 72 72 6e 6f 20 3d 20 65 72 72 6e 6f    terrno = errno
2bf00 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 64 3c 30  ;.  }.  if( fd<0
2bf10 20 29 7b 0a 20 20 20 20 69 66 28 20 69 73 6c 6f   ){.    if( islo
2bf20 63 6b 66 69 6c 65 20 29 7b 0a 20 20 20 20 20 20  ckfile ){.      
2bf30 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
2bf40 53 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 77  SY;.    }.    sw
2bf50 69 74 63 68 20 28 74 65 72 72 6e 6f 29 20 7b 0a  itch (terrno) {.
2bf60 20 20 20 20 20 20 63 61 73 65 20 45 41 43 43 45        case EACCE
2bf70 53 3a 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  S:.        retur
2bf80 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20  n SQLITE_PERM;. 
2bf90 20 20 20 20 20 63 61 73 65 20 45 49 4f 3a 20 0a       case EIO: .
2bfa0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
2bfb0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b  QLITE_IOERR_LOCK
2bfc0 3b 20 2f 2a 20 65 76 65 6e 20 74 68 6f 75 67 68  ; /* even though
2bfd0 20 69 74 20 69 73 20 74 68 65 20 63 6f 6e 63 68   it is the conch
2bfe0 20 2a 2f 0a 20 20 20 20 20 20 64 65 66 61 75 6c   */.      defaul
2bff0 74 3a 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  t:.        retur
2c000 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  n SQLITE_CANTOPE
2c010 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  N_BKPT;.    }.  
2c020 7d 0a 20 20 0a 20 20 70 4e 65 77 20 3d 20 28 75  }.  .  pNew = (u
2c030 6e 69 78 46 69 6c 65 20 2a 29 73 71 6c 69 74 65  nixFile *)sqlite
2c040 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28  3_malloc(sizeof(
2c050 2a 70 4e 65 77 29 29 3b 0a 20 20 69 66 28 20 70  *pNew));.  if( p
2c060 4e 65 77 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20  New==NULL ){.   
2c070 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
2c080 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64  EM;.    goto end
2c090 5f 63 72 65 61 74 65 5f 70 72 6f 78 79 3b 0a 20  _create_proxy;. 
2c0a0 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70 4e 65 77   }.  memset(pNew
2c0b0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 75 6e 69 78  , 0, sizeof(unix
2c0c0 46 69 6c 65 29 29 3b 0a 20 20 70 4e 65 77 2d 3e  File));.  pNew->
2c0d0 6f 70 65 6e 46 6c 61 67 73 20 3d 20 6f 70 65 6e  openFlags = open
2c0e0 46 6c 61 67 73 3b 0a 20 20 64 75 6d 6d 79 56 66  Flags;.  dummyVf
2c0f0 73 2e 70 41 70 70 44 61 74 61 20 3d 20 28 76 6f  s.pAppData = (vo
2c100 69 64 2a 29 26 61 75 74 6f 6c 6f 63 6b 49 6f 46  id*)&autolockIoF
2c110 69 6e 64 65 72 3b 0a 20 20 70 55 6e 75 73 65 64  inder;.  pUnused
2c120 2d 3e 66 64 20 3d 20 66 64 3b 0a 20 20 70 55 6e  ->fd = fd;.  pUn
2c130 75 73 65 64 2d 3e 66 6c 61 67 73 20 3d 20 6f 70  used->flags = op
2c140 65 6e 46 6c 61 67 73 3b 0a 20 20 70 4e 65 77 2d  enFlags;.  pNew-
2c150 3e 70 55 6e 75 73 65 64 20 3d 20 70 55 6e 75 73  >pUnused = pUnus
2c160 65 64 3b 0a 20 20 0a 20 20 72 63 20 3d 20 66 69  ed;.  .  rc = fi
2c170 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 28 26 64 75  llInUnixFile(&du
2c180 6d 6d 79 56 66 73 2c 20 66 64 2c 20 64 69 72 66  mmyVfs, fd, dirf
2c190 64 2c 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  d, (sqlite3_file
2c1a0 2a 29 70 4e 65 77 2c 20 70 61 74 68 2c 20 30 2c  *)pNew, path, 0,
2c1b0 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53   0);.  if( rc==S
2c1c0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2c1d0 2a 70 70 46 69 6c 65 20 3d 20 70 4e 65 77 3b 0a  *ppFile = pNew;.
2c1e0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2c1f0 45 5f 4f 4b 3b 0a 20 20 7d 0a 65 6e 64 5f 63 72  E_OK;.  }.end_cr
2c200 65 61 74 65 5f 70 72 6f 78 79 3a 20 20 20 20 0a  eate_proxy:    .
2c210 20 20 63 6c 6f 73 65 28 66 64 29 3b 20 2f 2a 20    close(fd); /* 
2c220 73 69 6c 65 6e 74 6c 79 20 6c 65 61 6b 20 66 64  silently leak fd
2c230 20 69 66 20 65 72 72 6f 72 2c 20 77 65 27 72 65   if error, we're
2c240 20 61 6c 72 65 61 64 79 20 69 6e 20 65 72 72 6f   already in erro
2c250 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  r */.  sqlite3_f
2c260 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 73 71 6c  ree(pNew);.  sql
2c270 69 74 65 33 5f 66 72 65 65 28 70 55 6e 75 73 65  ite3_free(pUnuse
2c280 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  d);.  return rc;
2c290 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
2c2a0 45 5f 54 45 53 54 0a 2f 2a 20 73 69 6d 75 6c 61  E_TEST./* simula
2c2b0 74 65 20 6d 75 6c 74 69 70 6c 65 20 68 6f 73 74  te multiple host
2c2c0 73 20 62 79 20 63 72 65 61 74 69 6e 67 20 75 6e  s by creating un
2c2d0 69 71 75 65 20 68 6f 73 74 69 64 20 66 69 6c 65  ique hostid file
2c2e0 20 70 61 74 68 73 20 2a 2f 0a 69 6e 74 20 73 71   paths */.int sq
2c2f0 6c 69 74 65 33 5f 68 6f 73 74 69 64 5f 6e 75 6d  lite3_hostid_num
2c300 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 23 64   = 0;.#endif..#d
2c310 65 66 69 6e 65 20 50 52 4f 58 59 5f 48 4f 53 54  efine PROXY_HOST
2c320 49 44 4c 45 4e 20 20 20 20 31 36 20 20 2f 2a 20  IDLEN    16  /* 
2c330 63 6f 6e 63 68 20 66 69 6c 65 20 68 6f 73 74 20  conch file host 
2c340 69 64 20 6c 65 6e 67 74 68 20 2a 2f 0a 0a 2f 2a  id length */../*
2c350 20 67 65 74 20 74 68 65 20 68 6f 73 74 20 49 44   get the host ID
2c360 20 76 69 61 20 67 65 74 68 6f 73 74 75 75 69 64   via gethostuuid
2c370 28 29 2c 20 70 48 6f 73 74 49 44 20 6d 75 73 74  (), pHostID must
2c380 20 70 6f 69 6e 74 20 74 6f 20 50 52 4f 58 59 5f   point to PROXY_
2c390 48 4f 53 54 49 44 4c 45 4e 20 0a 2a 2a 20 62 79  HOSTIDLEN .** by
2c3a0 74 65 73 20 6f 66 20 77 72 69 74 61 62 6c 65 20  tes of writable 
2c3b0 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69  memory..*/.stati
2c3c0 63 20 69 6e 74 20 70 72 6f 78 79 47 65 74 48 6f  c int proxyGetHo
2c3d0 73 74 49 44 28 75 6e 73 69 67 6e 65 64 20 63 68  stID(unsigned ch
2c3e0 61 72 20 2a 70 48 6f 73 74 49 44 2c 20 69 6e 74  ar *pHostID, int
2c3f0 20 2a 70 45 72 72 6f 72 29 7b 0a 20 20 73 74 72   *pError){.  str
2c400 75 63 74 20 74 69 6d 65 73 70 65 63 20 74 69 6d  uct timespec tim
2c410 65 6f 75 74 20 3d 20 7b 31 2c 20 30 7d 3b 20 2f  eout = {1, 0}; /
2c420 2a 20 31 20 73 65 63 20 74 69 6d 65 6f 75 74 20  * 1 sec timeout 
2c430 2a 2f 0a 20 20 0a 20 20 61 73 73 65 72 74 28 50  */.  .  assert(P
2c440 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 20 3d  ROXY_HOSTIDLEN =
2c450 3d 20 73 69 7a 65 6f 66 28 75 75 69 64 5f 74 29  = sizeof(uuid_t)
2c460 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70 48 6f 73  );.  memset(pHos
2c470 74 49 44 2c 20 30 2c 20 50 52 4f 58 59 5f 48 4f  tID, 0, PROXY_HO
2c480 53 54 49 44 4c 45 4e 29 3b 0a 20 20 69 66 28 20  STIDLEN);.  if( 
2c490 67 65 74 68 6f 73 74 75 75 69 64 28 70 48 6f 73  gethostuuid(pHos
2c4a0 74 49 44 2c 20 26 74 69 6d 65 6f 75 74 29 20 29  tID, &timeout) )
2c4b0 7b 0a 20 20 20 20 69 6e 74 20 65 72 72 20 3d 20  {.    int err = 
2c4c0 65 72 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20 70  errno;.    if( p
2c4d0 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20 20 2a  Error ){.      *
2c4e0 70 45 72 72 6f 72 20 3d 20 65 72 72 3b 0a 20 20  pError = err;.  
2c4f0 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 53    }.    return S
2c500 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 7d  QLITE_IOERR;.  }
2c510 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
2c520 45 53 54 0a 20 20 2f 2a 20 73 69 6d 75 6c 61 74  EST.  /* simulat
2c530 65 20 6d 75 6c 74 69 70 6c 65 20 68 6f 73 74 73  e multiple hosts
2c540 20 62 79 20 63 72 65 61 74 69 6e 67 20 75 6e 69   by creating uni
2c550 71 75 65 20 68 6f 73 74 69 64 20 66 69 6c 65 20  que hostid file 
2c560 70 61 74 68 73 20 2a 2f 0a 20 20 69 66 28 20 73  paths */.  if( s
2c570 71 6c 69 74 65 33 5f 68 6f 73 74 69 64 5f 6e 75  qlite3_hostid_nu
2c580 6d 20 21 3d 20 30 29 7b 0a 20 20 20 20 70 48 6f  m != 0){.    pHo
2c590 73 74 49 44 5b 30 5d 20 3d 20 28 63 68 61 72 29  stID[0] = (char)
2c5a0 28 70 48 6f 73 74 49 44 5b 30 5d 20 2b 20 28 63  (pHostID[0] + (c
2c5b0 68 61 72 29 28 73 71 6c 69 74 65 33 5f 68 6f 73  har)(sqlite3_hos
2c5c0 74 69 64 5f 6e 75 6d 20 26 20 30 78 46 46 29 29  tid_num & 0xFF))
2c5d0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a  ;.  }.#endif.  .
2c5e0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2c5f0 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 63 6f  OK;.}../* The co
2c600 6e 63 68 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e  nch file contain
2c610 73 20 74 68 65 20 68 65 61 64 65 72 2c 20 68 6f  s the header, ho
2c620 73 74 20 69 64 20 61 6e 64 20 6c 6f 63 6b 20 66  st id and lock f
2c630 69 6c 65 20 70 61 74 68 0a 20 2a 2f 0a 23 64 65  ile path. */.#de
2c640 66 69 6e 65 20 50 52 4f 58 59 5f 43 4f 4e 43 48  fine PROXY_CONCH
2c650 56 45 52 53 49 4f 4e 20 32 20 20 20 2f 2a 20 31  VERSION 2   /* 1
2c660 2d 62 79 74 65 20 68 65 61 64 65 72 2c 20 31 36  -byte header, 16
2c670 2d 62 79 74 65 20 68 6f 73 74 20 69 64 2c 20 70  -byte host id, p
2c680 61 74 68 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50  ath */.#define P
2c690 52 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e 20 20  ROXY_HEADERLEN  
2c6a0 20 20 31 20 20 20 2f 2a 20 63 6f 6e 63 68 20 66    1   /* conch f
2c6b0 69 6c 65 20 68 65 61 64 65 72 20 6c 65 6e 67 74  ile header lengt
2c6c0 68 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 52 4f  h */.#define PRO
2c6d0 58 59 5f 50 41 54 48 49 4e 44 45 58 20 20 20 20  XY_PATHINDEX    
2c6e0 28 50 52 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e  (PROXY_HEADERLEN
2c6f0 2b 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e  +PROXY_HOSTIDLEN
2c700 29 0a 23 64 65 66 69 6e 65 20 50 52 4f 58 59 5f  ).#define PROXY_
2c710 4d 41 58 43 4f 4e 43 48 4c 45 4e 20 20 28 50 52  MAXCONCHLEN  (PR
2c720 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e 2b 50 52  OXY_HEADERLEN+PR
2c730 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 2b 4d 41  OXY_HOSTIDLEN+MA
2c740 58 50 41 54 48 4c 45 4e 29 0a 0a 2f 2a 20 0a 2a  XPATHLEN)../* .*
2c750 2a 20 54 61 6b 65 73 20 61 6e 20 6f 70 65 6e 20  * Takes an open 
2c760 63 6f 6e 63 68 20 66 69 6c 65 2c 20 63 6f 70 69  conch file, copi
2c770 65 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  es the contents 
2c780 74 6f 20 61 20 6e 65 77 20 70 61 74 68 20 61 6e  to a new path an
2c790 64 20 74 68 65 6e 20 6d 6f 76 65 73 20 0a 2a 2a  d then moves .**
2c7a0 20 69 74 20 62 61 63 6b 2e 20 20 54 68 65 20 6e   it back.  The n
2c7b0 65 77 6c 79 20 63 72 65 61 74 65 64 20 66 69 6c  ewly created fil
2c7c0 65 27 73 20 66 69 6c 65 20 64 65 73 63 72 69 70  e's file descrip
2c7d0 74 6f 72 20 69 73 20 61 73 73 69 67 6e 65 64 20  tor is assigned 
2c7e0 74 6f 20 74 68 65 0a 2a 2a 20 63 6f 6e 63 68 20  to the.** conch 
2c7f0 66 69 6c 65 20 73 74 72 75 63 74 75 72 65 20 61  file structure a
2c800 6e 64 20 66 69 6e 61 6c 6c 79 20 74 68 65 20 6f  nd finally the o
2c810 72 69 67 69 6e 61 6c 20 63 6f 6e 63 68 20 66 69  riginal conch fi
2c820 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73  le descriptor is
2c830 20 0a 2a 2a 20 63 6c 6f 73 65 64 2e 20 20 52 65   .** closed.  Re
2c840 74 75 72 6e 73 20 7a 65 72 6f 20 69 66 20 73 75  turns zero if su
2c850 63 63 65 73 73 66 75 6c 2e 0a 2a 2f 0a 73 74 61  ccessful..*/.sta
2c860 74 69 63 20 69 6e 74 20 70 72 6f 78 79 42 72 65  tic int proxyBre
2c870 61 6b 43 6f 6e 63 68 4c 6f 63 6b 28 75 6e 69 78  akConchLock(unix
2c880 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 75 75 69  File *pFile, uui
2c890 64 5f 74 20 6d 79 48 6f 73 74 49 44 29 7b 0a 20  d_t myHostID){. 
2c8a0 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e   proxyLockingCon
2c8b0 74 65 78 74 20 2a 70 43 74 78 20 3d 20 28 70 72  text *pCtx = (pr
2c8c0 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  oxyLockingContex
2c8d0 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69  t *)pFile->locki
2c8e0 6e 67 43 6f 6e 74 65 78 74 3b 20 0a 20 20 75 6e  ngContext; .  un
2c8f0 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46 69 6c  ixFile *conchFil
2c900 65 20 3d 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46  e = pCtx->conchF
2c910 69 6c 65 3b 0a 20 20 63 68 61 72 20 74 50 61 74  ile;.  char tPat
2c920 68 5b 4d 41 58 50 41 54 48 4c 45 4e 5d 3b 0a 20  h[MAXPATHLEN];. 
2c930 20 63 68 61 72 20 62 75 66 5b 50 52 4f 58 59 5f   char buf[PROXY_
2c940 4d 41 58 43 4f 4e 43 48 4c 45 4e 5d 3b 0a 20 20  MAXCONCHLEN];.  
2c950 63 68 61 72 20 2a 63 50 61 74 68 20 3d 20 70 43  char *cPath = pC
2c960 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 50 61 74  tx->conchFilePat
2c970 68 3b 0a 20 20 73 69 7a 65 5f 74 20 72 65 61 64  h;.  size_t read
2c980 4c 65 6e 20 3d 20 30 3b 0a 20 20 73 69 7a 65 5f  Len = 0;.  size_
2c990 74 20 70 61 74 68 4c 65 6e 20 3d 20 30 3b 0a 20  t pathLen = 0;. 
2c9a0 20 63 68 61 72 20 65 72 72 6d 73 67 5b 36 34 5d   char errmsg[64]
2c9b0 20 3d 20 22 22 3b 0a 20 20 69 6e 74 20 66 64 20   = "";.  int fd 
2c9c0 3d 20 2d 31 3b 0a 20 20 69 6e 74 20 72 63 20 3d  = -1;.  int rc =
2c9d0 20 2d 31 3b 0a 0a 20 20 2f 2a 20 63 72 65 61 74   -1;..  /* creat
2c9e0 65 20 61 20 6e 65 77 20 70 61 74 68 20 62 79 20  e a new path by 
2c9f0 72 65 70 6c 61 63 65 20 74 68 65 20 74 72 61 69  replace the trai
2ca00 6c 69 6e 67 20 27 2d 63 6f 6e 63 68 27 20 77 69  ling '-conch' wi
2ca10 74 68 20 27 2d 62 72 65 61 6b 27 20 2a 2f 0a 20  th '-break' */. 
2ca20 20 70 61 74 68 4c 65 6e 20 3d 20 73 74 72 6c 63   pathLen = strlc
2ca30 70 79 28 74 50 61 74 68 2c 20 63 50 61 74 68 2c  py(tPath, cPath,
2ca40 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a 20 20   MAXPATHLEN);.  
2ca50 69 66 28 20 70 61 74 68 4c 65 6e 3e 4d 41 58 50  if( pathLen>MAXP
2ca60 41 54 48 4c 45 4e 20 7c 7c 20 70 61 74 68 4c 65  ATHLEN || pathLe
2ca70 6e 3c 36 20 7c 7c 20 0a 20 20 20 20 20 28 73 74  n<6 || .     (st
2ca80 72 6c 63 70 79 28 26 74 50 61 74 68 5b 70 61 74  rlcpy(&tPath[pat
2ca90 68 4c 65 6e 2d 35 5d 2c 20 22 62 72 65 61 6b 22  hLen-5], "break"
2caa0 2c 20 36 29 20 21 3d 20 35 29 20 29 7b 0a 20 20  , 6) != 5) ){.  
2cab0 20 20 73 70 72 69 6e 74 66 28 65 72 72 6d 73 67    sprintf(errmsg
2cac0 2c 20 22 70 61 74 68 20 65 72 72 6f 72 20 28 6c  , "path error (l
2cad0 65 6e 20 25 64 29 22 2c 20 28 69 6e 74 29 70 61  en %d)", (int)pa
2cae0 74 68 4c 65 6e 29 3b 0a 20 20 20 20 67 6f 74 6f  thLen);.    goto
2caf0 20 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a   end_breaklock;.
2cb00 20 20 7d 0a 20 20 2f 2a 20 72 65 61 64 20 74 68    }.  /* read th
2cb10 65 20 63 6f 6e 63 68 20 63 6f 6e 74 65 6e 74 20  e conch content 
2cb20 2a 2f 0a 20 20 72 65 61 64 4c 65 6e 20 3d 20 70  */.  readLen = p
2cb30 72 65 61 64 28 63 6f 6e 63 68 46 69 6c 65 2d 3e  read(conchFile->
2cb40 68 2c 20 62 75 66 2c 20 50 52 4f 58 59 5f 4d 41  h, buf, PROXY_MA
2cb50 58 43 4f 4e 43 48 4c 45 4e 2c 20 30 29 3b 0a 20  XCONCHLEN, 0);. 
2cb60 20 69 66 28 20 72 65 61 64 4c 65 6e 3c 50 52 4f   if( readLen<PRO
2cb70 58 59 5f 50 41 54 48 49 4e 44 45 58 20 29 7b 0a  XY_PATHINDEX ){.
2cb80 20 20 20 20 73 70 72 69 6e 74 66 28 65 72 72 6d      sprintf(errm
2cb90 73 67 2c 20 22 72 65 61 64 20 65 72 72 6f 72 20  sg, "read error 
2cba0 28 6c 65 6e 20 25 64 29 22 2c 20 28 69 6e 74 29  (len %d)", (int)
2cbb0 72 65 61 64 4c 65 6e 29 3b 0a 20 20 20 20 67 6f  readLen);.    go
2cbc0 74 6f 20 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b  to end_breaklock
2cbd0 3b 0a 20 20 7d 0a 20 20 2f 2a 20 77 72 69 74 65  ;.  }.  /* write
2cbe0 20 69 74 20 6f 75 74 20 74 6f 20 74 68 65 20 74   it out to the t
2cbf0 65 6d 70 6f 72 61 72 79 20 62 72 65 61 6b 20 66  emporary break f
2cc00 69 6c 65 20 2a 2f 0a 20 20 66 64 20 3d 20 6f 70  ile */.  fd = op
2cc10 65 6e 28 74 50 61 74 68 2c 20 28 4f 5f 52 44 57  en(tPath, (O_RDW
2cc20 52 7c 4f 5f 43 52 45 41 54 7c 4f 5f 45 58 43 4c  R|O_CREAT|O_EXCL
2cc30 29 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  ), SQLITE_DEFAUL
2cc40 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f  T_FILE_PERMISSIO
2cc50 4e 53 29 3b 0a 20 20 69 66 28 20 66 64 3c 30 20  NS);.  if( fd<0 
2cc60 29 7b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 65  ){.    sprintf(e
2cc70 72 72 6d 73 67 2c 20 22 63 72 65 61 74 65 20 66  rrmsg, "create f
2cc80 61 69 6c 65 64 20 28 25 64 29 22 2c 20 65 72 72  ailed (%d)", err
2cc90 6e 6f 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  no);.    goto en
2cca0 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20 7d  d_breaklock;.  }
2ccb0 0a 20 20 69 66 28 20 70 77 72 69 74 65 28 66 64  .  if( pwrite(fd
2ccc0 2c 20 62 75 66 2c 20 72 65 61 64 4c 65 6e 2c 20  , buf, readLen, 
2ccd0 30 29 20 21 3d 20 72 65 61 64 4c 65 6e 20 29 7b  0) != readLen ){
2cce0 0a 20 20 20 20 73 70 72 69 6e 74 66 28 65 72 72  .    sprintf(err
2ccf0 6d 73 67 2c 20 22 77 72 69 74 65 20 66 61 69 6c  msg, "write fail
2cd00 65 64 20 28 25 64 29 22 2c 20 65 72 72 6e 6f 29  ed (%d)", errno)
2cd10 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 62  ;.    goto end_b
2cd20 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20  reaklock;.  }.  
2cd30 69 66 28 20 72 65 6e 61 6d 65 28 74 50 61 74 68  if( rename(tPath
2cd40 2c 20 63 50 61 74 68 29 20 29 7b 0a 20 20 20 20  , cPath) ){.    
2cd50 73 70 72 69 6e 74 66 28 65 72 72 6d 73 67 2c 20  sprintf(errmsg, 
2cd60 22 72 65 6e 61 6d 65 20 66 61 69 6c 65 64 20 28  "rename failed (
2cd70 25 64 29 22 2c 20 65 72 72 6e 6f 29 3b 0a 20 20  %d)", errno);.  
2cd80 20 20 67 6f 74 6f 20 65 6e 64 5f 62 72 65 61 6b    goto end_break
2cd90 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  lock;.  }.  rc =
2cda0 20 30 3b 0a 20 20 66 70 72 69 6e 74 66 28 73 74   0;.  fprintf(st
2cdb0 64 65 72 72 2c 20 22 62 72 6f 6b 65 20 73 74 61  derr, "broke sta
2cdc0 6c 65 20 6c 6f 63 6b 20 6f 6e 20 25 73 5c 6e 22  le lock on %s\n"
2cdd0 2c 20 63 50 61 74 68 29 3b 0a 20 20 63 6c 6f 73  , cPath);.  clos
2cde0 65 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 29 3b  e(conchFile->h);
2cdf0 0a 20 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 20  .  conchFile->h 
2ce00 3d 20 66 64 3b 0a 20 20 63 6f 6e 63 68 46 69 6c  = fd;.  conchFil
2ce10 65 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 4f  e->openFlags = O
2ce20 5f 52 44 57 52 20 7c 20 4f 5f 43 52 45 41 54 3b  _RDWR | O_CREAT;
2ce30 0a 0a 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3a  ..end_breaklock:
2ce40 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
2ce50 20 69 66 28 20 66 64 3e 3d 30 20 29 7b 0a 20 20   if( fd>=0 ){.  
2ce60 20 20 20 20 75 6e 6c 69 6e 6b 28 74 50 61 74 68      unlink(tPath
2ce70 29 3b 0a 20 20 20 20 20 20 63 6c 6f 73 65 28 66  );.      close(f
2ce80 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 70  d);.    }.    fp
2ce90 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 66  rintf(stderr, "f
2cea0 61 69 6c 65 64 20 74 6f 20 62 72 65 61 6b 20 73  ailed to break s
2ceb0 74 61 6c 65 20 6c 6f 63 6b 20 6f 6e 20 25 73 2c  tale lock on %s,
2cec0 20 25 73 5c 6e 22 2c 20 63 50 61 74 68 2c 20 65   %s\n", cPath, e
2ced0 72 72 6d 73 67 29 3b 0a 20 20 7d 0a 20 20 72 65  rrmsg);.  }.  re
2cee0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 54  turn rc;.}../* T
2cef0 61 6b 65 20 74 68 65 20 72 65 71 75 65 73 74 65  ake the requeste
2cf00 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 63 6f  d lock on the co
2cf10 6e 63 68 20 66 69 6c 65 20 61 6e 64 20 62 72 65  nch file and bre
2cf20 61 6b 20 61 20 73 74 61 6c 65 20 6c 6f 63 6b 20  ak a stale lock 
2cf30 69 66 20 74 68 65 20 0a 2a 2a 20 68 6f 73 74 20  if the .** host 
2cf40 69 64 20 6d 61 74 63 68 65 73 2e 0a 2a 2f 0a 73  id matches..*/.s
2cf50 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43  tatic int proxyC
2cf60 6f 6e 63 68 4c 6f 63 6b 28 75 6e 69 78 46 69 6c  onchLock(unixFil
2cf70 65 20 2a 70 46 69 6c 65 2c 20 75 75 69 64 5f 74  e *pFile, uuid_t
2cf80 20 6d 79 48 6f 73 74 49 44 2c 20 69 6e 74 20 6c   myHostID, int l
2cf90 6f 63 6b 54 79 70 65 29 7b 0a 20 20 70 72 6f 78  ockType){.  prox
2cfa0 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  yLockingContext 
2cfb0 2a 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f  *pCtx = (proxyLo
2cfc0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70  ckingContext *)p
2cfd0 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
2cfe0 74 65 78 74 3b 20 0a 20 20 75 6e 69 78 46 69 6c  text; .  unixFil
2cff0 65 20 2a 63 6f 6e 63 68 46 69 6c 65 20 3d 20 70  e *conchFile = p
2d000 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 3b 0a  Ctx->conchFile;.
2d010 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
2d020 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 54 72 69  E_OK;.  int nTri
2d030 65 73 20 3d 20 30 3b 0a 20 20 73 74 72 75 63 74  es = 0;.  struct
2d040 20 74 69 6d 65 73 70 65 63 20 63 6f 6e 63 68 4d   timespec conchM
2d050 6f 64 54 69 6d 65 3b 0a 20 20 0a 20 20 64 6f 20  odTime;.  .  do 
2d060 7b 0a 20 20 20 20 72 63 20 3d 20 63 6f 6e 63 68  {.    rc = conch
2d070 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78  File->pMethod->x
2d080 4c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69  Lock((sqlite3_fi
2d090 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 6c  le*)conchFile, l
2d0a0 6f 63 6b 54 79 70 65 29 3b 0a 20 20 20 20 6e 54  ockType);.    nT
2d0b0 72 69 65 73 20 2b 2b 3b 0a 20 20 20 20 69 66 28  ries ++;.    if(
2d0c0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc==SQLITE_BUSY
2d0d0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
2d0e0 74 68 65 20 6c 6f 63 6b 20 66 61 69 6c 65 64 20  the lock failed 
2d0f0 28 62 75 73 79 29 3a 0a 20 20 20 20 20 20 20 2a  (busy):.       *
2d100 20 31 73 74 20 74 72 79 3a 20 67 65 74 20 74 68   1st try: get th
2d110 65 20 6d 6f 64 20 74 69 6d 65 20 6f 66 20 74 68  e mod time of th
2d120 65 20 63 6f 6e 63 68 2c 20 77 61 69 74 20 30 2e  e conch, wait 0.
2d130 35 73 20 61 6e 64 20 74 72 79 20 61 67 61 69 6e  5s and try again
2d140 2e 20 0a 20 20 20 20 20 20 20 2a 20 32 6e 64 20  . .       * 2nd 
2d150 74 72 79 3a 20 66 61 69 6c 20 69 66 20 74 68 65  try: fail if the
2d160 20 6d 6f 64 20 74 69 6d 65 20 63 68 61 6e 67 65   mod time change
2d170 64 20 6f 72 20 68 6f 73 74 20 69 64 20 69 73 20  d or host id is 
2d180 64 69 66 66 65 72 65 6e 74 2c 20 77 61 69 74 20  different, wait 
2d190 0a 20 20 20 20 20 20 20 2a 20 20 20 20 20 20 20  .       *       
2d1a0 20 20 20 20 31 30 20 73 65 63 20 61 6e 64 20 74      10 sec and t
2d1b0 72 79 20 61 67 61 69 6e 0a 20 20 20 20 20 20 20  ry again.       
2d1c0 2a 20 33 72 64 20 74 72 79 3a 20 62 72 65 61 6b  * 3rd try: break
2d1d0 20 74 68 65 20 6c 6f 63 6b 20 75 6e 6c 65 73 73   the lock unless
2d1e0 20 74 68 65 20 6d 6f 64 20 74 69 6d 65 20 68 61   the mod time ha
2d1f0 73 20 63 68 61 6e 67 65 64 2e 0a 20 20 20 20 20  s changed..     
2d200 20 20 2a 2f 0a 20 20 20 20 20 20 73 74 72 75 63    */.      struc
2d210 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20 20 20  t stat buf;.    
2d220 20 20 69 66 28 20 66 73 74 61 74 28 63 6f 6e 63    if( fstat(conc
2d230 68 46 69 6c 65 2d 3e 68 2c 20 26 62 75 66 29 20  hFile->h, &buf) 
2d240 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65  ){.        pFile
2d250 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72  ->lastErrno = er
2d260 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 72 65 74  rno;.        ret
2d270 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
2d280 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  _LOCK;.      }. 
2d290 20 20 20 20 20 0a 20 20 20 20 20 20 69 66 28 20       .      if( 
2d2a0 6e 54 72 69 65 73 3d 3d 31 20 29 7b 0a 20 20 20  nTries==1 ){.   
2d2b0 20 20 20 20 20 63 6f 6e 63 68 4d 6f 64 54 69 6d       conchModTim
2d2c0 65 20 3d 20 62 75 66 2e 73 74 5f 6d 74 69 6d 65  e = buf.st_mtime
2d2d0 73 70 65 63 3b 0a 20 20 20 20 20 20 20 20 75 73  spec;.        us
2d2e0 6c 65 65 70 28 35 30 30 30 30 30 29 3b 20 2f 2a  leep(500000); /*
2d2f0 20 77 61 69 74 20 30 2e 35 20 73 65 63 20 61 6e   wait 0.5 sec an
2d300 64 20 74 72 79 20 74 68 65 20 6c 6f 63 6b 20 61  d try the lock a
2d310 67 61 69 6e 2a 2f 0a 20 20 20 20 20 20 20 20 63  gain*/.        c
2d320 6f 6e 74 69 6e 75 65 3b 20 20 0a 20 20 20 20 20  ontinue;  .     
2d330 20 7d 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74   }..      assert
2d340 28 20 6e 54 72 69 65 73 3e 31 20 29 3b 0a 20 20  ( nTries>1 );.  
2d350 20 20 20 20 69 66 28 20 63 6f 6e 63 68 4d 6f 64      if( conchMod
2d360 54 69 6d 65 2e 74 76 5f 73 65 63 20 21 3d 20 62  Time.tv_sec != b
2d370 75 66 2e 73 74 5f 6d 74 69 6d 65 73 70 65 63 2e  uf.st_mtimespec.
2d380 74 76 5f 73 65 63 20 7c 7c 20 0a 20 20 20 20 20  tv_sec || .     
2d390 20 20 20 20 63 6f 6e 63 68 4d 6f 64 54 69 6d 65      conchModTime
2d3a0 2e 74 76 5f 6e 73 65 63 20 21 3d 20 62 75 66 2e  .tv_nsec != buf.
2d3b0 73 74 5f 6d 74 69 6d 65 73 70 65 63 2e 74 76 5f  st_mtimespec.tv_
2d3c0 6e 73 65 63 20 29 7b 0a 20 20 20 20 20 20 20 20  nsec ){.        
2d3d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
2d3e0 53 59 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  SY;.      }.    
2d3f0 20 20 0a 20 20 20 20 20 20 69 66 28 20 6e 54 72    .      if( nTr
2d400 69 65 73 3d 3d 32 20 29 7b 20 20 0a 20 20 20 20  ies==2 ){  .    
2d410 20 20 20 20 63 68 61 72 20 74 42 75 66 5b 50 52      char tBuf[PR
2d420 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 5d  OXY_MAXCONCHLEN]
2d430 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6c 65  ;.        int le
2d440 6e 20 3d 20 70 72 65 61 64 28 63 6f 6e 63 68 46  n = pread(conchF
2d450 69 6c 65 2d 3e 68 2c 20 74 42 75 66 2c 20 50 52  ile->h, tBuf, PR
2d460 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 2c  OXY_MAXCONCHLEN,
2d470 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
2d480 20 6c 65 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20   len<0 ){.      
2d490 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
2d4a0 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
2d4b0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
2d4c0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b  QLITE_IOERR_LOCK
2d4d0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2d4e0 20 20 20 20 69 66 28 20 6c 65 6e 3e 50 52 4f 58      if( len>PROX
2d4f0 59 5f 50 41 54 48 49 4e 44 45 58 20 26 26 20 74  Y_PATHINDEX && t
2d500 42 75 66 5b 30 5d 3d 3d 28 63 68 61 72 29 50 52  Buf[0]==(char)PR
2d510 4f 58 59 5f 43 4f 4e 43 48 56 45 52 53 49 4f 4e  OXY_CONCHVERSION
2d520 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
2d530 64 6f 6e 27 74 20 62 72 65 61 6b 20 74 68 65 20  don't break the 
2d540 6c 6f 63 6b 20 69 66 20 74 68 65 20 68 6f 73 74  lock if the host
2d550 20 69 64 20 64 6f 65 73 6e 27 74 20 6d 61 74 63   id doesn't matc
2d560 68 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69  h */.          i
2d570 66 28 20 30 21 3d 6d 65 6d 63 6d 70 28 26 74 42  f( 0!=memcmp(&tB
2d580 75 66 5b 50 52 4f 58 59 5f 48 45 41 44 45 52 4c  uf[PROXY_HEADERL
2d590 45 4e 5d 2c 20 6d 79 48 6f 73 74 49 44 2c 20 50  EN], myHostID, P
2d5a0 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 29 20  ROXY_HOSTIDLEN) 
2d5b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
2d5c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
2d5d0 59 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  Y;.          }. 
2d5e0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2d5f0 20 20 20 20 20 20 20 20 2f 2a 20 64 6f 6e 27 74          /* don't
2d600 20 62 72 65 61 6b 20 74 68 65 20 6c 6f 63 6b 20   break the lock 
2d610 6f 6e 20 73 68 6f 72 74 20 72 65 61 64 20 6f 72  on short read or
2d620 20 61 20 76 65 72 73 69 6f 6e 20 6d 69 73 6d 61   a version misma
2d630 74 63 68 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  tch */.         
2d640 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
2d650 55 53 59 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  USY;.        }. 
2d660 20 20 20 20 20 20 20 75 73 6c 65 65 70 28 31 30         usleep(10
2d670 30 30 30 30 30 30 29 3b 20 2f 2a 20 77 61 69 74  000000); /* wait
2d680 20 31 30 20 73 65 63 20 61 6e 64 20 74 72 79 20   10 sec and try 
2d690 74 68 65 20 6c 6f 63 6b 20 61 67 61 69 6e 20 2a  the lock again *
2d6a0 2f 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e  /.        contin
2d6b0 75 65 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20  ue; .      }.   
2d6c0 20 20 20 0a 20 20 20 20 20 20 61 73 73 65 72 74     .      assert
2d6d0 28 20 6e 54 72 69 65 73 3d 3d 33 20 29 3b 0a 20  ( nTries==3 );. 
2d6e0 20 20 20 20 20 69 66 28 20 30 3d 3d 70 72 6f 78       if( 0==prox
2d6f0 79 42 72 65 61 6b 43 6f 6e 63 68 4c 6f 63 6b 28  yBreakConchLock(
2d700 70 46 69 6c 65 2c 20 6d 79 48 6f 73 74 49 44 29  pFile, myHostID)
2d710 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
2d720 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
2d730 20 20 20 20 69 66 28 20 6c 6f 63 6b 54 79 70 65      if( lockType
2d740 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
2d750 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
2d760 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d   = conchFile->pM
2d770 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28 73 71  ethod->xLock((sq
2d780 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63  lite3_file*)conc
2d790 68 46 69 6c 65 2c 20 53 48 41 52 45 44 5f 4c 4f  hFile, SHARED_LO
2d7a0 43 4b 29 3b 20 20 20 20 20 20 20 20 20 20 0a 20  CK);          . 
2d7b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2d7c0 20 69 66 28 20 21 72 63 20 29 7b 0a 20 20 20 20   if( !rc ){.    
2d7d0 20 20 20 20 20 20 72 63 20 3d 20 63 6f 6e 63 68        rc = conch
2d7e0 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78  File->pMethod->x
2d7f0 4c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69  Lock((sqlite3_fi
2d800 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 6c  le*)conchFile, l
2d810 6f 63 6b 54 79 70 65 29 3b 0a 20 20 20 20 20 20  ockType);.      
2d820 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
2d830 7d 0a 20 20 7d 20 77 68 69 6c 65 28 20 72 63 3d  }.  } while( rc=
2d840 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20  =SQLITE_BUSY && 
2d850 6e 54 72 69 65 73 3c 33 20 29 3b 0a 20 20 0a 20  nTries<3 );.  . 
2d860 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2d870 2a 20 54 61 6b 65 73 20 74 68 65 20 63 6f 6e 63  * Takes the conc
2d880 68 20 62 79 20 74 61 6b 69 6e 67 20 61 20 73 68  h by taking a sh
2d890 61 72 65 64 20 6c 6f 63 6b 20 61 6e 64 20 72 65  ared lock and re
2d8a0 61 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  ad the contents 
2d8b0 63 6f 6e 63 68 2c 20 69 66 20 0a 2a 2a 20 6c 6f  conch, if .** lo
2d8c0 63 6b 50 61 74 68 20 69 73 20 6e 6f 6e 2d 4e 55  ckPath is non-NU
2d8d0 4c 4c 2c 20 74 68 65 20 68 6f 73 74 20 49 44 20  LL, the host ID 
2d8e0 61 6e 64 20 6c 6f 63 6b 20 66 69 6c 65 20 70 61  and lock file pa
2d8f0 74 68 20 6d 75 73 74 20 6d 61 74 63 68 2e 20 20  th must match.  
2d900 41 20 4e 55 4c 4c 20 0a 2a 2a 20 6c 6f 63 6b 50  A NULL .** lockP
2d910 61 74 68 20 6d 65 61 6e 73 20 74 68 61 74 20 74  ath means that t
2d920 68 65 20 6c 6f 63 6b 50 61 74 68 20 69 6e 20 74  he lockPath in t
2d930 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 77 69  he conch file wi
2d940 6c 6c 20 62 65 20 75 73 65 64 20 69 66 20 74 68  ll be used if th
2d950 65 20 0a 2a 2a 20 68 6f 73 74 20 49 44 73 20 6d  e .** host IDs m
2d960 61 74 63 68 2c 20 6f 72 20 61 20 6e 65 77 20 6c  atch, or a new l
2d970 6f 63 6b 20 70 61 74 68 20 77 69 6c 6c 20 62 65  ock path will be
2d980 20 67 65 6e 65 72 61 74 65 64 20 61 75 74 6f 6d   generated autom
2d990 61 74 69 63 61 6c 6c 79 20 0a 2a 2a 20 61 6e 64  atically .** and
2d9a0 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
2d9b0 63 6f 6e 63 68 20 66 69 6c 65 2e 0a 2a 2f 0a 73  conch file..*/.s
2d9c0 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 54  tatic int proxyT
2d9d0 61 6b 65 43 6f 6e 63 68 28 75 6e 69 78 46 69 6c  akeConch(unixFil
2d9e0 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 70 72 6f  e *pFile){.  pro
2d9f0 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  xyLockingContext
2da00 20 2a 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c   *pCtx = (proxyL
2da10 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29  ockingContext *)
2da20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
2da30 6e 74 65 78 74 3b 20 0a 20 20 0a 20 20 69 66 28  ntext; .  .  if(
2da40 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64   pCtx->conchHeld
2da50 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  !=0 ){.    retur
2da60 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
2da70 65 6c 73 65 7b 0a 20 20 20 20 75 6e 69 78 46 69  else{.    unixFi
2da80 6c 65 20 2a 63 6f 6e 63 68 46 69 6c 65 20 3d 20  le *conchFile = 
2da90 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 3b  pCtx->conchFile;
2daa0 0a 20 20 20 20 75 75 69 64 5f 74 20 6d 79 48 6f  .    uuid_t myHo
2dab0 73 74 49 44 3b 0a 20 20 20 20 69 6e 74 20 70 45  stID;.    int pE
2dac0 72 72 6f 72 20 3d 20 30 3b 0a 20 20 20 20 63 68  rror = 0;.    ch
2dad0 61 72 20 72 65 61 64 42 75 66 5b 50 52 4f 58 59  ar readBuf[PROXY
2dae0 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 5d 3b 0a 20  _MAXCONCHLEN];. 
2daf0 20 20 20 63 68 61 72 20 6c 6f 63 6b 50 61 74 68     char lockPath
2db00 5b 4d 41 58 50 41 54 48 4c 45 4e 5d 3b 0a 20 20  [MAXPATHLEN];.  
2db10 20 20 63 68 61 72 20 2a 74 65 6d 70 4c 6f 63 6b    char *tempLock
2db20 50 61 74 68 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  Path = NULL;.   
2db30 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
2db40 5f 4f 4b 3b 0a 20 20 20 20 69 6e 74 20 63 72 65  _OK;.    int cre
2db50 61 74 65 43 6f 6e 63 68 20 3d 20 30 3b 0a 20 20  ateConch = 0;.  
2db60 20 20 69 6e 74 20 68 6f 73 74 49 64 4d 61 74 63    int hostIdMatc
2db70 68 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 72  h = 0;.    int r
2db80 65 61 64 4c 65 6e 20 3d 20 30 3b 0a 20 20 20 20  eadLen = 0;.    
2db90 69 6e 74 20 74 72 79 4f 6c 64 4c 6f 63 6b 50 61  int tryOldLockPa
2dba0 74 68 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  th = 0;.    int 
2dbb0 66 6f 72 63 65 4e 65 77 4c 6f 63 6b 50 61 74 68  forceNewLockPath
2dbc0 20 3d 20 30 3b 0a 20 20 20 20 0a 20 20 20 20 4f   = 0;.    .    O
2dbd0 53 54 52 41 43 45 28 28 22 54 41 4b 45 43 4f 4e  STRACE(("TAKECON
2dbe0 43 48 20 20 25 64 20 66 6f 72 20 25 73 20 70 69  CH  %d for %s pi
2dbf0 64 3d 25 64 5c 6e 22 2c 20 63 6f 6e 63 68 46 69  d=%d\n", conchFi
2dc00 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20  le->h,.         
2dc10 20 20 20 20 28 70 43 74 78 2d 3e 6c 6f 63 6b 50      (pCtx->lockP
2dc20 72 6f 78 79 50 61 74 68 20 3f 20 70 43 74 78 2d  roxyPath ? pCtx-
2dc30 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 3a  >lockProxyPath :
2dc40 20 22 3a 61 75 74 6f 3a 22 29 2c 20 67 65 74 70   ":auto:"), getp
2dc50 69 64 28 29 29 29 3b 0a 0a 20 20 20 20 72 63 20  id()));..    rc 
2dc60 3d 20 70 72 6f 78 79 47 65 74 48 6f 73 74 49 44  = proxyGetHostID
2dc70 28 6d 79 48 6f 73 74 49 44 2c 20 26 70 45 72 72  (myHostID, &pErr
2dc80 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 28 72 63  or);.    if( (rc
2dc90 26 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 49  &0xff)==SQLITE_I
2dca0 4f 45 52 52 20 29 7b 0a 20 20 20 20 20 20 70 46  OERR ){.      pF
2dcb0 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
2dcc0 20 70 45 72 72 6f 72 3b 0a 20 20 20 20 20 20 67   pError;.      g
2dcd0 6f 74 6f 20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63  oto end_takeconc
2dce0 68 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  h;.    }.    rc 
2dcf0 3d 20 70 72 6f 78 79 43 6f 6e 63 68 4c 6f 63 6b  = proxyConchLock
2dd00 28 70 46 69 6c 65 2c 20 6d 79 48 6f 73 74 49 44  (pFile, myHostID
2dd10 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a  , SHARED_LOCK);.
2dd20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2dd30 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67  TE_OK ){.      g
2dd40 6f 74 6f 20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63  oto end_takeconc
2dd50 68 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20  h;.    }.    /* 
2dd60 72 65 61 64 20 74 68 65 20 65 78 69 73 74 69 6e  read the existin
2dd70 67 20 63 6f 6e 63 68 20 66 69 6c 65 20 2a 2f 0a  g conch file */.
2dd80 20 20 20 20 72 65 61 64 4c 65 6e 20 3d 20 73 65      readLen = se
2dd90 65 6b 41 6e 64 52 65 61 64 28 28 75 6e 69 78 46  ekAndRead((unixF
2dda0 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20  ile*)conchFile, 
2ddb0 30 2c 20 72 65 61 64 42 75 66 2c 20 50 52 4f 58  0, readBuf, PROX
2ddc0 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 29 3b 0a  Y_MAXCONCHLEN);.
2ddd0 20 20 20 20 69 66 28 20 72 65 61 64 4c 65 6e 3c      if( readLen<
2dde0 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 2f  0 ){.      /* I/
2ddf0 4f 20 65 72 72 6f 72 3a 20 6c 61 73 74 45 72 72  O error: lastErr
2de00 6e 6f 20 73 65 74 20 62 79 20 73 65 65 6b 41 6e  no set by seekAn
2de10 64 52 65 61 64 20 2a 2f 0a 20 20 20 20 20 20 70  dRead */.      p
2de20 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
2de30 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 6c 61 73  = conchFile->las
2de40 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63  tErrno;.      rc
2de50 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
2de60 52 45 41 44 3b 0a 20 20 20 20 20 20 67 6f 74 6f  READ;.      goto
2de70 20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63 68 3b 0a   end_takeconch;.
2de80 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 65      }else if( re
2de90 61 64 4c 65 6e 3c 3d 28 50 52 4f 58 59 5f 48 45  adLen<=(PROXY_HE
2dea0 41 44 45 52 4c 45 4e 2b 50 52 4f 58 59 5f 48 4f  ADERLEN+PROXY_HO
2deb0 53 54 49 44 4c 45 4e 29 20 7c 7c 20 0a 20 20 20  STIDLEN) || .   
2dec0 20 20 20 20 20 20 20 20 20 20 72 65 61 64 42 75            readBu
2ded0 66 5b 30 5d 21 3d 28 63 68 61 72 29 50 52 4f 58  f[0]!=(char)PROX
2dee0 59 5f 43 4f 4e 43 48 56 45 52 53 49 4f 4e 20 29  Y_CONCHVERSION )
2def0 7b 0a 20 20 20 20 20 20 2f 2a 20 61 20 73 68 6f  {.      /* a sho
2df00 72 74 20 72 65 61 64 20 6f 72 20 76 65 72 73 69  rt read or versi
2df10 6f 6e 20 66 6f 72 6d 61 74 20 6d 69 73 6d 61 74  on format mismat
2df20 63 68 20 6d 65 61 6e 73 20 77 65 20 6e 65 65 64  ch means we need
2df30 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77   to create a new
2df40 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 63 68   .      ** conch
2df50 20 66 69 6c 65 2e 20 0a 20 20 20 20 20 20 2a 2f   file. .      */
2df60 0a 20 20 20 20 20 20 63 72 65 61 74 65 43 6f 6e  .      createCon
2df70 63 68 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ch = 1;.    }.  
2df80 20 20 2f 2a 20 69 66 20 74 68 65 20 68 6f 73 74    /* if the host
2df90 20 69 64 20 6d 61 74 63 68 65 73 20 61 6e 64 20   id matches and 
2dfa0 74 68 65 20 6c 6f 63 6b 20 70 61 74 68 20 61 6c  the lock path al
2dfb0 72 65 61 64 79 20 65 78 69 73 74 73 20 69 6e 20  ready exists in 
2dfc0 74 68 65 20 63 6f 6e 63 68 0a 20 20 20 20 2a 2a  the conch.    **
2dfd0 20 77 65 27 6c 6c 20 74 72 79 20 74 6f 20 75 73   we'll try to us
2dfe0 65 20 74 68 65 20 70 61 74 68 20 74 68 65 72 65  e the path there
2dff0 2c 20 69 66 20 77 65 20 63 61 6e 27 74 20 6f 70  , if we can't op
2e000 65 6e 20 74 68 61 74 20 70 61 74 68 2c 20 77 65  en that path, we
2e010 27 6c 6c 20 0a 20 20 20 20 2a 2a 20 72 65 74 72  'll .    ** retr
2e020 79 20 77 69 74 68 20 61 20 6e 65 77 20 61 75 74  y with a new aut
2e030 6f 2d 67 65 6e 65 72 61 74 65 64 20 70 61 74 68  o-generated path
2e040 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 6f 20   .    */.    do 
2e050 7b 20 2f 2a 20 69 6e 20 63 61 73 65 20 77 65 20  { /* in case we 
2e060 6e 65 65 64 20 74 6f 20 74 72 79 20 61 67 61 69  need to try agai
2e070 6e 20 66 6f 72 20 61 6e 20 3a 61 75 74 6f 3a 20  n for an :auto: 
2e080 6e 61 6d 65 64 20 6c 6f 63 6b 20 66 69 6c 65 20  named lock file 
2e090 2a 2f 0a 0a 20 20 20 20 20 20 69 66 28 20 21 63  */..      if( !c
2e0a0 72 65 61 74 65 43 6f 6e 63 68 20 26 26 20 21 66  reateConch && !f
2e0b0 6f 72 63 65 4e 65 77 4c 6f 63 6b 50 61 74 68 20  orceNewLockPath 
2e0c0 29 7b 0a 20 20 20 20 20 20 20 20 68 6f 73 74 49  ){.        hostI
2e0d0 64 4d 61 74 63 68 20 3d 20 21 6d 65 6d 63 6d 70  dMatch = !memcmp
2e0e0 28 26 72 65 61 64 42 75 66 5b 50 52 4f 58 59 5f  (&readBuf[PROXY_
2e0f0 48 45 41 44 45 52 4c 45 4e 5d 2c 20 6d 79 48 6f  HEADERLEN], myHo
2e100 73 74 49 44 2c 20 0a 20 20 20 20 20 20 20 20 20  stID, .         
2e110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e120 20 20 20 20 20 20 20 20 20 50 52 4f 58 59 5f 48           PROXY_H
2e130 4f 53 54 49 44 4c 45 4e 29 3b 0a 20 20 20 20 20  OSTIDLEN);.     
2e140 20 20 20 2f 2a 20 69 66 20 74 68 65 20 63 6f 6e     /* if the con
2e150 63 68 20 68 61 73 20 64 61 74 61 20 63 6f 6d 70  ch has data comp
2e160 61 72 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  are the contents
2e170 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
2e180 21 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79  !pCtx->lockProxy
2e190 50 61 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20  Path ){.        
2e1a0 20 20 2f 2a 20 66 6f 72 20 61 75 74 6f 2d 6e 61    /* for auto-na
2e1b0 6d 65 64 20 6c 6f 63 61 6c 20 6c 6f 63 6b 20 66  med local lock f
2e1c0 69 6c 65 2c 20 6a 75 73 74 20 63 68 65 63 6b 20  ile, just check 
2e1d0 74 68 65 20 68 6f 73 74 20 49 44 20 61 6e 64 20  the host ID and 
2e1e0 77 65 27 6c 6c 0a 20 20 20 20 20 20 20 20 20 20  we'll.          
2e1f0 20 2a 2a 20 75 73 65 20 74 68 65 20 6c 6f 63 61   ** use the loca
2e200 6c 20 6c 6f 63 6b 20 66 69 6c 65 20 70 61 74 68  l lock file path
2e210 20 74 68 61 74 27 73 20 61 6c 72 65 61 64 79 20   that's already 
2e220 69 6e 20 74 68 65 72 65 0a 20 20 20 20 20 20 20  in there.       
2e230 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
2e240 20 69 66 28 20 68 6f 73 74 49 64 4d 61 74 63 68   if( hostIdMatch
2e250 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2e260 73 69 7a 65 5f 74 20 70 61 74 68 4c 65 6e 20 3d  size_t pathLen =
2e270 20 28 72 65 61 64 4c 65 6e 20 2d 20 50 52 4f 58   (readLen - PROX
2e280 59 5f 50 41 54 48 49 4e 44 45 58 29 3b 0a 20 20  Y_PATHINDEX);.  
2e290 20 20 20 20 20 20 20 20 20 20 0a 20 20 20 20 20            .     
2e2a0 20 20 20 20 20 20 20 69 66 28 20 70 61 74 68 4c         if( pathL
2e2b0 65 6e 3e 3d 4d 41 58 50 41 54 48 4c 45 4e 20 29  en>=MAXPATHLEN )
2e2c0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2e2d0 70 61 74 68 4c 65 6e 3d 4d 41 58 50 41 54 48 4c  pathLen=MAXPATHL
2e2e0 45 4e 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20  EN-1;.          
2e2f0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
2e300 6d 65 6d 63 70 79 28 6c 6f 63 6b 50 61 74 68 2c  memcpy(lockPath,
2e310 20 26 72 65 61 64 42 75 66 5b 50 52 4f 58 59 5f   &readBuf[PROXY_
2e320 50 41 54 48 49 4e 44 45 58 5d 2c 20 70 61 74 68  PATHINDEX], path
2e330 4c 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Len);.          
2e340 20 20 6c 6f 63 6b 50 61 74 68 5b 70 61 74 68 4c    lockPath[pathL
2e350 65 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  en] = 0;.       
2e360 20 20 20 20 20 74 65 6d 70 4c 6f 63 6b 50 61 74       tempLockPat
2e370 68 20 3d 20 6c 6f 63 6b 50 61 74 68 3b 0a 20 20  h = lockPath;.  
2e380 20 20 20 20 20 20 20 20 20 20 74 72 79 4f 6c 64            tryOld
2e390 4c 6f 63 6b 50 61 74 68 20 3d 20 31 3b 0a 20 20  LockPath = 1;.  
2e3a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 63 72 65            /* cre
2e3b0 61 74 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68  ate a copy of th
2e3c0 65 20 6c 6f 63 6b 20 70 61 74 68 20 69 66 20 74  e lock path if t
2e3d0 68 65 20 63 6f 6e 63 68 20 69 73 20 74 61 6b 65  he conch is take
2e3e0 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  n */.           
2e3f0 20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b 65 63 6f   goto end_takeco
2e400 6e 63 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  nch;.          }
2e410 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
2e420 66 28 20 68 6f 73 74 49 64 4d 61 74 63 68 0a 20  f( hostIdMatch. 
2e430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26                &&
2e440 20 21 73 74 72 6e 63 6d 70 28 70 43 74 78 2d 3e   !strncmp(pCtx->
2e450 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 2c 20 26  lockProxyPath, &
2e460 72 65 61 64 42 75 66 5b 50 52 4f 58 59 5f 50 41  readBuf[PROXY_PA
2e470 54 48 49 4e 44 45 58 5d 2c 0a 20 20 20 20 20 20  THINDEX],.      
2e480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e490 20 20 20 20 20 72 65 61 64 4c 65 6e 2d 50 52 4f       readLen-PRO
2e4a0 58 59 5f 50 41 54 48 49 4e 44 45 58 29 0a 20 20  XY_PATHINDEX).  
2e4b0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
2e4c0 20 20 20 2f 2a 20 63 6f 6e 63 68 20 68 6f 73 74     /* conch host
2e4d0 20 61 6e 64 20 6c 6f 63 6b 20 70 61 74 68 20 6d   and lock path m
2e4e0 61 74 63 68 20 2a 2f 0a 20 20 20 20 20 20 20 20  atch */.        
2e4f0 20 20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b 65 63    goto end_takec
2e500 6f 6e 63 68 3b 20 0a 20 20 20 20 20 20 20 20 7d  onch; .        }
2e510 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 0a  .      }.      .
2e520 20 20 20 20 20 20 2f 2a 20 69 66 20 74 68 65 20        /* if the 
2e530 63 6f 6e 63 68 20 69 73 6e 27 74 20 77 72 69 74  conch isn't writ
2e540 61 62 6c 65 20 61 6e 64 20 64 6f 65 73 6e 27 74  able and doesn't
2e550 20 6d 61 74 63 68 2c 20 77 65 20 63 61 6e 27 74   match, we can't
2e560 20 74 61 6b 65 20 69 74 20 2a 2f 0a 20 20 20 20   take it */.    
2e570 20 20 69 66 28 20 28 63 6f 6e 63 68 46 69 6c 65    if( (conchFile
2e580 2d 3e 6f 70 65 6e 46 6c 61 67 73 26 4f 5f 52 44  ->openFlags&O_RD
2e590 57 52 29 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20  WR) == 0 ){.    
2e5a0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2e5b0 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 67 6f  BUSY;.        go
2e5c0 74 6f 20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63 68  to end_takeconch
2e5d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2e5e0 0a 20 20 20 20 20 20 2f 2a 20 65 69 74 68 65 72  .      /* either
2e5f0 20 74 68 65 20 63 6f 6e 63 68 20 64 69 64 6e 27   the conch didn'
2e600 74 20 6d 61 74 63 68 20 6f 72 20 77 65 20 6e 65  t match or we ne
2e610 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e  ed to create a n
2e620 65 77 20 6f 6e 65 20 2a 2f 0a 20 20 20 20 20 20  ew one */.      
2e630 69 66 28 20 21 70 43 74 78 2d 3e 6c 6f 63 6b 50  if( !pCtx->lockP
2e640 72 6f 78 79 50 61 74 68 20 29 7b 0a 20 20 20 20  roxyPath ){.    
2e650 20 20 20 20 70 72 6f 78 79 47 65 74 4c 6f 63 6b      proxyGetLock
2e660 50 61 74 68 28 70 43 74 78 2d 3e 64 62 50 61 74  Path(pCtx->dbPat
2e670 68 2c 20 6c 6f 63 6b 50 61 74 68 2c 20 4d 41 58  h, lockPath, MAX
2e680 50 41 54 48 4c 45 4e 29 3b 0a 20 20 20 20 20 20  PATHLEN);.      
2e690 20 20 74 65 6d 70 4c 6f 63 6b 50 61 74 68 20 3d    tempLockPath =
2e6a0 20 6c 6f 63 6b 50 61 74 68 3b 0a 20 20 20 20 20   lockPath;.     
2e6b0 20 20 20 2f 2a 20 63 72 65 61 74 65 20 61 20 63     /* create a c
2e6c0 6f 70 79 20 6f 66 20 74 68 65 20 6c 6f 63 6b 20  opy of the lock 
2e6d0 70 61 74 68 20 5f 6f 6e 6c 79 5f 20 69 66 20 74  path _only_ if t
2e6e0 68 65 20 63 6f 6e 63 68 20 69 73 20 74 61 6b 65  he conch is take
2e6f0 6e 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20  n */.      }.   
2e700 20 20 20 0a 20 20 20 20 20 20 2f 2a 20 75 70 64     .      /* upd
2e710 61 74 65 20 63 6f 6e 63 68 20 77 69 74 68 20 68  ate conch with h
2e720 6f 73 74 20 61 6e 64 20 70 61 74 68 20 28 74 68  ost and path (th
2e730 69 73 20 77 69 6c 6c 20 66 61 69 6c 20 69 66 20  is will fail if 
2e740 6f 74 68 65 72 20 70 72 6f 63 65 73 73 0a 20 20  other process.  
2e750 20 20 20 20 2a 2a 20 68 61 73 20 61 20 73 68 61      ** has a sha
2e760 72 65 64 20 6c 6f 63 6b 20 61 6c 72 65 61 64 79  red lock already
2e770 29 2c 20 69 66 20 74 68 65 20 68 6f 73 74 20 69  ), if the host i
2e780 64 20 6d 61 74 63 68 65 73 2c 20 75 73 65 20 74  d matches, use t
2e790 68 65 20 62 69 67 0a 20 20 20 20 20 20 2a 2a 20  he big.      ** 
2e7a0 73 74 69 63 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a  stick..      */.
2e7b0 20 20 20 20 20 20 66 75 74 69 6d 65 73 28 63 6f        futimes(co
2e7c0 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 4e 55 4c 4c  nchFile->h, NULL
2e7d0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 68 6f 73  );.      if( hos
2e7e0 74 49 64 4d 61 74 63 68 20 26 26 20 21 63 72 65  tIdMatch && !cre
2e7f0 61 74 65 43 6f 6e 63 68 20 29 7b 0a 20 20 20 20  ateConch ){.    
2e800 20 20 20 20 69 66 28 20 63 6f 6e 63 68 46 69 6c      if( conchFil
2e810 65 2d 3e 70 49 6e 6f 64 65 20 26 26 20 63 6f 6e  e->pInode && con
2e820 63 68 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e  chFile->pInode->
2e830 6e 53 68 61 72 65 64 3e 31 20 29 7b 0a 20 20 20  nShared>1 ){.   
2e840 20 20 20 20 20 20 20 2f 2a 20 57 65 20 61 72 65         /* We are
2e850 20 74 72 79 69 6e 67 20 66 6f 72 20 61 6e 20 65   trying for an e
2e860 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 62 75  xclusive lock bu
2e870 74 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64  t another thread
2e880 20 69 6e 20 74 68 69 73 0a 20 20 20 20 20 20 20   in this.       
2e890 20 20 20 20 2a 2a 20 73 61 6d 65 20 70 72 6f 63      ** same proc
2e8a0 65 73 73 20 69 73 20 73 74 69 6c 6c 20 68 6f 6c  ess is still hol
2e8b0 64 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c 6f  ding a shared lo
2e8c0 63 6b 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ck. */.         
2e8d0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
2e8e0 59 3b 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73  Y;.        } els
2e8f0 65 20 7b 20 20 20 20 20 20 20 20 20 20 0a 20 20  e {          .  
2e900 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 72 6f          rc = pro
2e910 78 79 43 6f 6e 63 68 4c 6f 63 6b 28 70 46 69 6c  xyConchLock(pFil
2e920 65 2c 20 6d 79 48 6f 73 74 49 44 2c 20 45 58 43  e, myHostID, EXC
2e930 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20  LUSIVE_LOCK);.  
2e940 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
2e950 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20  lse{.        rc 
2e960 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65  = conchFile->pMe
2e970 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28 73 71 6c  thod->xLock((sql
2e980 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68  ite3_file*)conch
2e990 46 69 6c 65 2c 20 45 58 43 4c 55 53 49 56 45 5f  File, EXCLUSIVE_
2e9a0 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20  LOCK);.      }. 
2e9b0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
2e9c0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2e9d0 20 20 63 68 61 72 20 77 72 69 74 65 42 75 66 66    char writeBuff
2e9e0 65 72 5b 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43  er[PROXY_MAXCONC
2e9f0 48 4c 45 4e 5d 3b 0a 20 20 20 20 20 20 20 20 69  HLEN];.        i
2ea00 6e 74 20 77 72 69 74 65 53 69 7a 65 20 3d 20 30  nt writeSize = 0
2ea10 3b 0a 20 20 20 20 20 20 20 20 0a 20 20 20 20 20  ;.        .     
2ea20 20 20 20 77 72 69 74 65 42 75 66 66 65 72 5b 30     writeBuffer[0
2ea30 5d 20 3d 20 28 63 68 61 72 29 50 52 4f 58 59 5f  ] = (char)PROXY_
2ea40 43 4f 4e 43 48 56 45 52 53 49 4f 4e 3b 0a 20 20  CONCHVERSION;.  
2ea50 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 77 72        memcpy(&wr
2ea60 69 74 65 42 75 66 66 65 72 5b 50 52 4f 58 59 5f  iteBuffer[PROXY_
2ea70 48 45 41 44 45 52 4c 45 4e 5d 2c 20 6d 79 48 6f  HEADERLEN], myHo
2ea80 73 74 49 44 2c 20 50 52 4f 58 59 5f 48 4f 53 54  stID, PROXY_HOST
2ea90 49 44 4c 45 4e 29 3b 0a 20 20 20 20 20 20 20 20  IDLEN);.        
2eaa0 69 66 28 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72  if( pCtx->lockPr
2eab0 6f 78 79 50 61 74 68 21 3d 4e 55 4c 4c 20 29 7b  oxyPath!=NULL ){
2eac0 0a 20 20 20 20 20 20 20 20 20 20 73 74 72 6c 63  .          strlc
2ead0 70 79 28 26 77 72 69 74 65 42 75 66 66 65 72 5b  py(&writeBuffer[
2eae0 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 5d  PROXY_PATHINDEX]
2eaf0 2c 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78  , pCtx->lockProx
2eb00 79 50 61 74 68 2c 20 4d 41 58 50 41 54 48 4c 45  yPath, MAXPATHLE
2eb10 4e 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  N);.        }els
2eb20 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 72  e{.          str
2eb30 6c 63 70 79 28 26 77 72 69 74 65 42 75 66 66 65  lcpy(&writeBuffe
2eb40 72 5b 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45  r[PROXY_PATHINDE
2eb50 58 5d 2c 20 74 65 6d 70 4c 6f 63 6b 50 61 74 68  X], tempLockPath
2eb60 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a 20  , MAXPATHLEN);. 
2eb70 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2eb80 20 77 72 69 74 65 53 69 7a 65 20 3d 20 50 52 4f   writeSize = PRO
2eb90 58 59 5f 50 41 54 48 49 4e 44 45 58 20 2b 20 73  XY_PATHINDEX + s
2eba0 74 72 6c 65 6e 28 26 77 72 69 74 65 42 75 66 66  trlen(&writeBuff
2ebb0 65 72 5b 50 52 4f 58 59 5f 50 41 54 48 49 4e 44  er[PROXY_PATHIND
2ebc0 45 58 5d 29 3b 0a 20 20 20 20 20 20 20 20 66 74  EX]);.        ft
2ebd0 72 75 6e 63 61 74 65 28 63 6f 6e 63 68 46 69 6c  runcate(conchFil
2ebe0 65 2d 3e 68 2c 20 77 72 69 74 65 53 69 7a 65 29  e->h, writeSize)
2ebf0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 75  ;.        rc = u
2ec00 6e 69 78 57 72 69 74 65 28 28 73 71 6c 69 74 65  nixWrite((sqlite
2ec10 33 5f 66 69 6c 65 20 2a 29 63 6f 6e 63 68 46 69  3_file *)conchFi
2ec20 6c 65 2c 20 77 72 69 74 65 42 75 66 66 65 72 2c  le, writeBuffer,
2ec30 20 77 72 69 74 65 53 69 7a 65 2c 20 30 29 3b 0a   writeSize, 0);.
2ec40 20 20 20 20 20 20 20 20 66 73 79 6e 63 28 63 6f          fsync(co
2ec50 6e 63 68 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 20  nchFile->h);.   
2ec60 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20 63 72       /* If we cr
2ec70 65 61 74 65 64 20 61 20 6e 65 77 20 63 6f 6e 63  eated a new conc
2ec80 68 20 66 69 6c 65 20 28 6e 6f 74 20 6a 75 73 74  h file (not just
2ec90 20 75 70 64 61 74 65 64 20 74 68 65 20 63 6f 6e   updated the con
2eca0 74 65 6e 74 73 20 6f 66 20 61 20 0a 20 20 20 20  tents of a .    
2ecb0 20 20 20 20 20 2a 2a 20 76 61 6c 69 64 20 63 6f       ** valid co
2ecc0 6e 63 68 20 66 69 6c 65 29 2c 20 74 72 79 20 74  nch file), try t
2ecd0 6f 20 6d 61 74 63 68 20 74 68 65 20 70 65 72 6d  o match the perm
2ece0 69 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 64  issions of the d
2ecf0 61 74 61 62 61 73 65 20 0a 20 20 20 20 20 20 20  atabase .       
2ed00 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
2ed10 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
2ed20 26 20 63 72 65 61 74 65 43 6f 6e 63 68 20 29 7b  & createConch ){
2ed30 0a 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63  .          struc
2ed40 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20 20 20  t stat buf;.    
2ed50 20 20 20 20 20 20 69 6e 74 20 65 72 72 20 3d 20        int err = 
2ed60 66 73 74 61 74 28 70 46 69 6c 65 2d 3e 68 2c 20  fstat(pFile->h, 
2ed70 26 62 75 66 29 3b 0a 20 20 20 20 20 20 20 20 20  &buf);.         
2ed80 20 69 66 28 20 65 72 72 3d 3d 30 20 29 7b 0a 20   if( err==0 ){. 
2ed90 20 20 20 20 20 20 20 20 20 20 20 6d 6f 64 65 5f             mode_
2eda0 74 20 63 6d 6f 64 65 20 3d 20 62 75 66 2e 73 74  t cmode = buf.st
2edb0 5f 6d 6f 64 65 26 28 53 5f 49 52 55 53 52 7c 53  _mode&(S_IRUSR|S
2edc0 5f 49 57 55 53 52 20 7c 20 53 5f 49 52 47 52 50  _IWUSR | S_IRGRP
2edd0 7c 53 5f 49 57 47 52 50 20 7c 0a 20 20 20 20 20  |S_IWGRP |.     
2ede0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2edf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ee00 20 20 20 53 5f 49 52 4f 54 48 7c 53 5f 49 57 4f     S_IROTH|S_IWO
2ee10 54 48 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  TH);.           
2ee20 20 2f 2a 20 74 72 79 20 74 6f 20 6d 61 74 63 68   /* try to match
2ee30 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2ee40 6c 65 20 52 2f 57 20 70 65 72 6d 69 73 73 69 6f  le R/W permissio
2ee50 6e 73 2c 20 69 67 6e 6f 72 65 20 66 61 69 6c 75  ns, ignore failu
2ee60 72 65 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  re */.#ifndef SQ
2ee70 4c 49 54 45 5f 50 52 4f 58 59 5f 44 45 42 55 47  LITE_PROXY_DEBUG
2ee80 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 63 68  .            fch
2ee90 6d 6f 64 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68  mod(conchFile->h
2eea0 2c 20 63 6d 6f 64 65 29 3b 0a 23 65 6c 73 65 0a  , cmode);.#else.
2eeb0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2eec0 66 63 68 6d 6f 64 28 63 6f 6e 63 68 46 69 6c 65  fchmod(conchFile
2eed0 2d 3e 68 2c 20 63 6d 6f 64 65 29 21 3d 30 20 29  ->h, cmode)!=0 )
2eee0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2eef0 69 6e 74 20 63 6f 64 65 20 3d 20 65 72 72 6e 6f  int code = errno
2ef00 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2ef10 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  fprintf(stderr, 
2ef20 22 66 63 68 6d 6f 64 20 25 6f 20 46 41 49 4c 45  "fchmod %o FAILE
2ef30 44 20 77 69 74 68 20 25 64 20 25 73 5c 6e 22 2c  D with %d %s\n",
2ef40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2ef50 20 20 20 20 20 20 20 63 6d 6f 64 65 2c 20 63 6f         cmode, co
2ef60 64 65 2c 20 73 74 72 65 72 72 6f 72 28 63 6f 64  de, strerror(cod
2ef70 65 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  e));.           
2ef80 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
2ef90 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
2efa0 73 74 64 65 72 72 2c 20 22 66 63 68 6d 6f 64 20  stderr, "fchmod 
2efb0 25 6f 20 53 55 43 43 45 44 45 44 5c 6e 22 2c 63  %o SUCCEDED\n",c
2efc0 6d 6f 64 65 29 3b 0a 20 20 20 20 20 20 20 20 20  mode);.         
2efd0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
2efe0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
2eff0 20 20 69 6e 74 20 63 6f 64 65 20 3d 20 65 72 72    int code = err
2f000 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  no;.            
2f010 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  fprintf(stderr, 
2f020 22 53 54 41 54 20 46 41 49 4c 45 44 5b 25 64 5d  "STAT FAILED[%d]
2f030 20 77 69 74 68 20 25 64 20 25 73 5c 6e 22 2c 20   with %d %s\n", 
2f040 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2f050 20 20 20 20 20 65 72 72 2c 20 63 6f 64 65 2c 20       err, code, 
2f060 73 74 72 65 72 72 6f 72 28 63 6f 64 65 29 29 3b  strerror(code));
2f070 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
2f080 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
2f090 20 20 20 20 7d 0a 20 20 20 20 20 20 63 6f 6e 63      }.      conc
2f0a0 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e  hFile->pMethod->
2f0b0 78 55 6e 6c 6f 63 6b 28 28 73 71 6c 69 74 65 33  xUnlock((sqlite3
2f0c0 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65  _file*)conchFile
2f0d0 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a  , SHARED_LOCK);.
2f0e0 20 20 20 20 20 20 0a 20 20 20 20 65 6e 64 5f 74        .    end_t
2f0f0 61 6b 65 63 6f 6e 63 68 3a 0a 20 20 20 20 20 20  akeconch:.      
2f100 4f 53 54 52 41 43 45 28 28 22 54 52 41 4e 53 50  OSTRACE(("TRANSP
2f110 52 4f 58 59 3a 20 43 4c 4f 53 45 20 20 25 64 5c  ROXY: CLOSE  %d\
2f120 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a  n", pFile->h));.
2f130 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
2f140 4c 49 54 45 5f 4f 4b 20 26 26 20 70 46 69 6c 65  LITE_OK && pFile
2f150 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 29 7b 0a 20  ->openFlags ){. 
2f160 20 20 20 20 20 20 20 69 66 28 20 70 46 69 6c 65         if( pFile
2f170 2d 3e 68 3e 3d 30 20 29 7b 0a 23 69 66 64 65 66  ->h>=0 ){.#ifdef
2f180 20 53 54 52 49 43 54 5f 43 4c 4f 53 45 5f 45 52   STRICT_CLOSE_ER
2f190 52 4f 52 0a 20 20 20 20 20 20 20 20 20 20 69 66  ROR.          if
2f1a0 28 20 63 6c 6f 73 65 28 70 46 69 6c 65 2d 3e 68  ( close(pFile->h
2f1b0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
2f1c0 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
2f1d0 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
2f1e0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
2f1f0 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53 45  LITE_IOERR_CLOSE
2f200 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65  ;.          }.#e
2f210 6c 73 65 0a 20 20 20 20 20 20 20 20 20 20 63 6c  lse.          cl
2f220 6f 73 65 28 70 46 69 6c 65 2d 3e 68 29 3b 20 2f  ose(pFile->h); /
2f230 2a 20 73 69 6c 65 6e 74 6c 79 20 6c 65 61 6b 20  * silently leak 
2f240 66 64 20 69 66 20 66 61 69 6c 20 2a 2f 0a 23 65  fd if fail */.#e
2f250 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7d 0a 20  ndif.        }. 
2f260 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 20         pFile->h 
2f270 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 69 6e  = -1;.        in
2f280 74 20 66 64 20 3d 20 6f 70 65 6e 28 70 43 74 78  t fd = open(pCtx
2f290 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2d  ->dbPath, pFile-
2f2a0 3e 6f 70 65 6e 46 6c 61 67 73 2c 0a 20 20 20 20  >openFlags,.    
2f2b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f2c0 20 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54    SQLITE_DEFAULT
2f2d0 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e  _FILE_PERMISSION
2f2e0 53 29 3b 0a 20 20 20 20 20 20 20 20 4f 53 54 52  S);.        OSTR
2f2f0 41 43 45 28 28 22 54 52 41 4e 53 50 52 4f 58 59  ACE(("TRANSPROXY
2f300 3a 20 4f 50 45 4e 20 20 25 64 5c 6e 22 2c 20 66  : OPEN  %d\n", f
2f310 64 29 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  d));.        if(
2f320 20 66 64 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20   fd>=0 ){.      
2f330 20 20 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 66      pFile->h = f
2f340 64 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  d;.        }else
2f350 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 3d 53  {.          rc=S
2f360 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42  QLITE_CANTOPEN_B
2f370 4b 50 54 3b 20 2f 2a 20 53 51 4c 49 54 45 5f 42  KPT; /* SQLITE_B
2f380 55 53 59 3f 20 70 72 6f 78 79 54 61 6b 65 43 6f  USY? proxyTakeCo
2f390 6e 63 68 20 63 61 6c 6c 65 64 0a 20 20 20 20 20  nch called.     
2f3a0 20 20 20 20 20 20 64 75 72 69 6e 67 20 6c 6f 63        during loc
2f3b0 6b 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 20 20  king */.        
2f3c0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
2f3d0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2f3e0 4b 20 26 26 20 21 70 43 74 78 2d 3e 6c 6f 63 6b  K && !pCtx->lock
2f3f0 50 72 6f 78 79 20 29 7b 0a 20 20 20 20 20 20 20  Proxy ){.       
2f400 20 63 68 61 72 20 2a 70 61 74 68 20 3d 20 74 65   char *path = te
2f410 6d 70 4c 6f 63 6b 50 61 74 68 20 3f 20 74 65 6d  mpLockPath ? tem
2f420 70 4c 6f 63 6b 50 61 74 68 20 3a 20 70 43 74 78  pLockPath : pCtx
2f430 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 3b  ->lockProxyPath;
2f440 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 72  .        rc = pr
2f450 6f 78 79 43 72 65 61 74 65 55 6e 69 78 46 69 6c  oxyCreateUnixFil
2f460 65 28 70 61 74 68 2c 20 26 70 43 74 78 2d 3e 6c  e(path, &pCtx->l
2f470 6f 63 6b 50 72 6f 78 79 2c 20 31 29 3b 0a 20 20  ockProxy, 1);.  
2f480 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
2f490 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53  LITE_OK && rc!=S
2f4a0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 26 26 20 74  QLITE_NOMEM && t
2f4b0 72 79 4f 6c 64 4c 6f 63 6b 50 61 74 68 20 29 7b  ryOldLockPath ){
2f4c0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 77 65  .          /* we
2f4d0 20 63 6f 75 6c 64 6e 27 74 20 63 72 65 61 74 65   couldn't create
2f4e0 20 74 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b 20   the proxy lock 
2f4f0 66 69 6c 65 20 77 69 74 68 20 74 68 65 20 6f 6c  file with the ol
2f500 64 20 6c 6f 63 6b 20 66 69 6c 65 20 70 61 74 68  d lock file path
2f510 0a 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73  .           ** s
2f520 6f 20 74 72 79 20 61 67 61 69 6e 20 76 69 61 20  o try again via 
2f530 61 75 74 6f 2d 6e 61 6d 69 6e 67 20 0a 20 20 20  auto-naming .   
2f540 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
2f550 20 20 20 20 20 66 6f 72 63 65 4e 65 77 4c 6f 63       forceNewLoc
2f560 6b 50 61 74 68 20 3d 20 31 3b 0a 20 20 20 20 20  kPath = 1;.     
2f570 20 20 20 20 20 74 72 79 4f 6c 64 4c 6f 63 6b 50       tryOldLockP
2f580 61 74 68 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ath = 0;.       
2f590 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 2f 2a 20     continue; /* 
2f5a0 67 6f 20 62 61 63 6b 20 74 6f 20 74 68 65 20 64  go back to the d
2f5b0 6f 20 7b 7d 20 77 68 69 6c 65 20 73 74 61 72 74  o {} while start
2f5c0 20 70 6f 69 6e 74 2c 20 74 72 79 20 61 67 61 69   point, try agai
2f5d0 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20  n */.        }. 
2f5e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
2f5f0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2f600 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 65  {.        /* Nee
2f610 64 20 74 6f 20 6d 61 6b 65 20 61 20 63 6f 70 79  d to make a copy
2f620 20 6f 66 20 70 61 74 68 20 69 66 20 77 65 20 65   of path if we e
2f630 78 74 72 61 63 74 65 64 20 74 68 65 20 76 61 6c  xtracted the val
2f640 75 65 0a 20 20 20 20 20 20 20 20 20 2a 2a 20 66  ue.         ** f
2f650 72 6f 6d 20 74 68 65 20 63 6f 6e 63 68 20 66 69  rom the conch fi
2f660 6c 65 20 6f 72 20 74 68 65 20 70 61 74 68 20 77  le or the path w
2f670 61 73 20 61 6c 6c 6f 63 61 74 65 64 20 6f 6e 20  as allocated on 
2f680 74 68 65 20 73 74 61 63 6b 0a 20 20 20 20 20 20  the stack.      
2f690 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
2f6a0 28 20 74 65 6d 70 4c 6f 63 6b 50 61 74 68 20 29  ( tempLockPath )
2f6b0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43 74 78  {.          pCtx
2f6c0 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20  ->lockProxyPath 
2f6d0 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
2f6e0 70 28 30 2c 20 74 65 6d 70 4c 6f 63 6b 50 61 74  p(0, tempLockPat
2f6f0 68 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  h);.          if
2f700 28 20 21 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f  ( !pCtx->lockPro
2f710 78 79 50 61 74 68 20 29 7b 0a 20 20 20 20 20 20  xyPath ){.      
2f720 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2f730 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20  E_NOMEM;.       
2f740 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
2f750 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
2f760 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2f770 7b 0a 20 20 20 20 20 20 20 20 70 43 74 78 2d 3e  {.        pCtx->
2f780 63 6f 6e 63 68 48 65 6c 64 20 3d 20 31 3b 0a 20  conchHeld = 1;. 
2f790 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20         .        
2f7a0 69 66 28 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72  if( pCtx->lockPr
2f7b0 6f 78 79 2d 3e 70 4d 65 74 68 6f 64 20 3d 3d 20  oxy->pMethod == 
2f7c0 26 61 66 70 49 6f 4d 65 74 68 6f 64 73 20 29 7b  &afpIoMethods ){
2f7d0 0a 20 20 20 20 20 20 20 20 20 20 61 66 70 4c 6f  .          afpLo
2f7e0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 61 66  ckingContext *af
2f7f0 70 43 74 78 3b 0a 20 20 20 20 20 20 20 20 20 20  pCtx;.          
2f800 61 66 70 43 74 78 20 3d 20 28 61 66 70 4c 6f 63  afpCtx = (afpLoc
2f810 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 43  kingContext *)pC
2f820 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 2d 3e 6c  tx->lockProxy->l
2f830 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20  ockingContext;. 
2f840 20 20 20 20 20 20 20 20 20 61 66 70 43 74 78 2d           afpCtx-
2f850 3e 64 62 50 61 74 68 20 3d 20 70 43 74 78 2d 3e  >dbPath = pCtx->
2f860 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 3b 0a 20  lockProxyPath;. 
2f870 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2f880 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20   else {.        
2f890 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68  conchFile->pMeth
2f8a0 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28 28 73 71 6c  od->xUnlock((sql
2f8b0 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68  ite3_file*)conch
2f8c0 46 69 6c 65 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a  File, NO_LOCK);.
2f8d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 4f 53        }.      OS
2f8e0 54 52 41 43 45 28 28 22 54 41 4b 45 43 4f 4e 43  TRACE(("TAKECONC
2f8f0 48 20 20 25 64 20 25 73 5c 6e 22 2c 20 63 6f 6e  H  %d %s\n", con
2f900 63 68 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20  chFile->h,.     
2f910 20 20 20 20 20 20 20 20 20 20 72 63 3d 3d 53 51            rc==SQ
2f920 4c 49 54 45 5f 4f 4b 3f 22 6f 6b 22 3a 22 66 61  LITE_OK?"ok":"fa
2f930 69 6c 65 64 22 29 29 3b 0a 20 20 20 20 20 20 72  iled"));.      r
2f940 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 20  eturn rc;.    } 
2f950 77 68 69 6c 65 20 28 31 29 3b 20 2f 2a 20 69 6e  while (1); /* in
2f960 20 63 61 73 65 20 77 65 20 6e 65 65 64 20 74 6f   case we need to
2f970 20 72 65 74 72 79 20 74 68 65 20 3a 61 75 74 6f   retry the :auto
2f980 3a 20 6c 6f 63 6b 20 66 69 6c 65 20 2d 20 0a 20  : lock file - . 
2f990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f9a0 2a 2a 20 77 65 20 73 68 6f 75 6c 64 20 6e 65 76  ** we should nev
2f9b0 65 72 20 67 65 74 20 68 65 72 65 20 65 78 63 65  er get here exce
2f9c0 70 74 20 76 69 61 20 74 68 65 20 27 63 6f 6e 74  pt via the 'cont
2f9d0 69 6e 75 65 27 20 63 61 6c 6c 2e 20 2a 2f 0a 20  inue' call. */. 
2f9e0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70   }.}../*.** If p
2f9f0 46 69 6c 65 20 68 6f 6c 64 73 20 61 20 6c 6f 63  File holds a loc
2fa00 6b 20 6f 6e 20 61 20 63 6f 6e 63 68 20 66 69 6c  k on a conch fil
2fa10 65 2c 20 74 68 65 6e 20 72 65 6c 65 61 73 65 20  e, then release 
2fa20 74 68 61 74 20 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74  that lock..*/.st
2fa30 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 52 65  atic int proxyRe
2fa40 6c 65 61 73 65 43 6f 6e 63 68 28 75 6e 69 78 46  leaseConch(unixF
2fa50 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69  ile *pFile){.  i
2fa60 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2fa70 4b 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75  K;         /* Su
2fa80 62 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 20  broutine return 
2fa90 63 6f 64 65 20 2a 2f 0a 20 20 70 72 6f 78 79 4c  code */.  proxyL
2faa0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70  ockingContext *p
2fab0 43 74 78 3b 20 20 2f 2a 20 54 68 65 20 6c 6f 63  Ctx;  /* The loc
2fac0 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 66 6f 72  king context for
2fad0 20 74 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b 20   the proxy lock 
2fae0 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 63  */.  unixFile *c
2faf0 6f 6e 63 68 46 69 6c 65 3b 20 20 20 20 20 20 20  onchFile;       
2fb00 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
2fb10 63 6f 6e 63 68 20 66 69 6c 65 20 2a 2f 0a 0a 20  conch file */.. 
2fb20 20 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f   pCtx = (proxyLo
2fb30 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70  ckingContext *)p
2fb40 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
2fb50 74 65 78 74 3b 0a 20 20 63 6f 6e 63 68 46 69 6c  text;.  conchFil
2fb60 65 20 3d 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46  e = pCtx->conchF
2fb70 69 6c 65 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  ile;.  OSTRACE((
2fb80 22 52 45 4c 45 41 53 45 43 4f 4e 43 48 20 20 25  "RELEASECONCH  %
2fb90 64 20 66 6f 72 20 25 73 20 70 69 64 3d 25 64 5c  d for %s pid=%d\
2fba0 6e 22 2c 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 68  n", conchFile->h
2fbb0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 28 70 43  ,.           (pC
2fbc0 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74  tx->lockProxyPat
2fbd0 68 20 3f 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72  h ? pCtx->lockPr
2fbe0 6f 78 79 50 61 74 68 20 3a 20 22 3a 61 75 74 6f  oxyPath : ":auto
2fbf0 3a 22 29 2c 20 0a 20 20 20 20 20 20 20 20 20 20  :"), .          
2fc00 20 67 65 74 70 69 64 28 29 29 29 3b 0a 20 20 69   getpid()));.  i
2fc10 66 28 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65  f( pCtx->conchHe
2fc20 6c 64 3e 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  ld>0 ){.    rc =
2fc30 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74   conchFile->pMet
2fc40 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28 28 73 71  hod->xUnlock((sq
2fc50 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63  lite3_file*)conc
2fc60 68 46 69 6c 65 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b  hFile, NO_LOCK);
2fc70 0a 20 20 7d 0a 20 20 70 43 74 78 2d 3e 63 6f 6e  .  }.  pCtx->con
2fc80 63 68 48 65 6c 64 20 3d 20 30 3b 0a 20 20 4f 53  chHeld = 0;.  OS
2fc90 54 52 41 43 45 28 28 22 52 45 4c 45 41 53 45 43  TRACE(("RELEASEC
2fca0 4f 4e 43 48 20 20 25 64 20 25 73 5c 6e 22 2c 20  ONCH  %d %s\n", 
2fcb0 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 0a 20 20  conchFile->h,.  
2fcc0 20 20 20 20 20 20 20 20 20 28 72 63 3d 3d 53 51           (rc==SQ
2fcd0 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a  LITE_OK ? "ok" :
2fce0 20 22 66 61 69 6c 65 64 22 29 29 29 3b 0a 20 20   "failed")));.  
2fcf0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2fd00 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 6e 61  .** Given the na
2fd10 6d 65 20 6f 66 20 61 20 64 61 74 61 62 61 73 65  me of a database
2fd20 20 66 69 6c 65 2c 20 63 6f 6d 70 75 74 65 20 74   file, compute t
2fd30 68 65 20 6e 61 6d 65 20 6f 66 20 69 74 73 20 63  he name of its c
2fd40 6f 6e 63 68 20 66 69 6c 65 2e 0a 2a 2a 20 53 74  onch file..** St
2fd50 6f 72 65 20 74 68 65 20 63 6f 6e 63 68 20 66 69  ore the conch fi
2fd60 6c 65 6e 61 6d 65 20 69 6e 20 6d 65 6d 6f 72 79  lename in memory
2fd70 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73   obtained from s
2fd80 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e  qlite3_malloc().
2fd90 0a 2a 2a 20 4d 61 6b 65 20 2a 70 43 6f 6e 63 68  .** Make *pConch
2fda0 50 61 74 68 20 70 6f 69 6e 74 20 74 6f 20 74 68  Path point to th
2fdb0 65 20 6e 65 77 20 6e 61 6d 65 2e 20 20 52 65 74  e new name.  Ret
2fdc0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
2fdd0 20 73 75 63 63 65 73 73 0a 2a 2a 20 6f 72 20 53   success.** or S
2fde0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 75  QLITE_NOMEM if u
2fdf0 6e 61 62 6c 65 20 74 6f 20 6f 62 74 61 69 6e 20  nable to obtain 
2fe00 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68  memory..**.** Th
2fe10 65 20 63 61 6c 6c 65 72 20 69 73 20 72 65 73 70  e caller is resp
2fe20 6f 6e 73 69 62 6c 65 20 66 6f 72 20 65 6e 73 75  onsible for ensu
2fe30 72 69 6e 67 20 74 68 61 74 20 74 68 65 20 61 6c  ring that the al
2fe40 6c 6f 63 61 74 65 64 20 6d 65 6d 6f 72 79 0a 2a  located memory.*
2fe50 2a 20 73 70 61 63 65 20 69 73 20 65 76 65 6e 74  * space is event
2fe60 75 61 6c 6c 79 20 66 72 65 65 64 2e 0a 2a 2a 0a  ually freed..**.
2fe70 2a 2a 20 2a 70 43 6f 6e 63 68 50 61 74 68 20 69  ** *pConchPath i
2fe80 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 69 66  s set to NULL if
2fe90 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61   a memory alloca
2fea0 74 69 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  tion error occur
2feb0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
2fec0 20 70 72 6f 78 79 43 72 65 61 74 65 43 6f 6e 63   proxyCreateConc
2fed0 68 50 61 74 68 6e 61 6d 65 28 63 68 61 72 20 2a  hPathname(char *
2fee0 64 62 50 61 74 68 2c 20 63 68 61 72 20 2a 2a 70  dbPath, char **p
2fef0 43 6f 6e 63 68 50 61 74 68 29 7b 0a 20 20 69 6e  ConchPath){.  in
2ff00 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
2ff10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
2ff20 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
2ff30 20 69 6e 74 20 6c 65 6e 20 3d 20 28 69 6e 74 29   int len = (int)
2ff40 73 74 72 6c 65 6e 28 64 62 50 61 74 68 29 3b 20  strlen(dbPath); 
2ff50 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 64 61 74  /* Length of dat
2ff60 61 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 20 2d  abase filename -
2ff70 20 64 62 50 61 74 68 20 2a 2f 0a 20 20 63 68 61   dbPath */.  cha
2ff80 72 20 2a 63 6f 6e 63 68 50 61 74 68 3b 20 20 20  r *conchPath;   
2ff90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 62 75             /* bu
2ffa0 66 66 65 72 20 69 6e 20 77 68 69 63 68 20 74 6f  ffer in which to
2ffb0 20 63 6f 6e 73 74 72 75 63 74 20 63 6f 6e 63 68   construct conch
2ffc0 20 6e 61 6d 65 20 2a 2f 0a 0a 20 20 2f 2a 20 41   name */..  /* A
2ffd0 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f  llocate space fo
2ffe0 72 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65  r the conch file
2fff0 6e 61 6d 65 20 61 6e 64 20 69 6e 69 74 69 61 6c  name and initial
30000 69 7a 65 20 74 68 65 20 6e 61 6d 65 20 74 6f 0a  ize the name to.
30010 20 20 2a 2a 20 74 68 65 20 6e 61 6d 65 20 6f 66    ** the name of
30020 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61   the original da
30030 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 20  tabase file. */ 
30040 20 0a 20 20 2a 70 43 6f 6e 63 68 50 61 74 68 20   .  *pConchPath 
30050 3d 20 63 6f 6e 63 68 50 61 74 68 20 3d 20 28 63  = conchPath = (c
30060 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61  har *)sqlite3_ma
30070 6c 6c 6f 63 28 6c 65 6e 20 2b 20 38 29 3b 0a 20  lloc(len + 8);. 
30080 20 69 66 28 20 63 6f 6e 63 68 50 61 74 68 3d 3d   if( conchPath==
30090 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
300a0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
300b0 7d 0a 20 20 6d 65 6d 63 70 79 28 63 6f 6e 63 68  }.  memcpy(conch
300c0 50 61 74 68 2c 20 64 62 50 61 74 68 2c 20 6c 65  Path, dbPath, le
300d0 6e 2b 31 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f  n+1);.  .  /* no
300e0 77 20 69 6e 73 65 72 74 20 61 20 22 2e 22 20 62  w insert a "." b
300f0 65 66 6f 72 65 20 74 68 65 20 6c 61 73 74 20 2f  efore the last /
30100 20 63 68 61 72 61 63 74 65 72 20 2a 2f 0a 20 20   character */.  
30110 66 6f 72 28 20 69 3d 28 6c 65 6e 2d 31 29 3b 20  for( i=(len-1); 
30120 69 3e 3d 30 3b 20 69 2d 2d 20 29 7b 0a 20 20 20  i>=0; i-- ){.   
30130 20 69 66 28 20 63 6f 6e 63 68 50 61 74 68 5b 69   if( conchPath[i
30140 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20  ]=='/' ){.      
30150 69 2b 2b 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  i++;.      break
30160 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 63 6f  ;.    }.  }.  co
30170 6e 63 68 50 61 74 68 5b 69 5d 3d 27 2e 27 3b 0a  nchPath[i]='.';.
30180 20 20 77 68 69 6c 65 20 28 20 69 3c 6c 65 6e 20    while ( i<len 
30190 29 7b 0a 20 20 20 20 63 6f 6e 63 68 50 61 74 68  ){.    conchPath
301a0 5b 69 2b 31 5d 3d 64 62 50 61 74 68 5b 69 5d 3b  [i+1]=dbPath[i];
301b0 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a 0a 20  .    i++;.  }.. 
301c0 20 2f 2a 20 61 70 70 65 6e 64 20 74 68 65 20 22   /* append the "
301d0 2d 63 6f 6e 63 68 22 20 73 75 66 66 69 78 20 74  -conch" suffix t
301e0 6f 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20  o the file */.  
301f0 6d 65 6d 63 70 79 28 26 63 6f 6e 63 68 50 61 74  memcpy(&conchPat
30200 68 5b 69 2b 31 5d 2c 20 22 2d 63 6f 6e 63 68 22  h[i+1], "-conch"
30210 2c 20 37 29 3b 0a 20 20 61 73 73 65 72 74 28 20  , 7);.  assert( 
30220 28 69 6e 74 29 73 74 72 6c 65 6e 28 63 6f 6e 63  (int)strlen(conc
30230 68 50 61 74 68 29 20 3d 3d 20 6c 65 6e 2b 37 20  hPath) == len+7 
30240 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  );..  return SQL
30250 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 20 54  ITE_OK;.}.../* T
30260 61 6b 65 73 20 61 20 66 75 6c 6c 79 20 63 6f 6e  akes a fully con
30270 66 69 67 75 72 65 64 20 70 72 6f 78 79 20 6c 6f  figured proxy lo
30280 63 6b 69 6e 67 2d 73 74 79 6c 65 20 75 6e 69 78  cking-style unix
30290 20 66 69 6c 65 20 61 6e 64 20 73 77 69 74 63 68   file and switch
302a0 65 73 0a 2a 2a 20 74 68 65 20 6c 6f 63 61 6c 20  es.** the local 
302b0 6c 6f 63 6b 20 66 69 6c 65 20 70 61 74 68 20 0a  lock file path .
302c0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 77  */.static int sw
302d0 69 74 63 68 4c 6f 63 6b 50 72 6f 78 79 50 61 74  itchLockProxyPat
302e0 68 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c  h(unixFile *pFil
302f0 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70  e, const char *p
30300 61 74 68 29 20 7b 0a 20 20 70 72 6f 78 79 4c 6f  ath) {.  proxyLo
30310 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43  ckingContext *pC
30320 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69  tx = (proxyLocki
30330 6e 67 43 6f 6e 74 65 78 74 2a 29 70 46 69 6c 65  ngContext*)pFile
30340 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
30350 3b 0a 20 20 63 68 61 72 20 2a 6f 6c 64 50 61 74  ;.  char *oldPat
30360 68 20 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72  h = pCtx->lockPr
30370 6f 78 79 50 61 74 68 3b 0a 20 20 69 6e 74 20 72  oxyPath;.  int r
30380 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
30390 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69    if( pFile->eFi
303a0 6c 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20  leLock!=NO_LOCK 
303b0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
303c0 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 20 20  LITE_BUSY;.  }  
303d0 0a 0a 20 20 2f 2a 20 6e 6f 74 68 69 6e 67 20 74  ..  /* nothing t
303e0 6f 20 64 6f 20 69 66 20 74 68 65 20 70 61 74 68  o do if the path
303f0 20 69 73 20 4e 55 4c 4c 2c 20 3a 61 75 74 6f 3a   is NULL, :auto:
30400 20 6f 72 20 6d 61 74 63 68 65 73 20 74 68 65 20   or matches the 
30410 65 78 69 73 74 69 6e 67 20 70 61 74 68 20 2a 2f  existing path */
30420 0a 20 20 69 66 28 20 21 70 61 74 68 20 7c 7c 20  .  if( !path || 
30430 70 61 74 68 5b 30 5d 3d 3d 27 5c 30 27 20 7c 7c  path[0]=='\0' ||
30440 20 21 73 74 72 63 6d 70 28 70 61 74 68 2c 20 22   !strcmp(path, "
30450 3a 61 75 74 6f 3a 22 29 20 7c 7c 0a 20 20 20 20  :auto:") ||.    
30460 28 6f 6c 64 50 61 74 68 20 26 26 20 21 73 74 72  (oldPath && !str
30470 6e 63 6d 70 28 6f 6c 64 50 61 74 68 2c 20 70 61  ncmp(oldPath, pa
30480 74 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29 29  th, MAXPATHLEN))
30490 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
304a0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73  QLITE_OK;.  }els
304b0 65 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20  e{.    unixFile 
304c0 2a 6c 6f 63 6b 50 72 6f 78 79 20 3d 20 70 43 74  *lockProxy = pCt
304d0 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 3b 0a 20 20  x->lockProxy;.  
304e0 20 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78    pCtx->lockProx
304f0 79 3d 4e 55 4c 4c 3b 0a 20 20 20 20 70 43 74 78  y=NULL;.    pCtx
30500 2d 3e 63 6f 6e 63 68 48 65 6c 64 20 3d 20 30 3b  ->conchHeld = 0;
30510 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 50 72 6f  .    if( lockPro
30520 78 79 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20  xy!=NULL ){.    
30530 20 20 72 63 3d 6c 6f 63 6b 50 72 6f 78 79 2d 3e    rc=lockProxy->
30540 70 4d 65 74 68 6f 64 2d 3e 78 43 6c 6f 73 65 28  pMethod->xClose(
30550 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29  (sqlite3_file *)
30560 6c 6f 63 6b 50 72 6f 78 79 29 3b 0a 20 20 20 20  lockProxy);.    
30570 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
30580 6e 20 72 63 3b 0a 20 20 20 20 20 20 73 71 6c 69  n rc;.      sqli
30590 74 65 33 5f 66 72 65 65 28 6c 6f 63 6b 50 72 6f  te3_free(lockPro
305a0 78 79 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  xy);.    }.    s
305b0 71 6c 69 74 65 33 5f 66 72 65 65 28 6f 6c 64 50  qlite3_free(oldP
305c0 61 74 68 29 3b 0a 20 20 20 20 70 43 74 78 2d 3e  ath);.    pCtx->
305d0 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 3d 20  lockProxyPath = 
305e0 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
305f0 30 2c 20 70 61 74 68 29 3b 0a 20 20 7d 0a 20 20  0, path);.  }.  
30600 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
30610 0a 2f 2a 0a 2a 2a 20 70 46 69 6c 65 20 69 73 20  ./*.** pFile is 
30620 61 20 66 69 6c 65 20 74 68 61 74 20 68 61 73 20  a file that has 
30630 62 65 65 6e 20 6f 70 65 6e 65 64 20 62 79 20 61  been opened by a
30640 20 70 72 69 6f 72 20 78 4f 70 65 6e 20 63 61 6c   prior xOpen cal
30650 6c 2e 20 20 64 62 50 61 74 68 0a 2a 2a 20 69 73  l.  dbPath.** is
30660 20 61 20 73 74 72 69 6e 67 20 62 75 66 66 65 72   a string buffer
30670 20 61 74 20 6c 65 61 73 74 20 4d 41 58 50 41 54   at least MAXPAT
30680 48 4c 45 4e 2b 31 20 63 68 61 72 61 63 74 65 72  HLEN+1 character
30690 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a  s in size..**.**
306a0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 66 69   This routine fi
306b0 6e 64 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20  nd the filename 
306c0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
306d0 70 46 69 6c 65 20 61 6e 64 20 77 72 69 74 65 73  pFile and writes
306e0 20 69 74 0a 2a 2a 20 69 6e 74 20 64 62 50 61 74   it.** int dbPat
306f0 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  h..*/.static int
30700 20 70 72 6f 78 79 47 65 74 44 62 50 61 74 68 46   proxyGetDbPathF
30710 6f 72 55 6e 69 78 46 69 6c 65 28 75 6e 69 78 46  orUnixFile(unixF
30720 69 6c 65 20 2a 70 46 69 6c 65 2c 20 63 68 61 72  ile *pFile, char
30730 20 2a 64 62 50 61 74 68 29 7b 0a 23 69 66 20 64   *dbPath){.#if d
30740 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
30750 29 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70  ).  if( pFile->p
30760 4d 65 74 68 6f 64 20 3d 3d 20 26 61 66 70 49 6f  Method == &afpIo
30770 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f  Methods ){.    /
30780 2a 20 61 66 70 20 73 74 79 6c 65 20 6b 65 65 70  * afp style keep
30790 73 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  s a reference to
307a0 20 74 68 65 20 64 62 20 70 61 74 68 20 69 6e 20   the db path in 
307b0 74 68 65 20 66 69 6c 65 50 61 74 68 20 66 69 65  the filePath fie
307c0 6c 64 20 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68  ld .    ** of th
307d0 65 20 73 74 72 75 63 74 20 2a 2f 0a 20 20 20 20  e struct */.    
307e0 61 73 73 65 72 74 28 20 28 69 6e 74 29 73 74 72  assert( (int)str
307f0 6c 65 6e 28 28 63 68 61 72 2a 29 70 46 69 6c 65  len((char*)pFile
30800 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
30810 29 3c 3d 4d 41 58 50 41 54 48 4c 45 4e 20 29 3b  )<=MAXPATHLEN );
30820 0a 20 20 20 20 73 74 72 6c 63 70 79 28 64 62 50  .    strlcpy(dbP
30830 61 74 68 2c 20 28 28 61 66 70 4c 6f 63 6b 69 6e  ath, ((afpLockin
30840 67 43 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c 65  gContext *)pFile
30850 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
30860 29 2d 3e 64 62 50 61 74 68 2c 20 4d 41 58 50 41  )->dbPath, MAXPA
30870 54 48 4c 45 4e 29 3b 0a 20 20 7d 20 65 6c 73 65  THLEN);.  } else
30880 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 46  .#endif.  if( pF
30890 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 20 3d 3d 20  ile->pMethod == 
308a0 26 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64  &dotlockIoMethod
308b0 73 20 29 7b 0a 20 20 20 20 2f 2a 20 64 6f 74 20  s ){.    /* dot 
308c0 6c 6f 63 6b 20 73 74 79 6c 65 20 75 73 65 73 20  lock style uses 
308d0 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74  the locking cont
308e0 65 78 74 20 74 6f 20 73 74 6f 72 65 20 74 68 65  ext to store the
308f0 20 64 6f 74 20 6c 6f 63 6b 0a 20 20 20 20 2a 2a   dot lock.    **
30900 20 66 69 6c 65 20 70 61 74 68 20 2a 2f 0a 20 20   file path */.  
30910 20 20 69 6e 74 20 6c 65 6e 20 3d 20 73 74 72 6c    int len = strl
30920 65 6e 28 28 63 68 61 72 20 2a 29 70 46 69 6c 65  en((char *)pFile
30930 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
30940 29 20 2d 20 73 74 72 6c 65 6e 28 44 4f 54 4c 4f  ) - strlen(DOTLO
30950 43 4b 5f 53 55 46 46 49 58 29 3b 0a 20 20 20 20  CK_SUFFIX);.    
30960 6d 65 6d 63 70 79 28 64 62 50 61 74 68 2c 20 28  memcpy(dbPath, (
30970 63 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f  char *)pFile->lo
30980 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2c 20 6c 65  ckingContext, le
30990 6e 20 2b 20 31 29 3b 0a 20 20 7d 65 6c 73 65 7b  n + 1);.  }else{
309a0 0a 20 20 20 20 2f 2a 20 61 6c 6c 20 6f 74 68 65  .    /* all othe
309b0 72 20 73 74 79 6c 65 73 20 75 73 65 20 74 68 65  r styles use the
309c0 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74   locking context
309d0 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 64 62   to store the db
309e0 20 66 69 6c 65 20 70 61 74 68 20 2a 2f 0a 20 20   file path */.  
309f0 20 20 61 73 73 65 72 74 28 20 73 74 72 6c 65 6e    assert( strlen
30a00 28 28 63 68 61 72 2a 29 70 46 69 6c 65 2d 3e 6c  ((char*)pFile->l
30a10 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3c 3d  ockingContext)<=
30a20 4d 41 58 50 41 54 48 4c 45 4e 20 29 3b 0a 20 20  MAXPATHLEN );.  
30a30 20 20 73 74 72 6c 63 70 79 28 64 62 50 61 74 68    strlcpy(dbPath
30a40 2c 20 28 63 68 61 72 20 2a 29 70 46 69 6c 65 2d  , (char *)pFile-
30a50 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2c  >lockingContext,
30a60 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a 20 20   MAXPATHLEN);.  
30a70 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
30a80 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
30a90 61 6b 65 73 20 61 6e 20 61 6c 72 65 61 64 79 20  akes an already 
30aa0 66 69 6c 6c 65 64 20 69 6e 20 75 6e 69 78 20 66  filled in unix f
30ab0 69 6c 65 20 61 6e 64 20 61 6c 74 65 72 73 20 69  ile and alters i
30ac0 74 20 73 6f 20 61 6c 6c 20 66 69 6c 65 20 6c 6f  t so all file lo
30ad0 63 6b 69 6e 67 20 0a 2a 2a 20 77 69 6c 6c 20 62  cking .** will b
30ae0 65 20 70 65 72 66 6f 72 6d 65 64 20 6f 6e 20 74  e performed on t
30af0 68 65 20 6c 6f 63 61 6c 20 70 72 6f 78 79 20 6c  he local proxy l
30b00 6f 63 6b 20 66 69 6c 65 2e 20 20 54 68 65 20 66  ock file.  The f
30b10 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 0a  ollowing fields.
30b20 2a 2a 20 61 72 65 20 70 72 65 73 65 72 76 65 64  ** are preserved
30b30 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   in the locking 
30b40 63 6f 6e 74 65 78 74 20 73 6f 20 74 68 61 74 20  context so that 
30b50 74 68 65 79 20 63 61 6e 20 62 65 20 72 65 73 74  they can be rest
30b60 6f 72 65 64 20 61 6e 64 20 0a 2a 2a 20 74 68 65  ored and .** the
30b70 20 75 6e 69 78 20 73 74 72 75 63 74 75 72 65 20   unix structure 
30b80 70 72 6f 70 65 72 6c 79 20 63 6c 65 61 6e 65 64  properly cleaned
30b90 20 75 70 20 61 74 20 63 6c 6f 73 65 20 74 69 6d   up at close tim
30ba0 65 3a 0a 2a 2a 20 20 2d 3e 6c 6f 63 6b 69 6e 67  e:.**  ->locking
30bb0 43 6f 6e 74 65 78 74 0a 2a 2a 20 20 2d 3e 70 4d  Context.**  ->pM
30bc0 65 74 68 6f 64 0a 2a 2f 0a 73 74 61 74 69 63 20  ethod.*/.static 
30bd0 69 6e 74 20 70 72 6f 78 79 54 72 61 6e 73 66 6f  int proxyTransfo
30be0 72 6d 55 6e 69 78 46 69 6c 65 28 75 6e 69 78 46  rmUnixFile(unixF
30bf0 69 6c 65 20 2a 70 46 69 6c 65 2c 20 63 6f 6e 73  ile *pFile, cons
30c00 74 20 63 68 61 72 20 2a 70 61 74 68 29 20 7b 0a  t char *path) {.
30c10 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f    proxyLockingCo
30c20 6e 74 65 78 74 20 2a 70 43 74 78 3b 0a 20 20 63  ntext *pCtx;.  c
30c30 68 61 72 20 64 62 50 61 74 68 5b 4d 41 58 50 41  har dbPath[MAXPA
30c40 54 48 4c 45 4e 2b 31 5d 3b 20 20 20 20 20 20 20  THLEN+1];       
30c50 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64  /* Name of the d
30c60 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
30c70 20 20 63 68 61 72 20 2a 6c 6f 63 6b 50 61 74 68    char *lockPath
30c80 3d 4e 55 4c 4c 3b 0a 20 20 69 6e 74 20 72 63 20  =NULL;.  int rc 
30c90 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 0a  = SQLITE_OK;.  .
30ca0 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69    if( pFile->eFi
30cb0 6c 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20  leLock!=NO_LOCK 
30cc0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
30cd0 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 20  LITE_BUSY;.  }. 
30ce0 20 70 72 6f 78 79 47 65 74 44 62 50 61 74 68 46   proxyGetDbPathF
30cf0 6f 72 55 6e 69 78 46 69 6c 65 28 70 46 69 6c 65  orUnixFile(pFile
30d00 2c 20 64 62 50 61 74 68 29 3b 0a 20 20 69 66 28  , dbPath);.  if(
30d10 20 21 70 61 74 68 20 7c 7c 20 70 61 74 68 5b 30   !path || path[0
30d20 5d 3d 3d 27 5c 30 27 20 7c 7c 20 21 73 74 72 63  ]=='\0' || !strc
30d30 6d 70 28 70 61 74 68 2c 20 22 3a 61 75 74 6f 3a  mp(path, ":auto:
30d40 22 29 20 29 7b 0a 20 20 20 20 6c 6f 63 6b 50 61  ") ){.    lockPa
30d50 74 68 3d 4e 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65  th=NULL;.  }else
30d60 7b 0a 20 20 20 20 6c 6f 63 6b 50 61 74 68 3d 28  {.    lockPath=(
30d70 63 68 61 72 20 2a 29 70 61 74 68 3b 0a 20 20 7d  char *)path;.  }
30d80 0a 20 20 0a 20 20 4f 53 54 52 41 43 45 28 28 22  .  .  OSTRACE(("
30d90 54 52 41 4e 53 50 52 4f 58 59 20 20 25 64 20 66  TRANSPROXY  %d f
30da0 6f 72 20 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c  or %s pid=%d\n",
30db0 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20   pFile->h,.     
30dc0 20 20 20 20 20 20 28 6c 6f 63 6b 50 61 74 68 20        (lockPath 
30dd0 3f 20 6c 6f 63 6b 50 61 74 68 20 3a 20 22 3a 61  ? lockPath : ":a
30de0 75 74 6f 3a 22 29 2c 20 67 65 74 70 69 64 28 29  uto:"), getpid()
30df0 29 29 3b 0a 0a 20 20 70 43 74 78 20 3d 20 73 71  ));..  pCtx = sq
30e00 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69  lite3_malloc( si
30e10 7a 65 6f 66 28 2a 70 43 74 78 29 20 29 3b 0a 20  zeof(*pCtx) );. 
30e20 20 69 66 28 20 70 43 74 78 3d 3d 30 20 29 7b 0a   if( pCtx==0 ){.
30e30 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
30e40 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 6d  E_NOMEM;.  }.  m
30e50 65 6d 73 65 74 28 70 43 74 78 2c 20 30 2c 20 73  emset(pCtx, 0, s
30e60 69 7a 65 6f 66 28 2a 70 43 74 78 29 29 3b 0a 0a  izeof(*pCtx));..
30e70 20 20 72 63 20 3d 20 70 72 6f 78 79 43 72 65 61    rc = proxyCrea
30e80 74 65 43 6f 6e 63 68 50 61 74 68 6e 61 6d 65 28  teConchPathname(
30e90 64 62 50 61 74 68 2c 20 26 70 43 74 78 2d 3e 63  dbPath, &pCtx->c
30ea0 6f 6e 63 68 46 69 6c 65 50 61 74 68 29 3b 0a 20  onchFilePath);. 
30eb0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
30ec0 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  OK ){.    rc = p
30ed0 72 6f 78 79 43 72 65 61 74 65 55 6e 69 78 46 69  roxyCreateUnixFi
30ee0 6c 65 28 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69  le(pCtx->conchFi
30ef0 6c 65 50 61 74 68 2c 20 26 70 43 74 78 2d 3e 63  lePath, &pCtx->c
30f00 6f 6e 63 68 46 69 6c 65 2c 20 30 29 3b 0a 20 20  onchFile, 0);.  
30f10 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
30f20 5f 43 41 4e 54 4f 50 45 4e 20 26 26 20 28 28 70  _CANTOPEN && ((p
30f30 46 69 6c 65 2d 3e 6f 70 65 6e 46 6c 61 67 73 26  File->openFlags&
30f40 4f 5f 52 44 57 52 29 20 3d 3d 20 30 29 20 29 7b  O_RDWR) == 0) ){
30f50 0a 20 20 20 20 20 20 2f 2a 20 69 66 20 28 61 29  .      /* if (a)
30f60 20 74 68 65 20 6f 70 65 6e 20 66 6c 61 67 73 20   the open flags 
30f70 61 72 65 20 6e 6f 74 20 4f 5f 52 44 57 52 2c 20  are not O_RDWR, 
30f80 28 62 29 20 74 68 65 20 63 6f 6e 63 68 20 69 73  (b) the conch is
30f90 6e 27 74 20 74 68 65 72 65 2c 20 61 6e 64 0a 20  n't there, and. 
30fa0 20 20 20 20 20 2a 2a 20 28 63 29 20 74 68 65 20       ** (c) the 
30fb0 66 69 6c 65 20 73 79 73 74 65 6d 20 69 73 20 72  file system is r
30fc0 65 61 64 2d 6f 6e 6c 79 2c 20 74 68 65 6e 20 65  ead-only, then e
30fd0 6e 61 62 6c 65 20 6e 6f 2d 6c 6f 63 6b 69 6e 67  nable no-locking
30fe0 20 61 63 63 65 73 73 2e 0a 20 20 20 20 20 20 2a   access..      *
30ff0 2a 20 55 67 68 2c 20 73 69 6e 63 65 20 4f 5f 52  * Ugh, since O_R
31000 44 4f 4e 4c 59 3d 3d 30 78 30 30 30 30 20 77 65  DONLY==0x0000 we
31010 20 74 65 73 74 20 66 6f 72 20 21 4f 5f 52 44 57   test for !O_RDW
31020 52 20 73 69 6e 63 65 20 75 6e 69 78 4f 70 65 6e  R since unixOpen
31030 20 61 73 73 65 72 74 73 0a 20 20 20 20 20 20 2a   asserts.      *
31040 2a 20 74 68 61 74 20 6f 70 65 6e 46 6c 61 67 73  * that openFlags
31050 20 77 69 6c 6c 20 68 61 76 65 20 6f 6e 6c 79 20   will have only 
31060 6f 6e 65 20 6f 66 20 4f 5f 52 44 4f 4e 4c 59 20  one of O_RDONLY 
31070 6f 72 20 4f 5f 52 44 57 52 2e 0a 20 20 20 20 20  or O_RDWR..     
31080 20 2a 2f 0a 20 20 20 20 20 20 73 74 72 75 63 74   */.      struct
31090 20 73 74 61 74 66 73 20 66 73 49 6e 66 6f 3b 0a   statfs fsInfo;.
310a0 20 20 20 20 20 20 73 74 72 75 63 74 20 73 74 61        struct sta
310b0 74 20 63 6f 6e 63 68 49 6e 66 6f 3b 0a 20 20 20  t conchInfo;.   
310c0 20 20 20 69 6e 74 20 67 6f 4c 6f 63 6b 6c 65 73     int goLockles
310d0 73 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 69 66  s = 0;..      if
310e0 28 20 73 74 61 74 28 70 43 74 78 2d 3e 63 6f 6e  ( stat(pCtx->con
310f0 63 68 46 69 6c 65 50 61 74 68 2c 20 26 63 6f 6e  chFilePath, &con
31100 63 68 49 6e 66 6f 29 20 3d 3d 20 2d 31 20 29 20  chInfo) == -1 ) 
31110 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 65 72  {.        int er
31120 72 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  r = errno;.     
31130 20 20 20 69 66 28 20 28 65 72 72 3d 3d 45 4e 4f     if( (err==ENO
31140 45 4e 54 29 20 26 26 20 28 73 74 61 74 66 73 28  ENT) && (statfs(
31150 64 62 50 61 74 68 2c 20 26 66 73 49 6e 66 6f 29  dbPath, &fsInfo)
31160 20 21 3d 20 2d 31 29 20 29 7b 0a 20 20 20 20 20   != -1) ){.     
31170 20 20 20 20 20 67 6f 4c 6f 63 6b 6c 65 73 73 20       goLockless 
31180 3d 20 28 66 73 49 6e 66 6f 2e 66 5f 66 6c 61 67  = (fsInfo.f_flag
31190 73 26 4d 4e 54 5f 52 44 4f 4e 4c 59 29 20 3d 3d  s&MNT_RDONLY) ==
311a0 20 4d 4e 54 5f 52 44 4f 4e 4c 59 3b 0a 20 20 20   MNT_RDONLY;.   
311b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
311c0 20 20 20 20 20 69 66 28 20 67 6f 4c 6f 63 6b 6c       if( goLockl
311d0 65 73 73 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ess ){.        p
311e0 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 20 3d  Ctx->conchHeld =
311f0 20 2d 31 3b 20 2f 2a 20 72 65 61 64 20 6f 6e 6c   -1; /* read onl
31200 79 20 46 53 2f 20 6c 6f 63 6b 6c 65 73 73 20 2a  y FS/ lockless *
31210 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  /.        rc = S
31220 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
31230 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 20 0a 20 20  }.    }.  }  .  
31240 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
31250 4b 20 26 26 20 6c 6f 63 6b 50 61 74 68 20 29 7b  K && lockPath ){
31260 0a 20 20 20 20 70 43 74 78 2d 3e 6c 6f 63 6b 50  .    pCtx->lockP
31270 72 6f 78 79 50 61 74 68 20 3d 20 73 71 6c 69 74  roxyPath = sqlit
31280 65 33 44 62 53 74 72 44 75 70 28 30 2c 20 6c 6f  e3DbStrDup(0, lo
31290 63 6b 50 61 74 68 29 3b 0a 20 20 7d 0a 0a 20 20  ckPath);.  }..  
312a0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
312b0 4b 20 29 7b 0a 20 20 20 20 70 43 74 78 2d 3e 64  K ){.    pCtx->d
312c0 62 50 61 74 68 20 3d 20 73 71 6c 69 74 65 33 44  bPath = sqlite3D
312d0 62 53 74 72 44 75 70 28 30 2c 20 64 62 50 61 74  bStrDup(0, dbPat
312e0 68 29 3b 0a 20 20 20 20 69 66 28 20 70 43 74 78  h);.    if( pCtx
312f0 2d 3e 64 62 50 61 74 68 3d 3d 4e 55 4c 4c 20 29  ->dbPath==NULL )
31300 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
31310 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
31320 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
31330 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
31340 2f 2a 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 69 73  /* all memory is
31350 20 61 6c 6c 6f 63 61 74 65 64 2c 20 70 72 6f 78   allocated, prox
31360 79 73 20 61 72 65 20 63 72 65 61 74 65 64 20 61  ys are created a
31370 6e 64 20 61 73 73 69 67 6e 65 64 2c 20 0a 20 20  nd assigned, .  
31380 20 20 2a 2a 20 73 77 69 74 63 68 20 74 68 65 20    ** switch the 
31390 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20  locking context 
313a0 61 6e 64 20 70 4d 65 74 68 6f 64 20 74 68 65 6e  and pMethod then
313b0 20 72 65 74 75 72 6e 2e 0a 20 20 20 20 2a 2f 0a   return..    */.
313c0 20 20 20 20 70 43 74 78 2d 3e 6f 6c 64 4c 6f 63      pCtx->oldLoc
313d0 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20 70 46  kingContext = pF
313e0 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
313f0 65 78 74 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  ext;.    pFile->
31400 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d  lockingContext =
31410 20 70 43 74 78 3b 0a 20 20 20 20 70 43 74 78 2d   pCtx;.    pCtx-
31420 3e 70 4f 6c 64 4d 65 74 68 6f 64 20 3d 20 70 46  >pOldMethod = pF
31430 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 3b 0a 20 20  ile->pMethod;.  
31440 20 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64    pFile->pMethod
31450 20 3d 20 26 70 72 6f 78 79 49 6f 4d 65 74 68 6f   = &proxyIoMetho
31460 64 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ds;.  }else{.   
31470 20 69 66 28 20 70 43 74 78 2d 3e 63 6f 6e 63 68   if( pCtx->conch
31480 46 69 6c 65 20 29 7b 20 0a 20 20 20 20 20 20 70  File ){ .      p
31490 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 2d 3e  Ctx->conchFile->
314a0 70 4d 65 74 68 6f 64 2d 3e 78 43 6c 6f 73 65 28  pMethod->xClose(
314b0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29  (sqlite3_file *)
314c0 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 29  pCtx->conchFile)
314d0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
314e0 66 72 65 65 28 70 43 74 78 2d 3e 63 6f 6e 63 68  free(pCtx->conch
314f0 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  File);.    }.   
31500 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
31510 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74  tx->lockProxyPat
31520 68 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  h);.    sqlite3_
31530 66 72 65 65 28 70 43 74 78 2d 3e 63 6f 6e 63 68  free(pCtx->conch
31540 46 69 6c 65 50 61 74 68 29 3b 20 0a 20 20 20 20  FilePath); .    
31550 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 74  sqlite3_free(pCt
31560 78 29 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43  x);.  }.  OSTRAC
31570 45 28 28 22 54 52 41 4e 53 50 52 4f 58 59 20 20  E(("TRANSPROXY  
31580 25 64 20 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d  %d %s\n", pFile-
31590 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 28  >h,.           (
315a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20  rc==SQLITE_OK ? 
315b0 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29  "ok" : "failed")
315c0 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ));.  return rc;
315d0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .}.../*.** This 
315e0 72 6f 75 74 69 6e 65 20 68 61 6e 64 6c 65 73 20  routine handles 
315f0 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e  sqlite3_file_con
31600 74 72 6f 6c 28 29 20 63 61 6c 6c 73 20 74 68 61  trol() calls tha
31610 74 20 61 72 65 20 73 70 65 63 69 66 69 63 0a 2a  t are specific.*
31620 2a 20 74 6f 20 70 72 6f 78 79 20 6c 6f 63 6b 69  * to proxy locki
31630 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
31640 74 20 70 72 6f 78 79 46 69 6c 65 43 6f 6e 74 72  t proxyFileContr
31650 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ol(sqlite3_file 
31660 2a 69 64 2c 20 69 6e 74 20 6f 70 2c 20 76 6f 69  *id, int op, voi
31670 64 20 2a 70 41 72 67 29 7b 0a 20 20 73 77 69 74  d *pArg){.  swit
31680 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61  ch( op ){.    ca
31690 73 65 20 53 51 4c 49 54 45 5f 47 45 54 5f 4c 4f  se SQLITE_GET_LO
316a0 43 4b 50 52 4f 58 59 46 49 4c 45 3a 20 7b 0a 20  CKPROXYFILE: {. 
316b0 20 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70       unixFile *p
316c0 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
316d0 2a 29 69 64 3b 0a 20 20 20 20 20 20 69 66 28 20  *)id;.      if( 
316e0 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 20 3d  pFile->pMethod =
316f0 3d 20 26 70 72 6f 78 79 49 6f 4d 65 74 68 6f 64  = &proxyIoMethod
31700 73 20 29 7b 0a 20 20 20 20 20 20 20 20 70 72 6f  s ){.        pro
31710 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  xyLockingContext
31720 20 2a 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c   *pCtx = (proxyL
31730 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2a 29 70  ockingContext*)p
31740 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
31750 74 65 78 74 3b 0a 20 20 20 20 20 20 20 20 70 72  text;.        pr
31760 6f 78 79 54 61 6b 65 43 6f 6e 63 68 28 70 46 69  oxyTakeConch(pFi
31770 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  le);.        if(
31780 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79   pCtx->lockProxy
31790 50 61 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20  Path ){.        
317a0 20 20 2a 28 63 6f 6e 73 74 20 63 68 61 72 20 2a    *(const char *
317b0 2a 29 70 41 72 67 20 3d 20 70 43 74 78 2d 3e 6c  *)pArg = pCtx->l
317c0 6f 63 6b 50 72 6f 78 79 50 61 74 68 3b 0a 20 20  ockProxyPath;.  
317d0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
317e0 20 20 20 20 20 20 20 2a 28 63 6f 6e 73 74 20 63         *(const c
317f0 68 61 72 20 2a 2a 29 70 41 72 67 20 3d 20 22 3a  har **)pArg = ":
31800 61 75 74 6f 3a 20 28 6e 6f 74 20 68 65 6c 64 29  auto: (not held)
31810 22 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  ";.        }.   
31820 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
31830 20 20 20 20 2a 28 63 6f 6e 73 74 20 63 68 61 72      *(const char
31840 20 2a 2a 29 70 41 72 67 20 3d 20 4e 55 4c 4c 3b   **)pArg = NULL;
31850 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
31860 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
31870 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
31880 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50  SQLITE_SET_LOCKP
31890 52 4f 58 59 46 49 4c 45 3a 20 7b 0a 20 20 20 20  ROXYFILE: {.    
318a0 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
318b0 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
318c0 64 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20  d;.      int rc 
318d0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
318e0 20 20 20 69 6e 74 20 69 73 50 72 6f 78 79 53 74     int isProxySt
318f0 79 6c 65 20 3d 20 28 70 46 69 6c 65 2d 3e 70 4d  yle = (pFile->pM
31900 65 74 68 6f 64 20 3d 3d 20 26 70 72 6f 78 79 49  ethod == &proxyI
31910 6f 4d 65 74 68 6f 64 73 29 3b 0a 20 20 20 20 20  oMethods);.     
31920 20 69 66 28 20 70 41 72 67 3d 3d 4e 55 4c 4c 20   if( pArg==NULL 
31930 7c 7c 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  || (const char *
31940 29 70 41 72 67 3d 3d 30 20 29 7b 0a 20 20 20 20  )pArg==0 ){.    
31950 20 20 20 20 69 66 28 20 69 73 50 72 6f 78 79 53      if( isProxyS
31960 74 79 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20  tyle ){.        
31970 20 20 2f 2a 20 74 75 72 6e 20 6f 66 66 20 70 72    /* turn off pr
31980 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 2d 20 6e 6f  oxy locking - no
31990 74 20 73 75 70 70 6f 72 74 65 64 20 2a 2f 0a 20  t supported */. 
319a0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
319b0 4c 49 54 45 5f 45 52 52 4f 52 20 2f 2a 53 51 4c  LITE_ERROR /*SQL
319c0 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 3f 20 53 51  ITE_PROTOCOL? SQ
319d0 4c 49 54 45 5f 4d 49 53 55 53 45 3f 2a 2f 3b 0a  LITE_MISUSE?*/;.
319e0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
319f0 20 20 20 20 20 20 20 20 20 2f 2a 20 74 75 72 6e           /* turn
31a00 20 6f 66 66 20 70 72 6f 78 79 20 6c 6f 63 6b 69   off proxy locki
31a10 6e 67 20 2d 20 61 6c 72 65 61 64 79 20 6f 66 66  ng - already off
31a20 20 2d 20 4e 4f 4f 50 20 2a 2f 0a 20 20 20 20 20   - NOOP */.     
31a30 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
31a40 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  _OK;.        }. 
31a50 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
31a60 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
31a70 70 72 6f 78 79 50 61 74 68 20 3d 20 28 63 6f 6e  proxyPath = (con
31a80 73 74 20 63 68 61 72 20 2a 29 70 41 72 67 3b 0a  st char *)pArg;.
31a90 20 20 20 20 20 20 20 20 69 66 28 20 69 73 50 72          if( isPr
31aa0 6f 78 79 53 74 79 6c 65 20 29 7b 0a 20 20 20 20  oxyStyle ){.    
31ab0 20 20 20 20 20 20 70 72 6f 78 79 4c 6f 63 6b 69        proxyLocki
31ac0 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20  ngContext *pCtx 
31ad0 3d 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 28  = .            (
31ae0 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
31af0 65 78 74 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ext*)pFile->lock
31b00 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20  ingContext;.    
31b10 20 20 20 20 20 20 69 66 28 20 21 73 74 72 63 6d        if( !strcm
31b20 70 28 70 41 72 67 2c 20 22 3a 61 75 74 6f 3a 22  p(pArg, ":auto:"
31b30 29 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  ) .           ||
31b40 20 28 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78   (pCtx->lockProx
31b50 79 50 61 74 68 20 26 26 0a 20 20 20 20 20 20 20  yPath &&.       
31b60 20 20 20 20 20 20 20 20 21 73 74 72 6e 63 6d 70          !strncmp
31b70 28 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79  (pCtx->lockProxy
31b80 50 61 74 68 2c 20 70 72 6f 78 79 50 61 74 68 2c  Path, proxyPath,
31b90 20 4d 41 58 50 41 54 48 4c 45 4e 29 29 0a 20 20   MAXPATHLEN)).  
31ba0 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
31bb0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
31bc0 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20  TE_OK;.         
31bd0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
31be0 20 20 20 20 72 63 20 3d 20 73 77 69 74 63 68 4c      rc = switchL
31bf0 6f 63 6b 50 72 6f 78 79 50 61 74 68 28 70 46 69  ockProxyPath(pFi
31c00 6c 65 2c 20 70 72 6f 78 79 50 61 74 68 29 3b 0a  le, proxyPath);.
31c10 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
31c20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
31c30 20 20 20 20 20 2f 2a 20 74 75 72 6e 20 6f 6e 20       /* turn on 
31c40 70 72 6f 78 79 20 66 69 6c 65 20 6c 6f 63 6b 69  proxy file locki
31c50 6e 67 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ng */.          
31c60 72 63 20 3d 20 70 72 6f 78 79 54 72 61 6e 73 66  rc = proxyTransf
31c70 6f 72 6d 55 6e 69 78 46 69 6c 65 28 70 46 69 6c  ormUnixFile(pFil
31c80 65 2c 20 70 72 6f 78 79 50 61 74 68 29 3b 0a 20  e, proxyPath);. 
31c90 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
31ca0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
31cb0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61  ;.    }.    defa
31cc0 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  ult: {.      ass
31cd0 65 72 74 28 20 30 20 29 3b 20 20 2f 2a 20 54 68  ert( 0 );  /* Th
31ce0 65 20 63 61 6c 6c 20 61 73 73 75 72 65 73 20 74  e call assures t
31cf0 68 61 74 20 6f 6e 6c 79 20 76 61 6c 69 64 20 6f  hat only valid o
31d00 70 63 6f 64 65 73 20 61 72 65 20 73 65 6e 74 20  pcodes are sent 
31d10 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f  */.    }.  }.  /
31d20 2a 4e 4f 54 52 45 41 43 48 45 44 2a 2f 0a 20 20  *NOTREACHED*/.  
31d30 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
31d40 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 69  ROR;.}../*.** Wi
31d50 74 68 69 6e 20 74 68 69 73 20 64 69 76 69 73 69  thin this divisi
31d60 6f 6e 20 28 74 68 65 20 70 72 6f 78 79 69 6e 67  on (the proxying
31d70 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c 65 6d 65   locking impleme
31d80 6e 74 61 74 69 6f 6e 29 20 74 68 65 20 70 72 6f  ntation) the pro
31d90 63 65 64 75 72 65 73 0a 2a 2a 20 61 62 6f 76 65  cedures.** above
31da0 20 74 68 69 73 20 70 6f 69 6e 74 20 61 72 65 20   this point are 
31db0 61 6c 6c 20 75 74 69 6c 69 74 69 65 73 2e 20 20  all utilities.  
31dc0 54 68 65 20 6c 6f 63 6b 2d 72 65 6c 61 74 65 64  The lock-related
31dd0 20 6d 65 74 68 6f 64 73 20 6f 66 20 74 68 65 0a   methods of the.
31de0 2a 2a 20 70 72 6f 78 79 2d 6c 6f 63 6b 69 6e 67  ** proxy-locking
31df0 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
31e00 6f 64 20 6f 62 6a 65 63 74 20 66 6f 6c 6c 6f 77  od object follow
31e10 2e 0a 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ..*/.../*.** Thi
31e20 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73  s routine checks
31e30 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 52   if there is a R
31e40 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c  ESERVED lock hel
31e50 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69  d on the specifi
31e60 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68  ed.** file by th
31e70 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20  is or any other 
31e80 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68  process. If such
31e90 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c   a lock is held,
31ea0 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a   set *pResOut.**
31eb0 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76   to a non-zero v
31ec0 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a  alue otherwise *
31ed0 70 52 65 73 4f 75 74 20 69 73 20 73 65 74 20 74  pResOut is set t
31ee0 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74  o zero.  The ret
31ef0 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20  urn value.** is 
31f00 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b  set to SQLITE_OK
31f10 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65   unless an I/O e
31f20 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69  rror occurs duri
31f30 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67  ng lock checking
31f40 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
31f50 70 72 6f 78 79 43 68 65 63 6b 52 65 73 65 72 76  proxyCheckReserv
31f60 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  edLock(sqlite3_f
31f70 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52  ile *id, int *pR
31f80 65 73 4f 75 74 29 20 7b 0a 20 20 75 6e 69 78 46  esOut) {.  unixF
31f90 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
31fa0 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e  ixFile*)id;.  in
31fb0 74 20 72 63 20 3d 20 70 72 6f 78 79 54 61 6b 65  t rc = proxyTake
31fc0 43 6f 6e 63 68 28 70 46 69 6c 65 29 3b 0a 20 20  Conch(pFile);.  
31fd0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
31fe0 4b 20 29 7b 0a 20 20 20 20 70 72 6f 78 79 4c 6f  K ){.    proxyLo
31ff0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43  ckingContext *pC
32000 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69  tx = (proxyLocki
32010 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c  ngContext *)pFil
32020 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
32030 74 3b 0a 20 20 20 20 69 66 28 20 70 43 74 78 2d  t;.    if( pCtx-
32040 3e 63 6f 6e 63 68 48 65 6c 64 3e 30 20 29 7b 0a  >conchHeld>0 ){.
32050 20 20 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a        unixFile *
32060 70 72 6f 78 79 20 3d 20 70 43 74 78 2d 3e 6c 6f  proxy = pCtx->lo
32070 63 6b 50 72 6f 78 79 3b 0a 20 20 20 20 20 20 72  ckProxy;.      r
32080 65 74 75 72 6e 20 70 72 6f 78 79 2d 3e 70 4d 65  eturn proxy->pMe
32090 74 68 6f 64 2d 3e 78 43 68 65 63 6b 52 65 73 65  thod->xCheckRese
320a0 72 76 65 64 4c 6f 63 6b 28 28 73 71 6c 69 74 65  rvedLock((sqlite
320b0 33 5f 66 69 6c 65 2a 29 70 72 6f 78 79 2c 20 70  3_file*)proxy, p
320c0 52 65 73 4f 75 74 29 3b 0a 20 20 20 20 7d 65 6c  ResOut);.    }el
320d0 73 65 7b 20 2f 2a 20 63 6f 6e 63 68 48 65 6c 64  se{ /* conchHeld
320e0 20 3c 20 30 20 69 73 20 6c 6f 63 6b 6c 65 73 73   < 0 is lockless
320f0 20 2a 2f 0a 20 20 20 20 20 20 70 52 65 73 4f 75   */.      pResOu
32100 74 3d 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  t=0;.    }.  }. 
32110 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
32120 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69  *.** Lock the fi
32130 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b  le with the lock
32140 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61   specified by pa
32150 72 61 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63  rameter eFileLoc
32160 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68  k - one.** of th
32170 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
32180 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45  **     (1) SHARE
32190 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32  D_LOCK.**     (2
321a0 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a  ) RESERVED_LOCK.
321b0 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49  **     (3) PENDI
321c0 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  NG_LOCK.**     (
321d0 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  4) EXCLUSIVE_LOC
321e0 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65  K.**.** Sometime
321f0 73 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e  s when requestin
32200 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65  g one lock state
32210 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63  , additional loc
32220 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20  k states.** are 
32230 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77  inserted in betw
32240 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e  een.  The lockin
32250 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20  g might fail on 
32260 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72  one of the later
32270 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  .** transitions 
32280 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b  leaving the lock
32290 20 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74   state different
322a0 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74   from what it st
322b0 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69  arted but.** sti
322c0 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20  ll short of its 
322d0 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  goal.  The follo
322e0 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73  wing chart shows
322f0 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20   the allowed.** 
32300 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20  transitions and 
32310 74 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74  the inserted int
32320 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73  ermediate states
32330 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43  :.**.**    UNLOC
32340 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a  KED -> SHARED.**
32350 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45      SHARED -> RE
32360 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41  SERVED.**    SHA
32370 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  RED -> (PENDING)
32380 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
32390 20 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20      RESERVED -> 
323a0 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43  (PENDING) -> EXC
323b0 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e  LUSIVE.**    PEN
323c0 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56  DING -> EXCLUSIV
323d0 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  E.**.** This rou
323e0 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69  tine will only i
323f0 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20  ncrease a lock. 
32400 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33   Use the sqlite3
32410 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f  OsUnlock().** ro
32420 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61  utine to lower a
32430 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a   locking level..
32440 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  */.static int pr
32450 6f 78 79 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  oxyLock(sqlite3_
32460 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46  file *id, int eF
32470 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69  ileLock) {.  uni
32480 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
32490 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
324a0 69 6e 74 20 72 63 20 3d 20 70 72 6f 78 79 54 61  int rc = proxyTa
324b0 6b 65 43 6f 6e 63 68 28 70 46 69 6c 65 29 3b 0a  keConch(pFile);.
324c0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
324d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 72 6f 78 79  _OK ){.    proxy
324e0 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
324f0 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63  pCtx = (proxyLoc
32500 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 46  kingContext *)pF
32510 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
32520 65 78 74 3b 0a 20 20 20 20 69 66 28 20 70 43 74  ext;.    if( pCt
32530 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 3e 30 20 29  x->conchHeld>0 )
32540 7b 0a 20 20 20 20 20 20 75 6e 69 78 46 69 6c 65  {.      unixFile
32550 20 2a 70 72 6f 78 79 20 3d 20 70 43 74 78 2d 3e   *proxy = pCtx->
32560 6c 6f 63 6b 50 72 6f 78 79 3b 0a 20 20 20 20 20  lockProxy;.     
32570 20 72 63 20 3d 20 70 72 6f 78 79 2d 3e 70 4d 65   rc = proxy->pMe
32580 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28 73 71 6c  thod->xLock((sql
32590 69 74 65 33 5f 66 69 6c 65 2a 29 70 72 6f 78 79  ite3_file*)proxy
325a0 2c 20 65 46 69 6c 65 4c 6f 63 6b 29 3b 0a 20 20  , eFileLock);.  
325b0 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
325c0 4c 6f 63 6b 20 3d 20 70 72 6f 78 79 2d 3e 65 46  Lock = proxy->eF
325d0 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 7d 65 6c  ileLock;.    }el
325e0 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 63 6f 6e  se{.      /* con
325f0 63 68 48 65 6c 64 20 3c 20 30 20 69 73 20 6c 6f  chHeld < 0 is lo
32600 63 6b 6c 65 73 73 20 2a 2f 0a 20 20 20 20 7d 0a  ckless */.    }.
32610 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
32620 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72  .}.../*.** Lower
32630 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
32640 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72  el on file descr
32650 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65  iptor pFile to e
32660 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65  FileLock.  eFile
32670 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20  Lock.** must be 
32680 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f  either NO_LOCK o
32690 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a  r SHARED_LOCK..*
326a0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b  *.** If the lock
326b0 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65  ing level of the
326c0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
326d0 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f   is already at o
326e0 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72  r below.** the r
326f0 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67  equested locking
32700 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75   level, this rou
32710 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
32720 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
32730 72 6f 78 79 55 6e 6c 6f 63 6b 28 73 71 6c 69 74  roxyUnlock(sqlit
32740 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
32750 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20   eFileLock) {.  
32760 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
32770 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
32780 0a 20 20 69 6e 74 20 72 63 20 3d 20 70 72 6f 78  .  int rc = prox
32790 79 54 61 6b 65 43 6f 6e 63 68 28 70 46 69 6c 65  yTakeConch(pFile
327a0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
327b0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 72  ITE_OK ){.    pr
327c0 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  oxyLockingContex
327d0 74 20 2a 70 43 74 78 20 3d 20 28 70 72 6f 78 79  t *pCtx = (proxy
327e0 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
327f0 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43  )pFile->lockingC
32800 6f 6e 74 65 78 74 3b 0a 20 20 20 20 69 66 28 20  ontext;.    if( 
32810 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 3e  pCtx->conchHeld>
32820 30 20 29 7b 0a 20 20 20 20 20 20 75 6e 69 78 46  0 ){.      unixF
32830 69 6c 65 20 2a 70 72 6f 78 79 20 3d 20 70 43 74  ile *proxy = pCt
32840 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 3b 0a 20 20  x->lockProxy;.  
32850 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79 2d 3e      rc = proxy->
32860 70 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b  pMethod->xUnlock
32870 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29  ((sqlite3_file*)
32880 70 72 6f 78 79 2c 20 65 46 69 6c 65 4c 6f 63 6b  proxy, eFileLock
32890 29 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  );.      pFile->
328a0 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 70 72 6f 78  eFileLock = prox
328b0 79 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20  y->eFileLock;.  
328c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
328d0 2a 20 63 6f 6e 63 68 48 65 6c 64 20 3c 20 30 20  * conchHeld < 0 
328e0 69 73 20 6c 6f 63 6b 6c 65 73 73 20 2a 2f 0a 20  is lockless */. 
328f0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
32900 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
32910 6c 6f 73 65 20 61 20 66 69 6c 65 20 74 68 61 74  lose a file that
32920 20 75 73 65 73 20 70 72 6f 78 79 20 6c 6f 63 6b   uses proxy lock
32930 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
32940 20 70 72 6f 78 79 43 6c 6f 73 65 28 73 71 6c 69   proxyClose(sqli
32950 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a  te3_file *id) {.
32960 20 20 69 66 28 20 69 64 20 29 7b 0a 20 20 20 20    if( id ){.    
32970 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
32980 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
32990 0a 20 20 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e  .    proxyLockin
329a0 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d  gContext *pCtx =
329b0 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f   (proxyLockingCo
329c0 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c  ntext *)pFile->l
329d0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20  ockingContext;. 
329e0 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 6c 6f 63     unixFile *loc
329f0 6b 50 72 6f 78 79 20 3d 20 70 43 74 78 2d 3e 6c  kProxy = pCtx->l
32a00 6f 63 6b 50 72 6f 78 79 3b 0a 20 20 20 20 75 6e  ockProxy;.    un
32a10 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46 69 6c  ixFile *conchFil
32a20 65 20 3d 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46  e = pCtx->conchF
32a30 69 6c 65 3b 0a 20 20 20 20 69 6e 74 20 72 63 20  ile;.    int rc 
32a40 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
32a50 20 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 50 72   .    if( lockPr
32a60 6f 78 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20  oxy ){.      rc 
32a70 3d 20 6c 6f 63 6b 50 72 6f 78 79 2d 3e 70 4d 65  = lockProxy->pMe
32a80 74 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28 28 73  thod->xUnlock((s
32a90 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 6c 6f 63  qlite3_file*)loc
32aa0 6b 50 72 6f 78 79 2c 20 4e 4f 5f 4c 4f 43 4b 29  kProxy, NO_LOCK)
32ab0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
32ac0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
32ad0 20 20 72 63 20 3d 20 6c 6f 63 6b 50 72 6f 78 79    rc = lockProxy
32ae0 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 43 6c 6f 73  ->pMethod->xClos
32af0 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  e((sqlite3_file*
32b00 29 6c 6f 63 6b 50 72 6f 78 79 29 3b 0a 20 20 20  )lockProxy);.   
32b10 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
32b20 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 73 71 6c  rn rc;.      sql
32b30 69 74 65 33 5f 66 72 65 65 28 6c 6f 63 6b 50 72  ite3_free(lockPr
32b40 6f 78 79 29 3b 0a 20 20 20 20 20 20 70 43 74 78  oxy);.      pCtx
32b50 2d 3e 6c 6f 63 6b 50 72 6f 78 79 20 3d 20 30 3b  ->lockProxy = 0;
32b60 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63  .    }.    if( c
32b70 6f 6e 63 68 46 69 6c 65 20 29 7b 0a 20 20 20 20  onchFile ){.    
32b80 20 20 69 66 28 20 70 43 74 78 2d 3e 63 6f 6e 63    if( pCtx->conc
32b90 68 48 65 6c 64 20 29 7b 0a 20 20 20 20 20 20 20  hHeld ){.       
32ba0 20 72 63 20 3d 20 70 72 6f 78 79 52 65 6c 65 61   rc = proxyRelea
32bb0 73 65 43 6f 6e 63 68 28 70 46 69 6c 65 29 3b 0a  seConch(pFile);.
32bc0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
32bd0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
32be0 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 63    }.      rc = c
32bf0 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f  onchFile->pMetho
32c00 64 2d 3e 78 43 6c 6f 73 65 28 28 73 71 6c 69 74  d->xClose((sqlit
32c10 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69  e3_file*)conchFi
32c20 6c 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  le);.      if( r
32c30 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
32c40 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
32c50 65 28 63 6f 6e 63 68 46 69 6c 65 29 3b 0a 20 20  e(conchFile);.  
32c60 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
32c70 66 72 65 65 28 70 43 74 78 2d 3e 6c 6f 63 6b 50  free(pCtx->lockP
32c80 72 6f 78 79 50 61 74 68 29 3b 0a 20 20 20 20 73  roxyPath);.    s
32c90 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 74 78  qlite3_free(pCtx
32ca0 2d 3e 63 6f 6e 63 68 46 69 6c 65 50 61 74 68 29  ->conchFilePath)
32cb0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
32cc0 65 65 28 70 43 74 78 2d 3e 64 62 50 61 74 68 29  ee(pCtx->dbPath)
32cd0 3b 0a 20 20 20 20 2f 2a 20 72 65 73 74 6f 72 65  ;.    /* restore
32ce0 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 6c 6f   the original lo
32cf0 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 61 6e  cking context an
32d00 64 20 70 4d 65 74 68 6f 64 20 74 68 65 6e 20 63  d pMethod then c
32d10 6c 6f 73 65 20 69 74 20 2a 2f 0a 20 20 20 20 70  lose it */.    p
32d20 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
32d30 74 65 78 74 20 3d 20 70 43 74 78 2d 3e 6f 6c 64  text = pCtx->old
32d40 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  LockingContext;.
32d50 20 20 20 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68      pFile->pMeth
32d60 6f 64 20 3d 20 70 43 74 78 2d 3e 70 4f 6c 64 4d  od = pCtx->pOldM
32d70 65 74 68 6f 64 3b 0a 20 20 20 20 73 71 6c 69 74  ethod;.    sqlit
32d80 65 33 5f 66 72 65 65 28 70 43 74 78 29 3b 0a 20  e3_free(pCtx);. 
32d90 20 20 20 72 65 74 75 72 6e 20 70 46 69 6c 65 2d     return pFile-
32da0 3e 70 4d 65 74 68 6f 64 2d 3e 78 43 6c 6f 73 65  >pMethod->xClose
32db0 28 69 64 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  (id);.  }.  retu
32dc0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
32dd0 0a 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66  ...#endif /* def
32de0 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
32df0 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
32e00 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a  _LOCKING_STYLE *
32e10 2f 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 78  /./*.** The prox
32e20 79 20 6c 6f 63 6b 69 6e 67 20 73 74 79 6c 65 20  y locking style 
32e30 69 73 20 69 6e 74 65 6e 64 65 64 20 66 6f 72 20  is intended for 
32e40 75 73 65 20 77 69 74 68 20 41 46 50 20 66 69 6c  use with AFP fil
32e50 65 73 79 73 74 65 6d 73 2e 0a 2a 2a 20 41 6e 64  esystems..** And
32e60 20 73 69 6e 63 65 20 41 46 50 20 69 73 20 6f 6e   since AFP is on
32e70 6c 79 20 73 75 70 70 6f 72 74 65 64 20 6f 6e 20  ly supported on 
32e80 4d 61 63 4f 53 58 2c 20 74 68 65 20 70 72 6f 78  MacOSX, the prox
32e90 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20 61 6c 73  y locking is als
32ea0 6f 0a 2a 2a 20 72 65 73 74 72 69 63 74 65 64 20  o.** restricted 
32eb0 74 6f 20 4d 61 63 4f 53 58 2e 0a 2a 2a 20 0a 2a  to MacOSX..** .*
32ec0 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
32ed0 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65  ***** End of the
32ee0 20 70 72 6f 78 79 20 6c 6f 63 6b 20 69 6d 70 6c   proxy lock impl
32ef0 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a  ementation *****
32f00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
32f10 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
32f20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
32f30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
32f40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
32f50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
32f60 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  /../*.** Initial
32f70 69 7a 65 20 74 68 65 20 6f 70 65 72 61 74 69 6e  ize the operatin
32f80 67 20 73 79 73 74 65 6d 20 69 6e 74 65 72 66 61  g system interfa
32f90 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ce..**.** This r
32fa0 6f 75 74 69 6e 65 20 72 65 67 69 73 74 65 72 73  outine registers
32fb0 20 61 6c 6c 20 56 46 53 20 69 6d 70 6c 65 6d 65   all VFS impleme
32fc0 6e 74 61 74 69 6f 6e 73 20 66 6f 72 20 75 6e 69  ntations for uni
32fd0 78 2d 6c 69 6b 65 20 6f 70 65 72 61 74 69 6e 67  x-like operating
32fe0 0a 2a 2a 20 73 79 73 74 65 6d 73 2e 20 20 54 68  .** systems.  Th
32ff0 69 73 20 72 6f 75 74 69 6e 65 2c 20 61 6e 64 20  is routine, and 
33000 74 68 65 20 73 71 6c 69 74 65 33 5f 6f 73 5f 65  the sqlite3_os_e
33010 6e 64 28 29 20 72 6f 75 74 69 6e 65 20 74 68 61  nd() routine tha
33020 74 20 66 6f 6c 6c 6f 77 73 2c 0a 2a 2a 20 73 68  t follows,.** sh
33030 6f 75 6c 64 20 62 65 20 74 68 65 20 6f 6e 6c 79  ould be the only
33040 20 72 6f 75 74 69 6e 65 73 20 69 6e 20 74 68 69   routines in thi
33050 73 20 66 69 6c 65 20 74 68 61 74 20 61 72 65 20  s file that are 
33060 76 69 73 69 62 6c 65 20 66 72 6f 6d 20 6f 74 68  visible from oth
33070 65 72 0a 2a 2a 20 66 69 6c 65 73 2e 0a 2a 2a 0a  er.** files..**.
33080 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
33090 69 73 20 63 61 6c 6c 65 64 20 6f 6e 63 65 20 64  is called once d
330a0 75 72 69 6e 67 20 53 51 4c 69 74 65 20 69 6e 69  uring SQLite ini
330b0 74 69 61 6c 69 7a 61 74 69 6f 6e 20 61 6e 64 20  tialization and 
330c0 62 79 20 61 0a 2a 2a 20 73 69 6e 67 6c 65 20 74  by a.** single t
330d0 68 72 65 61 64 2e 20 20 54 68 65 20 6d 65 6d 6f  hread.  The memo
330e0 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 61 6e  ry allocation an
330f0 64 20 6d 75 74 65 78 20 73 75 62 73 79 73 74 65  d mutex subsyste
33100 6d 73 20 68 61 76 65 20 6e 6f 74 0a 2a 2a 20 6e  ms have not.** n
33110 65 63 65 73 73 61 72 69 6c 79 20 62 65 65 6e 20  ecessarily been 
33120 69 6e 69 74 69 61 6c 69 7a 65 64 20 77 68 65 6e  initialized when
33130 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
33140 20 63 61 6c 6c 65 64 2c 20 61 6e 64 20 73 6f 20   called, and so 
33150 74 68 65 79 0a 2a 2a 20 73 68 6f 75 6c 64 20 6e  they.** should n
33160 6f 74 20 62 65 20 75 73 65 64 2e 0a 2a 2f 0a 69  ot be used..*/.i
33170 6e 74 20 73 71 6c 69 74 65 33 5f 6f 73 5f 69 6e  nt sqlite3_os_in
33180 69 74 28 76 6f 69 64 29 7b 20 0a 20 20 2f 2a 20  it(void){ .  /* 
33190 0a 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  .  ** The follow
331a0 69 6e 67 20 6d 61 63 72 6f 20 64 65 66 69 6e 65  ing macro define
331b0 73 20 61 6e 20 69 6e 69 74 69 61 6c 69 7a 65 72  s an initializer
331c0 20 66 6f 72 20 61 6e 20 73 71 6c 69 74 65 33 5f   for an sqlite3_
331d0 76 66 73 20 6f 62 6a 65 63 74 2e 0a 20 20 2a 2a  vfs object..  **
331e0 20 54 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   The name of the
331f0 20 56 46 53 20 69 73 20 4e 41 4d 45 2e 20 20 54   VFS is NAME.  T
33200 68 65 20 70 41 70 70 44 61 74 61 20 69 73 20 61  he pAppData is a
33210 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 70 6f   pointer to a po
33220 69 6e 74 65 72 0a 20 20 2a 2a 20 74 6f 20 74 68  inter.  ** to th
33230 65 20 22 66 69 6e 64 65 72 22 20 66 75 6e 63 74  e "finder" funct
33240 69 6f 6e 2e 20 20 28 70 41 70 70 44 61 74 61 20  ion.  (pAppData 
33250 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
33260 61 20 70 6f 69 6e 74 65 72 20 62 65 63 61 75 73  a pointer becaus
33270 65 0a 20 20 2a 2a 20 73 69 6c 6c 79 20 43 39 30  e.  ** silly C90
33280 20 72 75 6c 65 73 20 70 72 6f 68 69 62 69 74 20   rules prohibit 
33290 61 20 76 6f 69 64 2a 20 66 72 6f 6d 20 62 65 69  a void* from bei
332a0 6e 67 20 63 61 73 74 20 74 6f 20 61 20 66 75 6e  ng cast to a fun
332b0 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 0a 20 20  ction pointer.  
332c0 2a 2a 20 61 6e 64 20 73 6f 20 77 65 20 68 61 76  ** and so we hav
332d0 65 20 74 6f 20 67 6f 20 74 68 72 6f 75 67 68 20  e to go through 
332e0 74 68 65 20 69 6e 74 65 72 6d 65 64 69 61 74 65  the intermediate
332f0 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 76 6f 69   pointer to avoi
33300 64 20 70 72 6f 62 6c 65 6d 73 0a 20 20 2a 2a 20  d problems.  ** 
33310 77 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67 20 77  when compiling w
33320 69 74 68 20 2d 70 65 64 61 6e 74 69 63 2d 65 72  ith -pedantic-er
33330 72 6f 72 73 20 6f 6e 20 47 43 43 2e 29 0a 20 20  rors on GCC.).  
33340 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 46 49 4e 44  **.  ** The FIND
33350 45 52 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20  ER parameter to 
33360 74 68 69 73 20 6d 61 63 72 6f 20 69 73 20 74 68  this macro is th
33370 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 70 6f  e name of the po
33380 69 6e 74 65 72 20 74 6f 20 74 68 65 0a 20 20 2a  inter to the.  *
33390 2a 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f  * finder-functio
333a0 6e 2e 20 20 54 68 65 20 66 69 6e 64 65 72 2d 66  n.  The finder-f
333b0 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
333c0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
333d0 0a 20 20 2a 2a 20 73 71 6c 69 74 65 5f 69 6f 5f  .  ** sqlite_io_
333e0 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 74  methods object t
333f0 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74  hat implements t
33400 68 65 20 64 65 73 69 72 65 64 20 6c 6f 63 6b 69  he desired locki
33410 6e 67 0a 20 20 2a 2a 20 62 65 68 61 76 69 6f 72  ng.  ** behavior
33420 73 2e 20 20 53 65 65 20 74 68 65 20 64 69 76 69  s.  See the divi
33430 73 69 6f 6e 20 61 62 6f 76 65 20 74 68 61 74 20  sion above that 
33440 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 49 4f 4d  contains the IOM
33450 45 54 48 4f 44 53 0a 20 20 2a 2a 20 6d 61 63 72  ETHODS.  ** macr
33460 6f 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 20 69  o for addition i
33470 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 66 69  nformation on fi
33480 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 73 2e 0a  nder-functions..
33490 20 20 2a 2a 0a 20 20 2a 2a 20 4d 6f 73 74 20 66    **.  ** Most f
334a0 69 6e 64 65 72 73 20 73 69 6d 70 6c 79 20 72 65  inders simply re
334b0 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
334c0 6f 20 61 20 66 69 78 65 64 20 73 71 6c 69 74 65  o a fixed sqlite
334d0 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 0a 20 20 2a  3_io_methods.  *
334e0 2a 20 6f 62 6a 65 63 74 2e 20 20 42 75 74 20 74  * object.  But t
334f0 68 65 20 22 61 75 74 6f 6c 6f 63 6b 49 6f 46 69  he "autolockIoFi
33500 6e 64 65 72 22 20 61 76 61 69 6c 61 62 6c 65 20  nder" available 
33510 6f 6e 20 4d 61 63 4f 53 58 20 64 6f 65 73 20 61  on MacOSX does a
33520 20 6c 69 74 74 6c 65 0a 20 20 2a 2a 20 6d 6f 72   little.  ** mor
33530 65 20 74 68 61 6e 20 74 68 61 74 3b 20 69 74 20  e than that; it 
33540 6c 6f 6f 6b 73 20 61 74 20 74 68 65 20 66 69 6c  looks at the fil
33550 65 73 79 73 74 65 6d 20 74 79 70 65 20 74 68 61  esystem type tha
33560 74 20 68 6f 73 74 73 20 74 68 65 20 0a 20 20 2a  t hosts the .  *
33570 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  * database file 
33580 61 6e 64 20 74 72 69 65 73 20 74 6f 20 63 68 6f  and tries to cho
33590 6f 73 65 20 61 6e 20 6c 6f 63 6b 69 6e 67 20 6d  ose an locking m
335a0 65 74 68 6f 64 20 61 70 70 72 6f 70 72 69 61 74  ethod appropriat
335b0 65 20 66 6f 72 0a 20 20 2a 2a 20 74 68 61 74 20  e for.  ** that 
335c0 66 69 6c 65 73 79 73 74 65 6d 20 74 69 6d 65 2e  filesystem time.
335d0 0a 20 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20  .  */.  #define 
335e0 55 4e 49 58 56 46 53 28 56 46 53 4e 41 4d 45 2c  UNIXVFS(VFSNAME,
335f0 20 46 49 4e 44 45 52 29 20 7b 20 20 20 20 20 20   FINDER) {      
33600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33610 20 20 5c 0a 20 20 20 20 32 2c 20 20 20 20 20 20    \.    2,      
33620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
33630 20 69 56 65 72 73 69 6f 6e 20 2a 2f 20 20 20 20   iVersion */    
33640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33650 5c 0a 20 20 20 20 73 69 7a 65 6f 66 28 75 6e 69  \.    sizeof(uni
33660 78 46 69 6c 65 29 2c 20 20 20 20 20 2f 2a 20 73  xFile),     /* s
33670 7a 4f 73 46 69 6c 65 20 2a 2f 20 20 20 20 20 20  zOsFile */      
33680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
33690 20 20 20 20 4d 41 58 5f 50 41 54 48 4e 41 4d 45      MAX_PATHNAME
336a0 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 6d 78 50  ,         /* mxP
336b0 61 74 68 6e 61 6d 65 20 2a 2f 20 20 20 20 20 20  athname */      
336c0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
336d0 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
336e0 20 20 20 20 20 20 20 20 2f 2a 20 70 4e 65 78 74          /* pNext
336f0 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
33700 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
33710 56 46 53 4e 41 4d 45 2c 20 20 20 20 20 20 20 20  VFSNAME,        
33720 20 20 20 20 20 20 2f 2a 20 7a 4e 61 6d 65 20 2a        /* zName *
33730 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
33740 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 28 76          \.    (v
33750 6f 69 64 2a 29 26 46 49 4e 44 45 52 2c 20 20 20  oid*)&FINDER,   
33760 20 20 20 20 2f 2a 20 70 41 70 70 44 61 74 61 20      /* pAppData 
33770 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
33780 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78        \.    unix
33790 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20  Open,           
337a0 20 20 2f 2a 20 78 4f 70 65 6e 20 2a 2f 20 20 20    /* xOpen */   
337b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
337c0 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 44 65      \.    unixDe
337d0 6c 65 74 65 2c 20 20 20 20 20 20 20 20 20 20 20  lete,           
337e0 2f 2a 20 78 44 65 6c 65 74 65 20 2a 2f 20 20 20  /* xDelete */   
337f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33800 20 20 5c 0a 20 20 20 20 75 6e 69 78 41 63 63 65    \.    unixAcce
33810 73 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ss,           /*
33820 20 78 41 63 63 65 73 73 20 2a 2f 20 20 20 20 20   xAccess */     
33830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33840 5c 0a 20 20 20 20 75 6e 69 78 46 75 6c 6c 50 61  \.    unixFullPa
33850 74 68 6e 61 6d 65 2c 20 20 20 20 20 2f 2a 20 78  thname,     /* x
33860 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 2a 2f 20  FullPathname */ 
33870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
33880 20 20 20 20 75 6e 69 78 44 6c 4f 70 65 6e 2c 20      unixDlOpen, 
33890 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c            /* xDl
338a0 4f 70 65 6e 20 2a 2f 20 20 20 20 20 20 20 20 20  Open */         
338b0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
338c0 20 20 75 6e 69 78 44 6c 45 72 72 6f 72 2c 20 20    unixDlError,  
338d0 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 45 72          /* xDlEr
338e0 72 6f 72 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ror */          
338f0 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
33900 75 6e 69 78 44 6c 53 79 6d 2c 20 20 20 20 20 20  unixDlSym,      
33910 20 20 20 20 20 20 2f 2a 20 78 44 6c 53 79 6d 20        /* xDlSym 
33920 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
33930 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e          \.    un
33940 69 78 44 6c 43 6c 6f 73 65 2c 20 20 20 20 20 20  ixDlClose,      
33950 20 20 20 20 2f 2a 20 78 44 6c 43 6c 6f 73 65 20      /* xDlClose 
33960 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
33970 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78        \.    unix
33980 52 61 6e 64 6f 6d 6e 65 73 73 2c 20 20 20 20 20  Randomness,     
33990 20 20 2f 2a 20 78 52 61 6e 64 6f 6d 6e 65 73 73    /* xRandomness
339a0 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
339b0 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 53 6c      \.    unixSl
339c0 65 65 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  eep,            
339d0 2f 2a 20 78 53 6c 65 65 70 20 2a 2f 20 20 20 20  /* xSleep */    
339e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
339f0 20 20 5c 0a 20 20 20 20 75 6e 69 78 43 75 72 72    \.    unixCurr
33a00 65 6e 74 54 69 6d 65 2c 20 20 20 20 20 20 2f 2a  entTime,      /*
33a10 20 78 43 75 72 72 65 6e 74 54 69 6d 65 20 2a 2f   xCurrentTime */
33a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33a30 5c 0a 20 20 20 20 75 6e 69 78 47 65 74 4c 61 73  \.    unixGetLas
33a40 74 45 72 72 6f 72 2c 20 20 20 20 20 2f 2a 20 78  tError,     /* x
33a50 47 65 74 4c 61 73 74 45 72 72 6f 72 20 2a 2f 20  GetLastError */ 
33a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
33a70 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20      0,          
33a80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52 65            /* xRe
33a90 6e 61 6d 65 20 2a 2f 20 20 20 20 20 20 20 20 20  name */         
33aa0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
33ab0 20 20 75 6e 69 78 43 75 72 72 65 6e 74 54 69 6d    unixCurrentTim
33ac0 65 49 6e 74 36 34 2c 20 2f 2a 20 78 43 75 72 72  eInt64, /* xCurr
33ad0 65 6e 74 54 69 6d 65 49 6e 74 36 34 20 2a 2f 20  entTimeInt64 */ 
33ae0 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 7d 0a            \.  }.
33af0 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 20 64  .  /*.  ** All d
33b00 65 66 61 75 6c 74 20 56 46 53 65 73 20 66 6f 72  efault VFSes for
33b10 20 75 6e 69 78 20 61 72 65 20 63 6f 6e 74 61 69   unix are contai
33b20 6e 65 64 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f  ned in the follo
33b30 77 69 6e 67 20 61 72 72 61 79 2e 0a 20 20 2a 2a  wing array..  **
33b40 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  .  ** Note that 
33b50 74 68 65 20 73 71 6c 69 74 65 33 5f 76 66 73 2e  the sqlite3_vfs.
33b60 70 4e 65 78 74 20 66 69 65 6c 64 20 6f 66 20 74  pNext field of t
33b70 68 65 20 56 46 53 20 6f 62 6a 65 63 74 20 69 73  he VFS object is
33b80 20 6d 6f 64 69 66 69 65 64 0a 20 20 2a 2a 20 62   modified.  ** b
33b90 79 20 74 68 65 20 53 51 4c 69 74 65 20 63 6f 72  y the SQLite cor
33ba0 65 20 77 68 65 6e 20 74 68 65 20 56 46 53 20 69  e when the VFS i
33bb0 73 20 72 65 67 69 73 74 65 72 65 64 2e 20 20 53  s registered.  S
33bc0 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a  o the following.
33bd0 20 20 2a 2a 20 61 72 72 61 79 20 63 61 6e 6e 6f    ** array canno
33be0 74 20 62 65 20 63 6f 6e 73 74 2e 0a 20 20 2a 2f  t be const..  */
33bf0 0a 20 20 73 74 61 74 69 63 20 73 71 6c 69 74 65  .  static sqlite
33c00 33 5f 76 66 73 20 61 56 66 73 5b 5d 20 3d 20 7b  3_vfs aVfs[] = {
33c10 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
33c20 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
33c30 20 26 26 20 28 4f 53 5f 56 58 57 4f 52 4b 53 20   && (OS_VXWORKS 
33c40 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  || defined(__APP
33c50 4c 45 5f 5f 29 29 0a 20 20 20 20 55 4e 49 58 56  LE__)).    UNIXV
33c60 46 53 28 22 75 6e 69 78 22 2c 20 20 20 20 20 20  FS("unix",      
33c70 20 20 20 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69      autolockIoFi
33c80 6e 64 65 72 20 29 2c 0a 23 65 6c 73 65 0a 20 20  nder ),.#else.  
33c90 20 20 55 4e 49 58 56 46 53 28 22 75 6e 69 78 22    UNIXVFS("unix"
33ca0 2c 20 20 20 20 20 20 20 20 20 20 70 6f 73 69 78  ,          posix
33cb0 49 6f 46 69 6e 64 65 72 20 29 2c 0a 23 65 6e 64  IoFinder ),.#end
33cc0 69 66 0a 20 20 20 20 55 4e 49 58 56 46 53 28 22  if.    UNIXVFS("
33cd0 75 6e 69 78 2d 6e 6f 6e 65 22 2c 20 20 20 20 20  unix-none",     
33ce0 6e 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 20 29  nolockIoFinder )
33cf0 2c 0a 20 20 20 20 55 4e 49 58 56 46 53 28 22 75  ,.    UNIXVFS("u
33d00 6e 69 78 2d 64 6f 74 66 69 6c 65 22 2c 20 20 64  nix-dotfile",  d
33d10 6f 74 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 20 29  otlockIoFinder )
33d20 2c 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  ,.#if OS_VXWORKS
33d30 0a 20 20 20 20 55 4e 49 58 56 46 53 28 22 75 6e  .    UNIXVFS("un
33d40 69 78 2d 6e 61 6d 65 64 73 65 6d 22 2c 20 73 65  ix-namedsem", se
33d50 6d 49 6f 46 69 6e 64 65 72 20 29 2c 0a 23 65 6e  mIoFinder ),.#en
33d60 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 45  dif.#if SQLITE_E
33d70 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
33d80 59 4c 45 0a 20 20 20 20 55 4e 49 58 56 46 53 28  YLE.    UNIXVFS(
33d90 22 75 6e 69 78 2d 70 6f 73 69 78 22 2c 20 20 20  "unix-posix",   
33da0 20 70 6f 73 69 78 49 6f 46 69 6e 64 65 72 20 29   posixIoFinder )
33db0 2c 0a 23 69 66 20 21 4f 53 5f 56 58 57 4f 52 4b  ,.#if !OS_VXWORK
33dc0 53 0a 20 20 20 20 55 4e 49 58 56 46 53 28 22 75  S.    UNIXVFS("u
33dd0 6e 69 78 2d 66 6c 6f 63 6b 22 2c 20 20 20 20 66  nix-flock",    f
33de0 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 20 29 2c 0a  lockIoFinder ),.
33df0 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 23 69  #endif.#endif.#i
33e00 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
33e10 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26  LOCKING_STYLE &&
33e20 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
33e30 5f 5f 29 0a 20 20 20 20 55 4e 49 58 56 46 53 28  __).    UNIXVFS(
33e40 22 75 6e 69 78 2d 61 66 70 22 2c 20 20 20 20 20  "unix-afp",     
33e50 20 61 66 70 49 6f 46 69 6e 64 65 72 20 29 2c 0a   afpIoFinder ),.
33e60 20 20 20 20 55 4e 49 58 56 46 53 28 22 75 6e 69      UNIXVFS("uni
33e70 78 2d 6e 66 73 22 2c 20 20 20 20 20 20 6e 66 73  x-nfs",      nfs
33e80 49 6f 46 69 6e 64 65 72 20 29 2c 0a 20 20 20 20  IoFinder ),.    
33e90 55 4e 49 58 56 46 53 28 22 75 6e 69 78 2d 70 72  UNIXVFS("unix-pr
33ea0 6f 78 79 22 2c 20 20 20 20 70 72 6f 78 79 49 6f  oxy",    proxyIo
33eb0 46 69 6e 64 65 72 20 29 2c 0a 23 65 6e 64 69 66  Finder ),.#endif
33ec0 0a 20 20 7d 3b 0a 20 20 75 6e 73 69 67 6e 65 64  .  };.  unsigned
33ed0 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
33ee0 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
33ef0 20 2a 2f 0a 0a 20 20 2f 2a 20 52 65 67 69 73 74   */..  /* Regist
33f00 65 72 20 61 6c 6c 20 56 46 53 65 73 20 64 65 66  er all VFSes def
33f10 69 6e 65 64 20 69 6e 20 74 68 65 20 61 56 66 73  ined in the aVfs
33f20 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 66 6f  [] array */.  fo
33f30 72 28 69 3d 30 3b 20 69 3c 28 73 69 7a 65 6f 66  r(i=0; i<(sizeof
33f40 28 61 56 66 73 29 2f 73 69 7a 65 6f 66 28 73 71  (aVfs)/sizeof(sq
33f50 6c 69 74 65 33 5f 76 66 73 29 29 3b 20 69 2b 2b  lite3_vfs)); i++
33f60 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76  ){.    sqlite3_v
33f70 66 73 5f 72 65 67 69 73 74 65 72 28 26 61 56 66  fs_register(&aVf
33f80 73 5b 69 5d 2c 20 69 3d 3d 30 29 3b 0a 20 20 7d  s[i], i==0);.  }
33f90 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
33fa0 5f 4f 4b 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  _OK; .}../*.** S
33fb0 68 75 74 64 6f 77 6e 20 74 68 65 20 6f 70 65 72  hutdown the oper
33fc0 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69 6e 74  ating system int
33fd0 65 72 66 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 53 6f  erface..**.** So
33fe0 6d 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  me operating sys
33ff0 74 65 6d 73 20 6d 69 67 68 74 20 6e 65 65 64 20  tems might need 
34000 74 6f 20 64 6f 20 73 6f 6d 65 20 63 6c 65 61 6e  to do some clean
34010 75 70 20 69 6e 20 74 68 69 73 20 72 6f 75 74 69  up in this routi
34020 6e 65 2c 0a 2a 2a 20 74 6f 20 72 65 6c 65 61 73  ne,.** to releas
34030 65 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c  e dynamically al
34040 6c 6f 63 61 74 65 64 20 6f 62 6a 65 63 74 73 2e  located objects.
34050 20 20 42 75 74 20 6e 6f 74 20 6f 6e 20 75 6e 69    But not on uni
34060 78 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  x..** This routi
34070 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f  ne is a no-op fo
34080 72 20 75 6e 69 78 2e 0a 2a 2f 0a 69 6e 74 20 73  r unix..*/.int s
34090 71 6c 69 74 65 33 5f 6f 73 5f 65 6e 64 28 76 6f  qlite3_os_end(vo
340a0 69 64 29 7b 20 0a 20 20 72 65 74 75 72 6e 20 53  id){ .  return S
340b0 51 4c 49 54 45 5f 4f 4b 3b 20 0a 7d 0a 20 0a 23  QLITE_OK; .}. .#
340c0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
340d0 4f 53 5f 55 4e 49 58 20 2a 2f 0a                 OS_UNIX */.