/ Hex Artifact Content
Login

Artifact 2ce91d5d9a8d0e8d4d2ed3bcb510d19945b77bc5:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 4d 61 79 20 32  /*.** 2004 May 2
0010: 32 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  2.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
0180: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74   file contains t
0190: 68 65 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74  he VFS implement
01a0: 61 74 69 6f 6e 20 66 6f 72 20 75 6e 69 78 2d 6c  ation for unix-l
01b0: 69 6b 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  ike operating sy
01c0: 73 74 65 6d 73 0a 2a 2a 20 69 6e 63 6c 75 64 65  stems.** include
01d0: 20 4c 69 6e 75 78 2c 20 4d 61 63 4f 53 58 2c 20   Linux, MacOSX, 
01e0: 2a 42 53 44 2c 20 51 4e 58 2c 20 56 78 57 6f 72  *BSD, QNX, VxWor
01f0: 6b 73 2c 20 41 49 58 2c 20 48 50 55 58 2c 20 61  ks, AIX, HPUX, a
0200: 6e 64 20 6f 74 68 65 72 73 2e 0a 2a 2a 0a 2a 2a  nd others..**.**
0210: 20 54 68 65 72 65 20 61 72 65 20 61 63 74 75 61   There are actua
0220: 6c 6c 79 20 73 65 76 65 72 61 6c 20 64 69 66 66  lly several diff
0230: 65 72 65 6e 74 20 56 46 53 20 69 6d 70 6c 65 6d  erent VFS implem
0240: 65 6e 74 61 74 69 6f 6e 73 20 69 6e 20 74 68 69  entations in thi
0250: 73 20 66 69 6c 65 2e 0a 2a 2a 20 54 68 65 20 64  s file..** The d
0260: 69 66 66 65 72 65 6e 63 65 73 20 61 72 65 20 69  ifferences are i
0270: 6e 20 74 68 65 20 77 61 79 20 74 68 61 74 20 66  n the way that f
0280: 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20 64  ile locking is d
0290: 6f 6e 65 2e 20 20 54 68 65 20 64 65 66 61 75 6c  one.  The defaul
02a0: 74 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74  t.** implementat
02b0: 69 6f 6e 20 75 73 65 73 20 50 6f 73 69 78 20 41  ion uses Posix A
02c0: 64 76 69 73 6f 72 79 20 4c 6f 63 6b 73 2e 20 20  dvisory Locks.  
02d0: 41 6c 74 65 72 6e 61 74 69 76 65 20 69 6d 70 6c  Alternative impl
02e0: 65 6d 65 6e 74 61 74 69 6f 6e 73 0a 2a 2a 20 75  ementations.** u
02f0: 73 65 20 66 6c 6f 63 6b 28 29 2c 20 64 6f 74 2d  se flock(), dot-
0300: 66 69 6c 65 73 2c 20 76 61 72 69 6f 75 73 20 70  files, various p
0310: 72 6f 70 72 69 65 74 61 72 79 20 6c 6f 63 6b 69  roprietary locki
0320: 6e 67 20 73 63 68 65 6d 61 73 2c 20 6f 72 20 73  ng schemas, or s
0330: 69 6d 70 6c 79 0a 2a 2a 20 73 6b 69 70 20 6c 6f  imply.** skip lo
0340: 63 6b 69 6e 67 20 61 6c 6c 20 74 6f 67 65 74 68  cking all togeth
0350: 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73  er..**.** This s
0360: 6f 75 72 63 65 20 66 69 6c 65 20 69 73 20 6f 72  ource file is or
0370: 67 61 6e 69 7a 65 64 20 69 6e 74 6f 20 64 69 76  ganized into div
0380: 69 73 69 6f 6e 73 20 77 68 65 72 65 20 74 68 65  isions where the
0390: 20 6c 6f 67 69 63 20 66 6f 72 20 76 61 72 69 6f   logic for vario
03a0: 75 73 0a 2a 2a 20 73 75 62 66 75 6e 63 74 69 6f  us.** subfunctio
03b0: 6e 73 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20  ns is contained 
03c0: 77 69 74 68 69 6e 20 74 68 65 20 61 70 70 72 6f  within the appro
03d0: 70 72 69 61 74 65 20 64 69 76 69 73 69 6f 6e 2e  priate division.
03e0: 20 20 50 4c 45 41 53 45 0a 2a 2a 20 4b 45 45 50    PLEASE.** KEEP
03f0: 20 54 48 45 20 53 54 52 55 43 54 55 52 45 20 4f   THE STRUCTURE O
0400: 46 20 54 48 49 53 20 46 49 4c 45 20 49 4e 54 41  F THIS FILE INTA
0410: 43 54 2e 20 20 4e 65 77 20 63 6f 64 65 20 73 68  CT.  New code sh
0420: 6f 75 6c 64 20 62 65 20 70 6c 61 63 65 64 0a 2a  ould be placed.*
0430: 2a 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74  * in the correct
0440: 20 64 69 76 69 73 69 6f 6e 20 61 6e 64 20 73 68   division and sh
0450: 6f 75 6c 64 20 62 65 20 63 6c 65 61 72 6c 79 20  ould be clearly 
0460: 6c 61 62 65 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  labeled..**.** T
0470: 68 65 20 6c 61 79 6f 75 74 20 6f 66 20 64 69 76  he layout of div
0480: 69 73 69 6f 6e 73 20 69 73 20 61 73 20 66 6f 6c  isions is as fol
0490: 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  lows:.**.**   * 
04a0: 20 47 65 6e 65 72 61 6c 2d 70 75 72 70 6f 73 65   General-purpose
04b0: 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 20 61 6e   declarations an
04c0: 64 20 75 74 69 6c 69 74 79 20 66 75 6e 63 74 69  d utility functi
04d0: 6f 6e 73 2e 0a 2a 2a 20 20 20 2a 20 20 55 6e 69  ons..**   *  Uni
04e0: 71 75 65 20 66 69 6c 65 20 49 44 20 6c 6f 67 69  que file ID logi
04f0: 63 20 75 73 65 64 20 62 79 20 56 78 57 6f 72 6b  c used by VxWork
0500: 73 2e 0a 2a 2a 20 20 20 2a 20 20 56 61 72 69 6f  s..**   *  Vario
0510: 75 73 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69  us locking primi
0520: 74 69 76 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  tive implementat
0530: 69 6f 6e 73 20 28 61 6c 6c 20 65 78 63 65 70 74  ions (all except
0540: 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 29 3a   proxy locking):
0550: 0a 2a 2a 20 20 20 20 20 20 2b 20 66 6f 72 20 50  .**      + for P
0560: 6f 73 69 78 20 41 64 76 69 73 6f 72 79 20 4c 6f  osix Advisory Lo
0570: 63 6b 73 0a 2a 2a 20 20 20 20 20 20 2b 20 66 6f  cks.**      + fo
0580: 72 20 6e 6f 2d 6f 70 20 6c 6f 63 6b 73 0a 2a 2a  r no-op locks.**
0590: 20 20 20 20 20 20 2b 20 66 6f 72 20 64 6f 74 2d        + for dot-
05a0: 66 69 6c 65 20 6c 6f 63 6b 73 0a 2a 2a 20 20 20  file locks.**   
05b0: 20 20 20 2b 20 66 6f 72 20 66 6c 6f 63 6b 28 29     + for flock()
05c0: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   locking.**     
05d0: 20 2b 20 66 6f 72 20 6e 61 6d 65 64 20 73 65 6d   + for named sem
05e0: 61 70 68 6f 72 65 20 6c 6f 63 6b 73 20 28 56 78  aphore locks (Vx
05f0: 57 6f 72 6b 73 20 6f 6e 6c 79 29 0a 2a 2a 20 20  Works only).**  
0600: 20 20 20 20 2b 20 66 6f 72 20 41 46 50 20 66 69      + for AFP fi
0610: 6c 65 73 79 73 74 65 6d 20 6c 6f 63 6b 73 20 28  lesystem locks (
0620: 4d 61 63 4f 53 58 20 6f 6e 6c 79 29 0a 2a 2a 20  MacOSX only).** 
0630: 20 20 2a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c    *  sqlite3_fil
0640: 65 20 6d 65 74 68 6f 64 73 20 6e 6f 74 20 61 73  e methods not as
0650: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 6c 6f  sociated with lo
0660: 63 6b 69 6e 67 2e 0a 2a 2a 20 20 20 2a 20 20 44  cking..**   *  D
0670: 65 66 69 6e 69 74 69 6f 6e 73 20 6f 66 20 73 71  efinitions of sq
0680: 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
0690: 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 61 6c 6c   objects for all
06a0: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   locking.**     
06b0: 20 6d 65 74 68 6f 64 73 20 70 6c 75 73 20 22 66   methods plus "f
06c0: 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 73  inder" functions
06d0: 20 66 6f 72 20 65 61 63 68 20 6c 6f 63 6b 69 6e   for each lockin
06e0: 67 20 6d 65 74 68 6f 64 2e 0a 2a 2a 20 20 20 2a  g method..**   *
06f0: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65    sqlite3_vfs me
0700: 74 68 6f 64 20 69 6d 70 6c 65 6d 65 6e 74 61 74  thod implementat
0710: 69 6f 6e 73 2e 0a 2a 2a 20 20 20 2a 20 20 4c 6f  ions..**   *  Lo
0720: 63 6b 69 6e 67 20 70 72 69 6d 69 74 69 76 65 73  cking primitives
0730: 20 66 6f 72 20 74 68 65 20 70 72 6f 78 79 20 75   for the proxy u
0740: 62 65 72 2d 6c 6f 63 6b 69 6e 67 2d 6d 65 74 68  ber-locking-meth
0750: 6f 64 2e 20 28 4d 61 63 4f 53 58 20 6f 6e 6c 79  od. (MacOSX only
0760: 29 0a 2a 2a 20 20 20 2a 20 20 44 65 66 69 6e 69  ).**   *  Defini
0770: 74 69 6f 6e 73 20 6f 66 20 73 71 6c 69 74 65 33  tions of sqlite3
0780: 5f 76 66 73 20 6f 62 6a 65 63 74 73 20 66 6f 72  _vfs objects for
0790: 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6d 65 74   all locking met
07a0: 68 6f 64 73 0a 2a 2a 20 20 20 20 20 20 70 6c 75  hods.**      plu
07b0: 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  s implementation
07c0: 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 6f 73 5f  s of sqlite3_os_
07d0: 69 6e 69 74 28 29 20 61 6e 64 20 73 71 6c 69 74  init() and sqlit
07e0: 65 33 5f 6f 73 5f 65 6e 64 28 29 2e 0a 2a 2f 0a  e3_os_end()..*/.
07f0: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0800: 49 6e 74 2e 68 22 0a 23 69 66 20 53 51 4c 49 54  Int.h".#if SQLIT
0810: 45 5f 4f 53 5f 55 4e 49 58 20 20 20 20 20 20 20  E_OS_UNIX       
0820: 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 66         /* This f
0830: 69 6c 65 20 69 73 20 75 73 65 64 20 6f 6e 20 75  ile is used on u
0840: 6e 69 78 20 6f 6e 6c 79 20 2a 2f 0a 0a 2f 2a 0a  nix only */../*.
0850: 2a 2a 20 54 68 65 72 65 20 61 72 65 20 76 61 72  ** There are var
0860: 69 6f 75 73 20 6d 65 74 68 6f 64 73 20 66 6f 72  ious methods for
0870: 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 75 73   file locking us
0880: 65 64 20 66 6f 72 20 63 6f 6e 63 75 72 72 65 6e  ed for concurren
0890: 63 79 0a 2a 2a 20 63 6f 6e 74 72 6f 6c 3a 0a 2a  cy.** control:.*
08a0: 2a 0a 2a 2a 20 20 20 31 2e 20 50 4f 53 49 58 20  *.**   1. POSIX 
08b0: 6c 6f 63 6b 69 6e 67 20 28 74 68 65 20 64 65 66  locking (the def
08c0: 61 75 6c 74 29 2c 0a 2a 2a 20 20 20 32 2e 20 4e  ault),.**   2. N
08d0: 6f 20 6c 6f 63 6b 69 6e 67 2c 0a 2a 2a 20 20 20  o locking,.**   
08e0: 33 2e 20 44 6f 74 2d 66 69 6c 65 20 6c 6f 63 6b  3. Dot-file lock
08f0: 69 6e 67 2c 0a 2a 2a 20 20 20 34 2e 20 66 6c 6f  ing,.**   4. flo
0900: 63 6b 28 29 20 6c 6f 63 6b 69 6e 67 2c 0a 2a 2a  ck() locking,.**
0910: 20 20 20 35 2e 20 41 46 50 20 6c 6f 63 6b 69 6e     5. AFP lockin
0920: 67 20 28 4f 53 58 20 6f 6e 6c 79 29 2c 0a 2a 2a  g (OSX only),.**
0930: 20 20 20 36 2e 20 4e 61 6d 65 64 20 50 4f 53 49     6. Named POSI
0940: 58 20 73 65 6d 61 70 68 6f 72 65 73 20 28 56 58  X semaphores (VX
0950: 57 6f 72 6b 73 20 6f 6e 6c 79 29 2c 0a 2a 2a 20  Works only),.** 
0960: 20 20 37 2e 20 70 72 6f 78 79 20 6c 6f 63 6b 69    7. proxy locki
0970: 6e 67 2e 20 28 4f 53 58 20 6f 6e 6c 79 29 0a 2a  ng. (OSX only).*
0980: 2a 0a 2a 2a 20 53 74 79 6c 65 73 20 34 2c 20 35  *.** Styles 4, 5
0990: 2c 20 61 6e 64 20 37 20 61 72 65 20 6f 6e 6c 79  , and 7 are only
09a0: 20 61 76 61 69 6c 61 62 6c 65 20 6f 66 20 53 51   available of SQ
09b0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
09c0: 49 4e 47 5f 53 54 59 4c 45 0a 2a 2a 20 69 73 20  ING_STYLE.** is 
09d0: 64 65 66 69 6e 65 64 20 74 6f 20 31 2e 20 20 54  defined to 1.  T
09e0: 68 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  he SQLITE_ENABLE
09f0: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 61  _LOCKING_STYLE a
0a00: 6c 73 6f 20 65 6e 61 62 6c 65 73 20 61 75 74 6f  lso enables auto
0a10: 6d 61 74 69 63 0a 2a 2a 20 73 65 6c 65 63 74 69  matic.** selecti
0a20: 6f 6e 20 6f 66 20 74 68 65 20 61 70 70 72 6f 70  on of the approp
0a30: 72 69 61 74 65 20 6c 6f 63 6b 69 6e 67 20 73 74  riate locking st
0a40: 79 6c 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65  yle based on the
0a50: 20 66 69 6c 65 73 79 73 74 65 6d 0a 2a 2a 20 77   filesystem.** w
0a60: 68 65 72 65 20 74 68 65 20 64 61 74 61 62 61 73  here the databas
0a70: 65 20 69 73 20 6c 6f 63 61 74 65 64 2e 20 20 0a  e is located.  .
0a80: 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
0a90: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
0aa0: 43 4b 49 4e 47 5f 53 54 59 4c 45 29 0a 23 20 20  CKING_STYLE).#  
0ab0: 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
0ac0: 4c 45 5f 5f 29 0a 23 20 20 20 20 64 65 66 69 6e  LE__).#    defin
0ad0: 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  e SQLITE_ENABLE_
0ae0: 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 31 0a  LOCKING_STYLE 1.
0af0: 23 20 20 65 6c 73 65 0a 23 20 20 20 20 64 65 66  #  else.#    def
0b00: 69 6e 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ine SQLITE_ENABL
0b10: 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
0b20: 30 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69  0.#  endif.#endi
0b30: 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65 20  f../*.** Define 
0b40: 74 68 65 20 4f 53 5f 56 58 57 4f 52 4b 53 20 70  the OS_VXWORKS p
0b50: 72 65 2d 70 72 6f 63 65 73 73 6f 72 20 6d 61 63  re-processor mac
0b60: 72 6f 20 74 6f 20 31 20 69 66 20 62 75 69 6c 64  ro to 1 if build
0b70: 69 6e 67 20 6f 6e 20 0a 2a 2a 20 76 78 77 6f 72  ing on .** vxwor
0b80: 6b 73 2c 20 6f 72 20 30 20 6f 74 68 65 72 77 69  ks, or 0 otherwi
0b90: 73 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4f  se..*/.#ifndef O
0ba0: 53 5f 56 58 57 4f 52 4b 53 0a 23 20 20 69 66 20  S_VXWORKS.#  if 
0bb0: 64 65 66 69 6e 65 64 28 5f 5f 52 54 50 5f 5f 29  defined(__RTP__)
0bc0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 57 52 53   || defined(_WRS
0bd0: 5f 4b 45 52 4e 45 4c 29 0a 23 20 20 20 20 64 65  _KERNEL).#    de
0be0: 66 69 6e 65 20 4f 53 5f 56 58 57 4f 52 4b 53 20  fine OS_VXWORKS 
0bf0: 31 0a 23 20 20 65 6c 73 65 0a 23 20 20 20 20 64  1.#  else.#    d
0c00: 65 66 69 6e 65 20 4f 53 5f 56 58 57 4f 52 4b 53  efine OS_VXWORKS
0c10: 20 30 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64   0.#  endif.#end
0c20: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20  if../*.** These 
0c30: 23 64 65 66 69 6e 65 73 20 73 68 6f 75 6c 64 20  #defines should 
0c40: 65 6e 61 62 6c 65 20 3e 32 47 42 20 66 69 6c 65  enable >2GB file
0c50: 20 73 75 70 70 6f 72 74 20 6f 6e 20 50 6f 73 69   support on Posi
0c60: 78 20 69 66 20 74 68 65 0a 2a 2a 20 75 6e 64 65  x if the.** unde
0c70: 72 6c 79 69 6e 67 20 6f 70 65 72 61 74 69 6e 67  rlying operating
0c80: 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 73   system supports
0c90: 20 69 74 2e 20 20 49 66 20 74 68 65 20 4f 53 20   it.  If the OS 
0ca0: 6c 61 63 6b 73 0a 2a 2a 20 6c 61 72 67 65 20 66  lacks.** large f
0cb0: 69 6c 65 20 73 75 70 70 6f 72 74 2c 20 74 68 65  ile support, the
0cc0: 73 65 20 73 68 6f 75 6c 64 20 62 65 20 6e 6f 2d  se should be no-
0cd0: 6f 70 73 2e 0a 2a 2a 0a 2a 2a 20 4c 61 72 67 65  ops..**.** Large
0ce0: 20 66 69 6c 65 20 73 75 70 70 6f 72 74 20 63 61   file support ca
0cf0: 6e 20 62 65 20 64 69 73 61 62 6c 65 64 20 75 73  n be disabled us
0d00: 69 6e 67 20 74 68 65 20 2d 44 53 51 4c 49 54 45  ing the -DSQLITE
0d10: 5f 44 49 53 41 42 4c 45 5f 4c 46 53 20 73 77 69  _DISABLE_LFS swi
0d20: 74 63 68 0a 2a 2a 20 6f 6e 20 74 68 65 20 63 6f  tch.** on the co
0d30: 6d 70 69 6c 65 72 20 63 6f 6d 6d 61 6e 64 20 6c  mpiler command l
0d40: 69 6e 65 2e 20 20 54 68 69 73 20 69 73 20 6e 65  ine.  This is ne
0d50: 63 65 73 73 61 72 79 20 69 66 20 79 6f 75 20 61  cessary if you a
0d60: 72 65 20 63 6f 6d 70 69 6c 69 6e 67 0a 2a 2a 20  re compiling.** 
0d70: 6f 6e 20 61 20 72 65 63 65 6e 74 20 6d 61 63 68  on a recent mach
0d80: 69 6e 65 20 28 65 78 3a 20 52 65 64 48 61 74 20  ine (ex: RedHat 
0d90: 37 2e 32 29 20 62 75 74 20 79 6f 75 20 77 61 6e  7.2) but you wan
0da0: 74 20 79 6f 75 72 20 63 6f 64 65 20 74 6f 20 77  t your code to w
0db0: 6f 72 6b 0a 2a 2a 20 6f 6e 20 61 6e 20 6f 6c 64  ork.** on an old
0dc0: 65 72 20 6d 61 63 68 69 6e 65 20 28 65 78 3a 20  er machine (ex: 
0dd0: 52 65 64 48 61 74 20 36 2e 30 29 2e 20 20 49 66  RedHat 6.0).  If
0de0: 20 79 6f 75 20 63 6f 6d 70 69 6c 65 20 6f 6e 20   you compile on 
0df0: 52 65 64 48 61 74 20 37 2e 32 0a 2a 2a 20 77 69  RedHat 7.2.** wi
0e00: 74 68 6f 75 74 20 74 68 69 73 20 6f 70 74 69 6f  thout this optio
0e10: 6e 2c 20 4c 46 53 20 69 73 20 65 6e 61 62 6c 65  n, LFS is enable
0e20: 2e 20 20 42 75 74 20 4c 46 53 20 64 6f 65 73 20  .  But LFS does 
0e30: 6e 6f 74 20 65 78 69 73 74 20 69 6e 20 74 68 65  not exist in the
0e40: 20 6b 65 72 6e 65 6c 0a 2a 2a 20 69 6e 20 52 65   kernel.** in Re
0e50: 64 48 61 74 20 36 2e 30 2c 20 73 6f 20 74 68 65  dHat 6.0, so the
0e60: 20 63 6f 64 65 20 77 6f 6e 27 74 20 77 6f 72 6b   code won't work
0e70: 2e 20 20 48 65 6e 63 65 2c 20 66 6f 72 20 6d 61  .  Hence, for ma
0e80: 78 69 6d 75 6d 20 62 69 6e 61 72 79 0a 2a 2a 20  ximum binary.** 
0e90: 70 6f 72 74 61 62 69 6c 69 74 79 20 79 6f 75 20  portability you 
0ea0: 73 68 6f 75 6c 64 20 6f 6d 69 74 20 4c 46 53 2e  should omit LFS.
0eb0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 65 76 69  .**.** The previ
0ec0: 6f 75 73 20 70 61 72 61 67 72 61 70 68 20 77 61  ous paragraph wa
0ed0: 73 20 77 72 69 74 74 65 6e 20 69 6e 20 32 30 30  s written in 200
0ee0: 35 2e 20 20 28 54 68 69 73 20 70 61 72 61 67 72  5.  (This paragr
0ef0: 61 70 68 20 69 73 20 77 72 69 74 74 65 6e 0a 2a  aph is written.*
0f00: 2a 20 6f 6e 20 32 30 30 38 2d 31 31 2d 32 38 2e  * on 2008-11-28.
0f10: 29 20 54 68 65 73 65 20 64 61 79 73 2c 20 61 6c  ) These days, al
0f20: 6c 20 4c 69 6e 75 78 20 6b 65 72 6e 65 6c 73 20  l Linux kernels 
0f30: 73 75 70 70 6f 72 74 20 6c 61 72 67 65 20 66 69  support large fi
0f40: 6c 65 73 2c 20 73 6f 0a 2a 2a 20 79 6f 75 20 73  les, so.** you s
0f50: 68 6f 75 6c 64 20 70 72 6f 62 61 62 6c 79 20 6c  hould probably l
0f60: 65 61 76 65 20 4c 46 53 20 65 6e 61 62 6c 65 64  eave LFS enabled
0f70: 2e 20 20 42 75 74 20 73 6f 6d 65 20 65 6d 62 65  .  But some embe
0f80: 64 64 65 64 20 70 6c 61 74 66 6f 72 6d 73 20 6d  dded platforms m
0f90: 69 67 68 74 0a 2a 2a 20 6c 61 63 6b 20 4c 46 53  ight.** lack LFS
0fa0: 20 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 74   in which case t
0fb0: 68 65 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c  he SQLITE_DISABL
0fc0: 45 5f 4c 46 53 20 6d 61 63 72 6f 20 6d 69 67 68  E_LFS macro migh
0fd0: 74 20 73 74 69 6c 6c 20 62 65 20 75 73 65 66 75  t still be usefu
0fe0: 6c 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  l..*/.#ifndef SQ
0ff0: 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 4c 46 53  LITE_DISABLE_LFS
1000: 0a 23 20 64 65 66 69 6e 65 20 5f 4c 41 52 47 45  .# define _LARGE
1010: 5f 46 49 4c 45 20 20 20 20 20 20 20 31 0a 23 20  _FILE       1.# 
1020: 69 66 6e 64 65 66 20 5f 46 49 4c 45 5f 4f 46 46  ifndef _FILE_OFF
1030: 53 45 54 5f 42 49 54 53 0a 23 20 20 20 64 65 66  SET_BITS.#   def
1040: 69 6e 65 20 5f 46 49 4c 45 5f 4f 46 46 53 45 54  ine _FILE_OFFSET
1050: 5f 42 49 54 53 20 36 34 0a 23 20 65 6e 64 69 66  _BITS 64.# endif
1060: 0a 23 20 64 65 66 69 6e 65 20 5f 4c 41 52 47 45  .# define _LARGE
1070: 46 49 4c 45 5f 53 4f 55 52 43 45 20 31 0a 23 65  FILE_SOURCE 1.#e
1080: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 73 74 61 6e  ndif../*.** stan
1090: 64 61 72 64 20 69 6e 63 6c 75 64 65 20 66 69 6c  dard include fil
10a0: 65 73 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20  es..*/.#include 
10b0: 3c 73 79 73 2f 74 79 70 65 73 2e 68 3e 0a 23 69  <sys/types.h>.#i
10c0: 6e 63 6c 75 64 65 20 3c 73 79 73 2f 73 74 61 74  nclude <sys/stat
10d0: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 66 63  .h>.#include <fc
10e0: 6e 74 6c 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  ntl.h>.#include 
10f0: 3c 75 6e 69 73 74 64 2e 68 3e 0a 23 69 6e 63 6c  <unistd.h>.#incl
1100: 75 64 65 20 3c 74 69 6d 65 2e 68 3e 0a 23 69 6e  ude <time.h>.#in
1110: 63 6c 75 64 65 20 3c 73 79 73 2f 74 69 6d 65 2e  clude <sys/time.
1120: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 65 72 72  h>.#include <err
1130: 6e 6f 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  no.h>.#include <
1140: 73 79 73 2f 6d 6d 61 6e 2e 68 3e 0a 0a 23 69 66  sys/mman.h>..#if
1150: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
1160: 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 23 20 69  OCKING_STYLE.# i
1170: 6e 63 6c 75 64 65 20 3c 73 79 73 2f 69 6f 63 74  nclude <sys/ioct
1180: 6c 2e 68 3e 0a 23 20 69 66 20 4f 53 5f 56 58 57  l.h>.# if OS_VXW
1190: 4f 52 4b 53 0a 23 20 20 69 6e 63 6c 75 64 65 20  ORKS.#  include 
11a0: 3c 73 65 6d 61 70 68 6f 72 65 2e 68 3e 0a 23 20  <semaphore.h>.# 
11b0: 20 69 6e 63 6c 75 64 65 20 3c 6c 69 6d 69 74 73   include <limits
11c0: 2e 68 3e 0a 23 20 65 6c 73 65 0a 23 20 20 69 6e  .h>.# else.#  in
11d0: 63 6c 75 64 65 20 3c 73 79 73 2f 66 69 6c 65 2e  clude <sys/file.
11e0: 68 3e 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c 73  h>.#  include <s
11f0: 79 73 2f 70 61 72 61 6d 2e 68 3e 0a 23 20 65 6e  ys/param.h>.# en
1200: 64 69 66 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  dif.#endif /* SQ
1210: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
1220: 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a 23 69  ING_STYLE */..#i
1230: 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
1240: 45 5f 5f 29 20 7c 7c 20 28 53 51 4c 49 54 45 5f  E__) || (SQLITE_
1250: 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
1260: 54 59 4c 45 20 26 26 20 21 4f 53 5f 56 58 57 4f  TYLE && !OS_VXWO
1270: 52 4b 53 29 0a 23 20 69 6e 63 6c 75 64 65 20 3c  RKS).# include <
1280: 73 79 73 2f 6d 6f 75 6e 74 2e 68 3e 0a 23 65 6e  sys/mount.h>.#en
1290: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77  dif../*.** Allow
12a0: 65 64 20 76 61 6c 75 65 73 20 6f 66 20 75 6e 69  ed values of uni
12b0: 78 46 69 6c 65 2e 66 73 46 6c 61 67 73 0a 2a 2f  xFile.fsFlags.*/
12c0: 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  .#define SQLITE_
12d0: 46 53 46 4c 41 47 53 5f 49 53 5f 4d 53 44 4f 53  FSFLAGS_IS_MSDOS
12e0: 20 20 20 20 20 30 78 31 0a 0a 2f 2a 0a 2a 2a 20       0x1../*.** 
12f0: 49 66 20 77 65 20 61 72 65 20 74 6f 20 62 65 20  If we are to be 
1300: 74 68 72 65 61 64 2d 73 61 66 65 2c 20 69 6e 63  thread-safe, inc
1310: 6c 75 64 65 20 74 68 65 20 70 74 68 72 65 61 64  lude the pthread
1320: 73 20 68 65 61 64 65 72 20 61 6e 64 20 64 65 66  s header and def
1330: 69 6e 65 0a 2a 2a 20 74 68 65 20 53 51 4c 49 54  ine.** the SQLIT
1340: 45 5f 55 4e 49 58 5f 54 48 52 45 41 44 53 20 6d  E_UNIX_THREADS m
1350: 61 63 72 6f 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c  acro..*/.#if SQL
1360: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a 23  ITE_THREADSAFE.#
1370: 20 69 6e 63 6c 75 64 65 20 3c 70 74 68 72 65 61   include <pthrea
1380: 64 2e 68 3e 0a 23 20 64 65 66 69 6e 65 20 53 51  d.h>.# define SQ
1390: 4c 49 54 45 5f 55 4e 49 58 5f 54 48 52 45 41 44  LITE_UNIX_THREAD
13a0: 53 20 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  S 1.#endif../*.*
13b0: 2a 20 44 65 66 61 75 6c 74 20 70 65 72 6d 69 73  * Default permis
13c0: 73 69 6f 6e 73 20 77 68 65 6e 20 63 72 65 61 74  sions when creat
13d0: 69 6e 67 20 61 20 6e 65 77 20 66 69 6c 65 0a 2a  ing a new file.*
13e0: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
13f0: 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45  _DEFAULT_FILE_PE
1400: 52 4d 49 53 53 49 4f 4e 53 0a 23 20 64 65 66 69  RMISSIONS.# defi
1410: 6e 65 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  ne SQLITE_DEFAUL
1420: 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f  T_FILE_PERMISSIO
1430: 4e 53 20 30 36 34 34 0a 23 65 6e 64 69 66 0a 0a  NS 0644.#endif..
1440: 2f 2a 0a 20 2a 2a 20 44 65 66 61 75 6c 74 20 70  /*. ** Default p
1450: 65 72 6d 69 73 73 69 6f 6e 73 20 77 68 65 6e 20  ermissions when 
1460: 63 72 65 61 74 69 6e 67 20 61 75 74 6f 20 70 72  creating auto pr
1470: 6f 78 79 20 64 69 72 0a 20 2a 2f 0a 23 69 66 6e  oxy dir. */.#ifn
1480: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55  def SQLITE_DEFAU
1490: 4c 54 5f 50 52 4f 58 59 44 49 52 5f 50 45 52 4d  LT_PROXYDIR_PERM
14a0: 49 53 53 49 4f 4e 53 0a 23 20 64 65 66 69 6e 65  ISSIONS.# define
14b0: 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
14c0: 50 52 4f 58 59 44 49 52 5f 50 45 52 4d 49 53 53  PROXYDIR_PERMISS
14d0: 49 4f 4e 53 20 30 37 35 35 0a 23 65 6e 64 69 66  IONS 0755.#endif
14e0: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20  ../*.** Maximum 
14f0: 73 75 70 70 6f 72 74 65 64 20 70 61 74 68 2d 6c  supported path-l
1500: 65 6e 67 74 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e  ength..*/.#defin
1510: 65 20 4d 41 58 5f 50 41 54 48 4e 41 4d 45 20 35  e MAX_PATHNAME 5
1520: 31 32 0a 0a 2f 2a 0a 2a 2a 20 4f 6e 6c 79 20 73  12../*.** Only s
1530: 65 74 20 74 68 65 20 6c 61 73 74 45 72 72 6e 6f  et the lastErrno
1540: 20 69 66 20 74 68 65 20 65 72 72 6f 72 20 63 6f   if the error co
1550: 64 65 20 69 73 20 61 20 72 65 61 6c 20 65 72 72  de is a real err
1560: 6f 72 20 61 6e 64 20 6e 6f 74 20 0a 2a 2a 20 61  or and not .** a
1570: 20 6e 6f 72 6d 61 6c 20 65 78 70 65 63 74 65 64   normal expected
1580: 20 72 65 74 75 72 6e 20 63 6f 64 65 20 6f 66 20   return code of 
1590: 53 51 4c 49 54 45 5f 42 55 53 59 20 6f 72 20 53  SQLITE_BUSY or S
15a0: 51 4c 49 54 45 5f 4f 4b 0a 2a 2f 0a 23 64 65 66  QLITE_OK.*/.#def
15b0: 69 6e 65 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  ine IS_LOCK_ERRO
15c0: 52 28 78 29 20 20 28 28 78 20 21 3d 20 53 51 4c  R(x)  ((x != SQL
15d0: 49 54 45 5f 4f 4b 29 20 26 26 20 28 78 20 21 3d  ITE_OK) && (x !=
15e0: 20 53 51 4c 49 54 45 5f 42 55 53 59 29 29 0a 0a   SQLITE_BUSY))..
15f0: 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73  ./*.** Sometimes
1600: 2c 20 61 66 74 65 72 20 61 20 66 69 6c 65 20 68  , after a file h
1610: 61 6e 64 6c 65 20 69 73 20 63 6c 6f 73 65 64 20  andle is closed 
1620: 62 79 20 53 51 4c 69 74 65 2c 20 74 68 65 20 66  by SQLite, the f
1630: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 0a 2a  ile descriptor.*
1640: 2a 20 63 61 6e 6e 6f 74 20 62 65 20 63 6c 6f 73  * cannot be clos
1650: 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20  ed immediately. 
1660: 49 6e 20 74 68 65 73 65 20 63 61 73 65 73 2c 20  In these cases, 
1670: 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68 65  instances of the
1680: 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74   following.** st
1690: 72 75 63 74 75 72 65 20 61 72 65 20 75 73 65 64  ructure are used
16a0: 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 66 69   to store the fi
16b0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 77 68  le descriptor wh
16c0: 69 6c 65 20 77 61 69 74 69 6e 67 20 66 6f 72 20  ile waiting for 
16d0: 61 6e 0a 2a 2a 20 6f 70 70 6f 72 74 75 6e 69 74  an.** opportunit
16e0: 79 20 74 6f 20 65 69 74 68 65 72 20 63 6c 6f 73  y to either clos
16f0: 65 20 6f 72 20 72 65 75 73 65 20 69 74 2e 0a 2a  e or reuse it..*
1700: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
1710: 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 55 6e   UnixUnusedFd Un
1720: 69 78 55 6e 75 73 65 64 46 64 3b 0a 73 74 72 75  ixUnusedFd;.stru
1730: 63 74 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20  ct UnixUnusedFd 
1740: 7b 0a 20 20 69 6e 74 20 66 64 3b 20 20 20 20 20  {.  int fd;     
1750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1760: 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   File descriptor
1770: 20 74 6f 20 63 6c 6f 73 65 20 2a 2f 0a 20 20 69   to close */.  i
1780: 6e 74 20 66 6c 61 67 73 3b 20 20 20 20 20 20 20  nt flags;       
1790: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67           /* Flag
17a0: 73 20 74 68 69 73 20 66 69 6c 65 20 64 65 73 63  s this file desc
17b0: 72 69 70 74 6f 72 20 77 61 73 20 6f 70 65 6e 65  riptor was opene
17c0: 64 20 77 69 74 68 20 2a 2f 0a 20 20 55 6e 69 78  d with */.  Unix
17d0: 55 6e 75 73 65 64 46 64 20 2a 70 4e 65 78 74 3b  UnusedFd *pNext;
17e0: 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 75 6e        /* Next un
17f0: 75 73 65 64 20 66 69 6c 65 20 64 65 73 63 72 69  used file descri
1800: 70 74 6f 72 20 6f 6e 20 73 61 6d 65 20 66 69 6c  ptor on same fil
1810: 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54  e */.};../*.** T
1820: 68 65 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75  he unixFile stru
1830: 63 74 75 72 65 20 69 73 20 73 75 62 63 6c 61 73  cture is subclas
1840: 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 66 69 6c  s of sqlite3_fil
1850: 65 20 73 70 65 63 69 66 69 63 20 74 6f 20 74 68  e specific to th
1860: 65 20 75 6e 69 78 0a 2a 2a 20 56 46 53 20 69 6d  e unix.** VFS im
1870: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 2e 0a 2a  plementations..*
1880: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
1890: 20 75 6e 69 78 46 69 6c 65 20 75 6e 69 78 46 69   unixFile unixFi
18a0: 6c 65 3b 0a 73 74 72 75 63 74 20 75 6e 69 78 46  le;.struct unixF
18b0: 69 6c 65 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f  ile {.  sqlite3_
18c0: 69 6f 5f 6d 65 74 68 6f 64 73 20 63 6f 6e 73 74  io_methods const
18d0: 20 2a 70 4d 65 74 68 6f 64 3b 20 20 2f 2a 20 41   *pMethod;  /* A
18e0: 6c 77 61 79 73 20 74 68 65 20 66 69 72 73 74 20  lways the first 
18f0: 65 6e 74 72 79 20 2a 2f 0a 20 20 73 74 72 75 63  entry */.  struc
1900: 74 20 75 6e 69 78 4f 70 65 6e 43 6e 74 20 2a 70  t unixOpenCnt *p
1910: 4f 70 65 6e 3b 20 20 20 20 20 20 20 2f 2a 20 49  Open;       /* I
1920: 6e 66 6f 20 61 62 6f 75 74 20 61 6c 6c 20 6f 70  nfo about all op
1930: 65 6e 20 66 64 27 73 20 6f 6e 20 74 68 69 73 20  en fd's on this 
1940: 69 6e 6f 64 65 20 2a 2f 0a 20 20 73 74 72 75 63  inode */.  struc
1950: 74 20 75 6e 69 78 4c 6f 63 6b 49 6e 66 6f 20 2a  t unixLockInfo *
1960: 70 4c 6f 63 6b 3b 20 20 20 20 20 20 2f 2a 20 49  pLock;      /* I
1970: 6e 66 6f 20 61 62 6f 75 74 20 6c 6f 63 6b 73 20  nfo about locks 
1980: 6f 6e 20 74 68 69 73 20 69 6e 6f 64 65 20 2a 2f  on this inode */
1990: 0a 20 20 69 6e 74 20 68 3b 20 20 20 20 20 20 20  .  int h;       
19a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19b0: 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20      /* The file 
19c0: 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20  descriptor */.  
19d0: 69 6e 74 20 64 69 72 66 64 3b 20 20 20 20 20 20  int dirfd;      
19e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19f0: 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70   /* File descrip
1a00: 74 6f 72 20 66 6f 72 20 74 68 65 20 64 69 72 65  tor for the dire
1a10: 63 74 6f 72 79 20 2a 2f 0a 20 20 75 6e 73 69 67  ctory */.  unsig
1a20: 6e 65 64 20 63 68 61 72 20 6c 6f 63 6b 74 79 70  ned char locktyp
1a30: 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  e;          /* T
1a40: 68 65 20 74 79 70 65 20 6f 66 20 6c 6f 63 6b 20  he type of lock 
1a50: 68 65 6c 64 20 6f 6e 20 74 68 69 73 20 66 64 20  held on this fd 
1a60: 2a 2f 0a 20 20 69 6e 74 20 6c 61 73 74 45 72 72  */.  int lastErr
1a70: 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  no;             
1a80: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 69        /* The uni
1a90: 78 20 65 72 72 6e 6f 20 66 72 6f 6d 20 74 68 65  x errno from the
1aa0: 20 6c 61 73 74 20 49 2f 4f 20 65 72 72 6f 72 20   last I/O error 
1ab0: 2a 2f 0a 20 20 76 6f 69 64 20 2a 6c 6f 63 6b 69  */.  void *locki
1ac0: 6e 67 43 6f 6e 74 65 78 74 3b 20 20 20 20 20 20  ngContext;      
1ad0: 20 20 20 20 20 20 2f 2a 20 4c 6f 63 6b 69 6e 67        /* Locking
1ae0: 20 73 74 79 6c 65 20 73 70 65 63 69 66 69 63 20   style specific 
1af0: 73 74 61 74 65 20 2a 2f 0a 20 20 55 6e 69 78 55  state */.  UnixU
1b00: 6e 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64  nusedFd *pUnused
1b10: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ;           /* P
1b20: 72 65 2d 61 6c 6c 6f 63 61 74 65 64 20 55 6e 69  re-allocated Uni
1b30: 78 55 6e 75 73 65 64 46 64 20 2a 2f 0a 20 20 69  xUnusedFd */.  i
1b40: 6e 74 20 66 69 6c 65 46 6c 61 67 73 3b 20 20 20  nt fileFlags;   
1b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b60: 2f 2a 20 4d 69 73 63 65 6c 6c 61 6e 6f 75 73 20  /* Miscellanous 
1b70: 66 6c 61 67 73 20 2a 2f 0a 23 69 66 20 53 51 4c  flags */.#if SQL
1b80: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
1b90: 4e 47 5f 53 54 59 4c 45 0a 20 20 69 6e 74 20 6f  NG_STYLE.  int o
1ba0: 70 65 6e 46 6c 61 67 73 3b 20 20 20 20 20 20 20  penFlags;       
1bb0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1bc0: 68 65 20 66 6c 61 67 73 20 73 70 65 63 69 66 69  he flags specifi
1bd0: 65 64 20 61 74 20 6f 70 65 6e 28 29 20 2a 2f 0a  ed at open() */.
1be0: 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
1bf0: 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
1c00: 5f 53 54 59 4c 45 20 7c 7c 20 64 65 66 69 6e 65  _STYLE || define
1c10: 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 75  d(__APPLE__).  u
1c20: 6e 73 69 67 6e 65 64 20 66 73 46 6c 61 67 73 3b  nsigned fsFlags;
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c40: 20 2f 2a 20 63 61 63 68 65 64 20 64 65 74 61 69   /* cached detai
1c50: 6c 73 20 66 72 6f 6d 20 73 74 61 74 66 73 28 29  ls from statfs()
1c60: 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20 53   */.#endif.#if S
1c70: 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
1c80: 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 6c 69   && defined(__li
1c90: 6e 75 78 5f 5f 29 0a 20 20 70 74 68 72 65 61 64  nux__).  pthread
1ca0: 5f 74 20 74 69 64 3b 20 20 20 20 20 20 20 20 20  _t tid;         
1cb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1cc0: 20 74 68 72 65 61 64 20 74 68 61 74 20 22 6f 77   thread that "ow
1cd0: 6e 73 22 20 74 68 69 73 20 75 6e 69 78 46 69 6c  ns" this unixFil
1ce0: 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20  e */.#endif.#if 
1cf0: 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 69 6e 74  OS_VXWORKS.  int
1d00: 20 69 73 44 65 6c 65 74 65 3b 20 20 20 20 20 20   isDelete;      
1d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d20: 20 44 65 6c 65 74 65 20 6f 6e 20 63 6c 6f 73 65   Delete on close
1d30: 20 69 66 20 74 72 75 65 20 2a 2f 0a 20 20 73 74   if true */.  st
1d40: 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65  ruct vxworksFile
1d50: 49 64 20 2a 70 49 64 3b 20 20 20 20 20 20 20 2f  Id *pId;       /
1d60: 2a 20 55 6e 69 71 75 65 20 66 69 6c 65 20 49 44  * Unique file ID
1d70: 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64   */.#endif.#ifnd
1d80: 65 66 20 4e 44 45 42 55 47 0a 20 20 2f 2a 20 54  ef NDEBUG.  /* T
1d90: 68 65 20 6e 65 78 74 20 67 72 6f 75 70 20 6f 66  he next group of
1da0: 20 76 61 72 69 61 62 6c 65 73 20 61 72 65 20 75   variables are u
1db0: 73 65 64 20 74 6f 20 74 72 61 63 6b 20 77 68 65  sed to track whe
1dc0: 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 0a  ther or not the.
1dd0: 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
1de0: 20 63 6f 75 6e 74 65 72 20 69 6e 20 62 79 74 65   counter in byte
1df0: 73 20 32 34 2d 32 37 20 6f 66 20 64 61 74 61 62  s 24-27 of datab
1e00: 61 73 65 20 66 69 6c 65 73 20 61 72 65 20 75 70  ase files are up
1e10: 64 61 74 65 64 0a 20 20 2a 2a 20 77 68 65 6e 65  dated.  ** whene
1e20: 76 65 72 20 61 6e 79 20 70 61 72 74 20 6f 66 20  ver any part of 
1e30: 74 68 65 20 64 61 74 61 62 61 73 65 20 63 68 61  the database cha
1e40: 6e 67 65 73 2e 20 20 41 6e 20 61 73 73 65 72 74  nges.  An assert
1e50: 69 6f 6e 20 66 61 75 6c 74 20 77 69 6c 6c 0a 20  ion fault will. 
1e60: 20 2a 2a 20 6f 63 63 75 72 20 69 66 20 61 20 66   ** occur if a f
1e70: 69 6c 65 20 69 73 20 75 70 64 61 74 65 64 20 77  ile is updated w
1e80: 69 74 68 6f 75 74 20 61 6c 73 6f 20 75 70 64 61  ithout also upda
1e90: 74 69 6e 67 20 74 68 65 20 74 72 61 6e 73 61 63  ting the transac
1ea0: 74 69 6f 6e 0a 20 20 2a 2a 20 63 6f 75 6e 74 65  tion.  ** counte
1eb0: 72 2e 20 20 54 68 69 73 20 74 65 73 74 20 69 73  r.  This test is
1ec0: 20 6d 61 64 65 20 74 6f 20 61 76 6f 69 64 20 6e   made to avoid n
1ed0: 65 77 20 70 72 6f 62 6c 65 6d 73 20 73 69 6d 69  ew problems simi
1ee0: 6c 61 72 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20  lar to the.  ** 
1ef0: 6f 6e 65 20 64 65 73 63 72 69 62 65 64 20 62 79  one described by
1f00: 20 74 69 63 6b 65 74 20 23 33 35 38 34 2e 20 0a   ticket #3584. .
1f10: 20 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20    */.  unsigned 
1f20: 63 68 61 72 20 74 72 61 6e 73 43 6e 74 72 43 68  char transCntrCh
1f30: 6e 67 3b 20 20 20 2f 2a 20 54 72 75 65 20 69 66  ng;   /* True if
1f40: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1f50: 20 63 6f 75 6e 74 65 72 20 63 68 61 6e 67 65 64   counter changed
1f60: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
1f70: 68 61 72 20 64 62 55 70 64 61 74 65 3b 20 20 20  har dbUpdate;   
1f80: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
1f90: 61 6e 79 20 70 61 72 74 20 6f 66 20 64 61 74 61  any part of data
1fa0: 62 61 73 65 20 66 69 6c 65 20 63 68 61 6e 67 65  base file change
1fb0: 64 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  d */.  unsigned 
1fc0: 63 68 61 72 20 69 6e 4e 6f 72 6d 61 6c 57 72 69  char inNormalWri
1fd0: 74 65 3b 20 20 20 2f 2a 20 54 72 75 65 20 69 66  te;   /* True if
1fe0: 20 69 6e 20 61 20 6e 6f 72 6d 61 6c 20 77 72 69   in a normal wri
1ff0: 74 65 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a  te operation */.
2000: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51  #endif.#ifdef SQ
2010: 4c 49 54 45 5f 54 45 53 54 0a 20 20 2f 2a 20 49  LITE_TEST.  /* I
2020: 6e 20 74 65 73 74 20 6d 6f 64 65 2c 20 69 6e 63  n test mode, inc
2030: 72 65 61 73 65 20 74 68 65 20 73 69 7a 65 20 6f  rease the size o
2040: 66 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  f this structure
2050: 20 61 20 62 69 74 20 73 6f 20 74 68 61 74 20 0a   a bit so that .
2060: 20 20 2a 2a 20 69 74 20 69 73 20 6c 61 72 67 65    ** it is large
2070: 72 20 74 68 61 6e 20 74 68 65 20 73 74 72 75 63  r than the struc
2080: 74 20 43 72 61 73 68 46 69 6c 65 20 64 65 66 69  t CrashFile defi
2090: 6e 65 64 20 69 6e 20 74 65 73 74 36 2e 63 2e 0a  ned in test6.c..
20a0: 20 20 2a 2f 0a 20 20 63 68 61 72 20 61 50 61 64    */.  char aPad
20b0: 64 69 6e 67 5b 33 32 5d 3b 0a 23 65 6e 64 69 66  ding[32];.#endif
20c0: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  .};../*.** The f
20d0: 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 73 20  ollowing macros 
20e0: 64 65 66 69 6e 65 20 62 69 74 73 20 69 6e 20 75  define bits in u
20f0: 6e 69 78 46 69 6c 65 2e 66 69 6c 65 46 6c 61 67  nixFile.fileFlag
2100: 73 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 51 4c  s.*/.#define SQL
2110: 49 54 45 5f 57 48 4f 4c 45 5f 46 49 4c 45 5f 4c  ITE_WHOLE_FILE_L
2120: 4f 43 4b 49 4e 47 20 20 30 78 30 30 30 31 20 20  OCKING  0x0001  
2130: 20 2f 2a 20 55 73 65 20 77 68 6f 6c 65 2d 66 69   /* Use whole-fi
2140: 6c 65 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 0a 2f  le locking */../
2150: 2a 0a 2a 2a 20 49 6e 63 6c 75 64 65 20 63 6f 64  *.** Include cod
2160: 65 20 74 68 61 74 20 69 73 20 63 6f 6d 6d 6f 6e  e that is common
2170: 20 74 6f 20 61 6c 6c 20 6f 73 5f 2a 2e 63 20 66   to all os_*.c f
2180: 69 6c 65 73 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65  iles.*/.#include
2190: 20 22 6f 73 5f 63 6f 6d 6d 6f 6e 2e 68 22 0a 0a   "os_common.h"..
21a0: 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65 20 76 61 72  /*.** Define var
21b0: 69 6f 75 73 20 6d 61 63 72 6f 73 20 74 68 61 74  ious macros that
21c0: 20 61 72 65 20 6d 69 73 73 69 6e 67 20 66 72 6f   are missing fro
21d0: 6d 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 2e 0a  m some systems..
21e0: 2a 2f 0a 23 69 66 6e 64 65 66 20 4f 5f 4c 41 52  */.#ifndef O_LAR
21f0: 47 45 46 49 4c 45 0a 23 20 64 65 66 69 6e 65 20  GEFILE.# define 
2200: 4f 5f 4c 41 52 47 45 46 49 4c 45 20 30 0a 23 65  O_LARGEFILE 0.#e
2210: 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49  ndif.#ifdef SQLI
2220: 54 45 5f 44 49 53 41 42 4c 45 5f 4c 46 53 0a 23  TE_DISABLE_LFS.#
2230: 20 75 6e 64 65 66 20 4f 5f 4c 41 52 47 45 46 49   undef O_LARGEFI
2240: 4c 45 0a 23 20 64 65 66 69 6e 65 20 4f 5f 4c 41  LE.# define O_LA
2250: 52 47 45 46 49 4c 45 20 30 0a 23 65 6e 64 69 66  RGEFILE 0.#endif
2260: 0a 23 69 66 6e 64 65 66 20 4f 5f 4e 4f 46 4f 4c  .#ifndef O_NOFOL
2270: 4c 4f 57 0a 23 20 64 65 66 69 6e 65 20 4f 5f 4e  LOW.# define O_N
2280: 4f 46 4f 4c 4c 4f 57 20 30 0a 23 65 6e 64 69 66  OFOLLOW 0.#endif
2290: 0a 23 69 66 6e 64 65 66 20 4f 5f 42 49 4e 41 52  .#ifndef O_BINAR
22a0: 59 0a 23 20 64 65 66 69 6e 65 20 4f 5f 42 49 4e  Y.# define O_BIN
22b0: 41 52 59 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ARY 0.#endif../*
22c0: 0a 2a 2a 20 54 68 65 20 44 4a 47 50 50 20 63 6f  .** The DJGPP co
22d0: 6d 70 69 6c 65 72 20 65 6e 76 69 72 6f 6e 6d 65  mpiler environme
22e0: 6e 74 20 6c 6f 6f 6b 73 20 6d 6f 73 74 6c 79 20  nt looks mostly 
22f0: 6c 69 6b 65 20 55 6e 69 78 2c 20 62 75 74 20 69  like Unix, but i
2300: 74 0a 2a 2a 20 6c 61 63 6b 73 20 74 68 65 20 66  t.** lacks the f
2310: 63 6e 74 6c 28 29 20 73 79 73 74 65 6d 20 63 61  cntl() system ca
2320: 6c 6c 2e 20 20 53 6f 20 72 65 64 65 66 69 6e 65  ll.  So redefine
2330: 20 66 63 6e 74 6c 28 29 20 74 6f 20 62 65 20 73   fcntl() to be s
2340: 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 74 68 61 74  omething.** that
2350: 20 61 6c 77 61 79 73 20 73 75 63 63 65 65 64 73   always succeeds
2360: 2e 20 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68  .  This means th
2370: 61 74 20 6c 6f 63 6b 69 6e 67 20 64 6f 65 73 20  at locking does 
2380: 6e 6f 74 20 6f 63 63 75 72 20 75 6e 64 65 72 0a  not occur under.
2390: 2a 2a 20 44 4a 47 50 50 2e 20 20 42 75 74 20 69  ** DJGPP.  But i
23a0: 74 20 69 73 20 44 4f 53 20 2d 20 77 68 61 74 20  t is DOS - what 
23b0: 64 69 64 20 79 6f 75 20 65 78 70 65 63 74 3f 0a  did you expect?.
23c0: 2a 2f 0a 23 69 66 64 65 66 20 5f 5f 44 4a 47 50  */.#ifdef __DJGP
23d0: 50 5f 5f 0a 23 20 64 65 66 69 6e 65 20 66 63 6e  P__.# define fcn
23e0: 74 6c 28 41 2c 42 2c 43 29 20 30 0a 23 65 6e 64  tl(A,B,C) 0.#end
23f0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 68  if../*.** The th
2400: 72 65 61 64 69 64 20 6d 61 63 72 6f 20 72 65 73  readid macro res
2410: 6f 6c 76 65 73 20 74 6f 20 74 68 65 20 74 68 72  olves to the thr
2420: 65 61 64 2d 69 64 20 6f 72 20 74 6f 20 30 2e 20  ead-id or to 0. 
2430: 20 55 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73   Used for.** tes
2440: 74 69 6e 67 20 61 6e 64 20 64 65 62 75 67 67 69  ting and debuggi
2450: 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 20  ng only..*/.#if 
2460: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
2470: 45 0a 23 64 65 66 69 6e 65 20 74 68 72 65 61 64  E.#define thread
2480: 69 64 20 70 74 68 72 65 61 64 5f 73 65 6c 66 28  id pthread_self(
2490: 29 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20  ).#else.#define 
24a0: 74 68 72 65 61 64 69 64 20 30 0a 23 65 6e 64 69  threadid 0.#endi
24b0: 66 0a 0a 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72  f.../*.** Helper
24c0: 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 6f 62   functions to ob
24d0: 74 61 69 6e 20 61 6e 64 20 72 65 6c 69 6e 71 75  tain and relinqu
24e0: 69 73 68 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d  ish the global m
24f0: 75 74 65 78 2e 20 54 68 65 0a 2a 2a 20 67 6c 6f  utex. The.** glo
2500: 62 61 6c 20 6d 75 74 65 78 20 69 73 20 75 73 65  bal mutex is use
2510: 64 20 74 6f 20 70 72 6f 74 65 63 74 20 74 68 65  d to protect the
2520: 20 75 6e 69 78 4f 70 65 6e 43 6e 74 2c 20 75 6e   unixOpenCnt, un
2530: 69 78 4c 6f 63 6b 49 6e 66 6f 20 61 6e 64 0a 2a  ixLockInfo and.*
2540: 2a 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  * vxworksFileId 
2550: 6f 62 6a 65 63 74 73 20 75 73 65 64 20 62 79 20  objects used by 
2560: 74 68 69 73 20 66 69 6c 65 2c 20 61 6c 6c 20 6f  this file, all o
2570: 66 20 77 68 69 63 68 20 6d 61 79 20 62 65 20 0a  f which may be .
2580: 2a 2a 20 73 68 61 72 65 64 20 62 79 20 6d 75 6c  ** shared by mul
2590: 74 69 70 6c 65 20 74 68 72 65 61 64 73 2e 0a 2a  tiple threads..*
25a0: 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 20 75 6e  *.** Function un
25b0: 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 69 73  ixMutexHeld() is
25c0: 20 75 73 65 64 20 74 6f 20 61 73 73 65 72 74 28   used to assert(
25d0: 29 20 74 68 61 74 20 74 68 65 20 67 6c 6f 62 61  ) that the globa
25e0: 6c 20 6d 75 74 65 78 20 0a 2a 2a 20 69 73 20 68  l mutex .** is h
25f0: 65 6c 64 20 77 68 65 6e 20 72 65 71 75 69 72 65  eld when require
2600: 64 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  d. This function
2610: 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 61 73   is only used as
2620: 20 70 61 72 74 20 6f 66 20 61 73 73 65 72 74 28   part of assert(
2630: 29 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73  ) .** statements
2640: 2e 20 65 2e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 75  . e.g..**.**   u
2650: 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 0a  nixEnterMutex().
2660: 2a 2a 20 20 20 20 20 61 73 73 65 72 74 28 20 75  **     assert( u
2670: 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 29  nixMutexHeld() )
2680: 3b 0a 2a 2a 20 20 20 75 6e 69 78 45 6e 74 65 72  ;.**   unixEnter
2690: 4c 65 61 76 65 28 29 0a 2a 2f 0a 73 74 61 74 69  Leave().*/.stati
26a0: 63 20 76 6f 69 64 20 75 6e 69 78 45 6e 74 65 72  c void unixEnter
26b0: 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a 20 20 73  Mutex(void){.  s
26c0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
26d0: 65 72 28 73 71 6c 69 74 65 33 4d 75 74 65 78 41  er(sqlite3MutexA
26e0: 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
26f0: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29  X_STATIC_MASTER)
2700: 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  );.}.static void
2710: 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
2720: 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33  void){.  sqlite3
2730: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 73 71 6c  _mutex_leave(sql
2740: 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
2750: 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
2760: 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 23  IC_MASTER));.}.#
2770: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
2780: 55 47 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  UG.static int un
2790: 69 78 4d 75 74 65 78 48 65 6c 64 28 76 6f 69 64  ixMutexHeld(void
27a0: 29 20 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  ) {.  return sql
27b0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
27c0: 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
27d0: 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
27e0: 54 41 54 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a  TATIC_MASTER));.
27f0: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66 64 65  }.#endif...#ifde
2800: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f  f SQLITE_DEBUG./
2810: 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e 63  *.** Helper func
2820: 74 69 6f 6e 20 66 6f 72 20 70 72 69 6e 74 69 6e  tion for printin
2830: 67 20 6f 75 74 20 74 72 61 63 65 20 69 6e 66 6f  g out trace info
2840: 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 64 65 62  rmation from deb
2850: 75 67 67 69 6e 67 0a 2a 2a 20 62 69 6e 61 72 69  ugging.** binari
2860: 65 73 2e 20 54 68 69 73 20 72 65 74 75 72 6e 73  es. This returns
2870: 20 74 68 65 20 73 74 72 69 6e 67 20 72 65 70 72   the string repr
2880: 65 73 65 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  esetation of the
2890: 20 73 75 70 70 6c 69 65 64 0a 2a 2a 20 69 6e 74   supplied.** int
28a0: 65 67 65 72 20 6c 6f 63 6b 2d 74 79 70 65 2e 0a  eger lock-type..
28b0: 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
28c0: 63 68 61 72 20 2a 6c 6f 63 6b 74 79 70 65 4e 61  char *locktypeNa
28d0: 6d 65 28 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29  me(int locktype)
28e0: 7b 0a 20 20 73 77 69 74 63 68 28 20 6c 6f 63 6b  {.  switch( lock
28f0: 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65  type ){.    case
2900: 20 4e 4f 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e   NO_LOCK: return
2910: 20 22 4e 4f 4e 45 22 3b 0a 20 20 20 20 63 61 73   "NONE";.    cas
2920: 65 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3a 20 72  e SHARED_LOCK: r
2930: 65 74 75 72 6e 20 22 53 48 41 52 45 44 22 3b 0a  eturn "SHARED";.
2940: 20 20 20 20 63 61 73 65 20 52 45 53 45 52 56 45      case RESERVE
2950: 44 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22  D_LOCK: return "
2960: 52 45 53 45 52 56 45 44 22 3b 0a 20 20 20 20 63  RESERVED";.    c
2970: 61 73 65 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  ase PENDING_LOCK
2980: 3a 20 72 65 74 75 72 6e 20 22 50 45 4e 44 49 4e  : return "PENDIN
2990: 47 22 3b 0a 20 20 20 20 63 61 73 65 20 45 58 43  G";.    case EXC
29a0: 4c 55 53 49 56 45 5f 4c 4f 43 4b 3a 20 72 65 74  LUSIVE_LOCK: ret
29b0: 75 72 6e 20 22 45 58 43 4c 55 53 49 56 45 22 3b  urn "EXCLUSIVE";
29c0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 22 45  .  }.  return "E
29d0: 52 52 4f 52 22 3b 0a 7d 0a 23 65 6e 64 69 66 0a  RROR";.}.#endif.
29e0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4c  .#ifdef SQLITE_L
29f0: 4f 43 4b 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20  OCK_TRACE./*.** 
2a00: 50 72 69 6e 74 20 6f 75 74 20 69 6e 66 6f 72 6d  Print out inform
2a10: 61 74 69 6f 6e 20 61 62 6f 75 74 20 61 6c 6c 20  ation about all 
2a20: 6c 6f 63 6b 69 6e 67 20 6f 70 65 72 61 74 69 6f  locking operatio
2a30: 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ns..**.** This r
2a40: 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66  outine is used f
2a50: 6f 72 20 74 72 6f 75 62 6c 65 73 68 6f 6f 74 69  or troubleshooti
2a60: 6e 67 20 6c 6f 63 6b 73 20 6f 6e 20 6d 75 6c 74  ng locks on mult
2a70: 69 74 68 72 65 61 64 65 64 0a 2a 2a 20 70 6c 61  ithreaded.** pla
2a80: 74 66 6f 72 6d 73 2e 20 20 45 6e 61 62 6c 65 20  tforms.  Enable 
2a90: 62 79 20 63 6f 6d 70 69 6c 69 6e 67 20 77 69 74  by compiling wit
2aa0: 68 20 74 68 65 20 2d 44 53 51 4c 49 54 45 5f 4c  h the -DSQLITE_L
2ab0: 4f 43 4b 5f 54 52 41 43 45 0a 2a 2a 20 63 6f 6d  OCK_TRACE.** com
2ac0: 6d 61 6e 64 2d 6c 69 6e 65 20 6f 70 74 69 6f 6e  mand-line option
2ad0: 20 6f 6e 20 74 68 65 20 63 6f 6d 70 69 6c 65 72   on the compiler
2ae0: 2e 20 20 54 68 69 73 20 63 6f 64 65 20 69 73 20  .  This code is 
2af0: 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a 20 74 75 72 6e  normally.** turn
2b00: 65 64 20 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74 69  ed off..*/.stati
2b10: 63 20 69 6e 74 20 6c 6f 63 6b 54 72 61 63 65 28  c int lockTrace(
2b20: 69 6e 74 20 66 64 2c 20 69 6e 74 20 6f 70 2c 20  int fd, int op, 
2b30: 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 2a 70 29  struct flock *p)
2b40: 7b 0a 20 20 63 68 61 72 20 2a 7a 4f 70 4e 61 6d  {.  char *zOpNam
2b50: 65 2c 20 2a 7a 54 79 70 65 3b 0a 20 20 69 6e 74  e, *zType;.  int
2b60: 20 73 3b 0a 20 20 69 6e 74 20 73 61 76 65 64 45   s;.  int savedE
2b70: 72 72 6e 6f 3b 0a 20 20 69 66 28 20 6f 70 3d 3d  rrno;.  if( op==
2b80: 46 5f 47 45 54 4c 4b 20 29 7b 0a 20 20 20 20 7a  F_GETLK ){.    z
2b90: 4f 70 4e 61 6d 65 20 3d 20 22 47 45 54 4c 4b 22  OpName = "GETLK"
2ba0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70  ;.  }else if( op
2bb0: 3d 3d 46 5f 53 45 54 4c 4b 20 29 7b 0a 20 20 20  ==F_SETLK ){.   
2bc0: 20 7a 4f 70 4e 61 6d 65 20 3d 20 22 53 45 54 4c   zOpName = "SETL
2bd0: 4b 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  K";.  }else{.   
2be0: 20 73 20 3d 20 66 63 6e 74 6c 28 66 64 2c 20 6f   s = fcntl(fd, o
2bf0: 70 2c 20 70 29 3b 0a 20 20 20 20 73 71 6c 69 74  p, p);.    sqlit
2c00: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 66  e3DebugPrintf("f
2c10: 63 6e 74 6c 20 75 6e 6b 6e 6f 77 6e 20 25 64 20  cntl unknown %d 
2c20: 25 64 20 25 64 5c 6e 22 2c 20 66 64 2c 20 6f 70  %d %d\n", fd, op
2c30: 2c 20 73 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , s);.    return
2c40: 20 73 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d   s;.  }.  if( p-
2c50: 3e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44 4c 43 4b  >l_type==F_RDLCK
2c60: 20 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20   ){.    zType = 
2c70: 22 52 44 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73 65  "RDLCK";.  }else
2c80: 20 69 66 28 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d   if( p->l_type==
2c90: 46 5f 57 52 4c 43 4b 20 29 7b 0a 20 20 20 20 7a  F_WRLCK ){.    z
2ca0: 54 79 70 65 20 3d 20 22 57 52 4c 43 4b 22 3b 0a  Type = "WRLCK";.
2cb0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6c    }else if( p->l
2cc0: 5f 74 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29  _type==F_UNLCK )
2cd0: 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 22 55  {.    zType = "U
2ce0: 4e 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a  NLCK";.  }else{.
2cf0: 20 20 20 20 61 73 73 65 72 74 28 20 30 20 29 3b      assert( 0 );
2d00: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
2d10: 2d 3e 6c 5f 77 68 65 6e 63 65 3d 3d 53 45 45 4b  ->l_whence==SEEK
2d20: 5f 53 45 54 20 29 3b 0a 20 20 73 20 3d 20 66 63  _SET );.  s = fc
2d30: 6e 74 6c 28 66 64 2c 20 6f 70 2c 20 70 29 3b 0a  ntl(fd, op, p);.
2d40: 20 20 73 61 76 65 64 45 72 72 6e 6f 20 3d 20 65    savedErrno = e
2d50: 72 72 6e 6f 3b 0a 20 20 73 71 6c 69 74 65 33 44  rrno;.  sqlite3D
2d60: 65 62 75 67 50 72 69 6e 74 66 28 22 66 63 6e 74  ebugPrintf("fcnt
2d70: 6c 20 25 64 20 25 64 20 25 73 20 25 73 20 25 64  l %d %d %s %s %d
2d80: 20 25 64 20 25 64 20 25 64 5c 6e 22 2c 0a 20 20   %d %d %d\n",.  
2d90: 20 20 20 74 68 72 65 61 64 69 64 2c 20 66 64 2c     threadid, fd,
2da0: 20 7a 4f 70 4e 61 6d 65 2c 20 7a 54 79 70 65 2c   zOpName, zType,
2db0: 20 28 69 6e 74 29 70 2d 3e 6c 5f 73 74 61 72 74   (int)p->l_start
2dc0: 2c 20 28 69 6e 74 29 70 2d 3e 6c 5f 6c 65 6e 2c  , (int)p->l_len,
2dd0: 0a 20 20 20 20 20 28 69 6e 74 29 70 2d 3e 6c 5f  .     (int)p->l_
2de0: 70 69 64 2c 20 73 29 3b 0a 20 20 69 66 28 20 73  pid, s);.  if( s
2df0: 3d 3d 28 2d 31 29 20 26 26 20 6f 70 3d 3d 46 5f  ==(-1) && op==F_
2e00: 53 45 54 4c 4b 20 26 26 20 28 70 2d 3e 6c 5f 74  SETLK && (p->l_t
2e10: 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 7c 7c 20  ype==F_RDLCK || 
2e20: 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 57 52 4c  p->l_type==F_WRL
2e30: 43 4b 29 20 29 7b 0a 20 20 20 20 73 74 72 75 63  CK) ){.    struc
2e40: 74 20 66 6c 6f 63 6b 20 6c 32 3b 0a 20 20 20 20  t flock l2;.    
2e50: 6c 32 20 3d 20 2a 70 3b 0a 20 20 20 20 66 63 6e  l2 = *p;.    fcn
2e60: 74 6c 28 66 64 2c 20 46 5f 47 45 54 4c 4b 2c 20  tl(fd, F_GETLK, 
2e70: 26 6c 32 29 3b 0a 20 20 20 20 69 66 28 20 6c 32  &l2);.    if( l2
2e80: 2e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44 4c 43 4b  .l_type==F_RDLCK
2e90: 20 29 7b 0a 20 20 20 20 20 20 7a 54 79 70 65 20   ){.      zType 
2ea0: 3d 20 22 52 44 4c 43 4b 22 3b 0a 20 20 20 20 7d  = "RDLCK";.    }
2eb0: 65 6c 73 65 20 69 66 28 20 6c 32 2e 6c 5f 74 79  else if( l2.l_ty
2ec0: 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 7b 0a 20  pe==F_WRLCK ){. 
2ed0: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 57 52       zType = "WR
2ee0: 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c 73 65 20  LCK";.    }else 
2ef0: 69 66 28 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46  if( l2.l_type==F
2f00: 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20  _UNLCK ){.      
2f10: 7a 54 79 70 65 20 3d 20 22 55 4e 4c 43 4b 22 3b  zType = "UNLCK";
2f20: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2f30: 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a 20    assert( 0 );. 
2f40: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
2f50: 44 65 62 75 67 50 72 69 6e 74 66 28 22 66 63 6e  DebugPrintf("fcn
2f60: 74 6c 2d 66 61 69 6c 75 72 65 2d 72 65 61 73 6f  tl-failure-reaso
2f70: 6e 3a 20 25 73 20 25 64 20 25 64 20 25 64 5c 6e  n: %s %d %d %d\n
2f80: 22 2c 0a 20 20 20 20 20 20 20 7a 54 79 70 65 2c  ",.       zType,
2f90: 20 28 69 6e 74 29 6c 32 2e 6c 5f 73 74 61 72 74   (int)l2.l_start
2fa0: 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f 6c 65 6e 2c  , (int)l2.l_len,
2fb0: 20 28 69 6e 74 29 6c 32 2e 6c 5f 70 69 64 29 3b   (int)l2.l_pid);
2fc0: 0a 20 20 7d 0a 20 20 65 72 72 6e 6f 20 3d 20 73  .  }.  errno = s
2fd0: 61 76 65 64 45 72 72 6e 6f 3b 0a 20 20 72 65 74  avedErrno;.  ret
2fe0: 75 72 6e 20 73 3b 0a 7d 0a 23 64 65 66 69 6e 65  urn s;.}.#define
2ff0: 20 66 63 6e 74 6c 20 6c 6f 63 6b 54 72 61 63 65   fcntl lockTrace
3000: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
3010: 45 5f 4c 4f 43 4b 5f 54 52 41 43 45 20 2a 2f 0a  E_LOCK_TRACE */.
3020: 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  .../*.** This ro
3030: 75 74 69 6e 65 20 74 72 61 6e 73 6c 61 74 65 73  utine translates
3040: 20 61 20 73 74 61 6e 64 61 72 64 20 50 4f 53 49   a standard POSI
3050: 58 20 65 72 72 6e 6f 20 63 6f 64 65 20 69 6e 74  X errno code int
3060: 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 75  o something.** u
3070: 73 65 66 75 6c 20 74 6f 20 74 68 65 20 63 6c 69  seful to the cli
3080: 65 6e 74 73 20 6f 66 20 74 68 65 20 73 71 6c 69  ents of the sqli
3090: 74 65 33 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20  te3 functions.  
30a0: 53 70 65 63 69 66 69 63 61 6c 6c 79 2c 20 69 74  Specifically, it
30b0: 20 69 73 0a 2a 2a 20 69 6e 74 65 6e 64 65 64 20   is.** intended 
30c0: 74 6f 20 74 72 61 6e 73 6c 61 74 65 20 61 20 76  to translate a v
30d0: 61 72 69 65 74 79 20 6f 66 20 22 74 72 79 20 61  ariety of "try a
30e0: 67 61 69 6e 22 20 65 72 72 6f 72 73 20 69 6e 74  gain" errors int
30f0: 6f 20 53 51 4c 49 54 45 5f 42 55 53 59 0a 2a 2a  o SQLITE_BUSY.**
3100: 20 61 6e 64 20 61 20 76 61 72 69 65 74 79 20 6f   and a variety o
3110: 66 20 22 70 6c 65 61 73 65 20 63 6c 6f 73 65 20  f "please close 
3120: 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
3130: 74 6f 72 20 4e 4f 57 22 20 65 72 72 6f 72 73 20  tor NOW" errors 
3140: 69 6e 74 6f 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  into .** SQLITE_
3150: 49 4f 45 52 52 0a 2a 2a 20 0a 2a 2a 20 45 72 72  IOERR.** .** Err
3160: 6f 72 73 20 64 75 72 69 6e 67 20 69 6e 69 74 69  ors during initi
3170: 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 6c 6f 63  alization of loc
3180: 6b 73 2c 20 6f 72 20 66 69 6c 65 20 73 79 73 74  ks, or file syst
3190: 65 6d 20 73 75 70 70 6f 72 74 20 66 6f 72 20 6c  em support for l
31a0: 6f 63 6b 73 2c 0a 2a 2a 20 73 68 6f 75 6c 64 20  ocks,.** should 
31b0: 68 61 6e 64 6c 65 20 45 4e 4f 4c 43 4b 2c 20 45  handle ENOLCK, E
31c0: 4e 4f 54 53 55 50 2c 20 45 4f 50 4e 4f 54 53 55  NOTSUP, EOPNOTSU
31d0: 50 50 20 73 65 70 61 72 61 74 65 6c 79 2e 0a 2a  PP separately..*
31e0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c  /.static int sql
31f0: 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
3200: 78 45 72 72 6f 72 28 69 6e 74 20 70 6f 73 69 78  xError(int posix
3210: 45 72 72 6f 72 2c 20 69 6e 74 20 73 71 6c 69 74  Error, int sqlit
3220: 65 49 4f 45 72 72 29 20 7b 0a 20 20 73 77 69 74  eIOErr) {.  swit
3230: 63 68 20 28 70 6f 73 69 78 45 72 72 6f 72 29 20  ch (posixError) 
3240: 7b 0a 20 20 63 61 73 65 20 30 3a 20 0a 20 20 20  {.  case 0: .   
3250: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
3260: 4b 3b 0a 20 20 20 20 0a 20 20 63 61 73 65 20 45  K;.    .  case E
3270: 41 47 41 49 4e 3a 0a 20 20 63 61 73 65 20 45 54  AGAIN:.  case ET
3280: 49 4d 45 44 4f 55 54 3a 0a 20 20 63 61 73 65 20  IMEDOUT:.  case 
3290: 45 42 55 53 59 3a 0a 20 20 63 61 73 65 20 45 49  EBUSY:.  case EI
32a0: 4e 54 52 3a 0a 20 20 63 61 73 65 20 45 4e 4f 4c  NTR:.  case ENOL
32b0: 43 4b 3a 20 20 0a 20 20 20 20 2f 2a 20 72 61 6e  CK:  .    /* ran
32c0: 64 6f 6d 20 4e 46 53 20 72 65 74 72 79 20 65 72  dom NFS retry er
32d0: 72 6f 72 2c 20 75 6e 6c 65 73 73 20 64 75 72 69  ror, unless duri
32e0: 6e 67 20 66 69 6c 65 20 73 79 73 74 65 6d 20 73  ng file system s
32f0: 75 70 70 6f 72 74 20 0a 20 20 20 20 20 2a 20 69  upport .     * i
3300: 6e 74 72 6f 73 70 65 63 74 69 6f 6e 2c 20 69 6e  ntrospection, in
3310: 20 77 68 69 63 68 20 69 74 20 61 63 74 75 61 6c   which it actual
3320: 6c 79 20 6d 65 61 6e 73 20 77 68 61 74 20 69 74  ly means what it
3330: 20 73 61 79 73 20 2a 2f 0a 20 20 20 20 72 65 74   says */.    ret
3340: 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  urn SQLITE_BUSY;
3350: 0a 20 20 20 20 0a 20 20 63 61 73 65 20 45 41 43  .    .  case EAC
3360: 43 45 53 3a 20 0a 20 20 20 20 2f 2a 20 45 41 43  CES: .    /* EAC
3370: 43 45 53 20 69 73 20 6c 69 6b 65 20 45 41 47 41  CES is like EAGA
3380: 49 4e 20 64 75 72 69 6e 67 20 6c 6f 63 6b 69 6e  IN during lockin
3390: 67 20 6f 70 65 72 61 74 69 6f 6e 73 2c 20 62 75  g operations, bu
33a0: 74 20 6e 6f 74 20 61 6e 79 20 6f 74 68 65 72 20  t not any other 
33b0: 74 69 6d 65 2a 2f 0a 20 20 20 20 69 66 28 20 28  time*/.    if( (
33c0: 73 71 6c 69 74 65 49 4f 45 72 72 20 3d 3d 20 53  sqliteIOErr == S
33d0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b  QLITE_IOERR_LOCK
33e0: 29 20 7c 7c 20 0a 09 28 73 71 6c 69 74 65 49 4f  ) || ..(sqliteIO
33f0: 45 72 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f  Err == SQLITE_IO
3400: 45 52 52 5f 55 4e 4c 4f 43 4b 29 20 7c 7c 20 0a  ERR_UNLOCK) || .
3410: 09 28 73 71 6c 69 74 65 49 4f 45 72 72 20 3d 3d  .(sqliteIOErr ==
3420: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44   SQLITE_IOERR_RD
3430: 4c 4f 43 4b 29 20 7c 7c 0a 09 28 73 71 6c 69 74  LOCK) ||..(sqlit
3440: 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49 54 45  eIOErr == SQLITE
3450: 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45  _IOERR_CHECKRESE
3460: 52 56 45 44 4c 4f 43 4b 29 20 29 7b 0a 20 20 20  RVEDLOCK) ){.   
3470: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
3480: 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a 20 20 20  _BUSY;.    }.   
3490: 20 2f 2a 20 65 6c 73 65 20 66 61 6c 6c 20 74 68   /* else fall th
34a0: 72 6f 75 67 68 20 2a 2f 0a 20 20 63 61 73 65 20  rough */.  case 
34b0: 45 50 45 52 4d 3a 20 0a 20 20 20 20 72 65 74 75  EPERM: .    retu
34c0: 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a  rn SQLITE_PERM;.
34d0: 20 20 20 20 0a 20 20 63 61 73 65 20 45 44 45 41      .  case EDEA
34e0: 44 4c 4b 3a 0a 20 20 20 20 72 65 74 75 72 6e 20  DLK:.    return 
34f0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f  SQLITE_IOERR_BLO
3500: 43 4b 45 44 3b 0a 20 20 20 20 0a 23 69 66 20 45  CKED;.    .#if E
3510: 4f 50 4e 4f 54 53 55 50 50 21 3d 45 4e 4f 54 53  OPNOTSUPP!=ENOTS
3520: 55 50 0a 20 20 63 61 73 65 20 45 4f 50 4e 4f 54  UP.  case EOPNOT
3530: 53 55 50 50 3a 20 0a 20 20 20 20 2f 2a 20 73 6f  SUPP: .    /* so
3540: 6d 65 74 68 69 6e 67 20 77 65 6e 74 20 74 65 72  mething went ter
3550: 72 69 62 6c 79 20 61 77 72 79 2c 20 75 6e 6c 65  ribly awry, unle
3560: 73 73 20 64 75 72 69 6e 67 20 66 69 6c 65 20 73  ss during file s
3570: 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20 0a 20  ystem support . 
3580: 20 20 20 20 2a 20 69 6e 74 72 6f 73 70 65 63 74      * introspect
3590: 69 6f 6e 2c 20 69 6e 20 77 68 69 63 68 20 69 74  ion, in which it
35a0: 20 61 63 74 75 61 6c 6c 79 20 6d 65 61 6e 73 20   actually means 
35b0: 77 68 61 74 20 69 74 20 73 61 79 73 20 2a 2f 0a  what it says */.
35c0: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 45 4e  #endif.#ifdef EN
35d0: 4f 54 53 55 50 0a 20 20 63 61 73 65 20 45 4e 4f  OTSUP.  case ENO
35e0: 54 53 55 50 3a 20 0a 20 20 20 20 2f 2a 20 69 6e  TSUP: .    /* in
35f0: 76 61 6c 69 64 20 66 64 2c 20 75 6e 6c 65 73 73  valid fd, unless
3600: 20 64 75 72 69 6e 67 20 66 69 6c 65 20 73 79 73   during file sys
3610: 74 65 6d 20 73 75 70 70 6f 72 74 20 69 6e 74 72  tem support intr
3620: 6f 73 70 65 63 74 69 6f 6e 2c 20 69 6e 20 77 68  ospection, in wh
3630: 69 63 68 20 0a 20 20 20 20 20 2a 20 69 74 20 61  ich .     * it a
3640: 63 74 75 61 6c 6c 79 20 6d 65 61 6e 73 20 77 68  ctually means wh
3650: 61 74 20 69 74 20 73 61 79 73 20 2a 2f 0a 23 65  at it says */.#e
3660: 6e 64 69 66 0a 20 20 63 61 73 65 20 45 49 4f 3a  ndif.  case EIO:
3670: 0a 20 20 63 61 73 65 20 45 42 41 44 46 3a 0a 20  .  case EBADF:. 
3680: 20 63 61 73 65 20 45 49 4e 56 41 4c 3a 0a 20 20   case EINVAL:.  
3690: 63 61 73 65 20 45 4e 4f 54 43 4f 4e 4e 3a 0a 20  case ENOTCONN:. 
36a0: 20 63 61 73 65 20 45 4e 4f 44 45 56 3a 0a 20 20   case ENODEV:.  
36b0: 63 61 73 65 20 45 4e 58 49 4f 3a 0a 20 20 63 61  case ENXIO:.  ca
36c0: 73 65 20 45 4e 4f 45 4e 54 3a 0a 20 20 63 61 73  se ENOENT:.  cas
36d0: 65 20 45 53 54 41 4c 45 3a 0a 20 20 63 61 73 65  e ESTALE:.  case
36e0: 20 45 4e 4f 53 59 53 3a 0a 20 20 20 20 2f 2a 20   ENOSYS:.    /* 
36f0: 74 68 65 73 65 20 73 68 6f 75 6c 64 20 66 6f 72  these should for
3700: 63 65 20 74 68 65 20 63 6c 69 65 6e 74 20 74 6f  ce the client to
3710: 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20   close the file 
3720: 61 6e 64 20 72 65 63 6f 6e 6e 65 63 74 20 2a 2f  and reconnect */
3730: 0a 20 20 20 20 0a 20 20 64 65 66 61 75 6c 74 3a  .    .  default:
3740: 20 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c   .    return sql
3750: 69 74 65 49 4f 45 72 72 3b 0a 20 20 7d 0a 7d 0a  iteIOErr;.  }.}.
3760: 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .../************
3770: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3780: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3790: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
37a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
37b0: 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
37c0: 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 55 6e 69 71  ***** Begin Uniq
37d0: 75 65 20 46 69 6c 65 20 49 44 20 55 74 69 6c 69  ue File ID Utili
37e0: 74 79 20 55 73 65 64 20 42 79 20 56 78 57 6f 72  ty Used By VxWor
37f0: 6b 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ks *************
3800: 2a 2a 0a 2a 2a 0a 2a 2a 20 4f 6e 20 6d 6f 73 74  **.**.** On most
3810: 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 75 6e 69   versions of uni
3820: 78 2c 20 77 65 20 63 61 6e 20 67 65 74 20 61 20  x, we can get a 
3830: 75 6e 69 71 75 65 20 49 44 20 66 6f 72 20 61 20  unique ID for a 
3840: 66 69 6c 65 20 62 79 20 63 6f 6e 63 61 74 65 6e  file by concaten
3850: 61 74 69 6e 67 0a 2a 2a 20 74 68 65 20 64 65 76  ating.** the dev
3860: 69 63 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 74  ice number and t
3870: 68 65 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72 2e  he inode number.
3880: 20 20 42 75 74 20 74 68 69 73 20 64 6f 65 73 20    But this does 
3890: 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 56 78 57 6f  not work on VxWo
38a0: 72 6b 73 2e 0a 2a 2a 20 4f 6e 20 56 78 57 6f 72  rks..** On VxWor
38b0: 6b 73 2c 20 61 20 75 6e 69 71 75 65 20 66 69 6c  ks, a unique fil
38c0: 65 20 69 64 20 6d 75 73 74 20 62 65 20 62 61 73  e id must be bas
38d0: 65 64 20 6f 6e 20 74 68 65 20 63 61 6e 6f 6e 69  ed on the canoni
38e0: 63 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a 2a 2a  cal filename..**
38f0: 0a 2a 2a 20 41 20 70 6f 69 6e 74 65 72 20 74 6f  .** A pointer to
3900: 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   an instance of 
3910: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
3920: 72 75 63 74 75 72 65 20 63 61 6e 20 62 65 20 75  ructure can be u
3930: 73 65 64 20 61 73 20 61 0a 2a 2a 20 75 6e 69 71  sed as a.** uniq
3940: 75 65 20 66 69 6c 65 20 49 44 20 69 6e 20 56 78  ue file ID in Vx
3950: 57 6f 72 6b 73 2e 20 20 45 61 63 68 20 69 6e 73  Works.  Each ins
3960: 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73 74  tance of this st
3970: 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73  ructure contains
3980: 0a 2a 2a 20 61 20 63 6f 70 79 20 6f 66 20 74 68  .** a copy of th
3990: 65 20 63 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65  e canonical file
39a0: 6e 61 6d 65 2e 20 20 54 68 65 72 65 20 69 73 20  name.  There is 
39b0: 61 6c 73 6f 20 61 20 72 65 66 65 72 65 6e 63 65  also a reference
39c0: 20 63 6f 75 6e 74 2e 20 20 0a 2a 2a 20 54 68 65   count.  .** The
39d0: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 72 65   structure is re
39e0: 63 6c 61 69 6d 65 64 20 77 68 65 6e 20 74 68 65  claimed when the
39f0: 20 6e 75 6d 62 65 72 20 6f 66 20 70 6f 69 6e 74   number of point
3a00: 65 72 73 20 74 6f 20 69 74 20 64 72 6f 70 73 20  ers to it drops 
3a10: 74 6f 0a 2a 2a 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a  to.** zero..**.*
3a20: 2a 20 54 68 65 72 65 20 61 72 65 20 6e 65 76 65  * There are neve
3a30: 72 20 76 65 72 79 20 6d 61 6e 79 20 66 69 6c 65  r very many file
3a40: 73 20 6f 70 65 6e 20 61 74 20 6f 6e 65 20 74 69  s open at one ti
3a50: 6d 65 20 61 6e 64 20 6c 6f 6f 6b 75 70 73 20 61  me and lookups a
3a60: 72 65 20 6e 6f 74 0a 2a 2a 20 61 20 70 65 72 66  re not.** a perf
3a70: 6f 72 6d 61 6e 63 65 2d 63 72 69 74 69 63 61 6c  ormance-critical
3a80: 20 70 61 74 68 2c 20 73 6f 20 69 74 20 69 73 20   path, so it is 
3a90: 73 75 66 66 69 63 69 65 6e 74 20 74 6f 20 70 75  sufficient to pu
3aa0: 74 20 74 68 65 73 65 0a 2a 2a 20 73 74 72 75 63  t these.** struc
3ab0: 74 75 72 65 73 20 6f 6e 20 61 20 6c 69 6e 6b 65  tures on a linke
3ac0: 64 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 72 75 63  d list..*/.struc
3ad0: 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  t vxworksFileId 
3ae0: 7b 0a 20 20 73 74 72 75 63 74 20 76 78 77 6f 72  {.  struct vxwor
3af0: 6b 73 46 69 6c 65 49 64 20 2a 70 4e 65 78 74 3b  ksFileId *pNext;
3b00: 20 20 2f 2a 20 4e 65 78 74 20 69 6e 20 61 20 6c    /* Next in a l
3b10: 69 73 74 20 6f 66 20 74 68 65 6d 20 61 6c 6c 20  ist of them all 
3b20: 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20  */.  int nRef;  
3b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3b40: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
3b50: 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
3b60: 69 73 20 6f 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  is one */.  int 
3b70: 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  nName;          
3b80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e            /* Len
3b90: 67 74 68 20 6f 66 20 74 68 65 20 7a 43 61 6e 6f  gth of the zCano
3ba0: 6e 69 63 61 6c 4e 61 6d 65 5b 5d 20 73 74 72 69  nicalName[] stri
3bb0: 6e 67 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43  ng */.  char *zC
3bc0: 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 3b 20 20 20  anonicalName;   
3bd0: 20 20 20 20 20 20 2f 2a 20 43 61 6e 6f 6e 69 63        /* Canonic
3be0: 61 6c 20 66 69 6c 65 6e 61 6d 65 20 2a 2f 0a 7d  al filename */.}
3bf0: 3b 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b  ;..#if OS_VXWORK
3c00: 53 0a 2f 2a 20 0a 2a 2a 20 41 6c 6c 20 75 6e 69  S./* .** All uni
3c10: 71 75 65 20 66 69 6c 65 6e 61 6d 65 73 20 61 72  que filenames ar
3c20: 65 20 68 65 6c 64 20 6f 6e 20 61 20 6c 69 6e 6b  e held on a link
3c30: 65 64 20 6c 69 73 74 20 68 65 61 64 65 64 20 62  ed list headed b
3c40: 79 20 74 68 69 73 0a 2a 2a 20 76 61 72 69 61 62  y this.** variab
3c50: 6c 65 3a 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74  le:.*/.static st
3c60: 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65  ruct vxworksFile
3c70: 49 64 20 2a 76 78 77 6f 72 6b 73 46 69 6c 65 4c  Id *vxworksFileL
3c80: 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20  ist = 0;../*.** 
3c90: 53 69 6d 70 6c 69 66 79 20 61 20 66 69 6c 65 6e  Simplify a filen
3ca0: 61 6d 65 20 69 6e 74 6f 20 69 74 73 20 63 61 6e  ame into its can
3cb0: 6f 6e 69 63 61 6c 20 66 6f 72 6d 0a 2a 2a 20 62  onical form.** b
3cc0: 79 20 6d 61 6b 69 6e 67 20 74 68 65 20 66 6f 6c  y making the fol
3cd0: 6c 6f 77 69 6e 67 20 63 68 61 6e 67 65 73 3a 0a  lowing changes:.
3ce0: 2a 2a 0a 2a 2a 20 20 2a 20 72 65 6d 6f 76 69 6e  **.**  * removin
3cf0: 67 20 61 6e 79 20 74 72 61 69 6c 69 6e 67 20 61  g any trailing a
3d00: 6e 64 20 64 75 70 6c 69 63 61 74 65 20 2f 0a 2a  nd duplicate /.*
3d10: 2a 20 20 2a 20 63 6f 6e 76 65 72 74 20 2f 2e 2f  *  * convert /./
3d20: 20 69 6e 74 6f 20 6a 75 73 74 20 2f 0a 2a 2a 20   into just /.** 
3d30: 20 2a 20 63 6f 6e 76 65 72 74 20 2f 41 2f 2e 2e   * convert /A/..
3d40: 2f 20 77 68 65 72 65 20 41 20 69 73 20 61 6e 79  / where A is any
3d50: 20 73 69 6d 70 6c 65 20 6e 61 6d 65 20 69 6e 74   simple name int
3d60: 6f 20 6a 75 73 74 20 2f 0a 2a 2a 0a 2a 2a 20 43  o just /.**.** C
3d70: 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20  hanges are made 
3d80: 69 6e 2d 70 6c 61 63 65 2e 20 20 52 65 74 75 72  in-place.  Retur
3d90: 6e 20 74 68 65 20 6e 65 77 20 6e 61 6d 65 20 6c  n the new name l
3da0: 65 6e 67 74 68 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ength..**.** The
3db0: 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65 6e 61   original filena
3dc0: 6d 65 20 69 73 20 69 6e 20 7a 5b 30 2e 2e 6e 2d  me is in z[0..n-
3dd0: 31 5d 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  1].  Return the 
3de0: 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 63 68 61  number of.** cha
3df0: 72 61 63 74 65 72 73 20 69 6e 20 74 68 65 20 73  racters in the s
3e00: 69 6d 70 6c 69 66 69 65 64 20 6e 61 6d 65 2e 0a  implified name..
3e10: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 78  */.static int vx
3e20: 77 6f 72 6b 73 53 69 6d 70 6c 69 66 79 4e 61 6d  worksSimplifyNam
3e30: 65 28 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e  e(char *z, int n
3e40: 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  ){.  int i, j;. 
3e50: 20 77 68 69 6c 65 28 20 6e 3e 31 20 26 26 20 7a   while( n>1 && z
3e60: 5b 6e 2d 31 5d 3d 3d 27 2f 27 20 29 7b 20 6e 2d  [n-1]=='/' ){ n-
3e70: 2d 3b 20 7d 0a 20 20 66 6f 72 28 69 3d 6a 3d 30  -; }.  for(i=j=0
3e80: 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<n; i++){.   
3e90: 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 2f 27 20 29   if( z[i]=='/' )
3ea0: 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2b  {.      if( z[i+
3eb0: 31 5d 3d 3d 27 2f 27 20 29 20 63 6f 6e 74 69 6e  1]=='/' ) contin
3ec0: 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 5b  ue;.      if( z[
3ed0: 69 2b 31 5d 3d 3d 27 2e 27 20 26 26 20 69 2b 32  i+1]=='.' && i+2
3ee0: 3c 6e 20 26 26 20 7a 5b 69 2b 32 5d 3d 3d 27 2f  <n && z[i+2]=='/
3ef0: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 69 20 2b  ' ){.        i +
3f00: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e  = 1;.        con
3f10: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20  tinue;.      }. 
3f20: 20 20 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3d       if( z[i+1]=
3f30: 3d 27 2e 27 20 26 26 20 69 2b 33 3c 6e 20 26 26  ='.' && i+3<n &&
3f40: 20 7a 5b 69 2b 32 5d 3d 3d 27 2e 27 20 26 26 20   z[i+2]=='.' && 
3f50: 7a 5b 69 2b 33 5d 3d 3d 27 2f 27 20 29 7b 0a 20  z[i+3]=='/' ){. 
3f60: 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 6a 3e         while( j>
3f70: 30 20 26 26 20 7a 5b 6a 2d 31 5d 21 3d 27 2f 27  0 && z[j-1]!='/'
3f80: 20 29 7b 20 6a 2d 2d 3b 20 7d 0a 20 20 20 20 20   ){ j--; }.     
3f90: 20 20 20 69 66 28 20 6a 3e 30 20 29 7b 20 6a 2d     if( j>0 ){ j-
3fa0: 2d 3b 20 7d 0a 20 20 20 20 20 20 20 20 69 20 2b  -; }.        i +
3fb0: 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e  = 2;.        con
3fc0: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20  tinue;.      }. 
3fd0: 20 20 20 7d 0a 20 20 20 20 7a 5b 6a 2b 2b 5d 20     }.    z[j++] 
3fe0: 3d 20 7a 5b 69 5d 3b 0a 20 20 7d 0a 20 20 7a 5b  = z[i];.  }.  z[
3ff0: 6a 5d 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  j] = 0;.  return
4000: 20 6a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e   j;.}../*.** Fin
4010: 64 20 61 20 75 6e 69 71 75 65 20 66 69 6c 65 20  d a unique file 
4020: 49 44 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e  ID for the given
4030: 20 61 62 73 6f 6c 75 74 65 20 70 61 74 68 6e 61   absolute pathna
4040: 6d 65 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 61  me.  Return.** a
4050: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
4060: 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62  vxworksFileId ob
4070: 6a 65 63 74 2e 20 20 54 68 69 73 20 70 6f 69 6e  ject.  This poin
4080: 74 65 72 20 69 73 20 74 68 65 20 75 6e 69 71 75  ter is the uniqu
4090: 65 0a 2a 2a 20 66 69 6c 65 20 49 44 2e 0a 2a 2a  e.** file ID..**
40a0: 0a 2a 2a 20 54 68 65 20 6e 52 65 66 20 66 69 65  .** The nRef fie
40b0: 6c 64 20 6f 66 20 74 68 65 20 76 78 77 6f 72 6b  ld of the vxwork
40c0: 73 46 69 6c 65 49 64 20 6f 62 6a 65 63 74 20 69  sFileId object i
40d0: 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 62 65  s incremented be
40e0: 66 6f 72 65 0a 2a 2a 20 74 68 65 20 6f 62 6a 65  fore.** the obje
40f0: 63 74 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  ct is returned. 
4100: 20 41 20 6e 65 77 20 76 78 77 6f 72 6b 73 46 69   A new vxworksFi
4110: 6c 65 49 64 20 6f 62 6a 65 63 74 20 69 73 20 63  leId object is c
4120: 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20 61 64  reated.** and ad
4130: 64 65 64 20 74 6f 20 74 68 65 20 67 6c 6f 62 61  ded to the globa
4140: 6c 20 6c 69 73 74 20 69 66 20 6e 65 63 65 73 73  l list if necess
4150: 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  ary..**.** If a 
4160: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
4170: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
4180: 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a  return NULL..*/.
4190: 73 74 61 74 69 63 20 73 74 72 75 63 74 20 76 78  static struct vx
41a0: 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 76 78 77  worksFileId *vxw
41b0: 6f 72 6b 73 46 69 6e 64 46 69 6c 65 49 64 28 63  orksFindFileId(c
41c0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 62 73 6f  onst char *zAbso
41d0: 6c 75 74 65 4e 61 6d 65 29 7b 0a 20 20 73 74 72  luteName){.  str
41e0: 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49  uct vxworksFileI
41f0: 64 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20  d *pNew;        
4200: 20 2f 2a 20 73 65 61 72 63 68 20 6b 65 79 20 61   /* search key a
4210: 6e 64 20 6e 65 77 20 66 69 6c 65 20 49 44 20 2a  nd new file ID *
4220: 2f 0a 20 20 73 74 72 75 63 74 20 76 78 77 6f 72  /.  struct vxwor
4230: 6b 73 46 69 6c 65 49 64 20 2a 70 43 61 6e 64 69  ksFileId *pCandi
4240: 64 61 74 65 3b 20 20 20 2f 2a 20 46 6f 72 20 6c  date;   /* For l
4250: 6f 6f 70 69 6e 67 20 6f 76 65 72 20 65 78 69 73  ooping over exis
4260: 74 69 6e 67 20 66 69 6c 65 20 49 44 73 20 2a 2f  ting file IDs */
4270: 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20  .  int n;       
4280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4290: 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68         /* Length
42a0: 20 6f 66 20 7a 41 62 73 6f 6c 75 74 65 4e 61 6d   of zAbsoluteNam
42b0: 65 20 73 74 72 69 6e 67 20 2a 2f 0a 0a 20 20 61  e string */..  a
42c0: 73 73 65 72 74 28 20 7a 41 62 73 6f 6c 75 74 65  ssert( zAbsolute
42d0: 4e 61 6d 65 5b 30 5d 3d 3d 27 2f 27 20 29 3b 0a  Name[0]=='/' );.
42e0: 20 20 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65    n = (int)strle
42f0: 6e 28 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65 29  n(zAbsoluteName)
4300: 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74  ;.  pNew = sqlit
4310: 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  e3_malloc( sizeo
4320: 66 28 2a 70 4e 65 77 29 20 2b 20 28 6e 2b 31 29  f(*pNew) + (n+1)
4330: 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   );.  if( pNew==
4340: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
4350: 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c  pNew->zCanonical
4360: 4e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70  Name = (char*)&p
4370: 4e 65 77 5b 31 5d 3b 0a 20 20 6d 65 6d 63 70 79  New[1];.  memcpy
4380: 28 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61  (pNew->zCanonica
4390: 6c 4e 61 6d 65 2c 20 7a 41 62 73 6f 6c 75 74 65  lName, zAbsolute
43a0: 4e 61 6d 65 2c 20 6e 2b 31 29 3b 0a 20 20 6e 20  Name, n+1);.  n 
43b0: 3d 20 76 78 77 6f 72 6b 73 53 69 6d 70 6c 69 66  = vxworksSimplif
43c0: 79 4e 61 6d 65 28 70 4e 65 77 2d 3e 7a 43 61 6e  yName(pNew->zCan
43d0: 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20 6e 29 3b 0a  onicalName, n);.
43e0: 0a 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72  .  /* Search for
43f0: 20 61 6e 20 65 78 69 73 74 69 6e 67 20 65 6e 74   an existing ent
4400: 72 79 20 74 68 61 74 20 6d 61 74 63 68 69 6e 67  ry that matching
4410: 20 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c 20 6e   the canonical n
4420: 61 6d 65 2e 0a 20 20 2a 2a 20 49 66 20 66 6f 75  ame..  ** If fou
4430: 6e 64 2c 20 69 6e 63 72 65 6d 65 6e 74 20 74 68  nd, increment th
4440: 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
4450: 74 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70  t and return a p
4460: 6f 69 6e 74 65 72 20 74 6f 0a 20 20 2a 2a 20 74  ointer to.  ** t
4470: 68 65 20 65 78 69 73 74 69 6e 67 20 66 69 6c 65  he existing file
4480: 20 49 44 2e 0a 20 20 2a 2f 0a 20 20 75 6e 69 78   ID..  */.  unix
4490: 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
44a0: 66 6f 72 28 70 43 61 6e 64 69 64 61 74 65 3d 76  for(pCandidate=v
44b0: 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74 3b 20  xworksFileList; 
44c0: 70 43 61 6e 64 69 64 61 74 65 3b 20 70 43 61 6e  pCandidate; pCan
44d0: 64 69 64 61 74 65 3d 70 43 61 6e 64 69 64 61 74  didate=pCandidat
44e0: 65 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  e->pNext){.    i
44f0: 66 28 20 70 43 61 6e 64 69 64 61 74 65 2d 3e 6e  f( pCandidate->n
4500: 4e 61 6d 65 3d 3d 6e 20 0a 20 20 20 20 20 26 26  Name==n .     &&
4510: 20 6d 65 6d 63 6d 70 28 70 43 61 6e 64 69 64 61   memcmp(pCandida
4520: 74 65 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61  te->zCanonicalNa
4530: 6d 65 2c 20 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e  me, pNew->zCanon
4540: 69 63 61 6c 4e 61 6d 65 2c 20 6e 29 3d 3d 30 0a  icalName, n)==0.
4550: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 73 71      ){.       sq
4560: 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77 29  lite3_free(pNew)
4570: 3b 0a 20 20 20 20 20 20 20 70 43 61 6e 64 69 64  ;.       pCandid
4580: 61 74 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20  ate->nRef++;.   
4590: 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74      unixLeaveMut
45a0: 65 78 28 29 3b 0a 20 20 20 20 20 20 20 72 65 74  ex();.       ret
45b0: 75 72 6e 20 70 43 61 6e 64 69 64 61 74 65 3b 0a  urn pCandidate;.
45c0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
45d0: 4e 6f 20 6d 61 74 63 68 20 77 61 73 20 66 6f 75  No match was fou
45e0: 6e 64 2e 20 20 57 65 20 77 69 6c 6c 20 6d 61 6b  nd.  We will mak
45f0: 65 20 61 20 6e 65 77 20 66 69 6c 65 20 49 44 20  e a new file ID 
4600: 2a 2f 0a 20 20 70 4e 65 77 2d 3e 6e 52 65 66 20  */.  pNew->nRef 
4610: 3d 20 31 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4e 61  = 1;.  pNew->nNa
4620: 6d 65 20 3d 20 6e 3b 0a 20 20 70 4e 65 77 2d 3e  me = n;.  pNew->
4630: 70 4e 65 78 74 20 3d 20 76 78 77 6f 72 6b 73 46  pNext = vxworksF
4640: 69 6c 65 4c 69 73 74 3b 0a 20 20 76 78 77 6f 72  ileList;.  vxwor
4650: 6b 73 46 69 6c 65 4c 69 73 74 20 3d 20 70 4e 65  ksFileList = pNe
4660: 77 3b 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75  w;.  unixLeaveMu
4670: 74 65 78 28 29 3b 0a 20 20 72 65 74 75 72 6e 20  tex();.  return 
4680: 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  pNew;.}../*.** D
4690: 65 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66  ecrement the ref
46a0: 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20  erence count on 
46b0: 61 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  a vxworksFileId 
46c0: 6f 62 6a 65 63 74 2e 20 20 46 72 65 65 0a 2a 2a  object.  Free.**
46d0: 20 74 68 65 20 6f 62 6a 65 63 74 20 77 68 65 6e   the object when
46e0: 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63   the reference c
46f0: 6f 75 6e 74 20 72 65 61 63 68 65 73 20 7a 65 72  ount reaches zer
4700: 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  o..*/.static voi
4710: 64 20 76 78 77 6f 72 6b 73 52 65 6c 65 61 73 65  d vxworksRelease
4720: 46 69 6c 65 49 64 28 73 74 72 75 63 74 20 76 78  FileId(struct vx
4730: 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 49 64  worksFileId *pId
4740: 29 7b 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75  ){.  unixEnterMu
4750: 74 65 78 28 29 3b 0a 20 20 61 73 73 65 72 74 28  tex();.  assert(
4760: 20 70 49 64 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a   pId->nRef>0 );.
4770: 20 20 70 49 64 2d 3e 6e 52 65 66 2d 2d 3b 0a 20    pId->nRef--;. 
4780: 20 69 66 28 20 70 49 64 2d 3e 6e 52 65 66 3d 3d   if( pId->nRef==
4790: 30 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  0 ){.    struct 
47a0: 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 2a  vxworksFileId **
47b0: 70 70 3b 0a 20 20 20 20 66 6f 72 28 70 70 3d 26  pp;.    for(pp=&
47c0: 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74 3b  vxworksFileList;
47d0: 20 2a 70 70 20 26 26 20 2a 70 70 21 3d 70 49 64   *pp && *pp!=pId
47e0: 3b 20 70 70 20 3d 20 26 28 28 2a 70 70 29 2d 3e  ; pp = &((*pp)->
47f0: 70 4e 65 78 74 29 29 7b 7d 0a 20 20 20 20 61 73  pNext)){}.    as
4800: 73 65 72 74 28 20 2a 70 70 3d 3d 70 49 64 20 29  sert( *pp==pId )
4810: 3b 0a 20 20 20 20 2a 70 70 20 3d 20 70 49 64 2d  ;.    *pp = pId-
4820: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 73 71 6c 69  >pNext;.    sqli
4830: 74 65 33 5f 66 72 65 65 28 70 49 64 29 3b 0a 20  te3_free(pId);. 
4840: 20 7d 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75   }.  unixLeaveMu
4850: 74 65 78 28 29 3b 0a 7d 0a 23 65 6e 64 69 66 20  tex();.}.#endif 
4860: 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f  /* OS_VXWORKS */
4870: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
4880: 2a 20 45 6e 64 20 6f 66 20 55 6e 69 71 75 65 20  * End of Unique 
4890: 46 69 6c 65 20 49 44 20 55 74 69 6c 69 74 79 20  File ID Utility 
48a0: 55 73 65 64 20 42 79 20 56 78 57 6f 72 6b 73 20  Used By VxWorks 
48b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
48c0: 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
48d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
48e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
48f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4900: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
4910: 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .../************
4920: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4930: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4940: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4950: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4960: 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
4970: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 50  ************** P
4980: 6f 73 69 78 20 41 64 76 69 73 6f 72 79 20 4c 6f  osix Advisory Lo
4990: 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  cking **********
49a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
49b0: 2a 2a 0a 2a 2a 0a 2a 2a 20 50 4f 53 49 58 20 61  **.**.** POSIX a
49c0: 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20 61 72  dvisory locks ar
49d0: 65 20 62 72 6f 6b 65 6e 20 62 79 20 64 65 73 69  e broken by desi
49e0: 67 6e 2e 20 20 41 4e 53 49 20 53 54 44 20 31 30  gn.  ANSI STD 10
49f0: 30 33 2e 31 20 28 31 39 39 36 29 0a 2a 2a 20 73  03.1 (1996).** s
4a00: 65 63 74 69 6f 6e 20 36 2e 35 2e 32 2e 32 20 6c  ection 6.5.2.2 l
4a10: 69 6e 65 73 20 34 38 33 20 74 68 72 6f 75 67 68  ines 483 through
4a20: 20 34 39 30 20 73 70 65 63 69 66 79 20 74 68 61   490 specify tha
4a30: 74 20 77 68 65 6e 20 61 20 70 72 6f 63 65 73 73  t when a process
4a40: 0a 2a 2a 20 73 65 74 73 20 6f 72 20 63 6c 65 61  .** sets or clea
4a50: 72 73 20 61 20 6c 6f 63 6b 2c 20 74 68 61 74 20  rs a lock, that 
4a60: 6f 70 65 72 61 74 69 6f 6e 20 6f 76 65 72 72 69  operation overri
4a70: 64 65 73 20 61 6e 79 20 70 72 69 6f 72 20 6c 6f  des any prior lo
4a80: 63 6b 73 20 73 65 74 0a 2a 2a 20 62 79 20 74 68  cks set.** by th
4a90: 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 2e 20  e same process. 
4aa0: 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 70   It does not exp
4ab0: 6c 69 63 69 74 6c 79 20 73 61 79 20 73 6f 2c 20  licitly say so, 
4ac0: 62 75 74 20 74 68 69 73 20 69 6d 70 6c 69 65 73  but this implies
4ad0: 0a 2a 2a 20 74 68 61 74 20 69 74 20 6f 76 65 72  .** that it over
4ae0: 72 69 64 65 73 20 6c 6f 63 6b 73 20 73 65 74 20  rides locks set 
4af0: 62 79 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63  by the same proc
4b00: 65 73 73 20 75 73 69 6e 67 20 61 20 64 69 66 66  ess using a diff
4b10: 65 72 65 6e 74 0a 2a 2a 20 66 69 6c 65 20 64 65  erent.** file de
4b20: 73 63 72 69 70 74 6f 72 2e 20 20 43 6f 6e 73 69  scriptor.  Consi
4b30: 64 65 72 20 74 68 69 73 20 74 65 73 74 20 63 61  der this test ca
4b40: 73 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  se:.**.**       
4b50: 69 6e 74 20 66 64 31 20 3d 20 6f 70 65 6e 28 22  int fd1 = open("
4b60: 2e 2f 66 69 6c 65 31 22 2c 20 4f 5f 52 44 57 52  ./file1", O_RDWR
4b70: 7c 4f 5f 43 52 45 41 54 2c 20 30 36 34 34 29 3b  |O_CREAT, 0644);
4b80: 0a 2a 2a 20 20 20 20 20 20 20 69 6e 74 20 66 64  .**       int fd
4b90: 32 20 3d 20 6f 70 65 6e 28 22 2e 2f 66 69 6c 65  2 = open("./file
4ba0: 32 22 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43 52 45  2", O_RDWR|O_CRE
4bb0: 41 54 2c 20 30 36 34 34 29 3b 0a 2a 2a 0a 2a 2a  AT, 0644);.**.**
4bc0: 20 53 75 70 70 6f 73 65 20 2e 2f 66 69 6c 65 31   Suppose ./file1
4bd0: 20 61 6e 64 20 2e 2f 66 69 6c 65 32 20 61 72 65   and ./file2 are
4be0: 20 72 65 61 6c 6c 79 20 74 68 65 20 73 61 6d 65   really the same
4bf0: 20 66 69 6c 65 20 28 62 65 63 61 75 73 65 0a 2a   file (because.*
4c00: 2a 20 6f 6e 65 20 69 73 20 61 20 68 61 72 64 20  * one is a hard 
4c10: 6f 72 20 73 79 6d 62 6f 6c 69 63 20 6c 69 6e 6b  or symbolic link
4c20: 20 74 6f 20 74 68 65 20 6f 74 68 65 72 29 20 74   to the other) t
4c30: 68 65 6e 20 69 66 20 79 6f 75 20 73 65 74 0a 2a  hen if you set.*
4c40: 2a 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  * an exclusive l
4c50: 6f 63 6b 20 6f 6e 20 66 64 31 2c 20 74 68 65 6e  ock on fd1, then
4c60: 20 74 72 79 20 74 6f 20 67 65 74 20 61 6e 20 65   try to get an e
4c70: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 0a 2a 2a  xclusive lock.**
4c80: 20 6f 6e 20 66 64 32 2c 20 69 74 20 77 6f 72 6b   on fd2, it work
4c90: 73 2e 20 20 49 20 77 6f 75 6c 64 20 68 61 76 65  s.  I would have
4ca0: 20 65 78 70 65 63 74 65 64 20 74 68 65 20 73 65   expected the se
4cb0: 63 6f 6e 64 20 6c 6f 63 6b 20 74 6f 0a 2a 2a 20  cond lock to.** 
4cc0: 66 61 69 6c 20 73 69 6e 63 65 20 74 68 65 72 65  fail since there
4cd0: 20 77 61 73 20 61 6c 72 65 61 64 79 20 61 20 6c   was already a l
4ce0: 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 20  ock on the file 
4cf0: 64 75 65 20 74 6f 20 66 64 31 2e 0a 2a 2a 20 42  due to fd1..** B
4d00: 75 74 20 6e 6f 74 20 73 6f 2e 20 20 53 69 6e 63  ut not so.  Sinc
4d10: 65 20 62 6f 74 68 20 6c 6f 63 6b 73 20 63 61 6d  e both locks cam
4d20: 65 20 66 72 6f 6d 20 74 68 65 20 73 61 6d 65 20  e from the same 
4d30: 70 72 6f 63 65 73 73 2c 20 74 68 65 0a 2a 2a 20  process, the.** 
4d40: 73 65 63 6f 6e 64 20 6f 76 65 72 72 69 64 65 73  second overrides
4d50: 20 74 68 65 20 66 69 72 73 74 2c 20 65 76 65 6e   the first, even
4d60: 20 74 68 6f 75 67 68 20 74 68 65 79 20 77 65 72   though they wer
4d70: 65 20 6f 6e 20 64 69 66 66 65 72 65 6e 74 0a 2a  e on different.*
4d80: 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * file descripto
4d90: 72 73 20 6f 70 65 6e 65 64 20 6f 6e 20 64 69 66  rs opened on dif
4da0: 66 65 72 65 6e 74 20 66 69 6c 65 20 6e 61 6d 65  ferent file name
4db0: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d 65  s..**.** This me
4dc0: 61 6e 73 20 74 68 61 74 20 77 65 20 63 61 6e 6e  ans that we cann
4dd0: 6f 74 20 75 73 65 20 50 4f 53 49 58 20 6c 6f 63  ot use POSIX loc
4de0: 6b 73 20 74 6f 20 73 79 6e 63 68 72 6f 6e 69 7a  ks to synchroniz
4df0: 65 20 66 69 6c 65 20 61 63 63 65 73 73 0a 2a 2a  e file access.**
4e00: 20 61 6d 6f 6e 67 20 63 6f 6d 70 65 74 69 6e 67   among competing
4e10: 20 74 68 72 65 61 64 73 20 6f 66 20 74 68 65 20   threads of the 
4e20: 73 61 6d 65 20 70 72 6f 63 65 73 73 2e 20 20 50  same process.  P
4e30: 4f 53 49 58 20 6c 6f 63 6b 73 20 77 69 6c 6c 20  OSIX locks will 
4e40: 77 6f 72 6b 20 66 69 6e 65 0a 2a 2a 20 74 6f 20  work fine.** to 
4e50: 73 79 6e 63 68 72 6f 6e 69 7a 65 20 61 63 63 65  synchronize acce
4e60: 73 73 20 66 6f 72 20 74 68 72 65 61 64 73 20 69  ss for threads i
4e70: 6e 20 73 65 70 61 72 61 74 65 20 70 72 6f 63 65  n separate proce
4e80: 73 73 65 73 2c 20 62 75 74 20 6e 6f 74 0a 2a 2a  sses, but not.**
4e90: 20 74 68 72 65 61 64 73 20 77 69 74 68 69 6e 20   threads within 
4ea0: 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73  the same process
4eb0: 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 77 6f 72 6b 20  ..**.** To work 
4ec0: 61 72 6f 75 6e 64 20 74 68 65 20 70 72 6f 62 6c  around the probl
4ed0: 65 6d 2c 20 53 51 4c 69 74 65 20 68 61 73 20 74  em, SQLite has t
4ee0: 6f 20 6d 61 6e 61 67 65 20 66 69 6c 65 20 6c 6f  o manage file lo
4ef0: 63 6b 73 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a  cks internally.*
4f00: 2a 20 6f 6e 20 69 74 73 20 6f 77 6e 2e 20 20 57  * on its own.  W
4f10: 68 65 6e 65 76 65 72 20 61 20 6e 65 77 20 64 61  henever a new da
4f20: 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e 65 64  tabase is opened
4f30: 2c 20 77 65 20 68 61 76 65 20 74 6f 20 66 69 6e  , we have to fin
4f40: 64 20 74 68 65 0a 2a 2a 20 73 70 65 63 69 66 69  d the.** specifi
4f50: 63 20 69 6e 6f 64 65 20 6f 66 20 74 68 65 20 64  c inode of the d
4f60: 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 74 68  atabase file (th
4f70: 65 20 69 6e 6f 64 65 20 69 73 20 64 65 74 65 72  e inode is deter
4f80: 6d 69 6e 65 64 20 62 79 20 74 68 65 0a 2a 2a 20  mined by the.** 
4f90: 73 74 5f 64 65 76 20 61 6e 64 20 73 74 5f 69 6e  st_dev and st_in
4fa0: 6f 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20  o fields of the 
4fb0: 73 74 61 74 20 73 74 72 75 63 74 75 72 65 20 74  stat structure t
4fc0: 68 61 74 20 66 73 74 61 74 28 29 20 66 69 6c 6c  hat fstat() fill
4fd0: 73 20 69 6e 29 0a 2a 2a 20 61 6e 64 20 63 68 65  s in).** and che
4fe0: 63 6b 20 66 6f 72 20 6c 6f 63 6b 73 20 61 6c 72  ck for locks alr
4ff0: 65 61 64 79 20 65 78 69 73 74 69 6e 67 20 6f 6e  eady existing on
5000: 20 74 68 61 74 20 69 6e 6f 64 65 2e 20 20 57 68   that inode.  Wh
5010: 65 6e 20 6c 6f 63 6b 73 20 61 72 65 0a 2a 2a 20  en locks are.** 
5020: 63 72 65 61 74 65 64 20 6f 72 20 72 65 6d 6f 76  created or remov
5030: 65 64 2c 20 77 65 20 68 61 76 65 20 74 6f 20 6c  ed, we have to l
5040: 6f 6f 6b 20 61 74 20 6f 75 72 20 6f 77 6e 20 69  ook at our own i
5050: 6e 74 65 72 6e 61 6c 20 72 65 63 6f 72 64 20 6f  nternal record o
5060: 66 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 73 20 74  f the.** locks t
5070: 6f 20 73 65 65 20 69 66 20 61 6e 6f 74 68 65 72  o see if another
5080: 20 74 68 72 65 61 64 20 68 61 73 20 70 72 65 76   thread has prev
5090: 69 6f 75 73 6c 79 20 73 65 74 20 61 20 6c 6f 63  iously set a loc
50a0: 6b 20 6f 6e 20 74 68 61 74 20 73 61 6d 65 0a 2a  k on that same.*
50b0: 2a 20 69 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 28  * inode..**.** (
50c0: 41 73 69 64 65 3a 20 54 68 65 20 75 73 65 20 6f  Aside: The use o
50d0: 66 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72 73 20  f inode numbers 
50e0: 61 73 20 75 6e 69 71 75 65 20 49 44 73 20 64 6f  as unique IDs do
50f0: 65 73 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 56  es not work on V
5100: 78 57 6f 72 6b 73 2e 0a 2a 2a 20 46 6f 72 20 56  xWorks..** For V
5110: 78 57 6f 72 6b 73 2c 20 77 65 20 68 61 76 65 20  xWorks, we have 
5120: 74 6f 20 75 73 65 20 74 68 65 20 61 6c 74 65 72  to use the alter
5130: 6e 61 74 69 76 65 20 75 6e 69 71 75 65 20 49 44  native unique ID
5140: 20 73 79 73 74 65 6d 20 62 61 73 65 64 20 6f 6e   system based on
5150: 0a 2a 2a 20 63 61 6e 6f 6e 69 63 61 6c 20 66 69  .** canonical fi
5160: 6c 65 6e 61 6d 65 20 61 6e 64 20 69 6d 70 6c 65  lename and imple
5170: 6d 65 6e 74 65 64 20 69 6e 20 74 68 65 20 70 72  mented in the pr
5180: 65 76 69 6f 75 73 20 64 69 76 69 73 69 6f 6e 2e  evious division.
5190: 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69  ).**.** The sqli
51a0: 74 65 33 5f 66 69 6c 65 20 73 74 72 75 63 74 75  te3_file structu
51b0: 72 65 20 66 6f 72 20 50 4f 53 49 58 20 69 73 20  re for POSIX is 
51c0: 6e 6f 20 6c 6f 6e 67 65 72 20 6a 75 73 74 20 61  no longer just a
51d0: 6e 20 69 6e 74 65 67 65 72 20 66 69 6c 65 0a 2a  n integer file.*
51e0: 2a 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 49  * descriptor.  I
51f0: 74 20 69 73 20 6e 6f 77 20 61 20 73 74 72 75 63  t is now a struc
5200: 74 75 72 65 20 74 68 61 74 20 68 6f 6c 64 73 20  ture that holds 
5210: 74 68 65 20 69 6e 74 65 67 65 72 20 66 69 6c 65  the integer file
5220: 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20 61  .** descriptor a
5230: 6e 64 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  nd a pointer to 
5240: 61 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  a structure that
5250: 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 69   describes the i
5260: 6e 74 65 72 6e 61 6c 0a 2a 2a 20 6c 6f 63 6b 73  nternal.** locks
5270: 20 6f 6e 20 74 68 65 20 63 6f 72 72 65 73 70 6f   on the correspo
5280: 6e 64 69 6e 67 20 69 6e 6f 64 65 2e 20 20 54 68  nding inode.  Th
5290: 65 72 65 20 69 73 20 6f 6e 65 20 6c 6f 63 6b 69  ere is one locki
52a0: 6e 67 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20  ng structure.** 
52b0: 70 65 72 20 69 6e 6f 64 65 2c 20 73 6f 20 69 66  per inode, so if
52c0: 20 74 68 65 20 73 61 6d 65 20 69 6e 6f 64 65 20   the same inode 
52d0: 69 73 20 6f 70 65 6e 65 64 20 74 77 69 63 65 2c  is opened twice,
52e0: 20 62 6f 74 68 20 75 6e 69 78 46 69 6c 65 20 73   both unixFile s
52f0: 74 72 75 63 74 75 72 65 73 0a 2a 2a 20 70 6f 69  tructures.** poi
5300: 6e 74 20 74 6f 20 74 68 65 20 73 61 6d 65 20 6c  nt to the same l
5310: 6f 63 6b 69 6e 67 20 73 74 72 75 63 74 75 72 65  ocking structure
5320: 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 73  .  The locking s
5330: 74 72 75 63 74 75 72 65 20 6b 65 65 70 73 0a 2a  tructure keeps.*
5340: 2a 20 61 20 72 65 66 65 72 65 6e 63 65 20 63 6f  * a reference co
5350: 75 6e 74 20 28 73 6f 20 77 65 20 77 69 6c 6c 20  unt (so we will 
5360: 6b 6e 6f 77 20 77 68 65 6e 20 74 6f 20 64 65 6c  know when to del
5370: 65 74 65 20 69 74 29 20 61 6e 64 20 61 20 22 63  ete it) and a "c
5380: 6e 74 22 0a 2a 2a 20 66 69 65 6c 64 20 74 68 61  nt".** field tha
5390: 74 20 74 65 6c 6c 73 20 75 73 20 69 74 73 20 69  t tells us its i
53a0: 6e 74 65 72 6e 61 6c 20 6c 6f 63 6b 20 73 74 61  nternal lock sta
53b0: 74 75 73 2e 20 20 63 6e 74 3d 3d 30 20 6d 65 61  tus.  cnt==0 mea
53c0: 6e 73 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 69  ns the.** file i
53d0: 73 20 75 6e 6c 6f 63 6b 65 64 2e 20 20 63 6e 74  s unlocked.  cnt
53e0: 3d 3d 2d 31 20 6d 65 61 6e 73 20 74 68 65 20 66  ==-1 means the f
53f0: 69 6c 65 20 68 61 73 20 61 6e 20 65 78 63 6c 75  ile has an exclu
5400: 73 69 76 65 20 6c 6f 63 6b 2e 0a 2a 2a 20 63 6e  sive lock..** cn
5410: 74 3e 30 20 6d 65 61 6e 73 20 74 68 65 72 65 20  t>0 means there 
5420: 61 72 65 20 63 6e 74 20 73 68 61 72 65 64 20 6c  are cnt shared l
5430: 6f 63 6b 73 20 6f 6e 20 74 68 65 20 66 69 6c 65  ocks on the file
5440: 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 61 74 74 65  ..**.** Any atte
5450: 6d 70 74 20 74 6f 20 6c 6f 63 6b 20 6f 72 20 75  mpt to lock or u
5460: 6e 6c 6f 63 6b 20 61 20 66 69 6c 65 20 66 69 72  nlock a file fir
5470: 73 74 20 63 68 65 63 6b 73 20 74 68 65 20 6c 6f  st checks the lo
5480: 63 6b 69 6e 67 0a 2a 2a 20 73 74 72 75 63 74 75  cking.** structu
5490: 72 65 2e 20 20 54 68 65 20 66 63 6e 74 6c 28 29  re.  The fcntl()
54a0: 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 69 73 20   system call is 
54b0: 6f 6e 6c 79 20 69 6e 76 6f 6b 65 64 20 74 6f 20  only invoked to 
54c0: 73 65 74 20 61 20 0a 2a 2a 20 50 4f 53 49 58 20  set a .** POSIX 
54d0: 6c 6f 63 6b 20 69 66 20 74 68 65 20 69 6e 74 65  lock if the inte
54e0: 72 6e 61 6c 20 6c 6f 63 6b 20 73 74 72 75 63 74  rnal lock struct
54f0: 75 72 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  ure transitions 
5500: 62 65 74 77 65 65 6e 0a 2a 2a 20 61 20 6c 6f 63  between.** a loc
5510: 6b 65 64 20 61 6e 64 20 61 6e 20 75 6e 6c 6f 63  ked and an unloc
5520: 6b 65 64 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a  ked state..**.**
5530: 20 42 75 74 20 77 61 69 74 3a 20 20 74 68 65 72   But wait:  ther
5540: 65 20 61 72 65 20 79 65 74 20 6d 6f 72 65 20 70  e are yet more p
5550: 72 6f 62 6c 65 6d 73 20 77 69 74 68 20 50 4f 53  roblems with POS
5560: 49 58 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b  IX advisory lock
5570: 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 79 6f 75 20  s..**.** If you 
5580: 63 6c 6f 73 65 20 61 20 66 69 6c 65 20 64 65 73  close a file des
5590: 63 72 69 70 74 6f 72 20 74 68 61 74 20 70 6f 69  criptor that poi
55a0: 6e 74 73 20 74 6f 20 61 20 66 69 6c 65 20 74 68  nts to a file th
55b0: 61 74 20 68 61 73 20 6c 6f 63 6b 73 2c 0a 2a 2a  at has locks,.**
55c0: 20 61 6c 6c 20 6c 6f 63 6b 73 20 6f 6e 20 74 68   all locks on th
55d0: 61 74 20 66 69 6c 65 20 74 68 61 74 20 61 72 65  at file that are
55e0: 20 6f 77 6e 65 64 20 62 79 20 74 68 65 20 63 75   owned by the cu
55f0: 72 72 65 6e 74 20 70 72 6f 63 65 73 73 20 61 72  rrent process ar
5600: 65 0a 2a 2a 20 72 65 6c 65 61 73 65 64 2e 20 20  e.** released.  
5610: 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74  To work around t
5620: 68 69 73 20 70 72 6f 62 6c 65 6d 2c 20 65 61 63  his problem, eac
5630: 68 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63  h unixFile struc
5640: 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a  ture contains.**
5650: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
5660: 20 75 6e 69 78 4f 70 65 6e 43 6e 74 20 73 74 72   unixOpenCnt str
5670: 75 63 74 75 72 65 2e 20 20 54 68 65 72 65 20 69  ucture.  There i
5680: 73 20 6f 6e 65 20 75 6e 69 78 4f 70 65 6e 43 6e  s one unixOpenCn
5690: 74 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 70  t structure.** p
56a0: 65 72 20 6f 70 65 6e 20 69 6e 6f 64 65 2c 20 77  er open inode, w
56b0: 68 69 63 68 20 6d 65 61 6e 73 20 74 68 61 74 20  hich means that 
56c0: 6d 75 6c 74 69 70 6c 65 20 75 6e 69 78 46 69 6c  multiple unixFil
56d0: 65 20 63 61 6e 20 70 6f 69 6e 74 20 74 6f 20 61  e can point to a
56e0: 20 73 69 6e 67 6c 65 0a 2a 2a 20 75 6e 69 78 4f   single.** unixO
56f0: 70 65 6e 43 6e 74 2e 20 20 57 68 65 6e 20 61 6e  penCnt.  When an
5700: 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65   attempt is made
5710: 20 74 6f 20 63 6c 6f 73 65 20 61 6e 20 75 6e 69   to close an uni
5720: 78 46 69 6c 65 2c 20 69 66 20 74 68 65 72 65 20  xFile, if there 
5730: 61 72 65 0a 2a 2a 20 6f 74 68 65 72 20 75 6e 69  are.** other uni
5740: 78 46 69 6c 65 20 6f 70 65 6e 20 6f 6e 20 74 68  xFile open on th
5750: 65 20 73 61 6d 65 20 69 6e 6f 64 65 20 74 68 61  e same inode tha
5760: 74 20 61 72 65 20 68 6f 6c 64 69 6e 67 20 6c 6f  t are holding lo
5770: 63 6b 73 2c 20 74 68 65 20 63 61 6c 6c 0a 2a 2a  cks, the call.**
5780: 20 74 6f 20 63 6c 6f 73 65 28 29 20 74 68 65 20   to close() the 
5790: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
57a0: 69 73 20 64 65 66 65 72 72 65 64 20 75 6e 74 69  is deferred unti
57b0: 6c 20 61 6c 6c 20 6f 66 20 74 68 65 20 6c 6f 63  l all of the loc
57c0: 6b 73 20 63 6c 65 61 72 2e 0a 2a 2a 20 54 68 65  ks clear..** The
57d0: 20 75 6e 69 78 4f 70 65 6e 43 6e 74 20 73 74 72   unixOpenCnt str
57e0: 75 63 74 75 72 65 20 6b 65 65 70 73 20 61 20 6c  ucture keeps a l
57f0: 69 73 74 20 6f 66 20 66 69 6c 65 20 64 65 73 63  ist of file desc
5800: 72 69 70 74 6f 72 73 20 74 68 61 74 20 6e 65 65  riptors that nee
5810: 64 20 74 6f 0a 2a 2a 20 62 65 20 63 6c 6f 73 65  d to.** be close
5820: 64 20 61 6e 64 20 74 68 61 74 20 6c 69 73 74 20  d and that list 
5830: 69 73 20 77 61 6c 6b 65 64 20 28 61 6e 64 20 63  is walked (and c
5840: 6c 65 61 72 65 64 29 20 77 68 65 6e 20 74 68 65  leared) when the
5850: 20 6c 61 73 74 20 6c 6f 63 6b 0a 2a 2a 20 63 6c   last lock.** cl
5860: 65 61 72 73 2e 0a 2a 2a 0a 2a 2a 20 59 65 74 20  ears..**.** Yet 
5870: 61 6e 6f 74 68 65 72 20 70 72 6f 62 6c 65 6d 3a  another problem:
5880: 20 20 4c 69 6e 75 78 54 68 72 65 61 64 73 20 64    LinuxThreads d
5890: 6f 20 6e 6f 74 20 70 6c 61 79 20 77 65 6c 6c 20  o not play well 
58a0: 77 69 74 68 20 70 6f 73 69 78 20 6c 6f 63 6b 73  with posix locks
58b0: 2e 0a 2a 2a 0a 2a 2a 20 4d 61 6e 79 20 6f 6c 64  ..**.** Many old
58c0: 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 6c  er versions of l
58d0: 69 6e 75 78 20 75 73 65 20 74 68 65 20 4c 69 6e  inux use the Lin
58e0: 75 78 54 68 72 65 61 64 73 20 6c 69 62 72 61 72  uxThreads librar
58f0: 79 20 77 68 69 63 68 20 69 73 0a 2a 2a 20 6e 6f  y which is.** no
5900: 74 20 70 6f 73 69 78 20 63 6f 6d 70 6c 69 61 6e  t posix complian
5910: 74 2e 20 20 55 6e 64 65 72 20 4c 69 6e 75 78 54  t.  Under LinuxT
5920: 68 72 65 61 64 73 2c 20 61 20 6c 6f 63 6b 20 63  hreads, a lock c
5930: 72 65 61 74 65 64 20 62 79 20 74 68 72 65 61 64  reated by thread
5940: 0a 2a 2a 20 41 20 63 61 6e 6e 6f 74 20 62 65 20  .** A cannot be 
5950: 6d 6f 64 69 66 69 65 64 20 6f 72 20 6f 76 65 72  modified or over
5960: 72 69 64 64 65 6e 20 62 79 20 61 20 64 69 66 66  ridden by a diff
5970: 65 72 65 6e 74 20 74 68 72 65 61 64 20 42 2e 0a  erent thread B..
5980: 2a 2a 20 4f 6e 6c 79 20 74 68 72 65 61 64 20 41  ** Only thread A
5990: 20 63 61 6e 20 6d 6f 64 69 66 79 20 74 68 65 20   can modify the 
59a0: 6c 6f 63 6b 2e 20 20 4c 6f 63 6b 69 6e 67 20 62  lock.  Locking b
59b0: 65 68 61 76 69 6f 72 20 69 73 20 63 6f 72 72 65  ehavior is corre
59c0: 63 74 0a 2a 2a 20 69 66 20 74 68 65 20 61 70 70  ct.** if the app
59d0: 6c 69 61 74 69 6f 6e 20 75 73 65 73 20 74 68 65  liation uses the
59e0: 20 6e 65 77 65 72 20 4e 61 74 69 76 65 20 50 6f   newer Native Po
59f0: 73 69 78 20 54 68 72 65 61 64 20 4c 69 62 72 61  six Thread Libra
5a00: 72 79 20 28 4e 50 54 4c 29 0a 2a 2a 20 6f 6e 20  ry (NPTL).** on 
5a10: 6c 69 6e 75 78 20 2d 20 77 69 74 68 20 4e 50 54  linux - with NPT
5a20: 4c 20 61 20 6c 6f 63 6b 20 63 72 65 61 74 65 64  L a lock created
5a30: 20 62 79 20 74 68 72 65 61 64 20 41 20 63 61 6e   by thread A can
5a40: 20 6f 76 65 72 72 69 64 65 20 6c 6f 63 6b 73 0a   override locks.
5a50: 2a 2a 20 69 6e 20 74 68 72 65 61 64 20 42 2e 20  ** in thread B. 
5a60: 20 42 75 74 20 74 68 65 72 65 20 69 73 20 6e 6f   But there is no
5a70: 20 77 61 79 20 74 6f 20 6b 6e 6f 77 20 61 74 20   way to know at 
5a80: 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 77 68 69  compile-time whi
5a90: 63 68 0a 2a 2a 20 74 68 72 65 61 64 69 6e 67 20  ch.** threading 
5aa0: 6c 69 62 72 61 72 79 20 69 73 20 62 65 69 6e 67  library is being
5ab0: 20 75 73 65 64 2e 20 20 53 6f 20 74 68 65 72 65   used.  So there
5ac0: 20 69 73 20 6e 6f 20 77 61 79 20 74 6f 20 6b 6e   is no way to kn
5ad0: 6f 77 20 61 74 0a 2a 2a 20 63 6f 6d 70 69 6c 65  ow at.** compile
5ae0: 2d 74 69 6d 65 20 77 68 65 74 68 65 72 20 6f 72  -time whether or
5af0: 20 6e 6f 74 20 74 68 72 65 61 64 20 41 20 63 61   not thread A ca
5b00: 6e 20 6f 76 65 72 72 69 64 65 20 6c 6f 63 6b 73  n override locks
5b10: 20 6f 6e 20 74 68 72 65 61 64 20 42 2e 0a 2a 2a   on thread B..**
5b20: 20 57 65 20 68 61 76 65 20 74 6f 20 64 6f 20 61   We have to do a
5b30: 20 72 75 6e 2d 74 69 6d 65 20 63 68 65 63 6b 20   run-time check 
5b40: 74 6f 20 64 69 73 63 6f 76 65 72 20 74 68 65 20  to discover the 
5b50: 62 65 68 61 76 69 6f 72 20 6f 66 20 74 68 65 0a  behavior of the.
5b60: 2a 2a 20 63 75 72 72 65 6e 74 20 70 72 6f 63 65  ** current proce
5b70: 73 73 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 79 73  ss..**.** On sys
5b80: 74 65 6d 73 20 77 68 65 72 65 20 74 68 72 65 61  tems where threa
5b90: 64 20 41 20 69 73 20 75 6e 61 62 6c 65 20 74 6f  d A is unable to
5ba0: 20 6d 6f 64 69 66 79 20 6c 6f 63 6b 73 20 63 72   modify locks cr
5bb0: 65 61 74 65 64 20 62 79 0a 2a 2a 20 74 68 72 65  eated by.** thre
5bc0: 61 64 20 42 2c 20 77 65 20 68 61 76 65 20 74 6f  ad B, we have to
5bd0: 20 6b 65 65 70 20 74 72 61 63 6b 20 6f 66 20 77   keep track of w
5be0: 68 69 63 68 20 74 68 72 65 61 64 20 63 72 65 61  hich thread crea
5bf0: 74 65 64 20 65 61 63 68 0a 2a 2a 20 6c 6f 63 6b  ted each.** lock
5c00: 2e 20 20 48 65 6e 63 65 20 74 68 65 72 65 20 69  .  Hence there i
5c10: 73 20 61 6e 20 65 78 74 72 61 20 66 69 65 6c 64  s an extra field
5c20: 20 69 6e 20 74 68 65 20 6b 65 79 20 74 6f 20 74   in the key to t
5c30: 68 65 20 75 6e 69 78 4c 6f 63 6b 49 6e 66 6f 0a  he unixLockInfo.
5c40: 2a 2a 20 73 74 72 75 63 74 75 72 65 20 74 6f 20  ** structure to 
5c50: 72 65 63 6f 72 64 20 74 68 69 73 20 69 6e 66 6f  record this info
5c60: 72 6d 61 74 69 6f 6e 2e 20 20 41 6e 64 20 6f 6e  rmation.  And on
5c70: 20 74 68 6f 73 65 20 73 79 73 74 65 6d 73 20 69   those systems i
5c80: 74 0a 2a 2a 20 69 73 20 69 6c 6c 65 67 61 6c 20  t.** is illegal 
5c90: 74 6f 20 62 65 67 69 6e 20 61 20 74 72 61 6e 73  to begin a trans
5ca0: 61 63 74 69 6f 6e 20 69 6e 20 6f 6e 65 20 74 68  action in one th
5cb0: 72 65 61 64 20 61 6e 64 20 66 69 6e 69 73 68 20  read and finish 
5cc0: 69 74 0a 2a 2a 20 69 6e 20 61 6e 6f 74 68 65 72  it.** in another
5cd0: 2e 20 20 46 6f 72 20 74 68 69 73 20 6c 61 74 74  .  For this latt
5ce0: 65 72 20 72 65 73 74 72 69 63 74 69 6f 6e 2c 20  er restriction, 
5cf0: 74 68 65 72 65 20 69 73 20 6e 6f 20 77 6f 72 6b  there is no work
5d00: 2d 61 72 6f 75 6e 64 2e 0a 2a 2a 20 49 74 20 69  -around..** It i
5d10: 73 20 61 20 6c 69 6d 69 74 61 74 69 6f 6e 20 6f  s a limitation o
5d20: 66 20 4c 69 6e 75 78 54 68 72 65 61 64 73 2e 0a  f LinuxThreads..
5d30: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 6f 72  */../*.** Set or
5d40: 20 63 68 65 63 6b 20 74 68 65 20 75 6e 69 78 46   check the unixF
5d50: 69 6c 65 2e 74 69 64 20 66 69 65 6c 64 2e 20 20  ile.tid field.  
5d60: 54 68 69 73 20 66 69 65 6c 64 20 69 73 20 73 65  This field is se
5d70: 74 20 77 68 65 6e 20 61 6e 20 75 6e 69 78 46 69  t when an unixFi
5d80: 6c 65 0a 2a 2a 20 69 73 20 66 69 72 73 74 20 6f  le.** is first o
5d90: 70 65 6e 65 64 2e 20 20 41 6c 6c 20 73 75 62 73  pened.  All subs
5da0: 65 71 75 65 6e 74 20 75 73 65 73 20 6f 66 20 74  equent uses of t
5db0: 68 65 20 75 6e 69 78 46 69 6c 65 20 76 65 72 69  he unixFile veri
5dc0: 66 79 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 73  fy that the.** s
5dd0: 61 6d 65 20 74 68 72 65 61 64 20 69 73 20 6f 70  ame thread is op
5de0: 65 72 61 74 69 6e 67 20 6f 6e 20 74 68 65 20 75  erating on the u
5df0: 6e 69 78 46 69 6c 65 2e 20 20 53 6f 6d 65 20 6f  nixFile.  Some o
5e00: 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 73  perating systems
5e10: 20 64 6f 0a 2a 2a 20 6e 6f 74 20 61 6c 6c 6f 77   do.** not allow
5e20: 20 6c 6f 63 6b 73 20 74 6f 20 62 65 20 6f 76 65   locks to be ove
5e30: 72 72 69 64 64 65 6e 20 62 79 20 6f 74 68 65 72  rridden by other
5e40: 20 74 68 72 65 61 64 73 20 61 6e 64 20 74 68 61   threads and tha
5e50: 74 20 72 65 73 74 72 69 63 74 69 6f 6e 0a 2a 2a  t restriction.**
5e60: 20 6d 65 61 6e 73 20 74 68 61 74 20 73 71 6c 69   means that sqli
5e70: 74 65 33 2a 20 64 61 74 61 62 61 73 65 20 68 61  te3* database ha
5e80: 6e 64 6c 65 73 20 63 61 6e 6e 6f 74 20 62 65 20  ndles cannot be 
5e90: 6d 6f 76 65 64 20 66 72 6f 6d 20 6f 6e 65 20 74  moved from one t
5ea0: 68 72 65 61 64 0a 2a 2a 20 74 6f 20 61 6e 6f 74  hread.** to anot
5eb0: 68 65 72 20 77 68 69 6c 65 20 6c 6f 63 6b 73 20  her while locks 
5ec0: 61 72 65 20 68 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20  are held..**.** 
5ed0: 56 65 72 73 69 6f 6e 20 33 2e 33 2e 31 20 28 32  Version 3.3.1 (2
5ee0: 30 30 36 2d 30 31 2d 31 35 29 3a 20 20 75 6e 69  006-01-15):  uni
5ef0: 78 46 69 6c 65 20 63 61 6e 20 62 65 20 6d 6f 76  xFile can be mov
5f00: 65 64 20 66 72 6f 6d 20 6f 6e 65 20 74 68 72 65  ed from one thre
5f10: 61 64 20 74 6f 0a 2a 2a 20 61 6e 6f 74 68 65 72  ad to.** another
5f20: 20 61 73 20 6c 6f 6e 67 20 61 73 20 77 65 20 61   as long as we a
5f30: 72 65 20 72 75 6e 6e 69 6e 67 20 6f 6e 20 61 20  re running on a 
5f40: 73 79 73 74 65 6d 20 74 68 61 74 20 73 75 70 70  system that supp
5f50: 6f 72 74 73 20 74 68 72 65 61 64 73 0a 2a 2a 20  orts threads.** 
5f60: 6f 76 65 72 72 69 64 69 6e 67 20 65 61 63 68 20  overriding each 
5f70: 6f 74 68 65 72 73 20 6c 6f 63 6b 73 20 28 77 68  others locks (wh
5f80: 69 63 68 20 69 73 20 6e 6f 77 20 74 68 65 20 6d  ich is now the m
5f90: 6f 73 74 20 63 6f 6d 6d 6f 6e 20 62 65 68 61 76  ost common behav
5fa0: 69 6f 72 29 0a 2a 2a 20 6f 72 20 69 66 20 6e 6f  ior).** or if no
5fb0: 20 6c 6f 63 6b 73 20 61 72 65 20 68 65 6c 64 2e   locks are held.
5fc0: 20 20 42 75 74 20 74 68 65 20 75 6e 69 78 46 69    But the unixFi
5fd0: 6c 65 2e 70 4c 6f 63 6b 20 66 69 65 6c 64 20 6e  le.pLock field n
5fe0: 65 65 64 73 20 74 6f 20 62 65 0a 2a 2a 20 72 65  eeds to be.** re
5ff0: 63 6f 6d 70 75 74 65 64 20 62 65 63 61 75 73 65  computed because
6000: 20 69 74 73 20 6b 65 79 20 69 6e 63 6c 75 64 65   its key include
6010: 73 20 74 68 65 20 74 68 72 65 61 64 2d 69 64 2e  s the thread-id.
6020: 20 20 53 65 65 20 74 68 65 20 0a 2a 2a 20 74 72    See the .** tr
6030: 61 6e 73 66 65 72 4f 77 6e 65 72 73 68 69 70 28  ansferOwnership(
6040: 29 20 66 75 6e 63 74 69 6f 6e 20 62 65 6c 6f 77  ) function below
6050: 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   for additional 
6060: 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2f 0a 23  information.*/.#
6070: 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44  if SQLITE_THREAD
6080: 53 41 46 45 20 26 26 20 64 65 66 69 6e 65 64 28  SAFE && defined(
6090: 5f 5f 6c 69 6e 75 78 5f 5f 29 0a 23 20 64 65 66  __linux__).# def
60a0: 69 6e 65 20 53 45 54 5f 54 48 52 45 41 44 49 44  ine SET_THREADID
60b0: 28 58 29 20 20 20 28 58 29 2d 3e 74 69 64 20 3d  (X)   (X)->tid =
60c0: 20 70 74 68 72 65 61 64 5f 73 65 6c 66 28 29 0a   pthread_self().
60d0: 23 20 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 54  # define CHECK_T
60e0: 48 52 45 41 44 49 44 28 58 29 20 28 74 68 72 65  HREADID(X) (thre
60f0: 61 64 73 4f 76 65 72 72 69 64 65 45 61 63 68 4f  adsOverrideEachO
6100: 74 68 65 72 73 4c 6f 63 6b 73 3d 3d 30 20 26 26  thersLocks==0 &&
6110: 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   \.             
6120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 21                 !
6130: 70 74 68 72 65 61 64 5f 65 71 75 61 6c 28 28 58  pthread_equal((X
6140: 29 2d 3e 74 69 64 2c 20 70 74 68 72 65 61 64 5f  )->tid, pthread_
6150: 73 65 6c 66 28 29 29 29 0a 23 65 6c 73 65 0a 23  self())).#else.#
6160: 20 64 65 66 69 6e 65 20 53 45 54 5f 54 48 52 45   define SET_THRE
6170: 41 44 49 44 28 58 29 0a 23 20 64 65 66 69 6e 65  ADID(X).# define
6180: 20 43 48 45 43 4b 5f 54 48 52 45 41 44 49 44 28   CHECK_THREADID(
6190: 58 29 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  X) 0.#endif../*.
61a0: 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f  ** An instance o
61b0: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
61c0: 73 74 72 75 63 74 75 72 65 20 73 65 72 76 65 73  structure serves
61d0: 20 61 73 20 74 68 65 20 6b 65 79 20 75 73 65 64   as the key used
61e0: 0a 2a 2a 20 74 6f 20 6c 6f 63 61 74 65 20 61 20  .** to locate a 
61f0: 70 61 72 74 69 63 75 6c 61 72 20 75 6e 69 78 4f  particular unixO
6200: 70 65 6e 43 6e 74 20 73 74 72 75 63 74 75 72 65  penCnt structure
6210: 20 67 69 76 65 6e 20 69 74 73 20 69 6e 6f 64 65   given its inode
6220: 2e 20 20 54 68 69 73 0a 2a 2a 20 69 73 20 74 68  .  This.** is th
6230: 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 75 6e  e same as the un
6240: 69 78 4c 6f 63 6b 4b 65 79 20 65 78 63 65 70 74  ixLockKey except
6250: 20 74 68 61 74 20 74 68 65 20 74 68 72 65 61 64   that the thread
6260: 20 49 44 20 69 73 20 6f 6d 69 74 74 65 64 2e 0a   ID is omitted..
6270: 2a 2f 0a 73 74 72 75 63 74 20 75 6e 69 78 46 69  */.struct unixFi
6280: 6c 65 49 64 20 7b 0a 20 20 64 65 76 5f 74 20 64  leId {.  dev_t d
6290: 65 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ev;             
62a0: 20 20 20 20 20 2f 2a 20 44 65 76 69 63 65 20 6e       /* Device n
62b0: 75 6d 62 65 72 20 2a 2f 0a 23 69 66 20 4f 53 5f  umber */.#if OS_
62c0: 56 58 57 4f 52 4b 53 0a 20 20 73 74 72 75 63 74  VXWORKS.  struct
62d0: 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a   vxworksFileId *
62e0: 70 49 64 3b 20 20 2f 2a 20 55 6e 69 71 75 65 20  pId;  /* Unique 
62f0: 66 69 6c 65 20 49 44 20 66 6f 72 20 76 78 77 6f  file ID for vxwo
6300: 72 6b 73 2e 20 2a 2f 0a 23 65 6c 73 65 0a 20 20  rks. */.#else.  
6310: 69 6e 6f 5f 74 20 69 6e 6f 3b 20 20 20 20 20 20  ino_t ino;      
6320: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
6330: 6e 6f 64 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 23  node number */.#
6340: 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  endif.};../*.** 
6350: 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  An instance of t
6360: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
6370: 75 63 74 75 72 65 20 73 65 72 76 65 73 20 61 73  ucture serves as
6380: 20 74 68 65 20 6b 65 79 20 75 73 65 64 0a 2a 2a   the key used.**
6390: 20 74 6f 20 6c 6f 63 61 74 65 20 61 20 70 61 72   to locate a par
63a0: 74 69 63 75 6c 61 72 20 75 6e 69 78 4c 6f 63 6b  ticular unixLock
63b0: 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 67  Info structure g
63c0: 69 76 65 6e 20 69 74 73 20 69 6e 6f 64 65 2e 0a  iven its inode..
63d0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 72 65 61 64 73  **.** If threads
63e0: 20 63 61 6e 6e 6f 74 20 6f 76 65 72 72 69 64 65   cannot override
63f0: 20 65 61 63 68 20 6f 74 68 65 72 73 20 6c 6f 63   each others loc
6400: 6b 73 20 28 4c 69 6e 75 78 54 68 72 65 61 64 73  ks (LinuxThreads
6410: 29 2c 20 74 68 65 6e 20 77 65 0a 2a 2a 20 73 65  ), then we.** se
6420: 74 20 74 68 65 20 75 6e 69 78 4c 6f 63 6b 4b 65  t the unixLockKe
6430: 79 2e 74 69 64 20 66 69 65 6c 64 20 74 6f 20 74  y.tid field to t
6440: 68 65 20 74 68 72 65 61 64 20 49 44 2e 20 20 49  he thread ID.  I
6450: 66 20 74 68 72 65 61 64 73 20 63 61 6e 20 6f 76  f threads can ov
6460: 65 72 72 69 64 65 0a 2a 2a 20 65 61 63 68 20 6f  erride.** each o
6470: 74 68 65 72 73 20 6c 6f 63 6b 73 20 28 50 6f 73  thers locks (Pos
6480: 69 78 20 61 6e 64 20 4e 50 54 4c 29 20 74 68 65  ix and NPTL) the
6490: 6e 20 74 69 64 20 69 73 20 61 6c 77 61 79 73 20  n tid is always 
64a0: 73 65 74 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 20  set to zero..** 
64b0: 74 69 64 20 69 73 20 6f 6d 69 74 74 65 64 20 69  tid is omitted i
64c0: 66 20 77 65 20 63 6f 6d 70 69 6c 65 20 77 69 74  f we compile wit
64d0: 68 6f 75 74 20 74 68 72 65 61 64 69 6e 67 20 73  hout threading s
64e0: 75 70 70 6f 72 74 20 6f 72 20 6f 6e 20 61 6e 20  upport or on an 
64f0: 4f 53 0a 2a 2a 20 6f 74 68 65 72 20 74 68 61 6e  OS.** other than
6500: 20 6c 69 6e 75 78 2e 0a 2a 2f 0a 73 74 72 75 63   linux..*/.struc
6510: 74 20 75 6e 69 78 4c 6f 63 6b 4b 65 79 20 7b 0a  t unixLockKey {.
6520: 20 20 73 74 72 75 63 74 20 75 6e 69 78 46 69 6c    struct unixFil
6530: 65 49 64 20 66 69 64 3b 20 20 2f 2a 20 55 6e 69  eId fid;  /* Uni
6540: 71 75 65 20 69 64 65 6e 74 69 66 69 65 72 20 66  que identifier f
6550: 6f 72 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 23  or the file */.#
6560: 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44  if SQLITE_THREAD
6570: 53 41 46 45 20 26 26 20 64 65 66 69 6e 65 64 28  SAFE && defined(
6580: 5f 5f 6c 69 6e 75 78 5f 5f 29 0a 20 20 70 74 68  __linux__).  pth
6590: 72 65 61 64 5f 74 20 74 69 64 3b 20 20 2f 2a 20  read_t tid;  /* 
65a0: 54 68 72 65 61 64 20 49 44 20 6f 66 20 6c 6f 63  Thread ID of loc
65b0: 6b 20 6f 77 6e 65 72 2e 20 5a 65 72 6f 20 69 66  k owner. Zero if
65c0: 20 6e 6f 74 20 75 73 69 6e 67 20 4c 69 6e 75 78   not using Linux
65d0: 54 68 72 65 61 64 73 20 2a 2f 0a 23 65 6e 64 69  Threads */.#endi
65e0: 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69  f.};../*.** An i
65f0: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66  nstance of the f
6600: 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75  ollowing structu
6610: 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  re is allocated 
6620: 66 6f 72 20 65 61 63 68 20 6f 70 65 6e 0a 2a 2a  for each open.**
6630: 20 69 6e 6f 64 65 2e 20 20 4f 72 2c 20 6f 6e 20   inode.  Or, on 
6640: 4c 69 6e 75 78 54 68 72 65 61 64 73 2c 20 74 68  LinuxThreads, th
6650: 65 72 65 20 69 73 20 6f 6e 65 20 6f 66 20 74 68  ere is one of th
6660: 65 73 65 20 73 74 72 75 63 74 75 72 65 73 20 66  ese structures f
6670: 6f 72 0a 2a 2a 20 65 61 63 68 20 69 6e 6f 64 65  or.** each inode
6680: 20 6f 70 65 6e 65 64 20 62 79 20 65 61 63 68 20   opened by each 
6690: 74 68 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 41 20  thread..**.** A 
66a0: 73 69 6e 67 6c 65 20 69 6e 6f 64 65 20 63 61 6e  single inode can
66b0: 20 68 61 76 65 20 6d 75 6c 74 69 70 6c 65 20 66   have multiple f
66c0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 2c  ile descriptors,
66d0: 20 73 6f 20 65 61 63 68 20 75 6e 69 78 46 69 6c   so each unixFil
66e0: 65 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 63  e.** structure c
66f0: 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65  ontains a pointe
6700: 72 20 74 6f 20 61 6e 20 69 6e 73 74 61 6e 63 65  r to an instance
6710: 20 6f 66 20 74 68 69 73 20 6f 62 6a 65 63 74 20   of this object 
6720: 61 6e 64 20 74 68 69 73 0a 2a 2a 20 6f 62 6a 65  and this.** obje
6730: 63 74 20 6b 65 65 70 73 20 61 20 63 6f 75 6e 74  ct keeps a count
6740: 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   of the number o
6750: 66 20 75 6e 69 78 46 69 6c 65 20 70 6f 69 6e 74  f unixFile point
6760: 69 6e 67 20 74 6f 20 69 74 2e 0a 2a 2f 0a 73 74  ing to it..*/.st
6770: 72 75 63 74 20 75 6e 69 78 4c 6f 63 6b 49 6e 66  ruct unixLockInf
6780: 6f 20 7b 0a 20 20 73 74 72 75 63 74 20 75 6e 69  o {.  struct uni
6790: 78 4c 6f 63 6b 4b 65 79 20 6c 6f 63 6b 4b 65 79  xLockKey lockKey
67a0: 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 6f  ;     /* The loo
67b0: 6b 75 70 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74  kup key */.  int
67c0: 20 63 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20   cnt;           
67d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
67e0: 4e 75 6d 62 65 72 20 6f 66 20 53 48 41 52 45 44  Number of SHARED
67f0: 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20   locks held */. 
6800: 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 3b 20 20   int locktype;  
6810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6820: 20 2f 2a 20 4f 6e 65 20 6f 66 20 53 48 41 52 45   /* One of SHARE
6830: 44 5f 4c 4f 43 4b 2c 20 52 45 53 45 52 56 45 44  D_LOCK, RESERVED
6840: 5f 4c 4f 43 4b 20 65 74 63 2e 20 2a 2f 0a 20 20  _LOCK etc. */.  
6850: 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20  int nRef;       
6860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6870: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 6f 69  /* Number of poi
6880: 6e 74 65 72 73 20 74 6f 20 74 68 69 73 20 73 74  nters to this st
6890: 72 75 63 74 75 72 65 20 2a 2f 0a 23 69 66 20 64  ructure */.#if d
68a0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
68b0: 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
68c0: 4c 45 29 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c  LE).  unsigned l
68d0: 6f 6e 67 20 6c 6f 6e 67 20 73 68 61 72 65 64 42  ong long sharedB
68e0: 79 74 65 3b 20 20 2f 2a 20 66 6f 72 20 41 46 50  yte;  /* for AFP
68f0: 20 73 69 6d 75 6c 61 74 65 64 20 73 68 61 72 65   simulated share
6900: 64 20 6c 6f 63 6b 20 2a 2f 0a 23 65 6e 64 69 66  d lock */.#endif
6910: 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78 4c 6f  .  struct unixLo
6920: 63 6b 49 6e 66 6f 20 2a 70 4e 65 78 74 3b 20 20  ckInfo *pNext;  
6930: 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61 6c     /* List of al
6940: 6c 20 75 6e 69 78 4c 6f 63 6b 49 6e 66 6f 20 6f  l unixLockInfo o
6950: 62 6a 65 63 74 73 20 2a 2f 0a 20 20 73 74 72 75  bjects */.  stru
6960: 63 74 20 75 6e 69 78 4c 6f 63 6b 49 6e 66 6f 20  ct unixLockInfo 
6970: 2a 70 50 72 65 76 3b 20 20 20 20 20 2f 2a 20 20  *pPrev;     /*  
6980: 20 20 2e 2e 2e 2e 20 64 6f 75 62 6c 79 20 6c 69    .... doubly li
6990: 6e 6b 65 64 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  nked */.};../*.*
69a0: 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
69b0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
69c0: 74 72 75 63 74 75 72 65 20 69 73 20 61 6c 6c 6f  tructure is allo
69d0: 63 61 74 65 64 20 66 6f 72 20 65 61 63 68 20 6f  cated for each o
69e0: 70 65 6e 0a 2a 2a 20 69 6e 6f 64 65 2e 20 20 54  pen.** inode.  T
69f0: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 6b 65  his structure ke
6a00: 65 70 73 20 74 72 61 63 6b 20 6f 66 20 74 68 65  eps track of the
6a10: 20 6e 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73   number of locks
6a20: 20 6f 6e 20 74 68 61 74 0a 2a 2a 20 69 6e 6f 64   on that.** inod
6a30: 65 2e 20 20 49 66 20 61 20 63 6c 6f 73 65 20 69  e.  If a close i
6a40: 73 20 61 74 74 65 6d 70 74 65 64 20 61 67 61 69  s attempted agai
6a50: 6e 73 74 20 61 6e 20 69 6e 6f 64 65 20 74 68 61  nst an inode tha
6a60: 74 20 69 73 20 68 6f 6c 64 69 6e 67 0a 2a 2a 20  t is holding.** 
6a70: 6c 6f 63 6b 73 2c 20 74 68 65 20 63 6c 6f 73 65  locks, the close
6a80: 20 69 73 20 64 65 66 65 72 72 65 64 20 75 6e 74   is deferred unt
6a90: 69 6c 20 61 6c 6c 20 6c 6f 63 6b 73 20 63 6c 65  il all locks cle
6aa0: 61 72 20 62 79 20 61 64 64 69 6e 67 20 74 68 65  ar by adding the
6ab0: 0a 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70  .** file descrip
6ac0: 74 6f 72 20 74 6f 20 62 65 20 63 6c 6f 73 65 64  tor to be closed
6ad0: 20 74 6f 20 74 68 65 20 70 65 6e 64 69 6e 67 20   to the pending 
6ae0: 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f  list..**.** TODO
6af0: 3a 20 20 43 6f 6e 73 69 64 65 72 20 63 68 61 6e  :  Consider chan
6b00: 67 69 6e 67 20 74 68 69 73 20 73 6f 20 74 68 61  ging this so tha
6b10: 74 20 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20  t there is only 
6b20: 61 20 73 69 6e 67 6c 65 20 66 69 6c 65 0a 2a 2a  a single file.**
6b30: 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20   descriptor for 
6b40: 65 61 63 68 20 6f 70 65 6e 20 66 69 6c 65 2c 20  each open file, 
6b50: 65 76 65 6e 20 77 68 65 6e 20 69 74 20 69 73 20  even when it is 
6b60: 6f 70 65 6e 65 64 20 6d 75 6c 74 69 70 6c 65 20  opened multiple 
6b70: 74 69 6d 65 73 2e 0a 2a 2a 20 54 68 65 20 63 6c  times..** The cl
6b80: 6f 73 65 28 29 20 73 79 73 74 65 6d 20 63 61 6c  ose() system cal
6b90: 6c 20 77 6f 75 6c 64 20 6f 6e 6c 79 20 6f 63 63  l would only occ
6ba0: 75 72 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74  ur when the last
6bb0: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 75 73 69   database.** usi
6bc0: 6e 67 20 74 68 65 20 66 69 6c 65 20 63 6c 6f 73  ng the file clos
6bd0: 65 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 75 6e  es..*/.struct un
6be0: 69 78 4f 70 65 6e 43 6e 74 20 7b 0a 20 20 73 74  ixOpenCnt {.  st
6bf0: 72 75 63 74 20 75 6e 69 78 46 69 6c 65 49 64 20  ruct unixFileId 
6c00: 66 69 6c 65 49 64 3b 20 20 20 2f 2a 20 54 68 65  fileId;   /* The
6c10: 20 6c 6f 6f 6b 75 70 20 6b 65 79 20 2a 2f 0a 20   lookup key */. 
6c20: 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20   int nRef;      
6c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6c40: 4e 75 6d 62 65 72 20 6f 66 20 70 6f 69 6e 74 65  Number of pointe
6c50: 72 73 20 74 6f 20 74 68 69 73 20 73 74 72 75 63  rs to this struc
6c60: 74 75 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c  ture */.  int nL
6c70: 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ock;            
6c80: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
6c90: 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c  of outstanding l
6ca0: 6f 63 6b 73 20 2a 2f 0a 20 20 55 6e 69 78 55 6e  ocks */.  UnixUn
6cb0: 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64 3b  usedFd *pUnused;
6cc0: 20 20 20 20 20 20 2f 2a 20 55 6e 75 73 65 64 20        /* Unused 
6cd0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73  file descriptors
6ce0: 20 74 6f 20 63 6c 6f 73 65 20 2a 2f 0a 23 69 66   to close */.#if
6cf0: 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73 65   OS_VXWORKS.  se
6d00: 6d 5f 74 20 2a 70 53 65 6d 3b 20 20 20 20 20 20  m_t *pSem;      
6d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
6d20: 2a 20 4e 61 6d 65 64 20 50 4f 53 49 58 20 73 65  * Named POSIX se
6d30: 6d 61 70 68 6f 72 65 20 2a 2f 0a 20 20 63 68 61  maphore */.  cha
6d40: 72 20 61 53 65 6d 4e 61 6d 65 5b 4d 41 58 5f 50  r aSemName[MAX_P
6d50: 41 54 48 4e 41 4d 45 2b 32 5d 3b 20 20 20 2f 2a  ATHNAME+2];   /*
6d60: 20 4e 61 6d 65 20 6f 66 20 74 68 61 74 20 73 65   Name of that se
6d70: 6d 61 70 68 6f 72 65 20 2a 2f 0a 23 65 6e 64 69  maphore */.#endi
6d80: 66 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78 4f  f.  struct unixO
6d90: 70 65 6e 43 6e 74 20 2a 70 4e 65 78 74 2c 20 2a  penCnt *pNext, *
6da0: 70 50 72 65 76 3b 20 20 20 2f 2a 20 4c 69 73 74  pPrev;   /* List
6db0: 20 6f 66 20 61 6c 6c 20 75 6e 69 78 4f 70 65 6e   of all unixOpen
6dc0: 43 6e 74 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 7d  Cnt objects */.}
6dd0: 3b 0a 0a 2f 2a 0a 2a 2a 20 4c 69 73 74 73 20 6f  ;../*.** Lists o
6de0: 66 20 61 6c 6c 20 75 6e 69 78 4c 6f 63 6b 49 6e  f all unixLockIn
6df0: 66 6f 20 61 6e 64 20 75 6e 69 78 4f 70 65 6e 43  fo and unixOpenC
6e00: 6e 74 20 6f 62 6a 65 63 74 73 2e 20 20 54 68 65  nt objects.  The
6e10: 73 65 20 75 73 65 64 20 74 6f 20 62 65 20 68 61  se used to be ha
6e20: 73 68 0a 2a 2a 20 74 61 62 6c 65 73 2e 20 20 42  sh.** tables.  B
6e30: 75 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ut the number of
6e40: 20 6f 62 6a 65 63 74 73 20 69 73 20 72 61 72 65   objects is rare
6e50: 6c 79 20 6d 6f 72 65 20 74 68 61 6e 20 61 20 64  ly more than a d
6e60: 6f 7a 65 6e 20 61 6e 64 0a 2a 2a 20 6e 65 76 65  ozen and.** neve
6e70: 72 20 65 78 63 65 65 64 73 20 61 20 66 65 77 20  r exceeds a few 
6e80: 74 68 6f 75 73 61 6e 64 2e 20 20 41 6e 64 20 6c  thousand.  And l
6e90: 6f 6f 6b 75 70 20 69 73 20 6e 6f 74 20 6f 6e 20  ookup is not on 
6ea0: 61 20 63 72 69 74 69 63 61 6c 0a 2a 2a 20 70 61  a critical.** pa
6eb0: 74 68 20 73 6f 20 61 20 73 69 6d 70 6c 65 20 6c  th so a simple l
6ec0: 69 6e 6b 65 64 20 6c 69 73 74 20 77 69 6c 6c 20  inked list will 
6ed0: 73 75 66 66 69 63 65 2e 0a 2a 2f 0a 73 74 61 74  suffice..*/.stat
6ee0: 69 63 20 73 74 72 75 63 74 20 75 6e 69 78 4c 6f  ic struct unixLo
6ef0: 63 6b 49 6e 66 6f 20 2a 6c 6f 63 6b 4c 69 73 74  ckInfo *lockList
6f00: 20 3d 20 30 3b 0a 73 74 61 74 69 63 20 73 74 72   = 0;.static str
6f10: 75 63 74 20 75 6e 69 78 4f 70 65 6e 43 6e 74 20  uct unixOpenCnt 
6f20: 2a 6f 70 65 6e 4c 69 73 74 20 3d 20 30 3b 0a 0a  *openList = 0;..
6f30: 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 61 72 69 61  /*.** This varia
6f40: 62 6c 65 20 72 65 6d 65 6d 62 65 72 73 20 77 68  ble remembers wh
6f50: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 72  ether or not thr
6f60: 65 61 64 73 20 63 61 6e 20 6f 76 65 72 72 69 64  eads can overrid
6f70: 65 20 65 61 63 68 20 6f 74 68 65 72 73 0a 2a 2a  e each others.**
6f80: 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 20 20   locks..**.**   
6f90: 20 30 3a 20 20 4e 6f 2e 20 20 54 68 72 65 61 64   0:  No.  Thread
6fa0: 73 20 63 61 6e 6e 6f 74 20 6f 76 65 72 72 69 64  s cannot overrid
6fb0: 65 20 65 61 63 68 20 6f 74 68 65 72 73 20 6c 6f  e each others lo
6fc0: 63 6b 73 2e 20 20 28 4c 69 6e 75 78 54 68 72 65  cks.  (LinuxThre
6fd0: 61 64 73 29 0a 2a 2a 20 20 20 20 31 3a 20 20 59  ads).**    1:  Y
6fe0: 65 73 2e 20 20 54 68 72 65 61 64 73 20 63 61 6e  es.  Threads can
6ff0: 20 6f 76 65 72 72 69 64 65 20 65 61 63 68 20 6f   override each o
7000: 74 68 65 72 73 20 6c 6f 63 6b 73 2e 20 20 28 50  thers locks.  (P
7010: 6f 73 69 78 20 26 20 4e 4c 50 54 29 0a 2a 2a 20  osix & NLPT).** 
7020: 20 20 2d 31 3a 20 20 57 65 20 64 6f 6e 27 74 20    -1:  We don't 
7030: 6b 6e 6f 77 20 79 65 74 2e 0a 2a 2a 0a 2a 2a 20  know yet..**.** 
7040: 4f 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 2c  On some systems,
7050: 20 77 65 20 6b 6e 6f 77 20 61 74 20 63 6f 6d 70   we know at comp
7060: 69 6c 65 2d 74 69 6d 65 20 69 66 20 74 68 72 65  ile-time if thre
7070: 61 64 73 20 63 61 6e 20 6f 76 65 72 72 69 64 65  ads can override
7080: 20 65 61 63 68 0a 2a 2a 20 6f 74 68 65 72 73 20   each.** others 
7090: 6c 6f 63 6b 73 2e 20 20 4f 6e 20 74 68 6f 73 65  locks.  On those
70a0: 20 73 79 73 74 65 6d 73 2c 20 74 68 65 20 53 51   systems, the SQ
70b0: 4c 49 54 45 5f 54 48 52 45 41 44 5f 4f 56 45 52  LITE_THREAD_OVER
70c0: 52 49 44 45 5f 4c 4f 43 4b 20 6d 61 63 72 6f 0a  RIDE_LOCK macro.
70d0: 2a 2a 20 77 69 6c 6c 20 62 65 20 73 65 74 20 61  ** will be set a
70e0: 70 70 72 6f 70 72 69 61 74 65 6c 79 2e 20 20 4f  ppropriately.  O
70f0: 6e 20 6f 74 68 65 72 20 73 79 73 74 65 6d 73 2c  n other systems,
7100: 20 77 65 20 68 61 76 65 20 74 6f 20 63 68 65 63   we have to chec
7110: 6b 20 61 74 0a 2a 2a 20 72 75 6e 74 69 6d 65 2e  k at.** runtime.
7120: 20 20 4f 6e 20 74 68 65 73 65 20 6c 61 74 74 65    On these latte
7130: 72 20 73 79 73 74 65 6d 73 2c 20 53 51 4c 54 49  r systems, SQLTI
7140: 45 5f 54 48 52 45 41 44 5f 4f 56 45 52 52 49 44  E_THREAD_OVERRID
7150: 45 5f 4c 4f 43 4b 20 69 73 0a 2a 2a 20 75 6e 64  E_LOCK is.** und
7160: 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  efined..**.** Th
7170: 69 73 20 76 61 72 69 61 62 6c 65 20 6e 6f 72 6d  is variable norm
7180: 61 6c 6c 79 20 68 61 73 20 66 69 6c 65 20 73 63  ally has file sc
7190: 6f 70 65 20 6f 6e 6c 79 2e 20 20 42 75 74 20 64  ope only.  But d
71a0: 75 72 69 6e 67 20 74 65 73 74 69 6e 67 2c 20 77  uring testing, w
71b0: 65 20 6d 61 6b 65 0a 2a 2a 20 69 74 20 61 20 67  e make.** it a g
71c0: 6c 6f 62 61 6c 20 73 6f 20 74 68 61 74 20 74 68  lobal so that th
71d0: 65 20 74 65 73 74 20 63 6f 64 65 20 63 61 6e 20  e test code can 
71e0: 63 68 61 6e 67 65 20 69 74 73 20 76 61 6c 75 65  change its value
71f0: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 76 65 72   in order to ver
7200: 69 66 79 0a 2a 2a 20 74 68 61 74 20 74 68 65 20  ify.** that the 
7210: 72 69 67 68 74 20 73 74 75 66 66 20 68 61 70 70  right stuff happ
7220: 65 6e 73 20 69 6e 20 65 69 74 68 65 72 20 63 61  ens in either ca
7230: 73 65 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54  se..*/.#if SQLIT
7240: 45 5f 54 48 52 45 41 44 53 41 46 45 20 26 26 20  E_THREADSAFE && 
7250: 64 65 66 69 6e 65 64 28 5f 5f 6c 69 6e 75 78 5f  defined(__linux_
7260: 5f 29 0a 23 20 20 69 66 6e 64 65 66 20 53 51 4c  _).#  ifndef SQL
7270: 49 54 45 5f 54 48 52 45 41 44 5f 4f 56 45 52 52  ITE_THREAD_OVERR
7280: 49 44 45 5f 4c 4f 43 4b 0a 23 20 20 20 20 64 65  IDE_LOCK.#    de
7290: 66 69 6e 65 20 53 51 4c 49 54 45 5f 54 48 52 45  fine SQLITE_THRE
72a0: 41 44 5f 4f 56 45 52 52 49 44 45 5f 4c 4f 43 4b  AD_OVERRIDE_LOCK
72b0: 20 2d 31 0a 23 20 20 65 6e 64 69 66 0a 23 20 20   -1.#  endif.#  
72c0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
72d0: 54 0a 69 6e 74 20 74 68 72 65 61 64 73 4f 76 65  T.int threadsOve
72e0: 72 72 69 64 65 45 61 63 68 4f 74 68 65 72 73 4c  rrideEachOthersL
72f0: 6f 63 6b 73 20 3d 20 53 51 4c 49 54 45 5f 54 48  ocks = SQLITE_TH
7300: 52 45 41 44 5f 4f 56 45 52 52 49 44 45 5f 4c 4f  READ_OVERRIDE_LO
7310: 43 4b 3b 0a 23 20 20 65 6c 73 65 0a 73 74 61 74  CK;.#  else.stat
7320: 69 63 20 69 6e 74 20 74 68 72 65 61 64 73 4f 76  ic int threadsOv
7330: 65 72 72 69 64 65 45 61 63 68 4f 74 68 65 72 73  errideEachOthers
7340: 4c 6f 63 6b 73 20 3d 20 53 51 4c 49 54 45 5f 54  Locks = SQLITE_T
7350: 48 52 45 41 44 5f 4f 56 45 52 52 49 44 45 5f 4c  HREAD_OVERRIDE_L
7360: 4f 43 4b 3b 0a 23 20 20 65 6e 64 69 66 0a 23 65  OCK;.#  endif.#e
7370: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
7380: 20 73 74 72 75 63 74 75 72 65 20 68 6f 6c 64 73   structure holds
7390: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 70 61 73   information pas
73a0: 73 65 64 20 69 6e 74 6f 20 69 6e 64 69 76 69 64  sed into individ
73b0: 75 61 6c 20 74 65 73 74 0a 2a 2a 20 74 68 72 65  ual test.** thre
73c0: 61 64 73 20 62 79 20 74 68 65 20 74 65 73 74 54  ads by the testT
73d0: 68 72 65 61 64 4c 6f 63 6b 69 6e 67 42 65 68 61  hreadLockingBeha
73e0: 76 69 6f 72 28 29 20 72 6f 75 74 69 6e 65 2e 0a  vior() routine..
73f0: 2a 2f 0a 73 74 72 75 63 74 20 74 68 72 65 61 64  */.struct thread
7400: 54 65 73 74 44 61 74 61 20 7b 0a 20 20 69 6e 74  TestData {.  int
7410: 20 66 64 3b 20 20 20 20 20 20 20 20 20 20 20 20   fd;            
7420: 20 20 20 20 2f 2a 20 46 69 6c 65 20 74 6f 20 62      /* File to b
7430: 65 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 73 74  e locked */.  st
7440: 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b  ruct flock lock;
7450: 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 63 6b       /* The lock
7460: 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f  ing operation */
7470: 0a 20 20 69 6e 74 20 72 65 73 75 6c 74 3b 20 20  .  int result;  
7480: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
7490: 75 6c 74 20 6f 66 20 74 68 65 20 6c 6f 63 6b 69  ult of the locki
74a0: 6e 67 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a  ng operation */.
74b0: 7d 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 54  };..#if SQLITE_T
74c0: 48 52 45 41 44 53 41 46 45 20 26 26 20 64 65 66  HREADSAFE && def
74d0: 69 6e 65 64 28 5f 5f 6c 69 6e 75 78 5f 5f 29 0a  ined(__linux__).
74e0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
74f0: 69 6f 6e 20 69 73 20 75 73 65 64 20 61 73 20 74  ion is used as t
7500: 68 65 20 6d 61 69 6e 20 72 6f 75 74 69 6e 65 20  he main routine 
7510: 66 6f 72 20 61 20 74 68 72 65 61 64 20 6c 61 75  for a thread lau
7520: 6e 63 68 65 64 20 62 79 0a 2a 2a 20 74 65 73 74  nched by.** test
7530: 54 68 72 65 61 64 4c 6f 63 6b 69 6e 67 42 65 68  ThreadLockingBeh
7540: 61 76 69 6f 72 28 29 2e 20 49 74 20 74 65 73 74  avior(). It test
7550: 73 20 77 68 65 74 68 65 72 20 74 68 65 20 73 68  s whether the sh
7560: 61 72 65 64 2d 6c 6f 63 6b 20 6f 62 74 61 69 6e  ared-lock obtain
7570: 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 6d 61 69  ed.** by the mai
7580: 6e 20 74 68 72 65 61 64 20 69 6e 20 74 65 73 74  n thread in test
7590: 54 68 72 65 61 64 4c 6f 63 6b 69 6e 67 42 65 68  ThreadLockingBeh
75a0: 61 76 69 6f 72 28 29 20 63 6f 6e 66 6c 69 63 74  avior() conflict
75b0: 73 20 77 69 74 68 20 61 0a 2a 2a 20 68 79 70 6f  s with a.** hypo
75c0: 74 68 65 74 69 63 61 6c 20 77 72 69 74 65 2d 6c  thetical write-l
75d0: 6f 63 6b 20 6f 62 74 61 69 6e 65 64 20 62 79 20  ock obtained by 
75e0: 74 68 69 73 20 74 68 72 65 61 64 20 6f 6e 20 74  this thread on t
75f0: 68 65 20 73 61 6d 65 20 66 69 6c 65 2e 0a 2a 2a  he same file..**
7600: 0a 2a 2a 20 54 68 65 20 77 72 69 74 65 2d 6c 6f  .** The write-lo
7610: 63 6b 20 69 73 20 6e 6f 74 20 61 63 74 75 61 6c  ck is not actual
7620: 6c 79 20 61 63 71 75 69 72 65 64 2c 20 61 73 20  ly acquired, as 
7630: 74 68 69 73 20 69 73 20 6e 6f 74 20 70 6f 73 73  this is not poss
7640: 69 62 6c 65 20 69 66 20 0a 2a 2a 20 74 68 65 20  ible if .** the 
7650: 66 69 6c 65 20 69 73 20 6f 70 65 6e 20 69 6e 20  file is open in 
7660: 72 65 61 64 2d 6f 6e 6c 79 20 6d 6f 64 65 20 28  read-only mode (
7670: 73 65 65 20 74 69 63 6b 65 74 20 23 33 34 37 32  see ticket #3472
7680: 29 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f  )..*/ .static vo
7690: 69 64 20 2a 74 68 72 65 61 64 4c 6f 63 6b 69 6e  id *threadLockin
76a0: 67 54 65 73 74 28 76 6f 69 64 20 2a 70 41 72 67  gTest(void *pArg
76b0: 29 7b 0a 20 20 73 74 72 75 63 74 20 74 68 72 65  ){.  struct thre
76c0: 61 64 54 65 73 74 44 61 74 61 20 2a 70 44 61 74  adTestData *pDat
76d0: 61 20 3d 20 28 73 74 72 75 63 74 20 74 68 72 65  a = (struct thre
76e0: 61 64 54 65 73 74 44 61 74 61 2a 29 70 41 72 67  adTestData*)pArg
76f0: 3b 0a 20 20 70 44 61 74 61 2d 3e 72 65 73 75 6c  ;.  pData->resul
7700: 74 20 3d 20 66 63 6e 74 6c 28 70 44 61 74 61 2d  t = fcntl(pData-
7710: 3e 66 64 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 70  >fd, F_GETLK, &p
7720: 44 61 74 61 2d 3e 6c 6f 63 6b 29 3b 0a 20 20 72  Data->lock);.  r
7730: 65 74 75 72 6e 20 70 41 72 67 3b 0a 7d 0a 23 65  eturn pArg;.}.#e
7740: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 54  ndif /* SQLITE_T
7750: 48 52 45 41 44 53 41 46 45 20 26 26 20 64 65 66  HREADSAFE && def
7760: 69 6e 65 64 28 5f 5f 6c 69 6e 75 78 5f 5f 29 20  ined(__linux__) 
7770: 2a 2f 0a 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  */...#if SQLITE_
7780: 54 48 52 45 41 44 53 41 46 45 20 26 26 20 64 65  THREADSAFE && de
7790: 66 69 6e 65 64 28 5f 5f 6c 69 6e 75 78 5f 5f 29  fined(__linux__)
77a0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 70 72 6f 63  ./*.** This proc
77b0: 65 64 75 72 65 20 61 74 74 65 6d 70 74 73 20 74  edure attempts t
77c0: 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65 74  o determine whet
77d0: 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 72 65 61  her or not threa
77e0: 64 73 0a 2a 2a 20 63 61 6e 20 6f 76 65 72 72 69  ds.** can overri
77f0: 64 65 20 65 61 63 68 20 6f 74 68 65 72 73 20 6c  de each others l
7800: 6f 63 6b 73 20 74 68 65 6e 20 73 65 74 73 20 74  ocks then sets t
7810: 68 65 20 0a 2a 2a 20 74 68 72 65 61 64 73 4f 76  he .** threadsOv
7820: 65 72 72 69 64 65 45 61 63 68 4f 74 68 65 72 73  errideEachOthers
7830: 4c 6f 63 6b 73 20 76 61 72 69 61 62 6c 65 20 61  Locks variable a
7840: 70 70 72 6f 70 72 69 61 74 65 6c 79 2e 0a 2a 2f  ppropriately..*/
7850: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 65 73  .static void tes
7860: 74 54 68 72 65 61 64 4c 6f 63 6b 69 6e 67 42 65  tThreadLockingBe
7870: 68 61 76 69 6f 72 28 69 6e 74 20 66 64 5f 6f 72  havior(int fd_or
7880: 69 67 29 7b 0a 20 20 69 6e 74 20 66 64 3b 0a 20  ig){.  int fd;. 
7890: 20 69 6e 74 20 72 63 3b 0a 20 20 73 74 72 75 63   int rc;.  struc
78a0: 74 20 74 68 72 65 61 64 54 65 73 74 44 61 74 61  t threadTestData
78b0: 20 64 3b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f   d;.  struct flo
78c0: 63 6b 20 6c 3b 0a 20 20 70 74 68 72 65 61 64 5f  ck l;.  pthread_
78d0: 74 20 74 3b 0a 0a 20 20 66 64 20 3d 20 64 75 70  t t;..  fd = dup
78e0: 28 66 64 5f 6f 72 69 67 29 3b 0a 20 20 69 66 28  (fd_orig);.  if(
78f0: 20 66 64 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a   fd<0 ) return;.
7900: 20 20 6d 65 6d 73 65 74 28 26 6c 2c 20 30 2c 20    memset(&l, 0, 
7910: 73 69 7a 65 6f 66 28 6c 29 29 3b 0a 20 20 6c 2e  sizeof(l));.  l.
7920: 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b  l_type = F_RDLCK
7930: 3b 0a 20 20 6c 2e 6c 5f 6c 65 6e 20 3d 20 31 3b  ;.  l.l_len = 1;
7940: 0a 20 20 6c 2e 6c 5f 73 74 61 72 74 20 3d 20 30  .  l.l_start = 0
7950: 3b 0a 20 20 6c 2e 6c 5f 77 68 65 6e 63 65 20 3d  ;.  l.l_whence =
7960: 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 72 63 20   SEEK_SET;.  rc 
7970: 3d 20 66 63 6e 74 6c 28 66 64 5f 6f 72 69 67 2c  = fcntl(fd_orig,
7980: 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 29 3b 0a 20   F_SETLK, &l);. 
7990: 20 69 66 28 20 72 63 21 3d 30 20 29 20 72 65 74   if( rc!=0 ) ret
79a0: 75 72 6e 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64  urn;.  memset(&d
79b0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64 29 29 3b  , 0, sizeof(d));
79c0: 0a 20 20 64 2e 66 64 20 3d 20 66 64 3b 0a 20 20  .  d.fd = fd;.  
79d0: 64 2e 6c 6f 63 6b 20 3d 20 6c 3b 0a 20 20 64 2e  d.lock = l;.  d.
79e0: 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f  lock.l_type = F_
79f0: 57 52 4c 43 4b 3b 0a 20 20 69 66 28 20 70 74 68  WRLCK;.  if( pth
7a00: 72 65 61 64 5f 63 72 65 61 74 65 28 26 74 2c 20  read_create(&t, 
7a10: 30 2c 20 74 68 72 65 61 64 4c 6f 63 6b 69 6e 67  0, threadLocking
7a20: 54 65 73 74 2c 20 26 64 29 3d 3d 30 20 29 7b 0a  Test, &d)==0 ){.
7a30: 20 20 20 20 70 74 68 72 65 61 64 5f 6a 6f 69 6e      pthread_join
7a40: 28 74 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 63 6c  (t, 0);.  }.  cl
7a50: 6f 73 65 28 66 64 29 3b 0a 20 20 69 66 28 20 64  ose(fd);.  if( d
7a60: 2e 72 65 73 75 6c 74 21 3d 30 20 29 20 72 65 74  .result!=0 ) ret
7a70: 75 72 6e 3b 0a 20 20 74 68 72 65 61 64 73 4f 76  urn;.  threadsOv
7a80: 65 72 72 69 64 65 45 61 63 68 4f 74 68 65 72 73  errideEachOthers
7a90: 4c 6f 63 6b 73 20 3d 20 28 64 2e 6c 6f 63 6b 2e  Locks = (d.lock.
7aa0: 6c 5f 74 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 29  l_type==F_UNLCK)
7ab0: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
7ac0: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 20  LITE_THREADSAFE 
7ad0: 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 6c 69 6e  && defined(__lin
7ae0: 75 78 5f 5f 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  ux__) */../*.** 
7af0: 52 65 6c 65 61 73 65 20 61 20 75 6e 69 78 4c 6f  Release a unixLo
7b00: 63 6b 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  ckInfo structure
7b10: 20 70 72 65 76 69 6f 75 73 6c 79 20 61 6c 6c 6f   previously allo
7b20: 63 61 74 65 64 20 62 79 20 66 69 6e 64 4c 6f 63  cated by findLoc
7b30: 6b 49 6e 66 6f 28 29 2e 0a 2a 2a 0a 2a 2a 20 54  kInfo()..**.** T
7b40: 68 65 20 6d 75 74 65 78 20 65 6e 74 65 72 65 64  he mutex entered
7b50: 20 75 73 69 6e 67 20 74 68 65 20 75 6e 69 78 45   using the unixE
7b60: 6e 74 65 72 4d 75 74 65 78 28 29 20 66 75 6e 63  nterMutex() func
7b70: 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 68 65 6c  tion must be hel
7b80: 64 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73 20 66  d.** when this f
7b90: 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
7ba0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
7bb0: 64 20 72 65 6c 65 61 73 65 4c 6f 63 6b 49 6e 66  d releaseLockInf
7bc0: 6f 28 73 74 72 75 63 74 20 75 6e 69 78 4c 6f 63  o(struct unixLoc
7bd0: 6b 49 6e 66 6f 20 2a 70 4c 6f 63 6b 29 7b 0a 20  kInfo *pLock){. 
7be0: 20 61 73 73 65 72 74 28 20 75 6e 69 78 4d 75 74   assert( unixMut
7bf0: 65 78 48 65 6c 64 28 29 20 29 3b 0a 20 20 69 66  exHeld() );.  if
7c00: 28 20 70 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70  ( pLock ){.    p
7c10: 4c 6f 63 6b 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20  Lock->nRef--;.  
7c20: 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 6e 52 65    if( pLock->nRe
7c30: 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  f==0 ){.      if
7c40: 28 20 70 4c 6f 63 6b 2d 3e 70 50 72 65 76 20 29  ( pLock->pPrev )
7c50: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
7c60: 28 20 70 4c 6f 63 6b 2d 3e 70 50 72 65 76 2d 3e  ( pLock->pPrev->
7c70: 70 4e 65 78 74 3d 3d 70 4c 6f 63 6b 20 29 3b 0a  pNext==pLock );.
7c80: 20 20 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 70          pLock->p
7c90: 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 4c  Prev->pNext = pL
7ca0: 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  ock->pNext;.    
7cb0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
7cc0: 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 4c 69 73   assert( lockLis
7cd0: 74 3d 3d 70 4c 6f 63 6b 20 29 3b 0a 20 20 20 20  t==pLock );.    
7ce0: 20 20 20 20 6c 6f 63 6b 4c 69 73 74 20 3d 20 70      lockList = p
7cf0: 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  Lock->pNext;.   
7d00: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
7d10: 4c 6f 63 6b 2d 3e 70 4e 65 78 74 20 29 7b 0a 20  Lock->pNext ){. 
7d20: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
7d30: 4c 6f 63 6b 2d 3e 70 4e 65 78 74 2d 3e 70 50 72  Lock->pNext->pPr
7d40: 65 76 3d 3d 70 4c 6f 63 6b 20 29 3b 0a 20 20 20  ev==pLock );.   
7d50: 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78       pLock->pNex
7d60: 74 2d 3e 70 50 72 65 76 20 3d 20 70 4c 6f 63 6b  t->pPrev = pLock
7d70: 2d 3e 70 50 72 65 76 3b 0a 20 20 20 20 20 20 7d  ->pPrev;.      }
7d80: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
7d90: 72 65 65 28 70 4c 6f 63 6b 29 3b 0a 20 20 20 20  ree(pLock);.    
7da0: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  }.  }.}../*.** R
7db0: 65 6c 65 61 73 65 20 61 20 75 6e 69 78 4f 70 65  elease a unixOpe
7dc0: 6e 43 6e 74 20 73 74 72 75 63 74 75 72 65 20 70  nCnt structure p
7dd0: 72 65 76 69 6f 75 73 6c 79 20 61 6c 6c 6f 63 61  reviously alloca
7de0: 74 65 64 20 62 79 20 66 69 6e 64 4c 6f 63 6b 49  ted by findLockI
7df0: 6e 66 6f 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  nfo()..**.** The
7e00: 20 6d 75 74 65 78 20 65 6e 74 65 72 65 64 20 75   mutex entered u
7e10: 73 69 6e 67 20 74 68 65 20 75 6e 69 78 45 6e 74  sing the unixEnt
7e20: 65 72 4d 75 74 65 78 28 29 20 66 75 6e 63 74 69  erMutex() functi
7e30: 6f 6e 20 6d 75 73 74 20 62 65 20 68 65 6c 64 0a  on must be held.
7e40: 2a 2a 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  ** when this fun
7e50: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e  ction is called.
7e60: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
7e70: 72 65 6c 65 61 73 65 4f 70 65 6e 43 6e 74 28 73  releaseOpenCnt(s
7e80: 74 72 75 63 74 20 75 6e 69 78 4f 70 65 6e 43 6e  truct unixOpenCn
7e90: 74 20 2a 70 4f 70 65 6e 29 7b 0a 20 20 61 73 73  t *pOpen){.  ass
7ea0: 65 72 74 28 20 75 6e 69 78 4d 75 74 65 78 48 65  ert( unixMutexHe
7eb0: 6c 64 28 29 20 29 3b 0a 20 20 69 66 28 20 70 4f  ld() );.  if( pO
7ec0: 70 65 6e 20 29 7b 0a 20 20 20 20 70 4f 70 65 6e  pen ){.    pOpen
7ed0: 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 69 66  ->nRef--;.    if
7ee0: 28 20 70 4f 70 65 6e 2d 3e 6e 52 65 66 3d 3d 30  ( pOpen->nRef==0
7ef0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4f   ){.      if( pO
7f00: 70 65 6e 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20  pen->pPrev ){.  
7f10: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f        assert( pO
7f20: 70 65 6e 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78  pen->pPrev->pNex
7f30: 74 3d 3d 70 4f 70 65 6e 20 29 3b 0a 20 20 20 20  t==pOpen );.    
7f40: 20 20 20 20 70 4f 70 65 6e 2d 3e 70 50 72 65 76      pOpen->pPrev
7f50: 2d 3e 70 4e 65 78 74 20 3d 20 70 4f 70 65 6e 2d  ->pNext = pOpen-
7f60: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 65  >pNext;.      }e
7f70: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73  lse{.        ass
7f80: 65 72 74 28 20 6f 70 65 6e 4c 69 73 74 3d 3d 70  ert( openList==p
7f90: 4f 70 65 6e 20 29 3b 0a 20 20 20 20 20 20 20 20  Open );.        
7fa0: 6f 70 65 6e 4c 69 73 74 20 3d 20 70 4f 70 65 6e  openList = pOpen
7fb0: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  ->pNext;.      }
7fc0: 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70 65 6e  .      if( pOpen
7fd0: 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20  ->pNext ){.     
7fe0: 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 65 6e     assert( pOpen
7ff0: 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 3d 3d  ->pNext->pPrev==
8000: 70 4f 70 65 6e 20 29 3b 0a 20 20 20 20 20 20 20  pOpen );.       
8010: 20 70 4f 70 65 6e 2d 3e 70 4e 65 78 74 2d 3e 70   pOpen->pNext->p
8020: 50 72 65 76 20 3d 20 70 4f 70 65 6e 2d 3e 70 50  Prev = pOpen->pP
8030: 72 65 76 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66  rev;.      }.#if
8040: 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
8050: 46 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f  FE && defined(__
8060: 6c 69 6e 75 78 5f 5f 29 0a 20 20 20 20 20 20 61  linux__).      a
8070: 73 73 65 72 74 28 20 21 70 4f 70 65 6e 2d 3e 70  ssert( !pOpen->p
8080: 55 6e 75 73 65 64 20 7c 7c 20 74 68 72 65 61 64  Unused || thread
8090: 73 4f 76 65 72 72 69 64 65 45 61 63 68 4f 74 68  sOverrideEachOth
80a0: 65 72 73 4c 6f 63 6b 73 3d 3d 30 20 29 3b 0a 23  ersLocks==0 );.#
80b0: 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 2f 2a 20  endif..      /* 
80c0: 49 66 20 70 4f 70 65 6e 2d 3e 70 55 6e 75 73 65  If pOpen->pUnuse
80d0: 64 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 2c 20 74  d is not null, t
80e0: 68 65 6e 20 6d 65 6d 6f 72 79 20 61 6e 64 20 66  hen memory and f
80f0: 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 73 0a  ile-descriptors.
8100: 20 20 20 20 20 20 2a 2a 20 61 72 65 20 6c 65 61        ** are lea
8110: 6b 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ked..      **.  
8120: 20 20 20 20 2a 2a 20 54 68 69 73 20 77 69 6c 6c      ** This will
8130: 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 66 2c   only happen if,
8140: 20 75 6e 64 65 72 20 4c 69 6e 75 78 74 68 72 65   under Linuxthre
8150: 61 64 73 2c 20 74 68 65 20 75 73 65 72 20 68 61  ads, the user ha
8160: 73 20 6f 70 65 6e 65 64 0a 20 20 20 20 20 20 2a  s opened.      *
8170: 2a 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  * a transaction 
8180: 69 6e 20 6f 6e 65 20 74 68 72 65 61 64 2c 20 74  in one thread, t
8190: 68 65 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20  hen attempts to 
81a0: 63 6c 6f 73 65 20 74 68 65 20 64 61 74 61 62 61  close the databa
81b0: 73 65 0a 20 20 20 20 20 20 2a 2a 20 68 61 6e 64  se.      ** hand
81c0: 6c 65 20 66 72 6f 6d 20 61 6e 6f 74 68 65 72 20  le from another 
81d0: 74 68 72 65 61 64 20 28 77 69 74 68 6f 75 74 20  thread (without 
81e0: 66 69 72 73 74 20 75 6e 6c 6f 63 6b 69 6e 67 20  first unlocking 
81f0: 74 68 65 20 64 62 20 66 69 6c 65 29 2e 0a 20 20  the db file)..  
8200: 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 61      ** This is a
8210: 20 6d 69 73 75 73 65 2e 20 20 2a 2f 0a 20 20 20   misuse.  */.   
8220: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
8230: 70 4f 70 65 6e 29 3b 0a 20 20 20 20 7d 0a 20 20  pOpen);.    }.  
8240: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  }.}../*.** Given
8250: 20 61 20 66 69 6c 65 20 64 65 73 63 72 69 70 74   a file descript
8260: 6f 72 2c 20 6c 6f 63 61 74 65 20 75 6e 69 78 4c  or, locate unixL
8270: 6f 63 6b 49 6e 66 6f 20 61 6e 64 20 75 6e 69 78  ockInfo and unix
8280: 4f 70 65 6e 43 6e 74 20 73 74 72 75 63 74 75 72  OpenCnt structur
8290: 65 73 20 74 68 61 74 0a 2a 2a 20 64 65 73 63 72  es that.** descr
82a0: 69 62 65 73 20 74 68 61 74 20 66 69 6c 65 20 64  ibes that file d
82b0: 65 73 63 72 69 70 74 6f 72 2e 20 20 43 72 65 61  escriptor.  Crea
82c0: 74 65 20 6e 65 77 20 6f 6e 65 73 20 69 66 20 6e  te new ones if n
82d0: 65 63 65 73 73 61 72 79 2e 20 20 54 68 65 0a 2a  ecessary.  The.*
82e0: 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65 73 20  * return values 
82f0: 6d 69 67 68 74 20 62 65 20 75 6e 69 6e 69 74 69  might be uniniti
8300: 61 6c 69 7a 65 64 20 69 66 20 61 6e 20 65 72 72  alized if an err
8310: 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a  or occurs..**.**
8320: 20 54 68 65 20 6d 75 74 65 78 20 65 6e 74 65 72   The mutex enter
8330: 65 64 20 75 73 69 6e 67 20 74 68 65 20 75 6e 69  ed using the uni
8340: 78 45 6e 74 65 72 4d 75 74 65 78 28 29 20 66 75  xEnterMutex() fu
8350: 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 68  nction must be h
8360: 65 6c 64 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73  eld.** when this
8370: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
8380: 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  led..**.** Retur
8390: 6e 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65  n an appropriate
83a0: 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a   error code..*/.
83b0: 73 74 61 74 69 63 20 69 6e 74 20 66 69 6e 64 4c  static int findL
83c0: 6f 63 6b 49 6e 66 6f 28 0a 20 20 75 6e 69 78 46  ockInfo(.  unixF
83d0: 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 20 20 20  ile *pFile,     
83e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 69            /* Uni
83f0: 78 20 66 69 6c 65 20 77 69 74 68 20 66 69 6c 65  x file with file
8400: 20 64 65 73 63 20 75 73 65 64 20 69 6e 20 74 68   desc used in th
8410: 65 20 6b 65 79 20 2a 2f 0a 20 20 73 74 72 75 63  e key */.  struc
8420: 74 20 75 6e 69 78 4c 6f 63 6b 49 6e 66 6f 20 2a  t unixLockInfo *
8430: 2a 70 70 4c 6f 63 6b 2c 20 20 2f 2a 20 52 65 74  *ppLock,  /* Ret
8440: 75 72 6e 20 74 68 65 20 75 6e 69 78 4c 6f 63 6b  urn the unixLock
8450: 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 68  Info structure h
8460: 65 72 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ere */.  struct 
8470: 75 6e 69 78 4f 70 65 6e 43 6e 74 20 2a 2a 70 70  unixOpenCnt **pp
8480: 4f 70 65 6e 20 20 20 20 2f 2a 20 52 65 74 75 72  Open    /* Retur
8490: 6e 20 74 68 65 20 75 6e 69 78 4f 70 65 6e 43 6e  n the unixOpenCn
84a0: 74 20 73 74 72 75 63 74 75 72 65 20 68 65 72 65  t structure here
84b0: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
84c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
84d0: 20 20 20 20 20 20 20 20 2f 2a 20 53 79 73 74 65          /* Syste
84e0: 6d 20 63 61 6c 6c 20 72 65 74 75 72 6e 20 63 6f  m call return co
84f0: 64 65 20 2a 2f 0a 20 20 69 6e 74 20 66 64 3b 20  de */.  int fd; 
8500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8510: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69         /* The fi
8520: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f  le descriptor fo
8530: 72 20 70 46 69 6c 65 20 2a 2f 0a 20 20 73 74 72  r pFile */.  str
8540: 75 63 74 20 75 6e 69 78 4c 6f 63 6b 4b 65 79 20  uct unixLockKey 
8550: 6c 6f 63 6b 4b 65 79 3b 20 20 20 20 2f 2a 20 4c  lockKey;    /* L
8560: 6f 6f 6b 75 70 20 6b 65 79 20 66 6f 72 20 74 68  ookup key for th
8570: 65 20 75 6e 69 78 4c 6f 63 6b 49 6e 66 6f 20 73  e unixLockInfo s
8580: 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 73 74  tructure */.  st
8590: 72 75 63 74 20 75 6e 69 78 46 69 6c 65 49 64 20  ruct unixFileId 
85a0: 66 69 6c 65 49 64 3b 20 20 20 20 20 20 2f 2a 20  fileId;      /* 
85b0: 4c 6f 6f 6b 75 70 20 6b 65 79 20 66 6f 72 20 74  Lookup key for t
85c0: 68 65 20 75 6e 69 78 4f 70 65 6e 43 6e 74 20 73  he unixOpenCnt s
85d0: 74 72 75 63 74 20 2a 2f 0a 20 20 73 74 72 75 63  truct */.  struc
85e0: 74 20 73 74 61 74 20 73 74 61 74 62 75 66 3b 20  t stat statbuf; 
85f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 77            /* Low
8600: 2d 6c 65 76 65 6c 20 66 69 6c 65 20 69 6e 66 6f  -level file info
8610: 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 73 74 72  rmation */.  str
8620: 75 63 74 20 75 6e 69 78 4c 6f 63 6b 49 6e 66 6f  uct unixLockInfo
8630: 20 2a 70 4c 6f 63 6b 20 3d 20 30 3b 2f 2a 20 43   *pLock = 0;/* C
8640: 61 6e 64 69 64 61 74 65 20 75 6e 69 78 4c 6f 63  andidate unixLoc
8650: 6b 49 6e 66 6f 20 6f 62 6a 65 63 74 20 2a 2f 0a  kInfo object */.
8660: 20 20 73 74 72 75 63 74 20 75 6e 69 78 4f 70 65    struct unixOpe
8670: 6e 43 6e 74 20 2a 70 4f 70 65 6e 3b 20 20 20 20  nCnt *pOpen;    
8680: 20 2f 2a 20 43 61 6e 64 69 64 61 74 65 20 75 6e   /* Candidate un
8690: 69 78 4f 70 65 6e 43 6e 74 20 6f 62 6a 65 63 74  ixOpenCnt object
86a0: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 75   */..  assert( u
86b0: 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 29  nixMutexHeld() )
86c0: 3b 0a 0a 20 20 2f 2a 20 47 65 74 20 6c 6f 77 2d  ;..  /* Get low-
86d0: 6c 65 76 65 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  level informatio
86e0: 6e 20 61 62 6f 75 74 20 74 68 65 20 66 69 6c 65  n about the file
86f0: 20 74 68 61 74 20 77 65 20 63 61 6e 20 75 73 65   that we can use
8700: 64 20 74 6f 0a 20 20 2a 2a 20 63 72 65 61 74 65  d to.  ** create
8710: 20 61 20 75 6e 69 71 75 65 20 6e 61 6d 65 20 66   a unique name f
8720: 6f 72 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 2a  or the file..  *
8730: 2f 0a 20 20 66 64 20 3d 20 70 46 69 6c 65 2d 3e  /.  fd = pFile->
8740: 68 3b 0a 20 20 72 63 20 3d 20 66 73 74 61 74 28  h;.  rc = fstat(
8750: 66 64 2c 20 26 73 74 61 74 62 75 66 29 3b 0a 20  fd, &statbuf);. 
8760: 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20   if( rc!=0 ){.  
8770: 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
8780: 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 23 69 66 64  no = errno;.#ifd
8790: 65 66 20 45 4f 56 45 52 46 4c 4f 57 0a 20 20 20  ef EOVERFLOW.   
87a0: 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 61 73 74   if( pFile->last
87b0: 45 72 72 6e 6f 3d 3d 45 4f 56 45 52 46 4c 4f 57  Errno==EOVERFLOW
87c0: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
87d0: 5f 4e 4f 4c 46 53 3b 0a 23 65 6e 64 69 66 0a 20  _NOLFS;.#endif. 
87e0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
87f0: 5f 49 4f 45 52 52 3b 0a 20 20 7d 0a 0a 23 69 66  _IOERR;.  }..#if
8800: 64 65 66 20 5f 5f 41 50 50 4c 45 5f 5f 0a 20 20  def __APPLE__.  
8810: 2f 2a 20 4f 6e 20 4f 53 20 58 20 6f 6e 20 61 6e  /* On OS X on an
8820: 20 6d 73 64 6f 73 20 66 69 6c 65 73 79 73 74 65   msdos filesyste
8830: 6d 2c 20 74 68 65 20 69 6e 6f 64 65 20 6e 75 6d  m, the inode num
8840: 62 65 72 20 69 73 20 72 65 70 6f 72 74 65 64 0a  ber is reported.
8850: 20 20 2a 2a 20 69 6e 63 6f 72 72 65 63 74 6c 79    ** incorrectly
8860: 20 66 6f 72 20 7a 65 72 6f 2d 73 69 7a 65 20 66   for zero-size f
8870: 69 6c 65 73 2e 20 20 53 65 65 20 74 69 63 6b 65  iles.  See ticke
8880: 74 20 23 33 32 36 30 2e 20 20 54 6f 20 77 6f 72  t #3260.  To wor
8890: 6b 0a 20 20 2a 2a 20 61 72 6f 75 6e 64 20 74 68  k.  ** around th
88a0: 69 73 20 70 72 6f 62 6c 65 6d 20 28 77 65 20 63  is problem (we c
88b0: 6f 6e 73 69 64 65 72 20 69 74 20 61 20 62 75 67  onsider it a bug
88c0: 20 69 6e 20 4f 53 20 58 2c 20 6e 6f 74 20 53 51   in OS X, not SQ
88d0: 4c 69 74 65 29 0a 20 20 2a 2a 20 77 65 20 61 6c  Lite).  ** we al
88e0: 77 61 79 73 20 69 6e 63 72 65 61 73 65 20 74 68  ways increase th
88f0: 65 20 66 69 6c 65 20 73 69 7a 65 20 74 6f 20 31  e file size to 1
8900: 20 62 79 20 77 72 69 74 69 6e 67 20 61 20 73 69   by writing a si
8910: 6e 67 6c 65 20 62 79 74 65 0a 20 20 2a 2a 20 70  ngle byte.  ** p
8920: 72 69 6f 72 20 74 6f 20 61 63 63 65 73 73 69 6e  rior to accessin
8930: 67 20 74 68 65 20 69 6e 6f 64 65 20 6e 75 6d 62  g the inode numb
8940: 65 72 2e 20 20 54 68 65 20 6f 6e 65 20 62 79 74  er.  The one byt
8950: 65 20 77 72 69 74 74 65 6e 20 69 73 0a 20 20 2a  e written is.  *
8960: 2a 20 61 6e 20 41 53 43 49 49 20 27 53 27 20 63  * an ASCII 'S' c
8970: 68 61 72 61 63 74 65 72 20 77 68 69 63 68 20 61  haracter which a
8980: 6c 73 6f 20 68 61 70 70 65 6e 73 20 74 6f 20 62  lso happens to b
8990: 65 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65  e the first byte
89a0: 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 68 65 61  .  ** in the hea
89b0: 64 65 72 20 6f 66 20 65 76 65 72 79 20 53 51 4c  der of every SQL
89c0: 69 74 65 20 64 61 74 61 62 61 73 65 2e 20 20 49  ite database.  I
89d0: 6e 20 74 68 69 73 20 77 61 79 2c 20 69 66 20 74  n this way, if t
89e0: 68 65 72 65 0a 20 20 2a 2a 20 69 73 20 61 20 72  here.  ** is a r
89f0: 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 73 75  ace condition su
8a00: 63 68 20 74 68 61 74 20 61 6e 6f 74 68 65 72 20  ch that another 
8a10: 74 68 72 65 61 64 20 68 61 73 20 61 6c 72 65 61  thread has alrea
8a20: 64 79 20 70 6f 70 75 6c 61 74 65 64 0a 20 20 2a  dy populated.  *
8a30: 2a 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65  * the first page
8a40: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
8a50: 2c 20 6e 6f 20 64 61 6d 61 67 65 20 69 73 20 64  , no damage is d
8a60: 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  one..  */.  if( 
8a70: 73 74 61 74 62 75 66 2e 73 74 5f 73 69 7a 65 3d  statbuf.st_size=
8a80: 3d 30 20 26 26 20 28 70 46 69 6c 65 2d 3e 66 73  =0 && (pFile->fs
8a90: 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  Flags & SQLITE_F
8aa0: 53 46 4c 41 47 53 5f 49 53 5f 4d 53 44 4f 53 29  SFLAGS_IS_MSDOS)
8ab0: 21 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  !=0 ){.    rc = 
8ac0: 77 72 69 74 65 28 66 64 2c 20 22 53 22 2c 20 31  write(fd, "S", 1
8ad0: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 31  );.    if( rc!=1
8ae0: 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d   ){.      pFile-
8af0: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72  >lastErrno = err
8b00: 6e 6f 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  no;.      return
8b10: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20   SQLITE_IOERR;. 
8b20: 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 66 73     }.    rc = fs
8b30: 74 61 74 28 66 64 2c 20 26 73 74 61 74 62 75 66  tat(fd, &statbuf
8b40: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 30  );.    if( rc!=0
8b50: 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d   ){.      pFile-
8b60: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72  >lastErrno = err
8b70: 6e 6f 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  no;.      return
8b80: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20   SQLITE_IOERR;. 
8b90: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
8ba0: 0a 20 20 6d 65 6d 73 65 74 28 26 6c 6f 63 6b 4b  .  memset(&lockK
8bb0: 65 79 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6c 6f  ey, 0, sizeof(lo
8bc0: 63 6b 4b 65 79 29 29 3b 0a 20 20 6c 6f 63 6b 4b  ckKey));.  lockK
8bd0: 65 79 2e 66 69 64 2e 64 65 76 20 3d 20 73 74 61  ey.fid.dev = sta
8be0: 74 62 75 66 2e 73 74 5f 64 65 76 3b 0a 23 69 66  tbuf.st_dev;.#if
8bf0: 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 6c 6f   OS_VXWORKS.  lo
8c00: 63 6b 4b 65 79 2e 66 69 64 2e 70 49 64 20 3d 20  ckKey.fid.pId = 
8c10: 70 46 69 6c 65 2d 3e 70 49 64 3b 0a 23 65 6c 73  pFile->pId;.#els
8c20: 65 0a 20 20 6c 6f 63 6b 4b 65 79 2e 66 69 64 2e  e.  lockKey.fid.
8c30: 69 6e 6f 20 3d 20 73 74 61 74 62 75 66 2e 73 74  ino = statbuf.st
8c40: 5f 69 6e 6f 3b 0a 23 65 6e 64 69 66 0a 23 69 66  _ino;.#endif.#if
8c50: 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
8c60: 46 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f  FE && defined(__
8c70: 6c 69 6e 75 78 5f 5f 29 0a 20 20 69 66 28 20 74  linux__).  if( t
8c80: 68 72 65 61 64 73 4f 76 65 72 72 69 64 65 45 61  hreadsOverrideEa
8c90: 63 68 4f 74 68 65 72 73 4c 6f 63 6b 73 3c 30 20  chOthersLocks<0 
8ca0: 29 7b 0a 20 20 20 20 74 65 73 74 54 68 72 65 61  ){.    testThrea
8cb0: 64 4c 6f 63 6b 69 6e 67 42 65 68 61 76 69 6f 72  dLockingBehavior
8cc0: 28 66 64 29 3b 0a 20 20 7d 0a 20 20 6c 6f 63 6b  (fd);.  }.  lock
8cd0: 4b 65 79 2e 74 69 64 20 3d 20 74 68 72 65 61 64  Key.tid = thread
8ce0: 73 4f 76 65 72 72 69 64 65 45 61 63 68 4f 74 68  sOverrideEachOth
8cf0: 65 72 73 4c 6f 63 6b 73 20 3f 20 30 20 3a 20 70  ersLocks ? 0 : p
8d00: 74 68 72 65 61 64 5f 73 65 6c 66 28 29 3b 0a 23  thread_self();.#
8d10: 65 6e 64 69 66 0a 20 20 66 69 6c 65 49 64 20 3d  endif.  fileId =
8d20: 20 6c 6f 63 6b 4b 65 79 2e 66 69 64 3b 0a 20 20   lockKey.fid;.  
8d30: 69 66 28 20 70 70 4c 6f 63 6b 21 3d 30 20 29 7b  if( ppLock!=0 ){
8d40: 0a 20 20 20 20 70 4c 6f 63 6b 20 3d 20 6c 6f 63  .    pLock = loc
8d50: 6b 4c 69 73 74 3b 0a 20 20 20 20 77 68 69 6c 65  kList;.    while
8d60: 28 20 70 4c 6f 63 6b 20 26 26 20 6d 65 6d 63 6d  ( pLock && memcm
8d70: 70 28 26 6c 6f 63 6b 4b 65 79 2c 20 26 70 4c 6f  p(&lockKey, &pLo
8d80: 63 6b 2d 3e 6c 6f 63 6b 4b 65 79 2c 20 73 69 7a  ck->lockKey, siz
8d90: 65 6f 66 28 6c 6f 63 6b 4b 65 79 29 29 20 29 7b  eof(lockKey)) ){
8da0: 0a 20 20 20 20 20 20 70 4c 6f 63 6b 20 3d 20 70  .      pLock = p
8db0: 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  Lock->pNext;.   
8dc0: 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 6f 63 6b   }.    if( pLock
8dd0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4c 6f  ==0 ){.      pLo
8de0: 63 6b 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  ck = sqlite3_mal
8df0: 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 4c 6f  loc( sizeof(*pLo
8e00: 63 6b 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ck) );.      if(
8e10: 20 70 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20   pLock==0 ){.   
8e20: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
8e30: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20  _NOMEM;.        
8e40: 67 6f 74 6f 20 65 78 69 74 5f 66 69 6e 64 6c 6f  goto exit_findlo
8e50: 63 6b 69 6e 66 6f 3b 0a 20 20 20 20 20 20 7d 0a  ckinfo;.      }.
8e60: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4c        memcpy(&pL
8e70: 6f 63 6b 2d 3e 6c 6f 63 6b 4b 65 79 2c 26 6c 6f  ock->lockKey,&lo
8e80: 63 6b 4b 65 79 2c 73 69 7a 65 6f 66 28 6c 6f 63  ckKey,sizeof(loc
8e90: 6b 4b 65 79 29 29 3b 0a 20 20 20 20 20 20 70 4c  kKey));.      pL
8ea0: 6f 63 6b 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20  ock->nRef = 1;. 
8eb0: 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 63 6e 74 20       pLock->cnt 
8ec0: 3d 20 30 3b 0a 20 20 20 20 20 20 70 4c 6f 63 6b  = 0;.      pLock
8ed0: 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 30 3b 0a  ->locktype = 0;.
8ee0: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
8ef0: 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
8f00: 47 5f 53 54 59 4c 45 29 0a 20 20 20 20 20 20 70  G_STYLE).      p
8f10: 4c 6f 63 6b 2d 3e 73 68 61 72 65 64 42 79 74 65  Lock->sharedByte
8f20: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 20   = 0;.#endif.   
8f30: 20 20 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 20     pLock->pNext 
8f40: 3d 20 6c 6f 63 6b 4c 69 73 74 3b 0a 20 20 20 20  = lockList;.    
8f50: 20 20 70 4c 6f 63 6b 2d 3e 70 50 72 65 76 20 3d    pLock->pPrev =
8f60: 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 6c 6f   0;.      if( lo
8f70: 63 6b 4c 69 73 74 20 29 20 6c 6f 63 6b 4c 69 73  ckList ) lockLis
8f80: 74 2d 3e 70 50 72 65 76 20 3d 20 70 4c 6f 63 6b  t->pPrev = pLock
8f90: 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 4c 69 73 74  ;.      lockList
8fa0: 20 3d 20 70 4c 6f 63 6b 3b 0a 20 20 20 20 7d 65   = pLock;.    }e
8fb0: 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 6f 63 6b  lse{.      pLock
8fc0: 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 7d 0a  ->nRef++;.    }.
8fd0: 20 20 20 20 2a 70 70 4c 6f 63 6b 20 3d 20 70 4c      *ppLock = pL
8fe0: 6f 63 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ock;.  }.  if( p
8ff0: 70 4f 70 65 6e 21 3d 30 20 29 7b 0a 20 20 20 20  pOpen!=0 ){.    
9000: 70 4f 70 65 6e 20 3d 20 6f 70 65 6e 4c 69 73 74  pOpen = openList
9010: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 4f 70  ;.    while( pOp
9020: 65 6e 20 26 26 20 6d 65 6d 63 6d 70 28 26 66 69  en && memcmp(&fi
9030: 6c 65 49 64 2c 20 26 70 4f 70 65 6e 2d 3e 66 69  leId, &pOpen->fi
9040: 6c 65 49 64 2c 20 73 69 7a 65 6f 66 28 66 69 6c  leId, sizeof(fil
9050: 65 49 64 29 29 20 29 7b 0a 20 20 20 20 20 20 70  eId)) ){.      p
9060: 4f 70 65 6e 20 3d 20 70 4f 70 65 6e 2d 3e 70 4e  Open = pOpen->pN
9070: 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ext;.    }.    i
9080: 66 28 20 70 4f 70 65 6e 3d 3d 30 20 29 7b 0a 20  f( pOpen==0 ){. 
9090: 20 20 20 20 20 70 4f 70 65 6e 20 3d 20 73 71 6c       pOpen = sql
90a0: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a  ite3_malloc( siz
90b0: 65 6f 66 28 2a 70 4f 70 65 6e 29 20 29 3b 0a 20  eof(*pOpen) );. 
90c0: 20 20 20 20 20 69 66 28 20 70 4f 70 65 6e 3d 3d       if( pOpen==
90d0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c  0 ){.        rel
90e0: 65 61 73 65 4c 6f 63 6b 49 6e 66 6f 28 70 4c 6f  easeLockInfo(pLo
90f0: 63 6b 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  ck);.        rc 
9100: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
9110: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69          goto exi
9120: 74 5f 66 69 6e 64 6c 6f 63 6b 69 6e 66 6f 3b 0a  t_findlockinfo;.
9130: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 65        }.      me
9140: 6d 73 65 74 28 70 4f 70 65 6e 2c 20 30 2c 20 73  mset(pOpen, 0, s
9150: 69 7a 65 6f 66 28 2a 70 4f 70 65 6e 29 29 3b 0a  izeof(*pOpen));.
9160: 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e 66 69 6c        pOpen->fil
9170: 65 49 64 20 3d 20 66 69 6c 65 49 64 3b 0a 20 20  eId = fileId;.  
9180: 20 20 20 20 70 4f 70 65 6e 2d 3e 6e 52 65 66 20      pOpen->nRef 
9190: 3d 20 31 3b 0a 20 20 20 20 20 20 70 4f 70 65 6e  = 1;.      pOpen
91a0: 2d 3e 70 4e 65 78 74 20 3d 20 6f 70 65 6e 4c 69  ->pNext = openLi
91b0: 73 74 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 70  st;.      if( op
91c0: 65 6e 4c 69 73 74 20 29 20 6f 70 65 6e 4c 69 73  enList ) openLis
91d0: 74 2d 3e 70 50 72 65 76 20 3d 20 70 4f 70 65 6e  t->pPrev = pOpen
91e0: 3b 0a 20 20 20 20 20 20 6f 70 65 6e 4c 69 73 74  ;.      openList
91f0: 20 3d 20 70 4f 70 65 6e 3b 0a 20 20 20 20 7d 65   = pOpen;.    }e
9200: 6c 73 65 7b 0a 20 20 20 20 20 20 70 4f 70 65 6e  lse{.      pOpen
9210: 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 7d 0a  ->nRef++;.    }.
9220: 20 20 20 20 2a 70 70 4f 70 65 6e 20 3d 20 70 4f      *ppOpen = pO
9230: 70 65 6e 3b 0a 20 20 7d 0a 0a 65 78 69 74 5f 66  pen;.  }..exit_f
9240: 69 6e 64 6c 6f 63 6b 69 6e 66 6f 3a 0a 20 20 72  indlockinfo:.  r
9250: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
9260: 2a 2a 20 49 66 20 77 65 20 61 72 65 20 63 75 72  ** If we are cur
9270: 72 65 6e 74 6c 79 20 69 6e 20 61 20 64 69 66 66  rently in a diff
9280: 65 72 65 6e 74 20 74 68 72 65 61 64 20 74 68 61  erent thread tha
9290: 6e 20 74 68 65 20 74 68 72 65 61 64 20 74 68 61  n the thread tha
92a0: 74 20 74 68 65 0a 2a 2a 20 75 6e 69 78 46 69 6c  t the.** unixFil
92b0: 65 20 61 72 67 75 6d 65 6e 74 20 62 65 6c 6f 6e  e argument belon
92c0: 67 73 20 74 6f 2c 20 74 68 65 6e 20 74 72 61 6e  gs to, then tran
92d0: 73 66 65 72 20 6f 77 6e 65 72 73 68 69 70 20 6f  sfer ownership o
92e0: 66 20 74 68 65 20 75 6e 69 78 46 69 6c 65 0a 2a  f the unixFile.*
92f0: 2a 20 6f 76 65 72 20 74 6f 20 74 68 65 20 63 75  * over to the cu
9300: 72 72 65 6e 74 20 74 68 72 65 61 64 2e 0a 2a 2a  rrent thread..**
9310: 0a 2a 2a 20 41 20 75 6e 69 78 46 69 6c 65 20 69  .** A unixFile i
9320: 73 20 6f 6e 6c 79 20 6f 77 6e 65 64 20 62 79 20  s only owned by 
9330: 61 20 74 68 72 65 61 64 20 6f 6e 20 73 79 73 74  a thread on syst
9340: 65 6d 73 20 74 68 61 74 20 75 73 65 20 4c 69 6e  ems that use Lin
9350: 75 78 54 68 72 65 61 64 73 2e 0a 2a 2a 0a 2a 2a  uxThreads..**.**
9360: 20 4f 77 6e 65 72 73 68 69 70 20 74 72 61 6e 73   Ownership trans
9370: 66 65 72 20 69 73 20 6f 6e 6c 79 20 61 6c 6c 6f  fer is only allo
9380: 77 65 64 20 69 66 20 74 68 65 20 75 6e 69 78 46  wed if the unixF
9390: 69 6c 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79  ile is currently
93a0: 20 75 6e 6c 6f 63 6b 65 64 2e 0a 2a 2a 20 49 66   unlocked..** If
93b0: 20 74 68 65 20 75 6e 69 78 46 69 6c 65 20 69 73   the unixFile is
93c0: 20 6c 6f 63 6b 65 64 20 61 6e 64 20 61 6e 20 6f   locked and an o
93d0: 77 6e 65 72 73 68 69 70 20 69 73 20 77 72 6f 6e  wnership is wron
93e0: 67 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 0a 2a  g, then return.*
93f0: 2a 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 2e  * SQLITE_MISUSE.
9400: 20 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72    SQLITE_OK is r
9410: 65 74 75 72 6e 65 64 20 69 66 20 65 76 65 72 79  eturned if every
9420: 74 68 69 6e 67 20 77 6f 72 6b 73 2e 0a 2a 2f 0a  thing works..*/.
9430: 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41  #if SQLITE_THREA
9440: 44 53 41 46 45 20 26 26 20 64 65 66 69 6e 65 64  DSAFE && defined
9450: 28 5f 5f 6c 69 6e 75 78 5f 5f 29 0a 73 74 61 74  (__linux__).stat
9460: 69 63 20 69 6e 74 20 74 72 61 6e 73 66 65 72 4f  ic int transferO
9470: 77 6e 65 72 73 68 69 70 28 75 6e 69 78 46 69 6c  wnership(unixFil
9480: 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69 6e 74  e *pFile){.  int
9490: 20 72 63 3b 0a 20 20 70 74 68 72 65 61 64 5f 74   rc;.  pthread_t
94a0: 20 68 53 65 6c 66 3b 0a 20 20 69 66 28 20 74 68   hSelf;.  if( th
94b0: 72 65 61 64 73 4f 76 65 72 72 69 64 65 45 61 63  readsOverrideEac
94c0: 68 4f 74 68 65 72 73 4c 6f 63 6b 73 20 29 7b 0a  hOthersLocks ){.
94d0: 20 20 20 20 2f 2a 20 4f 77 6e 65 72 73 68 69 70      /* Ownership
94e0: 20 74 72 61 6e 73 66 65 72 73 20 6e 6f 74 20 6e   transfers not n
94f0: 65 65 64 65 64 20 6f 6e 20 74 68 69 73 20 73 79  eeded on this sy
9500: 73 74 65 6d 20 2a 2f 0a 20 20 20 20 72 65 74 75  stem */.    retu
9510: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
9520: 7d 0a 20 20 68 53 65 6c 66 20 3d 20 70 74 68 72  }.  hSelf = pthr
9530: 65 61 64 5f 73 65 6c 66 28 29 3b 0a 20 20 69 66  ead_self();.  if
9540: 28 20 70 74 68 72 65 61 64 5f 65 71 75 61 6c 28  ( pthread_equal(
9550: 70 46 69 6c 65 2d 3e 74 69 64 2c 20 68 53 65 6c  pFile->tid, hSel
9560: 66 29 20 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20  f) ){.    /* We 
9570: 61 72 65 20 73 74 69 6c 6c 20 69 6e 20 74 68 65  are still in the
9580: 20 73 61 6d 65 20 74 68 72 65 61 64 20 2a 2f 0a   same thread */.
9590: 20 20 20 20 4f 53 54 52 41 43 45 31 28 22 4e 6f      OSTRACE1("No
95a0: 2d 74 72 61 6e 73 66 65 72 2c 20 73 61 6d 65 20  -transfer, same 
95b0: 74 68 72 65 61 64 5c 6e 22 29 3b 0a 20 20 20 20  thread\n");.    
95c0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
95d0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 46 69 6c  ;.  }.  if( pFil
95e0: 65 2d 3e 6c 6f 63 6b 74 79 70 65 21 3d 4e 4f 5f  e->locktype!=NO_
95f0: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 57  LOCK ){.    /* W
9600: 65 20 63 61 6e 6e 6f 74 20 63 68 61 6e 67 65 20  e cannot change 
9610: 6f 77 6e 65 72 73 68 69 70 20 77 68 69 6c 65 20  ownership while 
9620: 77 65 20 61 72 65 20 68 6f 6c 64 69 6e 67 20 61  we are holding a
9630: 20 6c 6f 63 6b 21 20 2a 2f 0a 20 20 20 20 72 65   lock! */.    re
9640: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
9650: 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 4f  SE_BKPT;.  }.  O
9660: 53 54 52 41 43 45 34 28 22 54 72 61 6e 73 66 65  STRACE4("Transfe
9670: 72 20 6f 77 6e 65 72 73 68 69 70 20 6f 66 20 25  r ownership of %
9680: 64 20 66 72 6f 6d 20 25 64 20 74 6f 20 25 64 5c  d from %d to %d\
9690: 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
96a0: 70 46 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d  pFile->h, pFile-
96b0: 3e 74 69 64 2c 20 68 53 65 6c 66 29 3b 0a 20 20  >tid, hSelf);.  
96c0: 70 46 69 6c 65 2d 3e 74 69 64 20 3d 20 68 53 65  pFile->tid = hSe
96d0: 6c 66 3b 0a 20 20 69 66 20 28 70 46 69 6c 65 2d  lf;.  if (pFile-
96e0: 3e 70 4c 6f 63 6b 20 21 3d 20 4e 55 4c 4c 29 20  >pLock != NULL) 
96f0: 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 4c 6f 63  {.    releaseLoc
9700: 6b 49 6e 66 6f 28 70 46 69 6c 65 2d 3e 70 4c 6f  kInfo(pFile->pLo
9710: 63 6b 29 3b 0a 20 20 20 20 72 63 20 3d 20 66 69  ck);.    rc = fi
9720: 6e 64 4c 6f 63 6b 49 6e 66 6f 28 70 46 69 6c 65  ndLockInfo(pFile
9730: 2c 20 26 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 2c  , &pFile->pLock,
9740: 20 30 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45   0);.    OSTRACE
9750: 35 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 69 73  5("LOCK    %d is
9760: 20 6e 6f 77 20 25 73 28 25 73 2c 25 64 29 5c 6e   now %s(%s,%d)\n
9770: 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20  ", pFile->h,.   
9780: 20 20 20 20 20 20 20 20 6c 6f 63 6b 74 79 70 65          locktype
9790: 4e 61 6d 65 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b  Name(pFile->lock
97a0: 74 79 70 65 29 2c 0a 20 20 20 20 20 20 20 20 20  type),.         
97b0: 20 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28 70    locktypeName(p
97c0: 46 69 6c 65 2d 3e 70 4c 6f 63 6b 2d 3e 6c 6f 63  File->pLock->loc
97d0: 6b 74 79 70 65 29 2c 20 70 46 69 6c 65 2d 3e 70  ktype), pFile->p
97e0: 4c 6f 63 6b 2d 3e 63 6e 74 29 3b 0a 20 20 20 20  Lock->cnt);.    
97f0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 20 65  return rc;.  } e
9800: 6c 73 65 20 7b 0a 20 20 20 20 72 65 74 75 72 6e  lse {.    return
9810: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
9820: 7d 0a 23 65 6c 73 65 20 20 2f 2a 20 69 66 20 6e  }.#else  /* if n
9830: 6f 74 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44  ot SQLITE_THREAD
9840: 53 41 46 45 20 2a 2f 0a 20 20 2f 2a 20 4f 6e 20  SAFE */.  /* On 
9850: 73 69 6e 67 6c 65 2d 74 68 72 65 61 64 65 64 20  single-threaded 
9860: 62 75 69 6c 64 73 2c 20 6f 77 6e 65 72 73 68 69  builds, ownershi
9870: 70 20 74 72 61 6e 73 66 65 72 20 69 73 20 61 20  p transfer is a 
9880: 6e 6f 2d 6f 70 20 2a 2f 0a 23 20 64 65 66 69 6e  no-op */.# defin
9890: 65 20 74 72 61 6e 73 66 65 72 4f 77 6e 65 72 73  e transferOwners
98a0: 68 69 70 28 58 29 20 53 51 4c 49 54 45 5f 4f 4b  hip(X) SQLITE_OK
98b0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
98c0: 45 5f 54 48 52 45 41 44 53 41 46 45 20 2a 2f 0a  E_THREADSAFE */.
98d0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
98e0: 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74  tine checks if t
98f0: 68 65 72 65 20 69 73 20 61 20 52 45 53 45 52 56  here is a RESERV
9900: 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20  ED lock held on 
9910: 74 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a  the specified.**
9920: 20 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72   file by this or
9930: 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65   any other proce
9940: 73 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f  ss. If such a lo
9950: 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20  ck is held, set 
9960: 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61  *pResOut.** to a
9970: 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20   non-zero value 
9980: 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f  otherwise *pResO
9990: 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72  ut is set to zer
99a0: 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 76  o.  The return v
99b0: 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74  alue.** is set t
99c0: 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65  o SQLITE_OK unle
99d0: 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20  ss an I/O error 
99e0: 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f  occurs during lo
99f0: 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a  ck checking..*/.
9a00: 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 43  static int unixC
9a10: 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
9a20: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
9a30: 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29  d, int *pResOut)
9a40: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
9a50: 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65  ITE_OK;.  int re
9a60: 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e  served = 0;.  un
9a70: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
9a80: 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a  (unixFile*)id;..
9a90: 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
9aa0: 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
9ab0: 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45  _IOERR_CHECKRESE
9ac0: 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 0a 20 20  RVEDLOCK; );..  
9ad0: 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
9ae0: 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  .  unixEnterMute
9af0: 78 28 29 3b 20 2f 2a 20 42 65 63 61 75 73 65 20  x(); /* Because 
9b00: 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 20 69 73 20  pFile->pLock is 
9b10: 73 68 61 72 65 64 20 61 63 72 6f 73 73 20 74 68  shared across th
9b20: 72 65 61 64 73 20 2a 2f 0a 0a 20 20 2f 2a 20 43  reads */..  /* C
9b30: 68 65 63 6b 20 69 66 20 61 20 74 68 72 65 61 64  heck if a thread
9b40: 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73   in this process
9b50: 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c 6f   holds such a lo
9b60: 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  ck */.  if( pFil
9b70: 65 2d 3e 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79  e->pLock->lockty
9b80: 70 65 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  pe>SHARED_LOCK )
9b90: 7b 0a 20 20 20 20 72 65 73 65 72 76 65 64 20 3d  {.    reserved =
9ba0: 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 74   1;.  }..  /* Ot
9bb0: 68 65 72 77 69 73 65 20 73 65 65 20 69 66 20 73  herwise see if s
9bc0: 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73  ome other proces
9bd0: 73 20 68 6f 6c 64 73 20 69 74 2e 0a 20 20 2a 2f  s holds it..  */
9be0: 0a 23 69 66 6e 64 65 66 20 5f 5f 44 4a 47 50 50  .#ifndef __DJGPP
9bf0: 5f 5f 0a 20 20 69 66 28 20 21 72 65 73 65 72 76  __.  if( !reserv
9c00: 65 64 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  ed ){.    struct
9c10: 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 20   flock lock;.   
9c20: 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d   lock.l_whence =
9c30: 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 6c   SEEK_SET;.    l
9c40: 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 52 45  ock.l_start = RE
9c50: 53 45 52 56 45 44 5f 42 59 54 45 3b 0a 20 20 20  SERVED_BYTE;.   
9c60: 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 3b   lock.l_len = 1;
9c70: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65  .    lock.l_type
9c80: 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20 20 20 20   = F_WRLCK;.    
9c90: 69 66 20 28 2d 31 20 3d 3d 20 66 63 6e 74 6c 28  if (-1 == fcntl(
9ca0: 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 47 45 54 4c  pFile->h, F_GETL
9cb0: 4b 2c 20 26 6c 6f 63 6b 29 29 20 7b 0a 20 20 20  K, &lock)) {.   
9cc0: 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20     int tErrno = 
9cd0: 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20  errno;.      rc 
9ce0: 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  = sqliteErrorFro
9cf0: 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72  mPosixError(tErr
9d00: 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  no, SQLITE_IOERR
9d10: 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f  _CHECKRESERVEDLO
9d20: 43 4b 29 3b 0a 20 20 20 20 20 20 70 46 69 6c 65  CK);.      pFile
9d30: 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45  ->lastErrno = tE
9d40: 72 72 6e 6f 3b 0a 20 20 20 20 7d 20 65 6c 73 65  rrno;.    } else
9d50: 20 69 66 28 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65   if( lock.l_type
9d60: 21 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20  !=F_UNLCK ){.   
9d70: 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b     reserved = 1;
9d80: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
9d90: 66 0a 20 20 0a 20 20 75 6e 69 78 4c 65 61 76 65  f.  .  unixLeave
9da0: 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53 54 52 41  Mutex();.  OSTRA
9db0: 43 45 34 28 22 54 45 53 54 20 57 52 2d 4c 4f 43  CE4("TEST WR-LOC
9dc0: 4b 20 25 64 20 25 64 20 25 64 20 28 75 6e 69 78  K %d %d %d (unix
9dd0: 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
9de0: 72 63 2c 20 72 65 73 65 72 76 65 64 29 3b 0a 0a  rc, reserved);..
9df0: 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73    *pResOut = res
9e00: 65 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20  erved;.  return 
9e10: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63  rc;.}../*.** Loc
9e20: 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74 68 20  k the file with 
9e30: 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69  the lock specifi
9e40: 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20  ed by parameter 
9e50: 6c 6f 63 6b 74 79 70 65 20 2d 20 6f 6e 65 0a 2a  locktype - one.*
9e60: 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  * of the followi
9e70: 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31  ng:.**.**     (1
9e80: 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a  ) SHARED_LOCK.**
9e90: 20 20 20 20 20 28 32 29 20 52 45 53 45 52 56 45       (2) RESERVE
9ea0: 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33  D_LOCK.**     (3
9eb0: 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a  ) PENDING_LOCK.*
9ec0: 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c 55 53  *     (4) EXCLUS
9ed0: 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53  IVE_LOCK.**.** S
9ee0: 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65  ometimes when re
9ef0: 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63  questing one loc
9f00: 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f  k state, additio
9f10: 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a  nal lock states.
9f20: 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64 20  ** are inserted 
9f30: 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65  in between.  The
9f40: 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66   locking might f
9f50: 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68  ail on one of th
9f60: 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73  e later.** trans
9f70: 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74  itions leaving t
9f80: 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69  he lock state di
9f90: 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61  fferent from wha
9fa0: 74 20 69 74 20 73 74 61 72 74 65 64 20 62 75 74  t it started but
9fb0: 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20  .** still short 
9fc0: 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68  of its goal.  Th
9fd0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72  e following char
9fe0: 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f  t shows the allo
9ff0: 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  wed.** transitio
a000: 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72  ns and the inser
a010: 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65  ted intermediate
a020: 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20   states:.**.**  
a030: 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48    UNLOCKED -> SH
a040: 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  ARED.**    SHARE
a050: 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a  D -> RESERVED.**
a060: 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50      SHARED -> (P
a070: 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
a080: 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52  SIVE.**    RESER
a090: 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  VED -> (PENDING)
a0a0: 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
a0b0: 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45      PENDING -> E
a0c0: 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54  XCLUSIVE.**.** T
a0d0: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
a0e0: 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61   only increase a
a0f0: 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20   lock.  Use the 
a100: 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28  sqlite3OsUnlock(
a110: 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20  ).** routine to 
a120: 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20  lower a locking 
a130: 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63  level..*/.static
a140: 20 69 6e 74 20 75 6e 69 78 4c 6f 63 6b 28 73 71   int unixLock(sq
a150: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
a160: 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20  int locktype){. 
a170: 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   /* The followin
a180: 67 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  g describes the 
a190: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
a1a0: 66 20 74 68 65 20 76 61 72 69 6f 75 73 20 6c 6f  f the various lo
a1b0: 63 6b 73 20 61 6e 64 0a 20 20 2a 2a 20 6c 6f 63  cks and.  ** loc
a1c0: 6b 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 69 6e  k transitions in
a1d0: 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 50 4f   terms of the PO
a1e0: 53 49 58 20 61 64 76 69 73 6f 72 79 20 73 68 61  SIX advisory sha
a1f0: 72 65 64 20 61 6e 64 20 65 78 63 6c 75 73 69 76  red and exclusiv
a200: 65 0a 20 20 2a 2a 20 6c 6f 63 6b 20 70 72 69 6d  e.  ** lock prim
a210: 69 74 69 76 65 73 20 28 63 61 6c 6c 65 64 20 72  itives (called r
a220: 65 61 64 2d 6c 6f 63 6b 73 20 61 6e 64 20 77 72  ead-locks and wr
a230: 69 74 65 2d 6c 6f 63 6b 73 20 62 65 6c 6f 77 2c  ite-locks below,
a240: 20 74 6f 20 61 76 6f 69 64 0a 20 20 2a 2a 20 63   to avoid.  ** c
a250: 6f 6e 66 75 73 69 6f 6e 20 77 69 74 68 20 53 51  onfusion with SQ
a260: 4c 69 74 65 20 6c 6f 63 6b 20 6e 61 6d 65 73 29  Lite lock names)
a270: 2e 20 54 68 65 20 61 6c 67 6f 72 69 74 68 6d 73  . The algorithms
a280: 20 61 72 65 20 63 6f 6d 70 6c 69 63 61 74 65 64   are complicated
a290: 0a 20 20 2a 2a 20 73 6c 69 67 68 74 6c 79 20 69  .  ** slightly i
a2a0: 6e 20 6f 72 64 65 72 20 74 6f 20 62 65 20 63 6f  n order to be co
a2b0: 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20 77 69  mpatible with wi
a2c0: 6e 64 6f 77 73 20 73 79 73 74 65 6d 73 20 73 69  ndows systems si
a2d0: 6d 75 6c 74 61 6e 65 6f 75 73 6c 79 0a 20 20 2a  multaneously.  *
a2e0: 2a 20 61 63 63 65 73 73 69 6e 67 20 74 68 65 20  * accessing the 
a2f0: 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 66 69  same database fi
a300: 6c 65 2c 20 69 6e 20 63 61 73 65 20 74 68 61 74  le, in case that
a310: 20 69 73 20 65 76 65 72 20 72 65 71 75 69 72 65   is ever require
a320: 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 79 6d  d..  **.  ** Sym
a330: 62 6f 6c 73 20 64 65 66 69 6e 65 64 20 69 6e 20  bols defined in 
a340: 6f 73 2e 68 20 69 6e 64 65 6e 74 69 66 79 20 74  os.h indentify t
a350: 68 65 20 27 70 65 6e 64 69 6e 67 20 62 79 74 65  he 'pending byte
a360: 27 20 61 6e 64 20 74 68 65 20 27 72 65 73 65 72  ' and the 'reser
a370: 76 65 64 0a 20 20 2a 2a 20 62 79 74 65 27 2c 20  ved.  ** byte', 
a380: 65 61 63 68 20 73 69 6e 67 6c 65 20 62 79 74 65  each single byte
a390: 73 20 61 74 20 77 65 6c 6c 20 6b 6e 6f 77 6e 20  s at well known 
a3a0: 6f 66 66 73 65 74 73 2c 20 61 6e 64 20 74 68 65  offsets, and the
a3b0: 20 27 73 68 61 72 65 64 20 62 79 74 65 0a 20 20   'shared byte.  
a3c0: 2a 2a 20 72 61 6e 67 65 27 2c 20 61 20 72 61 6e  ** range', a ran
a3d0: 67 65 20 6f 66 20 35 31 30 20 62 79 74 65 73 20  ge of 510 bytes 
a3e0: 61 74 20 61 20 77 65 6c 6c 20 6b 6e 6f 77 6e 20  at a well known 
a3f0: 6f 66 66 73 65 74 2e 0a 20 20 2a 2a 0a 20 20 2a  offset..  **.  *
a400: 2a 20 54 6f 20 6f 62 74 61 69 6e 20 61 20 53 48  * To obtain a SH
a410: 41 52 45 44 20 6c 6f 63 6b 2c 20 61 20 72 65 61  ARED lock, a rea
a420: 64 2d 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e  d-lock is obtain
a430: 65 64 20 6f 6e 20 74 68 65 20 27 70 65 6e 64 69  ed on the 'pendi
a440: 6e 67 0a 20 20 2a 2a 20 62 79 74 65 27 2e 20 20  ng.  ** byte'.  
a450: 49 66 20 74 68 69 73 20 69 73 20 73 75 63 63 65  If this is succe
a460: 73 73 66 75 6c 2c 20 61 20 72 61 6e 64 6f 6d 20  ssful, a random 
a470: 62 79 74 65 20 66 72 6f 6d 20 74 68 65 20 27 73  byte from the 's
a480: 68 61 72 65 64 20 62 79 74 65 0a 20 20 2a 2a 20  hared byte.  ** 
a490: 72 61 6e 67 65 27 20 69 73 20 72 65 61 64 2d 6c  range' is read-l
a4a0: 6f 63 6b 65 64 20 61 6e 64 20 74 68 65 20 6c 6f  ocked and the lo
a4b0: 63 6b 20 6f 6e 20 74 68 65 20 27 70 65 6e 64 69  ck on the 'pendi
a4c0: 6e 67 20 62 79 74 65 27 20 72 65 6c 65 61 73 65  ng byte' release
a4d0: 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 70  d..  **.  ** A p
a4e0: 72 6f 63 65 73 73 20 6d 61 79 20 6f 6e 6c 79 20  rocess may only 
a4f0: 6f 62 74 61 69 6e 20 61 20 52 45 53 45 52 56 45  obtain a RESERVE
a500: 44 20 6c 6f 63 6b 20 61 66 74 65 72 20 69 74 20  D lock after it 
a510: 68 61 73 20 61 20 53 48 41 52 45 44 20 6c 6f 63  has a SHARED loc
a520: 6b 2e 0a 20 20 2a 2a 20 41 20 52 45 53 45 52 56  k..  ** A RESERV
a530: 45 44 20 6c 6f 63 6b 20 69 73 20 69 6d 70 6c 65  ED lock is imple
a540: 6d 65 6e 74 65 64 20 62 79 20 67 72 61 62 62 69  mented by grabbi
a550: 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20  ng a write-lock 
a560: 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 27 72 65 73  on the.  ** 'res
a570: 65 72 76 65 64 20 62 79 74 65 27 2e 20 0a 20 20  erved byte'. .  
a580: 2a 2a 0a 20 20 2a 2a 20 41 20 70 72 6f 63 65 73  **.  ** A proces
a590: 73 20 6d 61 79 20 6f 6e 6c 79 20 6f 62 74 61 69  s may only obtai
a5a0: 6e 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  n a PENDING lock
a5b0: 20 61 66 74 65 72 20 69 74 20 68 61 73 20 6f 62   after it has ob
a5c0: 74 61 69 6e 65 64 20 61 0a 20 20 2a 2a 20 53 48  tained a.  ** SH
a5d0: 41 52 45 44 20 6c 6f 63 6b 2e 20 41 20 50 45 4e  ARED lock. A PEN
a5e0: 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 69 6d 70  DING lock is imp
a5f0: 6c 65 6d 65 6e 74 65 64 20 62 79 20 6f 62 74 61  lemented by obta
a600: 69 6e 69 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f  ining a write-lo
a610: 63 6b 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 27  ck.  ** on the '
a620: 70 65 6e 64 69 6e 67 20 62 79 74 65 27 2e 20 54  pending byte'. T
a630: 68 69 73 20 65 6e 73 75 72 65 73 20 74 68 61 74  his ensures that
a640: 20 6e 6f 20 6e 65 77 20 53 48 41 52 45 44 20 6c   no new SHARED l
a650: 6f 63 6b 73 20 63 61 6e 20 62 65 0a 20 20 2a 2a  ocks can be.  **
a660: 20 6f 62 74 61 69 6e 65 64 2c 20 62 75 74 20 65   obtained, but e
a670: 78 69 73 74 69 6e 67 20 53 48 41 52 45 44 20 6c  xisting SHARED l
a680: 6f 63 6b 73 20 61 72 65 20 61 6c 6c 6f 77 65 64  ocks are allowed
a690: 20 74 6f 20 70 65 72 73 69 73 74 2e 20 41 20 70   to persist. A p
a6a0: 72 6f 63 65 73 73 0a 20 20 2a 2a 20 64 6f 65 73  rocess.  ** does
a6b0: 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 6f 62 74   not have to obt
a6c0: 61 69 6e 20 61 20 52 45 53 45 52 56 45 44 20 6c  ain a RESERVED l
a6d0: 6f 63 6b 20 6f 6e 20 74 68 65 20 77 61 79 20 74  ock on the way t
a6e0: 6f 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  o a PENDING lock
a6f0: 2e 0a 20 20 2a 2a 20 54 68 69 73 20 70 72 6f 70  ..  ** This prop
a700: 65 72 74 79 20 69 73 20 75 73 65 64 20 62 79 20  erty is used by 
a710: 74 68 65 20 61 6c 67 6f 72 69 74 68 6d 20 66 6f  the algorithm fo
a720: 72 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61  r rolling back a
a730: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20   journal file.  
a740: 2a 2a 20 61 66 74 65 72 20 61 20 63 72 61 73 68  ** after a crash
a750: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 45  ..  **.  ** An E
a760: 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2c 20 6f  XCLUSIVE lock, o
a770: 62 74 61 69 6e 65 64 20 61 66 74 65 72 20 61 20  btained after a 
a780: 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20  PENDING lock is 
a790: 68 65 6c 64 2c 20 69 73 0a 20 20 2a 2a 20 69 6d  held, is.  ** im
a7a0: 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 6f 62 74  plemented by obt
a7b0: 61 69 6e 69 6e 67 20 61 20 77 72 69 74 65 2d 6c  aining a write-l
a7c0: 6f 63 6b 20 6f 6e 20 74 68 65 20 65 6e 74 69 72  ock on the entir
a7d0: 65 20 27 73 68 61 72 65 64 20 62 79 74 65 0a 20  e 'shared byte. 
a7e0: 20 2a 2a 20 72 61 6e 67 65 27 2e 20 53 69 6e 63   ** range'. Sinc
a7f0: 65 20 61 6c 6c 20 6f 74 68 65 72 20 6c 6f 63 6b  e all other lock
a800: 73 20 72 65 71 75 69 72 65 20 61 20 72 65 61 64  s require a read
a810: 2d 6c 6f 63 6b 20 6f 6e 20 6f 6e 65 20 6f 66 20  -lock on one of 
a820: 74 68 65 20 62 79 74 65 73 0a 20 20 2a 2a 20 77  the bytes.  ** w
a830: 69 74 68 69 6e 20 74 68 69 73 20 72 61 6e 67 65  ithin this range
a840: 2c 20 74 68 69 73 20 65 6e 73 75 72 65 73 20 74  , this ensures t
a850: 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 6c 6f 63  hat no other loc
a860: 6b 73 20 61 72 65 20 68 65 6c 64 20 6f 6e 20 74  ks are held on t
a870: 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  he.  ** database
a880: 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  . .  **.  ** The
a890: 20 72 65 61 73 6f 6e 20 61 20 73 69 6e 67 6c 65   reason a single
a8a0: 20 62 79 74 65 20 63 61 6e 6e 6f 74 20 62 65 20   byte cannot be 
a8b0: 75 73 65 64 20 69 6e 73 74 65 61 64 20 6f 66 20  used instead of 
a8c0: 74 68 65 20 27 73 68 61 72 65 64 20 62 79 74 65  the 'shared byte
a8d0: 0a 20 20 2a 2a 20 72 61 6e 67 65 27 20 69 73 20  .  ** range' is 
a8e0: 74 68 61 74 20 73 6f 6d 65 20 76 65 72 73 69 6f  that some versio
a8f0: 6e 73 20 6f 66 20 77 69 6e 64 6f 77 73 20 64 6f  ns of windows do
a900: 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 72 65 61   not support rea
a910: 64 2d 6c 6f 63 6b 73 2e 20 42 79 0a 20 20 2a 2a  d-locks. By.  **
a920: 20 6c 6f 63 6b 69 6e 67 20 61 20 72 61 6e 64 6f   locking a rando
a930: 6d 20 62 79 74 65 20 66 72 6f 6d 20 61 20 72 61  m byte from a ra
a940: 6e 67 65 2c 20 63 6f 6e 63 75 72 72 65 6e 74 20  nge, concurrent 
a950: 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 6d 61 79  SHARED locks may
a960: 20 65 78 69 73 74 0a 20 20 2a 2a 20 65 76 65 6e   exist.  ** even
a970: 20 69 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   if the locking 
a980: 70 72 69 6d 69 74 69 76 65 20 75 73 65 64 20 69  primitive used i
a990: 73 20 61 6c 77 61 79 73 20 61 20 77 72 69 74 65  s always a write
a9a0: 2d 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 6e  -lock..  */.  in
a9b0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
a9c0: 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  ;.  unixFile *pF
a9d0: 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
a9e0: 29 69 64 3b 0a 20 20 73 74 72 75 63 74 20 75 6e  )id;.  struct un
a9f0: 69 78 4c 6f 63 6b 49 6e 66 6f 20 2a 70 4c 6f 63  ixLockInfo *pLoc
aa00: 6b 20 3d 20 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b  k = pFile->pLock
aa10: 3b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b  ;.  struct flock
aa20: 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20 73 20 3d   lock;.  int s =
aa30: 20 30 3b 0a 20 20 69 6e 74 20 74 45 72 72 6e 6f   0;.  int tErrno
aa40: 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28   = 0;..  assert(
aa50: 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52   pFile );.  OSTR
aa60: 41 43 45 37 28 22 4c 4f 43 4b 20 20 20 20 25 64  ACE7("LOCK    %d
aa70: 20 25 73 20 77 61 73 20 25 73 28 25 73 2c 25 64   %s was %s(%s,%d
aa80: 29 20 70 69 64 3d 25 64 20 28 75 6e 69 78 29 5c  ) pid=%d (unix)\
aa90: 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20  n", pFile->h,.  
aaa0: 20 20 20 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65      locktypeName
aab0: 28 6c 6f 63 6b 74 79 70 65 29 2c 20 6c 6f 63 6b  (locktype), lock
aac0: 74 79 70 65 4e 61 6d 65 28 70 46 69 6c 65 2d 3e  typeName(pFile->
aad0: 6c 6f 63 6b 74 79 70 65 29 2c 0a 20 20 20 20 20  locktype),.     
aae0: 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28 70 4c   locktypeName(pL
aaf0: 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 29 2c 20  ock->locktype), 
ab00: 70 4c 6f 63 6b 2d 3e 63 6e 74 20 2c 20 67 65 74  pLock->cnt , get
ab10: 70 69 64 28 29 29 3b 0a 0a 20 20 2f 2a 20 49 66  pid());..  /* If
ab20: 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64   there is alread
ab30: 79 20 61 20 6c 6f 63 6b 20 6f 66 20 74 68 69 73  y a lock of this
ab40: 20 74 79 70 65 20 6f 72 20 6d 6f 72 65 20 72 65   type or more re
ab50: 73 74 72 69 63 74 69 76 65 20 6f 6e 20 74 68 65  strictive on the
ab60: 0a 20 20 2a 2a 20 75 6e 69 78 46 69 6c 65 2c 20  .  ** unixFile, 
ab70: 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e 27  do nothing. Don'
ab80: 74 20 75 73 65 20 74 68 65 20 65 6e 64 5f 6c 6f  t use the end_lo
ab90: 63 6b 3a 20 65 78 69 74 20 70 61 74 68 2c 20 61  ck: exit path, a
aba0: 73 0a 20 20 2a 2a 20 75 6e 69 78 45 6e 74 65 72  s.  ** unixEnter
abb0: 4d 75 74 65 78 28 29 20 68 61 73 6e 27 74 20 62  Mutex() hasn't b
abc0: 65 65 6e 20 63 61 6c 6c 65 64 20 79 65 74 2e 0a  een called yet..
abd0: 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65    */.  if( pFile
abe0: 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 6c 6f 63 6b  ->locktype>=lock
abf0: 74 79 70 65 20 29 7b 0a 20 20 20 20 4f 53 54 52  type ){.    OSTR
ac00: 41 43 45 33 28 22 4c 4f 43 4b 20 20 20 20 25 64  ACE3("LOCK    %d
ac10: 20 25 73 20 6f 6b 20 28 61 6c 72 65 61 64 79 20   %s ok (already 
ac20: 68 65 6c 64 29 20 28 75 6e 69 78 29 5c 6e 22 2c  held) (unix)\n",
ac30: 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20   pFile->h,.     
ac40: 20 20 20 20 20 20 20 6c 6f 63 6b 74 79 70 65 4e         locktypeN
ac50: 61 6d 65 28 6c 6f 63 6b 74 79 70 65 29 29 3b 0a  ame(locktype));.
ac60: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
ac70: 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  E_OK;.  }..  /* 
ac80: 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6c 6f  Make sure the lo
ac90: 63 6b 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69  cking sequence i
aca0: 73 20 63 6f 72 72 65 63 74 2e 0a 20 20 2a 2a 20  s correct..  ** 
acb0: 20 28 31 29 20 57 65 20 6e 65 76 65 72 20 6d 6f   (1) We never mo
acc0: 76 65 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64  ve from unlocked
acd0: 20 74 6f 20 61 6e 79 74 68 69 6e 67 20 68 69 67   to anything hig
ace0: 68 65 72 20 74 68 61 6e 20 73 68 61 72 65 64 20  her than shared 
acf0: 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28 32 29 20  lock..  **  (2) 
ad00: 53 51 4c 69 74 65 20 6e 65 76 65 72 20 65 78 70  SQLite never exp
ad10: 6c 69 63 69 74 6c 79 20 72 65 71 75 65 73 74 73  licitly requests
ad20: 20 61 20 70 65 6e 64 69 67 20 6c 6f 63 6b 2e 0a   a pendig lock..
ad30: 20 20 2a 2a 20 20 28 33 29 20 41 20 73 68 61 72    **  (3) A shar
ad40: 65 64 20 6c 6f 63 6b 20 69 73 20 61 6c 77 61 79  ed lock is alway
ad50: 73 20 68 65 6c 64 20 77 68 65 6e 20 61 20 72 65  s held when a re
ad60: 73 65 72 76 65 20 6c 6f 63 6b 20 69 73 20 72 65  serve lock is re
ad70: 71 75 65 73 74 65 64 2e 0a 20 20 2a 2f 0a 20 20  quested..  */.  
ad80: 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c  assert( pFile->l
ad90: 6f 63 6b 74 79 70 65 21 3d 4e 4f 5f 4c 4f 43 4b  ocktype!=NO_LOCK
ada0: 20 7c 7c 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48   || locktype==SH
adb0: 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61  ARED_LOCK );.  a
adc0: 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 21  ssert( locktype!
add0: 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b  =PENDING_LOCK );
ade0: 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74  .  assert( lockt
adf0: 79 70 65 21 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ype!=RESERVED_LO
ae00: 43 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 6c 6f 63  CK || pFile->loc
ae10: 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f  ktype==SHARED_LO
ae20: 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73  CK );..  /* This
ae30: 20 6d 75 74 65 78 20 69 73 20 6e 65 65 64 65 64   mutex is needed
ae40: 20 62 65 63 61 75 73 65 20 70 46 69 6c 65 2d 3e   because pFile->
ae50: 70 4c 6f 63 6b 20 69 73 20 73 68 61 72 65 64 20  pLock is shared 
ae60: 61 63 72 6f 73 73 20 74 68 72 65 61 64 73 0a 20  across threads. 
ae70: 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d   */.  unixEnterM
ae80: 75 74 65 78 28 29 3b 0a 0a 20 20 2f 2a 20 4d 61  utex();..  /* Ma
ae90: 6b 65 20 73 75 72 65 20 74 68 65 20 63 75 72 72  ke sure the curr
aea0: 65 6e 74 20 74 68 72 65 61 64 20 6f 77 6e 73 20  ent thread owns 
aeb0: 74 68 65 20 70 46 69 6c 65 2e 0a 20 20 2a 2f 0a  the pFile..  */.
aec0: 20 20 72 63 20 3d 20 74 72 61 6e 73 66 65 72 4f    rc = transferO
aed0: 77 6e 65 72 73 68 69 70 28 70 46 69 6c 65 29 3b  wnership(pFile);
aee0: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
aef0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 75 6e 69 78  E_OK ){.    unix
af00: 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
af10: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
af20: 0a 20 20 70 4c 6f 63 6b 20 3d 20 70 46 69 6c 65  .  pLock = pFile
af30: 2d 3e 70 4c 6f 63 6b 3b 0a 0a 20 20 2f 2a 20 49  ->pLock;..  /* I
af40: 66 20 73 6f 6d 65 20 74 68 72 65 61 64 20 75 73  f some thread us
af50: 69 6e 67 20 74 68 69 73 20 50 49 44 20 68 61 73  ing this PID has
af60: 20 61 20 6c 6f 63 6b 20 76 69 61 20 61 20 64 69   a lock via a di
af70: 66 66 65 72 65 6e 74 20 75 6e 69 78 46 69 6c 65  fferent unixFile
af80: 2a 0a 20 20 2a 2a 20 68 61 6e 64 6c 65 20 74 68  *.  ** handle th
af90: 61 74 20 70 72 65 63 6c 75 64 65 73 20 74 68 65  at precludes the
afa0: 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 2c   requested lock,
afb0: 20 72 65 74 75 72 6e 20 42 55 53 59 2e 0a 20 20   return BUSY..  
afc0: 2a 2f 0a 20 20 69 66 28 20 28 70 46 69 6c 65 2d  */.  if( (pFile-
afd0: 3e 6c 6f 63 6b 74 79 70 65 21 3d 70 4c 6f 63 6b  >locktype!=pLock
afe0: 2d 3e 6c 6f 63 6b 74 79 70 65 20 26 26 20 0a 20  ->locktype && . 
aff0: 20 20 20 20 20 20 20 20 20 28 70 4c 6f 63 6b 2d           (pLock-
b000: 3e 6c 6f 63 6b 74 79 70 65 3e 3d 50 45 4e 44 49  >locktype>=PENDI
b010: 4e 47 5f 4c 4f 43 4b 20 7c 7c 20 6c 6f 63 6b 74  NG_LOCK || lockt
b020: 79 70 65 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 29  ype>SHARED_LOCK)
b030: 29 0a 20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ).  ){.    rc = 
b040: 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
b050: 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a   goto end_lock;.
b060: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 20 53    }..  /* If a S
b070: 48 41 52 45 44 20 6c 6f 63 6b 20 69 73 20 72 65  HARED lock is re
b080: 71 75 65 73 74 65 64 2c 20 61 6e 64 20 73 6f 6d  quested, and som
b090: 65 20 74 68 72 65 61 64 20 75 73 69 6e 67 20 74  e thread using t
b0a0: 68 69 73 20 50 49 44 20 61 6c 72 65 61 64 79 0a  his PID already.
b0b0: 20 20 2a 2a 20 68 61 73 20 61 20 53 48 41 52 45    ** has a SHARE
b0c0: 44 20 6f 72 20 52 45 53 45 52 56 45 44 20 6c 6f  D or RESERVED lo
b0d0: 63 6b 2c 20 74 68 65 6e 20 69 6e 63 72 65 6d 65  ck, then increme
b0e0: 6e 74 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  nt reference cou
b0f0: 6e 74 73 20 61 6e 64 0a 20 20 2a 2a 20 72 65 74  nts and.  ** ret
b100: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 20  urn SQLITE_OK.. 
b110: 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79   */.  if( lockty
b120: 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  pe==SHARED_LOCK 
b130: 26 26 20 0a 20 20 20 20 20 20 28 70 4c 6f 63 6b  && .      (pLock
b140: 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52  ->locktype==SHAR
b150: 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 4c 6f 63 6b  ED_LOCK || pLock
b160: 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 52 45 53 45  ->locktype==RESE
b170: 52 56 45 44 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20  RVED_LOCK) ){.  
b180: 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79    assert( lockty
b190: 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  pe==SHARED_LOCK 
b1a0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
b1b0: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d  File->locktype==
b1c0: 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
b1d0: 20 70 4c 6f 63 6b 2d 3e 63 6e 74 3e 30 20 29 3b   pLock->cnt>0 );
b1e0: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  .    pFile->lock
b1f0: 74 79 70 65 20 3d 20 53 48 41 52 45 44 5f 4c 4f  type = SHARED_LO
b200: 43 4b 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 63  CK;.    pLock->c
b210: 6e 74 2b 2b 3b 0a 20 20 20 20 70 46 69 6c 65 2d  nt++;.    pFile-
b220: 3e 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 2b 2b 3b  >pOpen->nLock++;
b230: 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f  .    goto end_lo
b240: 63 6b 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41  ck;.  }...  /* A
b250: 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73   PENDING lock is
b260: 20 6e 65 65 64 65 64 20 62 65 66 6f 72 65 20 61   needed before a
b270: 63 71 75 69 72 69 6e 67 20 61 20 53 48 41 52 45  cquiring a SHARE
b280: 44 20 6c 6f 63 6b 20 61 6e 64 20 62 65 66 6f 72  D lock and befor
b290: 65 0a 20 20 2a 2a 20 61 63 71 75 69 72 69 6e 67  e.  ** acquiring
b2a0: 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
b2b0: 63 6b 2e 20 20 46 6f 72 20 74 68 65 20 53 48 41  ck.  For the SHA
b2c0: 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20 50 45  RED lock, the PE
b2d0: 4e 44 49 4e 47 20 77 69 6c 6c 0a 20 20 2a 2a 20  NDING will.  ** 
b2e0: 62 65 20 72 65 6c 65 61 73 65 64 2e 0a 20 20 2a  be released..  *
b2f0: 2f 0a 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d  /.  lock.l_len =
b300: 20 31 4c 3b 0a 20 20 6c 6f 63 6b 2e 6c 5f 77 68   1L;.  lock.l_wh
b310: 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b  ence = SEEK_SET;
b320: 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d  .  if( locktype=
b330: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 0a 20 20  =SHARED_LOCK .  
b340: 20 20 20 20 7c 7c 20 28 6c 6f 63 6b 74 79 70 65      || (locktype
b350: 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
b360: 20 26 26 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74   && pFile->lockt
b370: 79 70 65 3c 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  ype<PENDING_LOCK
b380: 29 0a 20 20 29 7b 0a 20 20 20 20 6c 6f 63 6b 2e  ).  ){.    lock.
b390: 6c 5f 74 79 70 65 20 3d 20 28 6c 6f 63 6b 74 79  l_type = (lockty
b3a0: 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 3f  pe==SHARED_LOCK?
b3b0: 46 5f 52 44 4c 43 4b 3a 46 5f 57 52 4c 43 4b 29  F_RDLCK:F_WRLCK)
b3c0: 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61  ;.    lock.l_sta
b3d0: 72 74 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54  rt = PENDING_BYT
b3e0: 45 3b 0a 20 20 20 20 73 20 3d 20 66 63 6e 74 6c  E;.    s = fcntl
b3f0: 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54  (pFile->h, F_SET
b400: 4c 4b 2c 20 26 6c 6f 63 6b 29 3b 0a 20 20 20 20  LK, &lock);.    
b410: 69 66 28 20 73 3d 3d 28 2d 31 29 20 29 7b 0a 20  if( s==(-1) ){. 
b420: 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72       tErrno = er
b430: 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  rno;.      rc = 
b440: 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
b450: 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
b460: 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c  , SQLITE_IOERR_L
b470: 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20  OCK);.      if( 
b480: 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63  IS_LOCK_ERROR(rc
b490: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69  ) ){.        pFi
b4a0: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
b4b0: 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a  tErrno;.      }.
b4c0: 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c        goto end_l
b4d0: 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ock;.    }.  }..
b4e0: 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c  .  /* If control
b4f0: 20 67 65 74 73 20 74 6f 20 74 68 69 73 20 70 6f   gets to this po
b500: 69 6e 74 2c 20 74 68 65 6e 20 61 63 74 75 61 6c  int, then actual
b510: 6c 79 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20  ly go ahead and 
b520: 6d 61 6b 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74  make.  ** operat
b530: 69 6e 67 20 73 79 73 74 65 6d 20 63 61 6c 6c 73  ing system calls
b540: 20 66 6f 72 20 74 68 65 20 73 70 65 63 69 66 69   for the specifi
b550: 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20  ed lock..  */.  
b560: 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48  if( locktype==SH
b570: 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
b580: 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e   assert( pLock->
b590: 63 6e 74 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  cnt==0 );.    as
b5a0: 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 6c 6f 63  sert( pLock->loc
b5b0: 6b 74 79 70 65 3d 3d 30 20 29 3b 0a 0a 20 20 20  ktype==0 );..   
b5c0: 20 2f 2a 20 4e 6f 77 20 67 65 74 20 74 68 65 20   /* Now get the 
b5d0: 72 65 61 64 2d 6c 6f 63 6b 20 2a 2f 0a 20 20 20  read-lock */.   
b5e0: 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
b5f0: 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20  SHARED_FIRST;.  
b600: 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53    lock.l_len = S
b610: 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20  HARED_SIZE;.    
b620: 69 66 28 20 28 73 20 3d 20 66 63 6e 74 6c 28 70  if( (s = fcntl(p
b630: 46 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b  File->h, F_SETLK
b640: 2c 20 26 6c 6f 63 6b 29 29 3d 3d 28 2d 31 29 20  , &lock))==(-1) 
b650: 29 7b 0a 20 20 20 20 20 20 74 45 72 72 6e 6f 20  ){.      tErrno 
b660: 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20  = errno;.    }. 
b670: 20 20 20 2f 2a 20 44 72 6f 70 20 74 68 65 20 74     /* Drop the t
b680: 65 6d 70 6f 72 61 72 79 20 50 45 4e 44 49 4e 47  emporary PENDING
b690: 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c 6f 63   lock */.    loc
b6a0: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50 45 4e 44  k.l_start = PEND
b6b0: 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20 20 6c 6f  ING_BYTE;.    lo
b6c0: 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 20  ck.l_len = 1L;. 
b6d0: 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d     lock.l_type =
b6e0: 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 69 66   F_UNLCK;.    if
b6f0: 28 20 66 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68  ( fcntl(pFile->h
b700: 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b  , F_SETLK, &lock
b710: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  )!=0 ){.      if
b720: 28 20 73 20 21 3d 20 2d 31 20 29 7b 0a 20 20 20  ( s != -1 ){.   
b730: 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63 6f 75       /* This cou
b740: 6c 64 20 68 61 70 70 65 6e 20 77 69 74 68 20 61  ld happen with a
b750: 20 6e 65 74 77 6f 72 6b 20 6d 6f 75 6e 74 20 2a   network mount *
b760: 2f 0a 20 20 20 20 20 20 20 20 74 45 72 72 6e 6f  /.        tErrno
b770: 20 3d 20 65 72 72 6e 6f 3b 20 0a 20 20 20 20 20   = errno; .     
b780: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72     rc = sqliteEr
b790: 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f  rorFromPosixErro
b7a0: 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45  r(tErrno, SQLITE
b7b0: 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 20  _IOERR_UNLOCK); 
b7c0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 49 53 5f  .        if( IS_
b7d0: 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29  LOCK_ERROR(rc) )
b7e0: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46 69 6c  {.          pFil
b7f0: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74  e->lastErrno = t
b800: 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 7d  Errno;.        }
b810: 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e  .        goto en
b820: 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 7d 0a  d_lock;.      }.
b830: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 3d      }.    if( s=
b840: 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 72  =(-1) ){.      r
b850: 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  c = sqliteErrorF
b860: 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
b870: 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45  rrno, SQLITE_IOE
b880: 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  RR_LOCK);.      
b890: 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  if( IS_LOCK_ERRO
b8a0: 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20  R(rc) ){.       
b8b0: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
b8c0: 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20  o = tErrno;.    
b8d0: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
b8e0: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b       pFile->lock
b8f0: 74 79 70 65 20 3d 20 53 48 41 52 45 44 5f 4c 4f  type = SHARED_LO
b900: 43 4b 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  CK;.      pFile-
b910: 3e 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 2b 2b 3b  >pOpen->nLock++;
b920: 0a 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 63 6e  .      pLock->cn
b930: 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  t = 1;.    }.  }
b940: 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b 74 79 70  else if( locktyp
b950: 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  e==EXCLUSIVE_LOC
b960: 4b 20 26 26 20 70 4c 6f 63 6b 2d 3e 63 6e 74 3e  K && pLock->cnt>
b970: 31 20 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20 61  1 ){.    /* We a
b980: 72 65 20 74 72 79 69 6e 67 20 66 6f 72 20 61 6e  re trying for an
b990: 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20   exclusive lock 
b9a0: 62 75 74 20 61 6e 6f 74 68 65 72 20 74 68 72 65  but another thre
b9b0: 61 64 20 69 6e 20 74 68 69 73 0a 20 20 20 20 2a  ad in this.    *
b9c0: 2a 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 69  * same process i
b9d0: 73 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20  s still holding 
b9e0: 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20 2a  a shared lock. *
b9f0: 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  /.    rc = SQLIT
ba00: 45 5f 42 55 53 59 3b 0a 20 20 7d 65 6c 73 65 7b  E_BUSY;.  }else{
ba10: 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75  .    /* The requ
ba20: 65 73 74 20 77 61 73 20 66 6f 72 20 61 20 52 45  est was for a RE
ba30: 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53  SERVED or EXCLUS
ba40: 49 56 45 20 6c 6f 63 6b 2e 20 20 49 74 20 69 73  IVE lock.  It is
ba50: 0a 20 20 20 20 2a 2a 20 61 73 73 75 6d 65 64 20  .    ** assumed 
ba60: 74 68 61 74 20 74 68 65 72 65 20 69 73 20 61 20  that there is a 
ba70: 53 48 41 52 45 44 20 6f 72 20 67 72 65 61 74 65  SHARED or greate
ba80: 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69  r lock on the fi
ba90: 6c 65 0a 20 20 20 20 2a 2a 20 61 6c 72 65 61 64  le.    ** alread
baa0: 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  y..    */.    as
bab0: 73 65 72 74 28 20 30 21 3d 70 46 69 6c 65 2d 3e  sert( 0!=pFile->
bac0: 6c 6f 63 6b 74 79 70 65 20 29 3b 0a 20 20 20 20  locktype );.    
bad0: 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f  lock.l_type = F_
bae0: 57 52 4c 43 4b 3b 0a 20 20 20 20 73 77 69 74 63  WRLCK;.    switc
baf0: 68 28 20 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20  h( locktype ){. 
bb00: 20 20 20 20 20 63 61 73 65 20 52 45 53 45 52 56       case RESERV
bb10: 45 44 5f 4c 4f 43 4b 3a 0a 20 20 20 20 20 20 20  ED_LOCK:.       
bb20: 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
bb30: 52 45 53 45 52 56 45 44 5f 42 59 54 45 3b 0a 20  RESERVED_BYTE;. 
bb40: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
bb50: 20 20 20 20 63 61 73 65 20 45 58 43 4c 55 53 49      case EXCLUSI
bb60: 56 45 5f 4c 4f 43 4b 3a 0a 20 20 20 20 20 20 20  VE_LOCK:.       
bb70: 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
bb80: 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20  SHARED_FIRST;.  
bb90: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e        lock.l_len
bba0: 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a   = SHARED_SIZE;.
bbb0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
bbc0: 20 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20       default:.  
bbd0: 20 20 20 20 20 20 61 73 73 65 72 74 28 30 29 3b        assert(0);
bbe0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 20 3d 20 66  .    }.    s = f
bbf0: 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46  cntl(pFile->h, F
bc00: 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3b 0a  _SETLK, &lock);.
bc10: 20 20 20 20 69 66 28 20 73 3d 3d 28 2d 31 29 20      if( s==(-1) 
bc20: 29 7b 0a 20 20 20 20 20 20 74 45 72 72 6e 6f 20  ){.      tErrno 
bc30: 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72  = errno;.      r
bc40: 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  c = sqliteErrorF
bc50: 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
bc60: 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45  rrno, SQLITE_IOE
bc70: 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  RR_LOCK);.      
bc80: 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  if( IS_LOCK_ERRO
bc90: 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20  R(rc) ){.       
bca0: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
bcb0: 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20  o = tErrno;.    
bcc0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
bcd0: 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  ..#ifndef NDEBUG
bce0: 0a 20 20 2f 2a 20 53 65 74 20 75 70 20 74 68 65  .  /* Set up the
bcf0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2d 63 6f 75   transaction-cou
bd00: 6e 74 65 72 20 63 68 61 6e 67 65 20 63 68 65 63  nter change chec
bd10: 6b 69 6e 67 20 66 6c 61 67 73 20 77 68 65 6e 0a  king flags when.
bd20: 20 20 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 69    ** transitioni
bd30: 6e 67 20 66 72 6f 6d 20 61 20 53 48 41 52 45 44  ng from a SHARED
bd40: 20 74 6f 20 61 20 52 45 53 45 52 56 45 44 20 6c   to a RESERVED l
bd50: 6f 63 6b 2e 20 20 54 68 65 20 63 68 61 6e 67 65  ock.  The change
bd60: 0a 20 20 2a 2a 20 66 72 6f 6d 20 53 48 41 52 45  .  ** from SHARE
bd70: 44 20 74 6f 20 52 45 53 45 52 56 45 44 20 6d 61  D to RESERVED ma
bd80: 72 6b 73 20 74 68 65 20 62 65 67 69 6e 6e 69 6e  rks the beginnin
bd90: 67 20 6f 66 20 61 20 6e 6f 72 6d 61 6c 0a 20 20  g of a normal.  
bda0: 2a 2a 20 77 72 69 74 65 20 6f 70 65 72 61 74 69  ** write operati
bdb0: 6f 6e 20 28 6e 6f 74 20 61 20 68 6f 74 20 6a 6f  on (not a hot jo
bdc0: 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 29 2e  urnal rollback).
bdd0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d  .  */.  if( rc==
bde0: 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 26 26 20  SQLITE_OK.   && 
bdf0: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3c  pFile->locktype<
be00: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 20 20 20  =SHARED_LOCK.   
be10: 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 52 45 53  && locktype==RES
be20: 45 52 56 45 44 5f 4c 4f 43 4b 0a 20 20 29 7b 0a  ERVED_LOCK.  ){.
be30: 20 20 20 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73      pFile->trans
be40: 43 6e 74 72 43 68 6e 67 20 3d 20 30 3b 0a 20 20  CntrChng = 0;.  
be50: 20 20 70 46 69 6c 65 2d 3e 64 62 55 70 64 61 74    pFile->dbUpdat
be60: 65 20 3d 20 30 3b 0a 20 20 20 20 70 46 69 6c 65  e = 0;.    pFile
be70: 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20  ->inNormalWrite 
be80: 3d 20 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  = 1;.  }.#endif.
be90: 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
bea0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 46 69  TE_OK ){.    pFi
beb0: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c  le->locktype = l
bec0: 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20 70 4c 6f  ocktype;.    pLo
bed0: 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c  ck->locktype = l
bee0: 6f 63 6b 74 79 70 65 3b 0a 20 20 7d 65 6c 73 65  ocktype;.  }else
bef0: 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 45   if( locktype==E
bf00: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b  XCLUSIVE_LOCK ){
bf10: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  .    pFile->lock
bf20: 74 79 70 65 20 3d 20 50 45 4e 44 49 4e 47 5f 4c  type = PENDING_L
bf30: 4f 43 4b 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e  OCK;.    pLock->
bf40: 6c 6f 63 6b 74 79 70 65 20 3d 20 50 45 4e 44 49  locktype = PENDI
bf50: 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a 0a 65 6e  NG_LOCK;.  }..en
bf60: 64 5f 6c 6f 63 6b 3a 0a 20 20 75 6e 69 78 4c 65  d_lock:.  unixLe
bf70: 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53  aveMutex();.  OS
bf80: 54 52 41 43 45 34 28 22 4c 4f 43 4b 20 20 20 20  TRACE4("LOCK    
bf90: 25 64 20 25 73 20 25 73 20 28 75 6e 69 78 29 5c  %d %s %s (unix)\
bfa0: 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f  n", pFile->h, lo
bfb0: 63 6b 74 79 70 65 4e 61 6d 65 28 6c 6f 63 6b 74  cktypeName(lockt
bfc0: 79 70 65 29 2c 20 0a 20 20 20 20 20 20 72 63 3d  ype), .      rc=
bfd0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b  =SQLITE_OK ? "ok
bfe0: 22 20 3a 20 22 66 61 69 6c 65 64 22 29 3b 0a 20  " : "failed");. 
bff0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
c000: 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 66  *.** Close all f
c010: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20  ile descriptors 
c020: 61 63 63 75 6d 75 61 74 65 64 20 69 6e 20 74 68  accumuated in th
c030: 65 20 75 6e 69 78 4f 70 65 6e 43 6e 74 2d 3e 70  e unixOpenCnt->p
c040: 55 6e 75 73 65 64 20 6c 69 73 74 2e 0a 2a 2a 20  Unused list..** 
c050: 49 66 20 61 6c 6c 20 73 75 63 68 20 66 69 6c 65  If all such file
c060: 20 64 65 73 63 72 69 70 74 6f 72 73 20 61 72 65   descriptors are
c070: 20 63 6c 6f 73 65 64 20 77 69 74 68 6f 75 74 20   closed without 
c080: 65 72 72 6f 72 2c 20 74 68 65 20 6c 69 73 74 20  error, the list 
c090: 69 73 0a 2a 2a 20 63 6c 65 61 72 65 64 20 61 6e  is.** cleared an
c0a0: 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  d SQLITE_OK retu
c0b0: 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  rned..**.** Othe
c0c0: 72 77 69 73 65 2c 20 69 66 20 61 6e 20 65 72 72  rwise, if an err
c0d0: 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20  or occurs, then 
c0e0: 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6c 6f  successfully clo
c0f0: 73 65 64 20 66 69 6c 65 20 64 65 73 63 72 69 70  sed file descrip
c100: 74 6f 72 0a 2a 2a 20 65 6e 74 72 69 65 73 20 61  tor.** entries a
c110: 72 65 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20  re removed from 
c120: 74 68 65 20 6c 69 73 74 2c 20 61 6e 64 20 53 51  the list, and SQ
c130: 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53 45  LITE_IOERR_CLOSE
c140: 20 72 65 74 75 72 6e 65 64 2e 20 0a 2a 2a 20 6e   returned. .** n
c150: 6f 74 20 64 65 6c 65 74 65 64 20 61 6e 64 20 53  ot deleted and S
c160: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53  QLITE_IOERR_CLOS
c170: 45 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 20 0a  E returned..*/ .
c180: 73 74 61 74 69 63 20 69 6e 74 20 63 6c 6f 73 65  static int close
c190: 50 65 6e 64 69 6e 67 46 64 73 28 75 6e 69 78 46  PendingFds(unixF
c1a0: 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69  ile *pFile){.  i
c1b0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
c1c0: 4b 3b 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78  K;.  struct unix
c1d0: 4f 70 65 6e 43 6e 74 20 2a 70 4f 70 65 6e 20 3d  OpenCnt *pOpen =
c1e0: 20 70 46 69 6c 65 2d 3e 70 4f 70 65 6e 3b 0a 20   pFile->pOpen;. 
c1f0: 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70   UnixUnusedFd *p
c200: 45 72 72 6f 72 20 3d 20 30 3b 0a 20 20 55 6e 69  Error = 0;.  Uni
c210: 78 55 6e 75 73 65 64 46 64 20 2a 70 3b 0a 20 20  xUnusedFd *p;.  
c220: 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70 4e  UnixUnusedFd *pN
c230: 65 78 74 3b 0a 20 20 66 6f 72 28 70 3d 70 4f 70  ext;.  for(p=pOp
c240: 65 6e 2d 3e 70 55 6e 75 73 65 64 3b 20 70 3b 20  en->pUnused; p; 
c250: 70 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e  p=pNext){.    pN
c260: 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a  ext = p->pNext;.
c270: 20 20 20 20 69 66 28 20 63 6c 6f 73 65 28 70 2d      if( close(p-
c280: 3e 66 64 29 20 29 7b 0a 20 20 20 20 20 20 70 46  >fd) ){.      pF
c290: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
c2a0: 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63   errno;.      rc
c2b0: 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
c2c0: 43 4c 4f 53 45 3b 0a 20 20 20 20 20 20 70 2d 3e  CLOSE;.      p->
c2d0: 70 4e 65 78 74 20 3d 20 70 45 72 72 6f 72 3b 0a  pNext = pError;.
c2e0: 20 20 20 20 20 20 70 45 72 72 6f 72 20 3d 20 70        pError = p
c2f0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
c300: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
c310: 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  p);.    }.  }.  
c320: 70 4f 70 65 6e 2d 3e 70 55 6e 75 73 65 64 20 3d  pOpen->pUnused =
c330: 20 70 45 72 72 6f 72 3b 0a 20 20 72 65 74 75 72   pError;.  retur
c340: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
c350: 64 64 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  dd the file desc
c360: 72 69 70 74 6f 72 20 75 73 65 64 20 62 79 20 66  riptor used by f
c370: 69 6c 65 20 68 61 6e 64 6c 65 20 70 46 69 6c 65  ile handle pFile
c380: 20 74 6f 20 74 68 65 20 63 6f 72 72 65 73 70 6f   to the correspo
c390: 6e 64 69 6e 67 0a 2a 2a 20 70 55 6e 75 73 65 64  nding.** pUnused
c3a0: 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63   list..*/.static
c3b0: 20 76 6f 69 64 20 73 65 74 50 65 6e 64 69 6e 67   void setPending
c3c0: 46 64 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  Fd(unixFile *pFi
c3d0: 6c 65 29 7b 0a 20 20 73 74 72 75 63 74 20 75 6e  le){.  struct un
c3e0: 69 78 4f 70 65 6e 43 6e 74 20 2a 70 4f 70 65 6e  ixOpenCnt *pOpen
c3f0: 20 3d 20 70 46 69 6c 65 2d 3e 70 4f 70 65 6e 3b   = pFile->pOpen;
c400: 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20  .  UnixUnusedFd 
c410: 2a 70 20 3d 20 70 46 69 6c 65 2d 3e 70 55 6e 75  *p = pFile->pUnu
c420: 73 65 64 3b 0a 20 20 70 2d 3e 70 4e 65 78 74 20  sed;.  p->pNext 
c430: 3d 20 70 4f 70 65 6e 2d 3e 70 55 6e 75 73 65 64  = pOpen->pUnused
c440: 3b 0a 20 20 70 4f 70 65 6e 2d 3e 70 55 6e 75 73  ;.  pOpen->pUnus
c450: 65 64 20 3d 20 70 3b 0a 20 20 70 46 69 6c 65 2d  ed = p;.  pFile-
c460: 3e 68 20 3d 20 2d 31 3b 0a 20 20 70 46 69 6c 65  >h = -1;.  pFile
c470: 2d 3e 70 55 6e 75 73 65 64 20 3d 20 30 3b 0a 7d  ->pUnused = 0;.}
c480: 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68  ../*.** Lower th
c490: 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
c4a0: 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  on file descript
c4b0: 6f 72 20 70 46 69 6c 65 20 74 6f 20 6c 6f 63 6b  or pFile to lock
c4c0: 74 79 70 65 2e 20 20 6c 6f 63 6b 74 79 70 65 0a  type.  locktype.
c4d0: 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65  ** must be eithe
c4e0: 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41  r NO_LOCK or SHA
c4f0: 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20  RED_LOCK..**.** 
c500: 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  If the locking l
c510: 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65  evel of the file
c520: 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61   descriptor is a
c530: 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c  lready at or bel
c540: 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73  ow.** the reques
c550: 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  ted locking leve
c560: 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  l, this routine 
c570: 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 0a  is a no-op..** .
c580: 2a 2a 20 49 66 20 68 61 6e 64 6c 65 4e 46 53 55  ** If handleNFSU
c590: 6e 6c 6f 63 6b 20 69 73 20 74 72 75 65 2c 20 74  nlock is true, t
c5a0: 68 65 6e 20 6f 6e 20 64 6f 77 6e 67 72 61 64 69  hen on downgradi
c5b0: 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45 5f  ng an EXCLUSIVE_
c5c0: 4c 4f 43 4b 20 74 6f 20 53 48 41 52 45 44 0a 2a  LOCK to SHARED.*
c5d0: 2a 20 74 68 65 20 62 79 74 65 20 72 61 6e 67 65  * the byte range
c5e0: 20 69 73 20 64 69 76 69 64 65 64 20 69 6e 74 6f   is divided into
c5f0: 20 32 20 70 61 72 74 73 20 61 6e 64 20 74 68 65   2 parts and the
c600: 20 66 69 72 73 74 20 70 61 72 74 20 69 73 20 75   first part is u
c610: 6e 6c 6f 63 6b 65 64 20 74 68 65 6e 0a 2a 2a 20  nlocked then.** 
c620: 73 65 74 20 74 6f 20 61 20 72 65 61 64 20 6c 6f  set to a read lo
c630: 63 6b 2c 20 74 68 65 6e 20 74 68 65 20 6f 74 68  ck, then the oth
c640: 65 72 20 70 61 72 74 20 69 73 20 73 69 6d 70 6c  er part is simpl
c650: 79 20 75 6e 6c 6f 63 6b 65 64 2e 20 20 54 68 69  y unlocked.  Thi
c660: 73 20 77 6f 72 6b 73 20 0a 2a 2a 20 61 72 6f 75  s works .** arou
c670: 6e 64 20 61 20 62 75 67 20 69 6e 20 42 53 44 20  nd a bug in BSD 
c680: 4e 46 53 20 6c 6f 63 6b 64 20 28 61 6c 73 6f 20  NFS lockd (also 
c690: 73 65 65 6e 20 6f 6e 20 4d 61 63 4f 53 58 20 31  seen on MacOSX 1
c6a0: 30 2e 33 2b 29 20 74 68 61 74 20 66 61 69 6c 73  0.3+) that fails
c6b0: 20 74 6f 20 0a 2a 2a 20 72 65 6d 6f 76 65 20 74   to .** remove t
c6c0: 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e  he write lock on
c6d0: 20 61 20 72 65 67 69 6f 6e 20 77 68 65 6e 20 61   a region when a
c6e0: 20 72 65 61 64 20 6c 6f 63 6b 20 69 73 20 73 65   read lock is se
c6f0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
c700: 20 5f 70 6f 73 69 78 55 6e 6c 6f 63 6b 28 73 71   _posixUnlock(sq
c710: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
c720: 69 6e 74 20 6c 6f 63 6b 74 79 70 65 2c 20 69 6e  int locktype, in
c730: 74 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63  t handleNFSUnloc
c740: 6b 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  k){.  unixFile *
c750: 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
c760: 65 2a 29 69 64 3b 0a 20 20 73 74 72 75 63 74 20  e*)id;.  struct 
c770: 75 6e 69 78 4c 6f 63 6b 49 6e 66 6f 20 2a 70 4c  unixLockInfo *pL
c780: 6f 63 6b 3b 0a 20 20 73 74 72 75 63 74 20 66 6c  ock;.  struct fl
c790: 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20  ock lock;.  int 
c7a0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
c7b0: 20 20 69 6e 74 20 68 3b 0a 20 20 69 6e 74 20 74    int h;.  int t
c7c0: 45 72 72 6e 6f 3b 20 20 20 20 20 20 20 20 20 20  Errno;          
c7d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
c7e0: 72 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 73  rror code from s
c7f0: 79 73 74 65 6d 20 63 61 6c 6c 20 65 72 72 6f 72  ystem call error
c800: 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  s */..  assert( 
c810: 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41  pFile );.  OSTRA
c820: 43 45 37 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20  CE7("UNLOCK  %d 
c830: 25 64 20 77 61 73 20 25 64 28 25 64 2c 25 64 29  %d was %d(%d,%d)
c840: 20 70 69 64 3d 25 64 20 28 75 6e 69 78 29 5c 6e   pid=%d (unix)\n
c850: 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63  ", pFile->h, loc
c860: 6b 74 79 70 65 2c 0a 20 20 20 20 20 20 70 46 69  ktype,.      pFi
c870: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 70 46  le->locktype, pF
c880: 69 6c 65 2d 3e 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b  ile->pLock->lock
c890: 74 79 70 65 2c 20 70 46 69 6c 65 2d 3e 70 4c 6f  type, pFile->pLo
c8a0: 63 6b 2d 3e 63 6e 74 2c 20 67 65 74 70 69 64 28  ck->cnt, getpid(
c8b0: 29 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6c  ));..  assert( l
c8c0: 6f 63 6b 74 79 70 65 3c 3d 53 48 41 52 45 44 5f  ocktype<=SHARED_
c8d0: 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70 46  LOCK );.  if( pF
c8e0: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3c 3d 6c  ile->locktype<=l
c8f0: 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 72  ocktype ){.    r
c900: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
c910: 0a 20 20 7d 0a 20 20 69 66 28 20 43 48 45 43 4b  .  }.  if( CHECK
c920: 5f 54 48 52 45 41 44 49 44 28 70 46 69 6c 65 29  _THREADID(pFile)
c930: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
c940: 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
c950: 54 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 45 6e 74  T;.  }.  unixEnt
c960: 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 68 20 3d  erMutex();.  h =
c970: 20 70 46 69 6c 65 2d 3e 68 3b 0a 20 20 70 4c 6f   pFile->h;.  pLo
c980: 63 6b 20 3d 20 70 46 69 6c 65 2d 3e 70 4c 6f 63  ck = pFile->pLoc
c990: 6b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 6f  k;.  assert( pLo
c9a0: 63 6b 2d 3e 63 6e 74 21 3d 30 20 29 3b 0a 20 20  ck->cnt!=0 );.  
c9b0: 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  if( pFile->lockt
c9c0: 79 70 65 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ype>SHARED_LOCK 
c9d0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
c9e0: 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d  Lock->locktype==
c9f0: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20  pFile->locktype 
ca00: 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49  );.    SimulateI
ca10: 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b  OErrorBenign(1);
ca20: 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  .    SimulateIOE
ca30: 72 72 6f 72 28 20 68 3d 28 2d 31 29 20 29 0a 20  rror( h=(-1) ). 
ca40: 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
ca50: 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 0a 23 69  orBenign(0);..#i
ca60: 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20  fndef NDEBUG.   
ca70: 20 2f 2a 20 57 68 65 6e 20 72 65 64 75 63 69 6e   /* When reducin
ca80: 67 20 61 20 6c 6f 63 6b 20 73 75 63 68 20 74 68  g a lock such th
ca90: 61 74 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  at other process
caa0: 65 73 20 63 61 6e 20 73 74 61 72 74 0a 20 20 20  es can start.   
cab0: 20 2a 2a 20 72 65 61 64 69 6e 67 20 74 68 65 20   ** reading the 
cac0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 67  database file ag
cad0: 61 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74  ain, make sure t
cae0: 68 61 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 74  hat the.    ** t
caf0: 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74  ransaction count
cb00: 65 72 20 77 61 73 20 75 70 64 61 74 65 64 20 69  er was updated i
cb10: 66 20 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68  f any part of th
cb20: 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a  e database.    *
cb30: 2a 20 66 69 6c 65 20 63 68 61 6e 67 65 64 2e 20  * file changed. 
cb40: 20 49 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   If the transact
cb50: 69 6f 6e 20 63 6f 75 6e 74 65 72 20 69 73 20 6e  ion counter is n
cb60: 6f 74 20 75 70 64 61 74 65 64 2c 0a 20 20 20 20  ot updated,.    
cb70: 2a 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74  ** other connect
cb80: 69 6f 6e 73 20 74 6f 20 74 68 65 20 73 61 6d 65  ions to the same
cb90: 20 66 69 6c 65 20 6d 69 67 68 74 20 6e 6f 74 20   file might not 
cba0: 72 65 61 6c 69 7a 65 20 74 68 61 74 0a 20 20 20  realize that.   
cbb0: 20 2a 2a 20 74 68 65 20 66 69 6c 65 20 68 61 73   ** the file has
cbc0: 20 63 68 61 6e 67 65 64 20 61 6e 64 20 68 65 6e   changed and hen
cbd0: 63 65 20 6d 69 67 68 74 20 6e 6f 74 20 6b 6e 6f  ce might not kno
cbe0: 77 20 74 6f 20 66 6c 75 73 68 20 74 68 65 69 72  w to flush their
cbf0: 0a 20 20 20 20 2a 2a 20 63 61 63 68 65 2e 20 20  .    ** cache.  
cc00: 54 68 65 20 75 73 65 20 6f 66 20 61 20 73 74 61  The use of a sta
cc10: 6c 65 20 63 61 63 68 65 20 63 61 6e 20 6c 65 61  le cache can lea
cc20: 64 20 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f  d to database co
cc30: 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f  rruption..    */
cc40: 0a 23 69 66 20 30 0a 20 20 20 20 61 73 73 65 72  .#if 0.    asser
cc50: 74 28 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d  t( pFile->inNorm
cc60: 61 6c 57 72 69 74 65 3d 3d 30 0a 20 20 20 20 20  alWrite==0.     
cc70: 20 20 20 20 7c 7c 20 70 46 69 6c 65 2d 3e 64 62      || pFile->db
cc80: 55 70 64 61 74 65 3d 3d 30 0a 20 20 20 20 20 20  Update==0.      
cc90: 20 20 20 7c 7c 20 70 46 69 6c 65 2d 3e 74 72 61     || pFile->tra
cca0: 6e 73 43 6e 74 72 43 68 6e 67 3d 3d 31 20 29 3b  nsCntrChng==1 );
ccb0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 46 69 6c  .#endif.    pFil
ccc0: 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65  e->inNormalWrite
ccd0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20   = 0;.#endif..  
cce0: 20 20 2f 2a 20 64 6f 77 6e 67 72 61 64 69 6e 67    /* downgrading
ccf0: 20 74 6f 20 61 20 73 68 61 72 65 64 20 6c 6f 63   to a shared loc
cd00: 6b 20 6f 6e 20 4e 46 53 20 69 6e 76 6f 6c 76 65  k on NFS involve
cd10: 73 20 63 6c 65 61 72 69 6e 67 20 74 68 65 20 77  s clearing the w
cd20: 72 69 74 65 20 6c 6f 63 6b 0a 20 20 20 20 2a 2a  rite lock.    **
cd30: 20 62 65 66 6f 72 65 20 65 73 74 61 62 6c 69 73   before establis
cd40: 68 69 6e 67 20 74 68 65 20 72 65 61 64 6c 6f 63  hing the readloc
cd50: 6b 20 2d 20 74 6f 20 61 76 6f 69 64 20 61 20 72  k - to avoid a r
cd60: 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 77 65  ace condition we
cd70: 20 64 6f 77 6e 67 72 61 64 65 0a 20 20 20 20 2a   downgrade.    *
cd80: 2a 20 74 68 65 20 6c 6f 63 6b 20 69 6e 20 32 20  * the lock in 2 
cd90: 62 6c 6f 63 6b 73 2c 20 73 6f 20 74 68 61 74 20  blocks, so that 
cda0: 70 61 72 74 20 6f 66 20 74 68 65 20 72 61 6e 67  part of the rang
cdb0: 65 20 77 69 6c 6c 20 62 65 20 63 6f 76 65 72 65  e will be covere
cdc0: 64 20 62 79 20 61 20 0a 20 20 20 20 2a 2a 20 77  d by a .    ** w
cdd0: 72 69 74 65 20 6c 6f 63 6b 20 75 6e 74 69 6c 20  rite lock until 
cde0: 74 68 65 20 72 65 73 74 20 69 73 20 63 6f 76 65  the rest is cove
cdf0: 72 65 64 20 62 79 20 61 20 72 65 61 64 20 6c 6f  red by a read lo
ce00: 63 6b 3a 0a 20 20 20 20 2a 2a 20 20 31 3a 20 20  ck:.    **  1:  
ce10: 20 5b 57 57 57 57 57 5d 0a 20 20 20 20 2a 2a 20   [WWWWW].    ** 
ce20: 20 32 3a 20 20 20 5b 2e 2e 2e 2e 57 5d 0a 20 20   2:   [....W].  
ce30: 20 20 2a 2a 20 20 33 3a 20 20 20 5b 52 52 52 52    **  3:   [RRRR
ce40: 57 5d 0a 20 20 20 20 2a 2a 20 20 34 3a 20 20 20  W].    **  4:   
ce50: 5b 52 52 52 52 2e 5d 0a 20 20 20 20 2a 2f 0a 20  [RRRR.].    */. 
ce60: 20 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d     if( locktype=
ce70: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  =SHARED_LOCK ){.
ce80: 20 20 20 20 20 20 69 66 28 20 68 61 6e 64 6c 65        if( handle
ce90: 4e 46 53 55 6e 6c 6f 63 6b 20 29 7b 0a 20 20 20  NFSUnlock ){.   
cea0: 20 20 20 20 20 6f 66 66 5f 74 20 64 69 76 53 69       off_t divSi
ceb0: 7a 65 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45  ze = SHARED_SIZE
cec0: 20 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 0a 20   - 1;.        . 
ced0: 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79         lock.l_ty
cee0: 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20  pe = F_UNLCK;.  
cef0: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65        lock.l_whe
cf00: 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a  nce = SEEK_SET;.
cf10: 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73          lock.l_s
cf20: 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49  tart = SHARED_FI
cf30: 52 53 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63  RST;.        loc
cf40: 6b 2e 6c 5f 6c 65 6e 20 3d 20 64 69 76 53 69 7a  k.l_len = divSiz
cf50: 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 66  e;.        if( f
cf60: 63 6e 74 6c 28 68 2c 20 46 5f 53 45 54 4c 4b 2c  cntl(h, F_SETLK,
cf70: 20 26 6c 6f 63 6b 29 3d 3d 28 2d 31 29 20 29 7b   &lock)==(-1) ){
cf80: 0a 20 20 20 20 20 20 20 20 20 20 74 45 72 72 6e  .          tErrn
cf90: 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
cfa0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
cfb0: 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
cfc0: 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49  ror(tErrno, SQLI
cfd0: 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29  TE_IOERR_UNLOCK)
cfe0: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
cff0: 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63  IS_LOCK_ERROR(rc
d000: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
d010: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
d020: 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20  o = tErrno;.    
d030: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
d040: 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63    goto end_unloc
d050: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
d060: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65       lock.l_type
d070: 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 20 20   = F_RDLCK;.    
d080: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63      lock.l_whenc
d090: 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20  e = SEEK_SET;.  
d0a0: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61        lock.l_sta
d0b0: 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53  rt = SHARED_FIRS
d0c0: 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e  T;.        lock.
d0d0: 6c 5f 6c 65 6e 20 3d 20 64 69 76 53 69 7a 65 3b  l_len = divSize;
d0e0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 66 63 6e  .        if( fcn
d0f0: 74 6c 28 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26  tl(h, F_SETLK, &
d100: 6c 6f 63 6b 29 3d 3d 28 2d 31 29 20 29 7b 0a 20  lock)==(-1) ){. 
d110: 20 20 20 20 20 20 20 20 20 74 45 72 72 6e 6f 20           tErrno 
d120: 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20  = errno;.       
d130: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72     rc = sqliteEr
d140: 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f  rorFromPosixErro
d150: 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45  r(tErrno, SQLITE
d160: 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 29 3b 0a  _IOERR_RDLOCK);.
d170: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 49 53            if( IS
d180: 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20  _LOCK_ERROR(rc) 
d190: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
d1a0: 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
d1b0: 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20  = tErrno;.      
d1c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
d1d0: 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b  goto end_unlock;
d1e0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
d1f0: 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d     lock.l_type =
d200: 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 20 20   F_UNLCK;.      
d210: 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20    lock.l_whence 
d220: 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20  = SEEK_SET;.    
d230: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74      lock.l_start
d240: 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b   = SHARED_FIRST+
d250: 64 69 76 53 69 7a 65 3b 0a 20 20 20 20 20 20 20  divSize;.       
d260: 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48   lock.l_len = SH
d270: 41 52 45 44 5f 53 49 5a 45 2d 64 69 76 53 69 7a  ARED_SIZE-divSiz
d280: 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 66  e;.        if( f
d290: 63 6e 74 6c 28 68 2c 20 46 5f 53 45 54 4c 4b 2c  cntl(h, F_SETLK,
d2a0: 20 26 6c 6f 63 6b 29 3d 3d 28 2d 31 29 20 29 7b   &lock)==(-1) ){
d2b0: 0a 20 20 20 20 20 20 20 20 20 20 74 45 72 72 6e  .          tErrn
d2c0: 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
d2d0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
d2e0: 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
d2f0: 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49  ror(tErrno, SQLI
d300: 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29  TE_IOERR_UNLOCK)
d310: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
d320: 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63  IS_LOCK_ERROR(rc
d330: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
d340: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
d350: 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20  o = tErrno;.    
d360: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
d370: 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63    goto end_unloc
d380: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
d390: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
d3a0: 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20    lock.l_type = 
d3b0: 46 5f 52 44 4c 43 4b 3b 0a 20 20 20 20 20 20 20  F_RDLCK;.       
d3c0: 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d   lock.l_whence =
d3d0: 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20   SEEK_SET;.     
d3e0: 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20     lock.l_start 
d3f0: 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a  = SHARED_FIRST;.
d400: 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c          lock.l_l
d410: 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45  en = SHARED_SIZE
d420: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 66 63  ;.        if( fc
d430: 6e 74 6c 28 68 2c 20 46 5f 53 45 54 4c 4b 2c 20  ntl(h, F_SETLK, 
d440: 26 6c 6f 63 6b 29 3d 3d 28 2d 31 29 20 29 7b 0a  &lock)==(-1) ){.
d450: 20 20 20 20 20 20 20 20 20 20 74 45 72 72 6e 6f            tErrno
d460: 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
d470: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45      rc = sqliteE
d480: 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
d490: 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54  or(tErrno, SQLIT
d4a0: 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 29 3b  E_IOERR_RDLOCK);
d4b0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 49  .          if( I
d4c0: 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29  S_LOCK_ERROR(rc)
d4d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
d4e0: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
d4f0: 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20   = tErrno;.     
d500: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
d510: 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b   goto end_unlock
d520: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
d530: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6c 6f    }.    }.    lo
d540: 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e  ck.l_type = F_UN
d550: 4c 43 4b 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  LCK;.    lock.l_
d560: 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45  whence = SEEK_SE
d570: 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74  T;.    lock.l_st
d580: 61 72 74 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59  art = PENDING_BY
d590: 54 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c  TE;.    lock.l_l
d5a0: 65 6e 20 3d 20 32 4c 3b 20 20 61 73 73 65 72 74  en = 2L;  assert
d5b0: 28 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2b 31  ( PENDING_BYTE+1
d5c0: 3d 3d 52 45 53 45 52 56 45 44 5f 42 59 54 45 20  ==RESERVED_BYTE 
d5d0: 29 3b 0a 20 20 20 20 69 66 28 20 66 63 6e 74 6c  );.    if( fcntl
d5e0: 28 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f  (h, F_SETLK, &lo
d5f0: 63 6b 29 21 3d 28 2d 31 29 20 29 7b 0a 20 20 20  ck)!=(-1) ){.   
d600: 20 20 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79     pLock->lockty
d610: 70 65 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b  pe = SHARED_LOCK
d620: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
d630: 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e     tErrno = errn
d640: 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  o;.      rc = sq
d650: 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73  liteErrorFromPos
d660: 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20  ixError(tErrno, 
d670: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c  SQLITE_IOERR_UNL
d680: 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20  OCK);.      if( 
d690: 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63  IS_LOCK_ERROR(rc
d6a0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69  ) ){.        pFi
d6b0: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
d6c0: 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a  tErrno;.      }.
d6d0: 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75        goto end_u
d6e0: 6e 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  nlock;.    }.  }
d6f0: 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d  .  if( locktype=
d700: 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  =NO_LOCK ){.    
d710: 73 74 72 75 63 74 20 75 6e 69 78 4f 70 65 6e 43  struct unixOpenC
d720: 6e 74 20 2a 70 4f 70 65 6e 3b 0a 0a 20 20 20 20  nt *pOpen;..    
d730: 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65  /* Decrement the
d740: 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 63 6f 75   shared lock cou
d750: 6e 74 65 72 2e 20 20 52 65 6c 65 61 73 65 20 74  nter.  Release t
d760: 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20 61 6e  he lock using an
d770: 0a 20 20 20 20 2a 2a 20 4f 53 20 63 61 6c 6c 20  .    ** OS call 
d780: 6f 6e 6c 79 20 77 68 65 6e 20 61 6c 6c 20 74 68  only when all th
d790: 72 65 61 64 73 20 69 6e 20 74 68 69 73 20 73 61  reads in this sa
d7a0: 6d 65 20 70 72 6f 63 65 73 73 20 68 61 76 65 20  me process have 
d7b0: 72 65 6c 65 61 73 65 64 0a 20 20 20 20 2a 2a 20  released.    ** 
d7c0: 74 68 65 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2f  the lock..    */
d7d0: 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 63 6e 74 2d  .    pLock->cnt-
d7e0: 2d 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f 63 6b  -;.    if( pLock
d7f0: 2d 3e 63 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ->cnt==0 ){.    
d800: 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20    lock.l_type = 
d810: 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 20 20 6c  F_UNLCK;.      l
d820: 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53  ock.l_whence = S
d830: 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20 6c  EEK_SET;.      l
d840: 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 6c 6f  ock.l_start = lo
d850: 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 30 4c 3b 0a 20  ck.l_len = 0L;. 
d860: 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45       SimulateIOE
d870: 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20  rrorBenign(1);. 
d880: 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45       SimulateIOE
d890: 72 72 6f 72 28 20 68 3d 28 2d 31 29 20 29 0a 20  rror( h=(-1) ). 
d8a0: 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45       SimulateIOE
d8b0: 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20  rrorBenign(0);. 
d8c0: 20 20 20 20 20 69 66 28 20 66 63 6e 74 6c 28 68       if( fcntl(h
d8d0: 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b  , F_SETLK, &lock
d8e0: 29 21 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20  )!=(-1) ){.     
d8f0: 20 20 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79     pLock->lockty
d900: 70 65 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20  pe = NO_LOCK;.  
d910: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
d920: 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e     tErrno = errn
d930: 6f 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  o;.        rc = 
d940: 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
d950: 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
d960: 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  , SQLITE_IOERR_U
d970: 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20  NLOCK);.        
d980: 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  if( IS_LOCK_ERRO
d990: 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20  R(rc) ){.       
d9a0: 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
d9b0: 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20  rno = tErrno;.  
d9c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
d9d0: 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 20  pLock->locktype 
d9e0: 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20  = NO_LOCK;.     
d9f0: 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79     pFile->lockty
da00: 70 65 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20  pe = NO_LOCK;.  
da10: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
da20: 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68   /* Decrement th
da30: 65 20 63 6f 75 6e 74 20 6f 66 20 6c 6f 63 6b 73  e count of locks
da40: 20 61 67 61 69 6e 73 74 20 74 68 69 73 20 73 61   against this sa
da50: 6d 65 20 66 69 6c 65 2e 20 20 57 68 65 6e 20 74  me file.  When t
da60: 68 65 0a 20 20 20 20 2a 2a 20 63 6f 75 6e 74 20  he.    ** count 
da70: 72 65 61 63 68 65 73 20 7a 65 72 6f 2c 20 63 6c  reaches zero, cl
da80: 6f 73 65 20 61 6e 79 20 6f 74 68 65 72 20 66 69  ose any other fi
da90: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 77  le descriptors w
daa0: 68 6f 73 65 20 63 6c 6f 73 65 0a 20 20 20 20 2a  hose close.    *
dab0: 2a 20 77 61 73 20 64 65 66 65 72 72 65 64 20 62  * was deferred b
dac0: 65 63 61 75 73 65 20 6f 66 20 6f 75 74 73 74 61  ecause of outsta
dad0: 6e 64 69 6e 67 20 6c 6f 63 6b 73 2e 0a 20 20 20  nding locks..   
dae0: 20 2a 2f 0a 20 20 20 20 70 4f 70 65 6e 20 3d 20   */.    pOpen = 
daf0: 70 46 69 6c 65 2d 3e 70 4f 70 65 6e 3b 0a 20 20  pFile->pOpen;.  
db00: 20 20 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 2d 2d    pOpen->nLock--
db10: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4f  ;.    assert( pO
db20: 70 65 6e 2d 3e 6e 4c 6f 63 6b 3e 3d 30 20 29 3b  pen->nLock>=0 );
db30: 0a 20 20 20 20 69 66 28 20 70 4f 70 65 6e 2d 3e  .    if( pOpen->
db40: 6e 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20  nLock==0 ){.    
db50: 20 20 69 6e 74 20 72 63 32 20 3d 20 63 6c 6f 73    int rc2 = clos
db60: 65 50 65 6e 64 69 6e 67 46 64 73 28 70 46 69 6c  ePendingFds(pFil
db70: 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
db80: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
db90: 20 20 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b         rc = rc2;
dba0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
dbb0: 20 7d 0a 09 0a 65 6e 64 5f 75 6e 6c 6f 63 6b 3a   }...end_unlock:
dbc0: 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65  .  unixLeaveMute
dbd0: 78 28 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  x();.  if( rc==S
dbe0: 51 4c 49 54 45 5f 4f 4b 20 29 20 70 46 69 6c 65  QLITE_OK ) pFile
dbf0: 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63  ->locktype = loc
dc00: 6b 74 79 70 65 3b 0a 20 20 72 65 74 75 72 6e 20  ktype;.  return 
dc10: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77  rc;.}../*.** Low
dc20: 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  er the locking l
dc30: 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73  evel on file des
dc40: 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f  criptor pFile to
dc50: 20 6c 6f 63 6b 74 79 70 65 2e 20 20 6c 6f 63 6b   locktype.  lock
dc60: 74 79 70 65 0a 2a 2a 20 6d 75 73 74 20 62 65 20  type.** must be 
dc70: 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f  either NO_LOCK o
dc80: 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a  r SHARED_LOCK..*
dc90: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b  *.** If the lock
dca0: 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65  ing level of the
dcb0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
dcc0: 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f   is already at o
dcd0: 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72  r below.** the r
dce0: 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67  equested locking
dcf0: 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75   level, this rou
dd00: 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
dd10: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
dd20: 6e 69 78 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65  nixUnlock(sqlite
dd30: 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
dd40: 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 72 65 74  locktype){.  ret
dd50: 75 72 6e 20 5f 70 6f 73 69 78 55 6e 6c 6f 63 6b  urn _posixUnlock
dd60: 28 69 64 2c 20 6c 6f 63 6b 74 79 70 65 2c 20 30  (id, locktype, 0
dd70: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
dd80: 20 66 75 6e 63 74 69 6f 6e 20 70 65 72 66 6f 72   function perfor
dd90: 6d 73 20 74 68 65 20 70 61 72 74 73 20 6f 66 20  ms the parts of 
dda0: 74 68 65 20 22 63 6c 6f 73 65 20 66 69 6c 65 22  the "close file"
ddb0: 20 6f 70 65 72 61 74 69 6f 6e 20 0a 2a 2a 20 63   operation .** c
ddc0: 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6c 6f 63  ommon to all loc
ddd0: 6b 69 6e 67 20 73 63 68 65 6d 65 73 2e 20 49 74  king schemes. It
dde0: 20 63 6c 6f 73 65 73 20 74 68 65 20 64 69 72 65   closes the dire
ddf0: 63 74 6f 72 79 20 61 6e 64 20 66 69 6c 65 0a 2a  ctory and file.*
de00: 2a 20 68 61 6e 64 6c 65 73 2c 20 69 66 20 74 68  * handles, if th
de10: 65 79 20 61 72 65 20 76 61 6c 69 64 2c 20 61 6e  ey are valid, an
de20: 64 20 73 65 74 73 20 61 6c 6c 20 66 69 65 6c 64  d sets all field
de30: 73 20 6f 66 20 74 68 65 20 75 6e 69 78 46 69 6c  s of the unixFil
de40: 65 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 74  e.** structure t
de50: 6f 20 30 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73  o 0..**.** It is
de60: 20 2a 6e 6f 74 2a 20 6e 65 63 65 73 73 61 72 79   *not* necessary
de70: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 75 74   to hold the mut
de80: 65 78 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  ex when this rou
de90: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 0a  tine is called,.
dea0: 2a 2a 20 65 76 65 6e 20 6f 6e 20 56 78 57 6f 72  ** even on VxWor
deb0: 6b 73 2e 20 20 41 20 6d 75 74 65 78 20 77 69 6c  ks.  A mutex wil
dec0: 6c 20 62 65 20 61 63 71 75 69 72 65 64 20 6f 6e  l be acquired on
ded0: 20 56 78 57 6f 72 6b 73 20 62 79 20 74 68 65 0a   VxWorks by the.
dee0: 2a 2a 20 76 78 77 6f 72 6b 73 52 65 6c 65 61 73  ** vxworksReleas
def0: 65 46 69 6c 65 49 64 28 29 20 72 6f 75 74 69 6e  eFileId() routin
df00: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
df10: 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 73   closeUnixFile(s
df20: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29  qlite3_file *id)
df30: 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  {.  unixFile *pF
df40: 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
df50: 29 69 64 3b 0a 20 20 69 66 28 20 70 46 69 6c 65  )id;.  if( pFile
df60: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 46 69 6c   ){.    if( pFil
df70: 65 2d 3e 64 69 72 66 64 3e 3d 30 20 29 7b 0a 20  e->dirfd>=0 ){. 
df80: 20 20 20 20 20 69 6e 74 20 65 72 72 20 3d 20 63       int err = c
df90: 6c 6f 73 65 28 70 46 69 6c 65 2d 3e 64 69 72 66  lose(pFile->dirf
dfa0: 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65 72  d);.      if( er
dfb0: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69  r ){.        pFi
dfc0: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
dfd0: 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 72  errno;.        r
dfe0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
dff0: 52 52 5f 44 49 52 5f 43 4c 4f 53 45 3b 0a 20 20  RR_DIR_CLOSE;.  
e000: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
e010: 20 20 20 70 46 69 6c 65 2d 3e 64 69 72 66 64 3d     pFile->dirfd=
e020: 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  -1;.      }.    
e030: 7d 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d  }.    if( pFile-
e040: 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  >h>=0 ){.      i
e050: 6e 74 20 65 72 72 20 3d 20 63 6c 6f 73 65 28 70  nt err = close(p
e060: 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 20 20 20 20  File->h);.      
e070: 69 66 28 20 65 72 72 20 29 7b 0a 20 20 20 20 20  if( err ){.     
e080: 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
e090: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
e0a0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
e0b0: 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53 45 3b 0a  TE_IOERR_CLOSE;.
e0c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69        }.    }.#i
e0d0: 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 20  f OS_VXWORKS.   
e0e0: 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 49 64 20   if( pFile->pId 
e0f0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 46 69  ){.      if( pFi
e100: 6c 65 2d 3e 69 73 44 65 6c 65 74 65 20 29 7b 0a  le->isDelete ){.
e110: 20 20 20 20 20 20 20 20 75 6e 6c 69 6e 6b 28 70          unlink(p
e120: 46 69 6c 65 2d 3e 70 49 64 2d 3e 7a 43 61 6e 6f  File->pId->zCano
e130: 6e 69 63 61 6c 4e 61 6d 65 29 3b 0a 20 20 20 20  nicalName);.    
e140: 20 20 7d 0a 20 20 20 20 20 20 76 78 77 6f 72 6b    }.      vxwork
e150: 73 52 65 6c 65 61 73 65 46 69 6c 65 49 64 28 70  sReleaseFileId(p
e160: 46 69 6c 65 2d 3e 70 49 64 29 3b 0a 20 20 20 20  File->pId);.    
e170: 20 20 70 46 69 6c 65 2d 3e 70 49 64 20 3d 20 30    pFile->pId = 0
e180: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
e190: 20 20 20 4f 53 54 52 41 43 45 32 28 22 43 4c 4f     OSTRACE2("CLO
e1a0: 53 45 20 20 20 25 2d 33 64 5c 6e 22 2c 20 70 46  SE   %-3d\n", pF
e1b0: 69 6c 65 2d 3e 68 29 3b 0a 20 20 20 20 4f 70 65  ile->h);.    Ope
e1c0: 6e 43 6f 75 6e 74 65 72 28 2d 31 29 3b 0a 20 20  nCounter(-1);.  
e1d0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
e1e0: 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64 29 3b 0a  File->pUnused);.
e1f0: 20 20 20 20 6d 65 6d 73 65 74 28 70 46 69 6c 65      memset(pFile
e200: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 75 6e 69 78  , 0, sizeof(unix
e210: 46 69 6c 65 29 29 3b 0a 20 20 7d 0a 20 20 72 65  File));.  }.  re
e220: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
e230: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
e240: 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
e250: 20 69 6e 74 20 75 6e 69 78 43 6c 6f 73 65 28 73   int unixClose(s
e260: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29  qlite3_file *id)
e270: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
e280: 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 69 64  ITE_OK;.  if( id
e290: 20 29 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65   ){.    unixFile
e2a0: 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
e2b0: 69 6c 65 20 2a 29 69 64 3b 0a 20 20 20 20 75 6e  ile *)id;.    un
e2c0: 69 78 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f  ixUnlock(id, NO_
e2d0: 4c 4f 43 4b 29 3b 0a 20 20 20 20 75 6e 69 78 45  LOCK);.    unixE
e2e0: 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20  nterMutex();.   
e2f0: 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 4f 70 65   if( pFile->pOpe
e300: 6e 20 26 26 20 70 46 69 6c 65 2d 3e 70 4f 70 65  n && pFile->pOpe
e310: 6e 2d 3e 6e 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  n->nLock ){.    
e320: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72    /* If there ar
e330: 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f  e outstanding lo
e340: 63 6b 73 2c 20 64 6f 20 6e 6f 74 20 61 63 74 75  cks, do not actu
e350: 61 6c 6c 79 20 63 6c 6f 73 65 20 74 68 65 20 66  ally close the f
e360: 69 6c 65 20 6a 75 73 74 0a 20 20 20 20 20 20 2a  ile just.      *
e370: 2a 20 79 65 74 20 62 65 63 61 75 73 65 20 74 68  * yet because th
e380: 61 74 20 77 6f 75 6c 64 20 63 6c 65 61 72 20 74  at would clear t
e390: 68 6f 73 65 20 6c 6f 63 6b 73 2e 20 20 49 6e 73  hose locks.  Ins
e3a0: 74 65 61 64 2c 20 61 64 64 20 74 68 65 20 66 69  tead, add the fi
e3b0: 6c 65 0a 20 20 20 20 20 20 2a 2a 20 64 65 73 63  le.      ** desc
e3c0: 72 69 70 74 6f 72 20 74 6f 20 70 4f 70 65 6e 2d  riptor to pOpen-
e3d0: 3e 70 55 6e 75 73 65 64 20 6c 69 73 74 2e 20 20  >pUnused list.  
e3e0: 49 74 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d  It will be autom
e3f0: 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65 64 20  atically closed 
e400: 0a 20 20 20 20 20 20 2a 2a 20 77 68 65 6e 20 74  .      ** when t
e410: 68 65 20 6c 61 73 74 20 6c 6f 63 6b 20 69 73 20  he last lock is 
e420: 63 6c 65 61 72 65 64 2e 0a 20 20 20 20 20 20 2a  cleared..      *
e430: 2f 0a 20 20 20 20 20 20 73 65 74 50 65 6e 64 69  /.      setPendi
e440: 6e 67 46 64 28 70 46 69 6c 65 29 3b 0a 20 20 20  ngFd(pFile);.   
e450: 20 7d 0a 20 20 20 20 72 65 6c 65 61 73 65 4c 6f   }.    releaseLo
e460: 63 6b 49 6e 66 6f 28 70 46 69 6c 65 2d 3e 70 4c  ckInfo(pFile->pL
e470: 6f 63 6b 29 3b 0a 20 20 20 20 72 65 6c 65 61 73  ock);.    releas
e480: 65 4f 70 65 6e 43 6e 74 28 70 46 69 6c 65 2d 3e  eOpenCnt(pFile->
e490: 70 4f 70 65 6e 29 3b 0a 20 20 20 20 72 63 20 3d  pOpen);.    rc =
e4a0: 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69   closeUnixFile(i
e4b0: 64 29 3b 0a 20 20 20 20 75 6e 69 78 4c 65 61 76  d);.    unixLeav
e4c0: 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a 20 20  eMutex();.  }.  
e4d0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
e4e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e  ************* En
e4f0: 64 20 6f 66 20 74 68 65 20 70 6f 73 69 78 20 61  d of the posix a
e500: 64 76 69 73 6f 72 79 20 6c 6f 63 6b 20 69 6d 70  dvisory lock imp
e510: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a  lementation ****
e520: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
e530: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e540: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e550: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e560: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e570: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f  ************/../
e580: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e590: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e5a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e5b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e5c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
e5d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e5e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e 6f  ************* No
e5f0: 2d 6f 70 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a  -op Locking ****
e600: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e610: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
e620: 2a 0a 2a 2a 20 4f 66 20 74 68 65 20 76 61 72 69  *.** Of the vari
e630: 6f 75 73 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c  ous locking impl
e640: 65 6d 65 6e 74 61 74 69 6f 6e 73 20 61 76 61 69  ementations avai
e650: 6c 61 62 6c 65 2c 20 74 68 69 73 20 69 73 20 62  lable, this is b
e660: 79 20 66 61 72 20 74 68 65 0a 2a 2a 20 73 69 6d  y far the.** sim
e670: 70 6c 65 73 74 3a 20 20 6c 6f 63 6b 69 6e 67 20  plest:  locking 
e680: 69 73 20 69 67 6e 6f 72 65 64 2e 20 20 4e 6f 20  is ignored.  No 
e690: 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20  attempt is made 
e6a0: 74 6f 20 6c 6f 63 6b 20 74 68 65 20 64 61 74 61  to lock the data
e6b0: 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 66 6f 72  base.** file for
e6c0: 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74   reading or writ
e6d0: 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ing..**.** This 
e6e0: 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 69 73 20  locking mode is 
e6f0: 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20  appropriate for 
e700: 75 73 65 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79  use on read-only
e710: 20 64 61 74 61 62 61 73 65 73 0a 2a 2a 20 28 65   databases.** (e
e720: 78 3a 20 64 61 74 61 62 61 73 65 73 20 74 68 61  x: databases tha
e730: 74 20 61 72 65 20 62 75 72 6e 65 64 20 69 6e 74  t are burned int
e740: 6f 20 43 44 2d 52 4f 4d 2c 20 66 6f 72 20 65 78  o CD-ROM, for ex
e750: 61 6d 70 6c 65 2e 29 20 20 49 74 20 63 61 6e 0a  ample.)  It can.
e760: 2a 2a 20 61 6c 73 6f 20 62 65 20 75 73 65 64 20  ** also be used 
e770: 69 66 20 74 68 65 20 61 70 70 6c 69 63 61 74 69  if the applicati
e780: 6f 6e 20 65 6d 70 6c 6f 79 73 20 73 6f 6d 65 20  on employs some 
e790: 65 78 74 65 72 6e 61 6c 20 6d 65 63 68 61 6e 69  external mechani
e7a0: 73 6d 20 74 6f 0a 2a 2a 20 70 72 65 76 65 6e 74  sm to.** prevent
e7b0: 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73 20 61 63   simultaneous ac
e7c0: 63 65 73 73 20 6f 66 20 74 68 65 20 73 61 6d 65  cess of the same
e7d0: 20 64 61 74 61 62 61 73 65 20 62 79 20 74 77 6f   database by two
e7e0: 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 64 61 74 61   or more.** data
e7f0: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  base connections
e800: 2e 20 20 42 75 74 20 74 68 65 72 65 20 69 73 20  .  But there is 
e810: 61 20 73 65 72 69 6f 75 73 20 72 69 73 6b 20 6f  a serious risk o
e820: 66 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f  f database.** co
e830: 72 72 75 70 74 69 6f 6e 20 69 66 20 74 68 69 73  rruption if this
e840: 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 69 73   locking mode is
e850: 20 75 73 65 64 20 69 6e 20 73 69 74 75 61 74 69   used in situati
e860: 6f 6e 73 20 77 68 65 72 65 20 6d 75 6c 74 69 70  ons where multip
e870: 6c 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63  le.** database c
e880: 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72 65 20 61  onnections are a
e890: 63 63 65 73 73 69 6e 67 20 74 68 65 20 73 61 6d  ccessing the sam
e8a0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
e8b0: 61 74 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 74  at the same.** t
e8c0: 69 6d 65 20 61 6e 64 20 6f 6e 65 20 6f 72 20 6d  ime and one or m
e8d0: 6f 72 65 20 6f 66 20 74 68 6f 73 65 20 63 6f 6e  ore of those con
e8e0: 6e 65 63 74 69 6f 6e 73 20 61 72 65 20 77 72 69  nections are wri
e8f0: 74 69 6e 67 2e 0a 2a 2f 0a 0a 73 74 61 74 69 63  ting..*/..static
e900: 20 69 6e 74 20 6e 6f 6c 6f 63 6b 43 68 65 63 6b   int nolockCheck
e910: 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c  ReservedLock(sql
e920: 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73  ite3_file *NotUs
e930: 65 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74  ed, int *pResOut
e940: 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
e950: 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
e960: 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 30 3b 0a    *pResOut = 0;.
e970: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
e980: 4f 4b 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74  OK;.}.static int
e990: 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69   nolockLock(sqli
e9a0: 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65  te3_file *NotUse
e9b0: 64 2c 20 69 6e 74 20 4e 6f 74 55 73 65 64 32 29  d, int NotUsed2)
e9c0: 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
e9d0: 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e  ETER2(NotUsed, N
e9e0: 6f 74 55 73 65 64 32 29 3b 0a 20 20 72 65 74 75  otUsed2);.  retu
e9f0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
ea00: 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63  static int noloc
ea10: 6b 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  kUnlock(sqlite3_
ea20: 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64 2c 20 69  file *NotUsed, i
ea30: 6e 74 20 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20  nt NotUsed2){.  
ea40: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
ea50: 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73  2(NotUsed, NotUs
ea60: 65 64 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  ed2);.  return S
ea70: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
ea80: 2a 2a 20 43 6c 6f 73 65 20 74 68 65 20 66 69 6c  ** Close the fil
ea90: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
eaa0: 20 6e 6f 6c 6f 63 6b 43 6c 6f 73 65 28 73 71 6c   nolockClose(sql
eab0: 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b  ite3_file *id) {
eac0: 0a 20 20 72 65 74 75 72 6e 20 63 6c 6f 73 65 55  .  return closeU
ead0: 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 7d 0a 0a  nixFile(id);.}..
eae0: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
eaf0: 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20  **** End of the 
eb00: 6e 6f 2d 6f 70 20 6c 6f 63 6b 20 69 6d 70 6c 65  no-op lock imple
eb10: 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a  mentation ******
eb20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
eb30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
eb40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
eb50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
eb60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
eb70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
eb80: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
eb90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
eba0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ebb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ebc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ebd0: 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
ebe0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e  ********** Begin
ebf0: 20 64 6f 74 2d 66 69 6c 65 20 4c 6f 63 6b 69 6e   dot-file Lockin
ec00: 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  g **************
ec10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ec20: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 6f 74 66 69  .**.** The dotfi
ec30: 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c 65  le locking imple
ec40: 6d 65 6e 74 61 74 69 6f 6e 20 75 73 65 73 20 74  mentation uses t
ec50: 68 65 20 65 78 69 73 74 61 6e 63 65 20 6f 66 20  he existance of 
ec60: 73 65 70 61 72 61 74 65 20 6c 6f 63 6b 0a 2a 2a  separate lock.**
ec70: 20 66 69 6c 65 73 20 69 6e 20 6f 72 64 65 72 20   files in order 
ec80: 74 6f 20 63 6f 6e 74 72 6f 6c 20 61 63 63 65 73  to control acces
ec90: 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  s to the databas
eca0: 65 2e 20 20 54 68 69 73 20 77 6f 72 6b 73 20 6f  e.  This works o
ecb0: 6e 20 6a 75 73 74 0a 2a 2a 20 61 62 6f 75 74 20  n just.** about 
ecc0: 65 76 65 72 79 20 66 69 6c 65 73 79 73 74 65 6d  every filesystem
ecd0: 20 69 6d 61 67 69 6e 61 62 6c 65 2e 20 20 42 75   imaginable.  Bu
ece0: 74 20 74 68 65 72 65 20 61 72 65 20 73 65 72 69  t there are seri
ecf0: 6f 75 73 20 64 6f 77 6e 73 69 64 65 73 3a 0a 2a  ous downsides:.*
ed00: 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20 54 68 65  *.**    (1)  The
ed10: 72 65 20 69 73 20 7a 65 72 6f 20 63 6f 6e 63 75  re is zero concu
ed20: 72 72 65 6e 63 79 2e 20 20 41 20 73 69 6e 67 6c  rrency.  A singl
ed30: 65 20 72 65 61 64 65 72 20 62 6c 6f 63 6b 73 20  e reader blocks 
ed40: 61 6c 6c 20 6f 74 68 65 72 0a 2a 2a 20 20 20 20  all other.**    
ed50: 20 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 73       connections
ed60: 20 66 72 6f 6d 20 72 65 61 64 69 6e 67 20 6f 72   from reading or
ed70: 20 77 72 69 74 69 6e 67 20 74 68 65 20 64 61 74   writing the dat
ed80: 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  abase..**.**    
ed90: 28 32 29 20 20 41 6e 20 61 70 70 6c 69 63 61 74  (2)  An applicat
eda0: 69 6f 6e 20 63 72 61 73 68 20 6f 72 20 70 6f 77  ion crash or pow
edb0: 65 72 20 6c 6f 73 73 20 63 61 6e 20 6c 65 61 76  er loss can leav
edc0: 65 20 73 74 61 6c 65 20 6c 6f 63 6b 20 66 69 6c  e stale lock fil
edd0: 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 69  es.**         si
ede0: 74 74 69 6e 67 20 61 72 6f 75 6e 64 20 74 68 61  tting around tha
edf0: 74 20 6e 65 65 64 20 74 6f 20 62 65 20 63 6c 65  t need to be cle
ee00: 61 72 65 64 20 6d 61 6e 75 61 6c 6c 79 2e 0a 2a  ared manually..*
ee10: 2a 0a 2a 2a 20 4e 65 76 65 72 74 68 65 6c 65 73  *.** Nevertheles
ee20: 73 2c 20 61 20 64 6f 74 6c 6f 63 6b 20 69 73 20  s, a dotlock is 
ee30: 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 6c  an appropriate l
ee40: 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 66 6f 72 20  ocking mode for 
ee50: 75 73 65 20 69 66 20 6e 6f 0a 2a 2a 20 6f 74 68  use if no.** oth
ee60: 65 72 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74  er locking strat
ee70: 65 67 79 20 69 73 20 61 76 61 69 6c 61 62 6c 65  egy is available
ee80: 2e 0a 2a 2a 0a 2a 2a 20 44 6f 74 66 69 6c 65 20  ..**.** Dotfile 
ee90: 6c 6f 63 6b 69 6e 67 20 77 6f 72 6b 73 20 62 79  locking works by
eea0: 20 63 72 65 61 74 69 6e 67 20 61 20 66 69 6c 65   creating a file
eeb0: 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 69 72   in the same dir
eec0: 65 63 74 6f 72 79 20 61 73 20 74 68 65 0a 2a 2a  ectory as the.**
eed0: 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 77 69   database and wi
eee0: 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65  th the same name
eef0: 20 62 75 74 20 77 69 74 68 20 61 20 22 2e 6c 6f   but with a ".lo
ef00: 63 6b 22 20 65 78 74 65 6e 73 69 6f 6e 20 61 64  ck" extension ad
ef10: 64 65 64 2e 0a 2a 2a 20 54 68 65 20 65 78 69 73  ded..** The exis
ef20: 74 61 6e 63 65 20 6f 66 20 61 20 6c 6f 63 6b 20  tance of a lock 
ef30: 66 69 6c 65 20 69 6d 70 6c 69 65 73 20 61 6e 20  file implies an 
ef40: 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
ef50: 20 41 6c 6c 20 6f 74 68 65 72 20 6c 6f 63 6b 0a   All other lock.
ef60: 2a 2a 20 74 79 70 65 73 20 28 53 48 41 52 45 44  ** types (SHARED
ef70: 2c 20 52 45 53 45 52 56 45 44 2c 20 50 45 4e 44  , RESERVED, PEND
ef80: 49 4e 47 29 20 61 72 65 20 6d 61 70 70 65 64 20  ING) are mapped 
ef90: 69 6e 74 6f 20 45 58 43 4c 55 53 49 56 45 2e 0a  into EXCLUSIVE..
efa0: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69  */../*.** The fi
efb0: 6c 65 20 73 75 66 66 69 78 20 61 64 64 65 64 20  le suffix added 
efc0: 74 6f 20 74 68 65 20 64 61 74 61 20 62 61 73 65  to the data base
efd0: 20 66 69 6c 65 6e 61 6d 65 20 69 6e 20 6f 72 64   filename in ord
efe0: 65 72 20 74 6f 20 63 72 65 61 74 65 20 74 68 65  er to create the
eff0: 0a 2a 2a 20 6c 6f 63 6b 20 66 69 6c 65 2e 0a 2a  .** lock file..*
f000: 2f 0a 23 64 65 66 69 6e 65 20 44 4f 54 4c 4f 43  /.#define DOTLOC
f010: 4b 5f 53 55 46 46 49 58 20 22 2e 6c 6f 63 6b 22  K_SUFFIX ".lock"
f020: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
f030: 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74  tine checks if t
f040: 68 65 72 65 20 69 73 20 61 20 52 45 53 45 52 56  here is a RESERV
f050: 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20  ED lock held on 
f060: 74 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a  the specified.**
f070: 20 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72   file by this or
f080: 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65   any other proce
f090: 73 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f  ss. If such a lo
f0a0: 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20  ck is held, set 
f0b0: 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61  *pResOut.** to a
f0c0: 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20   non-zero value 
f0d0: 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f  otherwise *pResO
f0e0: 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72  ut is set to zer
f0f0: 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 76  o.  The return v
f100: 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74  alue.** is set t
f110: 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65  o SQLITE_OK unle
f120: 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20  ss an I/O error 
f130: 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f  occurs during lo
f140: 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2a 0a  ck checking..**.
f150: 2a 2a 20 49 6e 20 64 6f 74 66 69 6c 65 20 6c 6f  ** In dotfile lo
f160: 63 6b 69 6e 67 2c 20 65 69 74 68 65 72 20 61 20  cking, either a 
f170: 6c 6f 63 6b 20 65 78 69 73 74 73 20 6f 72 20 69  lock exists or i
f180: 74 20 64 6f 65 73 20 6e 6f 74 2e 20 20 53 6f 20  t does not.  So 
f190: 69 6e 20 74 68 69 73 0a 2a 2a 20 76 61 72 69 61  in this.** varia
f1a0: 74 69 6f 6e 20 6f 66 20 43 68 65 63 6b 52 65 73  tion of CheckRes
f1b0: 65 72 76 65 64 4c 6f 63 6b 28 29 2c 20 2a 70 52  ervedLock(), *pR
f1c0: 65 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20  esOut is set to 
f1d0: 74 72 75 65 20 69 66 20 61 6e 79 20 6c 6f 63 6b  true if any lock
f1e0: 0a 2a 2a 20 69 73 20 68 65 6c 64 20 6f 6e 20 74  .** is held on t
f1f0: 68 65 20 66 69 6c 65 20 61 6e 64 20 66 61 6c 73  he file and fals
f200: 65 20 69 66 20 74 68 65 20 66 69 6c 65 20 69 73  e if the file is
f210: 20 75 6e 6c 6f 63 6b 65 64 2e 0a 2a 2f 0a 73 74   unlocked..*/.st
f220: 61 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b  atic int dotlock
f230: 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
f240: 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
f250: 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74  id, int *pResOut
f260: 29 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  ) {.  int rc = S
f270: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
f280: 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20  reserved = 0;.  
f290: 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
f2a0: 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
f2b0: 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ..  SimulateIOEr
f2c0: 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
f2d0: 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45  TE_IOERR_CHECKRE
f2e0: 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20  SERVEDLOCK; );. 
f2f0: 20 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c   .  assert( pFil
f300: 65 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  e );..  /* Check
f310: 20 69 66 20 61 20 74 68 72 65 61 64 20 69 6e 20   if a thread in 
f320: 74 68 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c  this process hol
f330: 64 73 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a  ds such a lock *
f340: 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c  /.  if( pFile->l
f350: 6f 63 6b 74 79 70 65 3e 53 48 41 52 45 44 5f 4c  ocktype>SHARED_L
f360: 4f 43 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 45 69  OCK ){.    /* Ei
f370: 74 68 65 72 20 74 68 69 73 20 63 6f 6e 6e 65 63  ther this connec
f380: 74 69 6f 6e 20 6f 72 20 73 6f 6d 65 20 6f 74 68  tion or some oth
f390: 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e  er connection in
f3a0: 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73   the same proces
f3b0: 73 0a 20 20 20 20 2a 2a 20 68 6f 6c 64 73 20 61  s.    ** holds a
f3c0: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c   lock on the fil
f3d0: 65 2e 20 20 4e 6f 20 6e 65 65 64 20 74 6f 20 63  e.  No need to c
f3e0: 68 65 63 6b 20 66 75 72 74 68 65 72 2e 20 2a 2f  heck further. */
f3f0: 0a 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20  .    reserved = 
f400: 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
f410: 2f 2a 20 54 68 65 20 6c 6f 63 6b 20 69 73 20 68  /* The lock is h
f420: 65 6c 64 20 69 66 20 61 6e 64 20 6f 6e 6c 79 20  eld if and only 
f430: 69 66 20 74 68 65 20 6c 6f 63 6b 66 69 6c 65 20  if the lockfile 
f440: 65 78 69 73 74 73 20 2a 2f 0a 20 20 20 20 63 6f  exists */.    co
f450: 6e 73 74 20 63 68 61 72 20 2a 7a 4c 6f 63 6b 46  nst char *zLockF
f460: 69 6c 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  ile = (const cha
f470: 72 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e  r*)pFile->lockin
f480: 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 72 65  gContext;.    re
f490: 73 65 72 76 65 64 20 3d 20 61 63 63 65 73 73 28  served = access(
f4a0: 7a 4c 6f 63 6b 46 69 6c 65 2c 20 30 29 3d 3d 30  zLockFile, 0)==0
f4b0: 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 34  ;.  }.  OSTRACE4
f4c0: 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25  ("TEST WR-LOCK %
f4d0: 64 20 25 64 20 25 64 20 28 64 6f 74 6c 6f 63 6b  d %d %d (dotlock
f4e0: 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
f4f0: 72 63 2c 20 72 65 73 65 72 76 65 64 29 3b 0a 20  rc, reserved);. 
f500: 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65   *pResOut = rese
f510: 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72  rved;.  return r
f520: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b  c;.}../*.** Lock
f530: 20 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74   the file with t
f540: 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65  he lock specifie
f550: 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 6c  d by parameter l
f560: 6f 63 6b 74 79 70 65 20 2d 20 6f 6e 65 0a 2a 2a  ocktype - one.**
f570: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
f580: 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29  g:.**.**     (1)
f590: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20   SHARED_LOCK.** 
f5a0: 20 20 20 20 28 32 29 20 52 45 53 45 52 56 45 44      (2) RESERVED
f5b0: 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29  _LOCK.**     (3)
f5c0: 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a   PENDING_LOCK.**
f5d0: 20 20 20 20 20 28 34 29 20 45 58 43 4c 55 53 49       (4) EXCLUSI
f5e0: 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f  VE_LOCK.**.** So
f5f0: 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71  metimes when req
f600: 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b  uesting one lock
f610: 20 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e   state, addition
f620: 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a  al lock states.*
f630: 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64 20 69  * are inserted i
f640: 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20  n between.  The 
f650: 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61  locking might fa
f660: 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65  il on one of the
f670: 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69   later.** transi
f680: 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68  tions leaving th
f690: 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66  e lock state dif
f6a0: 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74  ferent from what
f6b0: 20 69 74 20 73 74 61 72 74 65 64 20 62 75 74 0a   it started but.
f6c0: 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f  ** still short o
f6d0: 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65  f its goal.  The
f6e0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74   following chart
f6f0: 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77   shows the allow
f700: 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  ed.** transition
f710: 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74  s and the insert
f720: 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  ed intermediate 
f730: 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  states:.**.**   
f740: 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41   UNLOCKED -> SHA
f750: 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44  RED.**    SHARED
f760: 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20   -> RESERVED.** 
f770: 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45     SHARED -> (PE
f780: 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53  NDING) -> EXCLUS
f790: 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56  IVE.**    RESERV
f7a0: 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20  ED -> (PENDING) 
f7b0: 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  -> EXCLUSIVE.** 
f7c0: 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58     PENDING -> EX
f7d0: 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68  CLUSIVE.**.** Th
f7e0: 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
f7f0: 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20  only increase a 
f800: 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73  lock.  Use the s
f810: 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29  qlite3OsUnlock()
f820: 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c  .** routine to l
f830: 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c  ower a locking l
f840: 65 76 65 6c 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68  evel..**.** With
f850: 20 64 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67   dotfile locking
f860: 2c 20 77 65 20 72 65 61 6c 6c 79 20 6f 6e 6c 79  , we really only
f870: 20 73 75 70 70 6f 72 74 20 73 74 61 74 65 20 28   support state (
f880: 34 29 3a 20 45 58 43 4c 55 53 49 56 45 2e 0a 2a  4): EXCLUSIVE..*
f890: 2a 20 42 75 74 20 77 65 20 74 72 61 63 6b 20 74  * But we track t
f8a0: 68 65 20 6f 74 68 65 72 20 6c 6f 63 6b 69 6e 67  he other locking
f8b0: 20 6c 65 76 65 6c 73 20 69 6e 74 65 72 6e 61 6c   levels internal
f8c0: 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ly..*/.static in
f8d0: 74 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 28 73 71  t dotlockLock(sq
f8e0: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
f8f0: 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 20 7b 0a  int locktype) {.
f900: 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
f910: 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
f920: 64 3b 0a 20 20 69 6e 74 20 66 64 3b 0a 20 20 63  d;.  int fd;.  c
f930: 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d  har *zLockFile =
f940: 20 28 63 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e   (char *)pFile->
f950: 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  lockingContext;.
f960: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
f970: 45 5f 4f 4b 3b 0a 0a 0a 20 20 2f 2a 20 49 66 20  E_OK;...  /* If 
f980: 77 65 20 68 61 76 65 20 61 6e 79 20 6c 6f 63 6b  we have any lock
f990: 2c 20 74 68 65 6e 20 74 68 65 20 6c 6f 63 6b 20  , then the lock 
f9a0: 66 69 6c 65 20 61 6c 72 65 61 64 79 20 65 78 69  file already exi
f9b0: 73 74 73 2e 20 20 41 6c 6c 20 77 65 20 68 61 76  sts.  All we hav
f9c0: 65 0a 20 20 2a 2a 20 74 6f 20 64 6f 20 69 73 20  e.  ** to do is 
f9d0: 61 64 6a 75 73 74 20 6f 75 72 20 69 6e 74 65 72  adjust our inter
f9e0: 6e 61 6c 20 72 65 63 6f 72 64 20 6f 66 20 74 68  nal record of th
f9f0: 65 20 6c 6f 63 6b 20 6c 65 76 65 6c 2e 0a 20 20  e lock level..  
fa00: 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
fa10: 6c 6f 63 6b 74 79 70 65 20 3e 20 4e 4f 5f 4c 4f  locktype > NO_LO
fa20: 43 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  CK ){.    pFile-
fa30: 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b  >locktype = lock
fa40: 74 79 70 65 3b 0a 23 69 66 20 21 4f 53 5f 56 58  type;.#if !OS_VX
fa50: 57 4f 52 4b 53 0a 20 20 20 20 2f 2a 20 41 6c 77  WORKS.    /* Alw
fa60: 61 79 73 20 75 70 64 61 74 65 20 74 68 65 20 74  ays update the t
fa70: 69 6d 65 73 74 61 6d 70 20 6f 6e 20 74 68 65 20  imestamp on the 
fa80: 6f 6c 64 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20  old file */.    
fa90: 75 74 69 6d 65 73 28 7a 4c 6f 63 6b 46 69 6c 65  utimes(zLockFile
faa0: 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6e 64 69 66 0a  , NULL);.#endif.
fab0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
fac0: 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  E_OK;.  }.  .  /
fad0: 2a 20 67 72 61 62 20 61 6e 20 65 78 63 6c 75 73  * grab an exclus
fae0: 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 66 64  ive lock */.  fd
faf0: 20 3d 20 6f 70 65 6e 28 7a 4c 6f 63 6b 46 69 6c   = open(zLockFil
fb00: 65 2c 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f 43 52 45  e,O_RDONLY|O_CRE
fb10: 41 54 7c 4f 5f 45 58 43 4c 2c 30 36 30 30 29 3b  AT|O_EXCL,0600);
fb20: 0a 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20  .  if( fd<0 ){. 
fb30: 20 20 20 2f 2a 20 66 61 69 6c 65 64 20 74 6f 20     /* failed to 
fb40: 6f 70 65 6e 2f 63 72 65 61 74 65 20 74 68 65 20  open/create the 
fb50: 66 69 6c 65 2c 20 73 6f 6d 65 6f 6e 65 20 65 6c  file, someone el
fb60: 73 65 20 6d 61 79 20 68 61 76 65 20 73 74 6f 6c  se may have stol
fb70: 65 6e 20 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 20  en the lock */. 
fb80: 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20     int tErrno = 
fb90: 65 72 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20 45  errno;.    if( E
fba0: 45 58 49 53 54 20 3d 3d 20 74 45 72 72 6e 6f 20  EXIST == tErrno 
fbb0: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
fbc0: 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d  LITE_BUSY;.    }
fbd0: 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 72 63   else {.      rc
fbe0: 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
fbf0: 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
fc00: 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
fc10: 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69  R_LOCK);.      i
fc20: 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
fc30: 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20  (rc) ){.        
fc40: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
fc50: 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20   = tErrno;.     
fc60: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74   }.    }.    ret
fc70: 75 72 6e 20 72 63 3b 0a 20 20 7d 20 0a 20 20 69  urn rc;.  } .  i
fc80: 66 28 20 63 6c 6f 73 65 28 66 64 29 20 29 7b 0a  f( close(fd) ){.
fc90: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
fca0: 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
fcb0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
fcc0: 45 52 52 5f 43 4c 4f 53 45 3b 0a 20 20 7d 0a 20  ERR_CLOSE;.  }. 
fcd0: 20 0a 20 20 2f 2a 20 67 6f 74 20 69 74 2c 20 73   .  /* got it, s
fce0: 65 74 20 74 68 65 20 74 79 70 65 20 61 6e 64 20  et the type and 
fcf0: 72 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20 70  return ok */.  p
fd00: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d  File->locktype =
fd10: 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 72 65 74   locktype;.  ret
fd20: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
fd30: 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69   Lower the locki
fd40: 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65  ng level on file
fd50: 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c   descriptor pFil
fd60: 65 20 74 6f 20 6c 6f 63 6b 74 79 70 65 2e 20 20  e to locktype.  
fd70: 6c 6f 63 6b 74 79 70 65 0a 2a 2a 20 6d 75 73 74  locktype.** must
fd80: 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f   be either NO_LO
fd90: 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43  CK or SHARED_LOC
fda0: 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  K..**.** If the 
fdb0: 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66  locking level of
fdc0: 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
fdd0: 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20  ptor is already 
fde0: 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74  at or below.** t
fdf0: 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63  he requested loc
fe00: 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73  king level, this
fe10: 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
fe20: 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  -op..**.** When 
fe30: 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
fe40: 6c 20 72 65 61 63 68 65 73 20 4e 4f 5f 4c 4f 43  l reaches NO_LOC
fe50: 4b 2c 20 64 65 6c 65 74 65 20 74 68 65 20 6c 6f  K, delete the lo
fe60: 63 6b 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  ck file..*/.stat
fe70: 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 55 6e  ic int dotlockUn
fe80: 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  lock(sqlite3_fil
fe90: 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74  e *id, int lockt
fea0: 79 70 65 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c  ype) {.  unixFil
feb0: 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
fec0: 46 69 6c 65 2a 29 69 64 3b 0a 20 20 63 68 61 72  File*)id;.  char
fed0: 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63   *zLockFile = (c
fee0: 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63  har *)pFile->loc
fef0: 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 0a 20 20  kingContext;..  
ff00: 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
ff10: 0a 20 20 4f 53 54 52 41 43 45 35 28 22 55 4e 4c  .  OSTRACE5("UNL
ff20: 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73 20 25  OCK  %d %d was %
ff30: 64 20 70 69 64 3d 25 64 20 28 64 6f 74 6c 6f 63  d pid=%d (dotloc
ff40: 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  k)\n", pFile->h,
ff50: 20 6c 6f 63 6b 74 79 70 65 2c 0a 09 20 20 20 70   locktype,..   p
ff60: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20  File->locktype, 
ff70: 67 65 74 70 69 64 28 29 29 3b 0a 20 20 61 73 73  getpid());.  ass
ff80: 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 3c 3d 53  ert( locktype<=S
ff90: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
ffa0: 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20 70  .  /* no-op if p
ffb0: 6f 73 73 69 62 6c 65 20 2a 2f 0a 20 20 69 66 28  ossible */.  if(
ffc0: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
ffd0: 3d 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20  ==locktype ){.  
ffe0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
fff0: 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 6f  OK;.  }..  /* To
10000 20 64 6f 77 6e 67 72 61 64 65 20 74 6f 20 73 68   downgrade to sh
10010 61 72 65 64 2c 20 73 69 6d 70 6c 79 20 75 70 64  ared, simply upd
10020 61 74 65 20 6f 75 72 20 69 6e 74 65 72 6e 61 6c  ate our internal
10030 20 6e 6f 74 69 6f 6e 20 6f 66 20 74 68 65 0a 20   notion of the. 
10040 20 2a 2a 20 6c 6f 63 6b 20 73 74 61 74 65 2e 20   ** lock state. 
10050 20 4e 6f 20 6e 65 65 64 20 74 6f 20 6d 65 73 73   No need to mess
10060 20 77 69 74 68 20 74 68 65 20 66 69 6c 65 20 6f   with the file o
10070 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 69  n disk..  */.  i
10080 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41  f( locktype==SHA
10090 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RED_LOCK ){.    
100a0 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20  pFile->locktype 
100b0 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20  = SHARED_LOCK;. 
100c0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
100d0 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  _OK;.  }.  .  /*
100e0 20 54 6f 20 66 75 6c 6c 79 20 75 6e 6c 6f 63 6b   To fully unlock
100f0 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 64   the database, d
10100 65 6c 65 74 65 20 74 68 65 20 6c 6f 63 6b 20 66  elete the lock f
10110 69 6c 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ile */.  assert(
10120 20 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f   locktype==NO_LO
10130 43 4b 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69  CK );.  if( unli
10140 6e 6b 28 7a 4c 6f 63 6b 46 69 6c 65 29 20 29 7b  nk(zLockFile) ){
10150 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 30 3b  .    int rc = 0;
10160 0a 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20  .    int tErrno 
10170 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 69 66 28  = errno;.    if(
10180 20 45 4e 4f 45 4e 54 20 21 3d 20 74 45 72 72 6e   ENOENT != tErrn
10190 6f 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  o ){.      rc = 
101a0 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
101b0 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
101c0 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  , SQLITE_IOERR_U
101d0 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20 7d 0a 20 20  NLOCK);.    }.  
101e0 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52    if( IS_LOCK_ER
101f0 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20  ROR(rc) ){.     
10200 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
10210 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20  o = tErrno;.    
10220 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  }.    return rc;
10230 20 0a 20 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 6c   .  }.  pFile->l
10240 6f 63 6b 74 79 70 65 20 3d 20 4e 4f 5f 4c 4f 43  ocktype = NO_LOC
10250 4b 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  K;.  return SQLI
10260 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
10270 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 20 20 4d  Close a file.  M
10280 61 6b 65 20 73 75 72 65 20 74 68 65 20 6c 6f 63  ake sure the loc
10290 6b 20 68 61 73 20 62 65 65 6e 20 72 65 6c 65 61  k has been relea
102a0 73 65 64 20 62 65 66 6f 72 65 20 63 6c 6f 73 69  sed before closi
102b0 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
102c0 74 20 64 6f 74 6c 6f 63 6b 43 6c 6f 73 65 28 73  t dotlockClose(s
102d0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29  qlite3_file *id)
102e0 20 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69   {.  int rc;.  i
102f0 66 28 20 69 64 20 29 7b 0a 20 20 20 20 75 6e 69  f( id ){.    uni
10300 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
10310 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
10320 20 20 64 6f 74 6c 6f 63 6b 55 6e 6c 6f 63 6b 28    dotlockUnlock(
10330 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20  id, NO_LOCK);.  
10340 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
10350 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
10360 74 65 78 74 29 3b 0a 20 20 7d 0a 20 20 72 63 20  text);.  }.  rc 
10370 3d 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28  = closeUnixFile(
10380 69 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  id);.  return rc
10390 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ;.}./***********
103a0 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74  ******* End of t
103b0 68 65 20 64 6f 74 2d 66 69 6c 65 20 6c 6f 63 6b  he dot-file lock
103c0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
103d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
103e0 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
103f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10400 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10410 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10420 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10430 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **/../**********
10440 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10450 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10460 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10470 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10480 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
10490 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
104a0 42 65 67 69 6e 20 66 6c 6f 63 6b 20 4c 6f 63 6b  Begin flock Lock
104b0 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ing ************
104c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
104d0 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74  ****.**.** Use t
104e0 68 65 20 66 6c 6f 63 6b 28 29 20 73 79 73 74 65  he flock() syste
104f0 6d 20 63 61 6c 6c 20 74 6f 20 64 6f 20 66 69 6c  m call to do fil
10500 65 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a  e locking..**.**
10510 20 66 6c 6f 63 6b 28 29 20 6c 6f 63 6b 69 6e 67   flock() locking
10520 20 69 73 20 6c 69 6b 65 20 64 6f 74 2d 66 69 6c   is like dot-fil
10530 65 20 6c 6f 63 6b 69 6e 67 20 69 6e 20 74 68 61  e locking in tha
10540 74 20 74 68 65 20 76 61 72 69 6f 75 73 0a 2a 2a  t the various.**
10550 20 66 69 6e 65 2d 67 72 61 69 6e 20 6c 6f 63 6b   fine-grain lock
10560 69 6e 67 20 6c 65 76 65 6c 73 20 73 75 70 70 6f  ing levels suppo
10570 72 74 65 64 20 62 79 20 53 51 4c 69 74 65 20 61  rted by SQLite a
10580 72 65 20 63 6f 6c 6c 61 70 73 65 64 20 69 6e 74  re collapsed int
10590 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 65 78  o.** a single ex
105a0 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e 20 20 49  clusive lock.  I
105b0 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 53  n other words, S
105c0 48 41 52 45 44 2c 20 52 45 53 45 52 56 45 44 2c  HARED, RESERVED,
105d0 20 61 6e 64 0a 2a 2a 20 50 45 4e 44 49 4e 47 20   and.** PENDING 
105e0 6c 6f 63 6b 73 20 61 72 65 20 74 68 65 20 73 61  locks are the sa
105f0 6d 65 20 74 68 69 6e 67 20 61 73 20 61 6e 20 45  me thing as an E
10600 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20  XCLUSIVE lock.  
10610 53 51 4c 69 74 65 0a 2a 2a 20 73 74 69 6c 6c 20  SQLite.** still 
10620 77 6f 72 6b 73 20 77 68 65 6e 20 79 6f 75 20 64  works when you d
10630 6f 20 74 68 69 73 2c 20 62 75 74 20 63 6f 6e 63  o this, but conc
10640 75 72 72 65 6e 63 79 20 69 73 20 72 65 64 75 63  urrency is reduc
10650 65 64 20 73 69 6e 63 65 0a 2a 2a 20 6f 6e 6c 79  ed since.** only
10660 20 61 20 73 69 6e 67 6c 65 20 70 72 6f 63 65 73   a single proces
10670 73 20 63 61 6e 20 62 65 20 72 65 61 64 69 6e 67  s can be reading
10680 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 74   the database at
10690 20 61 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 4f   a time..**.** O
106a0 6d 69 74 20 74 68 69 73 20 73 65 63 74 69 6f 6e  mit this section
106b0 20 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   if SQLITE_ENABL
106c0 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
106d0 69 73 20 74 75 72 6e 65 64 20 6f 66 66 20 6f 72  is turned off or
106e0 20 69 66 0a 2a 2a 20 63 6f 6d 70 69 6c 69 6e 67   if.** compiling
106f0 20 66 6f 72 20 56 58 57 4f 52 4b 53 2e 0a 2a 2f   for VXWORKS..*/
10700 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
10710 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
10720 20 26 26 20 21 4f 53 5f 56 58 57 4f 52 4b 53 0a   && !OS_VXWORKS.
10730 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
10740 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74 68  ine checks if th
10750 65 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45  ere is a RESERVE
10760 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74  D lock held on t
10770 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20  he specified.** 
10780 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20  file by this or 
10790 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73  any other proces
107a0 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63  s. If such a loc
107b0 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a  k is held, set *
107c0 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20  pResOut.** to a 
107d0 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f  non-zero value o
107e0 74 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75  therwise *pResOu
107f0 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f  t is set to zero
10800 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  .  The return va
10810 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f  lue.** is set to
10820 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73   SQLITE_OK unles
10830 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f  s an I/O error o
10840 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63  ccurs during loc
10850 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73  k checking..*/.s
10860 74 61 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b 43  tatic int flockC
10870 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
10880 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
10890 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29  d, int *pResOut)
108a0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
108b0 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65  ITE_OK;.  int re
108c0 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e  served = 0;.  un
108d0 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
108e0 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
108f0 20 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72   .  SimulateIOEr
10900 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
10910 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45  TE_IOERR_CHECKRE
10920 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20  SERVEDLOCK; );. 
10930 20 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c   .  assert( pFil
10940 65 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 43 68 65  e );.  .  /* Che
10950 63 6b 20 69 66 20 61 20 74 68 72 65 61 64 20 69  ck if a thread i
10960 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 68  n this process h
10970 6f 6c 64 73 20 73 75 63 68 20 61 20 6c 6f 63 6b  olds such a lock
10980 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
10990 3e 6c 6f 63 6b 74 79 70 65 3e 53 48 41 52 45 44  >locktype>SHARED
109a0 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 73  _LOCK ){.    res
109b0 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20  erved = 1;.  }. 
109c0 20 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65   .  /* Otherwise
109d0 20 73 65 65 20 69 66 20 73 6f 6d 65 20 6f 74 68   see if some oth
109e0 65 72 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73  er process holds
109f0 20 69 74 2e 20 2a 2f 0a 20 20 69 66 28 20 21 72   it. */.  if( !r
10a00 65 73 65 72 76 65 64 20 29 7b 0a 20 20 20 20 2f  eserved ){.    /
10a10 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 67 65 74  * attempt to get
10a20 20 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20   the lock */.   
10a30 20 69 6e 74 20 6c 72 63 20 3d 20 66 6c 6f 63 6b   int lrc = flock
10a40 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f  (pFile->h, LOCK_
10a50 45 58 20 7c 20 4c 4f 43 4b 5f 4e 42 29 3b 0a 20  EX | LOCK_NB);. 
10a60 20 20 20 69 66 28 20 21 6c 72 63 20 29 7b 0a 20     if( !lrc ){. 
10a70 20 20 20 20 20 2f 2a 20 67 6f 74 20 74 68 65 20       /* got the 
10a80 6c 6f 63 6b 2c 20 75 6e 6c 6f 63 6b 20 69 74 20  lock, unlock it 
10a90 2a 2f 0a 20 20 20 20 20 20 6c 72 63 20 3d 20 66  */.      lrc = f
10aa0 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c  lock(pFile->h, L
10ab0 4f 43 4b 5f 55 4e 29 3b 0a 20 20 20 20 20 20 69  OCK_UN);.      i
10ac0 66 20 28 20 6c 72 63 20 29 20 7b 0a 20 20 20 20  f ( lrc ) {.    
10ad0 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d      int tErrno =
10ae0 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20   errno;.        
10af0 2f 2a 20 75 6e 6c 6f 63 6b 20 66 61 69 6c 65 64  /* unlock failed
10b00 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72 20 2a   with an error *
10b10 2f 0a 20 20 20 20 20 20 20 20 6c 72 63 20 3d 20  /.        lrc = 
10b20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
10b30 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
10b40 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  , SQLITE_IOERR_U
10b50 4e 4c 4f 43 4b 29 3b 20 0a 20 20 20 20 20 20 20  NLOCK); .       
10b60 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
10b70 4f 52 28 6c 72 63 29 20 29 7b 0a 20 20 20 20 20  OR(lrc) ){.     
10b80 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
10b90 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a  Errno = tErrno;.
10ba0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 6c            rc = l
10bb0 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
10bc0 20 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65      }.    } else
10bd0 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 45 72   {.      int tEr
10be0 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
10bf0 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b     reserved = 1;
10c00 0a 20 20 20 20 20 20 2f 2a 20 73 6f 6d 65 6f 6e  .      /* someon
10c10 65 20 65 6c 73 65 20 6d 69 67 68 74 20 68 61 76  e else might hav
10c20 65 20 69 74 20 72 65 73 65 72 76 65 64 20 2a 2f  e it reserved */
10c30 0a 20 20 20 20 20 20 6c 72 63 20 3d 20 73 71 6c  .      lrc = sql
10c40 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
10c50 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53  xError(tErrno, S
10c60 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b  QLITE_IOERR_LOCK
10c70 29 3b 20 0a 20 20 20 20 20 20 69 66 28 20 49 53  ); .      if( IS
10c80 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 29  _LOCK_ERROR(lrc)
10c90 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c   ){.        pFil
10ca0 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74  e->lastErrno = t
10cb0 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 72  Errno;.        r
10cc0 63 20 3d 20 6c 72 63 3b 0a 20 20 20 20 20 20 7d  c = lrc;.      }
10cd0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 4f 53 54  .    }.  }.  OST
10ce0 52 41 43 45 34 28 22 54 45 53 54 20 57 52 2d 4c  RACE4("TEST WR-L
10cf0 4f 43 4b 20 25 64 20 25 64 20 25 64 20 28 66 6c  OCK %d %d %d (fl
10d00 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  ock)\n", pFile->
10d10 68 2c 20 72 63 2c 20 72 65 73 65 72 76 65 64 29  h, rc, reserved)
10d20 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
10d30 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f  _IGNORE_FLOCK_LO
10d40 43 4b 5f 45 52 52 4f 52 53 0a 20 20 69 66 28 20  CK_ERRORS.  if( 
10d50 28 72 63 20 26 20 53 51 4c 49 54 45 5f 49 4f 45  (rc & SQLITE_IOE
10d60 52 52 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f  RR) == SQLITE_IO
10d70 45 52 52 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ERR ){.    rc = 
10d80 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 72  SQLITE_OK;.    r
10d90 65 73 65 72 76 65 64 3d 31 3b 0a 20 20 7d 0a 23  eserved=1;.  }.#
10da0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
10db0 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43  IGNORE_FLOCK_LOC
10dc0 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20 2a 70  K_ERRORS */.  *p
10dd0 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72 76 65  ResOut = reserve
10de0 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  d;.  return rc;.
10df0 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68  }../*.** Lock th
10e00 65 20 66 69 6c 65 20 77 69 74 68 20 74 68 65 20  e file with the 
10e10 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20 62  lock specified b
10e20 79 20 70 61 72 61 6d 65 74 65 72 20 6c 6f 63 6b  y parameter lock
10e30 74 79 70 65 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66  type - one.** of
10e40 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
10e50 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48  **.**     (1) SH
10e60 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  ARED_LOCK.**    
10e70 20 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f   (2) RESERVED_LO
10e80 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45  CK.**     (3) PE
10e90 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  NDING_LOCK.**   
10ea0 20 20 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f    (4) EXCLUSIVE_
10eb0 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74  LOCK.**.** Somet
10ec0 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65 73  imes when reques
10ed0 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74  ting one lock st
10ee0 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20  ate, additional 
10ef0 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61  lock states.** a
10f00 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62  re inserted in b
10f10 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63  etween.  The loc
10f20 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20  king might fail 
10f30 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61  on one of the la
10f40 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  ter.** transitio
10f50 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c  ns leaving the l
10f60 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66 65 72  ock state differ
10f70 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74  ent from what it
10f80 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20   started but.** 
10f90 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69  still short of i
10fa0 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f  ts goal.  The fo
10fb0 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68  llowing chart sh
10fc0 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a  ows the allowed.
10fd0 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61  ** transitions a
10fe0 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65 64 20  nd the inserted 
10ff0 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61  intermediate sta
11000 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e  tes:.**.**    UN
11010 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44  LOCKED -> SHARED
11020 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e  .**    SHARED ->
11030 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20   RESERVED.**    
11040 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49  SHARED -> (PENDI
11050 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  NG) -> EXCLUSIVE
11060 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44 20  .**    RESERVED 
11070 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20  -> (PENDING) -> 
11080 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20  EXCLUSIVE.**    
11090 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55  PENDING -> EXCLU
110a0 53 49 56 45 0a 2a 2a 0a 2a 2a 20 66 6c 6f 63 6b  SIVE.**.** flock
110b0 28 29 20 6f 6e 6c 79 20 72 65 61 6c 6c 79 20 73  () only really s
110c0 75 70 70 6f 72 74 20 45 58 43 4c 55 53 49 56 45  upport EXCLUSIVE
110d0 20 6c 6f 63 6b 73 2e 20 20 57 65 20 74 72 61 63   locks.  We trac
110e0 6b 20 69 6e 74 65 72 6d 65 64 69 61 74 65 0a 2a  k intermediate.*
110f0 2a 20 6c 6f 63 6b 20 73 74 61 74 65 73 20 69 6e  * lock states in
11100 20 74 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c   the sqlite3_fil
11110 65 20 73 74 72 75 63 74 75 72 65 2c 20 62 75 74  e structure, but
11120 20 61 6c 6c 20 6c 6f 63 6b 73 20 53 48 41 52 45   all locks SHARE
11130 44 20 6f 72 0a 2a 2a 20 61 62 6f 76 65 20 61 72  D or.** above ar
11140 65 20 72 65 61 6c 6c 79 20 45 58 43 4c 55 53 49  e really EXCLUSI
11150 56 45 20 6c 6f 63 6b 73 20 61 6e 64 20 65 78 63  VE locks and exc
11160 6c 75 64 65 20 61 6c 6c 20 6f 74 68 65 72 20 70  lude all other p
11170 72 6f 63 65 73 73 65 73 20 66 72 6f 6d 0a 2a 2a  rocesses from.**
11180 20 61 63 63 65 73 73 20 74 68 65 20 66 69 6c 65   access the file
11190 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
111a0 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69  tine will only i
111b0 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20  ncrease a lock. 
111c0 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33   Use the sqlite3
111d0 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f  OsUnlock().** ro
111e0 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61  utine to lower a
111f0 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a   locking level..
11200 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c  */.static int fl
11210 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  ockLock(sqlite3_
11220 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f  file *id, int lo
11230 63 6b 74 79 70 65 29 20 7b 0a 20 20 69 6e 74 20  cktype) {.  int 
11240 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
11250 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
11260 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
11270 64 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46  d;..  assert( pF
11280 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 69 66 20  ile );..  /* if 
11290 77 65 20 61 6c 72 65 61 64 79 20 68 61 76 65 20  we already have 
112a0 61 20 6c 6f 63 6b 2c 20 69 74 20 69 73 20 65 78  a lock, it is ex
112b0 63 6c 75 73 69 76 65 2e 20 20 0a 20 20 2a 2a 20  clusive.  .  ** 
112c0 4a 75 73 74 20 61 64 6a 75 73 74 20 6c 65 76 65  Just adjust leve
112d0 6c 20 61 6e 64 20 70 75 6e 74 20 6f 6e 20 6f 75  l and punt on ou
112e0 74 74 61 20 68 65 72 65 2e 20 2a 2f 0a 20 20 69  tta here. */.  i
112f0 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  f (pFile->lockty
11300 70 65 20 3e 20 4e 4f 5f 4c 4f 43 4b 29 20 7b 0a  pe > NO_LOCK) {.
11310 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74      pFile->lockt
11320 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a  ype = locktype;.
11330 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
11340 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  E_OK;.  }.  .  /
11350 2a 20 67 72 61 62 20 61 6e 20 65 78 63 6c 75 73  * grab an exclus
11360 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 0a 20  ive lock */.  . 
11370 20 69 66 20 28 66 6c 6f 63 6b 28 70 46 69 6c 65   if (flock(pFile
11380 2d 3e 68 2c 20 4c 4f 43 4b 5f 45 58 20 7c 20 4c  ->h, LOCK_EX | L
11390 4f 43 4b 5f 4e 42 29 29 20 7b 0a 20 20 20 20 69  OCK_NB)) {.    i
113a0 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  nt tErrno = errn
113b0 6f 3b 0a 20 20 20 20 2f 2a 20 64 69 64 6e 27 74  o;.    /* didn't
113c0 20 67 65 74 2c 20 6d 75 73 74 20 62 65 20 62 75   get, must be bu
113d0 73 79 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73  sy */.    rc = s
113e0 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
113f0 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c  sixError(tErrno,
11400 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f   SQLITE_IOERR_LO
11410 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 49 53 5f  CK);.    if( IS_
11420 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29  LOCK_ERROR(rc) )
11430 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  {.      pFile->l
11440 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e  astErrno = tErrn
11450 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 65 6c 73  o;.    }.  } els
11460 65 20 7b 0a 20 20 20 20 2f 2a 20 67 6f 74 20 69  e {.    /* got i
11470 74 2c 20 73 65 74 20 74 68 65 20 74 79 70 65 20  t, set the type 
11480 61 6e 64 20 72 65 74 75 72 6e 20 6f 6b 20 2a 2f  and return ok */
11490 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  .    pFile->lock
114a0 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b  type = locktype;
114b0 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 34 28  .  }.  OSTRACE4(
114c0 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 25  "LOCK    %d %s %
114d0 73 20 28 66 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46  s (flock)\n", pF
114e0 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70 65  ile->h, locktype
114f0 4e 61 6d 65 28 6c 6f 63 6b 74 79 70 65 29 2c 20  Name(locktype), 
11500 0a 20 20 20 20 20 20 20 20 20 20 20 72 63 3d 3d  .           rc==
11510 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22  SQLITE_OK ? "ok"
11520 20 3a 20 22 66 61 69 6c 65 64 22 29 3b 0a 23 69   : "failed");.#i
11530 66 64 65 66 20 53 51 4c 49 54 45 5f 49 47 4e 4f  fdef SQLITE_IGNO
11540 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52  RE_FLOCK_LOCK_ER
11550 52 4f 52 53 0a 20 20 69 66 28 20 28 72 63 20 26  RORS.  if( (rc &
11560 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 20 3d   SQLITE_IOERR) =
11570 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29  = SQLITE_IOERR )
11580 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
11590 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 23 65 6e 64  E_BUSY;.  }.#end
115a0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e  if /* SQLITE_IGN
115b0 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45  ORE_FLOCK_LOCK_E
115c0 52 52 4f 52 53 20 2a 2f 0a 20 20 72 65 74 75 72  RRORS */.  retur
115d0 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
115e0 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e  Lower the lockin
115f0 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20  g level on file 
11600 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65  descriptor pFile
11610 20 74 6f 20 6c 6f 63 6b 74 79 70 65 2e 20 20 6c   to locktype.  l
11620 6f 63 6b 74 79 70 65 0a 2a 2a 20 6d 75 73 74 20  ocktype.** must 
11630 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43  be either NO_LOC
11640 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b  K or SHARED_LOCK
11650 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c  ..**.** If the l
11660 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20  ocking level of 
11670 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
11680 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61  tor is already a
11690 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68  t or below.** th
116a0 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
116b0 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20  ing level, this 
116c0 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
116d0 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  op..*/.static in
116e0 74 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71  t flockUnlock(sq
116f0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
11700 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 20 7b 0a  int locktype) {.
11710 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
11720 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
11730 64 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20  d;.  .  assert( 
11740 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41  pFile );.  OSTRA
11750 43 45 35 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20  CE5("UNLOCK  %d 
11760 25 64 20 77 61 73 20 25 64 20 70 69 64 3d 25 64  %d was %d pid=%d
11770 20 28 66 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69   (flock)\n", pFi
11780 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70 65 2c  le->h, locktype,
11790 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c  .           pFil
117a0 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 67 65 74  e->locktype, get
117b0 70 69 64 28 29 29 3b 0a 20 20 61 73 73 65 72 74  pid());.  assert
117c0 28 20 6c 6f 63 6b 74 79 70 65 3c 3d 53 48 41 52  ( locktype<=SHAR
117d0 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20  ED_LOCK );.  .  
117e0 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20 70 6f 73 73  /* no-op if poss
117f0 69 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70 46  ible */.  if( pF
11800 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 6c  ile->locktype==l
11810 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 72  ocktype ){.    r
11820 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
11830 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 73 68 61  .  }.  .  /* sha
11840 72 65 64 20 63 61 6e 20 6a 75 73 74 20 62 65 20  red can just be 
11850 73 65 74 20 62 65 63 61 75 73 65 20 77 65 20 61  set because we a
11860 6c 77 61 79 73 20 68 61 76 65 20 61 6e 20 65 78  lways have an ex
11870 63 6c 75 73 69 76 65 20 2a 2f 0a 20 20 69 66 20  clusive */.  if 
11880 28 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45  (locktype==SHARE
11890 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46  D_LOCK) {.    pF
118a0 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20  ile->locktype = 
118b0 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20 72 65  locktype;.    re
118c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
118d0 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2c 20    }.  .  /* no, 
118e0 72 65 61 6c 6c 79 2c 20 75 6e 6c 6f 63 6b 2e 20  really, unlock. 
118f0 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 66 6c  */.  int rc = fl
11900 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f  ock(pFile->h, LO
11910 43 4b 5f 55 4e 29 3b 0a 20 20 69 66 20 28 72 63  CK_UN);.  if (rc
11920 29 20 7b 0a 20 20 20 20 69 6e 74 20 72 2c 20 74  ) {.    int r, t
11930 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
11940 20 20 20 72 20 3d 20 73 71 6c 69 74 65 45 72 72     r = sqliteErr
11950 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72  orFromPosixError
11960 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f  (tErrno, SQLITE_
11970 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20  IOERR_UNLOCK);. 
11980 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
11990 52 52 4f 52 28 72 29 20 29 7b 0a 20 20 20 20 20  RROR(r) ){.     
119a0 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
119b0 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20  o = tErrno;.    
119c0 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
119d0 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43  IGNORE_FLOCK_LOC
119e0 4b 5f 45 52 52 4f 52 53 0a 20 20 20 20 69 66 28  K_ERRORS.    if(
119f0 20 28 72 20 26 20 53 51 4c 49 54 45 5f 49 4f 45   (r & SQLITE_IOE
11a00 52 52 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f  RR) == SQLITE_IO
11a10 45 52 52 20 29 7b 0a 20 20 20 20 20 20 72 20 3d  ERR ){.      r =
11a20 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
11a30 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
11a40 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43  LITE_IGNORE_FLOC
11a50 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20 2a 2f  K_LOCK_ERRORS */
11a60 0a 20 20 20 20 0a 20 20 20 20 72 65 74 75 72 6e  .    .    return
11a70 20 72 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20   r;.  } else {. 
11a80 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79     pFile->lockty
11a90 70 65 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20  pe = NO_LOCK;.  
11aa0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
11ab0 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  OK;.  }.}../*.**
11ac0 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 2a   Close a file..*
11ad0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c 6f  /.static int flo
11ae0 63 6b 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f  ckClose(sqlite3_
11af0 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69 66  file *id) {.  if
11b00 28 20 69 64 20 29 7b 0a 20 20 20 20 66 6c 6f 63  ( id ){.    floc
11b10 6b 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c  kUnlock(id, NO_L
11b20 4f 43 4b 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  OCK);.  }.  retu
11b30 72 6e 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65  rn closeUnixFile
11b40 28 69 64 29 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20  (id);.}..#endif 
11b50 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
11b60 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26  _LOCKING_STYLE &
11b70 26 20 21 4f 53 5f 56 58 57 4f 52 4b 20 2a 2f 0a  & !OS_VXWORK */.
11b80 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
11b90 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65  ***** End of the
11ba0 20 66 6c 6f 63 6b 20 6c 6f 63 6b 20 69 6d 70 6c   flock lock impl
11bb0 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a  ementation *****
11bc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11bd0 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
11be0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11bf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11c00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11c10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
11c20 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
11c30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11c40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11c50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11c60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11c70 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
11c80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e  ********** Begin
11c90 20 4e 61 6d 65 64 20 53 65 6d 61 70 68 6f 72 65   Named Semaphore
11ca0 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a   Locking *******
11cb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11cc0 2a 0a 2a 2a 0a 2a 2a 20 4e 61 6d 65 64 20 73 65  *.**.** Named se
11cd0 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 20  maphore locking 
11ce0 69 73 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 65  is only supporte
11cf0 64 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a  d on VxWorks..**
11d00 0a 2a 2a 20 53 65 6d 61 70 68 6f 72 65 20 6c 6f  .** Semaphore lo
11d10 63 6b 69 6e 67 20 69 73 20 6c 69 6b 65 20 64 6f  cking is like do
11d20 74 2d 6c 6f 63 6b 20 61 6e 64 20 66 6c 6f 63 6b  t-lock and flock
11d30 20 69 6e 20 74 68 61 74 20 69 74 20 72 65 61 6c   in that it real
11d40 6c 79 20 6f 6e 6c 79 0a 2a 2a 20 73 75 70 70 6f  ly only.** suppo
11d50 72 74 73 20 45 58 43 4c 55 53 49 56 45 20 6c 6f  rts EXCLUSIVE lo
11d60 63 6b 69 6e 67 2e 20 20 4f 6e 6c 79 20 61 20 73  cking.  Only a s
11d70 69 6e 67 6c 65 20 70 72 6f 63 65 73 73 20 63 61  ingle process ca
11d80 6e 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 0a  n read or write.
11d90 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
11da0 66 69 6c 65 20 61 74 20 61 20 74 69 6d 65 2e 20  file at a time. 
11db0 20 54 68 69 73 20 72 65 64 75 63 65 73 20 70 6f   This reduces po
11dc0 74 65 6e 74 69 61 6c 20 63 6f 6e 63 75 72 72 65  tential concurre
11dd0 6e 63 79 2c 20 62 75 74 0a 2a 2a 20 6d 61 6b 65  ncy, but.** make
11de0 73 20 74 68 65 20 6c 6f 63 6b 20 69 6d 70 6c 65  s the lock imple
11df0 6d 65 6e 74 61 74 69 6f 6e 20 6d 75 63 68 20 65  mentation much e
11e00 61 73 69 65 72 2e 0a 2a 2f 0a 23 69 66 20 4f 53  asier..*/.#if OS
11e10 5f 56 58 57 4f 52 4b 53 0a 0a 2f 2a 0a 2a 2a 20  _VXWORKS../*.** 
11e20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65  This routine che
11e30 63 6b 73 20 69 66 20 74 68 65 72 65 20 69 73 20  cks if there is 
11e40 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
11e50 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63  held on the spec
11e60 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79  ified.** file by
11e70 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68   this or any oth
11e80 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73  er process. If s
11e90 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65  uch a lock is he
11ea0 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74  ld, set *pResOut
11eb0 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72  .** to a non-zer
11ec0 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73  o value otherwis
11ed0 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65  e *pResOut is se
11ee0 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20  t to zero.  The 
11ef0 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20  return value.** 
11f00 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45  is set to SQLITE
11f10 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f  _OK unless an I/
11f20 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64  O error occurs d
11f30 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b  uring lock check
11f40 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ing..*/.static i
11f50 6e 74 20 73 65 6d 43 68 65 63 6b 52 65 73 65 72  nt semCheckReser
11f60 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  vedLock(sqlite3_
11f70 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70  file *id, int *p
11f80 52 65 73 4f 75 74 29 20 7b 0a 20 20 69 6e 74 20  ResOut) {.  int 
11f90 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
11fa0 20 20 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d    int reserved =
11fb0 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a   0;.  unixFile *
11fc0 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
11fd0 65 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61  e*)id;..  Simula
11fe0 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72  teIOError( retur
11ff0 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43  n SQLITE_IOERR_C
12000 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b  HECKRESERVEDLOCK
12010 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73 65 72 74  ; );.  .  assert
12020 28 20 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a  ( pFile );..  /*
12030 20 43 68 65 63 6b 20 69 66 20 61 20 74 68 72 65   Check if a thre
12040 61 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65  ad in this proce
12050 73 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20  ss holds such a 
12060 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46  lock */.  if( pF
12070 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 53 48  ile->locktype>SH
12080 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
12090 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20   reserved = 1;. 
120a0 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74 68 65 72   }.  .  /* Other
120b0 77 69 73 65 20 73 65 65 20 69 66 20 73 6f 6d 65  wise see if some
120c0 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 68   other process h
120d0 6f 6c 64 73 20 69 74 2e 20 2a 2f 0a 20 20 69 66  olds it. */.  if
120e0 28 20 21 72 65 73 65 72 76 65 64 20 29 7b 0a 20  ( !reserved ){. 
120f0 20 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d 20 3d     sem_t *pSem =
12100 20 70 46 69 6c 65 2d 3e 70 4f 70 65 6e 2d 3e 70   pFile->pOpen->p
12110 53 65 6d 3b 0a 20 20 20 20 73 74 72 75 63 74 20  Sem;.    struct 
12120 73 74 61 74 20 73 74 61 74 42 75 66 3b 0a 0a 20  stat statBuf;.. 
12130 20 20 20 69 66 28 20 73 65 6d 5f 74 72 79 77 61     if( sem_trywa
12140 69 74 28 70 53 65 6d 29 3d 3d 2d 31 20 29 7b 0a  it(pSem)==-1 ){.
12150 20 20 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f        int tErrno
12160 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
12170 69 66 28 20 45 41 47 41 49 4e 20 21 3d 20 74 45  if( EAGAIN != tE
12180 72 72 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20  rrno ){.        
12190 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72  rc = sqliteError
121a0 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74  FromPosixError(t
121b0 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f  Errno, SQLITE_IO
121c0 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45  ERR_CHECKRESERVE
121d0 44 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20  DLOCK);.        
121e0 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
121f0 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20   = tErrno;.     
12200 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
12210 20 20 2f 2a 20 73 6f 6d 65 6f 6e 65 20 65 6c 73    /* someone els
12220 65 20 68 61 73 20 74 68 65 20 6c 6f 63 6b 20 77  e has the lock w
12230 68 65 6e 20 77 65 20 61 72 65 20 69 6e 20 4e 4f  hen we are in NO
12240 5f 4c 4f 43 4b 20 2a 2f 0a 20 20 20 20 20 20 20  _LOCK */.       
12250 20 72 65 73 65 72 76 65 64 20 3d 20 28 70 46 69   reserved = (pFi
12260 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3c 20 53  le->locktype < S
12270 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20  HARED_LOCK);.   
12280 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
12290 20 20 20 20 20 20 2f 2a 20 77 65 20 63 6f 75 6c        /* we coul
122a0 64 20 68 61 76 65 20 69 74 20 69 66 20 77 65 20  d have it if we 
122b0 77 61 6e 74 20 69 74 20 2a 2f 0a 20 20 20 20 20  want it */.     
122c0 20 73 65 6d 5f 70 6f 73 74 28 70 53 65 6d 29 3b   sem_post(pSem);
122d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 4f 53 54  .    }.  }.  OST
122e0 52 41 43 45 34 28 22 54 45 53 54 20 57 52 2d 4c  RACE4("TEST WR-L
122f0 4f 43 4b 20 25 64 20 25 64 20 25 64 20 28 73 65  OCK %d %d %d (se
12300 6d 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  m)\n", pFile->h,
12310 20 72 63 2c 20 72 65 73 65 72 76 65 64 29 3b 0a   rc, reserved);.
12320 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65  .  *pResOut = re
12330 73 65 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e  served;.  return
12340 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f   rc;.}../*.** Lo
12350 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74 68  ck the file with
12360 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66   the lock specif
12370 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72  ied by parameter
12380 20 6c 6f 63 6b 74 79 70 65 20 2d 20 6f 6e 65 0a   locktype - one.
12390 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ** of the follow
123a0 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28  ing:.**.**     (
123b0 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a  1) SHARED_LOCK.*
123c0 2a 20 20 20 20 20 28 32 29 20 52 45 53 45 52 56  *     (2) RESERV
123d0 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  ED_LOCK.**     (
123e0 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a  3) PENDING_LOCK.
123f0 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c 55  **     (4) EXCLU
12400 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20  SIVE_LOCK.**.** 
12410 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72  Sometimes when r
12420 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f  equesting one lo
12430 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74 69  ck state, additi
12440 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73  onal lock states
12450 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64  .** are inserted
12460 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68   in between.  Th
12470 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20  e locking might 
12480 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74  fail on one of t
12490 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e  he later.** tran
124a0 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20  sitions leaving 
124b0 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64  the lock state d
124c0 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68  ifferent from wh
124d0 61 74 20 69 74 20 73 74 61 72 74 65 64 20 62 75  at it started bu
124e0 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74  t.** still short
124f0 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54   of its goal.  T
12500 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61  he following cha
12510 72 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c  rt shows the all
12520 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69  owed.** transiti
12530 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65  ons and the inse
12540 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74  rted intermediat
12550 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20  e states:.**.** 
12560 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53     UNLOCKED -> S
12570 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52  HARED.**    SHAR
12580 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a  ED -> RESERVED.*
12590 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28  *    SHARED -> (
125a0 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c  PENDING) -> EXCL
125b0 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45  USIVE.**    RESE
125c0 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47  RVED -> (PENDING
125d0 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  ) -> EXCLUSIVE.*
125e0 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20  *    PENDING -> 
125f0 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20  EXCLUSIVE.**.** 
12600 53 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 73 20  Semaphore locks 
12610 6f 6e 6c 79 20 72 65 61 6c 6c 79 20 73 75 70 70  only really supp
12620 6f 72 74 20 45 58 43 4c 55 53 49 56 45 20 6c 6f  ort EXCLUSIVE lo
12630 63 6b 73 2e 20 20 57 65 20 74 72 61 63 6b 20 69  cks.  We track i
12640 6e 74 65 72 6d 65 64 69 61 74 65 0a 2a 2a 20 6c  ntermediate.** l
12650 6f 63 6b 20 73 74 61 74 65 73 20 69 6e 20 74 68  ock states in th
12660 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 73  e sqlite3_file s
12670 74 72 75 63 74 75 72 65 2c 20 62 75 74 20 61 6c  tructure, but al
12680 6c 20 6c 6f 63 6b 73 20 53 48 41 52 45 44 20 6f  l locks SHARED o
12690 72 0a 2a 2a 20 61 62 6f 76 65 20 61 72 65 20 72  r.** above are r
126a0 65 61 6c 6c 79 20 45 58 43 4c 55 53 49 56 45 20  eally EXCLUSIVE 
126b0 6c 6f 63 6b 73 20 61 6e 64 20 65 78 63 6c 75 64  locks and exclud
126c0 65 20 61 6c 6c 20 6f 74 68 65 72 20 70 72 6f 63  e all other proc
126d0 65 73 73 65 73 20 66 72 6f 6d 0a 2a 2a 20 61 63  esses from.** ac
126e0 63 65 73 73 20 74 68 65 20 66 69 6c 65 2e 0a 2a  cess the file..*
126f0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
12700 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72  e will only incr
12710 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73  ease a lock.  Us
12720 65 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55  e the sqlite3OsU
12730 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69  nlock().** routi
12740 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f  ne to lower a lo
12750 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a  cking level..*/.
12760 73 74 61 74 69 63 20 69 6e 74 20 73 65 6d 4c 6f  static int semLo
12770 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
12780 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70  *id, int locktyp
12790 65 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  e) {.  unixFile 
127a0 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
127b0 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20 66 64  le*)id;.  int fd
127c0 3b 0a 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d 20  ;.  sem_t *pSem 
127d0 3d 20 70 46 69 6c 65 2d 3e 70 4f 70 65 6e 2d 3e  = pFile->pOpen->
127e0 70 53 65 6d 3b 0a 20 20 69 6e 74 20 72 63 20 3d  pSem;.  int rc =
127f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f   SQLITE_OK;..  /
12800 2a 20 69 66 20 77 65 20 61 6c 72 65 61 64 79 20  * if we already 
12810 68 61 76 65 20 61 20 6c 6f 63 6b 2c 20 69 74 20  have a lock, it 
12820 69 73 20 65 78 63 6c 75 73 69 76 65 2e 20 20 0a  is exclusive.  .
12830 20 20 2a 2a 20 4a 75 73 74 20 61 64 6a 75 73 74    ** Just adjust
12840 20 6c 65 76 65 6c 20 61 6e 64 20 70 75 6e 74 20   level and punt 
12850 6f 6e 20 6f 75 74 74 61 20 68 65 72 65 2e 20 2a  on outta here. *
12860 2f 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c  /.  if (pFile->l
12870 6f 63 6b 74 79 70 65 20 3e 20 4e 4f 5f 4c 4f 43  ocktype > NO_LOC
12880 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  K) {.    pFile->
12890 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74  locktype = lockt
128a0 79 70 65 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  ype;.    rc = SQ
128b0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 67 6f 74  LITE_OK;.    got
128c0 6f 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a  o sem_end_lock;.
128d0 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 6c 6f 63 6b    }.  .  /* lock
128e0 20 73 65 6d 61 70 68 6f 72 65 20 6e 6f 77 20 62   semaphore now b
128f0 75 74 20 62 61 69 6c 20 6f 75 74 20 77 68 65 6e  ut bail out when
12900 20 61 6c 72 65 61 64 79 20 6c 6f 63 6b 65 64 2e   already locked.
12910 20 2a 2f 0a 20 20 69 66 28 20 73 65 6d 5f 74 72   */.  if( sem_tr
12920 79 77 61 69 74 28 70 53 65 6d 29 3d 3d 2d 31 20  ywait(pSem)==-1 
12930 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
12940 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 67 6f 74  TE_BUSY;.    got
12950 6f 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a  o sem_end_lock;.
12960 20 20 7d 0a 0a 20 20 2f 2a 20 67 6f 74 20 69 74    }..  /* got it
12970 2c 20 73 65 74 20 74 68 65 20 74 79 70 65 20 61  , set the type a
12980 6e 64 20 72 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a  nd return ok */.
12990 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70    pFile->locktyp
129a0 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 0a 20  e = locktype;.. 
129b0 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20  sem_end_lock:.  
129c0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
129d0 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f  .** Lower the lo
129e0 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66  cking level on f
129f0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 70  ile descriptor p
12a00 46 69 6c 65 20 74 6f 20 6c 6f 63 6b 74 79 70 65  File to locktype
12a10 2e 20 20 6c 6f 63 6b 74 79 70 65 0a 2a 2a 20 6d  .  locktype.** m
12a20 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f  ust be either NO
12a30 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f  _LOCK or SHARED_
12a40 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  LOCK..**.** If t
12a50 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
12a60 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73   of the file des
12a70 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61  criptor is alrea
12a80 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a  dy at or below.*
12a90 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  * the requested 
12aa0 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74  locking level, t
12ab0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
12ac0 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
12ad0 63 20 69 6e 74 20 73 65 6d 55 6e 6c 6f 63 6b 28  c int semUnlock(
12ae0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
12af0 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 20  , int locktype) 
12b00 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  {.  unixFile *pF
12b10 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
12b20 29 69 64 3b 0a 20 20 73 65 6d 5f 74 20 2a 70 53  )id;.  sem_t *pS
12b30 65 6d 20 3d 20 70 46 69 6c 65 2d 3e 70 4f 70 65  em = pFile->pOpe
12b40 6e 2d 3e 70 53 65 6d 3b 0a 0a 20 20 61 73 73 65  n->pSem;..  asse
12b50 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 61  rt( pFile );.  a
12b60 73 73 65 72 74 28 20 70 53 65 6d 20 29 3b 0a 20  ssert( pSem );. 
12b70 20 4f 53 54 52 41 43 45 35 28 22 55 4e 4c 4f 43   OSTRACE5("UNLOC
12b80 4b 20 20 25 64 20 25 64 20 77 61 73 20 25 64 20  K  %d %d was %d 
12b90 70 69 64 3d 25 64 20 28 73 65 6d 29 5c 6e 22 2c  pid=%d (sem)\n",
12ba0 20 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74   pFile->h, lockt
12bb0 79 70 65 2c 0a 09 20 20 20 70 46 69 6c 65 2d 3e  ype,..   pFile->
12bc0 6c 6f 63 6b 74 79 70 65 2c 20 67 65 74 70 69 64  locktype, getpid
12bd0 28 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6c  ());.  assert( l
12be0 6f 63 6b 74 79 70 65 3c 3d 53 48 41 52 45 44 5f  ocktype<=SHARED_
12bf0 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20  LOCK );.  .  /* 
12c00 6e 6f 2d 6f 70 20 69 66 20 70 6f 73 73 69 62 6c  no-op if possibl
12c10 65 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65  e */.  if( pFile
12c20 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 6c 6f 63 6b  ->locktype==lock
12c30 74 79 70 65 20 29 7b 0a 20 20 20 20 72 65 74 75  type ){.    retu
12c40 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
12c50 7d 0a 20 20 0a 20 20 2f 2a 20 73 68 61 72 65 64  }.  .  /* shared
12c60 20 63 61 6e 20 6a 75 73 74 20 62 65 20 73 65 74   can just be set
12c70 20 62 65 63 61 75 73 65 20 77 65 20 61 6c 77 61   because we alwa
12c80 79 73 20 68 61 76 65 20 61 6e 20 65 78 63 6c 75  ys have an exclu
12c90 73 69 76 65 20 2a 2f 0a 20 20 69 66 20 28 6c 6f  sive */.  if (lo
12ca0 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c  cktype==SHARED_L
12cb0 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65  OCK) {.    pFile
12cc0 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63  ->locktype = loc
12cd0 6b 74 79 70 65 3b 0a 20 20 20 20 72 65 74 75 72  ktype;.    retur
12ce0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
12cf0 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2c 20 72 65 61  .  .  /* no, rea
12d00 6c 6c 79 20 75 6e 6c 6f 63 6b 2e 20 2a 2f 0a 20  lly unlock. */. 
12d10 20 69 66 20 28 20 73 65 6d 5f 70 6f 73 74 28 70   if ( sem_post(p
12d20 53 65 6d 29 3d 3d 2d 31 20 29 20 7b 0a 20 20 20  Sem)==-1 ) {.   
12d30 20 69 6e 74 20 72 63 2c 20 74 45 72 72 6e 6f 20   int rc, tErrno 
12d40 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 72 63 20  = errno;.    rc 
12d50 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  = sqliteErrorFro
12d60 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72  mPosixError(tErr
12d70 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  no, SQLITE_IOERR
12d80 5f 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66  _UNLOCK);.    if
12d90 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  ( IS_LOCK_ERROR(
12da0 72 63 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69  rc) ){.      pFi
12db0 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
12dc0 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20  tErrno;.    }.  
12dd0 20 20 72 65 74 75 72 6e 20 72 63 3b 20 0a 20 20    return rc; .  
12de0 7d 0a 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  }.  pFile->lockt
12df0 79 70 65 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20  ype = NO_LOCK;. 
12e00 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
12e10 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2a 20 43 6c 6f  K;.}../*. ** Clo
12e20 73 65 20 61 20 66 69 6c 65 2e 0a 20 2a 2f 0a 73  se a file.. */.s
12e30 74 61 74 69 63 20 69 6e 74 20 73 65 6d 43 6c 6f  tatic int semClo
12e40 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  se(sqlite3_file 
12e50 2a 69 64 29 20 7b 0a 20 20 69 66 28 20 69 64 20  *id) {.  if( id 
12e60 29 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20  ){.    unixFile 
12e70 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
12e80 6c 65 2a 29 69 64 3b 0a 20 20 20 20 73 65 6d 55  le*)id;.    semU
12e90 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43  nlock(id, NO_LOC
12ea0 4b 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  K);.    assert( 
12eb0 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 75 6e 69  pFile );.    uni
12ec0 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  xEnterMutex();. 
12ed0 20 20 20 72 65 6c 65 61 73 65 4c 6f 63 6b 49 6e     releaseLockIn
12ee0 66 6f 28 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 29  fo(pFile->pLock)
12ef0 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 4f 70 65  ;.    releaseOpe
12f00 6e 43 6e 74 28 70 46 69 6c 65 2d 3e 70 4f 70 65  nCnt(pFile->pOpe
12f10 6e 29 3b 0a 20 20 20 20 75 6e 69 78 4c 65 61 76  n);.    unixLeav
12f20 65 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 63 6c  eMutex();.    cl
12f30 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b  oseUnixFile(id);
12f40 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
12f50 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64  LITE_OK;.}..#end
12f60 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53  if /* OS_VXWORKS
12f70 20 2a 2f 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65 64 20   */./*.** Named 
12f80 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e  semaphore lockin
12f90 67 20 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61  g is only availa
12fa0 62 6c 65 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a  ble on VxWorks..
12fb0 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
12fc0 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6e 61  ** End of the na
12fd0 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f  med semaphore lo
12fe0 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ck implementatio
12ff0 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  n **************
13000 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
13010 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13020 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13030 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13040 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13050 2a 2f 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  */.../**********
13060 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13070 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13080 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13090 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
130a0 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
130b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
130c0 20 42 65 67 69 6e 20 41 46 50 20 4c 6f 63 6b 69   Begin AFP Locki
130d0 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ng *************
130e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
130f0 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 41 46 50 20 69  ****.**.** AFP i
13100 73 20 74 68 65 20 41 70 70 6c 65 20 46 69 6c 69  s the Apple Fili
13110 6e 67 20 50 72 6f 74 6f 63 6f 6c 2e 20 20 41 46  ng Protocol.  AF
13120 50 20 69 73 20 61 20 6e 65 74 77 6f 72 6b 20 66  P is a network f
13130 69 6c 65 73 79 73 74 65 6d 20 66 6f 75 6e 64 0a  ilesystem found.
13140 2a 2a 20 6f 6e 20 41 70 70 6c 65 20 4d 61 63 69  ** on Apple Maci
13150 6e 74 6f 73 68 20 63 6f 6d 70 75 74 65 72 73 20  ntosh computers 
13160 2d 20 62 6f 74 68 20 4f 53 39 20 61 6e 64 20 4f  - both OS9 and O
13170 53 58 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 72 64 2d  SX..**.** Third-
13180 70 61 72 74 79 20 69 6d 70 6c 65 6d 65 6e 74 61  party implementa
13190 74 69 6f 6e 73 20 6f 66 20 41 46 50 20 61 72 65  tions of AFP are
131a0 20 61 76 61 69 6c 61 62 6c 65 2e 20 20 42 75 74   available.  But
131b0 20 74 68 69 73 20 63 6f 64 65 20 68 65 72 65 0a   this code here.
131c0 2a 2a 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 6f 6e  ** only works on
131d0 20 4f 53 58 2e 0a 2a 2f 0a 0a 23 69 66 20 64 65   OSX..*/..#if de
131e0 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
131f0 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
13200 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
13210 2f 2a 0a 2a 2a 20 54 68 65 20 61 66 70 4c 6f 63  /*.** The afpLoc
13220 6b 69 6e 67 43 6f 6e 74 65 78 74 20 73 74 72 75  kingContext stru
13230 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 20 61  cture contains a
13240 6c 6c 20 61 66 70 20 6c 6f 63 6b 20 73 70 65 63  ll afp lock spec
13250 69 66 69 63 20 73 74 61 74 65 0a 2a 2f 0a 74 79  ific state.*/.ty
13260 70 65 64 65 66 20 73 74 72 75 63 74 20 61 66 70  pedef struct afp
13270 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 61  LockingContext a
13280 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
13290 3b 0a 73 74 72 75 63 74 20 61 66 70 4c 6f 63 6b  ;.struct afpLock
132a0 69 6e 67 43 6f 6e 74 65 78 74 20 7b 0a 20 20 69  ingContext {.  i
132b0 6e 74 20 72 65 73 65 72 76 65 64 3b 0a 20 20 63  nt reserved;.  c
132c0 6f 6e 73 74 20 63 68 61 72 20 2a 64 62 50 61 74  onst char *dbPat
132d0 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  h;             /
132e0 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f 70  * Name of the op
132f0 65 6e 20 66 69 6c 65 20 2a 2f 0a 7d 3b 0a 0a 73  en file */.};..s
13300 74 72 75 63 74 20 42 79 74 65 52 61 6e 67 65 4c  truct ByteRangeL
13310 6f 63 6b 50 42 32 0a 7b 0a 20 20 75 6e 73 69 67  ockPB2.{.  unsig
13320 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6f 66  ned long long of
13330 66 73 65 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  fset;        /* 
13340 6f 66 66 73 65 74 20 74 6f 20 66 69 72 73 74 20  offset to first 
13350 62 79 74 65 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a  byte to lock */.
13360 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20    unsigned long 
13370 6c 6f 6e 67 20 6c 65 6e 67 74 68 3b 20 20 20 20  long length;    
13380 20 20 20 20 2f 2a 20 6e 62 72 20 6f 66 20 62 79      /* nbr of by
13390 74 65 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20  tes to lock */. 
133a0 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c   unsigned long l
133b0 6f 6e 67 20 72 65 74 52 61 6e 67 65 53 74 61 72  ong retRangeStar
133c0 74 3b 20 2f 2a 20 6e 62 72 20 6f 66 20 31 73 74  t; /* nbr of 1st
133d0 20 62 79 74 65 20 6c 6f 63 6b 65 64 20 69 66 20   byte locked if 
133e0 73 75 63 63 65 73 73 66 75 6c 20 2a 2f 0a 20 20  successful */.  
133f0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 75 6e  unsigned char un
13400 4c 6f 63 6b 46 6c 61 67 3b 20 20 20 20 20 20 20  LockFlag;       
13410 20 20 2f 2a 20 31 20 3d 20 75 6e 6c 6f 63 6b 2c    /* 1 = unlock,
13420 20 30 20 3d 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75   0 = lock */.  u
13430 6e 73 69 67 6e 65 64 20 63 68 61 72 20 73 74 61  nsigned char sta
13440 72 74 45 6e 64 46 6c 61 67 3b 20 20 20 20 20 20  rtEndFlag;      
13450 20 2f 2a 20 31 3d 72 65 6c 20 74 6f 20 65 6e 64   /* 1=rel to end
13460 20 6f 66 20 66 6f 72 6b 2c 20 30 3d 72 65 6c 20   of fork, 0=rel 
13470 74 6f 20 73 74 61 72 74 20 2a 2f 0a 20 20 69 6e  to start */.  in
13480 74 20 66 64 3b 20 20 20 20 20 20 20 20 20 20 20  t fd;           
13490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
134a0 2f 2a 20 66 69 6c 65 20 64 65 73 63 20 74 6f 20  /* file desc to 
134b0 61 73 73 6f 63 20 74 68 69 73 20 6c 6f 63 6b 20  assoc this lock 
134c0 77 69 74 68 20 2a 2f 0a 7d 3b 0a 0a 23 64 65 66  with */.};..#def
134d0 69 6e 65 20 61 66 70 66 73 42 79 74 65 52 61 6e  ine afpfsByteRan
134e0 67 65 4c 6f 63 6b 32 46 53 43 54 4c 20 20 20 20  geLock2FSCTL    
134f0 20 20 20 20 5f 49 4f 57 52 28 27 7a 27 2c 20 32      _IOWR('z', 2
13500 33 2c 20 73 74 72 75 63 74 20 42 79 74 65 52 61  3, struct ByteRa
13510 6e 67 65 4c 6f 63 6b 50 42 32 29 0a 0a 2f 2a 0a  ngeLockPB2)../*.
13520 2a 2a 20 54 68 69 73 20 69 73 20 61 20 75 74 69  ** This is a uti
13530 6c 69 74 79 20 66 6f 72 20 73 65 74 74 69 6e 67  lity for setting
13540 20 6f 72 20 63 6c 65 61 72 69 6e 67 20 61 20 62   or clearing a b
13550 69 74 2d 72 61 6e 67 65 20 6c 6f 63 6b 20 6f 6e  it-range lock on
13560 20 61 6e 0a 2a 2a 20 41 46 50 20 66 69 6c 65 73   an.** AFP files
13570 79 73 74 65 6d 2e 0a 2a 2a 20 0a 2a 2a 20 52 65  ystem..** .** Re
13580 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
13590 6e 20 73 75 63 63 65 73 73 2c 20 53 51 4c 49 54  n success, SQLIT
135a0 45 5f 42 55 53 59 20 6f 6e 20 66 61 69 6c 75 72  E_BUSY on failur
135b0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
135c0 20 61 66 70 53 65 74 4c 6f 63 6b 28 0a 20 20 63   afpSetLock(.  c
135d0 6f 6e 73 74 20 63 68 61 72 20 2a 70 61 74 68 2c  onst char *path,
135e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
135f0 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c   Name of the fil
13600 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20 6f  e to be locked o
13610 72 20 75 6e 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20  r unlocked */.  
13620 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c  unixFile *pFile,
13630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13640 2a 20 4f 70 65 6e 20 66 69 6c 65 20 64 65 73 63  * Open file desc
13650 72 69 70 74 6f 72 20 6f 6e 20 70 61 74 68 20 2a  riptor on path *
13660 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  /.  unsigned lon
13670 67 20 6c 6f 6e 67 20 6f 66 66 73 65 74 2c 20 20  g long offset,  
13680 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65     /* First byte
13690 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20 2a 2f   to be locked */
136a0 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  .  unsigned long
136b0 20 6c 6f 6e 67 20 6c 65 6e 67 74 68 2c 20 20 20   long length,   
136c0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
136d0 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a  ytes to lock */.
136e0 20 20 69 6e 74 20 73 65 74 4c 6f 63 6b 46 6c 61    int setLockFla
136f0 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g               
13700 20 2f 2a 20 54 72 75 65 20 74 6f 20 73 65 74 20   /* True to set 
13710 6c 6f 63 6b 2e 20 20 46 61 6c 73 65 20 74 6f 20  lock.  False to 
13720 63 6c 65 61 72 20 6c 6f 63 6b 20 2a 2f 0a 29 7b  clear lock */.){
13730 0a 20 20 73 74 72 75 63 74 20 42 79 74 65 52 61  .  struct ByteRa
13740 6e 67 65 4c 6f 63 6b 50 42 32 20 70 62 3b 0a 20  ngeLockPB2 pb;. 
13750 20 69 6e 74 20 65 72 72 3b 0a 20 20 0a 20 20 70   int err;.  .  p
13760 62 2e 75 6e 4c 6f 63 6b 46 6c 61 67 20 3d 20 73  b.unLockFlag = s
13770 65 74 4c 6f 63 6b 46 6c 61 67 20 3f 20 30 20 3a  etLockFlag ? 0 :
13780 20 31 3b 0a 20 20 70 62 2e 73 74 61 72 74 45 6e   1;.  pb.startEn
13790 64 46 6c 61 67 20 3d 20 30 3b 0a 20 20 70 62 2e  dFlag = 0;.  pb.
137a0 6f 66 66 73 65 74 20 3d 20 6f 66 66 73 65 74 3b  offset = offset;
137b0 0a 20 20 70 62 2e 6c 65 6e 67 74 68 20 3d 20 6c  .  pb.length = l
137c0 65 6e 67 74 68 3b 20 0a 20 20 70 62 2e 66 64 20  ength; .  pb.fd 
137d0 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 20 20 0a 20  = pFile->h;.  . 
137e0 20 4f 53 54 52 41 43 45 36 28 22 41 46 50 53 45   OSTRACE6("AFPSE
137f0 54 4c 4f 43 4b 20 5b 25 73 5d 20 66 6f 72 20 25  TLOCK [%s] for %
13800 64 25 73 20 69 6e 20 72 61 6e 67 65 20 25 6c 6c  d%s in range %ll
13810 78 3a 25 6c 6c 78 5c 6e 22 2c 20 0a 20 20 20 20  x:%llx\n", .    
13820 28 73 65 74 4c 6f 63 6b 46 6c 61 67 3f 22 4f 4e  (setLockFlag?"ON
13830 22 3a 22 4f 46 46 22 29 2c 20 70 46 69 6c 65 2d  ":"OFF"), pFile-
13840 3e 68 2c 20 28 70 62 2e 66 64 3d 3d 2d 31 3f 22  >h, (pb.fd==-1?"
13850 5b 74 65 73 74 76 61 6c 2d 31 5d 22 3a 22 22 29  [testval-1]":"")
13860 2c 0a 20 20 20 20 6f 66 66 73 65 74 2c 20 6c 65  ,.    offset, le
13870 6e 67 74 68 29 3b 0a 20 20 65 72 72 20 3d 20 66  ngth);.  err = f
13880 73 63 74 6c 28 70 61 74 68 2c 20 61 66 70 66 73  sctl(path, afpfs
13890 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 32 46 53  ByteRangeLock2FS
138a0 43 54 4c 2c 20 26 70 62 2c 20 30 29 3b 0a 20 20  CTL, &pb, 0);.  
138b0 69 66 20 28 20 65 72 72 3d 3d 2d 31 20 29 20 7b  if ( err==-1 ) {
138c0 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20  .    int rc;.   
138d0 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72   int tErrno = er
138e0 72 6e 6f 3b 0a 20 20 20 20 4f 53 54 52 41 43 45  rno;.    OSTRACE
138f0 34 28 22 41 46 50 53 45 54 4c 4f 43 4b 20 66 61  4("AFPSETLOCK fa
13900 69 6c 65 64 20 74 6f 20 66 73 63 74 6c 28 29 20  iled to fsctl() 
13910 27 25 73 27 20 25 64 20 25 73 5c 6e 22 2c 0a 20  '%s' %d %s\n",. 
13920 20 20 20 20 20 20 20 20 20 20 20 20 70 61 74 68              path
13930 2c 20 74 45 72 72 6e 6f 2c 20 73 74 72 65 72 72  , tErrno, strerr
13940 6f 72 28 74 45 72 72 6e 6f 29 29 3b 0a 23 69 66  or(tErrno));.#if
13950 64 65 66 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52  def SQLITE_IGNOR
13960 45 5f 41 46 50 5f 4c 4f 43 4b 5f 45 52 52 4f 52  E_AFP_LOCK_ERROR
13970 53 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  S.    rc = SQLIT
13980 45 5f 42 55 53 59 3b 0a 23 65 6c 73 65 0a 20 20  E_BUSY;.#else.  
13990 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72    rc = sqliteErr
139a0 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72  orFromPosixError
139b0 28 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  (tErrno,.       
139c0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74               set
139d0 4c 6f 63 6b 46 6c 61 67 20 3f 20 53 51 4c 49 54  LockFlag ? SQLIT
139e0 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 20 3a 20 53  E_IOERR_LOCK : S
139f0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
13a00 43 4b 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53  CK);.#endif /* S
13a10 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 41 46 50  QLITE_IGNORE_AFP
13a20 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a  _LOCK_ERRORS */.
13a30 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
13a40 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20  ERROR(rc) ){.   
13a50 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
13a60 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20  rno = tErrno;.  
13a70 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72    }.    return r
13a80 63 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  c;.  } else {.  
13a90 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
13aa0 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  OK;.  }.}../*.**
13ab0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68   This routine ch
13ac0 65 63 6b 73 20 69 66 20 74 68 65 72 65 20 69 73  ecks if there is
13ad0 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
13ae0 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65   held on the spe
13af0 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62  cified.** file b
13b00 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74  y this or any ot
13b10 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20  her process. If 
13b20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68  such a lock is h
13b30 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75  eld, set *pResOu
13b40 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65  t.** to a non-ze
13b50 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69  ro value otherwi
13b60 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73  se *pResOut is s
13b70 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65  et to zero.  The
13b80 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a   return value.**
13b90 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54   is set to SQLIT
13ba0 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49  E_OK unless an I
13bb0 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  /O error occurs 
13bc0 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63  during lock chec
13bd0 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  king..*/.static 
13be0 69 6e 74 20 61 66 70 43 68 65 63 6b 52 65 73 65  int afpCheckRese
13bf0 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33  rvedLock(sqlite3
13c00 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a  _file *id, int *
13c10 70 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e 74 20  pResOut){.  int 
13c20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
13c30 20 20 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d    int reserved =
13c40 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a   0;.  unixFile *
13c50 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
13c60 65 2a 29 69 64 3b 0a 20 20 0a 20 20 53 69 6d 75  e*)id;.  .  Simu
13c70 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74  lateIOError( ret
13c80 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
13c90 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f  _CHECKRESERVEDLO
13ca0 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73 65  CK; );.  .  asse
13cb0 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 61  rt( pFile );.  a
13cc0 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
13cd0 20 2a 63 6f 6e 74 65 78 74 20 3d 20 28 61 66 70   *context = (afp
13ce0 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
13cf0 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  ) pFile->locking
13d00 43 6f 6e 74 65 78 74 3b 0a 20 20 69 66 28 20 63  Context;.  if( c
13d10 6f 6e 74 65 78 74 2d 3e 72 65 73 65 72 76 65 64  ontext->reserved
13d20 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 4f 75 74   ){.    *pResOut
13d30 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 1;.    return
13d40 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
13d50 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
13d60 28 29 3b 20 2f 2a 20 42 65 63 61 75 73 65 20 70  (); /* Because p
13d70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 20 69 73 20 73  File->pLock is s
13d80 68 61 72 65 64 20 61 63 72 6f 73 73 20 74 68 72  hared across thr
13d90 65 61 64 73 20 2a 2f 0a 20 20 0a 20 20 2f 2a 20  eads */.  .  /* 
13da0 43 68 65 63 6b 20 69 66 20 61 20 74 68 72 65 61  Check if a threa
13db0 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73  d in this proces
13dc0 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c  s holds such a l
13dd0 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ock */.  if( pFi
13de0 6c 65 2d 3e 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74  le->pLock->lockt
13df0 79 70 65 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ype>SHARED_LOCK 
13e00 29 7b 0a 20 20 20 20 72 65 73 65 72 76 65 64 20  ){.    reserved 
13e10 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  = 1;.  }.  .  /*
13e20 20 4f 74 68 65 72 77 69 73 65 20 73 65 65 20 69   Otherwise see i
13e30 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f  f some other pro
13e40 63 65 73 73 20 68 6f 6c 64 73 20 69 74 2e 0a 20  cess holds it.. 
13e50 20 20 2a 2f 0a 20 20 69 66 28 20 21 72 65 73 65    */.  if( !rese
13e60 72 76 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20 6c  rved ){.    /* l
13e70 6f 63 6b 20 74 68 65 20 52 45 53 45 52 56 45 44  ock the RESERVED
13e80 20 62 79 74 65 20 2a 2f 0a 20 20 20 20 69 6e 74   byte */.    int
13e90 20 6c 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63   lrc = afpSetLoc
13ea0 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74  k(context->dbPat
13eb0 68 2c 20 70 46 69 6c 65 2c 20 52 45 53 45 52 56  h, pFile, RESERV
13ec0 45 44 5f 42 59 54 45 2c 20 31 2c 31 29 3b 20 20  ED_BYTE, 1,1);  
13ed0 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f  .    if( SQLITE_
13ee0 4f 4b 3d 3d 6c 72 63 20 29 7b 0a 20 20 20 20 20  OK==lrc ){.     
13ef0 20 2f 2a 20 69 66 20 77 65 20 73 75 63 63 65 65   /* if we succee
13f00 64 65 64 20 69 6e 20 74 61 6b 69 6e 67 20 74 68  ded in taking th
13f10 65 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 2c  e reserved lock,
13f20 20 75 6e 6c 6f 63 6b 20 69 74 20 74 6f 20 72 65   unlock it to re
13f30 73 74 6f 72 65 0a 20 20 20 20 20 20 2a 2a 20 74  store.      ** t
13f40 68 65 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74  he original stat
13f50 65 20 2a 2f 0a 20 20 20 20 20 20 6c 72 63 20 3d  e */.      lrc =
13f60 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74   afpSetLock(cont
13f70 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69  ext->dbPath, pFi
13f80 6c 65 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54  le, RESERVED_BYT
13f90 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d 20  E, 1, 0);.    } 
13fa0 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 2f 2a 20  else {.      /* 
13fb0 69 66 20 77 65 20 66 61 69 6c 65 64 20 74 6f 20  if we failed to 
13fc0 67 65 74 20 74 68 65 20 6c 6f 63 6b 20 74 68 65  get the lock the
13fd0 6e 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 6d  n someone else m
13fe0 75 73 74 20 68 61 76 65 20 69 74 20 2a 2f 0a 20  ust have it */. 
13ff0 20 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20       reserved = 
14000 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  1;.    }.    if(
14010 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c   IS_LOCK_ERROR(l
14020 72 63 29 20 29 7b 0a 20 20 20 20 20 20 72 63 3d  rc) ){.      rc=
14030 6c 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  lrc;.    }.  }. 
14040 20 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74   .  unixLeaveMut
14050 65 78 28 29 3b 0a 20 20 4f 53 54 52 41 43 45 34  ex();.  OSTRACE4
14060 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25  ("TEST WR-LOCK %
14070 64 20 25 64 20 25 64 20 28 61 66 70 29 5c 6e 22  d %d %d (afp)\n"
14080 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20  , pFile->h, rc, 
14090 72 65 73 65 72 76 65 64 29 3b 0a 20 20 0a 20 20  reserved);.  .  
140a0 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72  *pResOut = reser
140b0 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ved;.  return rc
140c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20  ;.}../*.** Lock 
140d0 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74 68  the file with th
140e0 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64  e lock specified
140f0 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 6c 6f   by parameter lo
14100 63 6b 74 79 70 65 20 2d 20 6f 6e 65 0a 2a 2a 20  cktype - one.** 
14110 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
14120 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20  :.**.**     (1) 
14130 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20  SHARED_LOCK.**  
14140 20 20 20 28 32 29 20 52 45 53 45 52 56 45 44 5f     (2) RESERVED_
14150 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20  LOCK.**     (3) 
14160 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20  PENDING_LOCK.** 
14170 20 20 20 20 28 34 29 20 45 58 43 4c 55 53 49 56      (4) EXCLUSIV
14180 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d  E_LOCK.**.** Som
14190 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75  etimes when requ
141a0 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20  esting one lock 
141b0 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61  state, additiona
141c0 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a  l lock states.**
141d0 20 61 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e   are inserted in
141e0 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c   between.  The l
141f0 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69  ocking might fai
14200 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  l on one of the 
14210 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74  later.** transit
14220 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65  ions leaving the
14230 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66   lock state diff
14240 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20  erent from what 
14250 69 74 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a  it started but.*
14260 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66  * still short of
14270 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20   its goal.  The 
14280 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20  following chart 
14290 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65  shows the allowe
142a0 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73  d.** transitions
142b0 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65   and the inserte
142c0 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73  d intermediate s
142d0 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  tates:.**.**    
142e0 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52  UNLOCKED -> SHAR
142f0 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20  ED.**    SHARED 
14300 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20  -> RESERVED.**  
14310 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e    SHARED -> (PEN
14320 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49  DING) -> EXCLUSI
14330 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45  VE.**    RESERVE
14340 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d  D -> (PENDING) -
14350 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  > EXCLUSIVE.**  
14360 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43    PENDING -> EXC
14370 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69  LUSIVE.**.** Thi
14380 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f  s routine will o
14390 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c  nly increase a l
143a0 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71  ock.  Use the sq
143b0 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a  lite3OsUnlock().
143c0 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f  ** routine to lo
143d0 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65  wer a locking le
143e0 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  vel..*/.static i
143f0 6e 74 20 61 66 70 4c 6f 63 6b 28 73 71 6c 69 74  nt afpLock(sqlit
14400 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
14410 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e   locktype){.  in
14420 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
14430 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  ;.  unixFile *pF
14440 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
14450 29 69 64 3b 0a 20 20 73 74 72 75 63 74 20 75 6e  )id;.  struct un
14460 69 78 4c 6f 63 6b 49 6e 66 6f 20 2a 70 4c 6f 63  ixLockInfo *pLoc
14470 6b 20 3d 20 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b  k = pFile->pLock
14480 3b 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f  ;.  afpLockingCo
14490 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 20 3d  ntext *context =
144a0 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74   (afpLockingCont
144b0 65 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f  ext *) pFile->lo
144c0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20  ckingContext;.  
144d0 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
144e0 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 37 28 22   );.  OSTRACE7("
144f0 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 77 61  LOCK    %d %s wa
14500 73 20 25 73 28 25 73 2c 25 64 29 20 70 69 64 3d  s %s(%s,%d) pid=
14510 25 64 20 28 61 66 70 29 5c 6e 22 2c 20 70 46 69  %d (afp)\n", pFi
14520 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20  le->h,.         
14530 20 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28 6c    locktypeName(l
14540 6f 63 6b 74 79 70 65 29 2c 20 6c 6f 63 6b 74 79  ocktype), lockty
14550 70 65 4e 61 6d 65 28 70 46 69 6c 65 2d 3e 6c 6f  peName(pFile->lo
14560 63 6b 74 79 70 65 29 2c 0a 20 20 20 20 20 20 20  cktype),.       
14570 20 20 20 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65      locktypeName
14580 28 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65  (pLock->locktype
14590 29 2c 20 70 4c 6f 63 6b 2d 3e 63 6e 74 20 2c 20  ), pLock->cnt , 
145a0 67 65 74 70 69 64 28 29 29 3b 0a 0a 20 20 2f 2a  getpid());..  /*
145b0 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6c 72   If there is alr
145c0 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20 74  eady a lock of t
145d0 68 69 73 20 74 79 70 65 20 6f 72 20 6d 6f 72 65  his type or more
145e0 20 72 65 73 74 72 69 63 74 69 76 65 20 6f 6e 20   restrictive on 
145f0 74 68 65 0a 20 20 2a 2a 20 75 6e 69 78 46 69 6c  the.  ** unixFil
14600 65 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44  e, do nothing. D
14610 6f 6e 27 74 20 75 73 65 20 74 68 65 20 61 66 70  on't use the afp
14620 5f 65 6e 64 5f 6c 6f 63 6b 3a 20 65 78 69 74 20  _end_lock: exit 
14630 70 61 74 68 2c 20 61 73 0a 20 20 2a 2a 20 75 6e  path, as.  ** un
14640 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 20 68  ixEnterMutex() h
14650 61 73 6e 27 74 20 62 65 65 6e 20 63 61 6c 6c 65  asn't been calle
14660 64 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  d yet..  */.  if
14670 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  ( pFile->locktyp
14680 65 3e 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20  e>=locktype ){. 
14690 20 20 20 4f 53 54 52 41 43 45 33 28 22 4c 4f 43     OSTRACE3("LOC
146a0 4b 20 20 20 20 25 64 20 25 73 20 6f 6b 20 28 61  K    %d %s ok (a
146b0 6c 72 65 61 64 79 20 68 65 6c 64 29 20 28 61 66  lready held) (af
146c0 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  p)\n", pFile->h,
146d0 0a 20 20 20 20 20 20 20 20 20 20 20 6c 6f 63 6b  .           lock
146e0 74 79 70 65 4e 61 6d 65 28 6c 6f 63 6b 74 79 70  typeName(locktyp
146f0 65 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  e));.    return 
14700 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
14710 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
14720 68 65 20 6c 6f 63 6b 69 6e 67 20 73 65 71 75 65  he locking seque
14730 6e 63 65 20 69 73 20 63 6f 72 72 65 63 74 0a 20  nce is correct. 
14740 20 2a 2a 20 20 28 31 29 20 57 65 20 6e 65 76 65   **  (1) We neve
14750 72 20 6d 6f 76 65 20 66 72 6f 6d 20 75 6e 6c 6f  r move from unlo
14760 63 6b 65 64 20 74 6f 20 61 6e 79 74 68 69 6e 67  cked to anything
14770 20 68 69 67 68 65 72 20 74 68 61 6e 20 73 68 61   higher than sha
14780 72 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20  red lock..  **  
14790 28 32 29 20 53 51 4c 69 74 65 20 6e 65 76 65 72  (2) SQLite never
147a0 20 65 78 70 6c 69 63 69 74 6c 79 20 72 65 71 75   explicitly requ
147b0 65 73 74 73 20 61 20 70 65 6e 64 69 67 20 6c 6f  ests a pendig lo
147c0 63 6b 2e 0a 20 20 2a 2a 20 20 28 33 29 20 41 20  ck..  **  (3) A 
147d0 73 68 61 72 65 64 20 6c 6f 63 6b 20 69 73 20 61  shared lock is a
147e0 6c 77 61 79 73 20 68 65 6c 64 20 77 68 65 6e 20  lways held when 
147f0 61 20 72 65 73 65 72 76 65 20 6c 6f 63 6b 20 69  a reserve lock i
14800 73 20 72 65 71 75 65 73 74 65 64 2e 0a 20 20 2a  s requested..  *
14810 2f 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  /.  assert( pFil
14820 65 2d 3e 6c 6f 63 6b 74 79 70 65 21 3d 4e 4f 5f  e->locktype!=NO_
14830 4c 4f 43 4b 20 7c 7c 20 6c 6f 63 6b 74 79 70 65  LOCK || locktype
14840 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  ==SHARED_LOCK );
14850 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74  .  assert( lockt
14860 79 70 65 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43  ype!=PENDING_LOC
14870 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6c  K );.  assert( l
14880 6f 63 6b 74 79 70 65 21 3d 52 45 53 45 52 56 45  ocktype!=RESERVE
14890 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c 65 2d  D_LOCK || pFile-
148a0 3e 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45  >locktype==SHARE
148b0 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f  D_LOCK );.  .  /
148c0 2a 20 54 68 69 73 20 6d 75 74 65 78 20 69 73 20  * This mutex is 
148d0 6e 65 65 64 65 64 20 62 65 63 61 75 73 65 20 70  needed because p
148e0 46 69 6c 65 2d 3e 70 4c 6f 63 6b 20 69 73 20 73  File->pLock is s
148f0 68 61 72 65 64 20 61 63 72 6f 73 73 20 74 68 72  hared across thr
14900 65 61 64 73 0a 20 20 2a 2f 0a 20 20 75 6e 69 78  eads.  */.  unix
14910 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 0a 20  EnterMutex();.. 
14920 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68   /* Make sure th
14930 65 20 63 75 72 72 65 6e 74 20 74 68 72 65 61 64  e current thread
14940 20 6f 77 6e 73 20 74 68 65 20 70 46 69 6c 65 2e   owns the pFile.
14950 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 74 72 61  .  */.  rc = tra
14960 6e 73 66 65 72 4f 77 6e 65 72 73 68 69 70 28 70  nsferOwnership(p
14970 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 72 63 21  File);.  if( rc!
14980 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
14990 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
149a0 28 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  ();.    return r
149b0 63 3b 0a 20 20 7d 0a 20 20 70 4c 6f 63 6b 20 3d  c;.  }.  pLock =
149c0 20 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 3b 0a 0a   pFile->pLock;..
149d0 20 20 2f 2a 20 49 66 20 73 6f 6d 65 20 74 68 72    /* If some thr
149e0 65 61 64 20 75 73 69 6e 67 20 74 68 69 73 20 50  ead using this P
149f0 49 44 20 68 61 73 20 61 20 6c 6f 63 6b 20 76 69  ID has a lock vi
14a00 61 20 61 20 64 69 66 66 65 72 65 6e 74 20 75 6e  a a different un
14a10 69 78 46 69 6c 65 2a 0a 20 20 2a 2a 20 68 61 6e  ixFile*.  ** han
14a20 64 6c 65 20 74 68 61 74 20 70 72 65 63 6c 75 64  dle that preclud
14a30 65 73 20 74 68 65 20 72 65 71 75 65 73 74 65 64  es the requested
14a40 20 6c 6f 63 6b 2c 20 72 65 74 75 72 6e 20 42 55   lock, return BU
14a50 53 59 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28  SY..  */.  if( (
14a60 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 21  pFile->locktype!
14a70 3d 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65  =pLock->locktype
14a80 20 26 26 20 0a 20 20 20 20 20 20 20 28 70 4c 6f   && .       (pLo
14a90 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 50 45  ck->locktype>=PE
14aa0 4e 44 49 4e 47 5f 4c 4f 43 4b 20 7c 7c 20 6c 6f  NDING_LOCK || lo
14ab0 63 6b 74 79 70 65 3e 53 48 41 52 45 44 5f 4c 4f  cktype>SHARED_LO
14ac0 43 4b 29 29 0a 20 20 20 20 20 29 7b 0a 20 20 20  CK)).     ){.   
14ad0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
14ae0 59 3b 0a 20 20 20 20 67 6f 74 6f 20 61 66 70 5f  Y;.    goto afp_
14af0 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20  end_lock;.  }.  
14b00 0a 20 20 2f 2a 20 49 66 20 61 20 53 48 41 52 45  .  /* If a SHARE
14b10 44 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73  D lock is reques
14b20 74 65 64 2c 20 61 6e 64 20 73 6f 6d 65 20 74 68  ted, and some th
14b30 72 65 61 64 20 75 73 69 6e 67 20 74 68 69 73 20  read using this 
14b40 50 49 44 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a  PID already.  **
14b50 20 68 61 73 20 61 20 53 48 41 52 45 44 20 6f 72   has a SHARED or
14b60 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20   RESERVED lock, 
14b70 74 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 72  then increment r
14b80 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 73 20  eference counts 
14b90 61 6e 64 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20  and.  ** return 
14ba0 53 51 4c 49 54 45 5f 4f 4b 2e 0a 20 20 2a 2f 0a  SQLITE_OK..  */.
14bb0 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d    if( locktype==
14bc0 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20 0a  SHARED_LOCK && .
14bd0 20 20 20 20 20 28 70 4c 6f 63 6b 2d 3e 6c 6f 63       (pLock->loc
14be0 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f  ktype==SHARED_LO
14bf0 43 4b 20 7c 7c 20 70 4c 6f 63 6b 2d 3e 6c 6f 63  CK || pLock->loc
14c00 6b 74 79 70 65 3d 3d 52 45 53 45 52 56 45 44 5f  ktype==RESERVED_
14c10 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20 61 73 73  LOCK) ){.    ass
14c20 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53  ert( locktype==S
14c30 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
14c40 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d    assert( pFile-
14c50 3e 6c 6f 63 6b 74 79 70 65 3d 3d 30 20 29 3b 0a  >locktype==0 );.
14c60 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63      assert( pLoc
14c70 6b 2d 3e 63 6e 74 3e 30 20 29 3b 0a 20 20 20 20  k->cnt>0 );.    
14c80 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20  pFile->locktype 
14c90 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20  = SHARED_LOCK;. 
14ca0 20 20 20 70 4c 6f 63 6b 2d 3e 63 6e 74 2b 2b 3b     pLock->cnt++;
14cb0 0a 20 20 20 20 70 46 69 6c 65 2d 3e 70 4f 70 65  .    pFile->pOpe
14cc0 6e 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20  n->nLock++;.    
14cd0 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63  goto afp_end_loc
14ce0 6b 3b 0a 20 20 7d 0a 20 20 20 20 0a 20 20 2f 2a  k;.  }.    .  /*
14cf0 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20   A PENDING lock 
14d00 69 73 20 6e 65 65 64 65 64 20 62 65 66 6f 72 65  is needed before
14d10 20 61 63 71 75 69 72 69 6e 67 20 61 20 53 48 41   acquiring a SHA
14d20 52 45 44 20 6c 6f 63 6b 20 61 6e 64 20 62 65 66  RED lock and bef
14d30 6f 72 65 0a 20 20 2a 2a 20 61 63 71 75 69 72 69  ore.  ** acquiri
14d40 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  ng an EXCLUSIVE 
14d50 6c 6f 63 6b 2e 20 20 46 6f 72 20 74 68 65 20 53  lock.  For the S
14d60 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20  HARED lock, the 
14d70 50 45 4e 44 49 4e 47 20 77 69 6c 6c 0a 20 20 2a  PENDING will.  *
14d80 2a 20 62 65 20 72 65 6c 65 61 73 65 64 2e 0a 20  * be released.. 
14d90 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79   */.  if( lockty
14da0 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  pe==SHARED_LOCK 
14db0 0a 20 20 20 20 20 20 7c 7c 20 28 6c 6f 63 6b 74  .      || (lockt
14dc0 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ype==EXCLUSIVE_L
14dd0 4f 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e 6c 6f  OCK && pFile->lo
14de0 63 6b 74 79 70 65 3c 50 45 4e 44 49 4e 47 5f 4c  cktype<PENDING_L
14df0 4f 43 4b 29 0a 20 20 29 7b 0a 20 20 20 20 69 6e  OCK).  ){.    in
14e00 74 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 66 61  t failed;.    fa
14e10 69 6c 65 64 20 3d 20 61 66 70 53 65 74 4c 6f 63  iled = afpSetLoc
14e20 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74  k(context->dbPat
14e30 68 2c 20 70 46 69 6c 65 2c 20 50 45 4e 44 49 4e  h, pFile, PENDIN
14e40 47 5f 42 59 54 45 2c 20 31 2c 20 31 29 3b 0a 20  G_BYTE, 1, 1);. 
14e50 20 20 20 69 66 20 28 66 61 69 6c 65 64 29 20 7b     if (failed) {
14e60 0a 20 20 20 20 20 20 72 63 20 3d 20 66 61 69 6c  .      rc = fail
14e70 65 64 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61  ed;.      goto a
14e80 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20  fp_end_lock;.   
14e90 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 49   }.  }.  .  /* I
14ea0 66 20 63 6f 6e 74 72 6f 6c 20 67 65 74 73 20 74  f control gets t
14eb0 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68  o this point, th
14ec0 65 6e 20 61 63 74 75 61 6c 6c 79 20 67 6f 20 61  en actually go a
14ed0 68 65 61 64 20 61 6e 64 20 6d 61 6b 65 0a 20 20  head and make.  
14ee0 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  ** operating sys
14ef0 74 65 6d 20 63 61 6c 6c 73 20 66 6f 72 20 74 68  tem calls for th
14f00 65 20 73 70 65 63 69 66 69 65 64 20 6c 6f 63 6b  e specified lock
14f10 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63  ..  */.  if( loc
14f20 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f  ktype==SHARED_LO
14f30 43 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 6c 72  CK ){.    int lr
14f40 63 31 2c 20 6c 72 63 32 2c 20 6c 72 63 31 45 72  c1, lrc2, lrc1Er
14f50 72 6e 6f 3b 0a 20 20 20 20 6c 6f 6e 67 20 6c 6b  rno;.    long lk
14f60 2c 20 6d 61 73 6b 3b 0a 20 20 20 20 0a 20 20 20  , mask;.    .   
14f70 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e   assert( pLock->
14f80 63 6e 74 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  cnt==0 );.    as
14f90 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 6c 6f 63  sert( pLock->loc
14fa0 6b 74 79 70 65 3d 3d 30 20 29 3b 0a 20 20 20 20  ktype==0 );.    
14fb0 20 20 20 20 0a 20 20 20 20 6d 61 73 6b 20 3d 20      .    mask = 
14fc0 28 73 69 7a 65 6f 66 28 6c 6f 6e 67 29 3d 3d 38  (sizeof(long)==8
14fd0 29 20 3f 20 4c 41 52 47 45 53 54 5f 49 4e 54 36  ) ? LARGEST_INT6
14fe0 34 20 3a 20 30 78 37 66 66 66 66 66 66 66 3b 0a  4 : 0x7fffffff;.
14ff0 20 20 20 20 2f 2a 20 4e 6f 77 20 67 65 74 20 74      /* Now get t
15000 68 65 20 72 65 61 64 2d 6c 6f 63 6b 20 53 48 41  he read-lock SHA
15010 52 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 20 20 20 20  RED_LOCK */.    
15020 2f 2a 20 6e 6f 74 65 20 74 68 61 74 20 74 68 65  /* note that the
15030 20 71 75 61 6c 69 74 79 20 6f 66 20 74 68 65 20   quality of the 
15040 72 61 6e 64 6f 6d 6e 65 73 73 20 64 6f 65 73 6e  randomness doesn
15050 27 74 20 6d 61 74 74 65 72 20 74 68 61 74 20 6d  't matter that m
15060 75 63 68 20 2a 2f 0a 20 20 20 20 6c 6b 20 3d 20  uch */.    lk = 
15070 72 61 6e 64 6f 6d 28 29 3b 20 0a 20 20 20 20 70  random(); .    p
15080 4c 6f 63 6b 2d 3e 73 68 61 72 65 64 42 79 74 65  Lock->sharedByte
15090 20 3d 20 28 6c 6b 20 26 20 6d 61 73 6b 29 25 28   = (lk & mask)%(
150a0 53 48 41 52 45 44 5f 53 49 5a 45 20 2d 20 31 29  SHARED_SIZE - 1)
150b0 3b 0a 20 20 20 20 6c 72 63 31 20 3d 20 61 66 70  ;.    lrc1 = afp
150c0 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d  SetLock(context-
150d0 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20  >dbPath, pFile, 
150e0 0a 20 20 20 20 20 20 20 20 20 20 53 48 41 52 45  .          SHARE
150f0 44 5f 46 49 52 53 54 2b 70 4c 6f 63 6b 2d 3e 73  D_FIRST+pLock->s
15100 68 61 72 65 64 42 79 74 65 2c 20 31 2c 20 31 29  haredByte, 1, 1)
15110 3b 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43  ;.    if( IS_LOC
15120 4b 5f 45 52 52 4f 52 28 6c 72 63 31 29 20 29 7b  K_ERROR(lrc1) ){
15130 0a 20 20 20 20 20 20 6c 72 63 31 45 72 72 6e 6f  .      lrc1Errno
15140 20 3d 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72   = pFile->lastEr
15150 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f  rno;.    }.    /
15160 2a 20 44 72 6f 70 20 74 68 65 20 74 65 6d 70 6f  * Drop the tempo
15170 72 61 72 79 20 50 45 4e 44 49 4e 47 20 6c 6f 63  rary PENDING loc
15180 6b 20 2a 2f 0a 20 20 20 20 6c 72 63 32 20 3d 20  k */.    lrc2 = 
15190 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  afpSetLock(conte
151a0 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  xt->dbPath, pFil
151b0 65 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c  e, PENDING_BYTE,
151c0 20 31 2c 20 30 29 3b 0a 20 20 20 20 0a 20 20 20   1, 0);.    .   
151d0 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
151e0 4f 52 28 6c 72 63 31 29 20 29 20 7b 0a 20 20 20  OR(lrc1) ) {.   
151f0 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
15200 72 6e 6f 20 3d 20 6c 72 63 31 45 72 72 6e 6f 3b  rno = lrc1Errno;
15210 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63 31  .      rc = lrc1
15220 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70  ;.      goto afp
15230 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d  _end_lock;.    }
15240 20 65 6c 73 65 20 69 66 28 20 49 53 5f 4c 4f 43   else if( IS_LOC
15250 4b 5f 45 52 52 4f 52 28 6c 72 63 32 29 20 29 7b  K_ERROR(lrc2) ){
15260 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63 32  .      rc = lrc2
15270 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70  ;.      goto afp
15280 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d  _end_lock;.    }
15290 20 65 6c 73 65 20 69 66 28 20 6c 72 63 31 20 21   else if( lrc1 !
152a0 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 29 20 7b 0a  = SQLITE_OK ) {.
152b0 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63 31 3b        rc = lrc1;
152c0 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  .    } else {.  
152d0 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74      pFile->lockt
152e0 79 70 65 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43  ype = SHARED_LOC
152f0 4b 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  K;.      pFile->
15300 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a  pOpen->nLock++;.
15310 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 63 6e 74        pLock->cnt
15320 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65   = 1;.    }.  }e
15330 6c 73 65 20 69 66 28 20 6c 6f 63 6b 74 79 70 65  lse if( locktype
15340 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
15350 20 26 26 20 70 4c 6f 63 6b 2d 3e 63 6e 74 3e 31   && pLock->cnt>1
15360 20 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20 61 72   ){.    /* We ar
15370 65 20 74 72 79 69 6e 67 20 66 6f 72 20 61 6e 20  e trying for an 
15380 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 62  exclusive lock b
15390 75 74 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61  ut another threa
153a0 64 20 69 6e 20 74 68 69 73 0a 20 20 20 20 20 2a  d in this.     *
153b0 2a 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 69  * same process i
153c0 73 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20  s still holding 
153d0 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20 2a  a shared lock. *
153e0 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  /.    rc = SQLIT
153f0 45 5f 42 55 53 59 3b 0a 20 20 7d 65 6c 73 65 7b  E_BUSY;.  }else{
15400 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75  .    /* The requ
15410 65 73 74 20 77 61 73 20 66 6f 72 20 61 20 52 45  est was for a RE
15420 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53  SERVED or EXCLUS
15430 49 56 45 20 6c 6f 63 6b 2e 20 20 49 74 20 69 73  IVE lock.  It is
15440 0a 20 20 20 20 2a 2a 20 61 73 73 75 6d 65 64 20  .    ** assumed 
15450 74 68 61 74 20 74 68 65 72 65 20 69 73 20 61 20  that there is a 
15460 53 48 41 52 45 44 20 6f 72 20 67 72 65 61 74 65  SHARED or greate
15470 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69  r lock on the fi
15480 6c 65 0a 20 20 20 20 2a 2a 20 61 6c 72 65 61 64  le.    ** alread
15490 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e  y..    */.    in
154a0 74 20 66 61 69 6c 65 64 20 3d 20 30 3b 0a 20 20  t failed = 0;.  
154b0 20 20 61 73 73 65 72 74 28 20 30 21 3d 70 46 69    assert( 0!=pFi
154c0 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 29 3b 0a  le->locktype );.
154d0 20 20 20 20 69 66 20 28 6c 6f 63 6b 74 79 70 65      if (locktype
154e0 20 3e 3d 20 52 45 53 45 52 56 45 44 5f 4c 4f 43   >= RESERVED_LOC
154f0 4b 20 26 26 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  K && pFile->lock
15500 74 79 70 65 20 3c 20 52 45 53 45 52 56 45 44 5f  type < RESERVED_
15510 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 20 20 20 20  LOCK) {.        
15520 2f 2a 20 41 63 71 75 69 72 65 20 61 20 52 45 53  /* Acquire a RES
15530 45 52 56 45 44 20 6c 6f 63 6b 20 2a 2f 0a 20 20  ERVED lock */.  
15540 20 20 20 20 20 20 66 61 69 6c 65 64 20 3d 20 61        failed = a
15550 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78  fpSetLock(contex
15560 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65  t->dbPath, pFile
15570 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c  , RESERVED_BYTE,
15580 20 31 2c 31 29 3b 0a 20 20 20 20 20 20 69 66 28   1,1);.      if(
15590 20 21 66 61 69 6c 65 64 20 29 7b 0a 20 20 20 20   !failed ){.    
155a0 20 20 20 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73      context->res
155b0 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 20 20 20  erved = 1;.     
155c0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20   }.    }.    if 
155d0 28 21 66 61 69 6c 65 64 20 26 26 20 6c 6f 63 6b  (!failed && lock
155e0 74 79 70 65 20 3d 3d 20 45 58 43 4c 55 53 49 56  type == EXCLUSIV
155f0 45 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 20 20  E_LOCK) {.      
15600 2f 2a 20 41 63 71 75 69 72 65 20 61 6e 20 45 58  /* Acquire an EX
15610 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 2a 2f 0a  CLUSIVE lock */.
15620 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 2f          .      /
15630 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 73 68 61  * Remove the sha
15640 72 65 64 20 6c 6f 63 6b 20 62 65 66 6f 72 65 20  red lock before 
15650 74 72 79 69 6e 67 20 74 68 65 20 72 61 6e 67 65  trying the range
15660 2e 20 20 77 65 27 6c 6c 20 6e 65 65 64 20 74 6f  .  we'll need to
15670 20 0a 20 20 20 20 20 20 2a 2a 20 72 65 65 73 74   .      ** reest
15680 61 62 6c 69 73 68 20 74 68 65 20 73 68 61 72 65  ablish the share
15690 64 20 6c 6f 63 6b 20 69 66 20 77 65 20 63 61 6e  d lock if we can
156a0 27 74 20 67 65 74 20 74 68 65 20 20 61 66 70 55  't get the  afpU
156b0 6e 6c 6f 63 6b 0a 20 20 20 20 20 20 2a 2f 0a 20  nlock.      */. 
156c0 20 20 20 20 20 69 66 28 20 21 28 66 61 69 6c 65       if( !(faile
156d0 64 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63  d = afpSetLock(c
156e0 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20  ontext->dbPath, 
156f0 70 46 69 6c 65 2c 20 53 48 41 52 45 44 5f 46 49  pFile, SHARED_FI
15700 52 53 54 20 2b 0a 20 20 20 20 20 20 20 20 20 20  RST +.          
15710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
15720 4c 6f 63 6b 2d 3e 73 68 61 72 65 64 42 79 74 65  Lock->sharedByte
15730 2c 20 31 2c 20 30 29 29 20 29 7b 0a 20 20 20 20  , 1, 0)) ){.    
15740 20 20 20 20 69 6e 74 20 66 61 69 6c 65 64 32 20      int failed2 
15750 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
15760 20 20 20 20 20 2f 2a 20 6e 6f 77 20 61 74 74 65       /* now atte
15770 6d 6d 70 74 20 74 6f 20 67 65 74 20 74 68 65 20  mmpt to get the 
15780 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 72  exclusive lock r
15790 61 6e 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  ange */.        
157a0 66 61 69 6c 65 64 20 3d 20 61 66 70 53 65 74 4c  failed = afpSetL
157b0 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50  ock(context->dbP
157c0 61 74 68 2c 20 70 46 69 6c 65 2c 20 53 48 41 52  ath, pFile, SHAR
157d0 45 44 5f 46 49 52 53 54 2c 20 0a 20 20 20 20 20  ED_FIRST, .     
157e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
157f0 20 20 20 20 20 20 20 20 20 20 53 48 41 52 45 44            SHARED
15800 5f 53 49 5a 45 2c 20 31 29 3b 0a 20 20 20 20 20  _SIZE, 1);.     
15810 20 20 20 69 66 28 20 66 61 69 6c 65 64 20 26 26     if( failed &&
15820 20 28 66 61 69 6c 65 64 32 20 3d 20 61 66 70 53   (failed2 = afpS
15830 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
15840 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 0a  dbPath, pFile, .
15850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15860 20 20 20 20 20 20 20 53 48 41 52 45 44 5f 46 49         SHARED_FI
15870 52 53 54 20 2b 20 70 4c 6f 63 6b 2d 3e 73 68 61  RST + pLock->sha
15880 72 65 64 42 79 74 65 2c 20 31 2c 20 31 29 29 20  redByte, 1, 1)) 
15890 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
158a0 43 61 6e 27 74 20 72 65 65 73 74 61 62 6c 69 73  Can't reestablis
158b0 68 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63  h the shared loc
158c0 6b 2e 20 20 53 71 6c 69 74 65 20 63 61 6e 27 74  k.  Sqlite can't
158d0 20 64 65 61 6c 2c 20 74 68 69 73 20 69 73 0a 20   deal, this is. 
158e0 20 20 20 20 20 20 20 20 20 2a 2a 20 61 20 63 72           ** a cr
158f0 69 74 69 63 61 6c 20 49 2f 4f 20 65 72 72 6f 72  itical I/O error
15900 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
15910 20 20 20 20 20 20 20 20 72 63 20 3d 20 28 28 66          rc = ((f
15920 61 69 6c 65 64 20 26 20 53 51 4c 49 54 45 5f 49  ailed & SQLITE_I
15930 4f 45 52 52 29 20 3d 3d 20 53 51 4c 49 54 45 5f  OERR) == SQLITE_
15940 49 4f 45 52 52 29 20 3f 20 66 61 69 6c 65 64 32  IOERR) ? failed2
15950 20 3a 20 0a 20 20 20 20 20 20 20 20 20 20 20 20   : .            
15960 20 20 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f     SQLITE_IOERR_
15970 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  LOCK;.          
15980 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63  goto afp_end_loc
15990 6b 3b 0a 20 20 20 20 20 20 20 20 7d 20 0a 20 20  k;.        } .  
159a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
159b0 20 20 20 72 63 20 3d 20 66 61 69 6c 65 64 3b 20     rc = failed; 
159c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
159d0 20 20 20 69 66 28 20 66 61 69 6c 65 64 20 29 7b     if( failed ){
159e0 0a 20 20 20 20 20 20 72 63 20 3d 20 66 61 69 6c  .      rc = fail
159f0 65 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ed;.    }.  }.  
15a00 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
15a10 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c  E_OK ){.    pFil
15a20 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f  e->locktype = lo
15a30 63 6b 74 79 70 65 3b 0a 20 20 20 20 70 4c 6f 63  cktype;.    pLoc
15a40 6b 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f  k->locktype = lo
15a50 63 6b 74 79 70 65 3b 0a 20 20 7d 65 6c 73 65 20  cktype;.  }else 
15a60 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58  if( locktype==EX
15a70 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a  CLUSIVE_LOCK ){.
15a80 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74      pFile->lockt
15a90 79 70 65 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f  ype = PENDING_LO
15aa0 43 4b 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 6c  CK;.    pLock->l
15ab0 6f 63 6b 74 79 70 65 20 3d 20 50 45 4e 44 49 4e  ocktype = PENDIN
15ac0 47 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a 20 20 0a 61  G_LOCK;.  }.  .a
15ad0 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 75  fp_end_lock:.  u
15ae0 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
15af0 0a 20 20 4f 53 54 52 41 43 45 34 28 22 4c 4f 43  .  OSTRACE4("LOC
15b00 4b 20 20 20 20 25 64 20 25 73 20 25 73 20 28 61  K    %d %s %s (a
15b10 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  fp)\n", pFile->h
15b20 2c 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28 6c  , locktypeName(l
15b30 6f 63 6b 74 79 70 65 29 2c 20 0a 20 20 20 20 20  ocktype), .     
15b40 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f      rc==SQLITE_O
15b50 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c  K ? "ok" : "fail
15b60 65 64 22 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ed");.  return r
15b70 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65  c;.}../*.** Lowe
15b80 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  r the locking le
15b90 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63  vel on file desc
15ba0 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20  riptor pFile to 
15bb0 6c 6f 63 6b 74 79 70 65 2e 20 20 6c 6f 63 6b 74  locktype.  lockt
15bc0 79 70 65 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65  ype.** must be e
15bd0 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72  ither NO_LOCK or
15be0 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a   SHARED_LOCK..**
15bf0 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69  .** If the locki
15c00 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20  ng level of the 
15c10 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
15c20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72  is already at or
15c30 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65   below.** the re
15c40 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20  quested locking 
15c50 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74  level, this rout
15c60 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
15c70 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66  */.static int af
15c80 70 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  pUnlock(sqlite3_
15c90 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f  file *id, int lo
15ca0 63 6b 74 79 70 65 29 20 7b 0a 20 20 69 6e 74 20  cktype) {.  int 
15cb0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
15cc0 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
15cd0 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
15ce0 64 3b 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78  d;.  struct unix
15cf0 4c 6f 63 6b 49 6e 66 6f 20 2a 70 4c 6f 63 6b 3b  LockInfo *pLock;
15d00 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e  .  afpLockingCon
15d10 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 20 3d 20  text *context = 
15d20 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  (afpLockingConte
15d30 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63  xt *) pFile->loc
15d40 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 69  kingContext;.  i
15d50 6e 74 20 73 6b 69 70 53 68 61 72 65 64 20 3d 20  nt skipShared = 
15d60 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  0;.#ifdef SQLITE
15d70 5f 54 45 53 54 0a 20 20 69 6e 74 20 68 20 3d 20  _TEST.  int h = 
15d80 70 46 69 6c 65 2d 3e 68 3b 0a 23 65 6e 64 69 66  pFile->h;.#endif
15d90 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  ..  assert( pFil
15da0 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 37 28  e );.  OSTRACE7(
15db0 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77  "UNLOCK  %d %d w
15dc0 61 73 20 25 64 28 25 64 2c 25 64 29 20 70 69 64  as %d(%d,%d) pid
15dd0 3d 25 64 20 28 61 66 70 29 5c 6e 22 2c 20 70 46  =%d (afp)\n", pF
15de0 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70 65  ile->h, locktype
15df0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69  ,.           pFi
15e00 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 70 46  le->locktype, pF
15e10 69 6c 65 2d 3e 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b  ile->pLock->lock
15e20 74 79 70 65 2c 20 70 46 69 6c 65 2d 3e 70 4c 6f  type, pFile->pLo
15e30 63 6b 2d 3e 63 6e 74 2c 20 67 65 74 70 69 64 28  ck->cnt, getpid(
15e40 29 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6c  ));..  assert( l
15e50 6f 63 6b 74 79 70 65 3c 3d 53 48 41 52 45 44 5f  ocktype<=SHARED_
15e60 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70 46  LOCK );.  if( pF
15e70 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3c 3d 6c  ile->locktype<=l
15e80 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 72  ocktype ){.    r
15e90 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
15ea0 0a 20 20 7d 0a 20 20 69 66 28 20 43 48 45 43 4b  .  }.  if( CHECK
15eb0 5f 54 48 52 45 41 44 49 44 28 70 46 69 6c 65 29  _THREADID(pFile)
15ec0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
15ed0 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
15ee0 54 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 45 6e 74  T;.  }.  unixEnt
15ef0 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 70 4c 6f  erMutex();.  pLo
15f00 63 6b 20 3d 20 70 46 69 6c 65 2d 3e 70 4c 6f 63  ck = pFile->pLoc
15f10 6b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 6f  k;.  assert( pLo
15f20 63 6b 2d 3e 63 6e 74 21 3d 30 20 29 3b 0a 20 20  ck->cnt!=0 );.  
15f30 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  if( pFile->lockt
15f40 79 70 65 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ype>SHARED_LOCK 
15f50 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
15f60 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d  Lock->locktype==
15f70 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20  pFile->locktype 
15f80 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49  );.    SimulateI
15f90 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b  OErrorBenign(1);
15fa0 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  .    SimulateIOE
15fb0 72 72 6f 72 28 20 68 3d 28 2d 31 29 20 29 0a 20  rror( h=(-1) ). 
15fc0 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
15fd0 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20  orBenign(0);.   
15fe0 20 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47   .#ifndef NDEBUG
15ff0 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 72 65 64  .    /* When red
16000 75 63 69 6e 67 20 61 20 6c 6f 63 6b 20 73 75 63  ucing a lock suc
16010 68 20 74 68 61 74 20 6f 74 68 65 72 20 70 72 6f  h that other pro
16020 63 65 73 73 65 73 20 63 61 6e 20 73 74 61 72 74  cesses can start
16030 0a 20 20 20 20 2a 2a 20 72 65 61 64 69 6e 67 20  .    ** reading 
16040 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
16050 65 20 61 67 61 69 6e 2c 20 6d 61 6b 65 20 73 75  e again, make su
16060 72 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20  re that the.    
16070 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  ** transaction c
16080 6f 75 6e 74 65 72 20 77 61 73 20 75 70 64 61 74  ounter was updat
16090 65 64 20 69 66 20 61 6e 79 20 70 61 72 74 20 6f  ed if any part o
160a0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20  f the database. 
160b0 20 20 20 2a 2a 20 66 69 6c 65 20 63 68 61 6e 67     ** file chang
160c0 65 64 2e 20 20 49 66 20 74 68 65 20 74 72 61 6e  ed.  If the tran
160d0 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20  saction counter 
160e0 69 73 20 6e 6f 74 20 75 70 64 61 74 65 64 2c 0a  is not updated,.
160f0 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 63 6f 6e      ** other con
16100 6e 65 63 74 69 6f 6e 73 20 74 6f 20 74 68 65 20  nections to the 
16110 73 61 6d 65 20 66 69 6c 65 20 6d 69 67 68 74 20  same file might 
16120 6e 6f 74 20 72 65 61 6c 69 7a 65 20 74 68 61 74  not realize that
16130 0a 20 20 20 20 2a 2a 20 74 68 65 20 66 69 6c 65  .    ** the file
16140 20 68 61 73 20 63 68 61 6e 67 65 64 20 61 6e 64   has changed and
16150 20 68 65 6e 63 65 20 6d 69 67 68 74 20 6e 6f 74   hence might not
16160 20 6b 6e 6f 77 20 74 6f 20 66 6c 75 73 68 20 74   know to flush t
16170 68 65 69 72 0a 20 20 20 20 2a 2a 20 63 61 63 68  heir.    ** cach
16180 65 2e 20 20 54 68 65 20 75 73 65 20 6f 66 20 61  e.  The use of a
16190 20 73 74 61 6c 65 20 63 61 63 68 65 20 63 61 6e   stale cache can
161a0 20 6c 65 61 64 20 74 6f 20 64 61 74 61 62 61 73   lead to databas
161b0 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20  e corruption..  
161c0 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
161d0 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c   pFile->inNormal
161e0 57 72 69 74 65 3d 3d 30 0a 20 20 20 20 20 20 20  Write==0.       
161f0 20 20 20 20 7c 7c 20 70 46 69 6c 65 2d 3e 64 62      || pFile->db
16200 55 70 64 61 74 65 3d 3d 30 0a 20 20 20 20 20 20  Update==0.      
16210 20 20 20 20 20 7c 7c 20 70 46 69 6c 65 2d 3e 74       || pFile->t
16220 72 61 6e 73 43 6e 74 72 43 68 6e 67 3d 3d 31 20  ransCntrChng==1 
16230 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 69 6e  );.    pFile->in
16240 4e 6f 72 6d 61 6c 57 72 69 74 65 20 3d 20 30 3b  NormalWrite = 0;
16250 0a 23 65 6e 64 69 66 0a 20 20 20 20 0a 20 20 20  .#endif.    .   
16260 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b   if( pFile->lock
16270 74 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f  type==EXCLUSIVE_
16280 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  LOCK ){.      rc
16290 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f   = afpSetLock(co
162a0 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70  ntext->dbPath, p
162b0 46 69 6c 65 2c 20 53 48 41 52 45 44 5f 46 49 52  File, SHARED_FIR
162c0 53 54 2c 20 53 48 41 52 45 44 5f 53 49 5a 45 2c  ST, SHARED_SIZE,
162d0 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   0);.      if( r
162e0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
162f0 28 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45  (locktype==SHARE
16300 44 5f 4c 4f 43 4b 20 7c 7c 20 70 4c 6f 63 6b 2d  D_LOCK || pLock-
16310 3e 63 6e 74 3e 31 29 20 29 7b 0a 20 20 20 20 20  >cnt>1) ){.     
16320 20 20 20 2f 2a 20 6f 6e 6c 79 20 72 65 2d 65 73     /* only re-es
16330 74 61 62 6c 69 73 68 20 74 68 65 20 73 68 61 72  tablish the shar
16340 65 64 20 6c 6f 63 6b 20 69 66 20 6e 65 63 65 73  ed lock if neces
16350 73 61 72 79 20 2a 2f 0a 20 20 20 20 20 20 20 20  sary */.        
16360 69 6e 74 20 73 68 61 72 65 64 4c 6f 63 6b 42 79  int sharedLockBy
16370 74 65 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53  te = SHARED_FIRS
16380 54 2b 70 4c 6f 63 6b 2d 3e 73 68 61 72 65 64 42  T+pLock->sharedB
16390 79 74 65 3b 0a 20 20 20 20 20 20 20 20 72 63 20  yte;.        rc 
163a0 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e  = afpSetLock(con
163b0 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46  text->dbPath, pF
163c0 69 6c 65 2c 20 73 68 61 72 65 64 4c 6f 63 6b 42  ile, sharedLockB
163d0 79 74 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20  yte, 1, 1);.    
163e0 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
163f0 20 20 20 73 6b 69 70 53 68 61 72 65 64 20 3d 20     skipShared = 
16400 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
16410 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
16420 49 54 45 5f 4f 4b 20 26 26 20 70 46 69 6c 65 2d  ITE_OK && pFile-
16430 3e 6c 6f 63 6b 74 79 70 65 3e 3d 50 45 4e 44 49  >locktype>=PENDI
16440 4e 47 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20  NG_LOCK ){.     
16450 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b   rc = afpSetLock
16460 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
16470 2c 20 70 46 69 6c 65 2c 20 50 45 4e 44 49 4e 47  , pFile, PENDING
16480 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20  _BYTE, 1, 0);.  
16490 20 20 7d 20 0a 20 20 20 20 69 66 28 20 72 63 3d    } .    if( rc=
164a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 46  =SQLITE_OK && pF
164b0 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 52  ile->locktype>=R
164c0 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20  ESERVED_LOCK && 
164d0 63 6f 6e 74 65 78 74 2d 3e 72 65 73 65 72 76 65  context->reserve
164e0 64 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  d ){.      rc = 
164f0 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  afpSetLock(conte
16500 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  xt->dbPath, pFil
16510 65 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45  e, RESERVED_BYTE
16520 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  , 1, 0);.      i
16530 66 28 20 21 72 63 20 29 7b 20 0a 20 20 20 20 20  f( !rc ){ .     
16540 20 20 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73 65     context->rese
16550 72 76 65 64 20 3d 20 30 3b 20 0a 20 20 20 20 20  rved = 0; .     
16560 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
16570 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
16580 26 20 28 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41  & (locktype==SHA
16590 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 4c 6f 63  RED_LOCK || pLoc
165a0 6b 2d 3e 63 6e 74 3e 31 29 29 7b 0a 20 20 20 20  k->cnt>1)){.    
165b0 20 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70    pLock->locktyp
165c0 65 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b  e = SHARED_LOCK;
165d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
165e0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
165f0 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c  & locktype==NO_L
16600 4f 43 4b 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 44  OCK ){..    /* D
16610 65 63 72 65 6d 65 6e 74 20 74 68 65 20 73 68 61  ecrement the sha
16620 72 65 64 20 6c 6f 63 6b 20 63 6f 75 6e 74 65 72  red lock counter
16630 2e 20 20 52 65 6c 65 61 73 65 20 74 68 65 20 6c  .  Release the l
16640 6f 63 6b 20 75 73 69 6e 67 20 61 6e 0a 20 20 20  ock using an.   
16650 20 2a 2a 20 4f 53 20 63 61 6c 6c 20 6f 6e 6c 79   ** OS call only
16660 20 77 68 65 6e 20 61 6c 6c 20 74 68 72 65 61 64   when all thread
16670 73 20 69 6e 20 74 68 69 73 20 73 61 6d 65 20 70  s in this same p
16680 72 6f 63 65 73 73 20 68 61 76 65 20 72 65 6c 65  rocess have rele
16690 61 73 65 64 0a 20 20 20 20 2a 2a 20 74 68 65 20  ased.    ** the 
166a0 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  lock..    */.   
166b0 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c   unsigned long l
166c0 6f 6e 67 20 73 68 61 72 65 64 4c 6f 63 6b 42 79  ong sharedLockBy
166d0 74 65 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53  te = SHARED_FIRS
166e0 54 2b 70 4c 6f 63 6b 2d 3e 73 68 61 72 65 64 42  T+pLock->sharedB
166f0 79 74 65 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e  yte;.    pLock->
16700 63 6e 74 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70  cnt--;.    if( p
16710 4c 6f 63 6b 2d 3e 63 6e 74 3d 3d 30 20 29 7b 0a  Lock->cnt==0 ){.
16720 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
16730 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a  ErrorBenign(1);.
16740 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
16750 45 72 72 6f 72 28 20 68 3d 28 2d 31 29 20 29 0a  Error( h=(-1) ).
16760 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
16770 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a  ErrorBenign(0);.
16780 20 20 20 20 20 20 69 66 28 20 21 73 6b 69 70 53        if( !skipS
16790 68 61 72 65 64 20 29 7b 0a 20 20 20 20 20 20 20  hared ){.       
167a0 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b   rc = afpSetLock
167b0 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
167c0 2c 20 70 46 69 6c 65 2c 20 73 68 61 72 65 64 4c  , pFile, sharedL
167d0 6f 63 6b 42 79 74 65 2c 20 31 2c 20 30 29 3b 0a  ockByte, 1, 0);.
167e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
167f0 28 20 21 72 63 20 29 7b 0a 20 20 20 20 20 20 20  ( !rc ){.       
16800 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65   pLock->locktype
16810 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20   = NO_LOCK;.    
16820 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74      pFile->lockt
16830 79 70 65 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20  ype = NO_LOCK;. 
16840 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
16850 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
16860 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 74 72 75  OK ){.      stru
16870 63 74 20 75 6e 69 78 4f 70 65 6e 43 6e 74 20 2a  ct unixOpenCnt *
16880 70 4f 70 65 6e 20 3d 20 70 46 69 6c 65 2d 3e 70  pOpen = pFile->p
16890 4f 70 65 6e 3b 0a 20 20 20 20 20 20 20 20 0a 20  Open;.        . 
168a0 20 20 20 20 20 70 4f 70 65 6e 2d 3e 6e 4c 6f 63       pOpen->nLoc
168b0 6b 2d 2d 3b 0a 20 20 20 20 20 20 61 73 73 65 72  k--;.      asser
168c0 74 28 20 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 3e  t( pOpen->nLock>
168d0 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
168e0 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20  pOpen->nLock==0 
168f0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
16900 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64 73 28  closePendingFds(
16910 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 7d 0a  pFile);.      }.
16920 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 75      }.  }.  .  u
16930 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
16940 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
16950 45 5f 4f 4b 20 29 20 70 46 69 6c 65 2d 3e 6c 6f  E_OK ) pFile->lo
16960 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70  cktype = locktyp
16970 65 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  e;.  return rc;.
16980 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
16990 20 66 69 6c 65 20 26 20 63 6c 65 61 6e 75 70 20   file & cleanup 
169a0 41 46 50 20 73 70 65 63 69 66 69 63 20 6c 6f 63  AFP specific loc
169b0 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 0a 2a 2f  king context .*/
169c0 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66 70 43  .static int afpC
169d0 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  lose(sqlite3_fil
169e0 65 20 2a 69 64 29 20 7b 0a 20 20 69 6e 74 20 72  e *id) {.  int r
169f0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
16a00 20 69 66 28 20 69 64 20 29 7b 0a 20 20 20 20 75   if( id ){.    u
16a10 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
16a20 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
16a30 20 20 20 20 61 66 70 55 6e 6c 6f 63 6b 28 69 64      afpUnlock(id
16a40 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  , NO_LOCK);.    
16a50 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
16a60 3b 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d  ;.    if( pFile-
16a70 3e 70 4f 70 65 6e 20 26 26 20 70 46 69 6c 65 2d  >pOpen && pFile-
16a80 3e 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 20 29 7b  >pOpen->nLock ){
16a90 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
16aa0 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69  re are outstandi
16ab0 6e 67 20 6c 6f 63 6b 73 2c 20 64 6f 20 6e 6f 74  ng locks, do not
16ac0 20 61 63 74 75 61 6c 6c 79 20 63 6c 6f 73 65 20   actually close 
16ad0 74 68 65 20 66 69 6c 65 20 6a 75 73 74 0a 20 20  the file just.  
16ae0 20 20 20 20 2a 2a 20 79 65 74 20 62 65 63 61 75      ** yet becau
16af0 73 65 20 74 68 61 74 20 77 6f 75 6c 64 20 63 6c  se that would cl
16b00 65 61 72 20 74 68 6f 73 65 20 6c 6f 63 6b 73 2e  ear those locks.
16b10 20 20 49 6e 73 74 65 61 64 2c 20 61 64 64 20 74    Instead, add t
16b20 68 65 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a  he file.      **
16b30 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 70   descriptor to p
16b40 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 2e 20  Open->aPending. 
16b50 20 49 74 20 77 69 6c 6c 20 62 65 20 61 75 74 6f   It will be auto
16b60 6d 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65 64  matically closed
16b70 20 77 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 74   when.      ** t
16b80 68 65 20 6c 61 73 74 20 6c 6f 63 6b 20 69 73 20  he last lock is 
16b90 63 6c 65 61 72 65 64 2e 0a 20 20 20 20 20 20 2a  cleared..      *
16ba0 2f 0a 20 20 20 20 20 20 73 65 74 50 65 6e 64 69  /.      setPendi
16bb0 6e 67 46 64 28 70 46 69 6c 65 29 3b 0a 20 20 20  ngFd(pFile);.   
16bc0 20 7d 0a 20 20 20 20 72 65 6c 65 61 73 65 4c 6f   }.    releaseLo
16bd0 63 6b 49 6e 66 6f 28 70 46 69 6c 65 2d 3e 70 4c  ckInfo(pFile->pL
16be0 6f 63 6b 29 3b 0a 20 20 20 20 72 65 6c 65 61 73  ock);.    releas
16bf0 65 4f 70 65 6e 43 6e 74 28 70 46 69 6c 65 2d 3e  eOpenCnt(pFile->
16c00 70 4f 70 65 6e 29 3b 0a 20 20 20 20 73 71 6c 69  pOpen);.    sqli
16c10 74 65 33 5f 66 72 65 65 28 70 46 69 6c 65 2d 3e  te3_free(pFile->
16c20 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3b  lockingContext);
16c30 0a 20 20 20 20 72 63 20 3d 20 63 6c 6f 73 65 55  .    rc = closeU
16c40 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 20 20 20  nixFile(id);.   
16c50 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
16c60 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
16c70 72 63 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a  rc;.}..#endif /*
16c80 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
16c90 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  __) && SQLITE_EN
16ca0 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
16cb0 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68 65 20  LE */./*.** The 
16cc0 63 6f 64 65 20 61 62 6f 76 65 20 69 73 20 74 68  code above is th
16cd0 65 20 41 46 50 20 6c 6f 63 6b 20 69 6d 70 6c 65  e AFP lock imple
16ce0 6d 65 6e 74 61 74 69 6f 6e 2e 20 20 54 68 65 20  mentation.  The 
16cf0 63 6f 64 65 20 69 73 20 73 70 65 63 69 66 69 63  code is specific
16d00 0a 2a 2a 20 74 6f 20 4d 61 63 4f 53 58 20 61 6e  .** to MacOSX an
16d10 64 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20  d does not work 
16d20 6f 6e 20 6f 74 68 65 72 20 75 6e 69 78 20 70 6c  on other unix pl
16d30 61 74 66 6f 72 6d 73 2e 20 20 4e 6f 20 61 6c 74  atforms.  No alt
16d40 65 72 6e 61 74 69 76 65 0a 2a 2a 20 69 73 20 61  ernative.** is a
16d50 76 61 69 6c 61 62 6c 65 2e 20 20 49 66 20 79 6f  vailable.  If yo
16d60 75 20 64 6f 6e 27 74 20 63 6f 6d 70 69 6c 65 20  u don't compile 
16d70 66 6f 72 20 61 20 6d 61 63 2c 20 74 68 65 6e 20  for a mac, then 
16d80 74 68 65 20 22 75 6e 69 78 2d 61 66 70 22 0a 2a  the "unix-afp".*
16d90 2a 20 56 46 53 20 69 73 20 6e 6f 74 20 61 76 61  * VFS is not ava
16da0 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a  ilable..**.*****
16db0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16dc0 20 45 6e 64 20 6f 66 20 74 68 65 20 41 46 50 20   End of the AFP 
16dd0 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74  lock implementat
16de0 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ion ************
16df0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
16e00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16e10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16e20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16e30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16e40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a  *********/../***
16e50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16e60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16e70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16e80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16e90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
16ea0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16eb0 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 4e 46  ******* Begin NF
16ec0 53 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a  S Locking ******
16ed0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16ee0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 23 69 66  **********/..#if
16ef0 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
16f00 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  __) && SQLITE_EN
16f10 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
16f20 4c 45 0a 2f 2a 0a 20 2a 2a 20 4c 6f 77 65 72 20  LE./*. ** Lower 
16f30 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
16f40 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69  l on file descri
16f50 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 6c 6f  ptor pFile to lo
16f60 63 6b 74 79 70 65 2e 20 20 6c 6f 63 6b 74 79 70  cktype.  locktyp
16f70 65 0a 20 2a 2a 20 6d 75 73 74 20 62 65 20 65 69  e. ** must be ei
16f80 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20  ther NO_LOCK or 
16f90 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 20 2a 2a  SHARED_LOCK.. **
16fa0 0a 20 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b  . ** If the lock
16fb0 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65  ing level of the
16fc0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
16fd0 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f   is already at o
16fe0 72 20 62 65 6c 6f 77 0a 20 2a 2a 20 74 68 65 20  r below. ** the 
16ff0 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e  requested lockin
17000 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f  g level, this ro
17010 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
17020 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  .. */.static int
17030 20 6e 66 73 55 6e 6c 6f 63 6b 28 73 71 6c 69 74   nfsUnlock(sqlit
17040 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
17050 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 72 65   locktype){.  re
17060 74 75 72 6e 20 5f 70 6f 73 69 78 55 6e 6c 6f 63  turn _posixUnloc
17070 6b 28 69 64 2c 20 6c 6f 63 6b 74 79 70 65 2c 20  k(id, locktype, 
17080 31 29 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a  1);.}..#endif /*
17090 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
170a0 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  __) && SQLITE_EN
170b0 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
170c0 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68 65 20  LE */./*.** The 
170d0 63 6f 64 65 20 61 62 6f 76 65 20 69 73 20 74 68  code above is th
170e0 65 20 4e 46 53 20 6c 6f 63 6b 20 69 6d 70 6c 65  e NFS lock imple
170f0 6d 65 6e 74 61 74 69 6f 6e 2e 20 20 54 68 65 20  mentation.  The 
17100 63 6f 64 65 20 69 73 20 73 70 65 63 69 66 69 63  code is specific
17110 0a 2a 2a 20 74 6f 20 4d 61 63 4f 53 58 20 61 6e  .** to MacOSX an
17120 64 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20  d does not work 
17130 6f 6e 20 6f 74 68 65 72 20 75 6e 69 78 20 70 6c  on other unix pl
17140 61 74 66 6f 72 6d 73 2e 20 20 4e 6f 20 61 6c 74  atforms.  No alt
17150 65 72 6e 61 74 69 76 65 0a 2a 2a 20 69 73 20 61  ernative.** is a
17160 76 61 69 6c 61 62 6c 65 2e 20 20 0a 2a 2a 0a 2a  vailable.  .**.*
17170 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17180 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20  **** End of the 
17190 4e 46 53 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65  NFS lock impleme
171a0 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a  ntation ********
171b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
171c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
171d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
171e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
171f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17200 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
17210 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
17220 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17230 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17240 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17250 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
17260 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17270 20 4e 6f 6e 2d 6c 6f 63 6b 69 6e 67 20 73 71 6c   Non-locking sql
17280 69 74 65 33 5f 66 69 6c 65 20 6d 65 74 68 6f 64  ite3_file method
17290 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  s **************
172a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
172b0 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 78 74 20 64  **.** The next d
172c0 69 76 69 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73  ivision contains
172d0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73   implementations
172e0 20 66 6f 72 20 61 6c 6c 20 6d 65 74 68 6f 64 73   for all methods
172f0 20 6f 66 20 74 68 65 20 0a 2a 2a 20 73 71 6c 69   of the .** sqli
17300 74 65 33 5f 66 69 6c 65 20 6f 62 6a 65 63 74 20  te3_file object 
17310 6f 74 68 65 72 20 74 68 61 6e 20 74 68 65 20 6c  other than the l
17320 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73 2e 20  ocking methods. 
17330 20 54 68 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20   The locking.** 
17340 6d 65 74 68 6f 64 73 20 77 65 72 65 20 64 65 66  methods were def
17350 69 6e 65 64 20 69 6e 20 64 69 76 69 73 69 6f 6e  ined in division
17360 73 20 61 62 6f 76 65 20 28 6f 6e 65 20 6c 6f 63  s above (one loc
17370 6b 69 6e 67 20 6d 65 74 68 6f 64 20 70 65 72 0a  king method per.
17380 2a 2a 20 64 69 76 69 73 69 6f 6e 29 2e 20 20 54  ** division).  T
17390 68 6f 73 65 20 6d 65 74 68 6f 64 73 20 74 68 61  hose methods tha
173a0 74 20 61 72 65 20 63 6f 6d 6d 6f 6e 20 74 6f 20  t are common to 
173b0 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65  all locking mode
173c0 73 0a 2a 2a 20 61 72 65 20 67 61 74 68 65 72 20  s.** are gather 
173d0 74 6f 67 65 74 68 65 72 20 69 6e 74 6f 20 74 68  together into th
173e0 69 73 20 64 69 76 69 73 69 6f 6e 2e 0a 2a 2f 0a  is division..*/.
173f0 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74 6f 20 74  ./*.** Seek to t
17400 68 65 20 6f 66 66 73 65 74 20 70 61 73 73 65 64  he offset passed
17410 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
17420 72 67 75 6d 65 6e 74 2c 20 74 68 65 6e 20 72 65  rgument, then re
17430 61 64 20 63 6e 74 20 0a 2a 2a 20 62 79 74 65 73  ad cnt .** bytes
17440 20 69 6e 74 6f 20 70 42 75 66 2e 20 52 65 74 75   into pBuf. Retu
17450 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
17460 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20   bytes actually 
17470 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 4e 42 3a 20  read..**.** NB: 
17480 20 49 66 20 79 6f 75 20 64 65 66 69 6e 65 20 55   If you define U
17490 53 45 5f 50 52 45 41 44 20 6f 72 20 55 53 45 5f  SE_PREAD or USE_
174a0 50 52 45 41 44 36 34 2c 20 74 68 65 6e 20 69 74  PREAD64, then it
174b0 20 6d 69 67 68 74 20 61 6c 73 6f 0a 2a 2a 20 62   might also.** b
174c0 65 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 64  e necessary to d
174d0 65 66 69 6e 65 20 5f 58 4f 50 45 4e 5f 53 4f 55  efine _XOPEN_SOU
174e0 52 43 45 20 74 6f 20 62 65 20 35 30 30 2e 20 20  RCE to be 500.  
174f0 54 68 69 73 20 76 61 72 69 65 73 20 66 72 6f 6d  This varies from
17500 0a 2a 2a 20 6f 6e 65 20 73 79 73 74 65 6d 20 74  .** one system t
17510 6f 20 61 6e 6f 74 68 65 72 2e 20 20 53 69 6e 63  o another.  Sinc
17520 65 20 53 51 4c 69 74 65 20 64 6f 65 73 20 6e 6f  e SQLite does no
17530 74 20 64 65 66 69 6e 65 20 55 53 45 5f 50 52 45  t define USE_PRE
17540 41 44 0a 2a 2a 20 61 6e 79 20 61 6e 79 20 66 6f  AD.** any any fo
17550 72 6d 20 62 79 20 64 65 66 61 75 6c 74 2c 20 77  rm by default, w
17560 65 20 77 69 6c 6c 20 6e 6f 74 20 61 74 74 65 6d  e will not attem
17570 70 74 20 74 6f 20 64 65 66 69 6e 65 20 5f 58 4f  pt to define _XO
17580 50 45 4e 5f 53 4f 55 52 43 45 2e 0a 2a 2a 20 53  PEN_SOURCE..** S
17590 65 65 20 74 69 63 6b 65 74 73 20 23 32 37 34 31  ee tickets #2741
175a0 20 61 6e 64 20 23 32 36 38 31 2e 0a 2a 2a 0a 2a   and #2681..**.*
175b0 2a 20 54 6f 20 61 76 6f 69 64 20 73 74 6f 6d 70  * To avoid stomp
175c0 69 6e 67 20 74 68 65 20 65 72 72 6e 6f 20 76 61  ing the errno va
175d0 6c 75 65 20 6f 6e 20 61 20 66 61 69 6c 65 64 20  lue on a failed 
175e0 72 65 61 64 20 74 68 65 20 6c 61 73 74 45 72 72  read the lastErr
175f0 6e 6f 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73  no value.** is s
17600 65 74 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  et before return
17610 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ing..*/.static i
17620 6e 74 20 73 65 65 6b 41 6e 64 52 65 61 64 28 75  nt seekAndRead(u
17630 6e 69 78 46 69 6c 65 20 2a 69 64 2c 20 73 71 6c  nixFile *id, sql
17640 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66 73 65  ite3_int64 offse
17650 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 69  t, void *pBuf, i
17660 6e 74 20 63 6e 74 29 7b 0a 20 20 69 6e 74 20 67  nt cnt){.  int g
17670 6f 74 3b 0a 23 69 66 20 28 21 64 65 66 69 6e 65  ot;.#if (!define
17680 64 28 55 53 45 5f 50 52 45 41 44 29 20 26 26 20  d(USE_PREAD) && 
17690 21 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45  !defined(USE_PRE
176a0 41 44 36 34 29 29 0a 20 20 69 36 34 20 6e 65 77  AD64)).  i64 new
176b0 4f 66 66 73 65 74 3b 0a 23 65 6e 64 69 66 0a 20  Offset;.#endif. 
176c0 20 54 49 4d 45 52 5f 53 54 41 52 54 3b 0a 23 69   TIMER_START;.#i
176d0 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52  f defined(USE_PR
176e0 45 41 44 29 0a 20 20 67 6f 74 20 3d 20 70 72 65  EAD).  got = pre
176f0 61 64 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20  ad(id->h, pBuf, 
17700 63 6e 74 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20  cnt, offset);.  
17710 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
17720 20 67 6f 74 20 3d 20 2d 31 20 29 3b 0a 23 65 6c   got = -1 );.#el
17730 69 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50  if defined(USE_P
17740 52 45 41 44 36 34 29 0a 20 20 67 6f 74 20 3d 20  READ64).  got = 
17750 70 72 65 61 64 36 34 28 69 64 2d 3e 68 2c 20 70  pread64(id->h, p
17760 42 75 66 2c 20 63 6e 74 2c 20 6f 66 66 73 65 74  Buf, cnt, offset
17770 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  );.  SimulateIOE
17780 72 72 6f 72 28 20 67 6f 74 20 3d 20 2d 31 20 29  rror( got = -1 )
17790 3b 0a 23 65 6c 73 65 0a 20 20 6e 65 77 4f 66 66  ;.#else.  newOff
177a0 73 65 74 20 3d 20 6c 73 65 65 6b 28 69 64 2d 3e  set = lseek(id->
177b0 68 2c 20 6f 66 66 73 65 74 2c 20 53 45 45 4b 5f  h, offset, SEEK_
177c0 53 45 54 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65  SET);.  Simulate
177d0 49 4f 45 72 72 6f 72 28 20 6e 65 77 4f 66 66 73  IOError( newOffs
177e0 65 74 2d 2d 20 29 3b 0a 20 20 69 66 28 20 6e 65  et-- );.  if( ne
177f0 77 4f 66 66 73 65 74 21 3d 6f 66 66 73 65 74 20  wOffset!=offset 
17800 29 7b 0a 20 20 20 20 69 66 28 20 6e 65 77 4f 66  ){.    if( newOf
17810 66 73 65 74 20 3d 3d 20 2d 31 20 29 7b 0a 20 20  fset == -1 ){.  
17820 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29      ((unixFile*)
17830 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  id)->lastErrno =
17840 20 65 72 72 6e 6f 3b 0a 20 20 20 20 7d 65 6c 73   errno;.    }els
17850 65 7b 0a 20 20 20 20 20 20 28 28 75 6e 69 78 46  e{.      ((unixF
17860 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72  ile*)id)->lastEr
17870 72 6e 6f 20 3d 20 30 3b 09 09 09 0a 20 20 20 20  rno = 0;....    
17880 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b  }.    return -1;
17890 0a 20 20 7d 0a 20 20 67 6f 74 20 3d 20 72 65 61  .  }.  got = rea
178a0 64 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63  d(id->h, pBuf, c
178b0 6e 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20 54 49  nt);.#endif.  TI
178c0 4d 45 52 5f 45 4e 44 3b 0a 20 20 69 66 28 20 67  MER_END;.  if( g
178d0 6f 74 3c 30 20 29 7b 0a 20 20 20 20 28 28 75 6e  ot<0 ){.    ((un
178e0 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73  ixFile*)id)->las
178f0 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
17900 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 35 28 22    }.  OSTRACE5("
17910 52 45 41 44 20 20 20 20 25 2d 33 64 20 25 35 64  READ    %-3d %5d
17920 20 25 37 6c 6c 64 20 25 6c 6c 75 5c 6e 22 2c 20   %7lld %llu\n", 
17930 69 64 2d 3e 68 2c 20 67 6f 74 2c 20 6f 66 66 73  id->h, got, offs
17940 65 74 2c 20 54 49 4d 45 52 5f 45 4c 41 50 53 45  et, TIMER_ELAPSE
17950 44 29 3b 0a 20 20 72 65 74 75 72 6e 20 67 6f 74  D);.  return got
17960 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  ;.}../*.** Read 
17970 64 61 74 61 20 66 72 6f 6d 20 61 20 66 69 6c 65  data from a file
17980 20 69 6e 74 6f 20 61 20 62 75 66 66 65 72 2e 20   into a buffer. 
17990 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
179a0 4b 20 69 66 20 61 6c 6c 0a 2a 2a 20 62 79 74 65  K if all.** byte
179b0 73 20 77 65 72 65 20 72 65 61 64 20 73 75 63 63  s were read succ
179c0 65 73 73 66 75 6c 6c 79 20 61 6e 64 20 53 51 4c  essfully and SQL
179d0 49 54 45 5f 49 4f 45 52 52 20 69 66 20 61 6e 79  ITE_IOERR if any
179e0 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72  thing goes.** wr
179f0 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ong..*/.static i
17a00 6e 74 20 75 6e 69 78 52 65 61 64 28 0a 20 20 73  nt unixRead(.  s
17a10 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
17a20 20 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20   .  void *pBuf, 
17a30 0a 20 20 69 6e 74 20 61 6d 74 2c 0a 20 20 73 71  .  int amt,.  sq
17a40 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66 73  lite3_int64 offs
17a50 65 74 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65  et.){.  unixFile
17a60 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
17a70 69 6c 65 20 2a 29 69 64 3b 0a 20 20 69 6e 74 20  ile *)id;.  int 
17a80 67 6f 74 3b 0a 20 20 61 73 73 65 72 74 28 20 69  got;.  assert( i
17a90 64 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  d );..  /* If th
17aa0 69 73 20 69 73 20 61 20 64 61 74 61 62 61 73 65  is is a database
17ab0 20 66 69 6c 65 20 28 6e 6f 74 20 61 20 6a 6f 75   file (not a jou
17ac0 72 6e 61 6c 2c 20 6d 61 73 74 65 72 2d 6a 6f 75  rnal, master-jou
17ad0 72 6e 61 6c 20 6f 72 20 74 65 6d 70 0a 20 20 2a  rnal or temp.  *
17ae0 2a 20 66 69 6c 65 29 2c 20 74 68 65 20 62 79 74  * file), the byt
17af0 65 73 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e  es in the lockin
17b00 67 20 72 61 6e 67 65 20 73 68 6f 75 6c 64 20 6e  g range should n
17b10 65 76 65 72 20 62 65 20 72 65 61 64 20 6f 72 20  ever be read or 
17b20 77 72 69 74 74 65 6e 2e 20 2a 2f 0a 23 69 66 20  written. */.#if 
17b30 30 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  0.  assert( pFil
17b40 65 2d 3e 70 55 6e 75 73 65 64 3d 3d 30 0a 20 20  e->pUnused==0.  
17b50 20 20 20 20 20 7c 7c 20 6f 66 66 73 65 74 3e 3d       || offset>=
17b60 50 45 4e 44 49 4e 47 5f 42 59 54 45 2b 35 31 32  PENDING_BYTE+512
17b70 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66 66 73 65  .       || offse
17b80 74 2b 61 6d 74 3c 3d 50 45 4e 44 49 4e 47 5f 42  t+amt<=PENDING_B
17b90 59 54 45 20 0a 20 20 29 3b 0a 23 65 6e 64 69 66  YTE .  );.#endif
17ba0 0a 0a 20 20 67 6f 74 20 3d 20 73 65 65 6b 41 6e  ..  got = seekAn
17bb0 64 52 65 61 64 28 70 46 69 6c 65 2c 20 6f 66 66  dRead(pFile, off
17bc0 73 65 74 2c 20 70 42 75 66 2c 20 61 6d 74 29 3b  set, pBuf, amt);
17bd0 0a 20 20 69 66 28 20 67 6f 74 3d 3d 61 6d 74 20  .  if( got==amt 
17be0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
17bf0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65  LITE_OK;.  }else
17c00 20 69 66 28 20 67 6f 74 3c 30 20 29 7b 0a 20 20   if( got<0 ){.  
17c10 20 20 2f 2a 20 6c 61 73 74 45 72 72 6e 6f 20 73    /* lastErrno s
17c20 65 74 20 62 79 20 73 65 65 6b 41 6e 64 52 65 61  et by seekAndRea
17c30 64 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  d */.    return 
17c40 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45 41  SQLITE_IOERR_REA
17c50 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  D;.  }else{.    
17c60 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
17c70 20 3d 20 30 3b 20 2f 2a 20 6e 6f 74 20 61 20 73   = 0; /* not a s
17c80 79 73 74 65 6d 20 65 72 72 6f 72 20 2a 2f 0a 20  ystem error */. 
17c90 20 20 20 2f 2a 20 55 6e 72 65 61 64 20 70 61 72     /* Unread par
17ca0 74 73 20 6f 66 20 74 68 65 20 62 75 66 66 65 72  ts of the buffer
17cb0 20 6d 75 73 74 20 62 65 20 7a 65 72 6f 2d 66 69   must be zero-fi
17cc0 6c 6c 65 64 20 2a 2f 0a 20 20 20 20 6d 65 6d 73  lled */.    mems
17cd0 65 74 28 26 28 28 63 68 61 72 2a 29 70 42 75 66  et(&((char*)pBuf
17ce0 29 5b 67 6f 74 5d 2c 20 30 2c 20 61 6d 74 2d 67  )[got], 0, amt-g
17cf0 6f 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ot);.    return 
17d00 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f  SQLITE_IOERR_SHO
17d10 52 54 5f 52 45 41 44 3b 0a 20 20 7d 0a 7d 0a 0a  RT_READ;.  }.}..
17d20 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74 6f 20 74 68  /*.** Seek to th
17d30 65 20 6f 66 66 73 65 74 20 69 6e 20 69 64 2d 3e  e offset in id->
17d40 6f 66 66 73 65 74 20 74 68 65 6e 20 72 65 61 64  offset then read
17d50 20 63 6e 74 20 62 79 74 65 73 20 69 6e 74 6f 20   cnt bytes into 
17d60 70 42 75 66 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  pBuf..** Return 
17d70 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
17d80 74 65 73 20 61 63 74 75 61 6c 6c 79 20 72 65 61  tes actually rea
17d90 64 2e 20 20 55 70 64 61 74 65 20 74 68 65 20 6f  d.  Update the o
17da0 66 66 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20  ffset..**.** To 
17db0 61 76 6f 69 64 20 73 74 6f 6d 70 69 6e 67 20 74  avoid stomping t
17dc0 68 65 20 65 72 72 6e 6f 20 76 61 6c 75 65 20 6f  he errno value o
17dd0 6e 20 61 20 66 61 69 6c 65 64 20 77 72 69 74 65  n a failed write
17de0 20 74 68 65 20 6c 61 73 74 45 72 72 6e 6f 20 76   the lastErrno v
17df0 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 62  alue.** is set b
17e00 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
17e10 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
17e20 65 65 6b 41 6e 64 57 72 69 74 65 28 75 6e 69 78  eekAndWrite(unix
17e30 46 69 6c 65 20 2a 69 64 2c 20 69 36 34 20 6f 66  File *id, i64 of
17e40 66 73 65 74 2c 20 63 6f 6e 73 74 20 76 6f 69 64  fset, const void
17e50 20 2a 70 42 75 66 2c 20 69 6e 74 20 63 6e 74 29   *pBuf, int cnt)
17e60 7b 0a 20 20 69 6e 74 20 67 6f 74 3b 0a 23 69 66  {.  int got;.#if
17e70 20 28 21 64 65 66 69 6e 65 64 28 55 53 45 5f 50   (!defined(USE_P
17e80 52 45 41 44 29 20 26 26 20 21 64 65 66 69 6e 65  READ) && !define
17e90 64 28 55 53 45 5f 50 52 45 41 44 36 34 29 29 0a  d(USE_PREAD64)).
17ea0 20 20 69 36 34 20 6e 65 77 4f 66 66 73 65 74 3b    i64 newOffset;
17eb0 0a 23 65 6e 64 69 66 0a 20 20 54 49 4d 45 52 5f  .#endif.  TIMER_
17ec0 53 54 41 52 54 3b 0a 23 69 66 20 64 65 66 69 6e  START;.#if defin
17ed0 65 64 28 55 53 45 5f 50 52 45 41 44 29 0a 20 20  ed(USE_PREAD).  
17ee0 67 6f 74 20 3d 20 70 77 72 69 74 65 28 69 64 2d  got = pwrite(id-
17ef0 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 2c 20 6f  >h, pBuf, cnt, o
17f00 66 66 73 65 74 29 3b 0a 23 65 6c 69 66 20 64 65  ffset);.#elif de
17f10 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 36  fined(USE_PREAD6
17f20 34 29 0a 20 20 67 6f 74 20 3d 20 70 77 72 69 74  4).  got = pwrit
17f30 65 36 34 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c  e64(id->h, pBuf,
17f40 20 63 6e 74 2c 20 6f 66 66 73 65 74 29 3b 0a 23   cnt, offset);.#
17f50 65 6c 73 65 0a 20 20 6e 65 77 4f 66 66 73 65 74  else.  newOffset
17f60 20 3d 20 6c 73 65 65 6b 28 69 64 2d 3e 68 2c 20   = lseek(id->h, 
17f70 6f 66 66 73 65 74 2c 20 53 45 45 4b 5f 53 45 54  offset, SEEK_SET
17f80 29 3b 0a 20 20 69 66 28 20 6e 65 77 4f 66 66 73  );.  if( newOffs
17f90 65 74 21 3d 6f 66 66 73 65 74 20 29 7b 0a 20 20  et!=offset ){.  
17fa0 20 20 69 66 28 20 6e 65 77 4f 66 66 73 65 74 20    if( newOffset 
17fb0 3d 3d 20 2d 31 20 29 7b 0a 20 20 20 20 20 20 28  == -1 ){.      (
17fc0 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e  (unixFile*)id)->
17fd0 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  lastErrno = errn
17fe0 6f 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  o;.    }else{.  
17ff0 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29      ((unixFile*)
18000 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  id)->lastErrno =
18010 20 30 3b 09 09 09 0a 20 20 20 20 7d 0a 20 20 20   0;....    }.   
18020 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a   return -1;.  }.
18030 20 20 67 6f 74 20 3d 20 77 72 69 74 65 28 69 64    got = write(id
18040 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 29 3b  ->h, pBuf, cnt);
18050 0a 23 65 6e 64 69 66 0a 20 20 54 49 4d 45 52 5f  .#endif.  TIMER_
18060 45 4e 44 3b 0a 20 20 69 66 28 20 67 6f 74 3c 30  END;.  if( got<0
18070 20 29 7b 0a 20 20 20 20 28 28 75 6e 69 78 46 69   ){.    ((unixFi
18080 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72 72  le*)id)->lastErr
18090 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 7d 0a  no = errno;.  }.
180a0 0a 20 20 4f 53 54 52 41 43 45 35 28 22 57 52 49  .  OSTRACE5("WRI
180b0 54 45 20 20 20 25 2d 33 64 20 25 35 64 20 25 37  TE   %-3d %5d %7
180c0 6c 6c 64 20 25 6c 6c 75 5c 6e 22 2c 20 69 64 2d  lld %llu\n", id-
180d0 3e 68 2c 20 67 6f 74 2c 20 6f 66 66 73 65 74 2c  >h, got, offset,
180e0 20 54 49 4d 45 52 5f 45 4c 41 50 53 45 44 29 3b   TIMER_ELAPSED);
180f0 0a 20 20 72 65 74 75 72 6e 20 67 6f 74 3b 0a 7d  .  return got;.}
18100 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 64  .../*.** Write d
18110 61 74 61 20 66 72 6f 6d 20 61 20 62 75 66 66 65  ata from a buffe
18120 72 20 69 6e 74 6f 20 61 20 66 69 6c 65 2e 20 20  r into a file.  
18130 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
18140 20 6f 6e 20 73 75 63 63 65 73 73 0a 2a 2a 20 6f   on success.** o
18150 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72  r some other err
18160 6f 72 20 63 6f 64 65 20 6f 6e 20 66 61 69 6c 75  or code on failu
18170 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  re..*/.static in
18180 74 20 75 6e 69 78 57 72 69 74 65 28 0a 20 20 73  t unixWrite(.  s
18190 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
181a0 20 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a   .  const void *
181b0 70 42 75 66 2c 20 0a 20 20 69 6e 74 20 61 6d 74  pBuf, .  int amt
181c0 2c 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  ,.  sqlite3_int6
181d0 34 20 6f 66 66 73 65 74 20 0a 29 7b 0a 20 20 75  4 offset .){.  u
181e0 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
181f0 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
18200 20 20 69 6e 74 20 77 72 6f 74 65 20 3d 20 30 3b    int wrote = 0;
18210 0a 20 20 61 73 73 65 72 74 28 20 69 64 20 29 3b  .  assert( id );
18220 0a 20 20 61 73 73 65 72 74 28 20 61 6d 74 3e 30  .  assert( amt>0
18230 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69   );..  /* If thi
18240 73 20 69 73 20 61 20 64 61 74 61 62 61 73 65 20  s is a database 
18250 66 69 6c 65 20 28 6e 6f 74 20 61 20 6a 6f 75 72  file (not a jour
18260 6e 61 6c 2c 20 6d 61 73 74 65 72 2d 6a 6f 75 72  nal, master-jour
18270 6e 61 6c 20 6f 72 20 74 65 6d 70 0a 20 20 2a 2a  nal or temp.  **
18280 20 66 69 6c 65 29 2c 20 74 68 65 20 62 79 74 65   file), the byte
18290 73 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67  s in the locking
182a0 20 72 61 6e 67 65 20 73 68 6f 75 6c 64 20 6e 65   range should ne
182b0 76 65 72 20 62 65 20 72 65 61 64 20 6f 72 20 77  ver be read or w
182c0 72 69 74 74 65 6e 2e 20 2a 2f 0a 23 69 66 20 30  ritten. */.#if 0
182d0 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
182e0 2d 3e 70 55 6e 75 73 65 64 3d 3d 30 0a 20 20 20  ->pUnused==0.   
182f0 20 20 20 20 7c 7c 20 6f 66 66 73 65 74 3e 3d 50      || offset>=P
18300 45 4e 44 49 4e 47 5f 42 59 54 45 2b 35 31 32 0a  ENDING_BYTE+512.
18310 20 20 20 20 20 20 20 7c 7c 20 6f 66 66 73 65 74         || offset
18320 2b 61 6d 74 3c 3d 50 45 4e 44 49 4e 47 5f 42 59  +amt<=PENDING_BY
18330 54 45 20 0a 20 20 29 3b 0a 23 65 6e 64 69 66 0a  TE .  );.#endif.
18340 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
18350 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 64    /* If we are d
18360 6f 69 6e 67 20 61 20 6e 6f 72 6d 61 6c 20 77 72  oing a normal wr
18370 69 74 65 20 74 6f 20 61 20 64 61 74 61 62 61 73  ite to a databas
18380 65 20 66 69 6c 65 20 28 61 73 20 6f 70 70 6f 73  e file (as oppos
18390 65 64 20 74 6f 0a 20 20 2a 2a 20 64 6f 69 6e 67  ed to.  ** doing
183a0 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72   a hot-journal r
183b0 6f 6c 6c 62 61 63 6b 20 6f 72 20 61 20 77 72 69  ollback or a wri
183c0 74 65 20 74 6f 20 73 6f 6d 65 20 66 69 6c 65 20  te to some file 
183d0 6f 74 68 65 72 20 74 68 61 6e 20 61 0a 20 20 2a  other than a.  *
183e0 2a 20 6e 6f 72 6d 61 6c 20 64 61 74 61 62 61 73  * normal databas
183f0 65 20 66 69 6c 65 29 20 74 68 65 6e 20 72 65 63  e file) then rec
18400 6f 72 64 20 74 68 65 20 66 61 63 74 20 74 68 61  ord the fact tha
18410 74 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20  t the database. 
18420 20 2a 2a 20 68 61 73 20 63 68 61 6e 67 65 64 2e   ** has changed.
18430 20 20 49 66 20 74 68 65 20 74 72 61 6e 73 61 63    If the transac
18440 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 69 73 20  tion counter is 
18450 6d 6f 64 69 66 69 65 64 2c 20 72 65 63 6f 72 64  modified, record
18460 20 74 68 61 74 0a 20 20 2a 2a 20 66 61 63 74 20   that.  ** fact 
18470 74 6f 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  too..  */.  if( 
18480 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57  pFile->inNormalW
18490 72 69 74 65 20 29 7b 0a 20 20 20 20 70 46 69 6c  rite ){.    pFil
184a0 65 2d 3e 64 62 55 70 64 61 74 65 20 3d 20 31 3b  e->dbUpdate = 1;
184b0 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
184c0 65 20 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66  e has been modif
184d0 69 65 64 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f  ied */.    if( o
184e0 66 66 73 65 74 3c 3d 32 34 20 26 26 20 6f 66 66  ffset<=24 && off
184f0 73 65 74 2b 61 6d 74 3e 3d 32 37 20 29 7b 0a 20  set+amt>=27 ){. 
18500 20 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20       int rc;.   
18510 20 20 20 63 68 61 72 20 6f 6c 64 43 6e 74 72 5b     char oldCntr[
18520 34 5d 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61  4];.      Simula
18530 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28  teIOErrorBenign(
18540 31 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  1);.      rc = s
18550 65 65 6b 41 6e 64 52 65 61 64 28 70 46 69 6c 65  eekAndRead(pFile
18560 2c 20 32 34 2c 20 6f 6c 64 43 6e 74 72 2c 20 34  , 24, oldCntr, 4
18570 29 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74  );.      Simulat
18580 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30  eIOErrorBenign(0
18590 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
185a0 3d 34 20 7c 7c 20 6d 65 6d 63 6d 70 28 6f 6c 64  =4 || memcmp(old
185b0 43 6e 74 72 2c 20 26 28 28 63 68 61 72 2a 29 70  Cntr, &((char*)p
185c0 42 75 66 29 5b 32 34 2d 6f 66 66 73 65 74 5d 2c  Buf)[24-offset],
185d0 20 34 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20   4)!=0 ){.      
185e0 20 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e    pFile->transCn
185f0 74 72 43 68 6e 67 20 3d 20 31 3b 20 20 2f 2a 20  trChng = 1;  /* 
18600 54 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  The transaction 
18610 63 6f 75 6e 74 65 72 20 68 61 73 20 63 68 61 6e  counter has chan
18620 67 65 64 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20  ged */.      }. 
18630 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
18640 0a 20 20 77 68 69 6c 65 28 20 61 6d 74 3e 30 20  .  while( amt>0 
18650 26 26 20 28 77 72 6f 74 65 20 3d 20 73 65 65 6b  && (wrote = seek
18660 41 6e 64 57 72 69 74 65 28 70 46 69 6c 65 2c 20  AndWrite(pFile, 
18670 6f 66 66 73 65 74 2c 20 70 42 75 66 2c 20 61 6d  offset, pBuf, am
18680 74 29 29 3e 30 20 29 7b 0a 20 20 20 20 61 6d 74  t))>0 ){.    amt
18690 20 2d 3d 20 77 72 6f 74 65 3b 0a 20 20 20 20 6f   -= wrote;.    o
186a0 66 66 73 65 74 20 2b 3d 20 77 72 6f 74 65 3b 0a  ffset += wrote;.
186b0 20 20 20 20 70 42 75 66 20 3d 20 26 28 28 63 68      pBuf = &((ch
186c0 61 72 2a 29 70 42 75 66 29 5b 77 72 6f 74 65 5d  ar*)pBuf)[wrote]
186d0 3b 0a 20 20 7d 0a 20 20 53 69 6d 75 6c 61 74 65  ;.  }.  Simulate
186e0 49 4f 45 72 72 6f 72 28 28 20 77 72 6f 74 65 3d  IOError(( wrote=
186f0 28 2d 31 29 2c 20 61 6d 74 3d 31 20 29 29 3b 0a  (-1), amt=1 ));.
18700 20 20 53 69 6d 75 6c 61 74 65 44 69 73 6b 66 75    SimulateDiskfu
18710 6c 6c 45 72 72 6f 72 28 28 20 77 72 6f 74 65 3d  llError(( wrote=
18720 30 2c 20 61 6d 74 3d 31 20 29 29 3b 0a 20 20 69  0, amt=1 ));.  i
18730 66 28 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20  f( amt>0 ){.    
18740 69 66 28 20 77 72 6f 74 65 3c 30 20 29 7b 0a 20  if( wrote<0 ){. 
18750 20 20 20 20 20 2f 2a 20 6c 61 73 74 45 72 72 6e       /* lastErrn
18760 6f 20 73 65 74 20 62 79 20 73 65 65 6b 41 6e 64  o set by seekAnd
18770 57 72 69 74 65 20 2a 2f 0a 20 20 20 20 20 20 72  Write */.      r
18780 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
18790 52 52 5f 57 52 49 54 45 3b 0a 20 20 20 20 7d 65  RR_WRITE;.    }e
187a0 6c 73 65 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  lse{.      pFile
187b0 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b  ->lastErrno = 0;
187c0 20 2f 2a 20 6e 6f 74 20 61 20 73 79 73 74 65 6d   /* not a system
187d0 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20   error */.      
187e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55  return SQLITE_FU
187f0 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  LL;.    }.  }.  
18800 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
18810 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
18820 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 43 6f  TE_TEST./*.** Co
18830 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  unt the number o
18840 66 20 66 75 6c 6c 73 79 6e 63 73 20 61 6e 64 20  f fullsyncs and 
18850 6e 6f 72 6d 61 6c 20 73 79 6e 63 73 2e 20 20 54  normal syncs.  T
18860 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 74  his is used to t
18870 65 73 74 0a 2a 2a 20 74 68 61 74 20 73 79 6e 63  est.** that sync
18880 73 20 61 6e 64 20 66 75 6c 6c 73 79 6e 63 73 20  s and fullsyncs 
18890 61 72 65 20 6f 63 63 75 72 72 69 6e 67 20 61 74  are occurring at
188a0 20 74 68 65 20 72 69 67 68 74 20 74 69 6d 65 73   the right times
188b0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
188c0 5f 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20 30 3b  _sync_count = 0;
188d0 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 66 75 6c  .int sqlite3_ful
188e0 6c 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20 30 3b  lsync_count = 0;
188f0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57  .#endif../*.** W
18900 65 20 64 6f 20 6e 6f 74 20 74 72 75 73 74 20 73  e do not trust s
18910 79 73 74 65 6d 73 20 74 6f 20 70 72 6f 76 69 64  ystems to provid
18920 65 20 61 20 77 6f 72 6b 69 6e 67 20 66 64 61 74  e a working fdat
18930 61 73 79 6e 63 28 29 2e 20 20 53 6f 6d 65 20 64  async().  Some d
18940 6f 2e 0a 2a 2a 20 4f 74 68 65 72 73 20 64 6f 20  o..** Others do 
18950 6e 6f 2e 20 20 54 6f 20 62 65 20 73 61 66 65 2c  no.  To be safe,
18960 20 77 65 20 77 69 6c 6c 20 73 74 69 63 6b 20 77   we will stick w
18970 69 74 68 20 74 68 65 20 28 73 6c 6f 77 65 72 29  ith the (slower)
18980 20 66 73 79 6e 63 28 29 2e 0a 2a 2a 20 49 66 20   fsync()..** If 
18990 79 6f 75 20 6b 6e 6f 77 20 74 68 61 74 20 79 6f  you know that yo
189a0 75 72 20 73 79 73 74 65 6d 20 64 6f 65 73 20 73  ur system does s
189b0 75 70 70 6f 72 74 20 66 64 61 74 61 73 79 6e 63  upport fdatasync
189c0 28 29 20 63 6f 72 72 65 63 74 6c 79 2c 0a 2a 2a  () correctly,.**
189d0 20 74 68 65 6e 20 73 69 6d 70 6c 79 20 63 6f 6d   then simply com
189e0 70 69 6c 65 20 77 69 74 68 20 2d 44 66 64 61 74  pile with -Dfdat
189f0 61 73 79 6e 63 3d 66 64 61 74 61 73 79 6e 63 0a  async=fdatasync.
18a00 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
18a10 66 64 61 74 61 73 79 6e 63 29 20 26 26 20 21 64  fdatasync) && !d
18a20 65 66 69 6e 65 64 28 5f 5f 6c 69 6e 75 78 5f 5f  efined(__linux__
18a30 29 0a 23 20 64 65 66 69 6e 65 20 66 64 61 74 61  ).# define fdata
18a40 73 79 6e 63 20 66 73 79 6e 63 0a 23 65 6e 64 69  sync fsync.#endi
18a50 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65 20  f../*.** Define 
18a60 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 74  HAVE_FULLFSYNC t
18a70 6f 20 30 20 6f 72 20 31 20 64 65 70 65 6e 64 69  o 0 or 1 dependi
18a80 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72  ng on whether or
18a90 20 6e 6f 74 0a 2a 2a 20 74 68 65 20 46 5f 46 55   not.** the F_FU
18aa0 4c 4c 46 53 59 4e 43 20 6d 61 63 72 6f 20 69 73  LLFSYNC macro is
18ab0 20 64 65 66 69 6e 65 64 2e 20 20 46 5f 46 55 4c   defined.  F_FUL
18ac0 4c 46 53 59 4e 43 20 69 73 20 63 75 72 72 65 6e  LFSYNC is curren
18ad0 74 6c 79 0a 2a 2a 20 6f 6e 6c 79 20 61 76 61 69  tly.** only avai
18ae0 6c 61 62 6c 65 20 6f 6e 20 4d 61 63 20 4f 53 20  lable on Mac OS 
18af0 58 2e 20 20 42 75 74 20 74 68 61 74 20 63 6f 75  X.  But that cou
18b00 6c 64 20 63 68 61 6e 67 65 2e 0a 2a 2f 0a 23 69  ld change..*/.#i
18b10 66 64 65 66 20 46 5f 46 55 4c 4c 46 53 59 4e 43  fdef F_FULLFSYNC
18b20 0a 23 20 64 65 66 69 6e 65 20 48 41 56 45 5f 46  .# define HAVE_F
18b30 55 4c 4c 46 53 59 4e 43 20 31 0a 23 65 6c 73 65  ULLFSYNC 1.#else
18b40 0a 23 20 64 65 66 69 6e 65 20 48 41 56 45 5f 46  .# define HAVE_F
18b50 55 4c 4c 46 53 59 4e 43 20 30 0a 23 65 6e 64 69  ULLFSYNC 0.#endi
18b60 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 73  f.../*.** The fs
18b70 79 6e 63 28 29 20 73 79 73 74 65 6d 20 63 61 6c  ync() system cal
18b80 6c 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20  l does not work 
18b90 61 73 20 61 64 76 65 72 74 69 73 65 64 20 6f 6e  as advertised on
18ba0 20 6d 61 6e 79 0a 2a 2a 20 75 6e 69 78 20 73 79   many.** unix sy
18bb0 73 74 65 6d 73 2e 20 20 54 68 65 20 66 6f 6c 6c  stems.  The foll
18bc0 6f 77 69 6e 67 20 70 72 6f 63 65 64 75 72 65 20  owing procedure 
18bd0 69 73 20 61 6e 20 61 74 74 65 6d 70 74 20 74 6f  is an attempt to
18be0 20 6d 61 6b 65 0a 2a 2a 20 69 74 20 77 6f 72 6b   make.** it work
18bf0 20 62 65 74 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54   better..**.** T
18c00 68 65 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e  he SQLITE_NO_SYN
18c10 43 20 6d 61 63 72 6f 20 64 69 73 61 62 6c 65 73  C macro disables
18c20 20 61 6c 6c 20 66 73 79 6e 63 28 29 73 2e 20 20   all fsync()s.  
18c30 54 68 69 73 20 69 73 20 75 73 65 66 75 6c 0a 2a  This is useful.*
18c40 2a 20 66 6f 72 20 74 65 73 74 69 6e 67 20 77 68  * for testing wh
18c50 65 6e 20 77 65 20 77 61 6e 74 20 74 6f 20 72 75  en we want to ru
18c60 6e 20 74 68 72 6f 75 67 68 20 74 68 65 20 74 65  n through the te
18c70 73 74 20 73 75 69 74 65 20 71 75 69 63 6b 6c 79  st suite quickly
18c80 2e 0a 2a 2a 20 59 6f 75 20 61 72 65 20 73 74 72  ..** You are str
18c90 6f 6e 67 6c 79 20 61 64 76 69 73 65 64 20 2a 6e  ongly advised *n
18ca0 6f 74 2a 20 74 6f 20 64 65 70 6c 6f 79 20 77 69  ot* to deploy wi
18cb0 74 68 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e  th SQLITE_NO_SYN
18cc0 43 0a 2a 2a 20 65 6e 61 62 6c 65 64 2c 20 68 6f  C.** enabled, ho
18cd0 77 65 76 65 72 2c 20 73 69 6e 63 65 20 77 69 74  wever, since wit
18ce0 68 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43  h SQLITE_NO_SYNC
18cf0 20 65 6e 61 62 6c 65 64 2c 20 61 6e 20 4f 53 20   enabled, an OS 
18d00 63 72 61 73 68 0a 2a 2a 20 6f 72 20 70 6f 77 65  crash.** or powe
18d10 72 20 66 61 69 6c 75 72 65 20 77 69 6c 6c 20 6c  r failure will l
18d20 69 6b 65 6c 79 20 63 6f 72 72 75 70 74 20 74 68  ikely corrupt th
18d30 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
18d40 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 73 65  .**.** SQLite se
18d50 74 73 20 74 68 65 20 64 61 74 61 4f 6e 6c 79 20  ts the dataOnly 
18d60 66 6c 61 67 20 69 66 20 74 68 65 20 73 69 7a 65  flag if the size
18d70 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   of the file is 
18d80 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 20 54 68  unchanged..** Th
18d90 65 20 69 64 65 61 20 62 65 68 69 6e 64 20 64 61  e idea behind da
18da0 74 61 4f 6e 6c 79 20 69 73 20 74 68 61 74 20 69  taOnly is that i
18db0 74 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 77 72  t should only wr
18dc0 69 74 65 20 74 68 65 20 66 69 6c 65 20 63 6f 6e  ite the file con
18dd0 74 65 6e 74 0a 2a 2a 20 74 6f 20 64 69 73 6b 2c  tent.** to disk,
18de0 20 6e 6f 74 20 74 68 65 20 69 6e 6f 64 65 2e 20   not the inode. 
18df0 20 57 65 20 6f 6e 6c 79 20 73 65 74 20 64 61 74   We only set dat
18e00 61 4f 6e 6c 79 20 69 66 20 74 68 65 20 66 69 6c  aOnly if the fil
18e10 65 20 73 69 7a 65 20 69 73 20 0a 2a 2a 20 75 6e  e size is .** un
18e20 63 68 61 6e 67 65 64 20 73 69 6e 63 65 20 74 68  changed since th
18e30 65 20 66 69 6c 65 20 73 69 7a 65 20 69 73 20 70  e file size is p
18e40 61 72 74 20 6f 66 20 74 68 65 20 69 6e 6f 64 65  art of the inode
18e50 2e 20 20 48 6f 77 65 76 65 72 2c 20 0a 2a 2a 20  .  However, .** 
18e60 54 65 64 20 54 73 27 6f 20 74 65 6c 6c 73 20 75  Ted Ts'o tells u
18e70 73 20 74 68 61 74 20 66 64 61 74 61 73 79 6e 63  s that fdatasync
18e80 28 29 20 77 69 6c 6c 20 61 6c 73 6f 20 77 72 69  () will also wri
18e90 74 65 20 74 68 65 20 69 6e 6f 64 65 20 69 66 20  te the inode if 
18ea0 74 68 65 0a 2a 2a 20 66 69 6c 65 20 73 69 7a 65  the.** file size
18eb0 20 68 61 73 20 63 68 61 6e 67 65 64 2e 20 20 54   has changed.  T
18ec0 68 65 20 6f 6e 6c 79 20 72 65 61 6c 20 64 69 66  he only real dif
18ed0 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20  ference between 
18ee0 66 64 61 74 61 73 79 6e 63 28 29 0a 2a 2a 20 61  fdatasync().** a
18ef0 6e 64 20 66 73 79 6e 63 28 29 2c 20 54 65 64 20  nd fsync(), Ted 
18f00 74 65 6c 6c 73 20 75 73 2c 20 69 73 20 74 68 61  tells us, is tha
18f10 74 20 66 64 61 74 61 73 79 6e 63 28 29 20 77 69  t fdatasync() wi
18f20 6c 6c 20 6e 6f 74 20 66 6c 75 73 68 20 74 68 65  ll not flush the
18f30 0a 2a 2a 20 69 6e 6f 64 65 20 69 66 20 74 68 65  .** inode if the
18f40 20 6d 74 69 6d 65 20 6f 72 20 6f 77 6e 65 72 20   mtime or owner 
18f50 6f 72 20 6f 74 68 65 72 20 69 6e 6f 64 65 20 61  or other inode a
18f60 74 74 72 69 62 75 74 65 73 20 68 61 76 65 20 63  ttributes have c
18f70 68 61 6e 67 65 64 2e 0a 2a 2a 20 57 65 20 6f 6e  hanged..** We on
18f80 6c 79 20 63 61 72 65 20 61 62 6f 75 74 20 74 68  ly care about th
18f90 65 20 66 69 6c 65 20 73 69 7a 65 2c 20 6e 6f 74  e file size, not
18fa0 20 74 68 65 20 6f 74 68 65 72 20 66 69 6c 65 20   the other file 
18fb0 61 74 74 72 69 62 75 74 65 73 2c 20 73 6f 0a 2a  attributes, so.*
18fc0 2a 20 61 73 20 66 61 72 20 61 73 20 53 51 4c 69  * as far as SQLi
18fd0 74 65 20 69 73 20 63 6f 6e 63 65 72 6e 65 64 2c  te is concerned,
18fe0 20 61 6e 20 66 64 61 74 61 73 79 6e 63 28 29 20   an fdatasync() 
18ff0 69 73 20 61 6c 77 61 79 73 20 61 64 65 71 75 61  is always adequa
19000 74 65 2e 0a 2a 2a 20 53 6f 2c 20 77 65 20 61 6c  te..** So, we al
19010 77 61 79 73 20 75 73 65 20 66 64 61 74 61 73 79  ways use fdatasy
19020 6e 63 28 29 20 69 66 20 69 74 20 69 73 20 61 76  nc() if it is av
19030 61 69 6c 61 62 6c 65 2c 20 72 65 67 61 72 64 6c  ailable, regardl
19040 65 73 73 20 6f 66 0a 2a 2a 20 74 68 65 20 76 61  ess of.** the va
19050 6c 75 65 20 6f 66 20 74 68 65 20 64 61 74 61 4f  lue of the dataO
19060 6e 6c 79 20 66 6c 61 67 2e 0a 2a 2f 0a 73 74 61  nly flag..*/.sta
19070 74 69 63 20 69 6e 74 20 66 75 6c 6c 5f 66 73 79  tic int full_fsy
19080 6e 63 28 69 6e 74 20 66 64 2c 20 69 6e 74 20 66  nc(int fd, int f
19090 75 6c 6c 53 79 6e 63 2c 20 69 6e 74 20 64 61 74  ullSync, int dat
190a0 61 4f 6e 6c 79 29 7b 0a 20 20 69 6e 74 20 72 63  aOnly){.  int rc
190b0 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  ;..  /* The foll
190c0 6f 77 69 6e 67 20 22 69 66 64 65 66 2f 65 6c 69  owing "ifdef/eli
190d0 66 2f 65 6c 73 65 2f 22 20 62 6c 6f 63 6b 20 68  f/else/" block h
190e0 61 73 20 74 68 65 20 73 61 6d 65 20 73 74 72 75  as the same stru
190f0 63 74 75 72 65 20 61 73 0a 20 20 2a 2a 20 74 68  cture as.  ** th
19100 65 20 6f 6e 65 20 62 65 6c 6f 77 2e 20 49 74 20  e one below. It 
19110 69 73 20 72 65 70 6c 69 63 61 74 65 64 20 68 65  is replicated he
19120 72 65 20 73 6f 6c 65 6c 79 20 74 6f 20 61 76 6f  re solely to avo
19130 69 64 20 63 6c 75 74 74 65 72 69 6e 67 20 0a 20  id cluttering . 
19140 20 2a 2a 20 75 70 20 74 68 65 20 72 65 61 6c 20   ** up the real 
19150 63 6f 64 65 20 77 69 74 68 20 74 68 65 20 55 4e  code with the UN
19160 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 29  USED_PARAMETER()
19170 20 6d 61 63 72 6f 73 2e 0a 20 20 2a 2f 0a 23 69   macros..  */.#i
19180 66 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53  fdef SQLITE_NO_S
19190 59 4e 43 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  YNC.  UNUSED_PAR
191a0 41 4d 45 54 45 52 28 66 64 29 3b 0a 20 20 55 4e  AMETER(fd);.  UN
191b0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66  USED_PARAMETER(f
191c0 75 6c 6c 53 79 6e 63 29 3b 0a 20 20 55 4e 55 53  ullSync);.  UNUS
191d0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64 61 74  ED_PARAMETER(dat
191e0 61 4f 6e 6c 79 29 3b 0a 23 65 6c 69 66 20 48 41  aOnly);.#elif HA
191f0 56 45 5f 46 55 4c 4c 46 53 59 4e 43 0a 20 20 55  VE_FULLFSYNC.  U
19200 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
19210 64 61 74 61 4f 6e 6c 79 29 3b 0a 23 65 6c 73 65  dataOnly);.#else
19220 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
19230 54 45 52 28 66 75 6c 6c 53 79 6e 63 29 3b 0a 20  TER(fullSync);. 
19240 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
19250 52 28 64 61 74 61 4f 6e 6c 79 29 3b 0a 23 65 6e  R(dataOnly);.#en
19260 64 69 66 0a 0a 20 20 2f 2a 20 52 65 63 6f 72 64  dif..  /* Record
19270 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74   the number of t
19280 69 6d 65 73 20 74 68 61 74 20 77 65 20 64 6f 20  imes that we do 
19290 61 20 6e 6f 72 6d 61 6c 20 66 73 79 6e 63 28 29  a normal fsync()
192a0 20 61 6e 64 20 0a 20 20 2a 2a 20 46 55 4c 4c 53   and .  ** FULLS
192b0 59 4e 43 2e 20 20 54 68 69 73 20 69 73 20 75 73  YNC.  This is us
192c0 65 64 20 64 75 72 69 6e 67 20 74 65 73 74 69 6e  ed during testin
192d0 67 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74  g to verify that
192e0 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 0a   this procedure.
192f0 20 20 2a 2a 20 67 65 74 73 20 63 61 6c 6c 65 64    ** gets called
19300 20 77 69 74 68 20 74 68 65 20 63 6f 72 72 65 63   with the correc
19310 74 20 61 72 67 75 6d 65 6e 74 73 2e 0a 20 20 2a  t arguments..  *
19320 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
19330 54 45 53 54 0a 20 20 69 66 28 20 66 75 6c 6c 53  TEST.  if( fullS
19340 79 6e 63 20 29 20 73 71 6c 69 74 65 33 5f 66 75  ync ) sqlite3_fu
19350 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a  llsync_count++;.
19360 20 20 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63    sqlite3_sync_c
19370 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a  ount++;.#endif..
19380 20 20 2f 2a 20 49 66 20 77 65 20 63 6f 6d 70 69    /* If we compi
19390 6c 65 64 20 77 69 74 68 20 74 68 65 20 53 51 4c  led with the SQL
193a0 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 66 6c 61 67  ITE_NO_SYNC flag
193b0 2c 20 74 68 65 6e 20 73 79 6e 63 69 6e 67 20 69  , then syncing i
193c0 73 20 61 0a 20 20 2a 2a 20 6e 6f 2d 6f 70 0a 20  s a.  ** no-op. 
193d0 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
193e0 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20 72 63 20 3d  E_NO_SYNC.  rc =
193f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6c 69   SQLITE_OK;.#eli
19400 66 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43  f HAVE_FULLFSYNC
19410 0a 20 20 69 66 28 20 66 75 6c 6c 53 79 6e 63 20  .  if( fullSync 
19420 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 63 6e 74  ){.    rc = fcnt
19430 6c 28 66 64 2c 20 46 5f 46 55 4c 4c 46 53 59 4e  l(fd, F_FULLFSYN
19440 43 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  C, 0);.  }else{.
19450 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 7d 0a      rc = 1;.  }.
19460 20 20 2f 2a 20 49 66 20 74 68 65 20 46 55 4c 4c    /* If the FULL
19470 46 53 59 4e 43 20 66 61 69 6c 65 64 2c 20 66 61  FSYNC failed, fa
19480 6c 6c 20 62 61 63 6b 20 74 6f 20 61 74 74 65 6d  ll back to attem
19490 70 74 69 6e 67 20 61 6e 20 66 73 79 6e 63 28 29  pting an fsync()
194a0 2e 0a 20 20 2a 2a 20 49 74 20 73 68 6f 75 6c 64  ..  ** It should
194b0 6e 27 74 20 62 65 20 70 6f 73 73 69 62 6c 65 20  n't be possible 
194c0 66 6f 72 20 66 75 6c 6c 66 73 79 6e 63 20 74 6f  for fullfsync to
194d0 20 66 61 69 6c 20 6f 6e 20 74 68 65 20 6c 6f 63   fail on the loc
194e0 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20 73 79  al .  ** file sy
194f0 73 74 65 6d 20 28 6f 6e 20 4f 53 58 29 2c 20 73  stem (on OSX), s
19500 6f 20 66 61 69 6c 75 72 65 20 69 6e 64 69 63 61  o failure indica
19510 74 65 73 20 74 68 61 74 20 46 55 4c 4c 46 53 59  tes that FULLFSY
19520 4e 43 0a 20 20 2a 2a 20 69 73 6e 27 74 20 73 75  NC.  ** isn't su
19530 70 70 6f 72 74 65 64 20 66 6f 72 20 74 68 69 73  pported for this
19540 20 66 69 6c 65 20 73 79 73 74 65 6d 2e 20 53 6f   file system. So
19550 2c 20 61 74 74 65 6d 70 74 20 61 6e 20 66 73 79  , attempt an fsy
19560 6e 63 20 0a 20 20 2a 2a 20 61 6e 64 20 28 66 6f  nc .  ** and (fo
19570 72 20 6e 6f 77 29 20 69 67 6e 6f 72 65 20 74 68  r now) ignore th
19580 65 20 6f 76 65 72 68 65 61 64 20 6f 66 20 61 20  e overhead of a 
19590 73 75 70 65 72 66 6c 75 6f 75 73 20 66 63 6e 74  superfluous fcnt
195a0 6c 20 63 61 6c 6c 2e 20 20 0a 20 20 2a 2a 20 49  l call.  .  ** I
195b0 74 27 64 20 62 65 20 62 65 74 74 65 72 20 74 6f  t'd be better to
195c0 20 64 65 74 65 63 74 20 66 75 6c 6c 66 73 79 6e   detect fullfsyn
195d0 63 20 73 75 70 70 6f 72 74 20 6f 6e 63 65 20 61  c support once a
195e0 6e 64 20 61 76 6f 69 64 20 0a 20 20 2a 2a 20 74  nd avoid .  ** t
195f0 68 65 20 66 63 6e 74 6c 20 63 61 6c 6c 20 65 76  he fcntl call ev
19600 65 72 79 20 74 69 6d 65 20 73 79 6e 63 20 69 73  ery time sync is
19610 20 63 61 6c 6c 65 64 2e 0a 20 20 2a 2f 0a 20 20   called..  */.  
19620 69 66 28 20 72 63 20 29 20 72 63 20 3d 20 66 73  if( rc ) rc = fs
19630 79 6e 63 28 66 64 29 3b 0a 0a 23 65 6c 69 66 20  ync(fd);..#elif 
19640 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
19650 5f 29 0a 20 20 2f 2a 20 66 64 61 74 61 73 79 6e  _).  /* fdatasyn
19660 63 28 29 20 6f 6e 20 48 46 53 2b 20 64 6f 65 73  c() on HFS+ does
19670 6e 27 74 20 79 65 74 20 66 6c 75 73 68 20 74 68  n't yet flush th
19680 65 20 66 69 6c 65 20 73 69 7a 65 20 69 66 20 69  e file size if i
19690 74 20 63 68 61 6e 67 65 64 20 63 6f 72 72 65 63  t changed correc
196a0 74 6c 79 0a 20 20 2a 2a 20 73 6f 20 63 75 72 72  tly.  ** so curr
196b0 65 6e 74 6c 79 20 77 65 20 64 65 66 61 75 6c 74  ently we default
196c0 20 74 6f 20 74 68 65 20 6d 61 63 72 6f 20 74 68   to the macro th
196d0 61 74 20 72 65 64 65 66 69 6e 65 73 20 66 64 61  at redefines fda
196e0 74 61 73 79 6e 63 20 74 6f 20 66 73 79 6e 63 0a  tasync to fsync.
196f0 20 20 2a 2f 0a 20 20 72 63 20 3d 20 66 73 79 6e    */.  rc = fsyn
19700 63 28 66 64 29 3b 0a 23 65 6c 73 65 20 0a 20 20  c(fd);.#else .  
19710 72 63 20 3d 20 66 64 61 74 61 73 79 6e 63 28 66  rc = fdatasync(f
19720 64 29 3b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52  d);.#if OS_VXWOR
19730 4b 53 0a 20 20 69 66 28 20 72 63 3d 3d 2d 31 20  KS.  if( rc==-1 
19740 26 26 20 65 72 72 6e 6f 3d 3d 45 4e 4f 54 53 55  && errno==ENOTSU
19750 50 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 73  P ){.    rc = fs
19760 79 6e 63 28 66 64 29 3b 0a 20 20 7d 0a 23 65 6e  ync(fd);.  }.#en
19770 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b  dif /* OS_VXWORK
19780 53 20 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 69  S */.#endif /* i
19790 66 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53  fdef SQLITE_NO_S
197a0 59 4e 43 20 65 6c 69 66 20 48 41 56 45 5f 46 55  YNC elif HAVE_FU
197b0 4c 4c 46 53 59 4e 43 20 2a 2f 0a 0a 20 20 69 66  LLFSYNC */..  if
197c0 28 20 4f 53 5f 56 58 57 4f 52 4b 53 20 26 26 20  ( OS_VXWORKS && 
197d0 72 63 21 3d 20 2d 31 20 29 7b 0a 20 20 20 20 72  rc!= -1 ){.    r
197e0 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  c = 0;.  }.  ret
197f0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
19800 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 77   Make sure all w
19810 72 69 74 65 73 20 74 6f 20 61 20 70 61 72 74 69  rites to a parti
19820 63 75 6c 61 72 20 66 69 6c 65 20 61 72 65 20 63  cular file are c
19830 6f 6d 6d 69 74 74 65 64 20 74 6f 20 64 69 73 6b  ommitted to disk
19840 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 61 74 61 4f  ..**.** If dataO
19850 6e 6c 79 3d 3d 30 20 74 68 65 6e 20 62 6f 74 68  nly==0 then both
19860 20 74 68 65 20 66 69 6c 65 20 69 74 73 65 6c 66   the file itself
19870 20 61 6e 64 20 69 74 73 20 6d 65 74 61 64 61 74   and its metadat
19880 61 20 28 66 69 6c 65 0a 2a 2a 20 73 69 7a 65 2c  a (file.** size,
19890 20 61 63 63 65 73 73 20 74 69 6d 65 2c 20 65 74   access time, et
198a0 63 29 20 61 72 65 20 73 79 6e 63 65 64 2e 20 20  c) are synced.  
198b0 49 66 20 64 61 74 61 4f 6e 6c 79 21 3d 30 20 74  If dataOnly!=0 t
198c0 68 65 6e 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20  hen only the.** 
198d0 66 69 6c 65 20 64 61 74 61 20 69 73 20 73 79 6e  file data is syn
198e0 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 55 6e 64 65 72  ced..**.** Under
198f0 20 55 6e 69 78 2c 20 61 6c 73 6f 20 6d 61 6b 65   Unix, also make
19900 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20 64   sure that the d
19910 69 72 65 63 74 6f 72 79 20 65 6e 74 72 79 20 66  irectory entry f
19920 6f 72 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 68  or the file.** h
19930 61 73 20 62 65 65 6e 20 63 72 65 61 74 65 64 20  as been created 
19940 62 79 20 66 73 79 6e 63 2d 69 6e 67 20 74 68 65  by fsync-ing the
19950 20 64 69 72 65 63 74 6f 72 79 20 74 68 61 74 20   directory that 
19960 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 66 69 6c  contains the fil
19970 65 2e 0a 2a 2a 20 49 66 20 77 65 20 64 6f 20 6e  e..** If we do n
19980 6f 74 20 64 6f 20 74 68 69 73 20 61 6e 64 20 77  ot do this and w
19990 65 20 65 6e 63 6f 75 6e 74 65 72 20 61 20 70 6f  e encounter a po
199a0 77 65 72 20 66 61 69 6c 75 72 65 2c 20 74 68 65  wer failure, the
199b0 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20 65 6e   directory.** en
199c0 74 72 79 20 66 6f 72 20 74 68 65 20 6a 6f 75 72  try for the jour
199d0 6e 61 6c 20 6d 69 67 68 74 20 6e 6f 74 20 65 78  nal might not ex
199e0 69 73 74 20 61 66 74 65 72 20 77 65 20 72 65 62  ist after we reb
199f0 6f 6f 74 2e 20 20 54 68 65 20 6e 65 78 74 0a 2a  oot.  The next.*
19a00 2a 20 53 51 4c 69 74 65 20 74 6f 20 61 63 63 65  * SQLite to acce
19a10 73 73 20 74 68 65 20 66 69 6c 65 20 77 69 6c 6c  ss the file will
19a20 20 6e 6f 74 20 6b 6e 6f 77 20 74 68 61 74 20 74   not know that t
19a30 68 65 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74  he journal exist
19a40 73 20 28 62 65 63 61 75 73 65 0a 2a 2a 20 74 68  s (because.** th
19a50 65 20 64 69 72 65 63 74 6f 72 79 20 65 6e 74 72  e directory entr
19a60 79 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61  y for the journa
19a70 6c 20 77 61 73 20 6e 65 76 65 72 20 63 72 65 61  l was never crea
19a80 74 65 64 29 20 61 6e 64 20 74 68 65 20 74 72 61  ted) and the tra
19a90 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 77 69 6c 6c  nsaction.** will
19aa0 20 6e 6f 74 20 72 6f 6c 6c 20 62 61 63 6b 20 2d   not roll back -
19ab0 20 70 6f 73 73 69 62 6c 79 20 6c 65 61 64 69 6e   possibly leadin
19ac0 67 20 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f  g to database co
19ad0 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  rruption..*/.sta
19ae0 74 69 63 20 69 6e 74 20 75 6e 69 78 53 79 6e 63  tic int unixSync
19af0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
19b00 64 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  d, int flags){. 
19b10 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e 69 78 46   int rc;.  unixF
19b20 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
19b30 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 69  ixFile*)id;..  i
19b40 6e 74 20 69 73 44 61 74 61 4f 6e 6c 79 20 3d 20  nt isDataOnly = 
19b50 28 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 53 59  (flags&SQLITE_SY
19b60 4e 43 5f 44 41 54 41 4f 4e 4c 59 29 3b 0a 20 20  NC_DATAONLY);.  
19b70 69 6e 74 20 69 73 46 75 6c 6c 73 79 6e 63 20 3d  int isFullsync =
19b80 20 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53   (flags&0x0F)==S
19b90 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b  QLITE_SYNC_FULL;
19ba0 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61  ..  /* Check tha
19bb0 74 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f  t one of SQLITE_
19bc0 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 46  SYNC_NORMAL or F
19bd0 55 4c 4c 20 77 61 73 20 70 61 73 73 65 64 20 2a  ULL was passed *
19be0 2f 0a 20 20 61 73 73 65 72 74 28 28 66 6c 61 67  /.  assert((flag
19bf0 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f  s&0x0F)==SQLITE_
19c00 53 59 4e 43 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20  SYNC_NORMAL.    
19c10 20 20 7c 7c 20 28 66 6c 61 67 73 26 30 78 30 46    || (flags&0x0F
19c20 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46  )==SQLITE_SYNC_F
19c30 55 4c 4c 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 55  ULL.  );..  /* U
19c40 6e 69 78 20 63 61 6e 6e 6f 74 2c 20 62 75 74 20  nix cannot, but 
19c50 73 6f 6d 65 20 73 79 73 74 65 6d 73 20 6d 61 79  some systems may
19c60 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46   return SQLITE_F
19c70 55 4c 4c 20 66 72 6f 6d 20 68 65 72 65 2e 20 54  ULL from here. T
19c80 68 69 73 0a 20 20 2a 2a 20 6c 69 6e 65 20 69 73  his.  ** line is
19c90 20 74 6f 20 74 65 73 74 20 74 68 61 74 20 64 6f   to test that do
19ca0 69 6e 67 20 73 6f 20 64 6f 65 73 20 6e 6f 74 20  ing so does not 
19cb0 63 61 75 73 65 20 61 6e 79 20 70 72 6f 62 6c 65  cause any proble
19cc0 6d 73 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c  ms..  */.  Simul
19cd0 61 74 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72  ateDiskfullError
19ce0 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ( return SQLITE_
19cf0 46 55 4c 4c 20 29 3b 0a 0a 20 20 61 73 73 65 72  FULL );..  asser
19d00 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53  t( pFile );.  OS
19d10 54 52 41 43 45 32 28 22 53 59 4e 43 20 20 20 20  TRACE2("SYNC    
19d20 25 2d 33 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  %-3d\n", pFile->
19d30 68 29 3b 0a 20 20 72 63 20 3d 20 66 75 6c 6c 5f  h);.  rc = full_
19d40 66 73 79 6e 63 28 70 46 69 6c 65 2d 3e 68 2c 20  fsync(pFile->h, 
19d50 69 73 46 75 6c 6c 73 79 6e 63 2c 20 69 73 44 61  isFullsync, isDa
19d60 74 61 4f 6e 6c 79 29 3b 0a 20 20 53 69 6d 75 6c  taOnly);.  Simul
19d70 61 74 65 49 4f 45 72 72 6f 72 28 20 72 63 3d 31  ateIOError( rc=1
19d80 20 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a   );.  if( rc ){.
19d90 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
19da0 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
19db0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
19dc0 49 4f 45 52 52 5f 46 53 59 4e 43 3b 0a 20 20 7d  IOERR_FSYNC;.  }
19dd0 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 64 69  .  if( pFile->di
19de0 72 66 64 3e 3d 30 20 29 7b 0a 20 20 20 20 69 6e  rfd>=0 ){.    in
19df0 74 20 65 72 72 3b 0a 20 20 20 20 4f 53 54 52 41  t err;.    OSTRA
19e00 43 45 34 28 22 44 49 52 53 59 4e 43 20 25 2d 33  CE4("DIRSYNC %-3
19e10 64 20 28 68 61 76 65 5f 66 75 6c 6c 66 73 79 6e  d (have_fullfsyn
19e20 63 3d 25 64 20 66 75 6c 6c 73 79 6e 63 3d 25 64  c=%d fullsync=%d
19e30 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 64 69 72  )\n", pFile->dir
19e40 66 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  fd,.            
19e50 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 2c 20  HAVE_FULLFSYNC, 
19e60 69 73 46 75 6c 6c 73 79 6e 63 29 3b 0a 23 69 66  isFullsync);.#if
19e70 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 49 53 41  ndef SQLITE_DISA
19e80 42 4c 45 5f 44 49 52 53 59 4e 43 0a 20 20 20 20  BLE_DIRSYNC.    
19e90 2f 2a 20 54 68 65 20 64 69 72 65 63 74 6f 72 79  /* The directory
19ea0 20 73 79 6e 63 20 69 73 20 6f 6e 6c 79 20 61 74   sync is only at
19eb0 74 65 6d 70 74 65 64 20 69 66 20 66 75 6c 6c 5f  tempted if full_
19ec0 66 73 79 6e 63 20 69 73 0a 20 20 20 20 2a 2a 20  fsync is.    ** 
19ed0 74 75 72 6e 65 64 20 6f 66 66 20 6f 72 20 75 6e  turned off or un
19ee0 61 76 61 69 6c 61 62 6c 65 2e 20 20 49 66 20 61  available.  If a
19ef0 20 66 75 6c 6c 5f 66 73 79 6e 63 20 6f 63 63 75   full_fsync occu
19f00 72 72 65 64 20 61 62 6f 76 65 2c 0a 20 20 20 20  rred above,.    
19f10 2a 2a 20 74 68 65 6e 20 74 68 65 20 64 69 72 65  ** then the dire
19f20 63 74 6f 72 79 20 73 79 6e 63 20 69 73 20 73 75  ctory sync is su
19f30 70 65 72 66 6c 75 6f 75 73 2e 0a 20 20 20 20 2a  perfluous..    *
19f40 2f 0a 20 20 20 20 69 66 28 20 28 21 48 41 56 45  /.    if( (!HAVE
19f50 5f 46 55 4c 4c 46 53 59 4e 43 20 7c 7c 20 21 69  _FULLFSYNC || !i
19f60 73 46 75 6c 6c 73 79 6e 63 29 20 26 26 20 66 75  sFullsync) && fu
19f70 6c 6c 5f 66 73 79 6e 63 28 70 46 69 6c 65 2d 3e  ll_fsync(pFile->
19f80 64 69 72 66 64 2c 30 2c 30 29 20 29 7b 0a 20 20  dirfd,0,0) ){.  
19f90 20 20 20 20 20 2f 2a 0a 20 20 20 20 20 20 20 2a       /*.       *
19fa0 2a 20 57 65 20 68 61 76 65 20 72 65 63 65 69 76  * We have receiv
19fb0 65 64 20 6d 75 6c 74 69 70 6c 65 20 72 65 70 6f  ed multiple repo
19fc0 72 74 73 20 6f 66 20 66 73 79 6e 63 28 29 20 72  rts of fsync() r
19fd0 65 74 75 72 6e 69 6e 67 0a 20 20 20 20 20 20 20  eturning.       
19fe0 2a 2a 20 65 72 72 6f 72 73 20 77 68 65 6e 20 61  ** errors when a
19ff0 70 70 6c 69 65 64 20 74 6f 20 64 69 72 65 63 74  pplied to direct
1a000 6f 72 69 65 73 20 6f 6e 20 63 65 72 74 61 69 6e  ories on certain
1a010 20 66 69 6c 65 20 73 79 73 74 65 6d 73 2e 0a 20   file systems.. 
1a020 20 20 20 20 20 20 2a 2a 20 41 20 66 61 69 6c 65        ** A faile
1a030 64 20 64 69 72 65 63 74 6f 72 79 20 73 79 6e 63  d directory sync
1a040 20 69 73 20 6e 6f 74 20 61 20 62 69 67 20 64 65   is not a big de
1a050 61 6c 2e 20 20 53 6f 20 69 74 20 73 65 65 6d 73  al.  So it seems
1a060 0a 20 20 20 20 20 20 20 2a 2a 20 62 65 74 74 65  .       ** bette
1a070 72 20 74 6f 20 69 67 6e 6f 72 65 20 74 68 65 20  r to ignore the 
1a080 65 72 72 6f 72 2e 20 20 54 69 63 6b 65 74 20 23  error.  Ticket #
1a090 31 36 35 37 0a 20 20 20 20 20 20 20 2a 2f 0a 20  1657.       */. 
1a0a0 20 20 20 20 20 20 2f 2a 20 70 46 69 6c 65 2d 3e        /* pFile->
1a0b0 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  lastErrno = errn
1a0c0 6f 3b 20 2a 2f 0a 20 20 20 20 20 20 20 2f 2a 20  o; */.       /* 
1a0d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
1a0e0 45 52 52 3b 20 2a 2f 0a 20 20 20 20 7d 0a 23 65  ERR; */.    }.#e
1a0f0 6e 64 69 66 0a 20 20 20 20 65 72 72 20 3d 20 63  ndif.    err = c
1a100 6c 6f 73 65 28 70 46 69 6c 65 2d 3e 64 69 72 66  lose(pFile->dirf
1a110 64 29 3b 20 2f 2a 20 4f 6e 6c 79 20 6e 65 65 64  d); /* Only need
1a120 20 74 6f 20 73 79 6e 63 20 6f 6e 63 65 2c 20 73   to sync once, s
1a130 6f 20 63 6c 6f 73 65 20 74 68 65 20 2a 2f 0a 20  o close the */. 
1a140 20 20 20 69 66 28 20 65 72 72 3d 3d 30 20 29 7b     if( err==0 ){
1a150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a160 20 64 69 72 65 63 74 6f 72 79 20 77 68 65 6e 20   directory when 
1a170 77 65 20 61 72 65 20 64 6f 6e 65 20 2a 2f 0a 20  we are done */. 
1a180 20 20 20 20 20 70 46 69 6c 65 2d 3e 64 69 72 66       pFile->dirf
1a190 64 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 65 6c 73  d = -1;.    }els
1a1a0 65 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  e{.      pFile->
1a1b0 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  lastErrno = errn
1a1c0 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  o;.      rc = SQ
1a1d0 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f 43  LITE_IOERR_DIR_C
1a1e0 4c 4f 53 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  LOSE;.    }.  }.
1a1f0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1a200 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 61  /*.** Truncate a
1a210 6e 20 6f 70 65 6e 20 66 69 6c 65 20 74 6f 20 61  n open file to a
1a220 20 73 70 65 63 69 66 69 65 64 20 73 69 7a 65 0a   specified size.
1a230 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
1a240 69 78 54 72 75 6e 63 61 74 65 28 73 71 6c 69 74  ixTruncate(sqlit
1a250 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 36 34  e3_file *id, i64
1a260 20 6e 42 79 74 65 29 7b 0a 20 20 69 6e 74 20 72   nByte){.  int r
1a270 63 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 20  c;.  assert( id 
1a280 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  );.  SimulateIOE
1a290 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c  rror( return SQL
1a2a0 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41  ITE_IOERR_TRUNCA
1a2b0 54 45 20 29 3b 0a 20 20 72 63 20 3d 20 66 74 72  TE );.  rc = ftr
1a2c0 75 6e 63 61 74 65 28 28 28 75 6e 69 78 46 69 6c  uncate(((unixFil
1a2d0 65 2a 29 69 64 29 2d 3e 68 2c 20 28 6f 66 66 5f  e*)id)->h, (off_
1a2e0 74 29 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20  t)nByte);.  if( 
1a2f0 72 63 20 29 7b 0a 20 20 20 20 28 28 75 6e 69 78  rc ){.    ((unix
1a300 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45  File*)id)->lastE
1a310 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
1a320 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1a330 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 3b 0a  IOERR_TRUNCATE;.
1a340 20 20 7d 65 6c 73 65 7b 0a 23 69 66 6e 64 65 66    }else{.#ifndef
1a350 20 4e 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 49   NDEBUG.    /* I
1a360 66 20 77 65 20 61 72 65 20 64 6f 69 6e 67 20 61  f we are doing a
1a370 20 6e 6f 72 6d 61 6c 20 77 72 69 74 65 20 74 6f   normal write to
1a380 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65   a database file
1a390 20 28 61 73 20 6f 70 70 6f 73 65 64 20 74 6f 0a   (as opposed to.
1a3a0 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20 61 20 68      ** doing a h
1a3b0 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
1a3c0 61 63 6b 20 6f 72 20 61 20 77 72 69 74 65 20 74  ack or a write t
1a3d0 6f 20 73 6f 6d 65 20 66 69 6c 65 20 6f 74 68 65  o some file othe
1a3e0 72 20 74 68 61 6e 20 61 0a 20 20 20 20 2a 2a 20  r than a.    ** 
1a3f0 6e 6f 72 6d 61 6c 20 64 61 74 61 62 61 73 65 20  normal database 
1a400 66 69 6c 65 29 20 61 6e 64 20 77 65 20 74 72 75  file) and we tru
1a410 6e 63 61 74 65 20 74 68 65 20 66 69 6c 65 20 74  ncate the file t
1a420 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68 2c 0a 20  o zero length,. 
1a430 20 20 20 2a 2a 20 74 68 61 74 20 65 66 66 65 63     ** that effec
1a440 74 69 76 65 6c 79 20 75 70 64 61 74 65 73 20 74  tively updates t
1a450 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65  he change counte
1a460 72 2e 20 20 54 68 69 73 20 6d 69 67 68 74 20 68  r.  This might h
1a470 61 70 70 65 6e 0a 20 20 20 20 2a 2a 20 77 68 65  appen.    ** whe
1a480 6e 20 72 65 73 74 6f 72 69 6e 67 20 61 20 64 61  n restoring a da
1a490 74 61 62 61 73 65 20 75 73 69 6e 67 20 74 68 65  tabase using the
1a4a0 20 62 61 63 6b 75 70 20 41 50 49 20 66 72 6f 6d   backup API from
1a4b0 20 61 20 7a 65 72 6f 2d 6c 65 6e 67 74 68 0a 20   a zero-length. 
1a4c0 20 20 20 2a 2a 20 73 6f 75 72 63 65 2e 0a 20 20     ** source..  
1a4d0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 28 75    */.    if( ((u
1a4e0 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 69 6e  nixFile*)id)->in
1a4f0 4e 6f 72 6d 61 6c 57 72 69 74 65 20 26 26 20 6e  NormalWrite && n
1a500 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Byte==0 ){.     
1a510 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29   ((unixFile*)id)
1a520 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 20  ->transCntrChng 
1a530 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  = 1;.    }.#endi
1a540 66 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  f..    return SQ
1a550 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a  LITE_OK;.  }.}..
1a560 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20  /*.** Determine 
1a570 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65  the current size
1a580 20 6f 66 20 61 20 66 69 6c 65 20 69 6e 20 62 79   of a file in by
1a590 74 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  tes.*/.static in
1a5a0 74 20 75 6e 69 78 46 69 6c 65 53 69 7a 65 28 73  t unixFileSize(s
1a5b0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
1a5c0 20 69 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20   i64 *pSize){.  
1a5d0 69 6e 74 20 72 63 3b 0a 20 20 73 74 72 75 63 74  int rc;.  struct
1a5e0 20 73 74 61 74 20 62 75 66 3b 0a 20 20 61 73 73   stat buf;.  ass
1a5f0 65 72 74 28 20 69 64 20 29 3b 0a 20 20 72 63 20  ert( id );.  rc 
1a600 3d 20 66 73 74 61 74 28 28 28 75 6e 69 78 46 69  = fstat(((unixFi
1a610 6c 65 2a 29 69 64 29 2d 3e 68 2c 20 26 62 75 66  le*)id)->h, &buf
1a620 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  );.  SimulateIOE
1a630 72 72 6f 72 28 20 72 63 3d 31 20 29 3b 0a 20 20  rror( rc=1 );.  
1a640 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20  if( rc!=0 ){.   
1a650 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29   ((unixFile*)id)
1a660 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72  ->lastErrno = er
1a670 72 6e 6f 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  rno;.    return 
1a680 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54  SQLITE_IOERR_FST
1a690 41 54 3b 0a 20 20 7d 0a 20 20 2a 70 53 69 7a 65  AT;.  }.  *pSize
1a6a0 20 3d 20 62 75 66 2e 73 74 5f 73 69 7a 65 3b 0a   = buf.st_size;.
1a6b0 0a 20 20 2f 2a 20 57 68 65 6e 20 6f 70 65 6e 69  .  /* When openi
1a6c0 6e 67 20 61 20 7a 65 72 6f 2d 73 69 7a 65 20 64  ng a zero-size d
1a6d0 61 74 61 62 61 73 65 2c 20 74 68 65 20 66 69 6e  atabase, the fin
1a6e0 64 4c 6f 63 6b 49 6e 66 6f 28 29 20 70 72 6f 63  dLockInfo() proc
1a6f0 65 64 75 72 65 0a 20 20 2a 2a 20 77 72 69 74 65  edure.  ** write
1a700 73 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20  s a single byte 
1a710 69 6e 74 6f 20 74 68 61 74 20 66 69 6c 65 20 69  into that file i
1a720 6e 20 6f 72 64 65 72 20 74 6f 20 77 6f 72 6b 20  n order to work 
1a730 61 72 6f 75 6e 64 20 61 20 62 75 67 0a 20 20 2a  around a bug.  *
1a740 2a 20 69 6e 20 74 68 65 20 4f 53 2d 58 20 6d 73  * in the OS-X ms
1a750 64 6f 73 20 66 69 6c 65 73 79 73 74 65 6d 2e 20  dos filesystem. 
1a760 20 49 6e 20 6f 72 64 65 72 20 74 6f 20 61 76 6f   In order to avo
1a770 69 64 20 70 72 6f 62 6c 65 6d 73 20 77 69 74 68  id problems with
1a780 20 75 70 70 65 72 0a 20 20 2a 2a 20 6c 61 79 65   upper.  ** laye
1a790 72 73 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 72  rs, we need to r
1a7a0 65 70 6f 72 74 20 74 68 69 73 20 66 69 6c 65 20  eport this file 
1a7b0 73 69 7a 65 20 61 73 20 7a 65 72 6f 20 65 76 65  size as zero eve
1a7c0 6e 20 74 68 6f 75 67 68 20 69 74 20 69 73 0a 20  n though it is. 
1a7d0 20 2a 2a 20 72 65 61 6c 6c 79 20 31 2e 20 20 20   ** really 1.   
1a7e0 54 69 63 6b 65 74 20 23 33 32 36 30 2e 0a 20 20  Ticket #3260..  
1a7f0 2a 2f 0a 20 20 69 66 28 20 2a 70 53 69 7a 65 3d  */.  if( *pSize=
1a800 3d 31 20 29 20 2a 70 53 69 7a 65 20 3d 20 30 3b  =1 ) *pSize = 0;
1a810 0a 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  ...  return SQLI
1a820 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51  TE_OK;.}..#if SQ
1a830 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
1a840 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66  ING_STYLE && def
1a850 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a  ined(__APPLE__).
1a860 2f 2a 0a 2a 2a 20 48 61 6e 64 6c 65 72 20 66 6f  /*.** Handler fo
1a870 72 20 70 72 6f 78 79 2d 6c 6f 63 6b 69 6e 67 20  r proxy-locking 
1a880 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 76 65 72  file-control ver
1a890 62 73 2e 20 20 44 65 66 69 6e 65 64 20 62 65 6c  bs.  Defined bel
1a8a0 6f 77 20 69 6e 20 74 68 65 0a 2a 2a 20 70 72 6f  ow in the.** pro
1a8b0 78 79 69 6e 67 20 6c 6f 63 6b 69 6e 67 20 64 69  xying locking di
1a8c0 76 69 73 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  vision..*/.stati
1a8d0 63 20 69 6e 74 20 70 72 6f 78 79 46 69 6c 65 43  c int proxyFileC
1a8e0 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66  ontrol(sqlite3_f
1a8f0 69 6c 65 2a 2c 69 6e 74 2c 76 6f 69 64 2a 29 3b  ile*,int,void*);
1a900 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
1a910 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 6e 64 20  Information and 
1a920 63 6f 6e 74 72 6f 6c 20 6f 66 20 61 6e 20 6f 70  control of an op
1a930 65 6e 20 66 69 6c 65 20 68 61 6e 64 6c 65 2e 0a  en file handle..
1a940 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
1a950 69 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 73 71  ixFileControl(sq
1a960 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
1a970 69 6e 74 20 6f 70 2c 20 76 6f 69 64 20 2a 70 41  int op, void *pA
1a980 72 67 29 7b 0a 20 20 73 77 69 74 63 68 28 20 6f  rg){.  switch( o
1a990 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51  p ){.    case SQ
1a9a0 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b 53  LITE_FCNTL_LOCKS
1a9b0 54 41 54 45 3a 20 7b 0a 20 20 20 20 20 20 2a 28  TATE: {.      *(
1a9c0 69 6e 74 2a 29 70 41 72 67 20 3d 20 28 28 75 6e  int*)pArg = ((un
1a9d0 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 6f 63  ixFile*)id)->loc
1a9e0 6b 74 79 70 65 3b 0a 20 20 20 20 20 20 72 65 74  ktype;.      ret
1a9f0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1aa00 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
1aa10 4c 49 54 45 5f 4c 41 53 54 5f 45 52 52 4e 4f 3a  LITE_LAST_ERRNO:
1aa20 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a 29   {.      *(int*)
1aa30 70 41 72 67 20 3d 20 28 28 75 6e 69 78 46 69 6c  pArg = ((unixFil
1aa40 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e  e*)id)->lastErrn
1aa50 6f 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  o;.      return 
1aa60 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
1aa70 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
1aa80 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72      /* The pager
1aa90 20 63 61 6c 6c 73 20 74 68 69 73 20 6d 65 74 68   calls this meth
1aaa0 6f 64 20 74 6f 20 73 69 67 6e 61 6c 20 74 68 61  od to signal tha
1aab0 74 20 69 74 20 68 61 73 20 64 6f 6e 65 0a 20 20  t it has done.  
1aac0 20 20 2a 2a 20 61 20 72 6f 6c 6c 62 61 63 6b 20    ** a rollback 
1aad0 61 6e 64 20 74 68 61 74 20 74 68 65 20 64 61 74  and that the dat
1aae0 61 62 61 73 65 20 69 73 20 74 68 65 72 65 66 6f  abase is therefo
1aaf0 72 65 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64  re unchanged and
1ab00 0a 20 20 20 20 2a 2a 20 69 74 20 68 65 6e 63 65  .    ** it hence
1ab10 20 69 74 20 69 73 20 4f 4b 20 66 6f 72 20 74 68   it is OK for th
1ab20 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 68  e transaction ch
1ab30 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 74 6f 20  ange counter to 
1ab40 62 65 0a 20 20 20 20 2a 2a 20 75 6e 63 68 61 6e  be.    ** unchan
1ab50 67 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ged..    */.    
1ab60 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
1ab70 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44 3a 20  L_DB_UNCHANGED: 
1ab80 7b 0a 20 20 20 20 20 20 28 28 75 6e 69 78 46 69  {.      ((unixFi
1ab90 6c 65 2a 29 69 64 29 2d 3e 64 62 55 70 64 61 74  le*)id)->dbUpdat
1aba0 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74  e = 0;.      ret
1abb0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1abc0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20     }.#endif.#if 
1abd0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
1abe0 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64  CKING_STYLE && d
1abf0 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
1ac00 29 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ).    case SQLIT
1ac10 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46  E_SET_LOCKPROXYF
1ac20 49 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 53 51  ILE:.    case SQ
1ac30 4c 49 54 45 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f  LITE_GET_LOCKPRO
1ac40 58 59 46 49 4c 45 3a 20 7b 0a 20 20 20 20 20 20  XYFILE: {.      
1ac50 72 65 74 75 72 6e 20 70 72 6f 78 79 46 69 6c 65  return proxyFile
1ac60 43 6f 6e 74 72 6f 6c 28 69 64 2c 6f 70 2c 70 41  Control(id,op,pA
1ac70 72 67 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  rg);.    }.#endi
1ac80 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42  f /* SQLITE_ENAB
1ac90 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
1aca0 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50   && defined(__AP
1acb0 50 4c 45 5f 5f 29 20 2a 2f 0a 20 20 7d 0a 20 20  PLE__) */.  }.  
1acc0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
1acd0 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ROR;.}../*.** Re
1ace0 74 75 72 6e 20 74 68 65 20 73 65 63 74 6f 72 20  turn the sector 
1acf0 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6f 66  size in bytes of
1ad00 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   the underlying 
1ad10 62 6c 6f 63 6b 20 64 65 76 69 63 65 20 66 6f 72  block device for
1ad20 0a 2a 2a 20 74 68 65 20 73 70 65 63 69 66 69 65  .** the specifie
1ad30 64 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20  d file. This is 
1ad40 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20 35 31  almost always 51
1ad50 32 20 62 79 74 65 73 2c 20 62 75 74 20 6d 61 79  2 bytes, but may
1ad60 20 62 65 0a 2a 2a 20 6c 61 72 67 65 72 20 66 6f   be.** larger fo
1ad70 72 20 73 6f 6d 65 20 64 65 76 69 63 65 73 2e 0a  r some devices..
1ad80 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 63 6f 64  **.** SQLite cod
1ad90 65 20 61 73 73 75 6d 65 73 20 74 68 69 73 20 66  e assumes this f
1ada0 75 6e 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 66  unction cannot f
1adb0 61 69 6c 2e 20 49 74 20 61 6c 73 6f 20 61 73 73  ail. It also ass
1adc0 75 6d 65 73 20 74 68 61 74 0a 2a 2a 20 69 66 20  umes that.** if 
1add0 74 77 6f 20 66 69 6c 65 73 20 61 72 65 20 63 72  two files are cr
1ade0 65 61 74 65 64 20 69 6e 20 74 68 65 20 73 61 6d  eated in the sam
1adf0 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 64 69  e file-system di
1ae00 72 65 63 74 6f 72 79 20 28 69 2e 65 2e 0a 2a 2a  rectory (i.e..**
1ae10 20 61 20 64 61 74 61 62 61 73 65 20 61 6e 64 20   a database and 
1ae20 69 74 73 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  its journal file
1ae30 29 20 74 68 61 74 20 74 68 65 20 73 65 63 74 6f  ) that the secto
1ae40 72 20 73 69 7a 65 20 77 69 6c 6c 20 62 65 20 74  r size will be t
1ae50 68 65 0a 2a 2a 20 73 61 6d 65 20 66 6f 72 20 62  he.** same for b
1ae60 6f 74 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  oth..*/.static i
1ae70 6e 74 20 75 6e 69 78 53 65 63 74 6f 72 53 69 7a  nt unixSectorSiz
1ae80 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
1ae90 4e 6f 74 55 73 65 64 29 7b 0a 20 20 55 4e 55 53  NotUsed){.  UNUS
1aea0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
1aeb0 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20  Used);.  return 
1aec0 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 53  SQLITE_DEFAULT_S
1aed0 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 7d 0a 0a 2f  ECTOR_SIZE;.}../
1aee0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
1aef0 64 65 76 69 63 65 20 63 68 61 72 61 63 74 65 72  device character
1af00 69 73 74 69 63 73 20 66 6f 72 20 74 68 65 20 66  istics for the f
1af10 69 6c 65 2e 20 54 68 69 73 20 69 73 20 61 6c 77  ile. This is alw
1af20 61 79 73 20 30 20 66 6f 72 20 75 6e 69 78 2e 0a  ays 0 for unix..
1af30 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
1af40 69 78 44 65 76 69 63 65 43 68 61 72 61 63 74 65  ixDeviceCharacte
1af50 72 69 73 74 69 63 73 28 73 71 6c 69 74 65 33 5f  ristics(sqlite3_
1af60 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64 29 7b 0a  file *NotUsed){.
1af70 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
1af80 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72  ER(NotUsed);.  r
1af90 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
1afa0 2a 20 48 65 72 65 20 65 6e 64 73 20 74 68 65 20  * Here ends the 
1afb0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
1afc0 66 20 61 6c 6c 20 73 71 6c 69 74 65 33 5f 66 69  f all sqlite3_fi
1afd0 6c 65 20 6d 65 74 68 6f 64 73 2e 0a 2a 2a 0a 2a  le methods..**.*
1afe0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1aff0 2a 2a 2a 2a 2a 20 45 6e 64 20 73 71 6c 69 74 65  ***** End sqlite
1b000 33 5f 66 69 6c 65 20 4d 65 74 68 6f 64 73 20 2a  3_file Methods *
1b010 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1b020 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
1b030 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1b040 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1b050 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1b060 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1b070 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
1b080 2f 2a 0a 2a 2a 20 54 68 69 73 20 64 69 76 69 73  /*.** This divis
1b090 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 64 65 66  ion contains def
1b0a0 69 6e 69 74 69 6f 6e 73 20 6f 66 20 73 71 6c 69  initions of sqli
1b0b0 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f  te3_io_methods o
1b0c0 62 6a 65 63 74 73 20 74 68 61 74 0a 2a 2a 20 69  bjects that.** i
1b0d0 6d 70 6c 65 6d 65 6e 74 20 76 61 72 69 6f 75 73  mplement various
1b0e0 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 73 74   file locking st
1b0f0 72 61 74 65 67 69 65 73 2e 20 20 49 74 20 61 6c  rategies.  It al
1b100 73 6f 20 63 6f 6e 74 61 69 6e 73 20 64 65 66 69  so contains defi
1b110 6e 69 74 69 6f 6e 73 0a 2a 2a 20 6f 66 20 22 66  nitions.** of "f
1b120 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 73  inder" functions
1b130 2e 20 20 41 20 66 69 6e 64 65 72 2d 66 75 6e 63  .  A finder-func
1b140 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
1b150 6c 6f 63 61 74 65 20 74 68 65 20 61 70 70 72 6f  locate the appro
1b160 70 72 69 61 74 65 0a 2a 2a 20 73 71 6c 69 74 65  priate.** sqlite
1b170 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a  3_io_methods obj
1b180 65 63 74 20 66 6f 72 20 61 20 70 61 72 74 69 63  ect for a partic
1b190 75 6c 61 72 20 64 61 74 61 62 61 73 65 20 66 69  ular database fi
1b1a0 6c 65 2e 20 20 54 68 65 20 70 41 70 70 44 61 74  le.  The pAppDat
1b1b0 61 0a 2a 2a 20 66 69 65 6c 64 20 6f 66 20 74 68  a.** field of th
1b1c0 65 20 73 71 6c 69 74 65 33 5f 76 66 73 20 56 46  e sqlite3_vfs VF
1b1d0 53 20 6f 62 6a 65 63 74 73 20 61 72 65 20 69 6e  S objects are in
1b1e0 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 62 65 20  itialized to be 
1b1f0 70 6f 69 6e 74 65 72 73 20 74 6f 0a 2a 2a 20 74  pointers to.** t
1b200 68 65 20 63 6f 72 72 65 63 74 20 66 69 6e 64 65  he correct finde
1b210 72 2d 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 74  r-function for t
1b220 68 61 74 20 56 46 53 2e 0a 2a 2a 0a 2a 2a 20 4d  hat VFS..**.** M
1b230 6f 73 74 20 66 69 6e 64 65 72 20 66 75 6e 63 74  ost finder funct
1b240 69 6f 6e 73 20 72 65 74 75 72 6e 20 61 20 70 6f  ions return a po
1b250 69 6e 74 65 72 20 74 6f 20 61 20 66 69 78 65 64  inter to a fixed
1b260 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
1b270 6f 64 73 0a 2a 2a 20 6f 62 6a 65 63 74 2e 20 20  ods.** object.  
1b280 54 68 65 20 6f 6e 6c 79 20 69 6e 74 65 72 65 73  The only interes
1b290 74 69 6e 67 20 66 69 6e 64 65 72 2d 66 75 6e 63  ting finder-func
1b2a0 74 69 6f 6e 20 69 73 20 61 75 74 6f 6c 6f 63 6b  tion is autolock
1b2b0 49 6f 46 69 6e 64 65 72 2c 20 77 68 69 63 68 0a  IoFinder, which.
1b2c0 2a 2a 20 6c 6f 6f 6b 73 20 61 74 20 74 68 65 20  ** looks at the 
1b2d0 66 69 6c 65 73 79 73 74 65 6d 20 74 79 70 65 20  filesystem type 
1b2e0 61 6e 64 20 74 72 69 65 73 20 74 6f 20 67 75 65  and tries to gue
1b2f0 73 73 20 74 68 65 20 62 65 73 74 20 6c 6f 63 6b  ss the best lock
1b300 69 6e 67 0a 2a 2a 20 73 74 72 61 74 65 67 79 20  ing.** strategy 
1b310 66 72 6f 6d 20 74 68 61 74 2e 0a 2a 2a 0a 2a 2a  from that..**.**
1b320 20 46 6f 72 20 66 69 6e 64 65 72 2d 66 75 6e 74   For finder-funt
1b330 69 6f 6e 20 46 2c 20 74 77 6f 20 6f 62 6a 65 63  ion F, two objec
1b340 74 73 20 61 72 65 20 63 72 65 61 74 65 64 3a 0a  ts are created:.
1b350 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 54 68 65  **.**    (1) The
1b360 20 72 65 61 6c 20 66 69 6e 64 65 72 2d 66 75 6e   real finder-fun
1b370 63 74 69 6f 6e 20 6e 61 6d 65 64 20 22 46 49 6d  ction named "FIm
1b380 70 74 28 29 22 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  pt()"..**.**    
1b390 28 32 29 20 41 20 63 6f 6e 73 74 61 6e 74 20 70  (2) A constant p
1b3a0 6f 69 6e 74 65 72 20 74 6f 20 74 68 69 73 20 66  ointer to this f
1b3b0 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 64 20 6a 75  unction named ju
1b3c0 73 74 20 22 46 22 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a  st "F"..**.**.**
1b3d0 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   A pointer to th
1b3e0 65 20 46 20 70 6f 69 6e 74 65 72 20 69 73 20 75  e F pointer is u
1b3f0 73 65 64 20 61 73 20 74 68 65 20 70 41 70 70 44  sed as the pAppD
1b400 61 74 61 20 76 61 6c 75 65 20 66 6f 72 20 56 46  ata value for VF
1b410 53 0a 2a 2a 20 6f 62 6a 65 63 74 73 2e 20 20 57  S.** objects.  W
1b420 65 20 68 61 76 65 20 74 6f 20 64 6f 20 74 68 69  e have to do thi
1b430 73 20 69 6e 73 74 65 61 64 20 6f 66 20 6c 65 74  s instead of let
1b440 74 69 6e 67 20 70 41 70 70 44 61 74 61 20 70 6f  ting pAppData po
1b450 69 6e 74 0a 2a 2a 20 64 69 72 65 63 74 6c 79 20  int.** directly 
1b460 61 74 20 74 68 65 20 66 69 6e 64 65 72 2d 66 75  at the finder-fu
1b470 6e 63 74 69 6f 6e 20 73 69 6e 63 65 20 43 39 30  nction since C90
1b480 20 72 75 6c 65 73 20 70 72 65 76 65 6e 74 20 61   rules prevent a
1b490 20 76 6f 69 64 2a 0a 2a 2a 20 66 72 6f 6d 20 62   void*.** from b
1b4a0 65 20 63 61 73 74 20 69 6e 74 6f 20 61 20 66 75  e cast into a fu
1b4b0 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 2e 0a  nction pointer..
1b4c0 2a 2a 0a 2a 2a 0a 2a 2a 20 45 61 63 68 20 69 6e  **.**.** Each in
1b4d0 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6d  stance of this m
1b4e0 61 63 72 6f 20 67 65 6e 65 72 61 74 65 73 20 74  acro generates t
1b4f0 77 6f 20 6f 62 6a 65 63 74 73 3a 0a 2a 2a 0a 2a  wo objects:.**.*
1b500 2a 20 20 20 2a 20 20 41 20 63 6f 6e 73 74 61 6e  *   *  A constan
1b510 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  t sqlite3_io_met
1b520 68 6f 64 73 20 6f 62 6a 65 63 74 20 63 61 6c 6c  hods object call
1b530 20 4d 45 54 48 4f 44 20 74 68 61 74 20 68 61 73   METHOD that has
1b540 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   locking.**     
1b550 20 6d 65 74 68 6f 64 73 20 43 4c 4f 53 45 2c 20   methods CLOSE, 
1b560 4c 4f 43 4b 2c 20 55 4e 4c 4f 43 4b 2c 20 43 4b  LOCK, UNLOCK, CK
1b570 52 45 53 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 20  RESLOCK..**.**  
1b580 20 2a 20 20 41 6e 20 49 2f 4f 20 6d 65 74 68 6f   *  An I/O metho
1b590 64 20 66 69 6e 64 65 72 20 66 75 6e 63 74 69 6f  d finder functio
1b5a0 6e 20 63 61 6c 6c 65 64 20 46 49 4e 44 45 52 20  n called FINDER 
1b5b0 74 68 61 74 20 72 65 74 75 72 6e 73 20 61 20 70  that returns a p
1b5c0 6f 69 6e 74 65 72 0a 2a 2a 20 20 20 20 20 20 74  ointer.**      t
1b5d0 6f 20 74 68 65 20 4d 45 54 48 4f 44 20 6f 62 6a  o the METHOD obj
1b5e0 65 63 74 20 69 6e 20 74 68 65 20 70 72 65 76 69  ect in the previ
1b5f0 6f 75 73 20 62 75 6c 6c 65 74 2e 0a 2a 2f 0a 23  ous bullet..*/.#
1b600 64 65 66 69 6e 65 20 49 4f 4d 45 54 48 4f 44 53  define IOMETHODS
1b610 28 46 49 4e 44 45 52 2c 20 4d 45 54 48 4f 44 2c  (FINDER, METHOD,
1b620 20 43 4c 4f 53 45 2c 20 4c 4f 43 4b 2c 20 55 4e   CLOSE, LOCK, UN
1b630 4c 4f 43 4b 2c 20 43 4b 4c 4f 43 4b 29 20 20 20  LOCK, CKLOCK)   
1b640 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 73 74              \.st
1b650 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74  atic const sqlit
1b660 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 4d 45  e3_io_methods ME
1b670 54 48 4f 44 20 3d 20 7b 20 20 20 20 20 20 20 20  THOD = {        
1b680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b690 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
1b6a0 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1,              
1b6b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69              /* i
1b6c0 56 65 72 73 69 6f 6e 20 2a 2f 20 20 20 20 20 20  Version */      
1b6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b6e0 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 43            \.   C
1b6f0 4c 4f 53 45 2c 20 20 20 20 20 20 20 20 20 20 20  LOSE,           
1b700 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
1b710 6c 6f 73 65 20 2a 2f 20 20 20 20 20 20 20 20 20  lose */         
1b720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b730 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e           \.   un
1b740 69 78 52 65 61 64 2c 20 20 20 20 20 20 20 20 20  ixRead,         
1b750 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52 65            /* xRe
1b760 61 64 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  ad */           
1b770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b780 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69          \.   uni
1b790 78 57 72 69 74 65 2c 20 20 20 20 20 20 20 20 20  xWrite,         
1b7a0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 57 72 69           /* xWri
1b7b0 74 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  te */           
1b7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b7d0 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78         \.   unix
1b7e0 54 72 75 6e 63 61 74 65 2c 20 20 20 20 20 20 20  Truncate,       
1b7f0 20 20 20 20 20 20 20 20 2f 2a 20 78 54 72 75 6e          /* xTrun
1b800 63 61 74 65 20 2a 2f 20 20 20 20 20 20 20 20 20  cate */         
1b810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b820 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53        \.   unixS
1b830 79 6e 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  ync,            
1b840 20 20 20 20 20 20 20 2f 2a 20 78 53 79 6e 63 20         /* xSync 
1b850 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
1b860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b870 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 46 69       \.   unixFi
1b880 6c 65 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20  leSize,         
1b890 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 65 53 69        /* xFileSi
1b8a0 7a 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  ze */           
1b8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b8c0 20 20 20 20 5c 0a 20 20 20 4c 4f 43 4b 2c 20 20      \.   LOCK,  
1b8d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b8e0 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 2a 2f       /* xLock */
1b8f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b910 20 20 20 5c 0a 20 20 20 55 4e 4c 4f 43 4b 2c 20     \.   UNLOCK, 
1b920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b930 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 2a      /* xUnlock *
1b940 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
1b950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b960 20 20 5c 0a 20 20 20 43 4b 4c 4f 43 4b 2c 20 20    \.   CKLOCK,  
1b970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b980 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65     /* xCheckRese
1b990 72 76 65 64 4c 6f 63 6b 20 2a 2f 20 20 20 20 20  rvedLock */     
1b9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b9b0 20 5c 0a 20 20 20 75 6e 69 78 46 69 6c 65 43 6f   \.   unixFileCo
1b9c0 6e 74 72 6f 6c 2c 20 20 20 20 20 20 20 20 20 20  ntrol,          
1b9d0 20 20 2f 2a 20 78 46 69 6c 65 43 6f 6e 74 72 6f    /* xFileContro
1b9e0 6c 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  l */            
1b9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba00 5c 0a 20 20 20 75 6e 69 78 53 65 63 74 6f 72 53  \.   unixSectorS
1ba10 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ize,            
1ba20 20 2f 2a 20 78 53 65 63 74 6f 72 53 69 7a 65 20   /* xSectorSize 
1ba30 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
1ba40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
1ba50 0a 20 20 20 75 6e 69 78 44 65 76 69 63 65 43 68  .   unixDeviceCh
1ba60 61 72 61 63 74 65 72 69 73 74 69 63 73 20 20 20  aracteristics   
1ba70 2f 2a 20 78 44 65 76 69 63 65 43 61 70 61 62 69  /* xDeviceCapabi
1ba80 6c 69 74 69 65 73 20 2a 2f 20 20 20 20 20 20 20  lities */       
1ba90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
1baa0 7d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  };              
1bab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bae0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 73               \.s
1baf0 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69  tatic const sqli
1bb00 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a  te3_io_methods *
1bb10 46 49 4e 44 45 52 23 23 49 6d 70 6c 28 63 6f 6e  FINDER##Impl(con
1bb20 73 74 20 63 68 61 72 20 2a 7a 2c 20 75 6e 69 78  st char *z, unix
1bb30 46 69 6c 65 20 2a 70 29 7b 20 20 20 5c 0a 20 20  File *p){   \.  
1bb40 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
1bb50 28 7a 29 3b 20 55 4e 55 53 45 44 5f 50 41 52 41  (z); UNUSED_PARA
1bb60 4d 45 54 45 52 28 70 29 3b 20 20 20 20 20 20 20  METER(p);       
1bb70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bb80 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 72             \.  r
1bb90 65 74 75 72 6e 20 26 4d 45 54 48 4f 44 3b 20 20  eturn &METHOD;  
1bba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bbb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bbc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bbd0 20 20 20 20 20 20 20 20 20 20 5c 0a 7d 20 20 20            \.}   
1bbe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bbf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc20 20 20 20 20 20 20 20 20 20 5c 0a 73 74 61 74 69           \.stati
1bc30 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  c const sqlite3_
1bc40 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 28 2a 63 6f  io_methods *(*co
1bc50 6e 73 74 20 46 49 4e 44 45 52 29 28 63 6f 6e 73  nst FINDER)(cons
1bc60 74 20 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65  t char*,unixFile
1bc70 20 2a 70 29 20 20 20 20 5c 0a 20 20 20 20 3d 20   *p)    \.    = 
1bc80 46 49 4e 44 45 52 23 23 49 6d 70 6c 3b 0a 0a 2f  FINDER##Impl;../
1bc90 2a 0a 2a 2a 20 48 65 72 65 20 61 72 65 20 61 6c  *.** Here are al
1bca0 6c 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33  l of the sqlite3
1bcb0 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65  _io_methods obje
1bcc0 63 74 73 20 66 6f 72 20 65 61 63 68 20 6f 66 20  cts for each of 
1bcd0 74 68 65 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 73  the.** locking s
1bce0 74 72 61 74 65 67 69 65 73 2e 20 20 46 75 6e 63  trategies.  Func
1bcf0 74 69 6f 6e 73 20 74 68 61 74 20 72 65 74 75 72  tions that retur
1bd00 6e 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 74 68  n pointers to th
1bd10 65 73 65 20 6d 65 74 68 6f 64 73 0a 2a 2a 20 61  ese methods.** a
1bd20 72 65 20 61 6c 73 6f 20 63 72 65 61 74 65 64 2e  re also created.
1bd30 0a 2a 2f 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20  .*/.IOMETHODS(. 
1bd40 20 70 6f 73 69 78 49 6f 46 69 6e 64 65 72 2c 20   posixIoFinder, 
1bd50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
1bd60 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61  nder function na
1bd70 6d 65 20 2a 2f 0a 20 20 70 6f 73 69 78 49 6f 4d  me */.  posixIoM
1bd80 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20  ethods,         
1bd90 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f    /* sqlite3_io_
1bda0 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e  methods object n
1bdb0 61 6d 65 20 2a 2f 0a 20 20 75 6e 69 78 43 6c 6f  ame */.  unixClo
1bdc0 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
1bdd0 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74     /* xClose met
1bde0 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 4c 6f 63  hod */.  unixLoc
1bdf0 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
1be00 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68     /* xLock meth
1be10 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 55 6e 6c 6f  od */.  unixUnlo
1be20 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
1be30 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74    /* xUnlock met
1be40 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 43 68 65  hod */.  unixChe
1be50 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 20  ckReservedLock  
1be60 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65     /* xCheckRese
1be70 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  rvedLock method 
1be80 2a 2f 0a 29 0a 49 4f 4d 45 54 48 4f 44 53 28 0a  */.).IOMETHODS(.
1be90 20 20 6e 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72    nolockIoFinder
1bea0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  ,           /* F
1beb0 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e  inder function n
1bec0 61 6d 65 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 49  ame */.  nolockI
1bed0 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20  oMethods,       
1bee0 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f     /* sqlite3_io
1bef0 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20  _methods object 
1bf00 6e 61 6d 65 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b  name */.  nolock
1bf10 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20  Close,          
1bf20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65      /* xClose me
1bf30 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b  thod */.  nolock
1bf40 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Lock,           
1bf50 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74      /* xLock met
1bf60 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 55  hod */.  nolockU
1bf70 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  nlock,          
1bf80 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65     /* xUnlock me
1bf90 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b  thod */.  nolock
1bfa0 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
1bfb0 6b 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73  k   /* xCheckRes
1bfc0 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64  ervedLock method
1bfd0 20 2a 2f 0a 29 0a 49 4f 4d 45 54 48 4f 44 53 28   */.).IOMETHODS(
1bfe0 0a 20 20 64 6f 74 6c 6f 63 6b 49 6f 46 69 6e 64  .  dotlockIoFind
1bff0 65 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  er,          /* 
1c000 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20  Finder function 
1c010 6e 61 6d 65 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63  name */.  dotloc
1c020 6b 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20  kIoMethods,     
1c030 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69      /* sqlite3_i
1c040 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74  o_methods object
1c050 20 6e 61 6d 65 20 2a 2f 0a 20 20 64 6f 74 6c 6f   name */.  dotlo
1c060 63 6b 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20  ckClose,        
1c070 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d       /* xClose m
1c080 65 74 68 6f 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f  ethod */.  dotlo
1c090 63 6b 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  ckLock,         
1c0a0 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65       /* xLock me
1c0b0 74 68 6f 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63  thod */.  dotloc
1c0c0 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20  kUnlock,        
1c0d0 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d      /* xUnlock m
1c0e0 65 74 68 6f 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f  ethod */.  dotlo
1c0f0 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  ckCheckReservedL
1c100 6f 63 6b 20 20 2f 2a 20 78 43 68 65 63 6b 52 65  ock  /* xCheckRe
1c110 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f  servedLock metho
1c120 64 20 2a 2f 0a 29 0a 0a 23 69 66 20 53 51 4c 49  d */.)..#if SQLI
1c130 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
1c140 47 5f 53 54 59 4c 45 20 26 26 20 21 4f 53 5f 56  G_STYLE && !OS_V
1c150 58 57 4f 52 4b 53 0a 49 4f 4d 45 54 48 4f 44 53  XWORKS.IOMETHODS
1c160 28 0a 20 20 66 6c 6f 63 6b 49 6f 46 69 6e 64 65  (.  flockIoFinde
1c170 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  r,            /*
1c180 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e   Finder function
1c190 20 6e 61 6d 65 20 2a 2f 0a 20 20 66 6c 6f 63 6b   name */.  flock
1c1a0 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20  IoMethods,      
1c1b0 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f       /* sqlite3_
1c1c0 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63  io_methods objec
1c1d0 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 66 6c 6f 63  t name */.  floc
1c1e0 6b 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20  kClose,         
1c1f0 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20        /* xClose 
1c200 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f 63  method */.  floc
1c210 6b 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  kLock,          
1c220 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d        /* xLock m
1c230 65 74 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b  ethod */.  flock
1c240 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  Unlock,         
1c250 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20       /* xUnlock 
1c260 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f 63  method */.  floc
1c270 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  kCheckReservedLo
1c280 63 6b 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52  ck    /* xCheckR
1c290 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68  eservedLock meth
1c2a0 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a  od */.).#endif..
1c2b0 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 49  #if OS_VXWORKS.I
1c2c0 4f 4d 45 54 48 4f 44 53 28 0a 20 20 73 65 6d 49  OMETHODS(.  semI
1c2d0 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20  oFinder,        
1c2e0 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20        /* Finder 
1c2f0 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f  function name */
1c300 0a 20 20 73 65 6d 49 6f 4d 65 74 68 6f 64 73 2c  .  semIoMethods,
1c310 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c320 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
1c330 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a  ds object name *
1c340 2f 0a 20 20 73 65 6d 43 6c 6f 73 65 2c 20 20 20  /.  semClose,   
1c350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c360 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a   xClose method *
1c370 2f 0a 20 20 73 65 6d 4c 6f 63 6b 2c 20 20 20 20  /.  semLock,    
1c380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c390 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f   xLock method */
1c3a0 0a 20 20 73 65 6d 55 6e 6c 6f 63 6b 2c 20 20 20  .  semUnlock,   
1c3b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c3c0 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  xUnlock method *
1c3d0 2f 0a 20 20 73 65 6d 43 68 65 63 6b 52 65 73 65  /.  semCheckRese
1c3e0 72 76 65 64 4c 6f 63 6b 20 20 20 20 20 20 2f 2a  rvedLock      /*
1c3f0 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
1c400 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a  ock method */.).
1c410 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69  #endif..#if defi
1c420 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26  ned(__APPLE__) &
1c430 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  & SQLITE_ENABLE_
1c440 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 49 4f  LOCKING_STYLE.IO
1c450 4d 45 54 48 4f 44 53 28 0a 20 20 61 66 70 49 6f  METHODS(.  afpIo
1c460 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20  Finder,         
1c470 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66       /* Finder f
1c480 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a  unction name */.
1c490 20 20 61 66 70 49 6f 4d 65 74 68 6f 64 73 2c 20    afpIoMethods, 
1c4a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
1c4b0 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
1c4c0 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f  s object name */
1c4d0 0a 20 20 61 66 70 43 6c 6f 73 65 2c 20 20 20 20  .  afpClose,    
1c4e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c4f0 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f  xClose method */
1c500 0a 20 20 61 66 70 4c 6f 63 6b 2c 20 20 20 20 20  .  afpLock,     
1c510 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c520 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  xLock method */.
1c530 20 20 61 66 70 55 6e 6c 6f 63 6b 2c 20 20 20 20    afpUnlock,    
1c540 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
1c550 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f  Unlock method */
1c560 0a 20 20 61 66 70 43 68 65 63 6b 52 65 73 65 72  .  afpCheckReser
1c570 76 65 64 4c 6f 63 6b 20 20 20 20 20 20 2f 2a 20  vedLock      /* 
1c580 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
1c590 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23  ck method */.).#
1c5a0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
1c5b0 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 6d   proxy locking m
1c5c0 65 74 68 6f 64 20 69 73 20 61 20 22 73 75 70 65  ethod is a "supe
1c5d0 72 2d 6d 65 74 68 6f 64 22 20 69 6e 20 74 68 65  r-method" in the
1c5e0 20 73 65 6e 73 65 20 74 68 61 74 20 69 74 0a 2a   sense that it.*
1c5f0 2a 20 6f 70 65 6e 73 20 73 65 63 6f 6e 64 61 72  * opens secondar
1c600 79 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  y file descripto
1c610 72 73 20 66 6f 72 20 74 68 65 20 63 6f 6e 63 68  rs for the conch
1c620 20 61 6e 64 20 6c 6f 63 6b 20 66 69 6c 65 73 20   and lock files 
1c630 61 6e 64 0a 2a 2a 20 69 74 20 75 73 65 73 20 70  and.** it uses p
1c640 72 6f 78 79 2c 20 64 6f 74 2d 66 69 6c 65 2c 20  roxy, dot-file, 
1c650 41 46 50 2c 20 61 6e 64 20 66 6c 6f 63 6b 28 29  AFP, and flock()
1c660 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73   locking methods
1c670 20 6f 6e 20 74 68 6f 73 65 0a 2a 2a 20 73 65 63   on those.** sec
1c680 6f 6e 64 61 72 79 20 66 69 6c 65 73 2e 20 20 46  ondary files.  F
1c690 6f 72 20 74 68 69 73 20 72 65 61 73 6f 6e 2c 20  or this reason, 
1c6a0 74 68 65 20 64 69 76 69 73 69 6f 6e 20 74 68 61  the division tha
1c6b0 74 20 69 6d 70 6c 65 6d 65 6e 74 73 0a 2a 2a 20  t implements.** 
1c6c0 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73  proxy locking is
1c6d0 20 6c 6f 63 61 74 65 64 20 6d 75 63 68 20 66 75   located much fu
1c6e0 72 74 68 65 72 20 64 6f 77 6e 20 69 6e 20 74 68  rther down in th
1c6f0 65 20 66 69 6c 65 2e 20 20 42 75 74 20 77 65 20  e file.  But we 
1c700 6e 65 65 64 0a 2a 2a 20 74 6f 20 67 6f 20 61 68  need.** to go ah
1c710 65 61 64 20 61 6e 64 20 64 65 66 69 6e 65 20 74  ead and define t
1c720 68 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  he sqlite3_io_me
1c730 74 68 6f 64 73 20 61 6e 64 20 66 69 6e 64 65 72  thods and finder
1c740 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 66 6f 72   function.** for
1c750 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 68   proxy locking h
1c760 65 72 65 2e 20 20 53 6f 20 77 65 20 66 6f 72 77  ere.  So we forw
1c770 61 72 64 20 64 65 63 6c 61 72 65 20 74 68 65 20  ard declare the 
1c780 49 2f 4f 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a  I/O methods..*/.
1c790 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50  #if defined(__AP
1c7a0 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45  PLE__) && SQLITE
1c7b0 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
1c7c0 53 54 59 4c 45 0a 73 74 61 74 69 63 20 69 6e 74  STYLE.static int
1c7d0 20 70 72 6f 78 79 43 6c 6f 73 65 28 73 71 6c 69   proxyClose(sqli
1c7e0 74 65 33 5f 66 69 6c 65 2a 29 3b 0a 73 74 61 74  te3_file*);.stat
1c7f0 69 63 20 69 6e 74 20 70 72 6f 78 79 4c 6f 63 6b  ic int proxyLock
1c800 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20  (sqlite3_file*, 
1c810 69 6e 74 29 3b 0a 73 74 61 74 69 63 20 69 6e 74  int);.static int
1c820 20 70 72 6f 78 79 55 6e 6c 6f 63 6b 28 73 71 6c   proxyUnlock(sql
1c830 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 29  ite3_file*, int)
1c840 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  ;.static int pro
1c850 78 79 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  xyCheckReservedL
1c860 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
1c870 2a 2c 20 69 6e 74 2a 29 3b 0a 49 4f 4d 45 54 48  *, int*);.IOMETH
1c880 4f 44 53 28 0a 20 20 70 72 6f 78 79 49 6f 46 69  ODS(.  proxyIoFi
1c890 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  nder,           
1c8a0 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74   /* Finder funct
1c8b0 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 70 72  ion name */.  pr
1c8c0 6f 78 79 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20  oxyIoMethods,   
1c8d0 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74          /* sqlit
1c8e0 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62  e3_io_methods ob
1c8f0 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 70  ject name */.  p
1c900 72 6f 78 79 43 6c 6f 73 65 2c 20 20 20 20 20 20  roxyClose,      
1c910 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f           /* xClo
1c920 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 70  se method */.  p
1c930 72 6f 78 79 4c 6f 63 6b 2c 20 20 20 20 20 20 20  roxyLock,       
1c940 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63           /* xLoc
1c950 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72  k method */.  pr
1c960 6f 78 79 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20  oxyUnlock,      
1c970 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f          /* xUnlo
1c980 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 70  ck method */.  p
1c990 72 6f 78 79 43 68 65 63 6b 52 65 73 65 72 76 65  roxyCheckReserve
1c9a0 64 4c 6f 63 6b 20 20 20 20 2f 2a 20 78 43 68 65  dLock    /* xChe
1c9b0 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d  ckReservedLock m
1c9c0 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69  ethod */.).#endi
1c9d0 66 0a 0a 2f 2a 20 6e 66 73 20 6c 6f 63 6b 64 20  f../* nfs lockd 
1c9e0 6f 6e 20 4f 53 58 20 31 30 2e 33 2b 20 64 6f 65  on OSX 10.3+ doe
1c9f0 73 6e 27 74 20 63 6c 65 61 72 20 77 72 69 74 65  sn't clear write
1ca00 20 6c 6f 63 6b 73 20 77 68 65 6e 20 61 20 72 65   locks when a re
1ca10 61 64 20 6c 6f 63 6b 20 69 73 20 73 65 74 20 2a  ad lock is set *
1ca20 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  /.#if defined(__
1ca30 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
1ca40 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
1ca50 47 5f 53 54 59 4c 45 0a 49 4f 4d 45 54 48 4f 44  G_STYLE.IOMETHOD
1ca60 53 28 0a 20 20 6e 66 73 49 6f 46 69 6e 64 65 72  S(.  nfsIoFinder
1ca70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1ca80 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69  /* Finder functi
1ca90 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 6e 66 73  on name */.  nfs
1caa0 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20  IoMethods,      
1cab0 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74          /* sqlit
1cac0 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62  e3_io_methods ob
1cad0 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 75  ject name */.  u
1cae0 6e 69 78 43 6c 6f 73 65 2c 20 20 20 20 20 20 20  nixClose,       
1caf0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c            /* xCl
1cb00 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ose method */.  
1cb10 75 6e 69 78 4c 6f 63 6b 2c 20 20 20 20 20 20 20  unixLock,       
1cb20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c             /* xL
1cb30 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
1cb40 6e 66 73 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20  nfsUnlock,      
1cb50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55             /* xU
1cb60 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  nlock method */.
1cb70 20 20 75 6e 69 78 43 68 65 63 6b 52 65 73 65 72    unixCheckReser
1cb80 76 65 64 4c 6f 63 6b 20 20 20 20 20 20 2f 2a 20  vedLock      /* 
1cb90 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
1cba0 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23  ck method */.).#
1cbb0 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e  endif..#if defin
1cbc0 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26  ed(__APPLE__) &&
1cbd0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
1cbe0 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 20  OCKING_STYLE./* 
1cbf0 0a 2a 2a 20 54 68 69 73 20 22 66 69 6e 64 65 72  .** This "finder
1cc00 22 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d  " function attem
1cc10 70 74 73 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  pts to determine
1cc20 20 74 68 65 20 62 65 73 74 20 6c 6f 63 6b 69 6e   the best lockin
1cc30 67 20 73 74 72 61 74 65 67 79 20 0a 2a 2a 20 66  g strategy .** f
1cc40 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20  or the database 
1cc50 66 69 6c 65 20 22 66 69 6c 65 50 61 74 68 22 2e  file "filePath".
1cc60 20 20 49 74 20 74 68 65 6e 20 72 65 74 75 72 6e    It then return
1cc70 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6f  s the sqlite3_io
1cc80 5f 6d 65 74 68 6f 64 73 0a 2a 2a 20 6f 62 6a 65  _methods.** obje
1cc90 63 74 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e  ct that implemen
1cca0 74 73 20 74 68 61 74 20 73 74 72 61 74 65 67 79  ts that strategy
1ccb0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ..**.** This is 
1ccc0 66 6f 72 20 4d 61 63 4f 53 58 20 6f 6e 6c 79 2e  for MacOSX only.
1ccd0 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
1cce0 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
1ccf0 6f 64 73 20 2a 61 75 74 6f 6c 6f 63 6b 49 6f 46  ods *autolockIoF
1cd00 69 6e 64 65 72 49 6d 70 6c 28 0a 20 20 63 6f 6e  inderImpl(.  con
1cd10 73 74 20 63 68 61 72 20 2a 66 69 6c 65 50 61 74  st char *filePat
1cd20 68 2c 20 20 20 20 2f 2a 20 6e 61 6d 65 20 6f 66  h,    /* name of
1cd30 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1cd40 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65  le */.  unixFile
1cd50 20 2a 70 4e 65 77 20 20 20 20 20 20 20 20 20 20   *pNew          
1cd60 20 2f 2a 20 6f 70 65 6e 20 66 69 6c 65 20 6f 62   /* open file ob
1cd70 6a 65 63 74 20 66 6f 72 20 74 68 65 20 64 61 74  ject for the dat
1cd80 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 29 7b  abase file */.){
1cd90 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
1cda0 73 74 72 75 63 74 20 4d 61 70 70 69 6e 67 20 7b  struct Mapping {
1cdb0 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
1cdc0 2a 7a 46 69 6c 65 73 79 73 74 65 6d 3b 20 20 20  *zFilesystem;   
1cdd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
1cde0 6c 65 73 79 73 74 65 6d 20 74 79 70 65 20 6e 61  lesystem type na
1cdf0 6d 65 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20  me */.    const 
1ce00 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
1ce10 64 73 20 2a 70 4d 65 74 68 6f 64 73 3b 20 20 20  ds *pMethods;   
1ce20 2f 2a 20 41 70 70 72 6f 70 72 69 61 74 65 20 6c  /* Appropriate l
1ce30 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 20 2a 2f  ocking method */
1ce40 0a 20 20 7d 20 61 4d 61 70 5b 5d 20 3d 20 7b 0a  .  } aMap[] = {.
1ce50 20 20 20 20 7b 20 22 68 66 73 22 2c 20 20 20 20      { "hfs",    
1ce60 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 20  &posixIoMethods 
1ce70 7d 2c 0a 20 20 20 20 7b 20 22 75 66 73 22 2c 20  },.    { "ufs", 
1ce80 20 20 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f     &posixIoMetho
1ce90 64 73 20 7d 2c 0a 20 20 20 20 7b 20 22 61 66 70  ds },.    { "afp
1cea0 66 73 22 2c 20 20 26 61 66 70 49 6f 4d 65 74 68  fs",  &afpIoMeth
1ceb0 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20 22 73 6d  ods },.    { "sm
1cec0 62 66 73 22 2c 20 20 26 61 66 70 49 6f 4d 65 74  bfs",  &afpIoMet
1ced0 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20 22 77  hods },.    { "w
1cee0 65 62 64 61 76 22 2c 20 26 6e 6f 6c 6f 63 6b 49  ebdav", &nolockI
1cef0 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20  oMethods },.    
1cf00 7b 20 30 2c 20 30 20 7d 0a 20 20 7d 3b 0a 20 20  { 0, 0 }.  };.  
1cf10 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
1cf20 73 74 61 74 66 73 20 66 73 49 6e 66 6f 3b 0a 20  statfs fsInfo;. 
1cf30 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f   struct flock lo
1cf40 63 6b 49 6e 66 6f 3b 0a 0a 20 20 69 66 28 20 21  ckInfo;..  if( !
1cf50 66 69 6c 65 50 61 74 68 20 29 7b 0a 20 20 20 20  filePath ){.    
1cf60 2f 2a 20 49 66 20 66 69 6c 65 50 61 74 68 3d 3d  /* If filePath==
1cf70 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e 73 20  NULL that means 
1cf80 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77  we are dealing w
1cf90 69 74 68 20 61 20 74 72 61 6e 73 69 65 6e 74 20  ith a transient 
1cfa0 66 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68 61 74  file.    ** that
1cfb0 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74   does not need t
1cfc0 6f 20 62 65 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a  o be locked. */.
1cfd0 20 20 20 20 72 65 74 75 72 6e 20 26 6e 6f 6c 6f      return &nolo
1cfe0 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d  ckIoMethods;.  }
1cff0 0a 20 20 69 66 28 20 73 74 61 74 66 73 28 66 69  .  if( statfs(fi
1d000 6c 65 50 61 74 68 2c 20 26 66 73 49 6e 66 6f 29  lePath, &fsInfo)
1d010 20 21 3d 20 2d 31 20 29 7b 0a 20 20 20 20 69 66   != -1 ){.    if
1d020 28 20 66 73 49 6e 66 6f 2e 66 5f 66 6c 61 67 73  ( fsInfo.f_flags
1d030 20 26 20 4d 4e 54 5f 52 44 4f 4e 4c 59 20 29 7b   & MNT_RDONLY ){
1d040 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 26 6e  .      return &n
1d050 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a  olockIoMethods;.
1d060 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d      }.    for(i=
1d070 30 3b 20 61 4d 61 70 5b 69 5d 2e 7a 46 69 6c 65  0; aMap[i].zFile
1d080 73 79 73 74 65 6d 3b 20 69 2b 2b 29 7b 0a 20 20  system; i++){.  
1d090 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 66      if( strcmp(f
1d0a0 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61  sInfo.f_fstypena
1d0b0 6d 65 2c 20 61 4d 61 70 5b 69 5d 2e 7a 46 69 6c  me, aMap[i].zFil
1d0c0 65 73 79 73 74 65 6d 29 3d 3d 30 20 29 7b 0a 20  esystem)==0 ){. 
1d0d0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 61 4d         return aM
1d0e0 61 70 5b 69 5d 2e 70 4d 65 74 68 6f 64 73 3b 0a  ap[i].pMethods;.
1d0f0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1d100 7d 0a 0a 20 20 2f 2a 20 44 65 66 61 75 6c 74 20  }..  /* Default 
1d110 63 61 73 65 2e 20 48 61 6e 64 6c 65 73 2c 20 61  case. Handles, a
1d120 6d 6f 6e 67 73 74 20 6f 74 68 65 72 73 2c 20 22  mongst others, "
1d130 6e 66 73 22 2e 0a 20 20 2a 2a 20 54 65 73 74 20  nfs"..  ** Test 
1d140 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 20  byte-range lock 
1d150 75 73 69 6e 67 20 66 63 6e 74 6c 28 29 2e 20 49  using fcntl(). I
1d160 66 20 74 68 65 20 63 61 6c 6c 20 73 75 63 63 65  f the call succe
1d170 65 64 73 2c 20 0a 20 20 2a 2a 20 61 73 73 75 6d  eds, .  ** assum
1d180 65 20 74 68 61 74 20 74 68 65 20 66 69 6c 65 2d  e that the file-
1d190 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 73 20  system supports 
1d1a0 50 4f 53 49 58 20 73 74 79 6c 65 20 6c 6f 63 6b  POSIX style lock
1d1b0 73 2e 20 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b 49  s. .  */.  lockI
1d1c0 6e 66 6f 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20  nfo.l_len = 1;. 
1d1d0 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 73 74 61 72   lockInfo.l_star
1d1e0 74 20 3d 20 30 3b 0a 20 20 6c 6f 63 6b 49 6e 66  t = 0;.  lockInf
1d1f0 6f 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45  o.l_whence = SEE
1d200 4b 5f 53 45 54 3b 0a 20 20 6c 6f 63 6b 49 6e 66  K_SET;.  lockInf
1d210 6f 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c  o.l_type = F_RDL
1d220 43 4b 3b 0a 20 20 69 66 28 20 66 63 6e 74 6c 28  CK;.  if( fcntl(
1d230 70 4e 65 77 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b  pNew->h, F_GETLK
1d240 2c 20 26 6c 6f 63 6b 49 6e 66 6f 29 21 3d 2d 31  , &lockInfo)!=-1
1d250 20 29 20 7b 0a 20 20 20 20 69 66 28 20 73 74 72   ) {.    if( str
1d260 63 6d 70 28 66 73 49 6e 66 6f 2e 66 5f 66 73 74  cmp(fsInfo.f_fst
1d270 79 70 65 6e 61 6d 65 2c 20 22 6e 66 73 22 29 3d  ypename, "nfs")=
1d280 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =0 ){.      retu
1d290 72 6e 20 26 6e 66 73 49 6f 4d 65 74 68 6f 64 73  rn &nfsIoMethods
1d2a0 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20  ;.    } else {. 
1d2b0 20 20 20 20 20 72 65 74 75 72 6e 20 26 70 6f 73       return &pos
1d2c0 69 78 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 20  ixIoMethods;.   
1d2d0 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
1d2e0 72 65 74 75 72 6e 20 26 64 6f 74 6c 6f 63 6b 49  return &dotlockI
1d2f0 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 7d 0a  oMethods;.  }.}.
1d300 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c  static const sql
1d310 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
1d320 0a 20 20 2a 28 2a 63 6f 6e 73 74 20 61 75 74 6f  .  *(*const auto
1d330 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 29 28 63 6f  lockIoFinder)(co
1d340 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69 78 46 69  nst char*,unixFi
1d350 6c 65 2a 29 20 3d 20 61 75 74 6f 6c 6f 63 6b 49  le*) = autolockI
1d360 6f 46 69 6e 64 65 72 49 6d 70 6c 3b 0a 0a 23 65  oFinderImpl;..#e
1d370 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28  ndif /* defined(
1d380 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51  __APPLE__) && SQ
1d390 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
1d3a0 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a 23 69  ING_STYLE */..#i
1d3b0 66 20 4f 53 5f 56 58 57 4f 52 4b 53 20 26 26 20  f OS_VXWORKS && 
1d3c0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
1d3d0 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 20 0a  CKING_STYLE./* .
1d3e0 2a 2a 20 54 68 69 73 20 22 66 69 6e 64 65 72 22  ** This "finder"
1d3f0 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70   function attemp
1d400 74 73 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ts to determine 
1d410 74 68 65 20 62 65 73 74 20 6c 6f 63 6b 69 6e 67  the best locking
1d420 20 73 74 72 61 74 65 67 79 20 0a 2a 2a 20 66 6f   strategy .** fo
1d430 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  r the database f
1d440 69 6c 65 20 22 66 69 6c 65 50 61 74 68 22 2e 20  ile "filePath". 
1d450 20 49 74 20 74 68 65 6e 20 72 65 74 75 72 6e 73   It then returns
1d460 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f   the sqlite3_io_
1d470 6d 65 74 68 6f 64 73 0a 2a 2a 20 6f 62 6a 65 63  methods.** objec
1d480 74 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74  t that implement
1d490 73 20 74 68 61 74 20 73 74 72 61 74 65 67 79 2e  s that strategy.
1d4a0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 66  .**.** This is f
1d4b0 6f 72 20 56 58 57 6f 72 6b 73 20 6f 6e 6c 79 2e  or VXWorks only.
1d4c0 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
1d4d0 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
1d4e0 6f 64 73 20 2a 61 75 74 6f 6c 6f 63 6b 49 6f 46  ods *autolockIoF
1d4f0 69 6e 64 65 72 49 6d 70 6c 28 0a 20 20 63 6f 6e  inderImpl(.  con
1d500 73 74 20 63 68 61 72 20 2a 66 69 6c 65 50 61 74  st char *filePat
1d510 68 2c 20 20 20 20 2f 2a 20 6e 61 6d 65 20 6f 66  h,    /* name of
1d520 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1d530 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65  le */.  unixFile
1d540 20 2a 70 4e 65 77 20 20 20 20 20 20 20 20 20 20   *pNew          
1d550 20 2f 2a 20 74 68 65 20 6f 70 65 6e 20 66 69 6c   /* the open fil
1d560 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20  e object */.){. 
1d570 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f   struct flock lo
1d580 63 6b 49 6e 66 6f 3b 0a 0a 20 20 69 66 28 20 21  ckInfo;..  if( !
1d590 66 69 6c 65 50 61 74 68 20 29 7b 0a 20 20 20 20  filePath ){.    
1d5a0 2f 2a 20 49 66 20 66 69 6c 65 50 61 74 68 3d 3d  /* If filePath==
1d5b0 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e 73 20  NULL that means 
1d5c0 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77  we are dealing w
1d5d0 69 74 68 20 61 20 74 72 61 6e 73 69 65 6e 74 20  ith a transient 
1d5e0 66 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68 61 74  file.    ** that
1d5f0 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74   does not need t
1d600 6f 20 62 65 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a  o be locked. */.
1d610 20 20 20 20 72 65 74 75 72 6e 20 26 6e 6f 6c 6f      return &nolo
1d620 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d  ckIoMethods;.  }
1d630 0a 0a 20 20 2f 2a 20 54 65 73 74 20 69 66 20 66  ..  /* Test if f
1d640 63 6e 74 6c 28 29 20 69 73 20 73 75 70 70 6f 72  cntl() is suppor
1d650 74 65 64 20 61 6e 64 20 75 73 65 20 50 4f 53 49  ted and use POSI
1d660 58 20 73 74 79 6c 65 20 6c 6f 63 6b 73 2e 0a 20  X style locks.. 
1d670 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 20 66 61   ** Otherwise fa
1d680 6c 6c 20 62 61 63 6b 20 74 6f 20 74 68 65 20 6e  ll back to the n
1d690 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6d  amed semaphore m
1d6a0 65 74 68 6f 64 2e 0a 20 20 2a 2f 0a 20 20 6c 6f  ethod..  */.  lo
1d6b0 63 6b 49 6e 66 6f 2e 6c 5f 6c 65 6e 20 3d 20 31  ckInfo.l_len = 1
1d6c0 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 73  ;.  lockInfo.l_s
1d6d0 74 61 72 74 20 3d 20 30 3b 0a 20 20 6c 6f 63 6b  tart = 0;.  lock
1d6e0 49 6e 66 6f 2e 6c 5f 77 68 65 6e 63 65 20 3d 20  Info.l_whence = 
1d6f0 53 45 45 4b 5f 53 45 54 3b 0a 20 20 6c 6f 63 6b  SEEK_SET;.  lock
1d700 49 6e 66 6f 2e 6c 5f 74 79 70 65 20 3d 20 46 5f  Info.l_type = F_
1d710 52 44 4c 43 4b 3b 0a 20 20 69 66 28 20 66 63 6e  RDLCK;.  if( fcn
1d720 74 6c 28 70 4e 65 77 2d 3e 68 2c 20 46 5f 47 45  tl(pNew->h, F_GE
1d730 54 4c 4b 2c 20 26 6c 6f 63 6b 49 6e 66 6f 29 21  TLK, &lockInfo)!
1d740 3d 2d 31 20 29 20 7b 0a 20 20 20 20 72 65 74 75  =-1 ) {.    retu
1d750 72 6e 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f  rn &posixIoMetho
1d760 64 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ds;.  }else{.   
1d770 20 72 65 74 75 72 6e 20 26 73 65 6d 49 6f 4d 65   return &semIoMe
1d780 74 68 6f 64 73 3b 0a 20 20 7d 0a 7d 0a 73 74 61  thods;.  }.}.sta
1d790 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  tic const sqlite
1d7a0 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 0a 20 20  3_io_methods .  
1d7b0 2a 28 2a 63 6f 6e 73 74 20 61 75 74 6f 6c 6f 63  *(*const autoloc
1d7c0 6b 49 6f 46 69 6e 64 65 72 29 28 63 6f 6e 73 74  kIoFinder)(const
1d7d0 20 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65 2a   char*,unixFile*
1d7e0 29 20 3d 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69  ) = autolockIoFi
1d7f0 6e 64 65 72 49 6d 70 6c 3b 0a 0a 23 65 6e 64 69  nderImpl;..#endi
1d800 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20  f /* OS_VXWORKS 
1d810 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
1d820 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a  _LOCKING_STYLE *
1d830 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 61 62 73 74  /../*.** An abst
1d840 72 61 63 74 20 74 79 70 65 20 66 6f 72 20 61 20  ract type for a 
1d850 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 49 4f 20  pointer to a IO 
1d860 6d 65 74 68 6f 64 20 66 69 6e 64 65 72 20 66 75  method finder fu
1d870 6e 63 74 69 6f 6e 3a 0a 2a 2f 0a 74 79 70 65 64  nction:.*/.typed
1d880 65 66 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ef const sqlite3
1d890 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 28 2a 66  _io_methods *(*f
1d8a0 69 6e 64 65 72 5f 74 79 70 65 29 28 63 6f 6e 73  inder_type)(cons
1d8b0 74 20 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65  t char*,unixFile
1d8c0 2a 29 3b 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  *);.../*********
1d8d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1d8e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1d8f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1d900 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1d910 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
1d920 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1d930 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65 74   sqlite3_vfs met
1d940 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  hods ***********
1d950 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1d960 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 64 69 76  *.**.** This div
1d970 69 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74  ision contains t
1d980 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
1d990 6e 20 6f 66 20 6d 65 74 68 6f 64 73 20 6f 6e 20  n of methods on 
1d9a0 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 76  the.** sqlite3_v
1d9b0 66 73 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 0a 2f  fs object..*/../
1d9c0 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
1d9d0 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
1d9e0 74 68 65 20 75 6e 69 78 46 69 6c 65 20 73 74 72  the unixFile str
1d9f0 75 63 74 75 72 65 20 70 6f 69 6e 74 65 64 20 74  ucture pointed t
1da00 6f 20 62 79 20 70 49 64 2e 0a 2a 2f 0a 73 74 61  o by pId..*/.sta
1da10 74 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e 55 6e  tic int fillInUn
1da20 69 78 46 69 6c 65 28 0a 20 20 73 71 6c 69 74 65  ixFile(.  sqlite
1da30 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20  3_vfs *pVfs,    
1da40 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
1da50 76 66 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  vfs object */.  
1da60 69 6e 74 20 68 2c 20 20 20 20 20 20 20 20 20 20  int h,          
1da70 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20          /* Open 
1da80 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
1da90 6f 66 20 66 69 6c 65 20 62 65 69 6e 67 20 6f 70  of file being op
1daa0 65 6e 65 64 20 2a 2f 0a 20 20 69 6e 74 20 64 69  ened */.  int di
1dab0 72 66 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  rfd,            
1dac0 20 20 2f 2a 20 44 69 72 65 63 74 6f 72 79 20 66    /* Directory f
1dad0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a  ile descriptor *
1dae0 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  /.  sqlite3_file
1daf0 20 2a 70 49 64 2c 20 20 20 20 20 20 2f 2a 20 57   *pId,      /* W
1db00 72 69 74 65 20 74 6f 20 74 68 65 20 75 6e 69 78  rite to the unix
1db10 46 69 6c 65 20 73 74 72 75 63 74 75 72 65 20 68  File structure h
1db20 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ere */.  const c
1db30 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  har *zFilename, 
1db40 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
1db50 66 69 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e 65  file being opene
1db60 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 4c 6f 63  d */.  int noLoc
1db70 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  k,             /
1db80 2a 20 4f 6d 69 74 20 6c 6f 63 6b 69 6e 67 20 69  * Omit locking i
1db90 66 20 74 72 75 65 20 2a 2f 0a 20 20 69 6e 74 20  f true */.  int 
1dba0 69 73 44 65 6c 65 74 65 20 20 20 20 20 20 20 20  isDelete        
1dbb0 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 6f 6e      /* Delete on
1dbc0 20 63 6c 6f 73 65 20 69 66 20 74 72 75 65 20 2a   close if true *
1dbd0 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 73 71 6c  /.){.  const sql
1dbe0 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
1dbf0 2a 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3b 0a  *pLockingStyle;.
1dc00 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e 65 77    unixFile *pNew
1dc10 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 70   = (unixFile *)p
1dc20 49 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  Id;.  int rc = S
1dc30 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73  QLITE_OK;..  ass
1dc40 65 72 74 28 20 70 4e 65 77 2d 3e 70 4c 6f 63 6b  ert( pNew->pLock
1dc50 3d 3d 4e 55 4c 4c 20 29 3b 0a 20 20 61 73 73 65  ==NULL );.  asse
1dc60 72 74 28 20 70 4e 65 77 2d 3e 70 4f 70 65 6e 3d  rt( pNew->pOpen=
1dc70 3d 4e 55 4c 4c 20 29 3b 0a 0a 20 20 2f 2a 20 50  =NULL );..  /* P
1dc80 61 72 61 6d 65 74 65 72 20 69 73 44 65 6c 65 74  arameter isDelet
1dc90 65 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 6f  e is only used o
1dca0 6e 20 76 78 77 6f 72 6b 73 2e 20 45 78 70 72 65  n vxworks. Expre
1dcb0 73 73 20 74 68 69 73 20 65 78 70 6c 69 63 69 74  ss this explicit
1dcc0 6c 79 20 0a 20 20 2a 2a 20 68 65 72 65 20 74 6f  ly .  ** here to
1dcd0 20 70 72 65 76 65 6e 74 20 63 6f 6d 70 69 6c 65   prevent compile
1dce0 72 20 77 61 72 6e 69 6e 67 73 20 61 62 6f 75 74  r warnings about
1dcf0 20 75 6e 75 73 65 64 20 70 61 72 61 6d 65 74 65   unused paramete
1dd00 72 73 2e 0a 20 20 2a 2f 0a 20 20 55 4e 55 53 45  rs..  */.  UNUSE
1dd10 44 5f 50 41 52 41 4d 45 54 45 52 28 69 73 44 65  D_PARAMETER(isDe
1dd20 6c 65 74 65 29 3b 0a 0a 20 20 4f 53 54 52 41 43  lete);..  OSTRAC
1dd30 45 33 28 22 4f 50 45 4e 20 20 20 20 25 2d 33 64  E3("OPEN    %-3d
1dd40 20 25 73 5c 6e 22 2c 20 68 2c 20 7a 46 69 6c 65   %s\n", h, zFile
1dd50 6e 61 6d 65 29 3b 20 20 20 20 0a 20 20 70 4e 65  name);    .  pNe
1dd60 77 2d 3e 68 20 3d 20 68 3b 0a 20 20 70 4e 65 77  w->h = h;.  pNew
1dd70 2d 3e 64 69 72 66 64 20 3d 20 64 69 72 66 64 3b  ->dirfd = dirfd;
1dd80 0a 20 20 53 45 54 5f 54 48 52 45 41 44 49 44 28  .  SET_THREADID(
1dd90 70 4e 65 77 29 3b 0a 20 20 70 4e 65 77 2d 3e 66  pNew);.  pNew->f
1dda0 69 6c 65 46 6c 61 67 73 20 3d 20 30 3b 0a 0a 23  ileFlags = 0;..#
1ddb0 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  if OS_VXWORKS.  
1ddc0 70 4e 65 77 2d 3e 70 49 64 20 3d 20 76 78 77 6f  pNew->pId = vxwo
1ddd0 72 6b 73 46 69 6e 64 46 69 6c 65 49 64 28 7a 46  rksFindFileId(zF
1dde0 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20  ilename);.  if( 
1ddf0 70 4e 65 77 2d 3e 70 49 64 3d 3d 30 20 29 7b 0a  pNew->pId==0 ){.
1de00 20 20 20 20 6e 6f 4c 6f 63 6b 20 3d 20 31 3b 0a      noLock = 1;.
1de10 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1de20 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 23 65 6e 64 69  NOMEM;.  }.#endi
1de30 66 0a 0a 20 20 69 66 28 20 6e 6f 4c 6f 63 6b 20  f..  if( noLock 
1de40 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 69 6e 67 53  ){.    pLockingS
1de50 74 79 6c 65 20 3d 20 26 6e 6f 6c 6f 63 6b 49 6f  tyle = &nolockIo
1de60 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 65 6c 73 65  Methods;.  }else
1de70 7b 0a 20 20 20 20 70 4c 6f 63 6b 69 6e 67 53 74  {.    pLockingSt
1de80 79 6c 65 20 3d 20 28 2a 2a 28 66 69 6e 64 65 72  yle = (**(finder
1de90 5f 74 79 70 65 2a 29 70 56 66 73 2d 3e 70 41 70  _type*)pVfs->pAp
1dea0 70 44 61 74 61 29 28 7a 46 69 6c 65 6e 61 6d 65  pData)(zFilename
1deb0 2c 20 70 4e 65 77 29 3b 0a 23 69 66 20 53 51 4c  , pNew);.#if SQL
1dec0 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
1ded0 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20 2f 2a 20  NG_STYLE.    /* 
1dee0 43 61 63 68 65 20 7a 46 69 6c 65 6e 61 6d 65 20  Cache zFilename 
1def0 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63  in the locking c
1df00 6f 6e 74 65 78 74 20 28 41 46 50 20 61 6e 64 20  ontext (AFP and 
1df10 64 6f 74 6c 6f 63 6b 20 6f 76 65 72 72 69 64 65  dotlock override
1df20 29 20 66 6f 72 0a 20 20 20 20 2a 2a 20 70 72 6f  ) for.    ** pro
1df30 78 79 4c 6f 63 6b 20 61 63 74 69 76 61 74 69 6f  xyLock activatio
1df40 6e 20 69 73 20 70 6f 73 73 69 62 6c 65 20 28 72  n is possible (r
1df50 65 6d 6f 74 65 20 70 72 6f 78 79 20 69 73 20 62  emote proxy is b
1df60 61 73 65 64 20 6f 6e 20 64 62 20 6e 61 6d 65 29  ased on db name)
1df70 0a 20 20 20 20 2a 2a 20 7a 46 69 6c 65 6e 61 6d  .    ** zFilenam
1df80 65 20 72 65 6d 61 69 6e 73 20 76 61 6c 69 64 20  e remains valid 
1df90 75 6e 74 69 6c 20 66 69 6c 65 20 69 73 20 63 6c  until file is cl
1dfa0 6f 73 65 64 2c 20 74 6f 20 73 75 70 70 6f 72 74  osed, to support
1dfb0 20 2a 2f 0a 20 20 20 20 70 4e 65 77 2d 3e 6c 6f   */.    pNew->lo
1dfc0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20 28  ckingContext = (
1dfd0 76 6f 69 64 2a 29 7a 46 69 6c 65 6e 61 6d 65 3b  void*)zFilename;
1dfe0 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 69  .#endif.  }..  i
1dff0 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65  f( pLockingStyle
1e000 20 3d 3d 20 26 70 6f 73 69 78 49 6f 4d 65 74 68   == &posixIoMeth
1e010 6f 64 73 0a 23 69 66 20 64 65 66 69 6e 65 64 28  ods.#if defined(
1e020 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51  __APPLE__) && SQ
1e030 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
1e040 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20 7c 7c  ING_STYLE.    ||
1e050 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d   pLockingStyle =
1e060 3d 20 26 6e 66 73 49 6f 4d 65 74 68 6f 64 73 0a  = &nfsIoMethods.
1e070 23 65 6e 64 69 66 0a 20 20 29 7b 0a 20 20 20 20  #endif.  ){.    
1e080 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
1e090 3b 0a 20 20 20 20 72 63 20 3d 20 66 69 6e 64 4c  ;.    rc = findL
1e0a0 6f 63 6b 49 6e 66 6f 28 70 4e 65 77 2c 20 26 70  ockInfo(pNew, &p
1e0b0 4e 65 77 2d 3e 70 4c 6f 63 6b 2c 20 26 70 4e 65  New->pLock, &pNe
1e0c0 77 2d 3e 70 4f 70 65 6e 29 3b 0a 20 20 20 20 69  w->pOpen);.    i
1e0d0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1e0e0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
1e0f0 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 65 64  an error occured
1e100 20 69 6e 20 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f   in findLockInfo
1e110 28 29 2c 20 63 6c 6f 73 65 20 74 68 65 20 66 69  (), close the fi
1e120 6c 65 20 64 65 73 63 72 69 70 74 6f 72 0a 20 20  le descriptor.  
1e130 20 20 20 20 2a 2a 20 69 6d 6d 65 64 69 61 74 65      ** immediate
1e140 6c 79 2c 20 62 65 66 6f 72 65 20 72 65 6c 65 61  ly, before relea
1e150 73 69 6e 67 20 74 68 65 20 6d 75 74 65 78 2e 20  sing the mutex. 
1e160 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28 29 20 6d  findLockInfo() m
1e170 61 79 20 66 61 69 6c 0a 20 20 20 20 20 20 2a 2a  ay fail.      **
1e180 20 69 6e 20 74 77 6f 20 73 63 65 6e 61 72 69 6f   in two scenario
1e190 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  s:.      **.    
1e1a0 20 20 2a 2a 20 20 20 28 61 29 20 41 20 63 61 6c    **   (a) A cal
1e1b0 6c 20 74 6f 20 66 73 74 61 74 28 29 20 66 61 69  l to fstat() fai
1e1c0 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2a 20 20 20  led..      **   
1e1d0 28 62 29 20 41 20 6d 61 6c 6c 6f 63 20 66 61 69  (b) A malloc fai
1e1e0 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  led..      **.  
1e1f0 20 20 20 20 2a 2a 20 53 63 65 6e 61 72 69 6f 20      ** Scenario 
1e200 28 62 29 20 6d 61 79 20 6f 6e 6c 79 20 6f 63 63  (b) may only occ
1e210 75 72 20 69 66 20 74 68 65 20 70 72 6f 63 65 73  ur if the proces
1e220 73 20 69 73 20 68 6f 6c 64 69 6e 67 20 6e 6f 20  s is holding no 
1e230 6f 74 68 65 72 0a 20 20 20 20 20 20 2a 2a 20 66  other.      ** f
1e240 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20  ile descriptors 
1e250 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65  open on the same
1e260 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20   file. If there 
1e270 77 65 72 65 20 6f 74 68 65 72 20 66 69 6c 65 0a  were other file.
1e280 20 20 20 20 20 20 2a 2a 20 64 65 73 63 72 69 70        ** descrip
1e290 74 6f 72 73 20 6f 6e 20 74 68 69 73 20 66 69 6c  tors on this fil
1e2a0 65 2c 20 74 68 65 6e 20 6e 6f 20 6d 61 6c 6c 6f  e, then no mallo
1e2b0 63 20 77 6f 75 6c 64 20 62 65 20 72 65 71 75 69  c would be requi
1e2c0 72 65 64 20 62 79 0a 20 20 20 20 20 20 2a 2a 20  red by.      ** 
1e2d0 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28 29 2e 20  findLockInfo(). 
1e2e0 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 63  If this is the c
1e2f0 61 73 65 2c 20 69 74 20 69 73 20 71 75 69 74 65  ase, it is quite
1e300 20 73 61 66 65 20 74 6f 20 63 6c 6f 73 65 0a 20   safe to close. 
1e310 20 20 20 20 20 2a 2a 20 68 61 6e 64 6c 65 20 68       ** handle h
1e320 20 2d 20 61 73 20 69 74 20 69 73 20 67 75 61 72   - as it is guar
1e330 61 6e 74 65 65 64 20 74 68 61 74 20 6e 6f 20 70  anteed that no p
1e340 6f 73 69 78 20 6c 6f 63 6b 73 20 77 69 6c 6c 20  osix locks will 
1e350 62 65 20 72 65 6c 65 61 73 65 64 0a 20 20 20 20  be released.    
1e360 20 20 2a 2a 20 62 79 20 64 6f 69 6e 67 20 73 6f    ** by doing so
1e370 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
1e380 20 2a 2a 20 49 66 20 73 63 65 6e 61 72 69 6f 20   ** If scenario 
1e390 28 61 29 20 63 61 75 73 65 64 20 74 68 65 20 65  (a) caused the e
1e3a0 72 72 6f 72 20 74 68 65 6e 20 74 68 69 6e 67 73  rror then things
1e3b0 20 61 72 65 20 6e 6f 74 20 73 6f 20 73 61 66 65   are not so safe
1e3c0 2e 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 69  . The.      ** i
1e3d0 6d 70 6c 69 63 69 74 20 61 73 73 75 6d 70 74 69  mplicit assumpti
1e3e0 6f 6e 20 68 65 72 65 20 69 73 20 74 68 61 74 20  on here is that 
1e3f0 69 66 20 66 73 74 61 74 28 29 20 66 61 69 6c 73  if fstat() fails
1e400 2c 20 74 68 69 6e 67 73 20 61 72 65 20 69 6e 0a  , things are in.
1e410 20 20 20 20 20 20 2a 2a 20 73 75 63 68 20 62 61        ** such ba
1e420 64 20 73 68 61 70 65 20 74 68 61 74 20 64 72 6f  d shape that dro
1e430 70 70 69 6e 67 20 61 20 6c 6f 63 6b 20 6f 72 20  pping a lock or 
1e440 74 77 6f 20 64 6f 65 73 6e 27 74 20 6d 61 74 74  two doesn't matt
1e450 65 72 20 6d 75 63 68 2e 0a 20 20 20 20 20 20 2a  er much..      *
1e460 2f 0a 20 20 20 20 20 20 63 6c 6f 73 65 28 68 29  /.      close(h)
1e470 3b 0a 20 20 20 20 20 20 68 20 3d 20 2d 31 3b 0a  ;.      h = -1;.
1e480 20 20 20 20 7d 0a 20 20 20 20 75 6e 69 78 4c 65      }.    unixLe
1e490 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a  aveMutex();.  }.
1e4a0 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
1e4b0 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
1e4c0 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50   && defined(__AP
1e4d0 50 4c 45 5f 5f 29 0a 20 20 65 6c 73 65 20 69 66  PLE__).  else if
1e4e0 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20  ( pLockingStyle 
1e4f0 3d 3d 20 26 61 66 70 49 6f 4d 65 74 68 6f 64 73  == &afpIoMethods
1e500 20 29 7b 0a 20 20 20 20 2f 2a 20 41 46 50 20 6c   ){.    /* AFP l
1e510 6f 63 6b 69 6e 67 20 75 73 65 73 20 74 68 65 20  ocking uses the 
1e520 66 69 6c 65 20 70 61 74 68 20 73 6f 20 69 74 20  file path so it 
1e530 6e 65 65 64 73 20 74 6f 20 62 65 20 69 6e 63 6c  needs to be incl
1e540 75 64 65 64 20 69 6e 0a 20 20 20 20 2a 2a 20 74  uded in.    ** t
1e550 68 65 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e  he afpLockingCon
1e560 74 65 78 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  text..    */.   
1e570 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65   afpLockingConte
1e580 78 74 20 2a 70 43 74 78 3b 0a 20 20 20 20 70 4e  xt *pCtx;.    pN
1e590 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  ew->lockingConte
1e5a0 78 74 20 3d 20 70 43 74 78 20 3d 20 73 71 6c 69  xt = pCtx = sqli
1e5b0 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65  te3_malloc( size
1e5c0 6f 66 28 2a 70 43 74 78 29 20 29 3b 0a 20 20 20  of(*pCtx) );.   
1e5d0 20 69 66 28 20 70 43 74 78 3d 3d 30 20 29 7b 0a   if( pCtx==0 ){.
1e5e0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1e5f0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c  E_NOMEM;.    }el
1e600 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 42 3a  se{.      /* NB:
1e610 20 7a 46 69 6c 65 6e 61 6d 65 20 65 78 69 73 74   zFilename exist
1e620 73 20 61 6e 64 20 72 65 6d 61 69 6e 73 20 76 61  s and remains va
1e630 6c 69 64 20 75 6e 74 69 6c 20 74 68 65 20 66 69  lid until the fi
1e640 6c 65 20 69 73 20 63 6c 6f 73 65 64 0a 20 20 20  le is closed.   
1e650 20 20 20 2a 2a 20 61 63 63 6f 72 64 69 6e 67 20     ** according 
1e660 74 6f 20 72 65 71 75 69 72 65 6d 65 6e 74 20 46  to requirement F
1e670 31 31 31 34 31 2e 20 20 53 6f 20 77 65 20 64 6f  11141.  So we do
1e680 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 6d 61 6b   not need to mak
1e690 65 20 61 0a 20 20 20 20 20 20 2a 2a 20 63 6f 70  e a.      ** cop
1e6a0 79 20 6f 66 20 74 68 65 20 66 69 6c 65 6e 61 6d  y of the filenam
1e6b0 65 2e 20 2a 2f 0a 20 20 20 20 20 20 70 43 74 78  e. */.      pCtx
1e6c0 2d 3e 64 62 50 61 74 68 20 3d 20 7a 46 69 6c 65  ->dbPath = zFile
1e6d0 6e 61 6d 65 3b 0a 20 20 20 20 20 20 70 43 74 78  name;.      pCtx
1e6e0 2d 3e 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a  ->reserved = 0;.
1e6f0 20 20 20 20 20 20 73 72 61 6e 64 6f 6d 64 65 76        srandomdev
1e700 28 29 3b 0a 20 20 20 20 20 20 75 6e 69 78 45 6e  ();.      unixEn
1e710 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20  terMutex();.    
1e720 20 20 72 63 20 3d 20 66 69 6e 64 4c 6f 63 6b 49    rc = findLockI
1e730 6e 66 6f 28 70 4e 65 77 2c 20 26 70 4e 65 77 2d  nfo(pNew, &pNew-
1e740 3e 70 4c 6f 63 6b 2c 20 26 70 4e 65 77 2d 3e 70  >pLock, &pNew->p
1e750 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28  Open);.      if(
1e760 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1e770 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1e780 33 5f 66 72 65 65 28 70 4e 65 77 2d 3e 6c 6f 63  3_free(pNew->loc
1e790 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3b 0a 20 20  kingContext);.  
1e7a0 20 20 20 20 20 20 63 6c 6f 73 65 28 68 29 3b 0a        close(h);.
1e7b0 20 20 20 20 20 20 20 20 68 20 3d 20 2d 31 3b 0a          h = -1;.
1e7c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 75 6e        }.      un
1e7d0 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 20  ixLeaveMutex(); 
1e7e0 20 20 20 20 20 20 20 0a 20 20 20 20 7d 0a 20 20         .    }.  
1e7f0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 65 6c 73 65  }.#endif..  else
1e800 20 69 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79   if( pLockingSty
1e810 6c 65 20 3d 3d 20 26 64 6f 74 6c 6f 63 6b 49 6f  le == &dotlockIo
1e820 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f  Methods ){.    /
1e830 2a 20 44 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e  * Dotfile lockin
1e840 67 20 75 73 65 73 20 74 68 65 20 66 69 6c 65 20  g uses the file 
1e850 70 61 74 68 20 73 6f 20 69 74 20 6e 65 65 64 73  path so it needs
1e860 20 74 6f 20 62 65 20 69 6e 63 6c 75 64 65 64 20   to be included 
1e870 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 6f  in.    ** the do
1e880 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74  tlockLockingCont
1e890 65 78 74 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ext .    */.    
1e8a0 63 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 3b  char *zLockFile;
1e8b0 0a 20 20 20 20 69 6e 74 20 6e 46 69 6c 65 6e 61  .    int nFilena
1e8c0 6d 65 3b 0a 20 20 20 20 6e 46 69 6c 65 6e 61 6d  me;.    nFilenam
1e8d0 65 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28  e = (int)strlen(
1e8e0 7a 46 69 6c 65 6e 61 6d 65 29 20 2b 20 36 3b 0a  zFilename) + 6;.
1e8f0 20 20 20 20 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20      zLockFile = 
1e900 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f  (char *)sqlite3_
1e910 6d 61 6c 6c 6f 63 28 6e 46 69 6c 65 6e 61 6d 65  malloc(nFilename
1e920 29 3b 0a 20 20 20 20 69 66 28 20 7a 4c 6f 63 6b  );.    if( zLock
1e930 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  File==0 ){.     
1e940 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
1e950 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  EM;.    }else{. 
1e960 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
1e970 72 69 6e 74 66 28 6e 46 69 6c 65 6e 61 6d 65 2c  rintf(nFilename,
1e980 20 7a 4c 6f 63 6b 46 69 6c 65 2c 20 22 25 73 22   zLockFile, "%s"
1e990 20 44 4f 54 4c 4f 43 4b 5f 53 55 46 46 49 58 2c   DOTLOCK_SUFFIX,
1e9a0 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20   zFilename);.   
1e9b0 20 7d 0a 20 20 20 20 70 4e 65 77 2d 3e 6c 6f 63   }.    pNew->loc
1e9c0 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20 7a 4c  kingContext = zL
1e9d0 6f 63 6b 46 69 6c 65 3b 0a 20 20 7d 0a 0a 23 69  ockFile;.  }..#i
1e9e0 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 65  f OS_VXWORKS.  e
1e9f0 6c 73 65 20 69 66 28 20 70 4c 6f 63 6b 69 6e 67  lse if( pLocking
1ea00 53 74 79 6c 65 20 3d 3d 20 26 73 65 6d 49 6f 4d  Style == &semIoM
1ea10 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f 2a  ethods ){.    /*
1ea20 20 4e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65   Named semaphore
1ea30 20 6c 6f 63 6b 69 6e 67 20 75 73 65 73 20 74 68   locking uses th
1ea40 65 20 66 69 6c 65 20 70 61 74 68 20 73 6f 20 69  e file path so i
1ea50 74 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20  t needs to be.  
1ea60 20 20 2a 2a 20 69 6e 63 6c 75 64 65 64 20 69 6e    ** included in
1ea70 20 74 68 65 20 73 65 6d 4c 6f 63 6b 69 6e 67 43   the semLockingC
1ea80 6f 6e 74 65 78 74 0a 20 20 20 20 2a 2f 0a 20 20  ontext.    */.  
1ea90 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
1eaa0 28 29 3b 0a 20 20 20 20 72 63 20 3d 20 66 69 6e  ();.    rc = fin
1eab0 64 4c 6f 63 6b 49 6e 66 6f 28 70 4e 65 77 2c 20  dLockInfo(pNew, 
1eac0 26 70 4e 65 77 2d 3e 70 4c 6f 63 6b 2c 20 26 70  &pNew->pLock, &p
1ead0 4e 65 77 2d 3e 70 4f 70 65 6e 29 3b 0a 20 20 20  New->pOpen);.   
1eae0 20 69 66 28 20 28 72 63 3d 3d 53 51 4c 49 54 45   if( (rc==SQLITE
1eaf0 5f 4f 4b 29 20 26 26 20 28 70 4e 65 77 2d 3e 70  _OK) && (pNew->p
1eb00 4f 70 65 6e 2d 3e 70 53 65 6d 3d 3d 4e 55 4c 4c  Open->pSem==NULL
1eb10 29 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20  ) ){.      char 
1eb20 2a 7a 53 65 6d 4e 61 6d 65 20 3d 20 70 4e 65 77  *zSemName = pNew
1eb30 2d 3e 70 4f 70 65 6e 2d 3e 61 53 65 6d 4e 61 6d  ->pOpen->aSemNam
1eb40 65 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a  e;.      int n;.
1eb50 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
1eb60 70 72 69 6e 74 66 28 4d 41 58 5f 50 41 54 48 4e  printf(MAX_PATHN
1eb70 41 4d 45 2c 20 7a 53 65 6d 4e 61 6d 65 2c 20 22  AME, zSemName, "
1eb80 2f 25 73 2e 73 65 6d 22 2c 0a 20 20 20 20 20 20  /%s.sem",.      
1eb90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eba0 20 70 4e 65 77 2d 3e 70 49 64 2d 3e 7a 43 61 6e   pNew->pId->zCan
1ebb0 6f 6e 69 63 61 6c 4e 61 6d 65 29 3b 0a 20 20 20  onicalName);.   
1ebc0 20 20 20 66 6f 72 28 20 6e 3d 31 3b 20 7a 53 65     for( n=1; zSe
1ebd0 6d 4e 61 6d 65 5b 6e 5d 3b 20 6e 2b 2b 20 29 0a  mName[n]; n++ ).
1ebe0 20 20 20 20 20 20 20 20 69 66 28 20 7a 53 65 6d          if( zSem
1ebf0 4e 61 6d 65 5b 6e 5d 3d 3d 27 2f 27 20 29 20 7a  Name[n]=='/' ) z
1ec00 53 65 6d 4e 61 6d 65 5b 6e 5d 20 3d 20 27 5f 27  SemName[n] = '_'
1ec10 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4f  ;.      pNew->pO
1ec20 70 65 6e 2d 3e 70 53 65 6d 20 3d 20 73 65 6d 5f  pen->pSem = sem_
1ec30 6f 70 65 6e 28 7a 53 65 6d 4e 61 6d 65 2c 20 4f  open(zSemName, O
1ec40 5f 43 52 45 41 54 2c 20 30 36 36 36 2c 20 31 29  _CREAT, 0666, 1)
1ec50 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65 77  ;.      if( pNew
1ec60 2d 3e 70 4f 70 65 6e 2d 3e 70 53 65 6d 20 3d 3d  ->pOpen->pSem ==
1ec70 20 53 45 4d 5f 46 41 49 4c 45 44 20 29 7b 0a 20   SEM_FAILED ){. 
1ec80 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
1ec90 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
1eca0 20 20 70 4e 65 77 2d 3e 70 4f 70 65 6e 2d 3e 61    pNew->pOpen->a
1ecb0 53 65 6d 4e 61 6d 65 5b 30 5d 20 3d 20 27 5c 30  SemName[0] = '\0
1ecc0 27 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  ';.      }.    }
1ecd0 0a 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75  .    unixLeaveMu
1ece0 74 65 78 28 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  tex();.  }.#endi
1ecf0 66 0a 20 20 0a 20 20 70 4e 65 77 2d 3e 6c 61 73  f.  .  pNew->las
1ed00 74 45 72 72 6e 6f 20 3d 20 30 3b 0a 23 69 66 20  tErrno = 0;.#if 
1ed10 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 69 66 28  OS_VXWORKS.  if(
1ed20 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1ed30 7b 0a 20 20 20 20 69 66 28 20 68 3e 3d 30 20 29  {.    if( h>=0 )
1ed40 20 63 6c 6f 73 65 28 68 29 3b 0a 20 20 20 20 68   close(h);.    h
1ed50 20 3d 20 2d 31 3b 0a 20 20 20 20 75 6e 6c 69 6e   = -1;.    unlin
1ed60 6b 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  k(zFilename);.  
1ed70 20 20 69 73 44 65 6c 65 74 65 20 3d 20 30 3b 0a    isDelete = 0;.
1ed80 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 69 73 44 65    }.  pNew->isDe
1ed90 6c 65 74 65 20 3d 20 69 73 44 65 6c 65 74 65 3b  lete = isDelete;
1eda0 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 72 63  .#endif.  if( rc
1edb0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1edc0 20 20 20 69 66 28 20 64 69 72 66 64 3e 3d 30 20     if( dirfd>=0 
1edd0 29 20 63 6c 6f 73 65 28 64 69 72 66 64 29 3b 20  ) close(dirfd); 
1ede0 2f 2a 20 73 69 6c 65 6e 74 20 6c 65 61 6b 20 69  /* silent leak i
1edf0 66 20 66 61 69 6c 2c 20 61 6c 72 65 61 64 79 20  f fail, already 
1ee00 69 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20  in error */.    
1ee10 69 66 28 20 68 3e 3d 30 20 29 20 63 6c 6f 73 65  if( h>=0 ) close
1ee20 28 68 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  (h);.  }else{.  
1ee30 20 20 70 4e 65 77 2d 3e 70 4d 65 74 68 6f 64 20    pNew->pMethod 
1ee40 3d 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3b  = pLockingStyle;
1ee50 0a 20 20 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72  .    OpenCounter
1ee60 28 2b 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  (+1);.  }.  retu
1ee70 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1ee80 4f 70 65 6e 20 61 20 66 69 6c 65 20 64 65 73 63  Open a file desc
1ee90 72 69 70 74 6f 72 20 74 6f 20 74 68 65 20 64 69  riptor to the di
1eea0 72 65 63 74 6f 72 79 20 63 6f 6e 74 61 69 6e 69  rectory containi
1eeb0 6e 67 20 66 69 6c 65 20 7a 46 69 6c 65 6e 61 6d  ng file zFilenam
1eec0 65 2e 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73  e..** If success
1eed0 66 75 6c 2c 20 2a 70 46 64 20 69 73 20 73 65 74  ful, *pFd is set
1eee0 20 74 6f 20 74 68 65 20 6f 70 65 6e 65 64 20 66   to the opened f
1eef0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 61  ile descriptor a
1ef00 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  nd.** SQLITE_OK 
1ef10 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  is returned. If 
1ef20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
1ef30 20 65 69 74 68 65 72 20 53 51 4c 49 54 45 5f 4e   either SQLITE_N
1ef40 4f 4d 45 4d 0a 2a 2a 20 6f 72 20 53 51 4c 49 54  OMEM.** or SQLIT
1ef50 45 5f 43 41 4e 54 4f 50 45 4e 20 69 73 20 72 65  E_CANTOPEN is re
1ef60 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 46 64 20  turned and *pFd 
1ef70 69 73 20 73 65 74 20 74 6f 20 61 6e 20 75 6e 64  is set to an und
1ef80 65 66 69 6e 65 64 0a 2a 2a 20 76 61 6c 75 65 2e  efined.** value.
1ef90 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45  .**.** If SQLITE
1efa0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2c  _OK is returned,
1efb0 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20 72   the caller is r
1efc0 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 63  esponsible for c
1efd0 6c 6f 73 69 6e 67 0a 2a 2a 20 74 68 65 20 66 69  losing.** the fi
1efe0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a 70  le descriptor *p
1eff0 46 64 20 75 73 69 6e 67 20 63 6c 6f 73 65 28 29  Fd using close()
1f000 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1f010 6f 70 65 6e 44 69 72 65 63 74 6f 72 79 28 63 6f  openDirectory(co
1f020 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
1f030 61 6d 65 2c 20 69 6e 74 20 2a 70 46 64 29 7b 0a  ame, int *pFd){.
1f040 20 20 69 6e 74 20 69 69 3b 0a 20 20 69 6e 74 20    int ii;.  int 
1f050 66 64 20 3d 20 2d 31 3b 0a 20 20 63 68 61 72 20  fd = -1;.  char 
1f060 7a 44 69 72 6e 61 6d 65 5b 4d 41 58 5f 50 41 54  zDirname[MAX_PAT
1f070 48 4e 41 4d 45 2b 31 5d 3b 0a 0a 20 20 73 71 6c  HNAME+1];..  sql
1f080 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 41  ite3_snprintf(MA
1f090 58 5f 50 41 54 48 4e 41 4d 45 2c 20 7a 44 69 72  X_PATHNAME, zDir
1f0a0 6e 61 6d 65 2c 20 22 25 73 22 2c 20 7a 46 69 6c  name, "%s", zFil
1f0b0 65 6e 61 6d 65 29 3b 0a 20 20 66 6f 72 28 69 69  ename);.  for(ii
1f0c0 3d 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 44 69  =(int)strlen(zDi
1f0d0 72 6e 61 6d 65 29 3b 20 69 69 3e 31 20 26 26 20  rname); ii>1 && 
1f0e0 7a 44 69 72 6e 61 6d 65 5b 69 69 5d 21 3d 27 2f  zDirname[ii]!='/
1f0f0 27 3b 20 69 69 2d 2d 29 3b 0a 20 20 69 66 28 20  '; ii--);.  if( 
1f100 69 69 3e 30 20 29 7b 0a 20 20 20 20 7a 44 69 72  ii>0 ){.    zDir
1f110 6e 61 6d 65 5b 69 69 5d 20 3d 20 27 5c 30 27 3b  name[ii] = '\0';
1f120 0a 20 20 20 20 66 64 20 3d 20 6f 70 65 6e 28 7a  .    fd = open(z
1f130 44 69 72 6e 61 6d 65 2c 20 4f 5f 52 44 4f 4e 4c  Dirname, O_RDONL
1f140 59 7c 4f 5f 42 49 4e 41 52 59 2c 20 30 29 3b 0a  Y|O_BINARY, 0);.
1f150 20 20 20 20 69 66 28 20 66 64 3e 3d 30 20 29 7b      if( fd>=0 ){
1f160 0a 23 69 66 64 65 66 20 46 44 5f 43 4c 4f 45 58  .#ifdef FD_CLOEX
1f170 45 43 0a 20 20 20 20 20 20 66 63 6e 74 6c 28 66  EC.      fcntl(f
1f180 64 2c 20 46 5f 53 45 54 46 44 2c 20 66 63 6e 74  d, F_SETFD, fcnt
1f190 6c 28 66 64 2c 20 46 5f 47 45 54 46 44 2c 20 30  l(fd, F_GETFD, 0
1f1a0 29 20 7c 20 46 44 5f 43 4c 4f 45 58 45 43 29 3b  ) | FD_CLOEXEC);
1f1b0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 4f 53  .#endif.      OS
1f1c0 54 52 41 43 45 33 28 22 4f 50 45 4e 44 49 52 20  TRACE3("OPENDIR 
1f1d0 25 2d 33 64 20 25 73 5c 6e 22 2c 20 66 64 2c 20  %-3d %s\n", fd, 
1f1e0 7a 44 69 72 6e 61 6d 65 29 3b 0a 20 20 20 20 7d  zDirname);.    }
1f1f0 0a 20 20 7d 0a 20 20 2a 70 46 64 20 3d 20 66 64  .  }.  *pFd = fd
1f200 3b 0a 20 20 72 65 74 75 72 6e 20 28 66 64 3e 3d  ;.  return (fd>=
1f210 30 3f 53 51 4c 49 54 45 5f 4f 4b 3a 53 51 4c 49  0?SQLITE_OK:SQLI
1f220 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54  TE_CANTOPEN_BKPT
1f230 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  );.}../*.** Crea
1f240 74 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  te a temporary f
1f250 69 6c 65 20 6e 61 6d 65 20 69 6e 20 7a 42 75 66  ile name in zBuf
1f260 2e 20 20 7a 42 75 66 20 6d 75 73 74 20 62 65 20  .  zBuf must be 
1f270 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 62 79 20  allocated.** by 
1f280 74 68 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63  the calling proc
1f290 65 73 73 20 61 6e 64 20 6d 75 73 74 20 62 65 20  ess and must be 
1f2a0 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f  big enough to ho
1f2b0 6c 64 20 61 74 20 6c 65 61 73 74 0a 2a 2a 20 70  ld at least.** p
1f2c0 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20  Vfs->mxPathname 
1f2d0 62 79 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  bytes..*/.static
1f2e0 20 69 6e 74 20 67 65 74 54 65 6d 70 6e 61 6d 65   int getTempname
1f2f0 28 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20  (int nBuf, char 
1f300 2a 7a 42 75 66 29 7b 0a 20 20 73 74 61 74 69 63  *zBuf){.  static
1f310 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 44   const char *azD
1f320 69 72 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 30  irs[] = {.     0
1f330 2c 0a 20 20 20 20 20 30 2c 0a 20 20 20 20 20 22  ,.     0,.     "
1f340 2f 76 61 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20  /var/tmp",.     
1f350 22 2f 75 73 72 2f 74 6d 70 22 2c 0a 20 20 20 20  "/usr/tmp",.    
1f360 20 22 2f 74 6d 70 22 2c 0a 20 20 20 20 20 22 2e   "/tmp",.     ".
1f370 22 2c 0a 20 20 7d 3b 0a 20 20 73 74 61 74 69 63  ",.  };.  static
1f380 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
1f390 63 68 61 72 20 7a 43 68 61 72 73 5b 5d 20 3d 0a  char zChars[] =.
1f3a0 20 20 20 20 22 61 62 63 64 65 66 67 68 69 6a 6b      "abcdefghijk
1f3b0 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 22  lmnopqrstuvwxyz"
1f3c0 0a 20 20 20 20 22 41 42 43 44 45 46 47 48 49 4a  .    "ABCDEFGHIJ
1f3d0 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58 59 5a  KLMNOPQRSTUVWXYZ
1f3e0 22 0a 20 20 20 20 22 30 31 32 33 34 35 36 37 38  ".    "012345678
1f3f0 39 22 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69  9";.  unsigned i
1f400 6e 74 20 69 2c 20 6a 3b 0a 20 20 73 74 72 75 63  nt i, j;.  struc
1f410 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20 63 6f  t stat buf;.  co
1f420 6e 73 74 20 63 68 61 72 20 2a 7a 44 69 72 20 3d  nst char *zDir =
1f430 20 22 2e 22 3b 0a 0a 20 20 2f 2a 20 49 74 27 73   ".";..  /* It's
1f440 20 6f 64 64 20 74 6f 20 73 69 6d 75 6c 61 74 65   odd to simulate
1f450 20 61 6e 20 69 6f 2d 65 72 72 6f 72 20 68 65 72   an io-error her
1f460 65 2c 20 62 75 74 20 72 65 61 6c 6c 79 20 74 68  e, but really th
1f470 69 73 20 69 73 20 6a 75 73 74 0a 20 20 2a 2a 20  is is just.  ** 
1f480 75 73 69 6e 67 20 74 68 65 20 69 6f 2d 65 72 72  using the io-err
1f490 6f 72 20 69 6e 66 72 61 73 74 72 75 63 74 75 72  or infrastructur
1f4a0 65 20 74 6f 20 74 65 73 74 20 74 68 61 74 20 53  e to test that S
1f4b0 51 4c 69 74 65 20 68 61 6e 64 6c 65 73 20 74 68  QLite handles th
1f4c0 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e  is.  ** function
1f4d0 20 66 61 69 6c 69 6e 67 2e 20 0a 20 20 2a 2f 0a   failing. .  */.
1f4e0 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
1f4f0 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
1f500 5f 49 4f 45 52 52 20 29 3b 0a 0a 20 20 61 7a 44  _IOERR );..  azD
1f510 69 72 73 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33  irs[0] = sqlite3
1f520 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 3b  _temp_directory;
1f530 0a 20 20 69 66 20 28 4e 55 4c 4c 20 3d 3d 20 61  .  if (NULL == a
1f540 7a 44 69 72 73 5b 31 5d 29 20 7b 0a 20 20 20 20  zDirs[1]) {.    
1f550 61 7a 44 69 72 73 5b 31 5d 20 3d 20 67 65 74 65  azDirs[1] = gete
1f560 6e 76 28 22 54 4d 50 44 49 52 22 29 3b 0a 20 20  nv("TMPDIR");.  
1f570 7d 0a 20 20 0a 20 20 66 6f 72 28 69 3d 30 3b 20  }.  .  for(i=0; 
1f580 69 3c 73 69 7a 65 6f 66 28 61 7a 44 69 72 73 29  i<sizeof(azDirs)
1f590 2f 73 69 7a 65 6f 66 28 61 7a 44 69 72 73 5b 30  /sizeof(azDirs[0
1f5a0 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  ]); i++){.    if
1f5b0 28 20 61 7a 44 69 72 73 5b 69 5d 3d 3d 30 20 29  ( azDirs[i]==0 )
1f5c0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
1f5d0 66 28 20 73 74 61 74 28 61 7a 44 69 72 73 5b 69  f( stat(azDirs[i
1f5e0 5d 2c 20 26 62 75 66 29 20 29 20 63 6f 6e 74 69  ], &buf) ) conti
1f5f0 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 21 53 5f  nue;.    if( !S_
1f600 49 53 44 49 52 28 62 75 66 2e 73 74 5f 6d 6f 64  ISDIR(buf.st_mod
1f610 65 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  e) ) continue;. 
1f620 20 20 20 69 66 28 20 61 63 63 65 73 73 28 61 7a     if( access(az
1f630 44 69 72 73 5b 69 5d 2c 20 30 37 29 20 29 20 63  Dirs[i], 07) ) c
1f640 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7a 44 69  ontinue;.    zDi
1f650 72 20 3d 20 61 7a 44 69 72 73 5b 69 5d 3b 0a 20  r = azDirs[i];. 
1f660 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
1f670 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74   /* Check that t
1f680 68 65 20 6f 75 74 70 75 74 20 62 75 66 66 65 72  he output buffer
1f690 20 69 73 20 6c 61 72 67 65 20 65 6e 6f 75 67 68   is large enough
1f6a0 20 66 6f 72 20 74 68 65 20 74 65 6d 70 6f 72 61   for the tempora
1f6b0 72 79 20 66 69 6c 65 20 0a 20 20 2a 2a 20 6e 61  ry file .  ** na
1f6c0 6d 65 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 74  me. If it is not
1f6d0 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
1f6e0 45 52 52 4f 52 2e 0a 20 20 2a 2f 0a 20 20 69 66  ERROR..  */.  if
1f6f0 28 20 28 73 74 72 6c 65 6e 28 7a 44 69 72 29 20  ( (strlen(zDir) 
1f700 2b 20 73 74 72 6c 65 6e 28 53 51 4c 49 54 45 5f  + strlen(SQLITE_
1f710 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49 58  TEMP_FILE_PREFIX
1f720 29 20 2b 20 31 37 29 20 3e 3d 20 28 73 69 7a 65  ) + 17) >= (size
1f730 5f 74 29 6e 42 75 66 20 29 7b 0a 20 20 20 20 72  _t)nBuf ){.    r
1f740 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
1f750 4f 52 3b 0a 20 20 7d 0a 0a 20 20 64 6f 7b 0a 20  OR;.  }..  do{. 
1f760 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
1f770 6e 74 66 28 6e 42 75 66 2d 31 37 2c 20 7a 42 75  ntf(nBuf-17, zBu
1f780 66 2c 20 22 25 73 2f 22 53 51 4c 49 54 45 5f 54  f, "%s/"SQLITE_T
1f790 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49 58 2c  EMP_FILE_PREFIX,
1f7a0 20 7a 44 69 72 29 3b 0a 20 20 20 20 6a 20 3d 20   zDir);.    j = 
1f7b0 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 42 75 66  (int)strlen(zBuf
1f7c0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  );.    sqlite3_r
1f7d0 61 6e 64 6f 6d 6e 65 73 73 28 31 35 2c 20 26 7a  andomness(15, &z
1f7e0 42 75 66 5b 6a 5d 29 3b 0a 20 20 20 20 66 6f 72  Buf[j]);.    for
1f7f0 28 69 3d 30 3b 20 69 3c 31 35 3b 20 69 2b 2b 2c  (i=0; i<15; i++,
1f800 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 7a 42 75   j++){.      zBu
1f810 66 5b 6a 5d 20 3d 20 28 63 68 61 72 29 7a 43 68  f[j] = (char)zCh
1f820 61 72 73 5b 20 28 28 75 6e 73 69 67 6e 65 64 20  ars[ ((unsigned 
1f830 63 68 61 72 29 7a 42 75 66 5b 6a 5d 29 25 28 73  char)zBuf[j])%(s
1f840 69 7a 65 6f 66 28 7a 43 68 61 72 73 29 2d 31 29  izeof(zChars)-1)
1f850 20 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 42   ];.    }.    zB
1f860 75 66 5b 6a 5d 20 3d 20 30 3b 0a 20 20 7d 77 68  uf[j] = 0;.  }wh
1f870 69 6c 65 28 20 61 63 63 65 73 73 28 7a 42 75 66  ile( access(zBuf
1f880 2c 30 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75  ,0)==0 );.  retu
1f890 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1f8a0 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
1f8b0 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
1f8c0 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50   && defined(__AP
1f8d0 50 4c 45 5f 5f 29 0a 2f 2a 0a 2a 2a 20 52 6f 75  PLE__)./*.** Rou
1f8e0 74 69 6e 65 20 74 6f 20 74 72 61 6e 73 66 6f 72  tine to transfor
1f8f0 6d 20 61 20 75 6e 69 78 46 69 6c 65 20 69 6e 74  m a unixFile int
1f900 6f 20 61 20 70 72 6f 78 79 2d 6c 6f 63 6b 69 6e  o a proxy-lockin
1f910 67 20 75 6e 69 78 46 69 6c 65 2e 0a 2a 2a 20 49  g unixFile..** I
1f920 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 6e  mplementation in
1f930 20 74 68 65 20 70 72 6f 78 79 2d 6c 6f 63 6b 20   the proxy-lock 
1f940 64 69 76 69 73 69 6f 6e 2c 20 62 75 74 20 75 73  division, but us
1f950 65 64 20 62 79 20 75 6e 69 78 4f 70 65 6e 28 29  ed by unixOpen()
1f960 0a 2a 2a 20 69 66 20 53 51 4c 49 54 45 5f 50 52  .** if SQLITE_PR
1f970 45 46 45 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49  EFER_PROXY_LOCKI
1f980 4e 47 20 69 73 20 64 65 66 69 6e 65 64 2e 0a 2a  NG is defined..*
1f990 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  /.static int pro
1f9a0 78 79 54 72 61 6e 73 66 6f 72 6d 55 6e 69 78 46  xyTransformUnixF
1f9b0 69 6c 65 28 75 6e 69 78 46 69 6c 65 2a 2c 20 63  ile(unixFile*, c
1f9c0 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a 23 65 6e  onst char*);.#en
1f9d0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63  dif../*.** Searc
1f9e0 68 20 66 6f 72 20 61 6e 20 75 6e 75 73 65 64 20  h for an unused 
1f9f0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
1fa00 74 68 61 74 20 77 61 73 20 6f 70 65 6e 65 64 20  that was opened 
1fa10 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
1fa20 0a 2a 2a 20 66 69 6c 65 20 28 6e 6f 74 20 61 20  .** file (not a 
1fa30 6a 6f 75 72 6e 61 6c 20 6f 72 20 6d 61 73 74 65  journal or maste
1fa40 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20  r-journal file) 
1fa50 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 70 61  identified by pa
1fa60 74 68 6e 61 6d 65 0a 2a 2a 20 7a 50 61 74 68 20  thname.** zPath 
1fa70 77 69 74 68 20 53 51 4c 49 54 45 5f 4f 50 45 4e  with SQLITE_OPEN
1fa80 5f 58 58 58 20 66 6c 61 67 73 20 6d 61 74 63 68  _XXX flags match
1fa90 69 6e 67 20 74 68 6f 73 65 20 70 61 73 73 65 64  ing those passed
1faa0 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 0a 2a   as the second.*
1fab0 2a 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  * argument to th
1fac0 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a  is function..**.
1fad0 2a 2a 20 53 75 63 68 20 61 20 66 69 6c 65 20 64  ** Such a file d
1fae0 65 73 63 72 69 70 74 6f 72 20 6d 61 79 20 65 78  escriptor may ex
1faf0 69 73 74 20 69 66 20 61 20 64 61 74 61 62 61 73  ist if a databas
1fb00 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 61 73  e connection was
1fb10 20 63 6c 6f 73 65 64 0a 2a 2a 20 62 75 74 20 74   closed.** but t
1fb20 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 66 69  he associated fi
1fb30 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 63 6f  le descriptor co
1fb40 75 6c 64 20 6e 6f 74 20 62 65 20 63 6c 6f 73 65  uld not be close
1fb50 64 20 62 65 63 61 75 73 65 20 73 6f 6d 65 0a 2a  d because some.*
1fb60 2a 20 6f 74 68 65 72 20 66 69 6c 65 20 64 65 73  * other file des
1fb70 63 72 69 70 74 6f 72 20 6f 70 65 6e 20 6f 6e 20  criptor open on 
1fb80 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20 69 73  the same file is
1fb90 20 68 6f 6c 64 69 6e 67 20 61 20 66 69 6c 65 2d   holding a file-
1fba0 6c 6f 63 6b 2e 0a 2a 2a 20 52 65 66 65 72 20 74  lock..** Refer t
1fbb0 6f 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 74 68  o comments in th
1fbc0 65 20 75 6e 69 78 43 6c 6f 73 65 28 29 20 66 75  e unixClose() fu
1fbd0 6e 63 74 69 6f 6e 20 61 6e 64 20 74 68 65 20 6c  nction and the l
1fbe0 65 6e 67 74 68 79 20 63 6f 6d 6d 65 6e 74 0a 2a  engthy comment.*
1fbf0 2a 20 64 65 73 63 72 69 62 69 6e 67 20 22 50 6f  * describing "Po
1fc00 73 69 78 20 41 64 76 69 73 6f 72 79 20 4c 6f 63  six Advisory Loc
1fc10 6b 69 6e 67 22 20 61 74 20 74 68 65 20 73 74 61  king" at the sta
1fc20 72 74 20 6f 66 20 74 68 69 73 20 66 69 6c 65 20  rt of this file 
1fc30 66 6f 72 20 0a 2a 2a 20 66 75 72 74 68 65 72 20  for .** further 
1fc40 64 65 74 61 69 6c 73 2e 20 41 6c 73 6f 2c 20 74  details. Also, t
1fc50 69 63 6b 65 74 20 23 34 30 31 38 2e 0a 2a 2a 0a  icket #4018..**.
1fc60 2a 2a 20 49 66 20 61 20 73 75 69 74 61 62 6c 65  ** If a suitable
1fc70 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
1fc80 20 69 73 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20   is found, then 
1fc90 69 74 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  it is returned. 
1fca0 49 66 20 6e 6f 0a 2a 2a 20 73 75 63 68 20 66 69  If no.** such fi
1fcb0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73  le descriptor is
1fcc0 20 6c 6f 63 61 74 65 64 2c 20 2d 31 20 69 73 20   located, -1 is 
1fcd0 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
1fce0 74 69 63 20 55 6e 69 78 55 6e 75 73 65 64 46 64  tic UnixUnusedFd
1fcf0 20 2a 66 69 6e 64 52 65 75 73 61 62 6c 65 46 64   *findReusableFd
1fd00 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61  (const char *zPa
1fd10 74 68 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a  th, int flags){.
1fd20 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a    UnixUnusedFd *
1fd30 70 55 6e 75 73 65 64 20 3d 20 30 3b 0a 0a 20 20  pUnused = 0;..  
1fd40 2f 2a 20 44 6f 20 6e 6f 74 20 73 65 61 72 63 68  /* Do not search
1fd50 20 66 6f 72 20 61 6e 20 75 6e 75 73 65 64 20 66   for an unused f
1fd60 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f  ile descriptor o
1fd70 6e 20 76 78 77 6f 72 6b 73 2e 20 4e 6f 74 20 62  n vxworks. Not b
1fd80 65 63 61 75 73 65 0a 20 20 2a 2a 20 76 78 77 6f  ecause.  ** vxwo
1fd90 72 6b 73 20 77 6f 75 6c 64 20 6e 6f 74 20 62 65  rks would not be
1fda0 6e 65 66 69 74 20 66 72 6f 6d 20 74 68 65 20 63  nefit from the c
1fdb0 68 61 6e 67 65 20 28 69 74 20 6d 69 67 68 74 2c  hange (it might,
1fdc0 20 77 65 27 72 65 20 6e 6f 74 20 73 75 72 65 29   we're not sure)
1fdd0 2c 0a 20 20 2a 2a 20 62 75 74 20 62 65 63 61 75  ,.  ** but becau
1fde0 73 65 20 6e 6f 20 77 61 79 20 74 6f 20 74 65 73  se no way to tes
1fdf0 74 20 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c  t it is currentl
1fe00 79 20 61 76 61 69 6c 61 62 6c 65 2e 20 49 74 20  y available. It 
1fe10 69 73 20 62 65 74 74 65 72 20 0a 20 20 2a 2a 20  is better .  ** 
1fe20 6e 6f 74 20 74 6f 20 72 69 73 6b 20 62 72 65 61  not to risk brea
1fe30 6b 69 6e 67 20 76 78 77 6f 72 6b 73 20 73 75 70  king vxworks sup
1fe40 70 6f 72 74 20 66 6f 72 20 74 68 65 20 73 61 6b  port for the sak
1fe50 65 20 6f 66 20 73 75 63 68 20 61 6e 20 6f 62 73  e of such an obs
1fe60 63 75 72 65 20 0a 20 20 2a 2a 20 66 65 61 74 75  cure .  ** featu
1fe70 72 65 2e 20 20 2a 2f 0a 23 69 66 20 21 4f 53 5f  re.  */.#if !OS_
1fe80 56 58 57 4f 52 4b 53 0a 20 20 73 74 72 75 63 74  VXWORKS.  struct
1fe90 20 73 74 61 74 20 73 53 74 61 74 3b 20 20 20 20   stat sStat;    
1fea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1feb0 2a 20 52 65 73 75 6c 74 73 20 6f 66 20 73 74 61  * Results of sta
1fec0 74 28 29 20 63 61 6c 6c 20 2a 2f 0a 0a 20 20 2f  t() call */..  /
1fed0 2a 20 41 20 73 74 61 74 28 29 20 63 61 6c 6c 20  * A stat() call 
1fee0 6d 61 79 20 66 61 69 6c 20 66 6f 72 20 76 61 72  may fail for var
1fef0 69 6f 75 73 20 72 65 61 73 6f 6e 73 2e 20 49 66  ious reasons. If
1ff00 20 74 68 69 73 20 68 61 70 70 65 6e 73 2c 20 69   this happens, i
1ff10 74 20 69 73 0a 20 20 2a 2a 20 61 6c 6d 6f 73 74  t is.  ** almost
1ff20 20 63 65 72 74 61 69 6e 20 74 68 61 74 20 61 6e   certain that an
1ff30 20 6f 70 65 6e 28 29 20 63 61 6c 6c 20 6f 6e 20   open() call on 
1ff40 74 68 65 20 73 61 6d 65 20 70 61 74 68 20 77 69  the same path wi
1ff50 6c 6c 20 61 6c 73 6f 20 66 61 69 6c 2e 0a 20 20  ll also fail..  
1ff60 2a 2a 20 46 6f 72 20 74 68 69 73 20 72 65 61 73  ** For this reas
1ff70 6f 6e 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20  on, if an error 
1ff80 6f 63 63 75 72 73 20 69 6e 20 74 68 65 20 73 74  occurs in the st
1ff90 61 74 28 29 20 63 61 6c 6c 20 68 65 72 65 2c 20  at() call here, 
1ffa0 69 74 20 69 73 0a 20 20 2a 2a 20 69 67 6e 6f 72  it is.  ** ignor
1ffb0 65 64 20 61 6e 64 20 2d 31 20 69 73 20 72 65 74  ed and -1 is ret
1ffc0 75 72 6e 65 64 2e 20 54 68 65 20 63 61 6c 6c 65  urned. The calle
1ffd0 72 20 77 69 6c 6c 20 74 72 79 20 74 6f 20 6f 70  r will try to op
1ffe0 65 6e 20 61 20 6e 65 77 20 66 69 6c 65 0a 20 20  en a new file.  
1fff0 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20 6f 6e  ** descriptor on
20000 20 74 68 65 20 73 61 6d 65 20 70 61 74 68 2c 20   the same path, 
20010 66 61 69 6c 2c 20 61 6e 64 20 72 65 74 75 72 6e  fail, and return
20020 20 61 6e 20 65 72 72 6f 72 20 74 6f 20 53 51 4c   an error to SQL
20030 69 74 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45  ite..  **.  ** E
20040 76 65 6e 20 69 66 20 61 20 73 75 62 73 65 71 75  ven if a subsequ
20050 65 6e 74 20 6f 70 65 6e 28 29 20 63 61 6c 6c 20  ent open() call 
20060 64 6f 65 73 20 73 75 63 63 65 65 64 2c 20 74 68  does succeed, th
20070 65 20 63 6f 6e 73 65 71 75 65 6e 63 65 73 20 6f  e consequences o
20080 66 0a 20 20 2a 2a 20 6e 6f 74 20 73 65 61 72 63  f.  ** not searc
20090 68 69 6e 67 20 66 6f 72 20 61 20 72 65 73 75 73  hing for a resus
200a0 61 62 6c 65 20 66 69 6c 65 20 64 65 73 63 72 69  able file descri
200b0 70 74 6f 72 20 61 72 65 20 6e 6f 74 20 64 69 72  ptor are not dir
200c0 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d  e.  */.  if( 0==
200d0 73 74 61 74 28 7a 50 61 74 68 2c 20 26 73 53 74  stat(zPath, &sSt
200e0 61 74 29 20 29 7b 0a 20 20 20 20 73 74 72 75 63  at) ){.    struc
200f0 74 20 75 6e 69 78 4f 70 65 6e 43 6e 74 20 2a 70  t unixOpenCnt *p
20100 4f 70 65 6e 3b 0a 0a 20 20 20 20 75 6e 69 78 45  Open;..    unixE
20110 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20  nterMutex();.   
20120 20 70 4f 70 65 6e 20 3d 20 6f 70 65 6e 4c 69 73   pOpen = openLis
20130 74 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 4f  t;.    while( pO
20140 70 65 6e 20 26 26 20 28 70 4f 70 65 6e 2d 3e 66  pen && (pOpen->f
20150 69 6c 65 49 64 2e 64 65 76 21 3d 73 53 74 61 74  ileId.dev!=sStat
20160 2e 73 74 5f 64 65 76 0a 20 20 20 20 20 20 20 20  .st_dev.        
20170 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
20180 70 4f 70 65 6e 2d 3e 66 69 6c 65 49 64 2e 69 6e  pOpen->fileId.in
20190 6f 21 3d 73 53 74 61 74 2e 73 74 5f 69 6e 6f 29  o!=sStat.st_ino)
201a0 20 29 7b 0a 20 20 20 20 20 20 20 70 4f 70 65 6e   ){.       pOpen
201b0 20 3d 20 70 4f 70 65 6e 2d 3e 70 4e 65 78 74 3b   = pOpen->pNext;
201c0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
201d0 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20 20 55 6e  Open ){.      Un
201e0 69 78 55 6e 75 73 65 64 46 64 20 2a 2a 70 70 3b  ixUnusedFd **pp;
201f0 0a 20 20 20 20 20 20 66 6f 72 28 70 70 3d 26 70  .      for(pp=&p
20200 4f 70 65 6e 2d 3e 70 55 6e 75 73 65 64 3b 20 2a  Open->pUnused; *
20210 70 70 20 26 26 20 28 2a 70 70 29 2d 3e 66 6c 61  pp && (*pp)->fla
20220 67 73 21 3d 66 6c 61 67 73 3b 20 70 70 3d 26 28  gs!=flags; pp=&(
20230 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29 29 3b 0a  (*pp)->pNext));.
20240 20 20 20 20 20 20 70 55 6e 75 73 65 64 20 3d 20        pUnused = 
20250 2a 70 70 3b 0a 20 20 20 20 20 20 69 66 28 20 70  *pp;.      if( p
20260 55 6e 75 73 65 64 20 29 7b 0a 20 20 20 20 20 20  Unused ){.      
20270 20 20 2a 70 70 20 3d 20 70 55 6e 75 73 65 64 2d    *pp = pUnused-
20280 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a  >pNext;.      }.
20290 20 20 20 20 7d 0a 20 20 20 20 75 6e 69 78 4c 65      }.    unixLe
202a0 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a  aveMutex();.  }.
202b0 23 65 6e 64 69 66 20 20 20 20 2f 2a 20 69 66 20  #endif    /* if 
202c0 21 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 20  !OS_VXWORKS */. 
202d0 20 72 65 74 75 72 6e 20 70 55 6e 75 73 65 64 3b   return pUnused;
202e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74  .}../*.** Open t
202f0 68 65 20 66 69 6c 65 20 7a 50 61 74 68 2e 0a 2a  he file zPath..*
20300 2a 20 0a 2a 2a 20 50 72 65 76 69 6f 75 73 6c 79  * .** Previously
20310 2c 20 74 68 65 20 53 51 4c 69 74 65 20 4f 53 20  , the SQLite OS 
20320 6c 61 79 65 72 20 75 73 65 64 20 74 68 72 65 65  layer used three
20330 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e 20 70 6c   functions in pl
20340 61 63 65 20 6f 66 20 74 68 69 73 0a 2a 2a 20 6f  ace of this.** o
20350 6e 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73 71  ne:.**.**     sq
20360 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 57  lite3OsOpenReadW
20370 72 69 74 65 28 29 3b 0a 2a 2a 20 20 20 20 20 73  rite();.**     s
20380 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64  qlite3OsOpenRead
20390 4f 6e 6c 79 28 29 3b 0a 2a 2a 20 20 20 20 20 73  Only();.**     s
203a0 71 6c 69 74 65 33 4f 73 4f 70 65 6e 45 78 63 6c  qlite3OsOpenExcl
203b0 75 73 69 76 65 28 29 3b 0a 2a 2a 0a 2a 2a 20 54  usive();.**.** T
203c0 68 65 73 65 20 63 61 6c 6c 73 20 63 6f 72 72 65  hese calls corre
203d0 73 70 6f 6e 64 20 74 6f 20 74 68 65 20 66 6f 6c  spond to the fol
203e0 6c 6f 77 69 6e 67 20 63 6f 6d 62 69 6e 61 74 69  lowing combinati
203f0 6f 6e 73 20 6f 66 20 66 6c 61 67 73 3a 0a 2a 2a  ons of flags:.**
20400 0a 2a 2a 20 20 20 20 20 52 65 61 64 57 72 69 74  .**     ReadWrit
20410 65 28 29 20 2d 3e 20 20 20 20 20 28 52 45 41 44  e() ->     (READ
20420 57 52 49 54 45 20 7c 20 43 52 45 41 54 45 29 0a  WRITE | CREATE).
20430 2a 2a 20 20 20 20 20 52 65 61 64 4f 6e 6c 79 28  **     ReadOnly(
20440 29 20 20 2d 3e 20 20 20 20 20 28 52 45 41 44 4f  )  ->     (READO
20450 4e 4c 59 29 20 0a 2a 2a 20 20 20 20 20 4f 70 65  NLY) .**     Ope
20460 6e 45 78 63 6c 75 73 69 76 65 28 29 20 2d 3e 20  nExclusive() -> 
20470 28 52 45 41 44 57 52 49 54 45 20 7c 20 43 52 45  (READWRITE | CRE
20480 41 54 45 20 7c 20 45 58 43 4c 55 53 49 56 45 29  ATE | EXCLUSIVE)
20490 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 6c 64 20 4f  .**.** The old O
204a0 70 65 6e 45 78 63 6c 75 73 69 76 65 28 29 20 61  penExclusive() a
204b0 63 63 65 70 74 65 64 20 61 20 62 6f 6f 6c 65 61  ccepted a boolea
204c0 6e 20 61 72 67 75 6d 65 6e 74 20 2d 20 22 64 65  n argument - "de
204d0 6c 46 6c 61 67 22 2e 20 49 66 0a 2a 2a 20 74 72  lFlag". If.** tr
204e0 75 65 2c 20 74 68 65 20 66 69 6c 65 20 77 61 73  ue, the file was
204f0 20 63 6f 6e 66 69 67 75 72 65 64 20 74 6f 20 62   configured to b
20500 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  e automatically 
20510 64 65 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65  deleted when the
20520 0a 2a 2a 20 66 69 6c 65 20 68 61 6e 64 6c 65 20  .** file handle 
20530 63 6c 6f 73 65 64 2e 20 54 6f 20 61 63 68 69 65  closed. To achie
20540 76 65 20 74 68 65 20 73 61 6d 65 20 65 66 66 65  ve the same effe
20550 63 74 20 75 73 69 6e 67 20 74 68 69 73 20 6e 65  ct using this ne
20560 77 20 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65 2c  w .** interface,
20570 20 61 64 64 20 74 68 65 20 44 45 4c 45 54 45 4f   add the DELETEO
20580 4e 43 4c 4f 53 45 20 66 6c 61 67 20 74 6f 20 74  NCLOSE flag to t
20590 68 6f 73 65 20 73 70 65 63 69 66 69 65 64 20 61  hose specified a
205a0 62 6f 76 65 20 66 6f 72 20 0a 2a 2a 20 4f 70 65  bove for .** Ope
205b0 6e 45 78 63 6c 75 73 69 76 65 28 29 2e 0a 2a 2f  nExclusive()..*/
205c0 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
205d0 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f  Open(.  sqlite3_
205e0 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20  vfs *pVfs,      
205f0 20 20 20 20 20 2f 2a 20 54 68 65 20 56 46 53 20       /* The VFS 
20600 66 6f 72 20 77 68 69 63 68 20 74 68 69 73 20 69  for which this i
20610 73 20 74 68 65 20 78 4f 70 65 6e 20 6d 65 74 68  s the xOpen meth
20620 6f 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  od */.  const ch
20630 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20  ar *zPath,      
20640 20 20 20 20 20 2f 2a 20 50 61 74 68 6e 61 6d 65       /* Pathname
20650 20 6f 66 20 66 69 6c 65 20 74 6f 20 62 65 20 6f   of file to be o
20660 70 65 6e 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74  pened */.  sqlit
20670 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20  e3_file *pFile, 
20680 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66          /* The f
20690 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74  ile descriptor t
206a0 6f 20 62 65 20 66 69 6c 6c 65 64 20 69 6e 20 2a  o be filled in *
206b0 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20  /.  int flags,  
206c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
206d0 20 2f 2a 20 49 6e 70 75 74 20 66 6c 61 67 73 20   /* Input flags 
206e0 74 6f 20 63 6f 6e 74 72 6f 6c 20 74 68 65 20 6f  to control the o
206f0 70 65 6e 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20  pening */.  int 
20700 2a 70 4f 75 74 46 6c 61 67 73 20 20 20 20 20 20  *pOutFlags      
20710 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70           /* Outp
20720 75 74 20 66 6c 61 67 73 20 72 65 74 75 72 6e 65  ut flags returne
20730 64 20 74 6f 20 53 51 4c 69 74 65 20 63 6f 72 65  d to SQLite core
20740 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c   */.){.  unixFil
20750 65 20 2a 70 20 3d 20 28 75 6e 69 78 46 69 6c 65  e *p = (unixFile
20760 20 2a 29 70 46 69 6c 65 3b 0a 20 20 69 6e 74 20   *)pFile;.  int 
20770 66 64 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20  fd = -1;        
20780 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
20790 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 72 65  le descriptor re
207a0 74 75 72 6e 65 64 20 62 79 20 6f 70 65 6e 28 29  turned by open()
207b0 20 2a 2f 0a 20 20 69 6e 74 20 64 69 72 66 64 20   */.  int dirfd 
207c0 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20 20 20  = -1;           
207d0 20 20 20 20 20 2f 2a 20 44 69 72 65 63 74 6f 72       /* Director
207e0 79 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  y file descripto
207f0 72 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 65 6e 46  r */.  int openF
20800 6c 61 67 73 20 3d 20 30 3b 20 20 20 20 20 20 20  lags = 0;       
20810 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 74        /* Flags t
20820 6f 20 70 61 73 73 20 74 6f 20 6f 70 65 6e 28 29  o pass to open()
20830 20 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70 65 20   */.  int eType 
20840 3d 20 66 6c 61 67 73 26 30 78 46 46 46 46 46 46  = flags&0xFFFFFF
20850 30 30 3b 20 20 2f 2a 20 54 79 70 65 20 6f 66 20  00;  /* Type of 
20860 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a  file to open */.
20870 20 20 69 6e 74 20 6e 6f 4c 6f 63 6b 3b 20 20 20    int noLock;   
20880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20890 20 2f 2a 20 54 72 75 65 20 74 6f 20 6f 6d 69 74   /* True to omit
208a0 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69 74 69   locking primiti
208b0 76 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ves */.  int rc 
208c0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
208d0 20 20 20 20 20 20 20 20 2f 2a 20 46 75 6e 63 74          /* Funct
208e0 69 6f 6e 20 52 65 74 75 72 6e 20 43 6f 64 65 20  ion Return Code 
208f0 2a 2f 0a 0a 20 20 69 6e 74 20 69 73 45 78 63 6c  */..  int isExcl
20900 75 73 69 76 65 20 20 3d 20 28 66 6c 61 67 73 20  usive  = (flags 
20910 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58  & SQLITE_OPEN_EX
20920 43 4c 55 53 49 56 45 29 3b 0a 20 20 69 6e 74 20  CLUSIVE);.  int 
20930 69 73 44 65 6c 65 74 65 20 20 20 20 20 3d 20 28  isDelete     = (
20940 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
20950 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53  PEN_DELETEONCLOS
20960 45 29 3b 0a 20 20 69 6e 74 20 69 73 43 72 65 61  E);.  int isCrea
20970 74 65 20 20 20 20 20 3d 20 28 66 6c 61 67 73 20  te     = (flags 
20980 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  & SQLITE_OPEN_CR
20990 45 41 54 45 29 3b 0a 20 20 69 6e 74 20 69 73 52  EATE);.  int isR
209a0 65 61 64 6f 6e 6c 79 20 20 20 3d 20 28 66 6c 61  eadonly   = (fla
209b0 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
209c0 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 20 20 69 6e  _READONLY);.  in
209d0 74 20 69 73 52 65 61 64 57 72 69 74 65 20 20 3d  t isReadWrite  =
209e0 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
209f0 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 29  _OPEN_READWRITE)
20a00 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  ;.#if SQLITE_ENA
20a10 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
20a20 45 0a 20 20 69 6e 74 20 69 73 41 75 74 6f 50 72  E.  int isAutoPr
20a30 6f 78 79 20 20 3d 20 28 66 6c 61 67 73 20 26 20  oxy  = (flags & 
20a40 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 41 55 54 4f  SQLITE_OPEN_AUTO
20a50 50 52 4f 58 59 29 3b 0a 23 65 6e 64 69 66 0a 0a  PROXY);.#endif..
20a60 20 20 2f 2a 20 49 66 20 63 72 65 61 74 69 6e 67    /* If creating
20a70 20 61 20 6d 61 73 74 65 72 20 6f 72 20 6d 61 69   a master or mai
20a80 6e 2d 66 69 6c 65 20 6a 6f 75 72 6e 61 6c 2c 20  n-file journal, 
20a90 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69  this function wi
20aa0 6c 6c 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 66  ll open.  ** a f
20ab0 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 20 6f  ile-descriptor o
20ac0 6e 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  n the directory 
20ad0 74 6f 6f 2e 20 54 68 65 20 66 69 72 73 74 20 74  too. The first t
20ae0 69 6d 65 20 75 6e 69 78 53 79 6e 63 28 29 0a 20  ime unixSync(). 
20af0 20 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 74 68   ** is called th
20b00 65 20 64 69 72 65 63 74 6f 72 79 20 66 69 6c 65  e directory file
20b10 20 64 65 73 63 72 69 70 74 6f 72 20 77 69 6c 6c   descriptor will
20b20 20 62 65 20 66 73 79 6e 63 28 29 65 64 20 61 6e   be fsync()ed an
20b30 64 20 63 6c 6f 73 65 28 29 64 2e 0a 20 20 2a 2f  d close()d..  */
20b40 0a 20 20 69 6e 74 20 69 73 4f 70 65 6e 44 69 72  .  int isOpenDir
20b50 65 63 74 6f 72 79 20 3d 20 28 69 73 43 72 65 61  ectory = (isCrea
20b60 74 65 20 26 26 20 0a 20 20 20 20 20 20 28 65 54  te && .      (eT
20b70 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
20b80 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20  _MASTER_JOURNAL 
20b90 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
20ba0 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
20bb0 41 4c 29 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 49  AL).  );..  /* I
20bc0 66 20 61 72 67 75 6d 65 6e 74 20 7a 50 61 74 68  f argument zPath
20bd0 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74   is a NULL point
20be0 65 72 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  er, this functio
20bf0 6e 20 69 73 20 72 65 71 75 69 72 65 64 20 74 6f  n is required to
20c00 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 74 65 6d   open.  ** a tem
20c10 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 55 73 65  porary file. Use
20c20 20 74 68 69 73 20 62 75 66 66 65 72 20 74 6f 20   this buffer to 
20c30 73 74 6f 72 65 20 74 68 65 20 66 69 6c 65 20 6e  store the file n
20c40 61 6d 65 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 63  ame in..  */.  c
20c50 68 61 72 20 7a 54 6d 70 6e 61 6d 65 5b 4d 41 58  har zTmpname[MAX
20c60 5f 50 41 54 48 4e 41 4d 45 2b 31 5d 3b 0a 20 20  _PATHNAME+1];.  
20c70 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
20c80 65 20 3d 20 7a 50 61 74 68 3b 0a 0a 20 20 2f 2a  e = zPath;..  /*
20c90 20 43 68 65 63 6b 20 74 68 65 20 66 6f 6c 6c 6f   Check the follo
20ca0 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73 20  wing statements 
20cb0 61 72 65 20 74 72 75 65 3a 20 0a 20 20 2a 2a 0a  are true: .  **.
20cc0 20 20 2a 2a 20 20 20 28 61 29 20 45 78 61 63 74    **   (a) Exact
20cd0 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 52 45  ly one of the RE
20ce0 41 44 57 52 49 54 45 20 61 6e 64 20 52 45 41 44  ADWRITE and READ
20cf0 4f 4e 4c 59 20 66 6c 61 67 73 20 6d 75 73 74 20  ONLY flags must 
20d00 62 65 20 73 65 74 2c 20 61 6e 64 20 0a 20 20 2a  be set, and .  *
20d10 2a 20 20 20 28 62 29 20 69 66 20 43 52 45 41 54  *   (b) if CREAT
20d20 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 52  E is set, then R
20d30 45 41 44 57 52 49 54 45 20 6d 75 73 74 20 61 6c  EADWRITE must al
20d40 73 6f 20 62 65 20 73 65 74 2c 20 61 6e 64 0a 20  so be set, and. 
20d50 20 2a 2a 20 20 20 28 63 29 20 69 66 20 45 58 43   **   (c) if EXC
20d60 4c 55 53 49 56 45 20 69 73 20 73 65 74 2c 20 74  LUSIVE is set, t
20d70 68 65 6e 20 43 52 45 41 54 45 20 6d 75 73 74 20  hen CREATE must 
20d80 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20 20 2a  also be set..  *
20d90 2a 20 20 20 28 64 29 20 69 66 20 44 45 4c 45 54  *   (d) if DELET
20da0 45 4f 4e 43 4c 4f 53 45 20 69 73 20 73 65 74 2c  EONCLOSE is set,
20db0 20 74 68 65 6e 20 43 52 45 41 54 45 20 6d 75 73   then CREATE mus
20dc0 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20  t also be set.. 
20dd0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 28 69 73   */.  assert((is
20de0 52 65 61 64 6f 6e 6c 79 3d 3d 30 20 7c 7c 20 69  Readonly==0 || i
20df0 73 52 65 61 64 57 72 69 74 65 3d 3d 30 29 20 26  sReadWrite==0) &
20e00 26 20 28 69 73 52 65 61 64 57 72 69 74 65 20 7c  & (isReadWrite |
20e10 7c 20 69 73 52 65 61 64 6f 6e 6c 79 29 29 3b 0a  | isReadonly));.
20e20 20 20 61 73 73 65 72 74 28 69 73 43 72 65 61 74    assert(isCreat
20e30 65 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64 57 72  e==0 || isReadWr
20e40 69 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28 69  ite);.  assert(i
20e50 73 45 78 63 6c 75 73 69 76 65 3d 3d 30 20 7c 7c  sExclusive==0 ||
20e60 20 69 73 43 72 65 61 74 65 29 3b 0a 20 20 61 73   isCreate);.  as
20e70 73 65 72 74 28 69 73 44 65 6c 65 74 65 3d 3d 30  sert(isDelete==0
20e80 20 7c 7c 20 69 73 43 72 65 61 74 65 29 3b 0a 0a   || isCreate);..
20e90 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 44 42    /* The main DB
20ea0 2c 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20  , main journal, 
20eb0 61 6e 64 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  and master journ
20ec0 61 6c 20 61 72 65 20 6e 65 76 65 72 20 61 75 74  al are never aut
20ed0 6f 6d 61 74 69 63 61 6c 6c 79 0a 20 20 2a 2a 20  omatically.  ** 
20ee0 64 65 6c 65 74 65 64 2e 20 4e 6f 72 20 61 72 65  deleted. Nor are
20ef0 20 74 68 65 79 20 65 76 65 72 20 74 65 6d 70 6f   they ever tempo
20f00 72 61 72 79 20 66 69 6c 65 73 2e 20 20 2a 2f 0a  rary files.  */.
20f10 20 20 61 73 73 65 72 74 28 20 28 21 69 73 44 65    assert( (!isDe
20f20 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c  lete && zName) |
20f30 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f  | eType!=SQLITE_
20f40 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 29 3b 0a  OPEN_MAIN_DB );.
20f50 20 20 61 73 73 65 72 74 28 20 28 21 69 73 44 65    assert( (!isDe
20f60 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c  lete && zName) |
20f70 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f  | eType!=SQLITE_
20f80 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
20f90 4c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  L );.  assert( (
20fa0 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61  !isDelete && zNa
20fb0 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51  me) || eType!=SQ
20fc0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52  LITE_OPEN_MASTER
20fd0 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 0a 20 20 2f  _JOURNAL );..  /
20fe0 2a 20 41 73 73 65 72 74 20 74 68 61 74 20 74 68  * Assert that th
20ff0 65 20 75 70 70 65 72 20 6c 61 79 65 72 20 68 61  e upper layer ha
21000 73 20 73 65 74 20 6f 6e 65 20 6f 66 20 74 68 65  s set one of the
21010 20 22 66 69 6c 65 2d 74 79 70 65 22 20 66 6c 61   "file-type" fla
21020 67 73 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  gs. */.  assert(
21030 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
21040 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 20 20 20 20  PEN_MAIN_DB     
21050 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
21060 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 20 0a  E_OPEN_TEMP_DB .
21070 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d         || eType=
21080 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  =SQLITE_OPEN_MAI
21090 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 7c 20 65 54 79  N_JOURNAL || eTy
210a0 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
210b0 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20  TEMP_JOURNAL .  
210c0 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53       || eType==S
210d0 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f  QLITE_OPEN_SUBJO
210e0 55 52 4e 41 4c 20 20 20 7c 7c 20 65 54 79 70 65  URNAL   || eType
210f0 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  ==SQLITE_OPEN_MA
21100 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20  STER_JOURNAL .  
21110 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53       || eType==S
21120 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 52 41 4e 53  QLITE_OPEN_TRANS
21130 49 45 4e 54 5f 44 42 0a 20 20 29 3b 0a 0a 20 20  IENT_DB.  );..  
21140 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a  memset(p, 0, siz
21150 65 6f 66 28 75 6e 69 78 46 69 6c 65 29 29 3b 0a  eof(unixFile));.
21160 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 53 51  .  if( eType==SQ
21170 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44  LITE_OPEN_MAIN_D
21180 42 20 29 7b 0a 20 20 20 20 55 6e 69 78 55 6e 75  B ){.    UnixUnu
21190 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64 3b 0a  sedFd *pUnused;.
211a0 20 20 20 20 70 55 6e 75 73 65 64 20 3d 20 66 69      pUnused = fi
211b0 6e 64 52 65 75 73 61 62 6c 65 46 64 28 7a 4e 61  ndReusableFd(zNa
211c0 6d 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20  me, flags);.    
211d0 69 66 28 20 70 55 6e 75 73 65 64 20 29 7b 0a 20  if( pUnused ){. 
211e0 20 20 20 20 20 66 64 20 3d 20 70 55 6e 75 73 65       fd = pUnuse
211f0 64 2d 3e 66 64 3b 0a 20 20 20 20 7d 65 6c 73 65  d->fd;.    }else
21200 7b 0a 20 20 20 20 20 20 70 55 6e 75 73 65 64 20  {.      pUnused 
21210 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
21220 28 73 69 7a 65 6f 66 28 2a 70 55 6e 75 73 65 64  (sizeof(*pUnused
21230 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70  ));.      if( !p
21240 55 6e 75 73 65 64 20 29 7b 0a 20 20 20 20 20 20  Unused ){.      
21250 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
21260 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20  NOMEM;.      }. 
21270 20 20 20 7d 0a 20 20 20 20 70 2d 3e 70 55 6e 75     }.    p->pUnu
21280 73 65 64 20 3d 20 70 55 6e 75 73 65 64 3b 0a 20  sed = pUnused;. 
21290 20 7d 65 6c 73 65 20 69 66 28 20 21 7a 4e 61 6d   }else if( !zNam
212a0 65 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 7a  e ){.    /* If z
212b0 4e 61 6d 65 20 69 73 20 4e 55 4c 4c 2c 20 74 68  Name is NULL, th
212c0 65 20 75 70 70 65 72 20 6c 61 79 65 72 20 69 73  e upper layer is
212d0 20 72 65 71 75 65 73 74 69 6e 67 20 61 20 74 65   requesting a te
212e0 6d 70 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20  mp file. */.    
212f0 61 73 73 65 72 74 28 69 73 44 65 6c 65 74 65 20  assert(isDelete 
21300 26 26 20 21 69 73 4f 70 65 6e 44 69 72 65 63 74  && !isOpenDirect
21310 6f 72 79 29 3b 0a 20 20 20 20 72 63 20 3d 20 67  ory);.    rc = g
21320 65 74 54 65 6d 70 6e 61 6d 65 28 4d 41 58 5f 50  etTempname(MAX_P
21330 41 54 48 4e 41 4d 45 2b 31 2c 20 7a 54 6d 70 6e  ATHNAME+1, zTmpn
21340 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ame);.    if( rc
21350 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
21360 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
21370 20 20 20 20 7d 0a 20 20 20 20 7a 4e 61 6d 65 20      }.    zName 
21380 3d 20 7a 54 6d 70 6e 61 6d 65 3b 0a 20 20 7d 0a  = zTmpname;.  }.
21390 0a 20 20 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20  .  /* Determine 
213a0 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
213b0 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72   flags parameter
213c0 20 70 61 73 73 65 64 20 74 6f 20 50 4f 53 49 58   passed to POSIX
213d0 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 6f   function.  ** o
213e0 70 65 6e 28 29 2e 20 54 68 65 73 65 20 6d 75 73  pen(). These mus
213f0 74 20 62 65 20 63 61 6c 63 75 6c 61 74 65 64 20  t be calculated 
21400 65 76 65 6e 20 69 66 20 6f 70 65 6e 28 29 20 69  even if open() i
21410 73 20 6e 6f 74 20 63 61 6c 6c 65 64 2c 20 61 73  s not called, as
21420 0a 20 20 2a 2a 20 74 68 65 79 20 6d 61 79 20 62  .  ** they may b
21430 65 20 73 74 6f 72 65 64 20 61 73 20 70 61 72 74  e stored as part
21440 20 6f 66 20 74 68 65 20 66 69 6c 65 20 68 61 6e   of the file han
21450 64 6c 65 20 61 6e 64 20 75 73 65 64 20 62 79 20  dle and used by 
21460 74 68 65 20 0a 20 20 2a 2a 20 27 63 6f 6e 63 68  the .  ** 'conch
21470 20 66 69 6c 65 27 20 6c 6f 63 6b 69 6e 67 20 66   file' locking f
21480 75 6e 63 74 69 6f 6e 73 20 6c 61 74 65 72 20 6f  unctions later o
21490 6e 2e 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 52  n.  */.  if( isR
214a0 65 61 64 6f 6e 6c 79 20 29 20 20 6f 70 65 6e 46  eadonly )  openF
214b0 6c 61 67 73 20 7c 3d 20 4f 5f 52 44 4f 4e 4c 59  lags |= O_RDONLY
214c0 3b 0a 20 20 69 66 28 20 69 73 52 65 61 64 57 72  ;.  if( isReadWr
214d0 69 74 65 20 29 20 6f 70 65 6e 46 6c 61 67 73 20  ite ) openFlags 
214e0 7c 3d 20 4f 5f 52 44 57 52 3b 0a 20 20 69 66 28  |= O_RDWR;.  if(
214f0 20 69 73 43 72 65 61 74 65 20 29 20 20 20 20 6f   isCreate )    o
21500 70 65 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f 43 52  penFlags |= O_CR
21510 45 41 54 3b 0a 20 20 69 66 28 20 69 73 45 78 63  EAT;.  if( isExc
21520 6c 75 73 69 76 65 20 29 20 6f 70 65 6e 46 6c 61  lusive ) openFla
21530 67 73 20 7c 3d 20 28 4f 5f 45 58 43 4c 7c 4f 5f  gs |= (O_EXCL|O_
21540 4e 4f 46 4f 4c 4c 4f 57 29 3b 0a 20 20 6f 70 65  NOFOLLOW);.  ope
21550 6e 46 6c 61 67 73 20 7c 3d 20 28 4f 5f 4c 41 52  nFlags |= (O_LAR
21560 47 45 46 49 4c 45 7c 4f 5f 42 49 4e 41 52 59 29  GEFILE|O_BINARY)
21570 3b 0a 0a 20 20 69 66 28 20 66 64 3c 30 20 29 7b  ;..  if( fd<0 ){
21580 0a 20 20 20 20 6d 6f 64 65 5f 74 20 6f 70 65 6e  .    mode_t open
21590 4d 6f 64 65 20 3d 20 28 69 73 44 65 6c 65 74 65  Mode = (isDelete
215a0 3f 30 36 30 30 3a 53 51 4c 49 54 45 5f 44 45 46  ?0600:SQLITE_DEF
215b0 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53  AULT_FILE_PERMIS
215c0 53 49 4f 4e 53 29 3b 0a 20 20 20 20 66 64 20 3d  SIONS);.    fd =
215d0 20 6f 70 65 6e 28 7a 4e 61 6d 65 2c 20 6f 70 65   open(zName, ope
215e0 6e 46 6c 61 67 73 2c 20 6f 70 65 6e 4d 6f 64 65  nFlags, openMode
215f0 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 34 28  );.    OSTRACE4(
21600 22 4f 50 45 4e 58 20 20 20 25 2d 33 64 20 25 73  "OPENX   %-3d %s
21610 20 30 25 6f 5c 6e 22 2c 20 66 64 2c 20 7a 4e 61   0%o\n", fd, zNa
21620 6d 65 2c 20 6f 70 65 6e 46 6c 61 67 73 29 3b 0a  me, openFlags);.
21630 20 20 20 20 69 66 28 20 66 64 3c 30 20 26 26 20      if( fd<0 && 
21640 65 72 72 6e 6f 21 3d 45 49 53 44 49 52 20 26 26  errno!=EISDIR &&
21650 20 69 73 52 65 61 64 57 72 69 74 65 20 26 26 20   isReadWrite && 
21660 21 69 73 45 78 63 6c 75 73 69 76 65 20 29 7b 0a  !isExclusive ){.
21670 20 20 20 20 20 20 2f 2a 20 46 61 69 6c 65 64 20        /* Failed 
21680 74 6f 20 6f 70 65 6e 20 74 68 65 20 66 69 6c 65  to open the file
21690 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20   for read/write 
216a0 61 63 63 65 73 73 2e 20 54 72 79 20 72 65 61 64  access. Try read
216b0 2d 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20 20 20 20  -only. */.      
216c0 66 6c 61 67 73 20 26 3d 20 7e 28 53 51 4c 49 54  flags &= ~(SQLIT
216d0 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
216e0 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45  |SQLITE_OPEN_CRE
216f0 41 54 45 29 3b 0a 20 20 20 20 20 20 6f 70 65 6e  ATE);.      open
21700 46 6c 61 67 73 20 26 3d 20 7e 28 4f 5f 52 44 57  Flags &= ~(O_RDW
21710 52 7c 4f 5f 43 52 45 41 54 29 3b 0a 20 20 20 20  R|O_CREAT);.    
21720 20 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54    flags |= SQLIT
21730 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b  E_OPEN_READONLY;
21740 0a 20 20 20 20 20 20 6f 70 65 6e 46 6c 61 67 73  .      openFlags
21750 20 7c 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20 20   |= O_RDONLY;.  
21760 20 20 20 20 66 64 20 3d 20 6f 70 65 6e 28 7a 4e      fd = open(zN
21770 61 6d 65 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20  ame, openFlags, 
21780 6f 70 65 6e 4d 6f 64 65 29 3b 0a 20 20 20 20 7d  openMode);.    }
21790 0a 20 20 20 20 69 66 28 20 66 64 3c 30 20 29 7b  .    if( fd<0 ){
217a0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
217b0 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54  TE_CANTOPEN_BKPT
217c0 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f 70 65  ;.      goto ope
217d0 6e 5f 66 69 6e 69 73 68 65 64 3b 0a 20 20 20 20  n_finished;.    
217e0 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  }.  }.  assert( 
217f0 66 64 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  fd>=0 );.  if( p
21800 4f 75 74 46 6c 61 67 73 20 29 7b 0a 20 20 20 20  OutFlags ){.    
21810 2a 70 4f 75 74 46 6c 61 67 73 20 3d 20 66 6c 61  *pOutFlags = fla
21820 67 73 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  gs;.  }..  if( p
21830 2d 3e 70 55 6e 75 73 65 64 20 29 7b 0a 20 20 20  ->pUnused ){.   
21840 20 70 2d 3e 70 55 6e 75 73 65 64 2d 3e 66 64 20   p->pUnused->fd 
21850 3d 20 66 64 3b 0a 20 20 20 20 70 2d 3e 70 55 6e  = fd;.    p->pUn
21860 75 73 65 64 2d 3e 66 6c 61 67 73 20 3d 20 66 6c  used->flags = fl
21870 61 67 73 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ags;.  }..  if( 
21880 69 73 44 65 6c 65 74 65 20 29 7b 0a 23 69 66 20  isDelete ){.#if 
21890 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 20 20 7a  OS_VXWORKS.    z
218a0 50 61 74 68 20 3d 20 7a 4e 61 6d 65 3b 0a 23 65  Path = zName;.#e
218b0 6c 73 65 0a 20 20 20 20 75 6e 6c 69 6e 6b 28 7a  lse.    unlink(z
218c0 4e 61 6d 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20  Name);.#endif.  
218d0 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  }.#if SQLITE_ENA
218e0 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
218f0 45 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 70 2d  E.  else{.    p-
21900 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 6f 70 65  >openFlags = ope
21910 6e 46 6c 61 67 73 3b 0a 20 20 7d 0a 23 65 6e 64  nFlags;.  }.#end
21920 69 66 0a 0a 20 20 69 66 28 20 69 73 4f 70 65 6e  if..  if( isOpen
21930 44 69 72 65 63 74 6f 72 79 20 29 7b 0a 20 20 20  Directory ){.   
21940 20 72 63 20 3d 20 6f 70 65 6e 44 69 72 65 63 74   rc = openDirect
21950 6f 72 79 28 7a 50 61 74 68 2c 20 26 64 69 72 66  ory(zPath, &dirf
21960 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  d);.    if( rc!=
21970 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
21980 20 20 20 2f 2a 20 49 74 20 69 73 20 73 61 66 65     /* It is safe
21990 20 74 6f 20 63 6c 6f 73 65 20 66 64 20 61 74 20   to close fd at 
219a0 74 68 69 73 20 70 6f 69 6e 74 2c 20 62 65 63 61  this point, beca
219b0 75 73 65 20 69 74 20 69 73 20 67 75 61 72 61 6e  use it is guaran
219c0 74 65 65 64 20 6e 6f 74 0a 20 20 20 20 20 20 2a  teed not.      *
219d0 2a 20 74 6f 20 62 65 20 6f 70 65 6e 20 6f 6e 20  * to be open on 
219e0 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  a database file.
219f0 20 49 66 20 69 74 20 77 65 72 65 20 6f 70 65 6e   If it were open
21a00 20 6f 6e 20 61 20 64 61 74 61 62 61 73 65 20 66   on a database f
21a10 69 6c 65 2c 0a 20 20 20 20 20 20 2a 2a 20 69 74  ile,.      ** it
21a20 20 77 6f 75 6c 64 20 6e 6f 74 20 62 65 20 73 61   would not be sa
21a30 66 65 20 74 6f 20 63 6c 6f 73 65 20 61 73 20 74  fe to close as t
21a40 68 69 73 20 77 6f 75 6c 64 20 72 65 6c 65 61 73  his would releas
21a50 65 20 61 6e 79 20 6c 6f 63 6b 73 20 68 65 6c 64  e any locks held
21a60 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65  .      ** on the
21a70 20 66 69 6c 65 20 62 79 20 74 68 69 73 20 70 72   file by this pr
21a80 6f 63 65 73 73 2e 20 20 2a 2f 0a 20 20 20 20 20  ocess.  */.     
21a90 20 61 73 73 65 72 74 28 20 65 54 79 70 65 21 3d   assert( eType!=
21aa0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
21ab0 5f 44 42 20 29 3b 0a 20 20 20 20 20 20 63 6c 6f  _DB );.      clo
21ac0 73 65 28 66 64 29 3b 20 20 20 20 20 20 20 20 20  se(fd);         
21ad0 20 20 20 20 2f 2a 20 73 69 6c 65 6e 74 6c 79 20      /* silently 
21ae0 6c 65 61 6b 20 69 66 20 66 61 69 6c 2c 20 61 6c  leak if fail, al
21af0 72 65 61 64 79 20 69 6e 20 65 72 72 6f 72 20 2a  ready in error *
21b00 2f 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f 70 65  /.      goto ope
21b10 6e 5f 66 69 6e 69 73 68 65 64 3b 0a 20 20 20 20  n_finished;.    
21b20 7d 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 46 44  }.  }..#ifdef FD
21b30 5f 43 4c 4f 45 58 45 43 0a 20 20 66 63 6e 74 6c  _CLOEXEC.  fcntl
21b40 28 66 64 2c 20 46 5f 53 45 54 46 44 2c 20 66 63  (fd, F_SETFD, fc
21b50 6e 74 6c 28 66 64 2c 20 46 5f 47 45 54 46 44 2c  ntl(fd, F_GETFD,
21b60 20 30 29 20 7c 20 46 44 5f 43 4c 4f 45 58 45 43   0) | FD_CLOEXEC
21b70 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 6e 6f 4c  );.#endif..  noL
21b80 6f 63 6b 20 3d 20 65 54 79 70 65 21 3d 53 51 4c  ock = eType!=SQL
21b90 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
21ba0 3b 0a 0a 20 20 0a 23 69 66 20 64 65 66 69 6e 65  ;..  .#if define
21bb0 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 7c 7c 20  d(__APPLE__) || 
21bc0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
21bd0 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 73 74  CKING_STYLE.  st
21be0 72 75 63 74 20 73 74 61 74 66 73 20 66 73 49 6e  ruct statfs fsIn
21bf0 66 6f 3b 0a 20 20 69 66 28 20 66 73 74 61 74 66  fo;.  if( fstatf
21c00 73 28 66 64 2c 20 26 66 73 49 6e 66 6f 29 20 3d  s(fd, &fsInfo) =
21c10 3d 20 2d 31 20 29 7b 0a 20 20 20 20 28 28 75 6e  = -1 ){.    ((un
21c20 69 78 46 69 6c 65 2a 29 70 46 69 6c 65 29 2d 3e  ixFile*)pFile)->
21c30 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  lastErrno = errn
21c40 6f 3b 0a 20 20 20 20 69 66 28 20 64 69 72 66 64  o;.    if( dirfd
21c50 3e 3d 30 20 29 20 63 6c 6f 73 65 28 64 69 72 66  >=0 ) close(dirf
21c60 64 29 3b 20 2f 2a 20 73 69 6c 65 6e 74 6c 79 20  d); /* silently 
21c70 6c 65 61 6b 20 69 66 20 66 61 69 6c 2c 20 69 6e  leak if fail, in
21c80 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 63 6c   error */.    cl
21c90 6f 73 65 28 66 64 29 3b 20 2f 2a 20 73 69 6c 65  ose(fd); /* sile
21ca0 6e 74 6c 79 20 6c 65 61 6b 20 69 66 20 66 61 69  ntly leak if fai
21cb0 6c 2c 20 69 6e 20 65 72 72 6f 72 20 2a 2f 0a 20  l, in error */. 
21cc0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
21cd0 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 3b 0a 20  _IOERR_ACCESS;. 
21ce0 20 7d 0a 20 20 69 66 20 28 30 20 3d 3d 20 73 74   }.  if (0 == st
21cf0 72 6e 63 6d 70 28 22 6d 73 64 6f 73 22 2c 20 66  rncmp("msdos", f
21d00 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61  sInfo.f_fstypena
21d10 6d 65 2c 20 35 29 29 20 7b 0a 20 20 20 20 28 28  me, 5)) {.    ((
21d20 75 6e 69 78 46 69 6c 65 2a 29 70 46 69 6c 65 29  unixFile*)pFile)
21d30 2d 3e 66 73 46 6c 61 67 73 20 7c 3d 20 53 51 4c  ->fsFlags |= SQL
21d40 49 54 45 5f 46 53 46 4c 41 47 53 5f 49 53 5f 4d  ITE_FSFLAGS_IS_M
21d50 53 44 4f 53 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  SDOS;.  }.#endif
21d60 0a 20 20 0a 23 69 66 20 53 51 4c 49 54 45 5f 45  .  .#if SQLITE_E
21d70 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
21d80 59 4c 45 0a 23 69 66 20 53 51 4c 49 54 45 5f 50  YLE.#if SQLITE_P
21d90 52 45 46 45 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b  REFER_PROXY_LOCK
21da0 49 4e 47 0a 20 20 69 73 41 75 74 6f 50 72 6f 78  ING.  isAutoProx
21db0 79 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 20 20  y = 1;.#endif.  
21dc0 69 66 28 20 69 73 41 75 74 6f 50 72 6f 78 79 20  if( isAutoProxy 
21dd0 26 26 20 28 7a 50 61 74 68 21 3d 4e 55 4c 4c 29  && (zPath!=NULL)
21de0 20 26 26 20 28 21 6e 6f 4c 6f 63 6b 29 20 26 26   && (!noLock) &&
21df0 20 70 56 66 73 2d 3e 78 4f 70 65 6e 20 29 7b 0a   pVfs->xOpen ){.
21e00 20 20 20 20 63 68 61 72 20 2a 65 6e 76 66 6f 72      char *envfor
21e10 63 65 20 3d 20 67 65 74 65 6e 76 28 22 53 51 4c  ce = getenv("SQL
21e20 49 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f  ITE_FORCE_PROXY_
21e30 4c 4f 43 4b 49 4e 47 22 29 3b 0a 20 20 20 20 69  LOCKING");.    i
21e40 6e 74 20 75 73 65 50 72 6f 78 79 20 3d 20 30 3b  nt useProxy = 0;
21e50 0a 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ..    /* SQLITE_
21e60 46 4f 52 43 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b  FORCE_PROXY_LOCK
21e70 49 4e 47 3d 3d 31 20 6d 65 61 6e 73 20 66 6f 72  ING==1 means for
21e80 63 65 20 61 6c 77 61 79 73 20 75 73 65 20 70 72  ce always use pr
21e90 6f 78 79 2c 20 30 20 6d 65 61 6e 73 20 0a 20 20  oxy, 0 means .  
21ea0 20 20 2a 2a 20 6e 65 76 65 72 20 75 73 65 20 70    ** never use p
21eb0 72 6f 78 79 2c 20 4e 55 4c 4c 20 6d 65 61 6e 73  roxy, NULL means
21ec0 20 75 73 65 20 70 72 6f 78 79 20 66 6f 72 20 6e   use proxy for n
21ed0 6f 6e 2d 6c 6f 63 61 6c 20 66 69 6c 65 73 20 6f  on-local files o
21ee0 6e 6c 79 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28  nly.  */.    if(
21ef0 20 65 6e 76 66 6f 72 63 65 21 3d 4e 55 4c 4c 20   envforce!=NULL 
21f00 29 7b 0a 20 20 20 20 20 20 75 73 65 50 72 6f 78  ){.      useProx
21f10 79 20 3d 20 61 74 6f 69 28 65 6e 76 66 6f 72 63  y = atoi(envforc
21f20 65 29 3e 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  e)>0;.    }else{
21f30 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 73 74  .      struct st
21f40 61 74 66 73 20 66 73 49 6e 66 6f 3b 0a 20 20 20  atfs fsInfo;.   
21f50 20 20 20 69 66 28 20 73 74 61 74 66 73 28 7a 50     if( statfs(zP
21f60 61 74 68 2c 20 26 66 73 49 6e 66 6f 29 20 3d 3d  ath, &fsInfo) ==
21f70 20 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 2f   -1 ){.        /
21f80 2a 20 49 6e 20 74 68 65 6f 72 79 2c 20 74 68 65  * In theory, the
21f90 20 63 6c 6f 73 65 28 66 64 29 20 63 61 6c 6c 20   close(fd) call 
21fa0 69 73 20 73 75 62 2d 6f 70 74 69 6d 61 6c 2e 20  is sub-optimal. 
21fb0 49 66 20 74 68 65 20 66 69 6c 65 20 6f 70 65 6e  If the file open
21fc0 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 69  ed.        ** wi
21fd0 74 68 20 66 64 20 69 73 20 61 20 64 61 74 61 62  th fd is a datab
21fe0 61 73 65 20 66 69 6c 65 2c 20 61 6e 64 20 74 68  ase file, and th
21ff0 65 72 65 20 61 72 65 20 6f 74 68 65 72 20 63 6f  ere are other co
22000 6e 6e 65 63 74 69 6f 6e 73 20 6f 70 65 6e 0a 20  nnections open. 
22010 20 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 61         ** on tha
22020 74 20 66 69 6c 65 20 74 68 61 74 20 61 72 65 20  t file that are 
22030 63 75 72 72 65 6e 74 6c 79 20 68 6f 6c 64 69 6e  currently holdin
22040 67 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73  g advisory locks
22050 20 6f 6e 20 69 74 2c 0a 20 20 20 20 20 20 20 20   on it,.        
22060 2a 2a 20 74 68 65 6e 20 74 68 65 20 63 61 6c 6c  ** then the call
22070 20 74 6f 20 63 6c 6f 73 65 28 29 20 77 69 6c 6c   to close() will
22080 20 63 61 6e 63 65 6c 20 74 68 6f 73 65 20 6c 6f   cancel those lo
22090 63 6b 73 2e 20 49 6e 20 70 72 61 63 74 69 63 65  cks. In practice
220a0 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 65 27  ,.        ** we'
220b0 72 65 20 61 73 73 75 6d 69 6e 67 20 74 68 61 74  re assuming that
220c0 20 73 74 61 74 66 73 28 29 20 64 6f 65 73 6e 27   statfs() doesn'
220d0 74 20 66 61 69 6c 20 76 65 72 79 20 6f 66 74 65  t fail very ofte
220e0 6e 2e 20 41 74 20 6c 65 61 73 74 0a 20 20 20 20  n. At least.    
220f0 20 20 20 20 2a 2a 20 6e 6f 74 20 77 68 69 6c 65      ** not while
22100 20 6f 74 68 65 72 20 66 69 6c 65 20 64 65 73 63   other file desc
22110 72 69 70 74 6f 72 73 20 6f 70 65 6e 65 64 20 62  riptors opened b
22120 79 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65  y the same proce
22130 73 73 20 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a  ss on.        **
22140 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20 61   the same file a
22150 72 65 20 77 6f 72 6b 69 6e 67 2e 20 20 2a 2f 0a  re working.  */.
22160 20 20 20 20 20 20 20 20 70 2d 3e 6c 61 73 74 45          p->lastE
22170 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
22180 20 20 20 20 20 20 69 66 28 20 64 69 72 66 64 3e        if( dirfd>
22190 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
221a0 63 6c 6f 73 65 28 64 69 72 66 64 29 3b 20 2f 2a  close(dirfd); /*
221b0 20 73 69 6c 65 6e 74 6c 79 20 6c 65 61 6b 20 69   silently leak i
221c0 66 20 66 61 69 6c 2c 20 69 6e 20 65 72 72 6f 72  f fail, in error
221d0 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   */.        }.  
221e0 20 20 20 20 20 20 63 6c 6f 73 65 28 66 64 29 3b        close(fd);
221f0 20 2f 2a 20 73 69 6c 65 6e 74 6c 79 20 6c 65 61   /* silently lea
22200 6b 20 69 66 20 66 61 69 6c 2c 20 69 6e 20 65 72  k if fail, in er
22210 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  ror */.        r
22220 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
22230 5f 41 43 43 45 53 53 3b 0a 20 20 20 20 20 20 20  _ACCESS;.       
22240 20 67 6f 74 6f 20 6f 70 65 6e 5f 66 69 6e 69 73   goto open_finis
22250 68 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  hed;.      }.   
22260 20 20 20 75 73 65 50 72 6f 78 79 20 3d 20 21 28     useProxy = !(
22270 66 73 49 6e 66 6f 2e 66 5f 66 6c 61 67 73 26 4d  fsInfo.f_flags&M
22280 4e 54 5f 4c 4f 43 41 4c 29 3b 0a 20 20 20 20 7d  NT_LOCAL);.    }
22290 0a 20 20 20 20 69 66 28 20 75 73 65 50 72 6f 78  .    if( useProx
222a0 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  y ){.      rc = 
222b0 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 28 70  fillInUnixFile(p
222c0 56 66 73 2c 20 66 64 2c 20 64 69 72 66 64 2c 20  Vfs, fd, dirfd, 
222d0 70 46 69 6c 65 2c 20 7a 50 61 74 68 2c 20 6e 6f  pFile, zPath, no
222e0 4c 6f 63 6b 2c 20 69 73 44 65 6c 65 74 65 29 3b  Lock, isDelete);
222f0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
22300 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
22310 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79 54 72      rc = proxyTr
22320 61 6e 73 66 6f 72 6d 55 6e 69 78 46 69 6c 65 28  ansformUnixFile(
22330 28 75 6e 69 78 46 69 6c 65 2a 29 70 46 69 6c 65  (unixFile*)pFile
22340 2c 20 22 3a 61 75 74 6f 3a 22 29 3b 0a 20 20 20  , ":auto:");.   
22350 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
22360 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
22370 20 20 20 20 2f 2a 20 55 73 65 20 75 6e 69 78 43      /* Use unixC
22380 6c 6f 73 65 20 74 6f 20 63 6c 65 61 6e 20 75 70  lose to clean up
22390 20 74 68 65 20 72 65 73 6f 75 72 63 65 73 20 61   the resources a
223a0 64 64 65 64 20 69 6e 20 66 69 6c 6c 49 6e 55 6e  dded in fillInUn
223b0 69 78 46 69 6c 65 20 0a 20 20 20 20 20 20 20 20  ixFile .        
223c0 20 20 2a 2a 20 61 6e 64 20 63 6c 65 61 72 20 61    ** and clear a
223d0 6c 6c 20 74 68 65 20 73 74 72 75 63 74 75 72 65  ll the structure
223e0 27 73 20 72 65 66 65 72 65 6e 63 65 73 2e 20 20  's references.  
223f0 53 70 65 63 69 66 69 63 61 6c 6c 79 2c 20 0a 20  Specifically, . 
22400 20 20 20 20 20 20 20 20 20 2a 2a 20 70 46 69 6c           ** pFil
22410 65 2d 3e 70 4d 65 74 68 6f 64 73 20 77 69 6c 6c  e->pMethods will
22420 20 62 65 20 4e 55 4c 4c 20 73 6f 20 73 71 6c 69   be NULL so sqli
22430 74 65 33 4f 73 43 6c 6f 73 65 20 77 69 6c 6c 20  te3OsClose will 
22440 62 65 20 61 20 6e 6f 2d 6f 70 20 0a 20 20 20 20  be a no-op .    
22450 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
22460 20 20 20 75 6e 69 78 43 6c 6f 73 65 28 70 46 69     unixClose(pFi
22470 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  le);.          r
22480 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
22490 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
224a0 20 20 67 6f 74 6f 20 6f 70 65 6e 5f 66 69 6e 69    goto open_fini
224b0 73 68 65 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  shed;.    }.  }.
224c0 23 65 6e 64 69 66 0a 20 20 0a 20 20 72 63 20 3d  #endif.  .  rc =
224d0 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 28   fillInUnixFile(
224e0 70 56 66 73 2c 20 66 64 2c 20 64 69 72 66 64 2c  pVfs, fd, dirfd,
224f0 20 70 46 69 6c 65 2c 20 7a 50 61 74 68 2c 20 6e   pFile, zPath, n
22500 6f 4c 6f 63 6b 2c 20 69 73 44 65 6c 65 74 65 29  oLock, isDelete)
22510 3b 0a 6f 70 65 6e 5f 66 69 6e 69 73 68 65 64 3a  ;.open_finished:
22520 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
22530 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
22540 74 65 33 5f 66 72 65 65 28 70 2d 3e 70 55 6e 75  te3_free(p->pUnu
22550 73 65 64 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  sed);.  }.  retu
22560 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
22570 20 44 65 6c 65 74 65 20 74 68 65 20 66 69 6c 65   Delete the file
22580 20 61 74 20 7a 50 61 74 68 2e 20 49 66 20 74 68   at zPath. If th
22590 65 20 64 69 72 53 79 6e 63 20 61 72 67 75 6d 65  e dirSync argume
225a0 6e 74 20 69 73 20 74 72 75 65 2c 20 66 73 79 6e  nt is true, fsyn
225b0 63 28 29 0a 2a 2a 20 74 68 65 20 64 69 72 65 63  c().** the direc
225c0 74 6f 72 79 20 61 66 74 65 72 20 64 65 6c 65 74  tory after delet
225d0 69 6e 67 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2f  ing the file..*/
225e0 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
225f0 44 65 6c 65 74 65 28 0a 20 20 73 71 6c 69 74 65  Delete(.  sqlite
22600 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20  3_vfs *NotUsed, 
22610 20 20 20 20 2f 2a 20 56 46 53 20 63 6f 6e 74 61      /* VFS conta
22620 69 6e 69 6e 67 20 74 68 69 73 20 61 73 20 74 68  ining this as th
22630 65 20 78 44 65 6c 65 74 65 20 6d 65 74 68 6f 64  e xDelete method
22640 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
22650 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20   *zPath,        
22660 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69 6c 65 20  /* Name of file 
22670 74 6f 20 62 65 20 64 65 6c 65 74 65 64 20 2a 2f  to be deleted */
22680 0a 20 20 69 6e 74 20 64 69 72 53 79 6e 63 20 20  .  int dirSync  
22690 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
226a0 49 66 20 74 72 75 65 2c 20 66 73 79 6e 63 28 29  If true, fsync()
226b0 20 64 69 72 65 63 74 6f 72 79 20 61 66 74 65 72   directory after
226c0 20 64 65 6c 65 74 69 6e 67 20 66 69 6c 65 20 2a   deleting file *
226d0 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
226e0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 55 4e 55  SQLITE_OK;.  UNU
226f0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
22700 74 55 73 65 64 29 3b 0a 20 20 53 69 6d 75 6c 61  tUsed);.  Simula
22710 74 65 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e  teIOError(return
22720 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45   SQLITE_IOERR_DE
22730 4c 45 54 45 29 3b 0a 20 20 75 6e 6c 69 6e 6b 28  LETE);.  unlink(
22740 7a 50 61 74 68 29 3b 0a 23 69 66 6e 64 65 66 20  zPath);.#ifndef 
22750 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 44  SQLITE_DISABLE_D
22760 49 52 53 59 4e 43 0a 20 20 69 66 28 20 64 69 72  IRSYNC.  if( dir
22770 53 79 6e 63 20 29 7b 0a 20 20 20 20 69 6e 74 20  Sync ){.    int 
22780 66 64 3b 0a 20 20 20 20 72 63 20 3d 20 6f 70 65  fd;.    rc = ope
22790 6e 44 69 72 65 63 74 6f 72 79 28 7a 50 61 74 68  nDirectory(zPath
227a0 2c 20 26 66 64 29 3b 0a 20 20 20 20 69 66 28 20  , &fd);.    if( 
227b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
227c0 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
227d0 20 20 20 20 20 20 69 66 28 20 66 73 79 6e 63 28        if( fsync(
227e0 66 64 29 3d 3d 2d 31 20 29 0a 23 65 6c 73 65 0a  fd)==-1 ).#else.
227f0 20 20 20 20 20 20 69 66 28 20 66 73 79 6e 63 28        if( fsync(
22800 66 64 29 20 29 0a 23 65 6e 64 69 66 0a 20 20 20  fd) ).#endif.   
22810 20 20 20 7b 0a 20 20 20 20 20 20 20 20 72 63 20     {.        rc 
22820 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44  = SQLITE_IOERR_D
22830 49 52 5f 46 53 59 4e 43 3b 0a 20 20 20 20 20 20  IR_FSYNC;.      
22840 7d 0a 20 20 20 20 20 20 69 66 28 20 63 6c 6f 73  }.      if( clos
22850 65 28 66 64 29 26 26 21 72 63 20 29 7b 0a 20 20  e(fd)&&!rc ){.  
22860 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
22870 45 5f 49 4f 45 52 52 5f 44 49 52 5f 43 4c 4f 53  E_IOERR_DIR_CLOS
22880 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  E;.      }.    }
22890 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65  .  }.#endif.  re
228a0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
228b0 2a 20 54 65 73 74 20 74 68 65 20 65 78 69 73 74  * Test the exist
228c0 61 6e 63 65 20 6f 66 20 6f 72 20 61 63 63 65 73  ance of or acces
228d0 73 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 6f 66  s permissions of
228e0 20 66 69 6c 65 20 7a 50 61 74 68 2e 20 54 68 65   file zPath. The
228f0 0a 2a 2a 20 74 65 73 74 20 70 65 72 66 6f 72 6d  .** test perform
22900 65 64 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 68  ed depends on th
22910 65 20 76 61 6c 75 65 20 6f 66 20 66 6c 61 67 73  e value of flags
22920 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 51 4c 49  :.**.**     SQLI
22930 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53  TE_ACCESS_EXISTS
22940 3a 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68  : Return 1 if th
22950 65 20 66 69 6c 65 20 65 78 69 73 74 73 0a 2a 2a  e file exists.**
22960 20 20 20 20 20 53 51 4c 49 54 45 5f 41 43 43 45       SQLITE_ACCE
22970 53 53 5f 52 45 41 44 57 52 49 54 45 3a 20 52 65  SS_READWRITE: Re
22980 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 66 69  turn 1 if the fi
22990 6c 65 20 69 73 20 72 65 61 64 20 61 6e 64 20 77  le is read and w
229a0 72 69 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 20  ritable..**     
229b0 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45  SQLITE_ACCESS_RE
229c0 41 44 4f 4e 4c 59 3a 20 52 65 74 75 72 6e 20 31  ADONLY: Return 1
229d0 20 69 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   if the file is 
229e0 72 65 61 64 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  readable..**.** 
229f0 4f 74 68 65 72 77 69 73 65 20 72 65 74 75 72 6e  Otherwise return
22a00 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e   0..*/.static in
22a10 74 20 75 6e 69 78 41 63 63 65 73 73 28 0a 20 20  t unixAccess(.  
22a20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74  sqlite3_vfs *Not
22a30 55 73 65 64 2c 20 20 20 2f 2a 20 54 68 65 20 56  Used,   /* The V
22a40 46 53 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  FS containing th
22a50 69 73 20 78 41 63 63 65 73 73 20 6d 65 74 68 6f  is xAccess metho
22a60 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  d */.  const cha
22a70 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 2f  r *zPath,      /
22a80 2a 20 50 61 74 68 20 6f 66 20 74 68 65 20 66 69  * Path of the fi
22a90 6c 65 20 74 6f 20 65 78 61 6d 69 6e 65 20 2a 2f  le to examine */
22aa0 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20  .  int flags,   
22ab0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68             /* Wh
22ac0 61 74 20 64 6f 20 77 65 20 77 61 6e 74 20 74 6f  at do we want to
22ad0 20 6c 65 61 72 6e 20 61 62 6f 75 74 20 74 68 65   learn about the
22ae0 20 7a 50 61 74 68 20 66 69 6c 65 3f 20 2a 2f 0a   zPath file? */.
22af0 20 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 20 20    int *pResOut  
22b00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
22b10 74 65 20 72 65 73 75 6c 74 20 62 6f 6f 6c 65 61  te result boolea
22b20 6e 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  n here */.){.  i
22b30 6e 74 20 61 6d 6f 64 65 20 3d 20 30 3b 0a 20 20  nt amode = 0;.  
22b40 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
22b50 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 53 69 6d  (NotUsed);.  Sim
22b60 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65  ulateIOError( re
22b70 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
22b80 52 5f 41 43 43 45 53 53 3b 20 29 3b 0a 20 20 73  R_ACCESS; );.  s
22b90 77 69 74 63 68 28 20 66 6c 61 67 73 20 29 7b 0a  witch( flags ){.
22ba0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
22bb0 41 43 43 45 53 53 5f 45 58 49 53 54 53 3a 0a 20  ACCESS_EXISTS:. 
22bc0 20 20 20 20 20 61 6d 6f 64 65 20 3d 20 46 5f 4f       amode = F_O
22bd0 4b 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  K;.      break;.
22be0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
22bf0 41 43 43 45 53 53 5f 52 45 41 44 57 52 49 54 45  ACCESS_READWRITE
22c00 3a 0a 20 20 20 20 20 20 61 6d 6f 64 65 20 3d 20  :.      amode = 
22c10 57 5f 4f 4b 7c 52 5f 4f 4b 3b 0a 20 20 20 20 20  W_OK|R_OK;.     
22c20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
22c30 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52   SQLITE_ACCESS_R
22c40 45 41 44 3a 0a 20 20 20 20 20 20 61 6d 6f 64 65  EAD:.      amode
22c50 20 3d 20 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 62   = R_OK;.      b
22c60 72 65 61 6b 3b 0a 0a 20 20 20 20 64 65 66 61 75  reak;..    defau
22c70 6c 74 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74  lt:.      assert
22c80 28 21 22 49 6e 76 61 6c 69 64 20 66 6c 61 67 73  (!"Invalid flags
22c90 20 61 72 67 75 6d 65 6e 74 22 29 3b 0a 20 20 7d   argument");.  }
22ca0 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 28 61  .  *pResOut = (a
22cb0 63 63 65 73 73 28 7a 50 61 74 68 2c 20 61 6d 6f  ccess(zPath, amo
22cc0 64 65 29 3d 3d 30 29 3b 0a 20 20 72 65 74 75 72  de)==0);.  retur
22cd0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
22ce0 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20 61 20 72 65  ./*.** Turn a re
22cf0 6c 61 74 69 76 65 20 70 61 74 68 6e 61 6d 65 20  lative pathname 
22d00 69 6e 74 6f 20 61 20 66 75 6c 6c 20 70 61 74 68  into a full path
22d10 6e 61 6d 65 2e 20 54 68 65 20 72 65 6c 61 74 69  name. The relati
22d20 76 65 20 70 61 74 68 0a 2a 2a 20 69 73 20 73 74  ve path.** is st
22d30 6f 72 65 64 20 61 73 20 61 20 6e 75 6c 2d 74 65  ored as a nul-te
22d40 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67 20  rminated string 
22d50 69 6e 20 74 68 65 20 62 75 66 66 65 72 20 70 6f  in the buffer po
22d60 69 6e 74 65 64 20 74 6f 20 62 79 0a 2a 2a 20 7a  inted to by.** z
22d70 50 61 74 68 2e 20 0a 2a 2a 0a 2a 2a 20 7a 4f 75  Path. .**.** zOu
22d80 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 62 75  t points to a bu
22d90 66 66 65 72 20 6f 66 20 61 74 20 6c 65 61 73 74  ffer of at least
22da0 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 6d 78 50   sqlite3_vfs.mxP
22db0 61 74 68 6e 61 6d 65 20 62 79 74 65 73 20 0a 2a  athname bytes .*
22dc0 2a 20 28 69 6e 20 74 68 69 73 20 63 61 73 65 2c  * (in this case,
22dd0 20 4d 41 58 5f 50 41 54 48 4e 41 4d 45 20 62 79   MAX_PATHNAME by
22de0 74 65 73 29 2e 20 54 68 65 20 66 75 6c 6c 2d 70  tes). The full-p
22df0 61 74 68 20 69 73 20 77 72 69 74 74 65 6e 20 74  ath is written t
22e00 6f 0a 2a 2a 20 74 68 69 73 20 62 75 66 66 65 72  o.** this buffer
22e10 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
22e20 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
22e30 20 75 6e 69 78 46 75 6c 6c 50 61 74 68 6e 61 6d   unixFullPathnam
22e40 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  e(.  sqlite3_vfs
22e50 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20 20   *pVfs,         
22e60 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
22e70 20 76 66 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20   vfs object */. 
22e80 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
22e90 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  th,            /
22ea0 2a 20 50 6f 73 73 69 62 6c 79 20 72 65 6c 61 74  * Possibly relat
22eb0 69 76 65 20 69 6e 70 75 74 20 70 61 74 68 20 2a  ive input path *
22ec0 2f 0a 20 20 69 6e 74 20 6e 4f 75 74 2c 20 20 20  /.  int nOut,   
22ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ee0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6f 75 74    /* Size of out
22ef0 70 75 74 20 62 75 66 66 65 72 20 69 6e 20 62 79  put buffer in by
22f00 74 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  tes */.  char *z
22f10 4f 75 74 20 20 20 20 20 20 20 20 20 20 20 20 20  Out             
22f20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74         /* Output
22f30 20 62 75 66 66 65 72 20 2a 2f 0a 29 7b 0a 0a 20   buffer */.){.. 
22f40 20 2f 2a 20 49 74 27 73 20 6f 64 64 20 74 6f 20   /* It's odd to 
22f50 73 69 6d 75 6c 61 74 65 20 61 6e 20 69 6f 2d 65  simulate an io-e
22f60 72 72 6f 72 20 68 65 72 65 2c 20 62 75 74 20 72  rror here, but r
22f70 65 61 6c 6c 79 20 74 68 69 73 20 69 73 20 6a 75  eally this is ju
22f80 73 74 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74 68  st.  ** using th
22f90 65 20 69 6f 2d 65 72 72 6f 72 20 69 6e 66 72 61  e io-error infra
22fa0 73 74 72 75 63 74 75 72 65 20 74 6f 20 74 65 73  structure to tes
22fb0 74 20 74 68 61 74 20 53 51 4c 69 74 65 20 68 61  t that SQLite ha
22fc0 6e 64 6c 65 73 20 74 68 69 73 0a 20 20 2a 2a 20  ndles this.  ** 
22fd0 66 75 6e 63 74 69 6f 6e 20 66 61 69 6c 69 6e 67  function failing
22fe0 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
22ff0 63 6f 75 6c 64 20 66 61 69 6c 20 69 66 2c 20 66  could fail if, f
23000 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 0a  or example, the.
23010 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 77 6f 72    ** current wor
23020 6b 69 6e 67 20 64 69 72 65 63 74 6f 72 79 20 68  king directory h
23030 61 73 20 62 65 65 6e 20 75 6e 6c 69 6e 6b 65 64  as been unlinked
23040 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74  ..  */.  Simulat
23050 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
23060 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b   SQLITE_ERROR );
23070 0a 0a 20 20 61 73 73 65 72 74 28 20 70 56 66 73  ..  assert( pVfs
23080 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 3d 3d 4d 41  ->mxPathname==MA
23090 58 5f 50 41 54 48 4e 41 4d 45 20 29 3b 0a 20 20  X_PATHNAME );.  
230a0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
230b0 28 70 56 66 73 29 3b 0a 0a 20 20 7a 4f 75 74 5b  (pVfs);..  zOut[
230c0 6e 4f 75 74 2d 31 5d 20 3d 20 27 5c 30 27 3b 0a  nOut-1] = '\0';.
230d0 20 20 69 66 28 20 7a 50 61 74 68 5b 30 5d 3d 3d    if( zPath[0]==
230e0 27 2f 27 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  '/' ){.    sqlit
230f0 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4f 75 74  e3_snprintf(nOut
23100 2c 20 7a 4f 75 74 2c 20 22 25 73 22 2c 20 7a 50  , zOut, "%s", zP
23110 61 74 68 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ath);.  }else{. 
23120 20 20 20 69 6e 74 20 6e 43 77 64 3b 0a 20 20 20     int nCwd;.   
23130 20 69 66 28 20 67 65 74 63 77 64 28 7a 4f 75 74   if( getcwd(zOut
23140 2c 20 6e 4f 75 74 2d 31 29 3d 3d 30 20 29 7b 0a  , nOut-1)==0 ){.
23150 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
23160 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50  ITE_CANTOPEN_BKP
23170 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43 77  T;.    }.    nCw
23180 64 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28  d = (int)strlen(
23190 7a 4f 75 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  zOut);.    sqlit
231a0 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4f 75 74  e3_snprintf(nOut
231b0 2d 6e 43 77 64 2c 20 26 7a 4f 75 74 5b 6e 43 77  -nCwd, &zOut[nCw
231c0 64 5d 2c 20 22 2f 25 73 22 2c 20 7a 50 61 74 68  d], "/%s", zPath
231d0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
231e0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 23  SQLITE_OK;.}...#
231f0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
23200 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f  IT_LOAD_EXTENSIO
23210 4e 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63  N./*.** Interfac
23220 65 73 20 66 6f 72 20 6f 70 65 6e 69 6e 67 20 61  es for opening a
23230 20 73 68 61 72 65 64 20 6c 69 62 72 61 72 79 2c   shared library,
23240 20 66 69 6e 64 69 6e 67 20 65 6e 74 72 79 20 70   finding entry p
23250 6f 69 6e 74 73 0a 2a 2a 20 77 69 74 68 69 6e 20  oints.** within 
23260 74 68 65 20 73 68 61 72 65 64 20 6c 69 62 72 61  the shared libra
23270 72 79 2c 20 61 6e 64 20 63 6c 6f 73 69 6e 67 20  ry, and closing 
23280 74 68 65 20 73 68 61 72 65 64 20 6c 69 62 72 61  the shared libra
23290 72 79 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20  ry..*/.#include 
232a0 3c 64 6c 66 63 6e 2e 68 3e 0a 73 74 61 74 69 63  <dlfcn.h>.static
232b0 20 76 6f 69 64 20 2a 75 6e 69 78 44 6c 4f 70 65   void *unixDlOpe
232c0 6e 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e  n(sqlite3_vfs *N
232d0 6f 74 55 73 65 64 2c 20 63 6f 6e 73 74 20 63 68  otUsed, const ch
232e0 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a  ar *zFilename){.
232f0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
23300 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72  ER(NotUsed);.  r
23310 65 74 75 72 6e 20 64 6c 6f 70 65 6e 28 7a 46 69  eturn dlopen(zFi
23320 6c 65 6e 61 6d 65 2c 20 52 54 4c 44 5f 4e 4f 57  lename, RTLD_NOW
23330 20 7c 20 52 54 4c 44 5f 47 4c 4f 42 41 4c 29 3b   | RTLD_GLOBAL);
23340 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 51 4c 69 74 65  .}../*.** SQLite
23350 20 63 61 6c 6c 73 20 74 68 69 73 20 66 75 6e 63   calls this func
23360 74 69 6f 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79  tion immediately
23370 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f   after a call to
23380 20 75 6e 69 78 44 6c 53 79 6d 28 29 20 6f 72 0a   unixDlSym() or.
23390 2a 2a 20 75 6e 69 78 44 6c 4f 70 65 6e 28 29 20  ** unixDlOpen() 
233a0 66 61 69 6c 73 20 28 72 65 74 75 72 6e 73 20 61  fails (returns a
233b0 20 6e 75 6c 6c 20 70 6f 69 6e 74 65 72 29 2e 20   null pointer). 
233c0 49 66 20 61 20 6d 6f 72 65 20 64 65 74 61 69 6c  If a more detail
233d0 65 64 20 65 72 72 6f 72 0a 2a 2a 20 6d 65 73 73  ed error.** mess
233e0 61 67 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65  age is available
233f0 2c 20 69 74 20 69 73 20 77 72 69 74 74 65 6e 20  , it is written 
23400 74 6f 20 7a 42 75 66 4f 75 74 2e 20 49 66 20 6e  to zBufOut. If n
23410 6f 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a  o error message.
23420 2a 2a 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c  ** is available,
23430 20 7a 42 75 66 4f 75 74 20 69 73 20 6c 65 66 74   zBufOut is left
23440 20 75 6e 6d 6f 64 69 66 69 65 64 20 61 6e 64 20   unmodified and 
23450 53 51 4c 69 74 65 20 75 73 65 73 20 61 20 64 65  SQLite uses a de
23460 66 61 75 6c 74 0a 2a 2a 20 65 72 72 6f 72 20 6d  fault.** error m
23470 65 73 73 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69  essage..*/.stati
23480 63 20 76 6f 69 64 20 75 6e 69 78 44 6c 45 72 72  c void unixDlErr
23490 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  or(sqlite3_vfs *
234a0 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 6e 42 75  NotUsed, int nBu
234b0 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 4f 75 74  f, char *zBufOut
234c0 29 7b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 3b  ){.  char *zErr;
234d0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
234e0 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
234f0 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
23500 3b 0a 20 20 7a 45 72 72 20 3d 20 64 6c 65 72 72  ;.  zErr = dlerr
23510 6f 72 28 29 3b 0a 20 20 69 66 28 20 7a 45 72 72  or();.  if( zErr
23520 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
23530 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2c 20 7a  snprintf(nBuf, z
23540 42 75 66 4f 75 74 2c 20 22 25 73 22 2c 20 7a 45  BufOut, "%s", zE
23550 72 72 29 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 4c  rr);.  }.  unixL
23560 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 7d 0a 73  eaveMutex();.}.s
23570 74 61 74 69 63 20 76 6f 69 64 20 28 2a 75 6e 69  tatic void (*uni
23580 78 44 6c 53 79 6d 28 73 71 6c 69 74 65 33 5f 76  xDlSym(sqlite3_v
23590 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 76 6f 69  fs *NotUsed, voi
235a0 64 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  d *p, const char
235b0 2a 7a 53 79 6d 29 29 28 76 6f 69 64 29 7b 0a 20  *zSym))(void){. 
235c0 20 2f 2a 20 0a 20 20 2a 2a 20 47 43 43 20 77 69   /* .  ** GCC wi
235d0 74 68 20 2d 70 65 64 61 6e 74 69 63 2d 65 72 72  th -pedantic-err
235e0 6f 72 73 20 73 61 79 73 20 74 68 61 74 20 43 39  ors says that C9
235f0 30 20 64 6f 65 73 20 6e 6f 74 20 61 6c 6c 6f 77  0 does not allow
23600 20 61 20 76 6f 69 64 2a 20 74 6f 20 62 65 0a 20   a void* to be. 
23610 20 2a 2a 20 63 61 73 74 20 69 6e 74 6f 20 61 20   ** cast into a 
23620 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e  pointer to a fun
23630 63 74 69 6f 6e 2e 20 20 41 6e 64 20 79 65 74 20  ction.  And yet 
23640 74 68 65 20 6c 69 62 72 61 72 79 20 64 6c 73 79  the library dlsy
23650 6d 28 29 20 72 6f 75 74 69 6e 65 0a 20 20 2a 2a  m() routine.  **
23660 20 72 65 74 75 72 6e 73 20 61 20 76 6f 69 64 2a   returns a void*
23670 20 77 68 69 63 68 20 69 73 20 72 65 61 6c 6c 79   which is really
23680 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
23690 66 75 6e 63 74 69 6f 6e 2e 20 20 53 6f 20 68 6f  function.  So ho
236a0 77 20 64 6f 20 77 65 0a 20 20 2a 2a 20 75 73 65  w do we.  ** use
236b0 20 64 6c 73 79 6d 28 29 20 77 69 74 68 20 2d 70   dlsym() with -p
236c0 65 64 61 6e 74 69 63 2d 65 72 72 6f 72 73 3f 0a  edantic-errors?.
236d0 20 20 2a 2a 0a 20 20 2a 2a 20 56 61 72 69 61 62    **.  ** Variab
236e0 6c 65 20 78 20 62 65 6c 6f 77 20 69 73 20 64 65  le x below is de
236f0 66 69 6e 65 64 20 74 6f 20 62 65 20 61 20 70 6f  fined to be a po
23700 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74  inter to a funct
23710 69 6f 6e 20 74 61 6b 69 6e 67 0a 20 20 2a 2a 20  ion taking.  ** 
23720 70 61 72 61 6d 65 74 65 72 73 20 76 6f 69 64 2a  parameters void*
23730 20 61 6e 64 20 63 6f 6e 73 74 20 63 68 61 72 2a   and const char*
23740 20 61 6e 64 20 72 65 74 75 72 6e 69 6e 67 20 61   and returning a
23750 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 75   pointer to a fu
23760 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 57 65 20  nction..  ** We 
23770 69 6e 69 74 69 61 6c 69 7a 65 20 78 20 62 79 20  initialize x by 
23780 61 73 73 69 67 6e 69 6e 67 20 69 74 20 61 20 70  assigning it a p
23790 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 64 6c  ointer to the dl
237a0 73 79 6d 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a  sym() function..
237b0 20 20 2a 2a 20 28 54 68 61 74 20 61 73 73 69 67    ** (That assig
237c0 6e 6d 65 6e 74 20 72 65 71 75 69 72 65 73 20 61  nment requires a
237d0 20 63 61 73 74 2e 29 20 20 54 68 65 6e 20 77 65   cast.)  Then we
237e0 20 63 61 6c 6c 20 74 68 65 20 66 75 6e 63 74 69   call the functi
237f0 6f 6e 20 74 68 61 74 0a 20 20 2a 2a 20 78 20 70  on that.  ** x p
23800 6f 69 6e 74 73 20 74 6f 2e 20 20 0a 20 20 2a 2a  oints to.  .  **
23810 0a 20 20 2a 2a 20 54 68 69 73 20 77 6f 72 6b 2d  .  ** This work-
23820 61 72 6f 75 6e 64 20 69 73 20 75 6e 6c 69 6b 65  around is unlike
23830 6c 79 20 74 6f 20 77 6f 72 6b 20 63 6f 72 72 65  ly to work corre
23840 63 74 6c 79 20 6f 6e 20 61 6e 79 20 73 79 73 74  ctly on any syst
23850 65 6d 20 77 68 65 72 65 0a 20 20 2a 2a 20 79 6f  em where.  ** yo
23860 75 20 72 65 61 6c 6c 79 20 63 61 6e 6e 6f 74 20  u really cannot 
23870 63 61 73 74 20 61 20 66 75 6e 63 74 69 6f 6e 20  cast a function 
23880 70 6f 69 6e 74 65 72 20 69 6e 74 6f 20 76 6f 69  pointer into voi
23890 64 2a 2e 20 20 42 75 74 20 74 68 65 6e 2c 20 6f  d*.  But then, o
238a0 6e 20 74 68 65 0a 20 20 2a 2a 20 6f 74 68 65 72  n the.  ** other
238b0 20 68 61 6e 64 2c 20 64 6c 73 79 6d 28 29 20 77   hand, dlsym() w
238c0 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20  ill not work on 
238d0 73 75 63 68 20 61 20 73 79 73 74 65 6d 20 65 69  such a system ei
238e0 74 68 65 72 2c 20 73 6f 20 77 65 20 68 61 76 65  ther, so we have
238f0 0a 20 20 2a 2a 20 6e 6f 74 20 72 65 61 6c 6c 79  .  ** not really
23900 20 6c 6f 73 74 20 61 6e 79 74 68 69 6e 67 2e 0a   lost anything..
23910 20 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 28 2a    */.  void (*(*
23920 78 29 28 76 6f 69 64 2a 2c 63 6f 6e 73 74 20 63  x)(void*,const c
23930 68 61 72 2a 29 29 28 76 6f 69 64 29 3b 0a 20 20  har*))(void);.  
23940 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
23950 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 78 20 3d  (NotUsed);.  x =
23960 20 28 76 6f 69 64 28 2a 28 2a 29 28 76 6f 69 64   (void(*(*)(void
23970 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 29 28  *,const char*))(
23980 76 6f 69 64 29 29 64 6c 73 79 6d 3b 0a 20 20 72  void))dlsym;.  r
23990 65 74 75 72 6e 20 28 2a 78 29 28 70 2c 20 7a 53  eturn (*x)(p, zS
239a0 79 6d 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  ym);.}.static vo
239b0 69 64 20 75 6e 69 78 44 6c 43 6c 6f 73 65 28 73  id unixDlClose(s
239c0 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55  qlite3_vfs *NotU
239d0 73 65 64 2c 20 76 6f 69 64 20 2a 70 48 61 6e 64  sed, void *pHand
239e0 6c 65 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  le){.  UNUSED_PA
239f0 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
23a00 3b 0a 20 20 64 6c 63 6c 6f 73 65 28 70 48 61 6e  ;.  dlclose(pHan
23a10 64 6c 65 29 3b 0a 7d 0a 23 65 6c 73 65 20 2f 2a  dle);.}.#else /*
23a20 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   if SQLITE_OMIT_
23a30 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 20 69  LOAD_EXTENSION i
23a40 73 20 64 65 66 69 6e 65 64 3a 20 2a 2f 0a 20 20  s defined: */.  
23a50 23 64 65 66 69 6e 65 20 75 6e 69 78 44 6c 4f 70  #define unixDlOp
23a60 65 6e 20 20 30 0a 20 20 23 64 65 66 69 6e 65 20  en  0.  #define 
23a70 75 6e 69 78 44 6c 45 72 72 6f 72 20 30 0a 20 20  unixDlError 0.  
23a80 23 64 65 66 69 6e 65 20 75 6e 69 78 44 6c 53 79  #define unixDlSy
23a90 6d 20 20 20 30 0a 20 20 23 64 65 66 69 6e 65 20  m   0.  #define 
23aa0 75 6e 69 78 44 6c 43 6c 6f 73 65 20 30 0a 23 65  unixDlClose 0.#e
23ab0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  ndif../*.** Writ
23ac0 65 20 6e 42 75 66 20 62 79 74 65 73 20 6f 66 20  e nBuf bytes of 
23ad0 72 61 6e 64 6f 6d 20 64 61 74 61 20 74 6f 20 74  random data to t
23ae0 68 65 20 73 75 70 70 6c 69 65 64 20 62 75 66 66  he supplied buff
23af0 65 72 20 7a 42 75 66 2e 0a 2a 2f 0a 73 74 61 74  er zBuf..*/.stat
23b00 69 63 20 69 6e 74 20 75 6e 69 78 52 61 6e 64 6f  ic int unixRando
23b10 6d 6e 65 73 73 28 73 71 6c 69 74 65 33 5f 76 66  mness(sqlite3_vf
23b20 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20  s *NotUsed, int 
23b30 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66  nBuf, char *zBuf
23b40 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
23b50 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
23b60 20 20 61 73 73 65 72 74 28 28 73 69 7a 65 5f 74    assert((size_t
23b70 29 6e 42 75 66 3e 3d 28 73 69 7a 65 6f 66 28 74  )nBuf>=(sizeof(t
23b80 69 6d 65 5f 74 29 2b 73 69 7a 65 6f 66 28 69 6e  ime_t)+sizeof(in
23b90 74 29 29 29 3b 0a 0a 20 20 2f 2a 20 57 65 20 68  t)));..  /* We h
23ba0 61 76 65 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a  ave to initializ
23bb0 65 20 7a 42 75 66 20 74 6f 20 70 72 65 76 65 6e  e zBuf to preven
23bc0 74 20 76 61 6c 67 72 69 6e 64 20 66 72 6f 6d 20  t valgrind from 
23bd0 72 65 70 6f 72 74 69 6e 67 0a 20 20 2a 2a 20 65  reporting.  ** e
23be0 72 72 6f 72 73 2e 20 20 54 68 65 20 72 65 70 6f  rrors.  The repo
23bf0 72 74 73 20 69 73 73 75 65 64 20 62 79 20 76 61  rts issued by va
23c00 6c 67 72 69 6e 64 20 61 72 65 20 69 6e 63 6f 72  lgrind are incor
23c10 72 65 63 74 20 2d 20 77 65 20 77 6f 75 6c 64 0a  rect - we would.
23c20 20 20 2a 2a 20 70 72 65 66 65 72 20 74 68 61 74    ** prefer that
23c30 20 74 68 65 20 72 61 6e 64 6f 6d 6e 65 73 73 20   the randomness 
23c40 62 65 20 69 6e 63 72 65 61 73 65 64 20 62 79 20  be increased by 
23c50 6d 61 6b 69 6e 67 20 75 73 65 20 6f 66 20 74 68  making use of th
23c60 65 0a 20 20 2a 2a 20 75 6e 69 6e 69 74 69 61 6c  e.  ** uninitial
23c70 69 7a 65 64 20 73 70 61 63 65 20 69 6e 20 7a 42  ized space in zB
23c80 75 66 20 2d 20 62 75 74 20 76 61 6c 67 72 69 6e  uf - but valgrin
23c90 64 20 65 72 72 6f 72 73 20 74 65 6e 64 20 74 6f  d errors tend to
23ca0 20 77 6f 72 72 79 0a 20 20 2a 2a 20 73 6f 6d 65   worry.  ** some
23cb0 20 75 73 65 72 73 2e 20 20 52 61 74 68 65 72 20   users.  Rather 
23cc0 74 68 61 6e 20 61 72 67 75 65 2c 20 69 74 20 73  than argue, it s
23cd0 65 65 6d 73 20 65 61 73 69 65 72 20 6a 75 73 74  eems easier just
23ce0 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 0a 20   to initialize. 
23cf0 20 2a 2a 20 74 68 65 20 77 68 6f 6c 65 20 61 72   ** the whole ar
23d00 72 61 79 20 61 6e 64 20 73 69 6c 65 6e 63 65 20  ray and silence 
23d10 76 61 6c 67 72 69 6e 64 2c 20 65 76 65 6e 20 69  valgrind, even i
23d20 66 20 74 68 61 74 20 6d 65 61 6e 73 20 6c 65 73  f that means les
23d30 73 20 72 61 6e 64 6f 6d 6e 65 73 73 0a 20 20 2a  s randomness.  *
23d40 2a 20 69 6e 20 74 68 65 20 72 61 6e 64 6f 6d 20  * in the random 
23d50 73 65 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  seed..  **.  ** 
23d60 57 68 65 6e 20 74 65 73 74 69 6e 67 2c 20 69 6e  When testing, in
23d70 69 74 69 61 6c 69 7a 69 6e 67 20 7a 42 75 66 5b  itializing zBuf[
23d80 5d 20 74 6f 20 7a 65 72 6f 20 69 73 20 61 6c 6c  ] to zero is all
23d90 20 77 65 20 64 6f 2e 20 20 54 68 61 74 20 6d 65   we do.  That me
23da0 61 6e 73 0a 20 20 2a 2a 20 74 68 61 74 20 77 65  ans.  ** that we
23db0 20 61 6c 77 61 79 73 20 75 73 65 20 74 68 65 20   always use the 
23dc0 73 61 6d 65 20 72 61 6e 64 6f 6d 20 6e 75 6d 62  same random numb
23dd0 65 72 20 73 65 71 75 65 6e 63 65 2e 20 20 54 68  er sequence.  Th
23de0 69 73 20 6d 61 6b 65 73 20 74 68 65 0a 20 20 2a  is makes the.  *
23df0 2a 20 74 65 73 74 73 20 72 65 70 65 61 74 61 62  * tests repeatab
23e00 6c 65 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65  le..  */.  memse
23e10 74 28 7a 42 75 66 2c 20 30 2c 20 6e 42 75 66 29  t(zBuf, 0, nBuf)
23e20 3b 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ;.#if !defined(S
23e30 51 4c 49 54 45 5f 54 45 53 54 29 0a 20 20 7b 0a  QLITE_TEST).  {.
23e40 20 20 20 20 69 6e 74 20 70 69 64 2c 20 66 64 3b      int pid, fd;
23e50 0a 20 20 20 20 66 64 20 3d 20 6f 70 65 6e 28 22  .    fd = open("
23e60 2f 64 65 76 2f 75 72 61 6e 64 6f 6d 22 2c 20 4f  /dev/urandom", O
23e70 5f 52 44 4f 4e 4c 59 29 3b 0a 20 20 20 20 69 66  _RDONLY);.    if
23e80 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 20 20  ( fd<0 ){.      
23e90 74 69 6d 65 5f 74 20 74 3b 0a 20 20 20 20 20 20  time_t t;.      
23ea0 74 69 6d 65 28 26 74 29 3b 0a 20 20 20 20 20 20  time(&t);.      
23eb0 6d 65 6d 63 70 79 28 7a 42 75 66 2c 20 26 74 2c  memcpy(zBuf, &t,
23ec0 20 73 69 7a 65 6f 66 28 74 29 29 3b 0a 20 20 20   sizeof(t));.   
23ed0 20 20 20 70 69 64 20 3d 20 67 65 74 70 69 64 28     pid = getpid(
23ee0 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  );.      memcpy(
23ef0 26 7a 42 75 66 5b 73 69 7a 65 6f 66 28 74 29 5d  &zBuf[sizeof(t)]
23f00 2c 20 26 70 69 64 2c 20 73 69 7a 65 6f 66 28 70  , &pid, sizeof(p
23f10 69 64 29 29 3b 0a 20 20 20 20 20 20 61 73 73 65  id));.      asse
23f20 72 74 28 20 73 69 7a 65 6f 66 28 74 29 2b 73 69  rt( sizeof(t)+si
23f30 7a 65 6f 66 28 70 69 64 29 3c 3d 28 73 69 7a 65  zeof(pid)<=(size
23f40 5f 74 29 6e 42 75 66 20 29 3b 0a 20 20 20 20 20  _t)nBuf );.     
23f50 20 6e 42 75 66 20 3d 20 73 69 7a 65 6f 66 28 74   nBuf = sizeof(t
23f60 29 20 2b 20 73 69 7a 65 6f 66 28 70 69 64 29 3b  ) + sizeof(pid);
23f70 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
23f80 20 20 6e 42 75 66 20 3d 20 72 65 61 64 28 66 64    nBuf = read(fd
23f90 2c 20 7a 42 75 66 2c 20 6e 42 75 66 29 3b 0a 20  , zBuf, nBuf);. 
23fa0 20 20 20 20 20 63 6c 6f 73 65 28 66 64 29 3b 0a       close(fd);.
23fb0 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
23fc0 0a 20 20 72 65 74 75 72 6e 20 6e 42 75 66 3b 0a  .  return nBuf;.
23fd0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20  }.../*.** Sleep 
23fe0 66 6f 72 20 61 20 6c 69 74 74 6c 65 20 77 68 69  for a little whi
23ff0 6c 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  le.  Return the 
24000 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65 20 73  amount of time s
24010 6c 65 70 74 2e 0a 2a 2a 20 54 68 65 20 61 72 67  lept..** The arg
24020 75 6d 65 6e 74 20 69 73 20 74 68 65 20 6e 75 6d  ument is the num
24030 62 65 72 20 6f 66 20 6d 69 63 72 6f 73 65 63 6f  ber of microseco
24040 6e 64 73 20 77 65 20 77 61 6e 74 20 74 6f 20 73  nds we want to s
24050 6c 65 65 70 2e 0a 2a 2a 20 54 68 65 20 72 65 74  leep..** The ret
24060 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74 68 65  urn value is the
24070 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 63 72 6f   number of micro
24080 73 65 63 6f 6e 64 73 20 6f 66 20 73 6c 65 65 70  seconds of sleep
24090 20 61 63 74 75 61 6c 6c 79 0a 2a 2a 20 72 65 71   actually.** req
240a0 75 65 73 74 65 64 20 66 72 6f 6d 20 74 68 65 20  uested from the 
240b0 75 6e 64 65 72 6c 79 69 6e 67 20 6f 70 65 72 61  underlying opera
240c0 74 69 6e 67 20 73 79 73 74 65 6d 2c 20 61 20 6e  ting system, a n
240d0 75 6d 62 65 72 20 77 68 69 63 68 0a 2a 2a 20 6d  umber which.** m
240e0 69 67 68 74 20 62 65 20 67 72 65 61 74 65 72 20  ight be greater 
240f0 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
24100 20 74 68 65 20 61 72 67 75 6d 65 6e 74 2c 20 62   the argument, b
24110 75 74 20 6e 6f 74 20 6c 65 73 73 0a 2a 2a 20 74  ut not less.** t
24120 68 61 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74  han the argument
24130 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
24140 75 6e 69 78 53 6c 65 65 70 28 73 71 6c 69 74 65  unixSleep(sqlite
24150 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20  3_vfs *NotUsed, 
24160 69 6e 74 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73  int microseconds
24170 29 7b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b  ){.#if OS_VXWORK
24180 53 0a 20 20 73 74 72 75 63 74 20 74 69 6d 65 73  S.  struct times
24190 70 65 63 20 73 70 3b 0a 0a 20 20 73 70 2e 74 76  pec sp;..  sp.tv
241a0 5f 73 65 63 20 3d 20 6d 69 63 72 6f 73 65 63 6f  _sec = microseco
241b0 6e 64 73 20 2f 20 31 30 30 30 30 30 30 3b 0a 20  nds / 1000000;. 
241c0 20 73 70 2e 74 76 5f 6e 73 65 63 20 3d 20 28 6d   sp.tv_nsec = (m
241d0 69 63 72 6f 73 65 63 6f 6e 64 73 20 25 20 31 30  icroseconds % 10
241e0 30 30 30 30 30 29 20 2a 20 31 30 30 30 3b 0a 20  00000) * 1000;. 
241f0 20 6e 61 6e 6f 73 6c 65 65 70 28 26 73 70 2c 20   nanosleep(&sp, 
24200 4e 55 4c 4c 29 3b 0a 20 20 55 4e 55 53 45 44 5f  NULL);.  UNUSED_
24210 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
24220 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 6d 69 63  d);.  return mic
24230 72 6f 73 65 63 6f 6e 64 73 3b 0a 23 65 6c 69 66  roseconds;.#elif
24240 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f 55 53   defined(HAVE_US
24250 4c 45 45 50 29 20 26 26 20 48 41 56 45 5f 55 53  LEEP) && HAVE_US
24260 4c 45 45 50 0a 20 20 75 73 6c 65 65 70 28 6d 69  LEEP.  usleep(mi
24270 63 72 6f 73 65 63 6f 6e 64 73 29 3b 0a 20 20 55  croseconds);.  U
24280 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
24290 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75  NotUsed);.  retu
242a0 72 6e 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 3b  rn microseconds;
242b0 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 73 65 63  .#else.  int sec
242c0 6f 6e 64 73 20 3d 20 28 6d 69 63 72 6f 73 65 63  onds = (microsec
242d0 6f 6e 64 73 2b 39 39 39 39 39 39 29 2f 31 30 30  onds+999999)/100
242e0 30 30 30 30 3b 0a 20 20 73 6c 65 65 70 28 73 65  0000;.  sleep(se
242f0 63 6f 6e 64 73 29 3b 0a 20 20 55 4e 55 53 45 44  conds);.  UNUSED
24300 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
24310 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 65  ed);.  return se
24320 63 6f 6e 64 73 2a 31 30 30 30 30 30 30 3b 0a 23  conds*1000000;.#
24330 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  endif.}../*.** T
24340 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72  he following var
24350 69 61 62 6c 65 2c 20 69 66 20 73 65 74 20 74 6f  iable, if set to
24360 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75   a non-zero valu
24370 65 2c 20 69 73 20 69 6e 74 65 72 70 72 65 74 65  e, is interprete
24380 64 20 61 73 0a 2a 2a 20 74 68 65 20 6e 75 6d 62  d as.** the numb
24390 65 72 20 6f 66 20 73 65 63 6f 6e 64 73 20 73 69  er of seconds si
243a0 6e 63 65 20 31 39 37 30 20 61 6e 64 20 69 73 20  nce 1970 and is 
243b0 75 73 65 64 20 74 6f 20 73 65 74 20 74 68 65 20  used to set the 
243c0 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20 73 71 6c  result of.** sql
243d0 69 74 65 33 4f 73 43 75 72 72 65 6e 74 54 69 6d  ite3OsCurrentTim
243e0 65 28 29 20 64 75 72 69 6e 67 20 74 65 73 74 69  e() during testi
243f0 6e 67 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  ng..*/.#ifdef SQ
24400 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71  LITE_TEST.int sq
24410 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69  lite3_current_ti
24420 6d 65 20 3d 20 30 3b 20 20 2f 2a 20 46 61 6b 65  me = 0;  /* Fake
24430 20 73 79 73 74 65 6d 20 74 69 6d 65 20 69 6e 20   system time in 
24440 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 31 39  seconds since 19
24450 37 30 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f  70. */.#endif../
24460 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 63 75  *.** Find the cu
24470 72 72 65 6e 74 20 74 69 6d 65 20 28 69 6e 20 55  rrent time (in U
24480 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e  niversal Coordin
24490 61 74 65 64 20 54 69 6d 65 29 2e 20 20 57 72 69  ated Time).  Wri
244a0 74 65 20 69 6e 74 6f 20 2a 70 69 4e 6f 77 0a 2a  te into *piNow.*
244b0 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 69  * the current ti
244c0 6d 65 20 61 6e 64 20 64 61 74 65 20 61 73 20 61  me and date as a
244d0 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62   Julian Day numb
244e0 65 72 20 74 69 6d 65 73 20 38 36 5f 34 30 30 5f  er times 86_400_
244f0 30 30 30 2e 20 20 49 6e 0a 2a 2a 20 6f 74 68 65  000.  In.** othe
24500 72 20 77 6f 72 64 73 2c 20 77 72 69 74 65 20 69  r words, write i
24510 6e 74 6f 20 2a 70 69 4e 6f 77 20 74 68 65 20 6e  nto *piNow the n
24520 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65  umber of millise
24530 63 6f 6e 64 73 20 73 69 6e 63 65 20 74 68 65 20  conds since the 
24540 4a 75 6c 69 61 6e 0a 2a 2a 20 65 70 6f 63 68 20  Julian.** epoch 
24550 6f 66 20 6e 6f 6f 6e 20 69 6e 20 47 72 65 65 6e  of noon in Green
24560 77 69 63 68 20 6f 6e 20 4e 6f 76 65 6d 62 65 72  wich on November
24570 20 32 34 2c 20 34 37 31 34 20 42 2e 43 20 61 63   24, 4714 B.C ac
24580 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 0a 2a  cording to the.*
24590 2a 20 70 72 6f 6c 65 70 74 69 63 20 47 72 65 67  * proleptic Greg
245a0 6f 72 69 61 6e 20 63 61 6c 65 6e 64 61 72 2e 0a  orian calendar..
245b0 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73  **.** On success
245c0 2c 20 72 65 74 75 72 6e 20 30 2e 20 20 52 65 74  , return 0.  Ret
245d0 75 72 6e 20 31 20 69 66 20 74 68 65 20 74 69 6d  urn 1 if the tim
245e0 65 20 61 6e 64 20 64 61 74 65 20 63 61 6e 6e 6f  e and date canno
245f0 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73  t be found..*/.s
24600 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 43 75  tatic int unixCu
24610 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 28 73  rrentTimeInt64(s
24620 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55  qlite3_vfs *NotU
24630 73 65 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74  sed, sqlite3_int
24640 36 34 20 2a 70 69 4e 6f 77 29 7b 0a 20 20 73 74  64 *piNow){.  st
24650 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74  atic const sqlit
24660 65 33 5f 69 6e 74 36 34 20 75 6e 69 78 45 70 6f  e3_int64 unixEpo
24670 63 68 20 3d 20 32 34 34 30 35 38 37 35 2a 28 73  ch = 24405875*(s
24680 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 38 36 34  qlite3_int64)864
24690 30 30 30 30 3b 0a 23 69 66 20 64 65 66 69 6e 65  0000;.#if define
246a0 64 28 4e 4f 5f 47 45 54 54 4f 44 29 0a 20 20 74  d(NO_GETTOD).  t
246b0 69 6d 65 5f 74 20 74 3b 0a 20 20 74 69 6d 65 28  ime_t t;.  time(
246c0 26 74 29 3b 0a 20 20 2a 70 69 4e 6f 77 20 3d 20  &t);.  *piNow = 
246d0 28 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29  ((sqlite3_int64)
246e0 69 29 2a 31 30 30 30 20 2b 20 75 6e 69 78 45 70  i)*1000 + unixEp
246f0 6f 63 68 3b 0a 23 65 6c 69 66 20 4f 53 5f 56 58  och;.#elif OS_VX
24700 57 4f 52 4b 53 0a 20 20 73 74 72 75 63 74 20 74  WORKS.  struct t
24710 69 6d 65 73 70 65 63 20 73 4e 6f 77 3b 0a 20 20  imespec sNow;.  
24720 63 6c 6f 63 6b 5f 67 65 74 74 69 6d 65 28 43 4c  clock_gettime(CL
24730 4f 43 4b 5f 52 45 41 4c 54 49 4d 45 2c 20 26 73  OCK_REALTIME, &s
24740 4e 6f 77 29 3b 0a 20 20 2a 70 69 4e 6f 77 20 3d  Now);.  *piNow =
24750 20 75 6e 69 78 45 70 6f 63 68 20 2b 20 31 30 30   unixEpoch + 100
24760 30 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  0*(sqlite3_int64
24770 29 73 4e 6f 77 2e 74 76 5f 73 65 63 20 2b 20 73  )sNow.tv_sec + s
24780 4e 6f 77 2e 74 76 5f 6e 73 65 63 2f 31 30 30 30  Now.tv_nsec/1000
24790 30 30 30 3b 0a 23 65 6c 73 65 0a 20 20 73 74 72  000;.#else.  str
247a0 75 63 74 20 74 69 6d 65 76 61 6c 20 73 4e 6f 77  uct timeval sNow
247b0 3b 0a 20 20 67 65 74 74 69 6d 65 6f 66 64 61 79  ;.  gettimeofday
247c0 28 26 73 4e 6f 77 2c 20 30 29 3b 0a 20 20 2a 70  (&sNow, 0);.  *p
247d0 69 4e 6f 77 20 3d 20 75 6e 69 78 45 70 6f 63 68  iNow = unixEpoch
247e0 20 2b 20 31 30 30 30 2a 28 73 71 6c 69 74 65 33   + 1000*(sqlite3
247f0 5f 69 6e 74 36 34 29 73 4e 6f 77 2e 74 76 5f 73  _int64)sNow.tv_s
24800 65 63 20 2b 20 73 4e 6f 77 2e 74 76 5f 75 73 65  ec + sNow.tv_use
24810 63 2f 31 30 30 30 3b 0a 23 65 6e 64 69 66 0a 0a  c/1000;.#endif..
24820 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
24830 53 54 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ST.  if( sqlite3
24840 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 29 7b  _current_time ){
24850 0a 20 20 20 20 2a 70 69 4e 6f 77 20 3d 20 31 30  .    *piNow = 10
24860 30 30 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36  00*(sqlite3_int6
24870 34 29 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e  4)sqlite3_curren
24880 74 5f 74 69 6d 65 20 2b 20 75 6e 69 78 45 70 6f  t_time + unixEpo
24890 63 68 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ch;.  }.#endif. 
248a0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
248b0 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65  R(NotUsed);.  re
248c0 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
248d0 20 46 69 6e 64 20 74 68 65 20 63 75 72 72 65 6e   Find the curren
248e0 74 20 74 69 6d 65 20 28 69 6e 20 55 6e 69 76 65  t time (in Unive
248f0 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65 64  rsal Coordinated
24900 20 54 69 6d 65 29 2e 20 20 57 72 69 74 65 20 74   Time).  Write t
24910 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 74 69  he.** current ti
24920 6d 65 20 61 6e 64 20 64 61 74 65 20 61 73 20 61  me and date as a
24930 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62   Julian Day numb
24940 65 72 20 69 6e 74 6f 20 2a 70 72 4e 6f 77 20 61  er into *prNow a
24950 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20 30 2e 20  nd.** return 0. 
24960 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65   Return 1 if the
24970 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 63   time and date c
24980 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a  annot be found..
24990 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
249a0 69 78 43 75 72 72 65 6e 74 54 69 6d 65 28 73 71  ixCurrentTime(sq
249b0 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73  lite3_vfs *NotUs
249c0 65 64 2c 20 64 6f 75 62 6c 65 20 2a 70 72 4e 6f  ed, double *prNo
249d0 77 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  w){.  sqlite3_in
249e0 74 36 34 20 69 3b 0a 20 20 75 6e 69 78 43 75 72  t64 i;.  unixCur
249f0 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 28 30 2c  rentTimeInt64(0,
24a00 20 26 69 29 3b 0a 20 20 2a 70 72 4e 6f 77 20 3d   &i);.  *prNow =
24a10 20 69 2f 38 36 34 30 30 30 30 30 2e 30 3b 0a 20   i/86400000.0;. 
24a20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
24a30 0a 2a 2a 20 57 65 20 61 64 64 65 64 20 74 68 65  .** We added the
24a40 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29   xGetLastError()
24a50 20 6d 65 74 68 6f 64 20 77 69 74 68 20 74 68 65   method with the
24a60 20 69 6e 74 65 6e 74 69 6f 6e 20 6f 66 20 70 72   intention of pr
24a70 6f 76 69 64 69 6e 67 0a 2a 2a 20 62 65 74 74 65  oviding.** bette
24a80 72 20 6c 6f 77 2d 6c 65 76 65 6c 20 65 72 72 6f  r low-level erro
24a90 72 20 6d 65 73 73 61 67 65 73 20 77 68 65 6e 20  r messages when 
24aa0 6f 70 65 72 61 74 69 6e 67 2d 73 79 73 74 65 6d  operating-system
24ab0 20 70 72 6f 62 6c 65 6d 73 20 63 6f 6d 65 20 75   problems come u
24ac0 70 0a 2a 2a 20 64 75 72 69 6e 67 20 53 51 4c 69  p.** during SQLi
24ad0 74 65 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 42  te operation.  B
24ae0 75 74 20 73 6f 20 66 61 72 2c 20 6e 6f 6e 65 20  ut so far, none 
24af0 6f 66 20 74 68 61 74 20 68 61 73 20 62 65 65 6e  of that has been
24b00 20 69 6d 70 6c 65 6d 65 6e 74 65 64 0a 2a 2a 20   implemented.** 
24b10 69 6e 20 74 68 65 20 63 6f 72 65 2e 20 20 53 6f  in the core.  So
24b20 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
24b30 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 2e 20 20   never called.  
24b40 46 6f 72 20 6e 6f 77 2c 20 69 74 20 69 73 20 6d  For now, it is m
24b50 65 72 65 6c 79 0a 2a 2a 20 61 20 70 6c 61 63 65  erely.** a place
24b60 2d 68 6f 6c 64 65 72 2e 0a 2a 2f 0a 73 74 61 74  -holder..*/.stat
24b70 69 63 20 69 6e 74 20 75 6e 69 78 47 65 74 4c 61  ic int unixGetLa
24b80 73 74 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f  stError(sqlite3_
24b90 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e  vfs *NotUsed, in
24ba0 74 20 4e 6f 74 55 73 65 64 32 2c 20 63 68 61 72  t NotUsed2, char
24bb0 20 2a 4e 6f 74 55 73 65 64 33 29 7b 0a 20 20 55   *NotUsed3){.  U
24bc0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
24bd0 4e 6f 74 55 73 65 64 29 3b 0a 20 20 55 4e 55 53  NotUsed);.  UNUS
24be0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
24bf0 55 73 65 64 32 29 3b 0a 20 20 55 4e 55 53 45 44  Used2);.  UNUSED
24c00 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
24c10 65 64 33 29 3b 0a 20 20 72 65 74 75 72 6e 20 30  ed3);.  return 0
24c20 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
24c30 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 0a 2f 2a  ITE_OMIT_WAL../*
24c40 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
24c50 63 65 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  ce */.typedef st
24c60 72 75 63 74 20 75 6e 69 78 53 68 6d 20 75 6e 69  ruct unixShm uni
24c70 78 53 68 6d 3b 0a 74 79 70 65 64 65 66 20 73 74  xShm;.typedef st
24c80 72 75 63 74 20 75 6e 69 78 53 68 6d 46 69 6c 65  ruct unixShmFile
24c90 20 75 6e 69 78 53 68 6d 46 69 6c 65 3b 0a 0a 2f   unixShmFile;../
24ca0 2a 0a 2a 2a 20 4f 62 6a 65 63 74 20 75 73 65 64  *.** Object used
24cb0 20 74 6f 20 72 65 70 72 65 73 65 6e 74 20 61 20   to represent a 
24cc0 73 69 6e 67 6c 65 20 66 69 6c 65 20 6f 70 65 6e  single file open
24cd0 65 64 20 61 6e 64 20 6d 6d 61 70 70 65 64 20 74  ed and mmapped t
24ce0 6f 20 70 72 6f 76 69 64 65 0a 2a 2a 20 73 68 61  o provide.** sha
24cf0 72 65 64 20 6d 65 6d 6f 72 79 2e 20 20 57 68 65  red memory.  Whe
24d00 6e 20 6d 75 6c 74 69 70 6c 65 20 74 68 72 65 61  n multiple threa
24d10 64 73 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65  ds all reference
24d20 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 6c 6f 67   the same.** log
24d30 2d 73 75 6d 6d 61 72 79 2c 20 65 61 63 68 20 74  -summary, each t
24d40 68 72 65 61 64 20 68 61 73 20 69 74 73 20 6f 77  hread has its ow
24d50 6e 20 75 6e 69 78 46 69 6c 65 20 6f 62 6a 65 63  n unixFile objec
24d60 74 2c 20 62 75 74 20 74 68 65 79 20 61 6c 6c 0a  t, but they all.
24d70 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 61 20 73 69  ** point to a si
24d80 6e 67 6c 65 20 69 6e 73 74 61 6e 63 65 20 6f 66  ngle instance of
24d90 20 74 68 69 73 20 6f 62 6a 65 63 74 2e 20 20 49   this object.  I
24da0 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 65  n other words, e
24db0 61 63 68 0a 2a 2a 20 6c 6f 67 2d 73 75 6d 6d 61  ach.** log-summa
24dc0 72 79 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e 6c  ry is opened onl
24dd0 79 20 6f 6e 63 65 20 70 65 72 20 70 72 6f 63 65  y once per proce
24de0 73 73 2e 0a 2a 2a 0a 2a 2a 20 75 6e 69 78 4d 75  ss..**.** unixMu
24df0 74 65 78 48 65 6c 64 28 29 20 6d 75 73 74 20 62  texHeld() must b
24e00 65 20 74 72 75 65 20 77 68 65 6e 20 63 72 65 61  e true when crea
24e10 74 69 6e 67 20 6f 72 20 64 65 73 74 72 6f 79 69  ting or destroyi
24e20 6e 67 0a 2a 2a 20 74 68 69 73 20 6f 62 6a 65 63  ng.** this objec
24e30 74 20 6f 72 20 77 68 69 6c 65 20 72 65 61 64 69  t or while readi
24e40 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68  ng or writing th
24e50 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c  e following fiel
24e60 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 6e  ds:.**.**      n
24e70 52 65 66 0a 2a 2a 20 20 20 20 20 20 70 4e 65 78  Ref.**      pNex
24e80 74 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  t .**.** The fol
24e90 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 20 61 72  lowing fields ar
24ea0 65 20 72 65 61 64 2d 6f 6e 6c 79 20 61 66 74 65  e read-only afte
24eb0 72 20 74 68 65 20 6f 62 6a 65 63 74 20 69 73 20  r the object is 
24ec0 63 72 65 61 74 65 64 3a 0a 2a 2a 20 0a 2a 2a 20  created:.** .** 
24ed0 20 20 20 20 20 66 69 64 0a 2a 2a 20 20 20 20 20       fid.**     
24ee0 20 7a 46 69 6c 65 6e 61 6d 65 0a 2a 2a 0a 2a 2a   zFilename.**.**
24ef0 20 45 69 74 68 65 72 20 75 6e 69 78 53 68 6d 46   Either unixShmF
24f00 69 6c 65 2e 6d 75 74 65 78 20 6d 75 73 74 20 62  ile.mutex must b
24f10 65 20 68 65 6c 64 20 6f 72 20 75 6e 69 78 53 68  e held or unixSh
24f20 6d 46 69 6c 65 2e 6e 52 65 66 3d 3d 30 20 61 6e  mFile.nRef==0 an
24f30 64 0a 2a 2a 20 75 6e 69 78 4d 75 74 65 78 48 65  d.** unixMutexHe
24f40 6c 64 28 29 20 69 73 20 74 72 75 65 20 77 68 65  ld() is true whe
24f50 6e 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69  n reading or wri
24f60 74 69 6e 67 20 61 6e 79 20 6f 74 68 65 72 20 66  ting any other f
24f70 69 65 6c 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20  ield.** in this 
24f80 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a  structure..**.**
24f90 20 54 6f 20 61 76 6f 69 64 20 64 65 61 64 6c 6f   To avoid deadlo
24fa0 63 6b 73 2c 20 6d 75 74 65 78 20 61 6e 64 20 6d  cks, mutex and m
24fb0 75 74 65 78 42 75 66 20 61 72 65 20 61 6c 77 61  utexBuf are alwa
24fc0 79 73 20 72 65 6c 65 61 73 65 64 20 69 6e 20 74  ys released in t
24fd0 68 65 0a 2a 2a 20 72 65 76 65 72 73 65 20 6f 72  he.** reverse or
24fe0 64 65 72 20 74 68 61 74 20 74 68 65 79 20 61 72  der that they ar
24ff0 65 20 61 63 71 75 69 72 65 64 2e 20 20 6d 75 74  e acquired.  mut
25000 65 78 42 75 66 20 69 73 20 61 6c 77 61 79 73 20  exBuf is always 
25010 61 63 71 75 69 72 65 64 0a 2a 2a 20 66 69 72 73  acquired.** firs
25020 74 20 61 6e 64 20 72 65 6c 65 61 73 65 64 20 6c  t and released l
25030 61 73 74 2e 20 20 54 68 69 73 20 69 6e 76 61 72  ast.  This invar
25040 69 61 6e 74 20 69 73 20 63 68 65 63 6b 20 62 79  iant is check by
25050 20 61 73 73 65 72 74 69 6e 67 0a 2a 2a 20 73 71   asserting.** sq
25060 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6e 6f 74 68  lite3_mutex_noth
25070 65 6c 64 28 29 20 6f 6e 20 6d 75 74 65 78 20 77  eld() on mutex w
25080 68 65 6e 65 76 65 72 20 6d 75 74 65 78 42 75 66  henever mutexBuf
25090 20 69 73 20 61 63 71 75 69 72 65 64 20 6f 72 0a   is acquired or.
250a0 2a 2a 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2f 0a  ** released..*/.
250b0 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d 46 69  struct unixShmFi
250c0 6c 65 20 7b 0a 20 20 73 74 72 75 63 74 20 75 6e  le {.  struct un
250d0 69 78 46 69 6c 65 49 64 20 66 69 64 3b 20 20 20  ixFileId fid;   
250e0 20 20 2f 2a 20 55 6e 69 71 75 65 20 66 69 6c 65    /* Unique file
250f0 20 69 64 65 6e 74 69 66 69 65 72 20 2a 2f 0a 20   identifier */. 
25100 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a   sqlite3_mutex *
25110 6d 75 74 65 78 3b 20 20 20 20 20 20 2f 2a 20 4d  mutex;      /* M
25120 75 74 65 78 20 74 6f 20 61 63 63 65 73 73 20 74  utex to access t
25130 68 69 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  his object */.  
25140 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d  sqlite3_mutex *m
25150 75 74 65 78 42 75 66 3b 20 20 20 2f 2a 20 4d 75  utexBuf;   /* Mu
25160 74 65 78 20 74 6f 20 61 63 63 65 73 73 20 7a 42  tex to access zB
25170 75 66 5b 5d 20 2a 2f 0a 20 20 63 68 61 72 20 2a  uf[] */.  char *
25180 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20  zFilename;      
25190 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
251a0 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  the file */.  in
251b0 74 20 68 3b 20 20 20 20 20 20 20 20 20 20 20 20  t h;            
251c0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e           /* Open
251d0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
251e0 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 4d 61 70 3b   */.  int szMap;
251f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25200 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
25210 6d 61 70 70 69 6e 67 20 6f 66 20 66 69 6c 65 20  mapping of file 
25220 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20  into memory */. 
25230 20 63 68 61 72 20 2a 70 4d 4d 61 70 42 75 66 3b   char *pMMapBuf;
25240 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
25250 68 65 72 65 20 63 75 72 72 65 6e 74 6c 79 20 6d  here currently m
25260 6d 61 70 70 65 64 28 29 2e 20 20 4e 55 4c 4c 20  mapped().  NULL 
25270 69 66 20 75 6e 6d 61 70 70 65 64 20 2a 2f 0a 20  if unmapped */. 
25280 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20   int nRef;      
25290 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
252a0 75 6d 62 65 72 20 6f 66 20 75 6e 69 78 53 68 6d  umber of unixShm
252b0 20 6f 62 6a 65 63 74 73 20 70 6f 69 6e 74 69 6e   objects pointin
252c0 67 20 74 6f 20 74 68 69 73 20 2a 2f 0a 20 20 75  g to this */.  u
252d0 6e 69 78 53 68 6d 20 2a 70 46 69 72 73 74 3b 20  nixShm *pFirst; 
252e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
252f0 20 75 6e 69 78 53 68 6d 20 6f 62 6a 65 63 74 73   unixShm objects
25300 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 69   pointing to thi
25310 73 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 46 69  s */.  unixShmFi
25320 6c 65 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20  le *pNext;      
25330 20 20 2f 2a 20 4e 65 78 74 20 69 6e 20 6c 69 73    /* Next in lis
25340 74 20 6f 66 20 61 6c 6c 20 75 6e 69 78 53 68 6d  t of all unixShm
25350 46 69 6c 65 20 6f 62 6a 65 63 74 73 20 2a 2f 0a  File objects */.
25360 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
25370 42 55 47 0a 20 20 75 38 20 65 78 63 6c 4d 61 73  BUG.  u8 exclMas
25380 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
25390 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 65 78 63 6c   /* Mask of excl
253a0 75 73 69 76 65 20 6c 6f 63 6b 73 20 68 65 6c 64  usive locks held
253b0 20 2a 2f 0a 20 20 75 38 20 73 68 61 72 65 64 4d   */.  u8 sharedM
253c0 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ask;            
253d0 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 73 68 61 72   /* Mask of shar
253e0 65 64 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f  ed locks held */
253f0 0a 20 20 75 38 20 6e 65 78 74 53 68 6d 49 64 3b  .  u8 nextShmId;
25400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25410 20 4e 65 78 74 20 61 76 61 69 6c 61 62 6c 65 20   Next available 
25420 75 6e 69 78 53 68 6d 2e 69 64 20 76 61 6c 75 65  unixShm.id value
25430 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f   */.#endif.};../
25440 2a 0a 2a 2a 20 41 20 67 6c 6f 62 61 6c 20 61 72  *.** A global ar
25450 72 61 79 20 6f 66 20 61 6c 6c 20 75 6e 69 78 53  ray of all unixS
25460 68 6d 46 69 6c 65 20 6f 62 6a 65 63 74 73 2e 0a  hmFile objects..
25470 2a 2a 0a 2a 2a 20 54 68 65 20 75 6e 69 78 4d 75  **.** The unixMu
25480 74 65 78 48 65 6c 64 28 29 20 6d 75 73 74 20 62  texHeld() must b
25490 65 20 74 72 75 65 20 77 68 69 6c 65 20 72 65 61  e true while rea
254a0 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20  ding or writing 
254b0 74 68 69 73 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74  this list..*/.st
254c0 61 74 69 63 20 75 6e 69 78 53 68 6d 46 69 6c 65  atic unixShmFile
254d0 20 2a 75 6e 69 78 53 68 6d 46 69 6c 65 4c 69 73   *unixShmFileLis
254e0 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 53 74  t = 0;../*.** St
254f0 72 75 63 74 75 72 65 20 75 73 65 64 20 69 6e 74  ructure used int
25500 65 72 6e 61 6c 6c 79 20 62 79 20 74 68 69 73 20  ernally by this 
25510 56 46 53 20 74 6f 20 72 65 63 6f 72 64 20 74 68  VFS to record th
25520 65 20 73 74 61 74 65 20 6f 66 20 61 6e 0a 2a 2a  e state of an.**
25530 20 6f 70 65 6e 20 73 68 61 72 65 64 20 6d 65 6d   open shared mem
25540 6f 72 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  ory connection..
25550 2a 2a 0a 2a 2a 20 75 6e 69 78 53 68 6d 2e 70 46  **.** unixShm.pF
25560 69 6c 65 2d 3e 6d 75 74 65 78 20 6d 75 73 74 20  ile->mutex must 
25570 62 65 20 68 65 6c 64 20 77 68 69 6c 65 20 72 65  be held while re
25580 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67  ading or writing
25590 20 74 68 65 0a 2a 2a 20 75 6e 69 78 53 68 6d 2e   the.** unixShm.
255a0 70 4e 65 78 74 20 61 6e 64 20 75 6e 69 78 53 68  pNext and unixSh
255b0 6d 2e 6c 6f 63 6b 73 5b 5d 20 65 6c 65 6d 65 6e  m.locks[] elemen
255c0 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 75 6e  ts..**.** The un
255d0 69 78 53 68 6d 2e 70 46 69 6c 65 20 65 6c 65 6d  ixShm.pFile elem
255e0 65 6e 74 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  ent is initializ
255f0 65 64 20 77 68 65 6e 20 74 68 65 20 6f 62 6a 65  ed when the obje
25600 63 74 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a  ct is created.**
25610 20 61 6e 64 20 69 73 20 72 65 61 64 2d 6f 6e 6c   and is read-onl
25620 79 20 74 68 65 72 65 61 66 74 65 72 2e 0a 2a 2f  y thereafter..*/
25630 0a 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d 20  .struct unixShm 
25640 7b 0a 20 20 75 6e 69 78 53 68 6d 46 69 6c 65 20  {.  unixShmFile 
25650 2a 70 46 69 6c 65 3b 20 20 20 20 20 20 20 20 2f  *pFile;        /
25660 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  * The underlying
25670 20 75 6e 69 78 53 68 6d 46 69 6c 65 20 6f 62 6a   unixShmFile obj
25680 65 63 74 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d  ect */.  unixShm
25690 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20 20   *pNext;        
256a0 20 20 20 20 2f 2a 20 4e 65 78 74 20 75 6e 69 78      /* Next unix
256b0 53 68 6d 20 77 69 74 68 20 74 68 65 20 73 61 6d  Shm with the sam
256c0 65 20 75 6e 69 78 53 68 6d 46 69 6c 65 20 2a 2f  e unixShmFile */
256d0 0a 20 20 75 38 20 6c 6f 63 6b 53 74 61 74 65 3b  .  u8 lockState;
256e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
256f0 20 43 75 72 72 65 6e 74 20 6c 6f 63 6b 20 73 74   Current lock st
25700 61 74 65 20 2a 2f 0a 20 20 75 38 20 68 61 73 4d  ate */.  u8 hasM
25710 75 74 65 78 3b 20 20 20 20 20 20 20 20 20 20 20  utex;           
25720 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 68      /* True if h
25730 6f 6c 64 69 6e 67 20 74 68 65 20 75 6e 69 78 53  olding the unixS
25740 68 6d 46 69 6c 65 20 6d 75 74 65 78 20 2a 2f 0a  hmFile mutex */.
25750 20 20 75 38 20 68 61 73 4d 75 74 65 78 42 75 66    u8 hasMutexBuf
25760 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
25770 54 72 75 65 20 69 66 20 68 6f 6c 64 69 6e 67 20  True if holding 
25780 70 46 69 6c 65 2d 3e 6d 75 74 65 78 42 75 66 20  pFile->mutexBuf 
25790 2a 2f 0a 20 20 75 38 20 73 68 61 72 65 64 4d 61  */.  u8 sharedMa
257a0 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  sk;             
257b0 2f 2a 20 4d 61 73 6b 20 6f 66 20 73 68 61 72 65  /* Mask of share
257c0 64 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a  d locks held */.
257d0 20 20 75 38 20 65 78 63 6c 4d 61 73 6b 3b 20 20    u8 exclMask;  
257e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
257f0 4d 61 73 6b 20 6f 66 20 65 78 63 6c 75 73 69 76  Mask of exclusiv
25800 65 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a  e locks held */.
25810 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
25820 42 55 47 0a 20 20 75 38 20 69 64 3b 20 20 20 20  BUG.  u8 id;    
25830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25840 20 2f 2a 20 49 64 20 6f 66 20 74 68 69 73 20 63   /* Id of this c
25850 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 20 69  onnection with i
25860 74 73 20 75 6e 69 78 53 68 6d 46 69 6c 65 20 2a  ts unixShmFile *
25870 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a  /.#endif.};../*.
25880 2a 2a 20 53 69 7a 65 20 69 6e 63 72 65 6d 65 6e  ** Size incremen
25890 74 20 62 79 20 77 68 69 63 68 20 73 68 61 72 65  t by which share
258a0 64 20 6d 65 6d 6f 72 79 20 67 72 6f 77 73 0a 2a  d memory grows.*
258b0 2f 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45  /.#define SQLITE
258c0 5f 55 4e 49 58 5f 53 48 4d 5f 49 4e 43 52 20 20  _UNIX_SHM_INCR  
258d0 34 30 39 36 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73  4096../*.** Cons
258e0 74 61 6e 74 73 20 75 73 65 64 20 66 6f 72 20 6c  tants used for l
258f0 6f 63 6b 69 6e 67 0a 2a 2f 0a 23 64 65 66 69 6e  ocking.*/.#defin
25900 65 20 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45 20  e UNIX_SHM_BASE 
25910 20 20 20 20 20 33 32 20 20 20 20 20 20 20 20 2f       32        /
25920 2a 20 42 79 74 65 20 6f 66 66 73 65 74 20 6f 66  * Byte offset of
25930 20 74 68 65 20 66 69 72 73 74 20 6c 6f 63 6b 20   the first lock 
25940 62 79 74 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  byte */.#define 
25950 55 4e 49 58 5f 53 48 4d 5f 44 4d 53 20 20 20 20  UNIX_SHM_DMS    
25960 20 20 20 30 78 30 31 20 20 20 20 20 20 2f 2a 20     0x01      /* 
25970 4d 61 73 6b 20 66 6f 72 20 44 65 61 64 2d 4d 61  Mask for Dead-Ma
25980 6e 2d 53 77 69 74 63 68 20 6c 6f 63 6b 20 2a 2f  n-Switch lock */
25990 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 5f 53 48  .#define UNIX_SH
259a0 4d 5f 41 20 20 20 20 20 20 20 20 20 30 78 31 30  M_A         0x10
259b0 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 66 6f        /* Mask fo
259c0 72 20 72 65 67 69 6f 6e 20 6c 6f 63 6b 73 2e 2e  r region locks..
259d0 2e 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49  . */.#define UNI
259e0 58 5f 53 48 4d 5f 42 20 20 20 20 20 20 20 20 20  X_SHM_B         
259f0 30 78 32 30 0a 23 64 65 66 69 6e 65 20 55 4e 49  0x20.#define UNI
25a00 58 5f 53 48 4d 5f 43 20 20 20 20 20 20 20 20 20  X_SHM_C         
25a10 30 78 34 30 0a 23 64 65 66 69 6e 65 20 55 4e 49  0x40.#define UNI
25a20 58 5f 53 48 4d 5f 44 20 20 20 20 20 20 20 20 20  X_SHM_D         
25a30 30 78 38 30 0a 0a 23 69 66 64 65 66 20 53 51 4c  0x80..#ifdef SQL
25a40 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20  ITE_DEBUG./*.** 
25a50 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
25a60 20 74 6f 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e   to a nul-termin
25a70 61 74 65 64 20 73 74 72 69 6e 67 20 69 6e 20 73  ated string in s
25a80 74 61 74 69 63 20 6d 65 6d 6f 72 79 20 74 68 61  tatic memory tha
25a90 74 0a 2a 2a 20 64 65 73 63 72 69 62 65 73 20 61  t.** describes a
25aa0 20 6c 6f 63 6b 69 6e 67 20 6d 61 73 6b 2e 20 20   locking mask.  
25ab0 54 68 65 20 73 74 72 69 6e 67 20 69 73 20 6f 66  The string is of
25ac0 20 74 68 65 20 66 6f 72 6d 20 22 4d 53 41 42 43   the form "MSABC
25ad0 44 22 20 77 69 74 68 0a 2a 2a 20 65 61 63 68 20  D" with.** each 
25ae0 63 68 61 72 61 63 74 65 72 20 72 65 70 72 65 73  character repres
25af0 65 6e 74 69 6e 67 20 61 20 6c 6f 63 6b 2e 20 20  enting a lock.  
25b00 22 4d 22 20 66 6f 72 20 4d 55 54 45 58 2c 20 22  "M" for MUTEX, "
25b10 53 22 20 66 6f 72 20 44 4d 53 2c 20 0a 2a 2a 20  S" for DMS, .** 
25b20 61 6e 64 20 22 41 22 20 74 68 72 6f 75 67 68 20  and "A" through 
25b30 22 44 22 20 66 6f 72 20 74 68 65 20 72 65 67 69  "D" for the regi
25b40 6f 6e 20 6c 6f 63 6b 73 2e 20 20 49 66 20 61 20  on locks.  If a 
25b50 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 74 68  lock is held, th
25b60 65 0a 2a 2a 20 6c 65 74 74 65 72 20 69 73 20 73  e.** letter is s
25b70 68 6f 77 6e 2e 20 20 49 66 20 74 68 65 20 6c 6f  hown.  If the lo
25b80 63 6b 20 69 73 20 6e 6f 74 20 68 65 6c 64 2c 20  ck is not held, 
25b90 74 68 65 20 6c 65 74 74 65 72 20 69 73 20 63 6f  the letter is co
25ba0 6e 76 65 72 74 65 64 0a 2a 2a 20 74 6f 20 22 2e  nverted.** to ".
25bb0 22 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  "..**.** This ro
25bc0 75 74 69 6e 65 20 69 73 20 66 6f 72 20 64 65 62  utine is for deb
25bd0 75 67 67 69 6e 67 20 70 75 72 70 6f 73 65 73 20  ugging purposes 
25be0 6f 6e 6c 79 20 61 6e 64 20 64 6f 65 73 20 6e 6f  only and does no
25bf0 74 20 61 70 70 65 61 72 0a 2a 2a 20 69 6e 20 61  t appear.** in a
25c00 20 70 72 6f 64 75 63 74 69 6f 6e 20 62 75 69 6c   production buil
25c10 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  d..*/.static con
25c20 73 74 20 63 68 61 72 20 2a 75 6e 69 78 53 68 6d  st char *unixShm
25c30 4c 6f 63 6b 53 74 72 69 6e 67 28 75 38 20 6d 61  LockString(u8 ma
25c40 73 6b 29 7b 0a 20 20 73 74 61 74 69 63 20 63 68  sk){.  static ch
25c50 61 72 20 7a 42 75 66 5b 34 38 5d 3b 0a 20 20 73  ar zBuf[48];.  s
25c60 74 61 74 69 63 20 69 6e 74 20 69 42 75 66 20 3d  tatic int iBuf =
25c70 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 0a   0;.  char *z;..
25c80 20 20 7a 20 3d 20 26 7a 42 75 66 5b 69 42 75 66    z = &zBuf[iBuf
25c90 5d 3b 0a 20 20 69 42 75 66 20 2b 3d 20 38 3b 0a  ];.  iBuf += 8;.
25ca0 20 20 69 66 28 20 69 42 75 66 3e 3d 73 69 7a 65    if( iBuf>=size
25cb0 6f 66 28 7a 42 75 66 29 20 29 20 69 42 75 66 20  of(zBuf) ) iBuf 
25cc0 3d 20 30 3b 0a 0a 20 20 7a 5b 30 5d 20 3d 20 28  = 0;..  z[0] = (
25cd0 6d 61 73 6b 20 26 20 55 4e 49 58 5f 53 48 4d 5f  mask & UNIX_SHM_
25ce0 44 4d 53 29 20 20 20 3f 20 27 53 27 20 3a 20 27  DMS)   ? 'S' : '
25cf0 2e 27 3b 0a 20 20 7a 5b 31 5d 20 3d 20 28 6d 61  .';.  z[1] = (ma
25d00 73 6b 20 26 20 55 4e 49 58 5f 53 48 4d 5f 41 29  sk & UNIX_SHM_A)
25d10 20 20 20 20 20 3f 20 27 41 27 20 3a 20 27 2e 27       ? 'A' : '.'
25d20 3b 0a 20 20 7a 5b 32 5d 20 3d 20 28 6d 61 73 6b  ;.  z[2] = (mask
25d30 20 26 20 55 4e 49 58 5f 53 48 4d 5f 42 29 20 20   & UNIX_SHM_B)  
25d40 20 20 20 3f 20 27 42 27 20 3a 20 27 2e 27 3b 0a     ? 'B' : '.';.
25d50 20 20 7a 5b 33 5d 20 3d 20 28 6d 61 73 6b 20 26    z[3] = (mask &
25d60 20 55 4e 49 58 5f 53 48 4d 5f 43 29 20 20 20 20   UNIX_SHM_C)    
25d70 20 3f 20 27 43 27 20 3a 20 27 2e 27 3b 0a 20 20   ? 'C' : '.';.  
25d80 7a 5b 34 5d 20 3d 20 28 6d 61 73 6b 20 26 20 55  z[4] = (mask & U
25d90 4e 49 58 5f 53 48 4d 5f 44 29 20 20 20 20 20 3f  NIX_SHM_D)     ?
25da0 20 27 44 27 20 3a 20 27 2e 27 3b 0a 20 20 7a 5b   'D' : '.';.  z[
25db0 35 5d 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  5] = 0;.  return
25dc0 20 7a 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   z;.}.#endif /* 
25dd0 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a  SQLITE_DEBUG */.
25de0 0a 2f 2a 0a 2a 2a 20 41 70 70 6c 79 20 70 6f 73  ./*.** Apply pos
25df0 69 78 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b  ix advisory lock
25e00 73 20 66 6f 72 20 61 6c 6c 20 62 79 74 65 73 20  s for all bytes 
25e10 69 64 65 6e 74 69 66 69 65 64 20 69 6e 20 6c 6f  identified in lo
25e20 63 6b 4d 61 73 6b 2e 0a 2a 2a 0a 2a 2a 20 6c 6f  ckMask..**.** lo
25e30 63 6b 4d 61 73 6b 20 6d 69 67 68 74 20 63 6f 6e  ckMask might con
25e40 74 61 69 6e 20 6d 75 6c 74 69 70 6c 65 20 62 69  tain multiple bi
25e50 74 73 20 62 75 74 20 61 6c 6c 20 62 69 74 73 20  ts but all bits 
25e60 61 72 65 20 67 75 61 72 61 6e 74 65 65 64 0a 2a  are guaranteed.*
25e70 2a 20 74 6f 20 62 65 20 63 6f 6e 74 69 67 75 6f  * to be contiguo
25e80 75 73 2e 0a 2a 2a 0a 2a 2a 20 4c 6f 63 6b 73 20  us..**.** Locks 
25e90 62 6c 6f 63 6b 20 69 66 20 74 68 65 20 6d 61 73  block if the mas
25ea0 6b 20 69 73 20 65 78 61 63 74 6c 79 20 55 4e 49  k is exactly UNI
25eb0 58 5f 53 48 4d 5f 43 20 61 6e 64 20 61 72 65 20  X_SHM_C and are 
25ec0 6e 6f 6e 2d 62 6c 6f 63 6b 69 6e 67 0a 2a 2a 20  non-blocking.** 
25ed0 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74  otherwise..*/.st
25ee0 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 68 6d  atic int unixShm
25ef0 53 79 73 74 65 6d 4c 6f 63 6b 28 0a 20 20 75 6e  SystemLock(.  un
25f00 69 78 53 68 6d 46 69 6c 65 20 2a 70 46 69 6c 65  ixShmFile *pFile
25f10 2c 20 20 20 2f 2a 20 41 70 70 6c 79 20 6c 6f 63  ,   /* Apply loc
25f20 6b 73 20 74 6f 20 74 68 69 73 20 6f 70 65 6e 20  ks to this open 
25f30 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 73 65  shared-memory se
25f40 67 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6c  gment */.  int l
25f50 6f 63 6b 54 79 70 65 2c 20 20 20 20 20 20 20 20  ockType,        
25f60 20 2f 2a 20 46 5f 55 4e 4c 43 4b 2c 20 46 5f 52   /* F_UNLCK, F_R
25f70 44 4c 43 4b 2c 20 6f 72 20 46 5f 57 52 4c 43 4b  DLCK, or F_WRLCK
25f80 20 2a 2f 0a 20 20 75 38 20 6c 6f 63 6b 4d 61 73   */.  u8 lockMas
25f90 6b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  k           /* W
25fa0 68 69 63 68 20 62 79 74 65 73 20 74 6f 20 6c 6f  hich bytes to lo
25fb0 63 6b 20 6f 72 20 75 6e 6c 6f 63 6b 20 2a 2f 0a  ck or unlock */.
25fc0 29 7b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63  ){.  struct floc
25fd0 6b 20 66 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  k f;       /* Th
25fe0 65 20 70 6f 73 69 78 20 61 64 76 69 73 6f 72 79  e posix advisory
25ff0 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63 74 75   locking structu
26000 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6c 6f 63 6b  re */.  int lock
26010 4f 70 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Op;           /*
26020 20 54 68 65 20 6f 70 63 6f 64 65 20 66 6f 72 20   The opcode for 
26030 66 63 6e 74 6c 28 29 20 2a 2f 0a 20 20 69 6e 74  fcntl() */.  int
26040 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
26050 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74     /* Offset int
26060 6f 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 62 79  o the locking by
26070 74 65 20 72 61 6e 67 65 20 2a 2f 0a 20 20 69 6e  te range */.  in
26080 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
26090 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f      /* Result co
260a0 64 65 20 66 6f 72 6d 20 66 63 6e 74 6c 28 29 20  de form fcntl() 
260b0 2a 2f 0a 20 20 75 38 20 6d 61 73 6b 3b 20 20 20  */.  u8 mask;   
260c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
260d0 73 6b 20 6f 66 20 62 69 74 73 20 69 6e 20 6c 6f  sk of bits in lo
260e0 63 6b 4d 61 73 6b 20 2a 2f 0a 0a 20 20 2f 2a 20  ckMask */..  /* 
260f0 41 63 63 65 73 73 20 74 6f 20 74 68 65 20 75 6e  Access to the un
26100 69 78 53 68 6d 46 69 6c 65 20 6f 62 6a 65 63 74  ixShmFile object
26110 20 69 73 20 73 65 72 69 61 6c 69 7a 65 64 20 62   is serialized b
26120 79 20 74 68 65 20 63 61 6c 6c 65 72 20 2a 2f 0a  y the caller */.
26130 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
26140 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 46 69  3_mutex_held(pFi
26150 6c 65 2d 3e 6d 75 74 65 78 29 20 7c 7c 20 70 46  le->mutex) || pF
26160 69 6c 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a  ile->nRef==0 );.
26170 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65  .  /* Initialize
26180 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 70 61 72   the locking par
26190 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20 6d 65 6d  ameters */.  mem
261a0 73 65 74 28 26 66 2c 20 30 2c 20 73 69 7a 65 6f  set(&f, 0, sizeo
261b0 66 28 66 29 29 3b 0a 20 20 66 2e 6c 5f 74 79 70  f(f));.  f.l_typ
261c0 65 20 3d 20 6c 6f 63 6b 54 79 70 65 3b 0a 20 20  e = lockType;.  
261d0 66 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45  f.l_whence = SEE
261e0 4b 5f 53 45 54 3b 0a 20 20 69 66 28 20 6c 6f 63  K_SET;.  if( loc
261f0 6b 4d 61 73 6b 3d 3d 55 4e 49 58 5f 53 48 4d 5f  kMask==UNIX_SHM_
26200 43 20 26 26 20 6c 6f 63 6b 54 79 70 65 21 3d 46  C && lockType!=F
26210 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 6c 6f  _UNLCK ){.    lo
26220 63 6b 4f 70 20 3d 20 46 5f 53 45 54 4c 4b 57 3b  ckOp = F_SETLKW;
26230 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 53  .    OSTRACE(("S
26240 48 4d 2d 4c 4f 43 4b 20 72 65 71 75 65 73 74 69  HM-LOCK requesti
26250 6e 67 20 62 6c 6f 63 6b 69 6e 67 20 6c 6f 63 6b  ng blocking lock
26260 5c 6e 22 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  \n"));.  }else{.
26270 20 20 20 20 6c 6f 63 6b 4f 70 20 3d 20 46 5f 53      lockOp = F_S
26280 45 54 4c 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ETLK;.  }..  /* 
26290 46 69 6e 64 20 74 68 65 20 66 69 72 73 74 20 62  Find the first b
262a0 69 74 20 69 6e 20 6c 6f 63 6b 4d 61 73 6b 20 74  it in lockMask t
262b0 68 61 74 20 69 73 20 73 65 74 20 2a 2f 0a 20 20  hat is set */.  
262c0 66 6f 72 28 69 3d 30 2c 20 6d 61 73 6b 3d 30 78  for(i=0, mask=0x
262d0 30 31 3b 20 6d 61 73 6b 21 3d 30 20 26 26 20 28  01; mask!=0 && (
262e0 6c 6f 63 6b 4d 61 73 6b 26 6d 61 73 6b 29 3d 3d  lockMask&mask)==
262f0 30 3b 20 6d 61 73 6b 20 3c 3c 3d 20 31 2c 20 69  0; mask <<= 1, i
26300 2b 2b 29 7b 7d 0a 20 20 61 73 73 65 72 74 28 20  ++){}.  assert( 
26310 6d 61 73 6b 21 3d 30 20 29 3b 0a 20 20 66 2e 6c  mask!=0 );.  f.l
26320 5f 73 74 61 72 74 20 3d 20 69 2b 55 4e 49 58 5f  _start = i+UNIX_
26330 53 48 4d 5f 42 41 53 45 3b 0a 20 20 66 2e 6c 5f  SHM_BASE;.  f.l_
26340 6c 65 6e 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 45  len = 1;..  /* E
26350 78 74 65 6e 64 20 74 68 65 20 6c 6f 63 6b 69 6e  xtend the lockin
26360 67 20 72 61 6e 67 65 20 66 6f 72 20 65 61 63 68  g range for each
26370 20 61 64 64 69 74 69 6f 6e 61 6c 20 62 69 74 20   additional bit 
26380 74 68 61 74 20 69 73 20 73 65 74 20 2a 2f 0a 20  that is set */. 
26390 20 6d 61 73 6b 20 3c 3c 3d 20 31 3b 0a 20 20 77   mask <<= 1;.  w
263a0 68 69 6c 65 28 20 6d 61 73 6b 21 3d 30 20 26 26  hile( mask!=0 &&
263b0 20 28 6c 6f 63 6b 4d 61 73 6b 20 26 20 6d 61 73   (lockMask & mas
263c0 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 66 2e 6c  k)!=0 ){.    f.l
263d0 5f 6c 65 6e 2b 2b 3b 0a 20 20 20 20 6d 61 73 6b  _len++;.    mask
263e0 20 3c 3c 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f   <<= 1;.  }..  /
263f0 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 61 6c  * Verify that al
26400 6c 20 62 69 74 73 20 73 65 74 20 69 6e 20 6c 6f  l bits set in lo
26410 63 6b 4d 61 73 6b 20 61 72 65 20 63 6f 6e 74 69  ckMask are conti
26420 67 75 6f 75 73 20 2a 2f 0a 20 20 61 73 73 65 72  guous */.  asser
26430 74 28 20 6d 61 73 6b 3d 3d 30 20 7c 7c 20 28 6c  t( mask==0 || (l
26440 6f 63 6b 4d 61 73 6b 20 26 20 7e 28 6d 61 73 6b  ockMask & ~(mask
26450 20 7c 20 28 6d 61 73 6b 2d 31 29 29 29 3d 3d 30   | (mask-1)))==0
26460 20 29 3b 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72   );..  /* Acquir
26470 65 20 74 68 65 20 73 79 73 74 65 6d 2d 6c 65 76  e the system-lev
26480 65 6c 20 6c 6f 63 6b 20 2a 2f 0a 20 20 72 63 20  el lock */.  rc 
26490 3d 20 66 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68  = fcntl(pFile->h
264a0 2c 20 6c 6f 63 6b 4f 70 2c 20 26 66 29 3b 0a 20  , lockOp, &f);. 
264b0 20 72 63 20 3d 20 28 72 63 21 3d 28 2d 31 29 29   rc = (rc!=(-1))
264c0 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 53   ? SQLITE_OK : S
264d0 51 4c 49 54 45 5f 42 55 53 59 3b 0a 0a 20 20 2f  QLITE_BUSY;..  /
264e0 2a 20 55 70 64 61 74 65 20 74 68 65 20 67 6c 6f  * Update the glo
264f0 62 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 20 61  bal lock state a
26500 6e 64 20 64 6f 20 64 65 62 75 67 20 74 72 61 63  nd do debug trac
26510 69 6e 67 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ing */.#ifdef SQ
26520 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 4f 53 54  LITE_DEBUG.  OST
26530 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20  RACE(("SHM-LOCK 
26540 22 29 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  "));.  if( rc==S
26550 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
26560 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f  if( lockType==F_
26570 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 4f  UNLCK ){.      O
26580 53 54 52 41 43 45 28 28 22 75 6e 6c 6f 63 6b 20  STRACE(("unlock 
26590 6f 6b 22 29 29 3b 0a 20 20 20 20 20 20 70 46 69  ok"));.      pFi
265a0 6c 65 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 3d 20  le->exclMask &= 
265b0 7e 6c 6f 63 6b 4d 61 73 6b 3b 0a 20 20 20 20 20  ~lockMask;.     
265c0 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 4d 61   pFile->sharedMa
265d0 73 6b 20 26 3d 20 7e 6c 6f 63 6b 4d 61 73 6b 3b  sk &= ~lockMask;
265e0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c  .    }else if( l
265f0 6f 63 6b 54 79 70 65 3d 3d 46 5f 52 44 4c 43 4b  ockType==F_RDLCK
26600 20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43   ){.      OSTRAC
26610 45 28 28 22 72 65 61 64 2d 6c 6f 63 6b 20 6f 6b  E(("read-lock ok
26620 22 29 29 3b 0a 20 20 20 20 20 20 70 46 69 6c 65  "));.      pFile
26630 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 3d 20 7e 6c  ->exclMask &= ~l
26640 6f 63 6b 4d 61 73 6b 3b 0a 20 20 20 20 20 20 70  ockMask;.      p
26650 46 69 6c 65 2d 3e 73 68 61 72 65 64 4d 61 73 6b  File->sharedMask
26660 20 7c 3d 20 6c 6f 63 6b 4d 61 73 6b 3b 0a 20 20   |= lockMask;.  
26670 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
26680 73 73 65 72 74 28 20 6c 6f 63 6b 54 79 70 65 3d  ssert( lockType=
26690 3d 46 5f 57 52 4c 43 4b 20 29 3b 0a 20 20 20 20  =F_WRLCK );.    
266a0 20 20 4f 53 54 52 41 43 45 28 28 22 77 72 69 74    OSTRACE(("writ
266b0 65 2d 6c 6f 63 6b 20 6f 6b 22 29 29 3b 0a 20 20  e-lock ok"));.  
266c0 20 20 20 20 70 46 69 6c 65 2d 3e 65 78 63 6c 4d      pFile->exclM
266d0 61 73 6b 20 7c 3d 20 6c 6f 63 6b 4d 61 73 6b 3b  ask |= lockMask;
266e0 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68  .      pFile->sh
266f0 61 72 65 64 4d 61 73 6b 20 26 3d 20 7e 6c 6f 63  aredMask &= ~loc
26700 6b 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  kMask;.    }.  }
26710 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 6c 6f  else{.    if( lo
26720 63 6b 54 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20  ckType==F_UNLCK 
26730 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  ){.      OSTRACE
26740 28 28 22 75 6e 6c 6f 63 6b 20 66 61 69 6c 65 64  (("unlock failed
26750 22 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  "));.    }else i
26760 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 52  f( lockType==F_R
26770 44 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 4f 53  DLCK ){.      OS
26780 54 52 41 43 45 28 28 22 72 65 61 64 2d 6c 6f 63  TRACE(("read-loc
26790 6b 20 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 20  k failed"));.   
267a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
267b0 73 65 72 74 28 20 6c 6f 63 6b 54 79 70 65 3d 3d  sert( lockType==
267c0 46 5f 57 52 4c 43 4b 20 29 3b 0a 20 20 20 20 20  F_WRLCK );.     
267d0 20 4f 53 54 52 41 43 45 28 28 22 77 72 69 74 65   OSTRACE(("write
267e0 2d 6c 6f 63 6b 20 66 61 69 6c 65 64 22 29 29 3b  -lock failed"));
267f0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 4f 53 54  .    }.  }.  OST
26800 52 41 43 45 28 28 22 20 2d 20 63 68 61 6e 67 65  RACE((" - change
26810 20 72 65 71 75 65 73 74 65 64 20 25 73 20 2d 20   requested %s - 
26820 61 66 74 65 72 77 61 72 64 73 20 25 73 3a 25 73  afterwards %s:%s
26830 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
26840 75 6e 69 78 53 68 6d 4c 6f 63 6b 53 74 72 69 6e  unixShmLockStrin
26850 67 28 6c 6f 63 6b 4d 61 73 6b 29 2c 0a 20 20 20  g(lockMask),.   
26860 20 20 20 20 20 20 20 20 75 6e 69 78 53 68 6d 4c          unixShmL
26870 6f 63 6b 53 74 72 69 6e 67 28 70 46 69 6c 65 2d  ockString(pFile-
26880 3e 73 68 61 72 65 64 4d 61 73 6b 29 2c 0a 20 20  >sharedMask),.  
26890 20 20 20 20 20 20 20 20 20 75 6e 69 78 53 68 6d           unixShm
268a0 4c 6f 63 6b 53 74 72 69 6e 67 28 70 46 69 6c 65  LockString(pFile
268b0 2d 3e 65 78 63 6c 4d 61 73 6b 29 29 29 3b 0a 23  ->exclMask)));.#
268c0 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20  endif..  return 
268d0 72 63 3b 20 20 20 20 20 20 20 20 0a 7d 0a 0a 2f  rc;        .}../
268e0 2a 0a 2a 2a 20 46 6f 72 20 63 6f 6e 6e 65 63 74  *.** For connect
268f0 69 6f 6e 20 70 2c 20 75 6e 6c 6f 63 6b 20 61 6c  ion p, unlock al
26900 6c 20 6f 66 20 74 68 65 20 6c 6f 63 6b 73 20 69  l of the locks i
26910 64 65 6e 74 69 66 69 65 64 20 62 79 20 74 68 65  dentified by the
26920 20 75 6e 6c 6f 63 6b 4d 61 73 6b 0a 2a 2a 20 70   unlockMask.** p
26930 61 72 61 6d 65 74 65 72 2e 0a 2a 2f 0a 73 74 61  arameter..*/.sta
26940 74 69 63 20 69 6e 74 20 75 6e 69 78 53 68 6d 55  tic int unixShmU
26950 6e 6c 6f 63 6b 28 0a 20 20 75 6e 69 78 53 68 6d  nlock(.  unixShm
26960 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 20 2f  File *pFile,   /
26970 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  * The underlying
26980 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66   shared-memory f
26990 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d  ile */.  unixShm
269a0 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 2f   *p,           /
269b0 2a 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  * The connection
269c0 20 74 6f 20 62 65 20 75 6e 6c 6f 63 6b 65 64 20   to be unlocked 
269d0 2a 2f 0a 20 20 75 38 20 75 6e 6c 6f 63 6b 4d 61  */.  u8 unlockMa
269e0 73 6b 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61  sk         /* Ma
269f0 73 6b 20 6f 66 20 6c 6f 63 6b 73 20 74 6f 20 62  sk of locks to b
26a00 65 20 75 6e 6c 6f 63 6b 65 64 20 2a 2f 0a 29 7b  e unlocked */.){
26a10 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
26a20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a  /* Result code *
26a30 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 58 3b  /.  unixShm *pX;
26a40 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
26a50 6f 76 65 72 20 61 6c 6c 20 73 69 62 6c 69 6e 67  over all sibling
26a60 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a   connections */.
26a70 20 20 75 38 20 61 6c 6c 4d 61 73 6b 3b 20 20 2f    u8 allMask;  /
26a80 2a 20 55 6e 69 6f 6e 20 6f 66 20 6c 6f 63 6b 73  * Union of locks
26a90 20 68 65 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74   held by connect
26aa0 69 6f 6e 73 20 6f 74 68 65 72 20 74 68 61 6e 20  ions other than 
26ab0 22 70 22 20 2a 2f 0a 0a 20 20 2f 2a 20 41 63 63  "p" */..  /* Acc
26ac0 65 73 73 20 74 6f 20 74 68 65 20 75 6e 69 78 53  ess to the unixS
26ad0 68 6d 46 69 6c 65 20 6f 62 6a 65 63 74 20 69 73  hmFile object is
26ae0 20 73 65 72 69 61 6c 69 7a 65 64 20 62 79 20 74   serialized by t
26af0 68 65 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 61  he caller */.  a
26b00 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
26b10 75 74 65 78 5f 68 65 6c 64 28 70 46 69 6c 65 2d  utex_held(pFile-
26b20 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a  >mutex) );..  /*
26b30 20 43 6f 6d 70 75 74 65 20 6c 6f 63 6b 73 20 68   Compute locks h
26b40 65 6c 64 20 62 79 20 73 69 62 6c 69 6e 67 20 63  eld by sibling c
26b50 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a 20 20  onnections */.  
26b60 61 6c 6c 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 66  allMask = 0;.  f
26b70 6f 72 28 70 58 3d 70 46 69 6c 65 2d 3e 70 46 69  or(pX=pFile->pFi
26b80 72 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e  rst; pX; pX=pX->
26b90 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  pNext){.    if( 
26ba0 70 58 3d 3d 70 20 29 20 63 6f 6e 74 69 6e 75 65  pX==p ) continue
26bb0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  ;.    assert( (p
26bc0 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20 28 70  X->exclMask & (p
26bd0 2d 3e 65 78 63 6c 4d 61 73 6b 7c 70 2d 3e 73 68  ->exclMask|p->sh
26be0 61 72 65 64 4d 61 73 6b 29 29 3d 3d 30 20 29 3b  aredMask))==0 );
26bf0 0a 20 20 20 20 61 6c 6c 4d 61 73 6b 20 7c 3d 20  .    allMask |= 
26c00 70 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b 3b 0a  pX->sharedMask;.
26c10 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 6f 63 6b    }..  /* Unlock
26c20 20 74 68 65 20 73 79 73 74 65 6d 2d 6c 65 76 65   the system-leve
26c30 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 69 66 28  l locks */.  if(
26c40 20 28 75 6e 6c 6f 63 6b 4d 61 73 6b 20 26 20 61   (unlockMask & a
26c50 6c 6c 4d 61 73 6b 29 21 3d 75 6e 6c 6f 63 6b 4d  llMask)!=unlockM
26c60 61 73 6b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ask ){.    rc = 
26c70 75 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63  unixShmSystemLoc
26c80 6b 28 70 46 69 6c 65 2c 20 46 5f 55 4e 4c 43 4b  k(pFile, F_UNLCK
26c90 2c 20 75 6e 6c 6f 63 6b 4d 61 73 6b 20 26 20 7e  , unlockMask & ~
26ca0 61 6c 6c 4d 61 73 6b 29 3b 0a 20 20 7d 65 6c 73  allMask);.  }els
26cb0 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  e{.    rc = SQLI
26cc0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  TE_OK;.  }..  /*
26cd0 20 55 6e 64 6f 20 74 68 65 20 6c 6f 63 61 6c 20   Undo the local 
26ce0 6c 6f 63 6b 73 20 2a 2f 0a 20 20 69 66 28 20 72  locks */.  if( r
26cf0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
26d00 20 20 20 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 20      p->exclMask 
26d10 26 3d 20 7e 75 6e 6c 6f 63 6b 4d 61 73 6b 3b 0a  &= ~unlockMask;.
26d20 20 20 20 20 70 2d 3e 73 68 61 72 65 64 4d 61 73      p->sharedMas
26d30 6b 20 26 3d 20 7e 75 6e 6c 6f 63 6b 4d 61 73 6b  k &= ~unlockMask
26d40 3b 0a 20 20 7d 20 0a 20 20 72 65 74 75 72 6e 20  ;.  } .  return 
26d50 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74  rc;.}../*.** Get
26d60 20 72 65 61 64 65 72 20 6c 6f 63 6b 73 20 66 6f   reader locks fo
26d70 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20 6f  r connection p o
26d80 6e 20 61 6c 6c 20 6c 6f 63 6b 73 20 69 6e 20 74  n all locks in t
26d90 68 65 20 72 65 61 64 4d 61 73 6b 20 70 61 72 61  he readMask para
26da0 6d 65 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  meter..*/.static
26db0 20 69 6e 74 20 75 6e 69 78 53 68 6d 53 68 61 72   int unixShmShar
26dc0 65 64 4c 6f 63 6b 28 0a 20 20 75 6e 69 78 53 68  edLock(.  unixSh
26dd0 6d 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 20  mFile *pFile,   
26de0 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e  /* The underlyin
26df0 67 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  g shared-memory 
26e00 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 53 68  file */.  unixSh
26e10 6d 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  m *p,           
26e20 2f 2a 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f  /* The connectio
26e30 6e 20 74 6f 20 67 65 74 20 74 68 65 20 73 68 61  n to get the sha
26e40 72 65 64 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 75  red locks */.  u
26e50 38 20 72 65 61 64 4d 61 73 6b 20 20 20 20 20 20  8 readMask      
26e60 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
26e70 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 74 6f 20  shared locks to 
26e80 62 65 20 61 63 71 75 69 72 65 64 20 2a 2f 0a 29  be acquired */.)
26e90 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
26ea0 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64     /* Result cod
26eb0 65 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a  e */.  unixShm *
26ec0 70 58 3b 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f  pX;   /* For loo
26ed0 70 69 6e 67 20 6f 76 65 72 20 61 6c 6c 20 73 69  ping over all si
26ee0 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e  bling connection
26ef0 73 20 2a 2f 0a 20 20 75 38 20 61 6c 6c 53 68 61  s */.  u8 allSha
26f00 72 65 64 3b 20 20 2f 2a 20 55 6e 69 6f 6e 20 6f  red;  /* Union o
26f10 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20  f locks held by 
26f20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 74 68 65  connections othe
26f30 72 20 74 68 61 6e 20 22 70 22 20 2a 2f 0a 0a 20  r than "p" */.. 
26f40 20 2f 2a 20 41 63 63 65 73 73 20 74 6f 20 74 68   /* Access to th
26f50 65 20 75 6e 69 78 53 68 6d 46 69 6c 65 20 6f 62  e unixShmFile ob
26f60 6a 65 63 74 20 69 73 20 73 65 72 69 61 6c 69 7a  ject is serializ
26f70 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ed by the caller
26f80 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71   */.  assert( sq
26f90 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
26fa0 28 70 46 69 6c 65 2d 3e 6d 75 74 65 78 29 20 29  (pFile->mutex) )
26fb0 3b 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 6f 75 74  ;..  /* Find out
26fc0 20 77 68 69 63 68 20 73 68 61 72 65 64 20 6c 6f   which shared lo
26fd0 63 6b 73 20 61 72 65 20 61 6c 72 65 61 64 79 20  cks are already 
26fe0 68 65 6c 64 20 62 79 20 73 69 62 6c 69 6e 67 20  held by sibling 
26ff0 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a 20 20 2a  connections..  *
27000 2a 20 49 66 20 61 6e 79 20 73 69 62 6c 69 6e 67  * If any sibling
27010 20 61 6c 72 65 61 64 79 20 68 6f 6c 64 73 20 61   already holds a
27020 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
27030 2c 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 72  , go ahead and r
27040 65 74 75 72 6e 0a 20 20 2a 2a 20 53 51 4c 49 54  eturn.  ** SQLIT
27050 45 5f 42 55 53 59 2e 0a 20 20 2a 2f 0a 20 20 61  E_BUSY..  */.  a
27060 6c 6c 53 68 61 72 65 64 20 3d 20 30 3b 0a 20 20  llShared = 0;.  
27070 66 6f 72 28 70 58 3d 70 46 69 6c 65 2d 3e 70 46  for(pX=pFile->pF
27080 69 72 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d  irst; pX; pX=pX-
27090 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
270a0 20 70 58 3d 3d 70 20 29 20 63 6f 6e 74 69 6e 75   pX==p ) continu
270b0 65 3b 0a 20 20 20 20 69 66 28 20 28 70 58 2d 3e  e;.    if( (pX->
270c0 65 78 63 6c 4d 61 73 6b 20 26 20 72 65 61 64 4d  exclMask & readM
270d0 61 73 6b 29 21 3d 30 20 29 20 72 65 74 75 72 6e  ask)!=0 ) return
270e0 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
270f0 20 20 61 6c 6c 53 68 61 72 65 64 20 7c 3d 20 70    allShared |= p
27100 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b 3b 0a 20  X->sharedMask;. 
27110 20 7d 0a 0a 20 20 2f 2a 20 47 65 74 20 73 68 61   }..  /* Get sha
27120 72 65 64 20 6c 6f 63 6b 73 20 61 74 20 74 68 65  red locks at the
27130 20 73 79 73 74 65 6d 20 6c 65 76 65 6c 2c 20 69   system level, i
27140 66 20 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a 20  f necessary */. 
27150 20 69 66 28 20 28 7e 61 6c 6c 53 68 61 72 65 64   if( (~allShared
27160 29 20 26 20 72 65 61 64 4d 61 73 6b 20 29 7b 0a  ) & readMask ){.
27170 20 20 20 20 72 63 20 3d 20 75 6e 69 78 53 68 6d      rc = unixShm
27180 53 79 73 74 65 6d 4c 6f 63 6b 28 70 46 69 6c 65  SystemLock(pFile
27190 2c 20 46 5f 52 44 4c 43 4b 2c 20 72 65 61 64 4d  , F_RDLCK, readM
271a0 61 73 6b 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ask);.  }else{. 
271b0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
271c0 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 74  K;.  }..  /* Get
271d0 20 74 68 65 20 6c 6f 63 61 6c 20 73 68 61 72 65   the local share
271e0 64 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 69 66 28  d locks */.  if(
271f0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
27200 7b 0a 20 20 20 20 70 2d 3e 73 68 61 72 65 64 4d  {.    p->sharedM
27210 61 73 6b 20 7c 3d 20 72 65 61 64 4d 61 73 6b 3b  ask |= readMask;
27220 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
27230 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 63  ;.}../*.** For c
27240 6f 6e 6e 65 63 74 69 6f 6e 20 70 2c 20 67 65 74  onnection p, get
27250 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
27260 63 6b 20 6f 6e 20 61 6c 6c 20 6c 6f 63 6b 73 20  ck on all locks 
27270 69 64 65 6e 74 69 66 69 65 64 20 69 6e 0a 2a 2a  identified in.**
27280 20 74 68 65 20 77 72 69 74 65 4d 61 73 6b 20 70   the writeMask p
27290 61 72 61 6d 65 74 65 72 2e 0a 2a 2f 0a 73 74 61  arameter..*/.sta
272a0 74 69 63 20 69 6e 74 20 75 6e 69 78 53 68 6d 45  tic int unixShmE
272b0 78 63 6c 75 73 69 76 65 4c 6f 63 6b 28 0a 20 20  xclusiveLock(.  
272c0 75 6e 69 78 53 68 6d 46 69 6c 65 20 2a 70 46 69  unixShmFile *pFi
272d0 6c 65 2c 20 20 20 20 2f 2a 20 54 68 65 20 75 6e  le,    /* The un
272e0 64 65 72 6c 79 69 6e 67 20 73 68 61 72 65 64 2d  derlying shared-
272f0 6d 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a 20  memory file */. 
27300 20 75 6e 69 78 53 68 6d 20 2a 70 2c 20 20 20 20   unixShm *p,    
27310 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
27320 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 67 65 74  onnection to get
27330 20 74 68 65 20 65 78 63 6c 75 73 69 76 65 20 6c   the exclusive l
27340 6f 63 6b 73 20 2a 2f 0a 20 20 75 38 20 77 72 69  ocks */.  u8 wri
27350 74 65 4d 61 73 6b 20 20 20 20 20 20 20 20 20 20  teMask          
27360 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 65 78 63 6c   /* Mask of excl
27370 75 73 69 76 65 20 6c 6f 63 6b 73 20 74 6f 20 62  usive locks to b
27380 65 20 61 63 71 75 69 72 65 64 20 2a 2f 0a 29 7b  e acquired */.){
27390 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
273a0 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
273b0 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70   */.  unixShm *p
273c0 58 3b 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70  X;   /* For loop
273d0 69 6e 67 20 6f 76 65 72 20 61 6c 6c 20 73 69 62  ing over all sib
273e0 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  ling connections
273f0 20 2a 2f 0a 0a 20 20 2f 2a 20 41 63 63 65 73 73   */..  /* Access
27400 20 74 6f 20 74 68 65 20 75 6e 69 78 53 68 6d 46   to the unixShmF
27410 69 6c 65 20 6f 62 6a 65 63 74 20 69 73 20 73 65  ile object is se
27420 72 69 61 6c 69 7a 65 64 20 62 79 20 74 68 65 20  rialized by the 
27430 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 61 73 73 65  caller */.  asse
27440 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
27450 78 5f 68 65 6c 64 28 70 46 69 6c 65 2d 3e 6d 75  x_held(pFile->mu
27460 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 4d 61  tex) );..  /* Ma
27470 6b 65 20 73 75 72 65 20 6e 6f 20 73 69 62 6c 69  ke sure no sibli
27480 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 68  ng connections h
27490 6f 6c 64 20 6c 6f 63 6b 73 20 74 68 61 74 20 77  old locks that w
274a0 69 6c 6c 20 62 6c 6f 63 6b 20 74 68 69 73 0a 20  ill block this. 
274b0 20 2a 2a 20 6c 6f 63 6b 2e 20 20 49 66 20 61 6e   ** lock.  If an
274c0 79 20 64 6f 2c 20 72 65 74 75 72 6e 20 53 51 4c  y do, return SQL
274d0 49 54 45 5f 42 55 53 59 20 72 69 67 68 74 20 61  ITE_BUSY right a
274e0 77 61 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  way..  */.  for(
274f0 70 58 3d 70 46 69 6c 65 2d 3e 70 46 69 72 73 74  pX=pFile->pFirst
27500 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65  ; pX; pX=pX->pNe
27510 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 58 3d  xt){.    if( pX=
27520 3d 70 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =p ) continue;. 
27530 20 20 20 69 66 28 20 28 70 58 2d 3e 65 78 63 6c     if( (pX->excl
27540 4d 61 73 6b 20 26 20 77 72 69 74 65 4d 61 73 6b  Mask & writeMask
27550 29 21 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  )!=0 ) return SQ
27560 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 69  LITE_BUSY;.    i
27570 66 28 20 28 70 58 2d 3e 73 68 61 72 65 64 4d 61  f( (pX->sharedMa
27580 73 6b 20 26 20 77 72 69 74 65 4d 61 73 6b 29 21  sk & writeMask)!
27590 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
275a0 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 0a 20 20  TE_BUSY;.  }..  
275b0 2f 2a 20 47 65 74 20 74 68 65 20 65 78 63 6c 75  /* Get the exclu
275c0 73 69 76 65 20 6c 6f 63 6b 73 20 61 74 20 74 68  sive locks at th
275d0 65 20 73 79 73 74 65 6d 20 6c 65 76 65 6c 2e 20  e system level. 
275e0 20 54 68 65 6e 20 69 66 20 73 75 63 63 65 73 73   Then if success
275f0 66 75 6c 0a 20 20 2a 2a 20 61 6c 73 6f 20 6d 61  ful.  ** also ma
27600 72 6b 20 74 68 65 20 6c 6f 63 61 6c 20 63 6f 6e  rk the local con
27610 6e 65 63 74 69 6f 6e 20 61 73 20 62 65 69 6e 67  nection as being
27620 20 6c 6f 63 6b 65 64 2e 0a 20 20 2a 2f 0a 20 20   locked..  */.  
27630 72 63 20 3d 20 75 6e 69 78 53 68 6d 53 79 73 74  rc = unixShmSyst
27640 65 6d 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 46 5f  emLock(pFile, F_
27650 57 52 4c 43 4b 2c 20 77 72 69 74 65 4d 61 73 6b  WRLCK, writeMask
27660 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
27670 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 2d  ITE_OK ){.    p-
27680 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 3d 20 7e  >sharedMask &= ~
27690 77 72 69 74 65 4d 61 73 6b 3b 0a 20 20 20 20 70  writeMask;.    p
276a0 2d 3e 65 78 63 6c 4d 61 73 6b 20 7c 3d 20 77 72  ->exclMask |= wr
276b0 69 74 65 4d 61 73 6b 3b 0a 20 20 7d 0a 20 20 72  iteMask;.  }.  r
276c0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
276d0 2a 2a 20 50 75 72 67 65 20 74 68 65 20 75 6e 69  ** Purge the uni
276e0 78 53 68 6d 46 69 6c 65 4c 69 73 74 20 6c 69 73  xShmFileList lis
276f0 74 20 6f 66 20 61 6c 6c 20 65 6e 74 72 69 65 73  t of all entries
27700 20 77 69 74 68 20 75 6e 69 78 53 68 6d 46 69 6c   with unixShmFil
27710 65 2e 6e 52 65 66 3d 3d 30 2e 0a 2a 2a 0a 2a 2a  e.nRef==0..**.**
27720 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20 56   This is not a V
27730 46 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  FS shared-memory
27740 20 6d 65 74 68 6f 64 3b 20 69 74 20 69 73 20 61   method; it is a
27750 20 75 74 69 6c 69 74 79 20 66 75 6e 63 74 69 6f   utility functio
27760 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20 62 79 20 56  n called.** by V
27770 46 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  FS shared-memory
27780 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a 73 74 61   methods..*/.sta
27790 74 69 63 20 76 6f 69 64 20 75 6e 69 78 53 68 6d  tic void unixShm
277a0 50 75 72 67 65 28 76 6f 69 64 29 7b 0a 20 20 75  Purge(void){.  u
277b0 6e 69 78 53 68 6d 46 69 6c 65 20 2a 2a 70 70 3b  nixShmFile **pp;
277c0 0a 20 20 75 6e 69 78 53 68 6d 46 69 6c 65 20 2a  .  unixShmFile *
277d0 70 3b 0a 20 20 61 73 73 65 72 74 28 20 75 6e 69  p;.  assert( uni
277e0 78 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a  xMutexHeld() );.
277f0 20 20 70 70 20 3d 20 26 75 6e 69 78 53 68 6d 46    pp = &unixShmF
27800 69 6c 65 4c 69 73 74 3b 0a 20 20 77 68 69 6c 65  ileList;.  while
27810 28 20 28 70 20 3d 20 2a 70 70 29 21 3d 30 20 29  ( (p = *pp)!=0 )
27820 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 52 65  {.    if( p->nRe
27830 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  f==0 ){.      if
27840 28 20 70 2d 3e 6d 75 74 65 78 20 29 20 73 71 6c  ( p->mutex ) sql
27850 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28  ite3_mutex_free(
27860 70 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 20  p->mutex);.     
27870 20 69 66 28 20 70 2d 3e 6d 75 74 65 78 42 75 66   if( p->mutexBuf
27880 20 29 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78   ) sqlite3_mutex
27890 5f 66 72 65 65 28 70 2d 3e 6d 75 74 65 78 42 75  _free(p->mutexBu
278a0 66 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  f);.      if( p-
278b0 3e 68 3e 3d 30 20 29 20 63 6c 6f 73 65 28 70 2d  >h>=0 ) close(p-
278c0 3e 68 29 3b 0a 20 20 20 20 20 20 2a 70 70 20 3d  >h);.      *pp =
278d0 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20   p->pNext;.     
278e0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
278f0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
27900 20 20 20 70 70 20 3d 20 26 70 2d 3e 70 4e 65 78     pp = &p->pNex
27910 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  t;.    }.  }.}..
27920 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 73 68 61  /*.** Open a sha
27930 72 65 64 2d 6d 65 6d 6f 72 79 20 61 72 65 61 2e  red-memory area.
27940 20 20 54 68 69 73 20 70 61 72 74 69 63 75 6c 61    This particula
27950 72 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  r implementation
27960 20 75 73 65 73 0a 2a 2a 20 6d 6d 61 70 70 65 64   uses.** mmapped
27970 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 7a 4e   files..**.** zN
27980 61 6d 65 20 69 73 20 61 20 66 69 6c 65 6e 61 6d  ame is a filenam
27990 65 20 75 73 65 64 20 74 6f 20 69 64 65 6e 74 69  e used to identi
279a0 66 79 20 74 68 65 20 73 68 61 72 65 64 2d 6d 65  fy the shared-me
279b0 6d 6f 72 79 20 61 72 65 61 2e 20 20 54 68 65 0a  mory area.  The.
279c0 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** implementatio
279d0 6e 20 64 6f 65 73 20 6e 6f 74 20 28 61 6e 64 20  n does not (and 
279e0 70 65 72 68 61 70 73 20 73 68 6f 75 6c 64 20 6e  perhaps should n
279f0 6f 74 29 20 75 73 65 20 74 68 69 73 20 6e 61 6d  ot) use this nam
27a00 65 0a 2a 2a 20 64 69 72 65 63 74 6c 79 2c 20 62  e.** directly, b
27a10 75 74 20 72 61 74 68 65 72 20 75 73 65 20 69 74  ut rather use it
27a20 20 61 73 20 61 20 74 65 6d 70 6c 61 74 65 20 66   as a template f
27a30 6f 72 20 66 69 6e 64 69 6e 67 20 61 6e 20 61 70  or finding an ap
27a40 70 72 6f 70 72 69 61 74 65 0a 2a 2a 20 6e 61 6d  propriate.** nam
27a50 65 20 66 6f 72 20 74 68 65 20 73 68 61 72 65 64  e for the shared
27a60 2d 6d 65 6d 6f 72 79 20 73 74 6f 72 61 67 65 2e  -memory storage.
27a70 20 20 49 6e 20 74 68 69 73 20 69 6d 70 6c 65 6d    In this implem
27a80 65 6e 74 61 74 69 6f 6e 2c 20 74 68 65 0a 2a 2a  entation, the.**
27a90 20 73 74 72 69 6e 67 20 22 2d 69 6e 64 65 78 22   string "-index"
27aa0 20 69 73 20 61 70 70 65 6e 64 65 64 20 74 6f 20   is appended to 
27ab0 7a 4e 61 6d 65 20 61 6e 64 20 75 73 65 64 20 61  zName and used a
27ac0 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
27ad0 65 0a 2a 2a 20 6d 6d 61 70 70 65 64 20 66 69 6c  e.** mmapped fil
27ae0 65 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 6f 70  e..**.** When op
27af0 65 6e 69 6e 67 20 61 20 6e 65 77 20 73 68 61 72  ening a new shar
27b00 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2c 20  ed-memory file, 
27b10 69 66 20 6e 6f 20 6f 74 68 65 72 20 69 6e 73 74  if no other inst
27b20 61 6e 63 65 73 20 6f 66 20 74 68 61 74 0a 2a 2a  ances of that.**
27b30 20 66 69 6c 65 20 61 72 65 20 63 75 72 72 65 6e   file are curren
27b40 74 6c 79 20 6f 70 65 6e 2c 20 69 6e 20 74 68 69  tly open, in thi
27b50 73 20 70 72 6f 63 65 73 73 20 6f 72 20 69 6e 20  s process or in 
27b60 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 2c  other processes,
27b70 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 66 69 6c   then.** the fil
27b80 65 20 6d 75 73 74 20 62 65 20 74 72 75 6e 63 61  e must be trunca
27b90 74 65 64 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67  ted to zero leng
27ba0 74 68 20 6f 72 20 68 61 76 65 20 69 74 73 20 68  th or have its h
27bb0 65 61 64 65 72 20 63 6c 65 61 72 65 64 2e 0a 2a  eader cleared..*
27bc0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
27bd0 78 53 68 6d 4f 70 65 6e 28 0a 20 20 73 71 6c 69  xShmOpen(.  sqli
27be0 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20  te3_vfs *pVfs,  
27bf0 20 20 2f 2a 20 54 68 65 20 56 46 53 20 2a 2f 0a    /* The VFS */.
27c00 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
27c10 61 6d 65 2c 20 20 20 20 2f 2a 20 42 61 73 65 20  ame,    /* Base 
27c20 6e 61 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f 20  name of file to 
27c30 6d 6d 61 70 20 2a 2f 0a 20 20 73 71 6c 69 74 65  mmap */.  sqlite
27c40 33 5f 73 68 6d 20 2a 2a 70 53 68 6d 20 20 20 20  3_shm **pShm    
27c50 2f 2a 20 57 72 69 74 65 20 74 68 65 20 75 6e 69  /* Write the uni
27c60 78 53 68 6d 20 6f 62 6a 65 63 74 20 63 72 65 61  xShm object crea
27c70 74 65 64 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  ted here */.){. 
27c80 20 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d 20   struct unixShm 
27c90 2a 70 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  *p = 0;         
27ca0 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 6e 65      /* The conne
27cb0 63 74 69 6f 6e 20 74 6f 20 62 65 20 6f 70 65 6e  ction to be open
27cc0 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 75  ed */.  struct u
27cd0 6e 69 78 53 68 6d 46 69 6c 65 20 2a 70 46 69 6c  nixShmFile *pFil
27ce0 65 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 54 68  e = 0;     /* Th
27cf0 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 6d 6d 61  e underlying mma
27d00 70 70 65 64 20 66 69 6c 65 20 2a 2f 0a 20 20 69  pped file */.  i
27d10 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
27d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27d30 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
27d40 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 75 6e 69   */.  struct uni
27d50 78 46 69 6c 65 49 64 20 66 69 64 3b 20 20 20 20  xFileId fid;    
27d60 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 69 78           /* Unix
27d70 20 66 69 6c 65 20 69 64 65 6e 74 69 66 69 65 72   file identifier
27d80 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 75 6e 69   */.  struct uni
27d90 78 53 68 6d 46 69 6c 65 20 2a 70 4e 65 77 3b 20  xShmFile *pNew; 
27da0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 6c           /* Newl
27db0 79 20 61 6c 6c 6f 63 61 74 65 64 20 70 46 69 6c  y allocated pFil
27dc0 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 74  e */.  struct st
27dd0 61 74 20 73 53 74 61 74 3b 20 20 20 20 20 20 20  at sStat;       
27de0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
27df0 75 6c 74 20 66 72 6f 6d 20 73 74 61 74 28 29 20  ult from stat() 
27e00 61 6e 20 66 73 74 61 74 28 29 20 2a 2f 0a 20 20  an fstat() */.  
27e10 69 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20  int nName;      
27e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27e30 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 7a 4e     /* Size of zN
27e40 61 6d 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  ame in bytes */.
27e50 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73  .  /* Allocate s
27e60 70 61 63 65 20 66 6f 72 20 74 68 65 20 6e 65 77  pace for the new
27e70 20 73 71 6c 69 74 65 33 5f 73 68 6d 20 6f 62 6a   sqlite3_shm obj
27e80 65 63 74 2e 20 20 41 6c 73 6f 20 73 70 65 63 75  ect.  Also specu
27e90 6c 61 74 69 76 65 6c 79 0a 20 20 2a 2a 20 61 6c  latively.  ** al
27ea0 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72  locate space for
27eb0 20 61 20 6e 65 77 20 75 6e 69 78 53 68 6d 46 69   a new unixShmFi
27ec0 6c 65 20 61 6e 64 20 66 69 6c 65 6e 61 6d 65 2e  le and filename.
27ed0 0a 20 20 2a 2f 0a 20 20 70 20 3d 20 73 71 6c 69  .  */.  p = sqli
27ee0 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65  te3_malloc( size
27ef0 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69 66 28 20  of(*p) );.  if( 
27f00 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  p==0 ) return SQ
27f10 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d 65  LITE_NOMEM;.  me
27f20 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f  mset(p, 0, sizeo
27f30 66 28 2a 70 29 29 3b 0a 20 20 6e 4e 61 6d 65 20  f(*p));.  nName 
27f40 3d 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 3b  = strlen(zName);
27f50 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
27f60 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  3_malloc( sizeof
27f70 28 2a 70 46 69 6c 65 29 20 2b 20 6e 4e 61 6d 65  (*pFile) + nName
27f80 20 2b 20 31 30 20 29 3b 0a 20 20 69 66 28 20 70   + 10 );.  if( p
27f90 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  New==0 ){.    sq
27fa0 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
27fb0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
27fc0 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 6d 65  _NOMEM;.  }.  me
27fd0 6d 73 65 74 28 70 4e 65 77 2c 20 30 2c 20 73 69  mset(pNew, 0, si
27fe0 7a 65 6f 66 28 2a 70 4e 65 77 29 29 3b 0a 20 20  zeof(*pNew));.  
27ff0 70 4e 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20  pNew->zFilename 
28000 3d 20 28 63 68 61 72 2a 29 26 70 4e 65 77 5b 31  = (char*)&pNew[1
28010 5d 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  ];.  sqlite3_snp
28020 72 69 6e 74 66 28 6e 4e 61 6d 65 2b 31 30 2c 20  rintf(nName+10, 
28030 70 4e 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c  pNew->zFilename,
28040 20 22 25 73 2d 69 6e 64 65 78 22 2c 20 7a 4e 61   "%s-index", zNa
28050 6d 65 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20  me);..  /* Look 
28060 74 6f 20 73 65 65 20 69 66 20 74 68 65 72 65 20  to see if there 
28070 69 73 20 61 6e 20 65 78 69 73 74 69 6e 67 20 75  is an existing u
28080 6e 69 78 53 68 6d 46 69 6c 65 20 74 68 61 74 20  nixShmFile that 
28090 63 61 6e 20 62 65 20 75 73 65 64 2e 0a 20 20 2a  can be used..  *
280a0 2a 20 49 66 20 6e 6f 20 6d 61 74 63 68 69 6e 67  * If no matching
280b0 20 75 6e 69 78 53 68 6d 46 69 6c 65 20 63 75 72   unixShmFile cur
280c0 72 65 6e 74 6c 79 20 65 78 69 73 74 73 2c 20 63  rently exists, c
280d0 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 2e  reate a new one.
280e0 0a 20 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65  .  */.  unixEnte
280f0 72 4d 75 74 65 78 28 29 3b 0a 20 20 72 63 20 3d  rMutex();.  rc =
28100 20 73 74 61 74 28 70 4e 65 77 2d 3e 7a 46 69 6c   stat(pNew->zFil
28110 65 6e 61 6d 65 2c 20 26 73 53 74 61 74 29 3b 0a  ename, &sStat);.
28120 20 20 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20    if( rc==0 ){. 
28130 20 20 20 6d 65 6d 73 65 74 28 26 66 69 64 2c 20     memset(&fid, 
28140 30 2c 20 73 69 7a 65 6f 66 28 66 69 64 29 29 3b  0, sizeof(fid));
28150 0a 20 20 20 20 66 69 64 2e 64 65 76 20 3d 20 73  .    fid.dev = s
28160 53 74 61 74 2e 73 74 5f 64 65 76 3b 0a 20 20 20  Stat.st_dev;.   
28170 20 66 69 64 2e 69 6e 6f 20 3d 20 73 53 74 61 74   fid.ino = sStat
28180 2e 73 74 5f 69 6e 6f 3b 0a 20 20 20 20 66 6f 72  .st_ino;.    for
28190 28 70 46 69 6c 65 20 3d 20 75 6e 69 78 53 68 6d  (pFile = unixShm
281a0 46 69 6c 65 4c 69 73 74 3b 20 70 46 69 6c 65 3b  FileList; pFile;
281b0 20 70 46 69 6c 65 3d 70 46 69 6c 65 2d 3e 70 4e   pFile=pFile->pN
281c0 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ext){.      if( 
281d0 6d 65 6d 63 6d 70 28 26 70 46 69 6c 65 2d 3e 66  memcmp(&pFile->f
281e0 69 64 2c 20 26 66 69 64 2c 20 73 69 7a 65 6f 66  id, &fid, sizeof
281f0 28 66 69 64 29 29 3d 3d 30 20 29 20 62 72 65 61  (fid))==0 ) brea
28200 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  k;.    }.  }.  i
28210 66 28 20 70 46 69 6c 65 20 29 7b 0a 20 20 20 20  f( pFile ){.    
28220 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65  sqlite3_free(pNe
28230 77 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  w);.  }else{.   
28240 20 70 46 69 6c 65 20 3d 20 70 4e 65 77 3b 0a 20   pFile = pNew;. 
28250 20 20 20 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20     pNew = 0;.   
28260 20 70 46 69 6c 65 2d 3e 68 20 3d 20 2d 31 3b 0a   pFile->h = -1;.
28270 20 20 20 20 70 46 69 6c 65 2d 3e 70 4e 65 78 74      pFile->pNext
28280 20 3d 20 75 6e 69 78 53 68 6d 46 69 6c 65 4c 69   = unixShmFileLi
28290 73 74 3b 0a 20 20 20 20 75 6e 69 78 53 68 6d 46  st;.    unixShmF
282a0 69 6c 65 4c 69 73 74 20 3d 20 70 46 69 6c 65 3b  ileList = pFile;
282b0 0a 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6d 75 74  ..    pFile->mut
282c0 65 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d 75 74  ex = sqlite3_mut
282d0 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  ex_alloc(SQLITE_
282e0 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a 20 20 20  MUTEX_FAST);.   
282f0 20 69 66 28 20 70 46 69 6c 65 2d 3e 6d 75 74 65   if( pFile->mute
28300 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  x==0 ){.      rc
28310 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
28320 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f  .      goto shm_
28330 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a  open_err;.    }.
28340 20 20 20 20 70 46 69 6c 65 2d 3e 6d 75 74 65 78      pFile->mutex
28350 42 75 66 20 3d 20 73 71 6c 69 74 65 33 5f 6d 75  Buf = sqlite3_mu
28360 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45  tex_alloc(SQLITE
28370 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a 20 20  _MUTEX_FAST);.  
28380 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6d 75 74    if( pFile->mut
28390 65 78 42 75 66 3d 3d 30 20 29 7b 0a 20 20 20 20  exBuf==0 ){.    
283a0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
283b0 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  MEM;.      goto 
283c0 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20  shm_open_err;.  
283d0 20 20 7d 0a 0a 20 20 20 20 70 46 69 6c 65 2d 3e    }..    pFile->
283e0 68 20 3d 20 6f 70 65 6e 28 70 46 69 6c 65 2d 3e  h = open(pFile->
283f0 7a 46 69 6c 65 6e 61 6d 65 2c 20 4f 5f 52 44 57  zFilename, O_RDW
28400 52 7c 4f 5f 43 52 45 41 54 2c 20 30 36 36 34 29  R|O_CREAT, 0664)
28410 3b 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d  ;.    if( pFile-
28420 3e 68 3c 30 20 29 7b 0a 20 20 20 20 20 20 72 63  >h<0 ){.      rc
28430 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50   = SQLITE_CANTOP
28440 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67  EN_BKPT;.      g
28450 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72  oto shm_open_err
28460 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 20  ;.    }..    rc 
28470 3d 20 66 73 74 61 74 28 70 46 69 6c 65 2d 3e 68  = fstat(pFile->h
28480 2c 20 26 73 53 74 61 74 29 3b 0a 20 20 20 20 69  , &sStat);.    i
28490 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72  f( rc ){.      r
284a0 63 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  c = SQLITE_CANTO
284b0 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  PEN_BKPT;.      
284c0 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72  goto shm_open_er
284d0 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 69  r;.    }.    pFi
284e0 6c 65 2d 3e 66 69 64 2e 64 65 76 20 3d 20 73 53  le->fid.dev = sS
284f0 74 61 74 2e 73 74 5f 64 65 76 3b 0a 20 20 20 20  tat.st_dev;.    
28500 70 46 69 6c 65 2d 3e 66 69 64 2e 69 6e 6f 20 3d  pFile->fid.ino =
28510 20 73 53 74 61 74 2e 73 74 5f 69 6e 6f 3b 0a 0a   sStat.st_ino;..
28520 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20      /* Check to 
28530 73 65 65 20 69 66 20 61 6e 6f 74 68 65 72 20 70  see if another p
28540 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 69 6e  rocess is holdin
28550 67 20 74 68 65 20 64 65 61 64 2d 6d 61 6e 20 73  g the dead-man s
28560 77 69 74 63 68 2e 0a 20 20 20 20 2a 2a 20 49 66  witch..    ** If
28570 20 6e 6f 74 2c 20 74 72 75 6e 63 61 74 65 20 74   not, truncate t
28580 68 65 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20  he file to zero 
28590 6c 65 6e 67 74 68 2e 20 0a 20 20 20 20 2a 2f 0a  length. .    */.
285a0 20 20 20 20 69 66 28 20 75 6e 69 78 53 68 6d 53      if( unixShmS
285b0 79 73 74 65 6d 4c 6f 63 6b 28 70 46 69 6c 65 2c  ystemLock(pFile,
285c0 20 46 5f 57 52 4c 43 4b 2c 20 55 4e 49 58 5f 53   F_WRLCK, UNIX_S
285d0 48 4d 5f 44 4d 53 29 3d 3d 53 51 4c 49 54 45 5f  HM_DMS)==SQLITE_
285e0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  OK ){.      if( 
285f0 66 74 72 75 6e 63 61 74 65 28 70 46 69 6c 65 2d  ftruncate(pFile-
28600 3e 68 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20  >h, 0) ){.      
28610 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
28620 45 52 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ERR;.      }.   
28630 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
28640 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
28650 20 20 72 63 20 3d 20 75 6e 69 78 53 68 6d 53 79    rc = unixShmSy
28660 73 74 65 6d 4c 6f 63 6b 28 70 46 69 6c 65 2c 20  stemLock(pFile, 
28670 46 5f 52 44 4c 43 4b 2c 20 55 4e 49 58 5f 53 48  F_RDLCK, UNIX_SH
28680 4d 5f 44 4d 53 29 3b 0a 20 20 20 20 7d 0a 20 20  M_DMS);.    }.  
28690 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
286a0 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20  shm_open_err;.  
286b0 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 74 68 65  }..  /* Make the
286c0 20 6e 65 77 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   new connection 
286d0 61 20 63 68 69 6c 64 20 6f 66 20 74 68 65 20 75  a child of the u
286e0 6e 69 78 53 68 6d 46 69 6c 65 20 2a 2f 0a 20 20  nixShmFile */.  
286f0 70 2d 3e 70 46 69 6c 65 20 3d 20 70 46 69 6c 65  p->pFile = pFile
28700 3b 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70  ;.  p->pNext = p
28710 46 69 6c 65 2d 3e 70 46 69 72 73 74 3b 0a 23 69  File->pFirst;.#i
28720 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
28730 47 0a 20 20 70 2d 3e 69 64 20 3d 20 70 46 69 6c  G.  p->id = pFil
28740 65 2d 3e 6e 65 78 74 53 68 6d 49 64 2b 2b 3b 0a  e->nextShmId++;.
28750 23 65 6e 64 69 66 0a 20 20 70 46 69 6c 65 2d 3e  #endif.  pFile->
28760 70 46 69 72 73 74 20 3d 20 70 3b 0a 20 20 70 46  pFirst = p;.  pF
28770 69 6c 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 2a  ile->nRef++;.  *
28780 70 53 68 6d 20 3d 20 28 73 71 6c 69 74 65 33 5f  pShm = (sqlite3_
28790 73 68 6d 2a 29 70 3b 0a 20 20 75 6e 69 78 4c 65  shm*)p;.  unixLe
287a0 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 72 65  aveMutex();.  re
287b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
287c0 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20  .  /* Jump here 
287d0 6f 6e 20 61 6e 79 20 65 72 72 6f 72 20 2a 2f 0a  on any error */.
287e0 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3a 0a 20 20  shm_open_err:.  
287f0 75 6e 69 78 53 68 6d 50 75 72 67 65 28 29 3b 20  unixShmPurge(); 
28800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28810 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20 66 72 65  /* This call fre
28820 65 73 20 70 46 69 6c 65 20 69 66 20 72 65 71 75  es pFile if requ
28830 69 72 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ired */.  sqlite
28840 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 73 71 6c  3_free(p);.  sql
28850 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77 29 3b  ite3_free(pNew);
28860 0a 20 20 2a 70 53 68 6d 20 3d 20 30 3b 0a 20 20  .  *pShm = 0;.  
28870 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
28880 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
28890 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20  ../*.** Close a 
288a0 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 73 68  connection to sh
288b0 61 72 65 64 2d 6d 65 6d 6f 72 79 2e 20 20 44 65  ared-memory.  De
288c0 6c 65 74 65 20 74 68 65 20 75 6e 64 65 72 6c 79  lete the underly
288d0 69 6e 67 20 0a 2a 2a 20 73 74 6f 72 61 67 65 20  ing .** storage 
288e0 69 66 20 64 65 6c 65 74 65 46 6c 61 67 20 69 73  if deleteFlag is
288f0 20 74 72 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   true..*/.static
28900 20 69 6e 74 20 75 6e 69 78 53 68 6d 43 6c 6f 73   int unixShmClos
28910 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  e(.  sqlite3_vfs
28920 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20 20   *pVfs,         
28930 2f 2a 20 54 68 65 20 56 46 53 20 2a 2f 0a 20 20  /* The VFS */.  
28940 73 71 6c 69 74 65 33 5f 73 68 6d 20 2a 70 53 68  sqlite3_shm *pSh
28950 61 72 65 64 4d 65 6d 2c 20 20 20 2f 2a 20 54 68  aredMem,   /* Th
28960 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  e shared-memory 
28970 74 6f 20 62 65 20 63 6c 6f 73 65 64 20 2a 2f 0a  to be closed */.
28980 20 20 69 6e 74 20 64 65 6c 65 74 65 46 6c 61 67    int deleteFlag
28990 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
289a0 44 65 6c 65 74 65 20 61 66 74 65 72 20 63 6c 6f  Delete after clo
289b0 73 69 6e 67 20 69 66 20 74 72 75 65 20 2a 2f 0a  sing if true */.
289c0 29 7b 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 3b  ){.  unixShm *p;
289d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
289e0 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f  he connection to
289f0 20 62 65 20 63 6c 6f 73 65 64 20 2a 2f 0a 20 20   be closed */.  
28a00 75 6e 69 78 53 68 6d 46 69 6c 65 20 2a 70 46 69  unixShmFile *pFi
28a10 6c 65 3b 20 20 20 20 2f 2a 20 54 68 65 20 75 6e  le;    /* The un
28a20 64 65 72 6c 79 69 6e 67 20 73 68 61 72 65 64 2d  derlying shared-
28a30 6d 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a 20  memory file */. 
28a40 20 75 6e 69 78 53 68 6d 20 2a 2a 70 70 3b 20 20   unixShm **pp;  
28a50 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c          /* For l
28a60 6f 6f 70 69 6e 67 20 6f 76 65 72 20 73 69 62 6c  ooping over sibl
28a70 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  ing connections 
28a80 2a 2f 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  */..  UNUSED_PAR
28a90 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20  AMETER(pVfs);.  
28aa0 69 66 28 20 70 53 68 61 72 65 64 4d 65 6d 3d 3d  if( pSharedMem==
28ab0 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
28ac0 45 5f 4f 4b 3b 0a 20 20 70 20 3d 20 28 73 74 72  E_OK;.  p = (str
28ad0 75 63 74 20 75 6e 69 78 53 68 6d 2a 29 70 53 68  uct unixShm*)pSh
28ae0 61 72 65 64 4d 65 6d 3b 0a 20 20 70 46 69 6c 65  aredMem;.  pFile
28af0 20 3d 20 70 2d 3e 70 46 69 6c 65 3b 0a 0a 20 20   = p->pFile;..  
28b00 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74  /* Verify that t
28b10 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 62 65  he connection be
28b20 69 6e 67 20 63 6c 6f 73 65 64 20 68 6f 6c 64 73  ing closed holds
28b30 20 6e 6f 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 61   no locks */.  a
28b40 73 73 65 72 74 28 20 70 2d 3e 65 78 63 6c 4d 61  ssert( p->exclMa
28b50 73 6b 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  sk==0 );.  asser
28b60 74 28 20 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b  t( p->sharedMask
28b70 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 6d  ==0 );..  /* Rem
28b80 6f 76 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70  ove connection p
28b90 20 66 72 6f 6d 20 74 68 65 20 73 65 74 20 6f 66   from the set of
28ba0 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 73 73   connections ass
28bb0 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 46 69  ociated with pFi
28bc0 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  le */.  sqlite3_
28bd0 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 46 69 6c  mutex_enter(pFil
28be0 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 66 6f 72  e->mutex);.  for
28bf0 28 70 70 3d 26 70 46 69 6c 65 2d 3e 70 46 69 72  (pp=&pFile->pFir
28c00 73 74 3b 20 28 2a 70 70 29 21 3d 70 3b 20 70 70  st; (*pp)!=p; pp
28c10 20 3d 20 26 28 2a 70 70 29 2d 3e 70 4e 65 78 74   = &(*pp)->pNext
28c20 29 7b 7d 0a 20 20 2a 70 70 20 3d 20 70 2d 3e 70  ){}.  *pp = p->p
28c30 4e 65 78 74 3b 0a 0a 20 20 2f 2a 20 46 72 65 65  Next;..  /* Free
28c40 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
28c50 70 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  p */.  sqlite3_f
28c60 72 65 65 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  ree(p);.  sqlite
28c70 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 46  3_mutex_leave(pF
28c80 69 6c 65 2d 3e 6d 75 74 65 78 29 3b 0a 0a 20 20  ile->mutex);..  
28c90 2f 2a 20 49 66 20 70 46 69 6c 65 2d 3e 6e 52 65  /* If pFile->nRe
28ca0 66 20 68 61 73 20 72 65 61 63 68 65 64 20 30 2c  f has reached 0,
28cb0 20 74 68 65 6e 20 63 6c 6f 73 65 20 74 68 65 20   then close the 
28cc0 75 6e 64 65 72 6c 79 69 6e 67 0a 20 20 2a 2a 20  underlying.  ** 
28cd0 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69  shared-memory fi
28ce0 6c 65 2c 20 74 6f 6f 20 2a 2f 0a 20 20 75 6e 69  le, too */.  uni
28cf0 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  xEnterMutex();. 
28d00 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e   assert( pFile->
28d10 6e 52 65 66 3e 30 20 29 3b 0a 20 20 70 46 69 6c  nRef>0 );.  pFil
28d20 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28  e->nRef--;.  if(
28d30 20 70 46 69 6c 65 2d 3e 6e 52 65 66 3d 3d 30 20   pFile->nRef==0 
28d40 29 7b 0a 20 20 20 20 69 66 28 20 64 65 6c 65 74  ){.    if( delet
28d50 65 46 6c 61 67 20 29 20 75 6e 6c 69 6e 6b 28 70  eFlag ) unlink(p
28d60 46 69 6c 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29  File->zFilename)
28d70 3b 0a 20 20 20 20 75 6e 69 78 53 68 6d 50 75 72  ;.    unixShmPur
28d80 67 65 28 29 3b 0a 20 20 7d 0a 20 20 75 6e 69 78  ge();.  }.  unix
28d90 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 0a 20  LeaveMutex();.. 
28da0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
28db0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72  K;.}../*.** Quer
28dc0 79 20 61 6e 64 2f 6f 72 20 63 68 61 6e 67 65 73  y and/or changes
28dd0 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
28de0 20 75 6e 64 65 72 6c 79 69 6e 67 20 73 74 6f 72   underlying stor
28df0 61 67 65 20 66 6f 72 0a 2a 2a 20 61 20 73 68 61  age for.** a sha
28e00 72 65 64 2d 6d 65 6d 6f 72 79 20 73 65 67 6d 65  red-memory segme
28e10 6e 74 2e 20 20 54 68 65 20 72 65 71 53 69 7a 65  nt.  The reqSize
28e20 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68   parameter is th
28e30 65 20 6e 65 77 20 73 69 7a 65 0a 2a 2a 20 6f 66  e new size.** of
28e40 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   the underlying 
28e50 73 74 6f 72 61 67 65 2c 20 6f 72 20 2d 31 20 74  storage, or -1 t
28e60 6f 20 64 6f 20 6a 75 73 74 20 61 20 71 75 65 72  o do just a quer
28e70 79 2e 20 20 54 68 65 20 73 69 7a 65 0a 2a 2a 20  y.  The size.** 
28e80 6f 66 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  of the underlyin
28e90 67 20 73 74 6f 72 61 67 65 20 28 61 66 74 65 72  g storage (after
28ea0 20 72 65 73 69 7a 69 6e 67 20 69 66 20 72 65 73   resizing if res
28eb0 69 7a 69 6e 67 20 6f 63 63 75 72 73 29 20 69 73  izing occurs) is
28ec0 0a 2a 2a 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  .** written into
28ed0 20 70 4e 65 77 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a   pNewSize..**.**
28ee0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f   This routine do
28ef0 65 73 20 6e 6f 74 20 28 6e 65 63 65 73 73 61 72  es not (necessar
28f00 69 6c 79 29 20 63 68 61 6e 67 65 20 74 68 65 20  ily) change the 
28f10 73 69 7a 65 20 6f 66 20 74 68 65 20 6d 61 70 70  size of the mapp
28f20 69 6e 67 20 0a 2a 2a 20 6f 66 20 74 68 65 20 75  ing .** of the u
28f30 6e 64 65 72 6c 79 69 6e 67 20 73 74 6f 72 61 67  nderlying storag
28f40 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 20 20  e into memory.  
28f50 55 73 65 20 78 53 68 6d 47 65 74 28 29 20 74 6f  Use xShmGet() to
28f60 20 63 68 61 6e 67 65 0a 2a 2a 20 74 68 65 20 6d   change.** the m
28f70 61 70 70 69 6e 67 20 73 69 7a 65 2e 0a 2a 2a 0a  apping size..**.
28f80 2a 2a 20 54 68 65 20 72 65 71 53 69 7a 65 20 70  ** The reqSize p
28f90 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20  arameter is the 
28fa0 6d 69 6e 69 6d 75 6d 20 73 69 7a 65 20 72 65 71  minimum size req
28fb0 75 65 73 74 65 64 2e 20 20 54 68 65 20 69 6d 70  uested.  The imp
28fc0 6c 65 6d 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 69  lementation.** i
28fd0 73 20 66 72 65 65 20 74 6f 20 65 78 70 61 6e 64  s free to expand
28fe0 20 74 68 65 20 73 74 6f 72 61 67 65 20 74 6f 20   the storage to 
28ff0 73 6f 6d 65 20 6c 61 72 67 65 72 20 61 6d 6f 75  some larger amou
29000 6e 74 20 69 66 20 69 74 20 63 68 6f 6f 73 65 73  nt if it chooses
29010 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
29020 75 6e 69 78 53 68 6d 53 69 7a 65 28 0a 20 20 73  unixShmSize(.  s
29030 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
29040 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ,        /* The 
29050 56 46 53 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  VFS */.  sqlite3
29060 5f 73 68 6d 20 2a 70 53 68 61 72 65 64 4d 65 6d  _shm *pSharedMem
29070 2c 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 72 65  ,  /* Pointer re
29080 74 75 72 6e 65 64 20 62 79 20 75 6e 69 78 53 68  turned by unixSh
29090 6d 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 69 6e 74  mOpen() */.  int
290a0 20 72 65 71 53 69 7a 65 2c 20 20 20 20 20 20 20   reqSize,       
290b0 20 20 20 20 20 20 20 2f 2a 20 52 65 71 75 65 73         /* Reques
290c0 74 65 64 20 73 69 7a 65 2e 20 20 2d 31 20 66 6f  ted size.  -1 fo
290d0 72 20 71 75 65 72 79 20 6f 6e 6c 79 20 2a 2f 0a  r query only */.
290e0 20 20 69 6e 74 20 2a 70 4e 65 77 53 69 7a 65 20    int *pNewSize 
290f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
29100 72 69 74 65 20 6e 65 77 20 73 69 7a 65 20 68 65  rite new size he
29110 72 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 53  re */.){.  unixS
29120 68 6d 20 2a 70 20 3d 20 28 75 6e 69 78 53 68 6d  hm *p = (unixShm
29130 2a 29 70 53 68 61 72 65 64 4d 65 6d 3b 0a 20 20  *)pSharedMem;.  
29140 75 6e 69 78 53 68 6d 46 69 6c 65 20 2a 70 46 69  unixShmFile *pFi
29150 6c 65 20 3d 20 70 2d 3e 70 46 69 6c 65 3b 0a 20  le = p->pFile;. 
29160 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
29170 5f 4f 4b 3b 0a 20 20 73 74 72 75 63 74 20 73 74  _OK;.  struct st
29180 61 74 20 73 53 74 61 74 3b 0a 0a 20 20 55 4e 55  at sStat;..  UNU
29190 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56  SED_PARAMETER(pV
291a0 66 73 29 3b 0a 0a 20 20 69 66 28 20 72 65 71 53  fs);..  if( reqS
291b0 69 7a 65 3e 3d 30 20 29 7b 0a 20 20 20 20 72 65  ize>=0 ){.    re
291c0 71 53 69 7a 65 20 3d 20 28 72 65 71 53 69 7a 65  qSize = (reqSize
291d0 20 2b 20 53 51 4c 49 54 45 5f 55 4e 49 58 5f 53   + SQLITE_UNIX_S
291e0 48 4d 5f 49 4e 43 52 20 2d 20 31 29 2f 53 51 4c  HM_INCR - 1)/SQL
291f0 49 54 45 5f 55 4e 49 58 5f 53 48 4d 5f 49 4e 43  ITE_UNIX_SHM_INC
29200 52 3b 0a 20 20 20 20 72 65 71 53 69 7a 65 20 2a  R;.    reqSize *
29210 3d 20 53 51 4c 49 54 45 5f 55 4e 49 58 5f 53 48  = SQLITE_UNIX_SH
29220 4d 5f 49 4e 43 52 3b 0a 20 20 20 20 72 63 20 3d  M_INCR;.    rc =
29230 20 66 74 72 75 6e 63 61 74 65 28 70 46 69 6c 65   ftruncate(pFile
29240 2d 3e 68 2c 20 72 65 71 53 69 7a 65 29 3b 0a 20  ->h, reqSize);. 
29250 20 7d 0a 20 20 69 66 28 20 66 73 74 61 74 28 70   }.  if( fstat(p
29260 46 69 6c 65 2d 3e 68 2c 20 26 73 53 74 61 74 29  File->h, &sStat)
29270 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 4e 65 77  ==0 ){.    *pNew
29280 53 69 7a 65 20 3d 20 28 69 6e 74 29 73 53 74 61  Size = (int)sSta
29290 74 2e 73 74 5f 73 69 7a 65 3b 0a 20 20 7d 65 6c  t.st_size;.  }el
292a0 73 65 7b 0a 20 20 20 20 2a 70 4e 65 77 53 69 7a  se{.    *pNewSiz
292b0 65 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20  e = 0;.    rc = 
292c0 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20  SQLITE_IOERR;.  
292d0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
292e0 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 61 70 20 74 68 65  .../*.** Map the
292f0 20 73 68 61 72 65 64 20 73 74 6f 72 61 67 65 20   shared storage 
29300 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 20 20 54 68  into memory.  Th
29310 65 20 6d 69 6e 69 6d 75 6d 20 73 69 7a 65 20 6f  e minimum size o
29320 66 20 74 68 65 0a 2a 2a 20 6d 61 70 70 69 6e 67  f the.** mapping
29330 20 73 68 6f 75 6c 64 20 62 65 20 72 65 71 4d 61   should be reqMa
29340 70 53 69 7a 65 20 69 66 20 72 65 71 4d 61 70 53  pSize if reqMapS
29350 69 7a 65 20 69 73 20 70 6f 73 69 74 69 76 65 2e  ize is positive.
29360 20 20 49 66 0a 2a 2a 20 72 65 71 4d 61 70 53 69    If.** reqMapSi
29370 7a 65 20 69 73 20 7a 65 72 6f 20 6f 72 20 6e 65  ze is zero or ne
29380 67 61 74 69 76 65 2c 20 74 68 65 20 69 6d 70 6c  gative, the impl
29390 65 6d 65 6e 74 61 74 69 6f 6e 20 63 61 6e 20 63  ementation can c
293a0 68 6f 6f 73 65 0a 2a 2a 20 77 68 61 74 65 76 65  hoose.** whateve
293b0 72 20 6d 61 70 70 69 6e 67 20 73 69 7a 65 20 69  r mapping size i
293c0 73 20 63 6f 6e 76 65 6e 69 65 6e 74 2e 0a 2a 2a  s convenient..**
293d0 0a 2a 2a 20 2a 70 70 42 75 66 20 69 73 20 6d 61  .** *ppBuf is ma
293e0 64 65 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  de to point to t
293f0 68 65 20 6d 65 6d 6f 72 79 20 77 68 69 63 68 20  he memory which 
29400 69 73 20 61 20 6d 61 70 70 69 6e 67 20 6f 66 20  is a mapping of 
29410 74 68 65 0a 2a 2a 20 75 6e 64 65 72 6c 79 69 6e  the.** underlyin
29420 67 20 73 74 6f 72 61 67 65 2e 20 20 41 20 6d 75  g storage.  A mu
29430 74 65 78 20 69 73 20 61 63 71 75 69 72 65 64 20  tex is acquired 
29440 74 6f 20 70 72 65 76 65 6e 74 20 6f 74 68 65 72  to prevent other
29450 20 74 68 72 65 61 64 73 0a 2a 2a 20 66 72 6f 6d   threads.** from
29460 20 72 75 6e 6e 69 6e 67 20 77 68 69 6c 65 20 2a   running while *
29470 70 70 42 75 66 20 69 73 20 69 6e 20 75 73 65 20  ppBuf is in use 
29480 69 6e 20 6f 72 64 65 72 20 74 6f 20 70 72 65 76  in order to prev
29490 65 6e 74 20 6f 74 68 65 72 20 74 68 72 65 61 64  ent other thread
294a0 73 0a 2a 2a 20 72 65 6d 61 70 70 69 6e 67 20 2a  s.** remapping *
294b0 70 70 42 75 66 20 6f 75 74 20 66 72 6f 6d 20 75  ppBuf out from u
294c0 6e 64 65 72 20 74 68 69 73 20 74 68 72 65 61 64  nder this thread
294d0 2e 20 20 54 68 65 20 75 6e 69 78 53 68 6d 52 65  .  The unixShmRe
294e0 6c 65 61 73 65 28 29 0a 2a 2a 20 63 61 6c 6c 20  lease().** call 
294f0 77 69 6c 6c 20 72 65 6c 65 61 73 65 20 74 68 65  will release the
29500 20 6d 75 74 65 78 2e 20 20 48 6f 77 65 76 65 72   mutex.  However
29510 2c 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 73 74  , if the lock st
29520 61 74 65 20 69 73 20 43 48 45 43 4b 50 4f 49 4e  ate is CHECKPOIN
29530 54 2c 0a 2a 2a 20 74 68 65 20 6d 75 74 65 78 20  T,.** the mutex 
29540 69 73 20 6e 6f 74 20 61 63 71 75 69 72 65 64 20  is not acquired 
29550 62 65 63 61 75 73 65 20 43 48 45 43 4b 50 4f 49  because CHECKPOI
29560 4e 54 20 77 69 6c 6c 20 6e 65 76 65 72 20 72 65  NT will never re
29570 6d 61 70 20 74 68 65 0a 2a 2a 20 62 75 66 66 65  map the.** buffe
29580 72 2e 20 20 52 45 43 4f 56 45 52 20 6d 69 67 68  r.  RECOVER migh
29590 74 20 72 65 6d 61 70 2c 20 74 68 6f 75 67 68 2c  t remap, though,
295a0 20 73 6f 20 43 48 45 43 4b 50 4f 49 4e 54 20 77   so CHECKPOINT w
295b0 69 6c 6c 20 61 63 71 75 69 72 65 0a 2a 2a 20 74  ill acquire.** t
295c0 68 65 20 6d 75 74 65 78 20 69 66 20 61 6e 64 20  he mutex if and 
295d0 77 68 65 6e 20 69 74 20 70 72 6f 6d 6f 74 65 73  when it promotes
295e0 20 74 6f 20 52 45 43 4f 56 45 52 2e 0a 2a 2a 0a   to RECOVER..**.
295f0 2a 2a 20 52 45 43 4f 56 45 52 20 6e 65 65 64 73  ** RECOVER needs
29600 20 74 6f 20 62 65 20 61 74 6f 6d 69 63 2e 20 20   to be atomic.  
29610 54 68 65 20 73 61 6d 65 20 6d 75 74 65 78 20 74  The same mutex t
29620 68 61 74 20 70 72 65 76 65 6e 74 73 20 2a 70 70  hat prevents *pp
29630 42 75 66 20 66 72 6f 6d 0a 2a 2a 20 62 65 69 6e  Buf from.** bein
29640 67 20 72 65 6d 61 70 70 65 64 20 61 6c 73 6f 20  g remapped also 
29650 70 72 65 76 65 6e 74 73 20 6d 6f 72 65 20 74 68  prevents more th
29660 61 6e 20 6f 6e 65 20 74 68 72 65 61 64 20 66 72  an one thread fr
29670 6f 6d 20 62 65 69 6e 67 20 69 6e 0a 2a 2a 20 52  om being in.** R
29680 45 43 4f 56 45 52 20 61 74 20 61 20 74 69 6d 65  ECOVER at a time
29690 2e 20 20 42 75 74 2c 20 52 45 43 4f 56 45 52 20  .  But, RECOVER 
296a0 73 6f 6d 65 74 69 6d 65 73 20 77 61 6e 74 73 20  sometimes wants 
296b0 74 6f 20 72 65 6d 61 70 20 69 74 73 65 6c 66 2e  to remap itself.
296c0 0a 2a 2a 20 54 6f 20 70 72 65 76 65 6e 74 20 52  .** To prevent R
296d0 45 43 4f 56 45 52 20 66 72 6f 6d 20 6c 6f 73 69  ECOVER from losi
296e0 6e 67 20 69 74 73 20 6c 6f 63 6b 20 77 68 69 6c  ng its lock whil
296f0 65 20 72 65 6d 61 70 70 69 6e 67 2c 20 74 68 65  e remapping, the
29700 0a 2a 2a 20 6d 75 74 65 78 20 69 73 20 6e 6f 74  .** mutex is not
29710 20 72 65 6c 65 61 73 65 64 20 62 79 20 75 6e 69   released by uni
29720 78 53 68 6d 52 65 6c 65 61 73 65 28 29 20 77 68  xShmRelease() wh
29730 65 6e 20 69 6e 20 52 45 43 4f 56 45 52 2e 0a 2a  en in RECOVER..*
29740 2a 0a 2a 2a 20 2a 70 4e 65 77 4d 61 70 53 69 7a  *.** *pNewMapSiz
29750 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  e is set to the 
29760 73 69 7a 65 20 6f 66 20 74 68 65 20 6d 61 70 70  size of the mapp
29770 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 2a 70 70 42 75  ing..**.** *ppBu
29780 66 20 61 6e 64 20 2a 70 4e 65 77 4d 61 70 53 69  f and *pNewMapSi
29790 7a 65 20 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c  ze might be NULL
297a0 20 61 6e 64 20 7a 65 72 6f 20 69 66 20 6e 6f 20   and zero if no 
297b0 73 70 61 63 65 20 68 61 73 0a 2a 2a 20 79 65 74  space has.** yet
297c0 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20   been allocated 
297d0 74 6f 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  to the underlyin
297e0 67 20 73 74 6f 72 61 67 65 2e 0a 2a 2f 0a 73 74  g storage..*/.st
297f0 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 68 6d  atic int unixShm
29800 47 65 74 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  Get(.  sqlite3_v
29810 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20  fs *pVfs,       
29820 2f 2a 20 54 68 65 20 56 46 53 20 2a 2f 0a 20 20  /* The VFS */.  
29830 73 71 6c 69 74 65 33 5f 73 68 6d 20 2a 70 53 68  sqlite3_shm *pSh
29840 61 72 65 64 4d 65 6d 2c 20 2f 2a 20 50 6f 69 6e  aredMem, /* Poin
29850 74 65 72 20 72 65 74 75 72 6e 65 64 20 62 79 20  ter returned by 
29860 75 6e 69 78 53 68 6d 4f 70 65 6e 28 29 20 2a 2f  unixShmOpen() */
29870 0a 20 20 69 6e 74 20 72 65 71 4d 61 70 53 69 7a  .  int reqMapSiz
29880 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  e,          /* R
29890 65 71 75 65 73 74 65 64 20 73 69 7a 65 20 6f 66  equested size of
298a0 20 6d 61 70 70 69 6e 67 2e 20 2d 31 20 6d 65 61   mapping. -1 mea
298b0 6e 73 20 64 6f 6e 27 74 20 63 61 72 65 20 2a 2f  ns don't care */
298c0 0a 20 20 69 6e 74 20 2a 70 4e 65 77 4d 61 70 53  .  int *pNewMapS
298d0 69 7a 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 57  ize,        /* W
298e0 72 69 74 65 20 6e 65 77 20 73 69 7a 65 20 6f 66  rite new size of
298f0 20 6d 61 70 70 69 6e 67 20 68 65 72 65 20 2a 2f   mapping here */
29900 0a 20 20 76 6f 69 64 20 2a 2a 70 70 42 75 66 20  .  void **ppBuf 
29910 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
29920 72 69 74 65 20 6d 61 70 70 69 6e 67 20 62 75 66  rite mapping buf
29930 66 65 72 20 6f 72 69 67 69 6e 20 68 65 72 65 20  fer origin here 
29940 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 53 68 6d 20  */.){.  unixShm 
29950 2a 70 20 3d 20 28 75 6e 69 78 53 68 6d 2a 29 70  *p = (unixShm*)p
29960 53 68 61 72 65 64 4d 65 6d 3b 0a 20 20 75 6e 69  SharedMem;.  uni
29970 78 53 68 6d 46 69 6c 65 20 2a 70 46 69 6c 65 20  xShmFile *pFile 
29980 3d 20 70 2d 3e 70 46 69 6c 65 3b 0a 20 20 69 6e  = p->pFile;.  in
29990 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
299a0 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 6c 6f 63 6b  ;..  if( p->lock
299b0 53 74 61 74 65 21 3d 53 51 4c 49 54 45 5f 53 48  State!=SQLITE_SH
299c0 4d 5f 43 48 45 43 4b 50 4f 49 4e 54 20 26 26 20  M_CHECKPOINT && 
299d0 70 2d 3e 68 61 73 4d 75 74 65 78 42 75 66 3d 3d  p->hasMutexBuf==
299e0 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
299f0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6e   sqlite3_mutex_n
29a00 6f 74 68 65 6c 64 28 70 46 69 6c 65 2d 3e 6d 75  otheld(pFile->mu
29a10 74 65 78 29 20 29 3b 0a 20 20 20 20 73 71 6c 69  tex) );.    sqli
29a20 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
29a30 70 46 69 6c 65 2d 3e 6d 75 74 65 78 42 75 66 29  pFile->mutexBuf)
29a40 3b 0a 20 20 20 20 70 2d 3e 68 61 73 4d 75 74 65  ;.    p->hasMute
29a50 78 42 75 66 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  xBuf = 1;.  }.  
29a60 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
29a70 74 65 72 28 70 46 69 6c 65 2d 3e 6d 75 74 65 78  ter(pFile->mutex
29a80 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  );.  if( pFile->
29a90 73 7a 4d 61 70 3d 3d 30 20 7c 7c 20 72 65 71 4d  szMap==0 || reqM
29aa0 61 70 53 69 7a 65 3e 70 46 69 6c 65 2d 3e 73 7a  apSize>pFile->sz
29ab0 4d 61 70 20 29 7b 0a 20 20 20 20 69 6e 74 20 61  Map ){.    int a
29ac0 63 74 75 61 6c 53 69 7a 65 3b 0a 20 20 20 20 69  ctualSize;.    i
29ad0 66 28 20 75 6e 69 78 53 68 6d 53 69 7a 65 28 70  f( unixShmSize(p
29ae0 56 66 73 2c 20 70 53 68 61 72 65 64 4d 65 6d 2c  Vfs, pSharedMem,
29af0 20 2d 31 2c 20 26 61 63 74 75 61 6c 53 69 7a 65   -1, &actualSize
29b00 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20  )==SQLITE_OK.   
29b10 20 20 26 26 20 72 65 71 4d 61 70 53 69 7a 65 3c    && reqMapSize<
29b20 61 63 74 75 61 6c 53 69 7a 65 0a 20 20 20 20 29  actualSize.    )
29b30 7b 0a 20 20 20 20 20 20 72 65 71 4d 61 70 53 69  {.      reqMapSi
29b40 7a 65 20 3d 20 61 63 74 75 61 6c 53 69 7a 65 3b  ze = actualSize;
29b50 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
29b60 46 69 6c 65 2d 3e 70 4d 4d 61 70 42 75 66 20 29  File->pMMapBuf )
29b70 7b 0a 20 20 20 20 20 20 6d 75 6e 6d 61 70 28 70  {.      munmap(p
29b80 46 69 6c 65 2d 3e 70 4d 4d 61 70 42 75 66 2c 20  File->pMMapBuf, 
29b90 70 46 69 6c 65 2d 3e 73 7a 4d 61 70 29 3b 0a 20  pFile->szMap);. 
29ba0 20 20 20 7d 0a 20 20 20 20 70 46 69 6c 65 2d 3e     }.    pFile->
29bb0 70 4d 4d 61 70 42 75 66 20 3d 20 6d 6d 61 70 28  pMMapBuf = mmap(
29bc0 30 2c 20 72 65 71 4d 61 70 53 69 7a 65 2c 20 50  0, reqMapSize, P
29bd0 52 4f 54 5f 52 45 41 44 7c 50 52 4f 54 5f 57 52  ROT_READ|PROT_WR
29be0 49 54 45 2c 20 4d 41 50 5f 53 48 41 52 45 44 2c  ITE, MAP_SHARED,
29bf0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
29c00 20 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c              pFil
29c10 65 2d 3e 68 2c 20 30 29 3b 0a 20 20 20 20 70 46  e->h, 0);.    pF
29c20 69 6c 65 2d 3e 73 7a 4d 61 70 20 3d 20 70 46 69  ile->szMap = pFi
29c30 6c 65 2d 3e 70 4d 4d 61 70 42 75 66 20 3f 20 72  le->pMMapBuf ? r
29c40 65 71 4d 61 70 53 69 7a 65 20 3a 20 30 3b 0a 20  eqMapSize : 0;. 
29c50 20 7d 0a 20 20 2a 70 4e 65 77 4d 61 70 53 69 7a   }.  *pNewMapSiz
29c60 65 20 3d 20 70 46 69 6c 65 2d 3e 73 7a 4d 61 70  e = pFile->szMap
29c70 3b 0a 20 20 2a 70 70 42 75 66 20 3d 20 70 46 69  ;.  *ppBuf = pFi
29c80 6c 65 2d 3e 70 4d 4d 61 70 42 75 66 3b 0a 20 20  le->pMMapBuf;.  
29c90 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
29ca0 61 76 65 28 70 46 69 6c 65 2d 3e 6d 75 74 65 78  ave(pFile->mutex
29cb0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
29cc0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65  }../*.** Release
29cd0 20 74 68 65 20 6c 6f 63 6b 20 68 65 6c 64 20 6f   the lock held o
29ce0 6e 20 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d  n the shared mem
29cf0 6f 72 79 20 73 65 67 6d 65 6e 74 20 74 6f 20 74  ory segment to t
29d00 68 61 74 20 6f 74 68 65 72 0a 2a 2a 20 74 68 72  hat other.** thr
29d10 65 61 64 73 20 61 72 65 20 66 72 65 65 20 74 6f  eads are free to
29d20 20 72 65 73 69 7a 65 20 69 74 20 69 66 20 6e 65   resize it if ne
29d30 63 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 49  cessary..**.** I
29d40 66 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 6e 6f  f the lock is no
29d50 74 20 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64  t currently held
29d60 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
29d70 73 20 61 20 68 61 72 6d 6c 65 73 73 20 6e 6f 2d  s a harmless no-
29d80 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  op..**.** If the
29d90 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6f   shared-memory o
29da0 62 6a 65 63 74 20 69 73 20 69 6e 20 6c 6f 63 6b  bject is in lock
29db0 20 73 74 61 74 65 20 52 45 43 4f 56 45 52 2c 20   state RECOVER, 
29dc0 74 68 65 6e 20 77 65 20 64 6f 20 6e 6f 74 0a 2a  then we do not.*
29dd0 2a 20 72 65 61 6c 6c 79 20 77 61 6e 74 20 74 6f  * really want to
29de0 20 72 65 6c 65 61 73 65 20 74 68 65 20 6c 6f 63   release the loc
29df0 6b 2c 20 73 6f 20 69 6e 20 74 68 61 74 20 63 61  k, so in that ca
29e00 73 65 20 74 6f 6f 2c 20 74 68 69 73 20 72 6f 75  se too, this rou
29e10 74 69 6e 65 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d  tine.** is a no-
29e20 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  op..*/.static in
29e30 74 20 75 6e 69 78 53 68 6d 52 65 6c 65 61 73 65  t unixShmRelease
29e40 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56  (sqlite3_vfs *pV
29e50 66 73 2c 20 73 71 6c 69 74 65 33 5f 73 68 6d 20  fs, sqlite3_shm 
29e60 2a 70 53 68 61 72 65 64 4d 65 6d 29 7b 0a 20 20  *pSharedMem){.  
29e70 75 6e 69 78 53 68 6d 20 2a 70 20 3d 20 28 75 6e  unixShm *p = (un
29e80 69 78 53 68 6d 2a 29 70 53 68 61 72 65 64 4d 65  ixShm*)pSharedMe
29e90 6d 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  m;.  UNUSED_PARA
29ea0 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20 69  METER(pVfs);.  i
29eb0 66 28 20 70 2d 3e 68 61 73 4d 75 74 65 78 42 75  f( p->hasMutexBu
29ec0 66 20 26 26 20 70 2d 3e 6c 6f 63 6b 53 74 61 74  f && p->lockStat
29ed0 65 21 3d 53 51 4c 49 54 45 5f 53 48 4d 5f 52 45  e!=SQLITE_SHM_RE
29ee0 43 4f 56 45 52 20 29 7b 0a 20 20 20 20 75 6e 69  COVER ){.    uni
29ef0 78 53 68 6d 46 69 6c 65 20 2a 70 46 69 6c 65 20  xShmFile *pFile 
29f00 3d 20 70 2d 3e 70 46 69 6c 65 3b 0a 20 20 20 20  = p->pFile;.    
29f10 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
29f20 6d 75 74 65 78 5f 6e 6f 74 68 65 6c 64 28 70 46  mutex_notheld(pF
29f30 69 6c 65 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  ile->mutex) );. 
29f40 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
29f50 5f 6c 65 61 76 65 28 70 46 69 6c 65 2d 3e 6d 75  _leave(pFile->mu
29f60 74 65 78 42 75 66 29 3b 0a 20 20 20 20 70 2d 3e  texBuf);.    p->
29f70 68 61 73 4d 75 74 65 78 42 75 66 20 3d 20 30 3b  hasMutexBuf = 0;
29f80 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
29f90 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
29fa0 2a 20 53 79 6d 62 6f 6c 69 63 20 6e 61 6d 65 73  * Symbolic names
29fb0 20 66 6f 72 20 4c 4f 43 4b 20 73 74 61 74 65 73   for LOCK states
29fc0 20 75 73 65 64 20 66 6f 72 20 64 65 62 75 67 67   used for debugg
29fd0 69 6e 67 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  ing..*/.#ifdef S
29fe0 51 4c 49 54 45 5f 44 45 42 55 47 0a 73 74 61 74  QLITE_DEBUG.stat
29ff0 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61  ic const char *a
2a000 7a 4c 6b 4e 61 6d 65 5b 5d 20 3d 20 7b 0a 20 20  zLkName[] = {.  
2a010 22 55 4e 4c 4f 43 4b 22 2c 0a 20 20 22 52 45 41  "UNLOCK",.  "REA
2a020 44 22 2c 0a 20 20 22 52 45 41 44 5f 46 55 4c 4c  D",.  "READ_FULL
2a030 22 2c 0a 20 20 22 57 52 49 54 45 22 2c 0a 20 20  ",.  "WRITE",.  
2a040 22 50 45 4e 44 49 4e 47 22 2c 0a 20 20 22 43 48  "PENDING",.  "CH
2a050 45 43 4b 50 4f 49 4e 54 22 2c 0a 20 20 22 52 45  ECKPOINT",.  "RE
2a060 43 4f 56 45 52 22 0a 7d 3b 0a 23 65 6e 64 69 66  COVER".};.#endif
2a070 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  .../*.** Change 
2a080 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 66  the lock state f
2a090 6f 72 20 61 20 73 68 61 72 65 64 2d 6d 65 6d 6f  or a shared-memo
2a0a0 72 79 20 73 65 67 6d 65 6e 74 2e 0a 2a 2f 0a 73  ry segment..*/.s
2a0b0 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 68  tatic int unixSh
2a0c0 6d 4c 6f 63 6b 28 0a 20 20 73 71 6c 69 74 65 33  mLock(.  sqlite3
2a0d0 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20  _vfs *pVfs,     
2a0e0 20 20 20 20 2f 2a 20 54 68 65 20 56 46 53 20 2a      /* The VFS *
2a0f0 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 68 6d 20  /.  sqlite3_shm 
2a100 2a 70 53 68 61 72 65 64 4d 65 6d 2c 20 20 20 2f  *pSharedMem,   /
2a110 2a 20 50 6f 69 6e 74 65 72 20 66 72 6f 6d 20 75  * Pointer from u
2a120 6e 69 78 53 68 6d 4f 70 65 6e 28 29 20 2a 2f 0a  nixShmOpen() */.
2a130 20 20 69 6e 74 20 64 65 73 69 72 65 64 4c 6f 63    int desiredLoc
2a140 6b 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  k,           /* 
2a150 4f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 53 48  One of SQLITE_SH
2a160 4d 5f 78 78 78 78 78 20 6c 6f 63 6b 69 6e 67 20  M_xxxxx locking 
2a170 73 74 61 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20  states */.  int 
2a180 2a 70 47 6f 74 4c 6f 63 6b 20 20 20 20 20 20 20  *pGotLock       
2a190 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f         /* The lo
2a1a0 63 6b 20 79 6f 75 20 61 63 74 75 61 6c 6c 79 20  ck you actually 
2a1b0 67 6f 74 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78  got */.){.  unix
2a1c0 53 68 6d 20 2a 70 20 3d 20 28 75 6e 69 78 53 68  Shm *p = (unixSh
2a1d0 6d 2a 29 70 53 68 61 72 65 64 4d 65 6d 3b 0a 20  m*)pSharedMem;. 
2a1e0 20 75 6e 69 78 53 68 6d 46 69 6c 65 20 2a 70 46   unixShmFile *pF
2a1f0 69 6c 65 20 3d 20 70 2d 3e 70 46 69 6c 65 3b 0a  ile = p->pFile;.
2a200 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
2a210 45 5f 50 52 4f 54 4f 43 4f 4c 3b 0a 0a 20 20 55  E_PROTOCOL;..  U
2a220 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
2a230 70 56 66 73 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 74  pVfs);..  /* Not
2a240 65 20 74 68 61 74 20 53 51 4c 49 54 45 5f 53 48  e that SQLITE_SH
2a250 4d 5f 52 45 41 44 5f 46 55 4c 4c 20 61 6e 64 20  M_READ_FULL and 
2a260 53 51 4c 49 54 45 5f 53 48 4d 5f 50 45 4e 44 49  SQLITE_SHM_PENDI
2a270 4e 47 20 61 72 65 20 6e 65 76 65 72 0a 20 20 2a  NG are never.  *
2a280 2a 20 64 69 72 65 63 74 6c 79 20 72 65 71 75 65  * directly reque
2a290 73 74 65 64 3b 20 74 68 65 79 20 61 72 65 20 73  sted; they are s
2a2a0 69 64 65 20 65 66 66 65 63 74 73 20 66 72 6f 6d  ide effects from
2a2b0 20 72 65 71 75 65 73 74 69 6e 67 0a 20 20 2a 2a   requesting.  **
2a2c0 20 53 51 4c 49 54 45 5f 53 48 4d 5f 52 45 41 44   SQLITE_SHM_READ
2a2d0 20 61 6e 64 20 53 51 4c 49 54 45 5f 53 48 4d 5f   and SQLITE_SHM_
2a2e0 43 48 45 43 4b 50 4f 49 4e 54 2c 20 72 65 73 70  CHECKPOINT, resp
2a2f0 65 63 74 69 76 65 6c 79 2e 0a 20 20 2a 2f 0a 20  ectively..  */. 
2a300 20 61 73 73 65 72 74 28 20 64 65 73 69 72 65 64   assert( desired
2a310 4c 6f 63 6b 3d 3d 53 51 4c 49 54 45 5f 53 48 4d  Lock==SQLITE_SHM
2a320 5f 55 4e 4c 4f 43 4b 0a 20 20 20 20 20 20 20 7c  _UNLOCK.       |
2a330 7c 20 64 65 73 69 72 65 64 4c 6f 63 6b 3d 3d 53  | desiredLock==S
2a340 51 4c 49 54 45 5f 53 48 4d 5f 52 45 41 44 0a 20  QLITE_SHM_READ. 
2a350 20 20 20 20 20 20 7c 7c 20 64 65 73 69 72 65 64        || desired
2a360 4c 6f 63 6b 3d 3d 53 51 4c 49 54 45 5f 53 48 4d  Lock==SQLITE_SHM
2a370 5f 57 52 49 54 45 0a 20 20 20 20 20 20 20 7c 7c  _WRITE.       ||
2a380 20 64 65 73 69 72 65 64 4c 6f 63 6b 3d 3d 53 51   desiredLock==SQ
2a390 4c 49 54 45 5f 53 48 4d 5f 43 48 45 43 4b 50 4f  LITE_SHM_CHECKPO
2a3a0 49 4e 54 0a 20 20 20 20 20 20 20 7c 7c 20 64 65  INT.       || de
2a3b0 73 69 72 65 64 4c 6f 63 6b 3d 3d 53 51 4c 49 54  siredLock==SQLIT
2a3c0 45 5f 53 48 4d 5f 52 45 43 4f 56 45 52 20 29 3b  E_SHM_RECOVER );
2a3d0 0a 0a 20 20 2f 2a 20 52 65 74 75 72 6e 20 64 69  ..  /* Return di
2a3e0 72 65 63 74 6c 79 20 69 66 20 74 68 69 73 20 69  rectly if this i
2a3f0 73 20 6a 75 73 74 20 61 20 6c 6f 63 6b 20 73 74  s just a lock st
2a400 61 74 65 20 71 75 65 72 79 2c 20 6f 72 20 69 66  ate query, or if
2a410 0a 20 20 2a 2a 20 74 68 65 20 63 6f 6e 6e 65 63  .  ** the connec
2a420 74 69 6f 6e 20 69 73 20 61 6c 72 65 61 64 79 20  tion is already 
2a430 69 6e 20 74 68 65 20 64 65 73 69 72 65 64 20 6c  in the desired l
2a440 6f 63 6b 69 6e 67 20 73 74 61 74 65 2e 0a 20 20  ocking state..  
2a450 2a 2f 0a 20 20 69 66 28 20 64 65 73 69 72 65 64  */.  if( desired
2a460 4c 6f 63 6b 3d 3d 70 2d 3e 6c 6f 63 6b 53 74 61  Lock==p->lockSta
2a470 74 65 0a 20 20 20 7c 7c 20 28 64 65 73 69 72 65  te.   || (desire
2a480 64 4c 6f 63 6b 3d 3d 53 51 4c 49 54 45 5f 53 48  dLock==SQLITE_SH
2a490 4d 5f 52 45 41 44 20 26 26 20 70 2d 3e 6c 6f 63  M_READ && p->loc
2a4a0 6b 53 74 61 74 65 3d 3d 53 51 4c 49 54 45 5f 53  kState==SQLITE_S
2a4b0 48 4d 5f 52 45 41 44 5f 46 55 4c 4c 29 0a 20 20  HM_READ_FULL).  
2a4c0 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28  ){.    OSTRACE((
2a4d0 22 53 48 4d 2d 4c 4f 43 4b 20 73 68 6d 69 64 2d  "SHM-LOCK shmid-
2a4e0 25 64 2c 20 70 69 64 2d 25 64 20 72 65 71 75 65  %d, pid-%d reque
2a4f0 73 74 20 25 73 20 61 6e 64 20 67 6f 74 20 25 73  st %s and got %s
2a500 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
2a510 20 20 70 2d 3e 69 64 2c 20 67 65 74 70 69 64 28    p->id, getpid(
2a520 29 2c 20 61 7a 4c 6b 4e 61 6d 65 5b 64 65 73 69  ), azLkName[desi
2a530 72 65 64 4c 6f 63 6b 5d 2c 20 61 7a 4c 6b 4e 61  redLock], azLkNa
2a540 6d 65 5b 70 2d 3e 6c 6f 63 6b 53 74 61 74 65 5d  me[p->lockState]
2a550 29 29 3b 0a 20 20 20 20 69 66 28 20 70 47 6f 74  ));.    if( pGot
2a560 4c 6f 63 6b 20 29 20 2a 70 47 6f 74 4c 6f 63 6b  Lock ) *pGotLock
2a570 20 3d 20 70 2d 3e 6c 6f 63 6b 53 74 61 74 65 3b   = p->lockState;
2a580 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2a590 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 4f 53  TE_OK;.  }..  OS
2a5a0 54 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b  TRACE(("SHM-LOCK
2a5b0 20 73 68 6d 69 64 2d 25 64 2c 20 70 69 64 2d 25   shmid-%d, pid-%
2a5c0 64 20 72 65 71 75 65 73 74 20 25 73 2d 3e 25 73  d request %s->%s
2a5d0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
2a5e0 20 70 2d 3e 69 64 2c 20 67 65 74 70 69 64 28 29   p->id, getpid()
2a5f0 2c 20 61 7a 4c 6b 4e 61 6d 65 5b 70 2d 3e 6c 6f  , azLkName[p->lo
2a600 63 6b 53 74 61 74 65 5d 2c 20 61 7a 4c 6b 4e 61  ckState], azLkNa
2a610 6d 65 5b 64 65 73 69 72 65 64 4c 6f 63 6b 5d 29  me[desiredLock])
2a620 29 3b 0a 20 20 0a 20 20 69 66 28 20 64 65 73 69  );.  .  if( desi
2a630 72 65 64 4c 6f 63 6b 3d 3d 53 51 4c 49 54 45 5f  redLock==SQLITE_
2a640 53 48 4d 5f 52 45 43 4f 56 45 52 20 26 26 20 21  SHM_RECOVER && !
2a650 70 2d 3e 68 61 73 4d 75 74 65 78 42 75 66 20 29  p->hasMutexBuf )
2a660 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  {.    assert( sq
2a670 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6e 6f 74 68  lite3_mutex_noth
2a680 65 6c 64 28 70 46 69 6c 65 2d 3e 6d 75 74 65 78  eld(pFile->mutex
2a690 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) );.    sqlite3
2a6a0 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 46 69  _mutex_enter(pFi
2a6b0 6c 65 2d 3e 6d 75 74 65 78 42 75 66 29 3b 0a 20  le->mutexBuf);. 
2a6c0 20 20 20 70 2d 3e 68 61 73 4d 75 74 65 78 42 75     p->hasMutexBu
2a6d0 66 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 73 71 6c  f = 1;.  }.  sql
2a6e0 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
2a6f0 28 70 46 69 6c 65 2d 3e 6d 75 74 65 78 29 3b 0a  (pFile->mutex);.
2a700 20 20 73 77 69 74 63 68 28 20 64 65 73 69 72 65    switch( desire
2a710 64 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 63 61 73  dLock ){.    cas
2a720 65 20 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c  e SQLITE_SHM_UNL
2a730 4f 43 4b 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  OCK: {.      ass
2a740 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 53 74 61 74  ert( p->lockStat
2a750 65 21 3d 53 51 4c 49 54 45 5f 53 48 4d 5f 52 45  e!=SQLITE_SHM_RE
2a760 43 4f 56 45 52 20 29 3b 0a 20 20 20 20 20 20 75  COVER );.      u
2a770 6e 69 78 53 68 6d 55 6e 6c 6f 63 6b 28 70 46 69  nixShmUnlock(pFi
2a780 6c 65 2c 20 70 2c 20 55 4e 49 58 5f 53 48 4d 5f  le, p, UNIX_SHM_
2a790 41 7c 55 4e 49 58 5f 53 48 4d 5f 42 7c 55 4e 49  A|UNIX_SHM_B|UNI
2a7a0 58 5f 53 48 4d 5f 43 7c 55 4e 49 58 5f 53 48 4d  X_SHM_C|UNIX_SHM
2a7b0 5f 44 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  _D);.      rc = 
2a7c0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
2a7d0 20 70 2d 3e 6c 6f 63 6b 53 74 61 74 65 20 3d 20   p->lockState = 
2a7e0 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43  SQLITE_SHM_UNLOC
2a7f0 4b 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  K;.      break;.
2a800 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
2a810 51 4c 49 54 45 5f 53 48 4d 5f 52 45 41 44 3a 20  QLITE_SHM_READ: 
2a820 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6c  {.      if( p->l
2a830 6f 63 6b 53 74 61 74 65 3d 3d 53 51 4c 49 54 45  ockState==SQLITE
2a840 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20  _SHM_UNLOCK ){. 
2a850 20 20 20 20 20 20 20 69 6e 74 20 6e 41 74 74 65         int nAtte
2a860 6d 70 74 3b 0a 20 20 20 20 20 20 20 20 72 63 20  mpt;.        rc 
2a870 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
2a880 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
2a890 2d 3e 6c 6f 63 6b 53 74 61 74 65 3d 3d 53 51 4c  ->lockState==SQL
2a8a0 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 29  ITE_SHM_UNLOCK )
2a8b0 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6e 41  ;.        for(nA
2a8c0 74 74 65 6d 70 74 3d 30 3b 20 6e 41 74 74 65 6d  ttempt=0; nAttem
2a8d0 70 74 3c 35 20 26 26 20 72 63 3d 3d 53 51 4c 49  pt<5 && rc==SQLI
2a8e0 54 45 5f 42 55 53 59 3b 20 6e 41 74 74 65 6d 70  TE_BUSY; nAttemp
2a8f0 74 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  t++){.          
2a900 72 63 20 3d 20 75 6e 69 78 53 68 6d 53 68 61 72  rc = unixShmShar
2a910 65 64 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 70 2c  edLock(pFile, p,
2a920 20 55 4e 49 58 5f 53 48 4d 5f 41 7c 55 4e 49 58   UNIX_SHM_A|UNIX
2a930 5f 53 48 4d 5f 42 29 3b 0a 20 20 20 20 20 20 20  _SHM_B);.       
2a940 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2a950 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20  E_BUSY ){.      
2a960 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 53        rc = unixS
2a970 68 6d 53 68 61 72 65 64 4c 6f 63 6b 28 70 46 69  hmSharedLock(pFi
2a980 6c 65 2c 20 70 2c 20 55 4e 49 58 5f 53 48 4d 5f  le, p, UNIX_SHM_
2a990 44 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  D);.            
2a9a0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2a9b0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
2a9c0 20 20 20 70 2d 3e 6c 6f 63 6b 53 74 61 74 65 20     p->lockState 
2a9d0 3d 20 53 51 4c 49 54 45 5f 53 48 4d 5f 52 45 41  = SQLITE_SHM_REA
2a9e0 44 5f 46 55 4c 4c 3b 0a 20 20 20 20 20 20 20 20  D_FULL;.        
2a9f0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2aa00 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
2aa10 20 20 20 75 6e 69 78 53 68 6d 55 6e 6c 6f 63 6b     unixShmUnlock
2aa20 28 70 46 69 6c 65 2c 20 70 2c 20 55 4e 49 58 5f  (pFile, p, UNIX_
2aa30 53 48 4d 5f 42 29 3b 0a 20 20 20 20 20 20 20 20  SHM_B);.        
2aa40 20 20 20 20 70 2d 3e 6c 6f 63 6b 53 74 61 74 65      p->lockState
2aa50 20 3d 20 53 51 4c 49 54 45 5f 53 48 4d 5f 52 45   = SQLITE_SHM_RE
2aa60 41 44 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  AD;.          }.
2aa70 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2aa80 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 61 73  }else{.       as
2aa90 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 53 74 61  sert( p->lockSta
2aaa0 74 65 3d 3d 53 51 4c 49 54 45 5f 53 48 4d 5f 57  te==SQLITE_SHM_W
2aab0 52 49 54 45 0a 20 20 20 20 20 20 20 20 20 20 20  RITE.           
2aac0 20 20 20 20 7c 7c 20 70 2d 3e 6c 6f 63 6b 53 74      || p->lockSt
2aad0 61 74 65 3d 3d 53 51 4c 49 54 45 5f 53 48 4d 5f  ate==SQLITE_SHM_
2aae0 52 45 43 4f 56 45 52 20 29 3b 0a 20 20 20 20 20  RECOVER );.     
2aaf0 20 20 20 72 63 20 3d 20 75 6e 69 78 53 68 6d 53     rc = unixShmS
2ab00 68 61 72 65 64 4c 6f 63 6b 28 70 46 69 6c 65 2c  haredLock(pFile,
2ab10 20 70 2c 20 55 4e 49 58 5f 53 48 4d 5f 41 29 3b   p, UNIX_SHM_A);
2ab20 0a 20 20 20 20 20 20 20 20 75 6e 69 78 53 68 6d  .        unixShm
2ab30 55 6e 6c 6f 63 6b 28 70 46 69 6c 65 2c 20 70 2c  Unlock(pFile, p,
2ab40 20 55 4e 49 58 5f 53 48 4d 5f 43 7c 55 4e 49 58   UNIX_SHM_C|UNIX
2ab50 5f 53 48 4d 5f 44 29 3b 0a 20 20 20 20 20 20 20  _SHM_D);.       
2ab60 20 70 2d 3e 6c 6f 63 6b 53 74 61 74 65 20 3d 20   p->lockState = 
2ab70 53 51 4c 49 54 45 5f 53 48 4d 5f 52 45 41 44 3b  SQLITE_SHM_READ;
2ab80 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
2ab90 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
2aba0 63 61 73 65 20 53 51 4c 49 54 45 5f 53 48 4d 5f  case SQLITE_SHM_
2abb0 57 52 49 54 45 3a 20 7b 0a 20 20 20 20 20 20 61  WRITE: {.      a
2abc0 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 53 74  ssert( p->lockSt
2abd0 61 74 65 3d 3d 53 51 4c 49 54 45 5f 53 48 4d 5f  ate==SQLITE_SHM_
2abe0 52 45 41 44 20 0a 20 20 20 20 20 20 20 20 20 20  READ .          
2abf0 20 20 20 20 7c 7c 20 70 2d 3e 6c 6f 63 6b 53 74      || p->lockSt
2ac00 61 74 65 3d 3d 53 51 4c 49 54 45 5f 53 48 4d 5f  ate==SQLITE_SHM_
2ac10 52 45 41 44 5f 46 55 4c 4c 20 29 3b 0a 20 20 20  READ_FULL );.   
2ac20 20 20 20 72 63 20 3d 20 75 6e 69 78 53 68 6d 45     rc = unixShmE
2ac30 78 63 6c 75 73 69 76 65 4c 6f 63 6b 28 70 46 69  xclusiveLock(pFi
2ac40 6c 65 2c 20 70 2c 20 55 4e 49 58 5f 53 48 4d 5f  le, p, UNIX_SHM_
2ac50 43 7c 55 4e 49 58 5f 53 48 4d 5f 44 29 3b 0a 20  C|UNIX_SHM_D);. 
2ac60 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
2ac70 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2ac80 20 20 70 2d 3e 6c 6f 63 6b 53 74 61 74 65 20 3d    p->lockState =
2ac90 20 53 51 4c 49 54 45 5f 53 48 4d 5f 57 52 49 54   SQLITE_SHM_WRIT
2aca0 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  E;.      }.     
2acb0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
2acc0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 53 48    case SQLITE_SH
2acd0 4d 5f 43 48 45 43 4b 50 4f 49 4e 54 3a 20 7b 0a  M_CHECKPOINT: {.
2ace0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
2acf0 3e 6c 6f 63 6b 53 74 61 74 65 3d 3d 53 51 4c 49  >lockState==SQLI
2ad00 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 0a 20 20  TE_SHM_UNLOCK.  
2ad10 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6c           || p->l
2ad20 6f 63 6b 53 74 61 74 65 3d 3d 53 51 4c 49 54 45  ockState==SQLITE
2ad30 5f 53 48 4d 5f 50 45 4e 44 49 4e 47 0a 20 20 20  _SHM_PENDING.   
2ad40 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6c 6f          || p->lo
2ad50 63 6b 53 74 61 74 65 3d 3d 53 51 4c 49 54 45 5f  ckState==SQLITE_
2ad60 53 48 4d 5f 52 45 43 4f 56 45 52 20 29 3b 0a 20  SHM_RECOVER );. 
2ad70 20 20 20 20 20 69 66 28 20 70 2d 3e 6c 6f 63 6b       if( p->lock
2ad80 53 74 61 74 65 3d 3d 53 51 4c 49 54 45 5f 53 48  State==SQLITE_SH
2ad90 4d 5f 52 45 43 4f 56 45 52 20 29 7b 0a 20 20 20  M_RECOVER ){.   
2ada0 20 20 20 20 20 75 6e 69 78 53 68 6d 55 6e 6c 6f       unixShmUnlo
2adb0 63 6b 28 70 46 69 6c 65 2c 20 70 2c 20 55 4e 49  ck(pFile, p, UNI
2adc0 58 5f 53 48 4d 5f 43 29 3b 0a 20 20 20 20 20 20  X_SHM_C);.      
2add0 20 20 70 2d 3e 6c 6f 63 6b 53 74 61 74 65 20 3d    p->lockState =
2ade0 20 53 51 4c 49 54 45 5f 53 48 4d 5f 43 48 45 43   SQLITE_SHM_CHEC
2adf0 4b 50 4f 49 4e 54 3b 0a 20 20 20 20 20 20 20 20  KPOINT;.        
2ae00 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2ae10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
2ae20 28 20 70 2d 3e 6c 6f 63 6b 53 74 61 74 65 3d 3d  ( p->lockState==
2ae30 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43  SQLITE_SHM_UNLOC
2ae40 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
2ae50 3d 20 75 6e 69 78 53 68 6d 45 78 63 6c 75 73 69  = unixShmExclusi
2ae60 76 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 70 2c  veLock(pFile, p,
2ae70 20 55 4e 49 58 5f 53 48 4d 5f 42 7c 55 4e 49 58   UNIX_SHM_B|UNIX
2ae80 5f 53 48 4d 5f 43 29 3b 0a 20 20 20 20 20 20 20  _SHM_C);.       
2ae90 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2aea0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
2aeb0 70 2d 3e 6c 6f 63 6b 53 74 61 74 65 20 3d 20 53  p->lockState = S
2aec0 51 4c 49 54 45 5f 53 48 4d 5f 50 45 4e 44 49 4e  QLITE_SHM_PENDIN
2aed0 47 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  G;.        }.   
2aee0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
2aef0 2d 3e 6c 6f 63 6b 53 74 61 74 65 3d 3d 53 51 4c  ->lockState==SQL
2af00 49 54 45 5f 53 48 4d 5f 50 45 4e 44 49 4e 47 20  ITE_SHM_PENDING 
2af10 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
2af20 75 6e 69 78 53 68 6d 45 78 63 6c 75 73 69 76 65  unixShmExclusive
2af30 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 70 2c 20 55  Lock(pFile, p, U
2af40 4e 49 58 5f 53 48 4d 5f 41 29 3b 0a 20 20 20 20  NIX_SHM_A);.    
2af50 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2af60 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2af70 20 20 20 70 2d 3e 6c 6f 63 6b 53 74 61 74 65 20     p->lockState 
2af80 3d 20 53 51 4c 49 54 45 5f 53 48 4d 5f 43 48 45  = SQLITE_SHM_CHE
2af90 43 4b 50 4f 49 4e 54 3b 0a 20 20 20 20 20 20 20  CKPOINT;.       
2afa0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
2afb0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
2afc0 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
2afd0 20 20 20 61 73 73 65 72 74 28 20 64 65 73 69 72     assert( desir
2afe0 65 64 4c 6f 63 6b 3d 3d 53 51 4c 49 54 45 5f 53  edLock==SQLITE_S
2aff0 48 4d 5f 52 45 43 4f 56 45 52 20 29 3b 0a 20 20  HM_RECOVER );.  
2b000 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6c      assert( p->l
2b010 6f 63 6b 53 74 61 74 65 3d 3d 53 51 4c 49 54 45  ockState==SQLITE
2b020 5f 53 48 4d 5f 52 45 41 44 0a 20 20 20 20 20 20  _SHM_READ.      
2b030 20 20 20 20 20 7c 7c 20 70 2d 3e 6c 6f 63 6b 53       || p->lockS
2b040 74 61 74 65 3d 3d 53 51 4c 49 54 45 5f 53 48 4d  tate==SQLITE_SHM
2b050 5f 52 45 41 44 5f 46 55 4c 4c 0a 20 20 20 20 20  _READ_FULL.     
2b060 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6c 6f 63 6b        || p->lock
2b070 53 74 61 74 65 3d 3d 53 51 4c 49 54 45 5f 53 48  State==SQLITE_SH
2b080 4d 5f 43 48 45 43 4b 50 4f 49 4e 54 20 29 3b 0a  M_CHECKPOINT );.
2b090 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
2b0a0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
2b0b0 28 70 46 69 6c 65 2d 3e 6d 75 74 65 78 42 75 66  (pFile->mutexBuf
2b0c0 29 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) );.      rc = 
2b0d0 75 6e 69 78 53 68 6d 45 78 63 6c 75 73 69 76 65  unixShmExclusive
2b0e0 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 70 2c 20 55  Lock(pFile, p, U
2b0f0 4e 49 58 5f 53 48 4d 5f 43 29 3b 0a 20 20 20 20  NIX_SHM_C);.    
2b100 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2b110 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  _OK ){.        p
2b120 2d 3e 6c 6f 63 6b 53 74 61 74 65 20 3d 20 53 51  ->lockState = SQ
2b130 4c 49 54 45 5f 53 48 4d 5f 52 45 43 4f 56 45 52  LITE_SHM_RECOVER
2b140 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2b150 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
2b160 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
2b170 5f 6c 65 61 76 65 28 70 46 69 6c 65 2d 3e 6d 75  _leave(pFile->mu
2b180 74 65 78 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  tex);.  OSTRACE(
2b190 28 22 53 48 4d 2d 4c 4f 43 4b 20 73 68 6d 69 64  ("SHM-LOCK shmid
2b1a0 2d 25 64 2c 20 70 69 64 2d 25 64 20 67 6f 74 20  -%d, pid-%d got 
2b1b0 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %s\n",.         
2b1c0 20 20 70 2d 3e 69 64 2c 20 67 65 74 70 69 64 28    p->id, getpid(
2b1d0 29 2c 20 61 7a 4c 6b 4e 61 6d 65 5b 70 2d 3e 6c  ), azLkName[p->l
2b1e0 6f 63 6b 53 74 61 74 65 5d 29 29 3b 0a 20 20 69  ockState]));.  i
2b1f0 66 28 20 70 47 6f 74 4c 6f 63 6b 20 29 20 2a 70  f( pGotLock ) *p
2b200 47 6f 74 4c 6f 63 6b 20 3d 20 70 2d 3e 6c 6f 63  GotLock = p->loc
2b210 6b 53 74 61 74 65 3b 0a 20 20 72 65 74 75 72 6e  kState;.  return
2b220 20 72 63 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23 20   rc;.}..#else.# 
2b230 64 65 66 69 6e 65 20 75 6e 69 78 53 68 6d 4f 70  define unixShmOp
2b240 65 6e 20 20 20 20 30 0a 23 20 64 65 66 69 6e 65  en    0.# define
2b250 20 75 6e 69 78 53 68 6d 53 69 7a 65 20 20 20 20   unixShmSize    
2b260 30 0a 23 20 64 65 66 69 6e 65 20 75 6e 69 78 53  0.# define unixS
2b270 68 6d 47 65 74 20 20 20 20 20 30 0a 23 20 64 65  hmGet     0.# de
2b280 66 69 6e 65 20 75 6e 69 78 53 68 6d 52 65 6c 65  fine unixShmRele
2b290 61 73 65 20 30 0a 23 20 64 65 66 69 6e 65 20 75  ase 0.# define u
2b2a0 6e 69 78 53 68 6d 4c 6f 63 6b 20 20 20 20 30 0a  nixShmLock    0.
2b2b0 23 20 64 65 66 69 6e 65 20 75 6e 69 78 53 68 6d  # define unixShm
2b2c0 43 6c 6f 73 65 20 20 20 30 0a 23 65 6e 64 69 66  Close   0.#endif
2b2d0 20 2f 2a 20 23 69 66 6e 64 65 66 20 53 51 4c 49   /* #ifndef SQLI
2b2e0 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a  TE_OMIT_WAL */..
2b2f0 2f 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /*.*************
2b300 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20  *********** End 
2b310 6f 66 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d  of sqlite3_vfs m
2b320 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ethods *********
2b330 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b340 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
2b350 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b360 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b370 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b380 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b390 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  */../***********
2b3a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b3b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b3c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b3d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b3e0 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
2b3f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42  ************** B
2b400 65 67 69 6e 20 50 72 6f 78 79 20 4c 6f 63 6b 69  egin Proxy Locki
2b410 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ng *************
2b420 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b430 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 50 72 6f 78 79 20  ***.**.** Proxy 
2b440 6c 6f 63 6b 69 6e 67 20 69 73 20 61 20 22 75 62  locking is a "ub
2b450 65 72 2d 6c 6f 63 6b 69 6e 67 2d 6d 65 74 68 6f  er-locking-metho
2b460 64 22 20 69 6e 20 74 68 69 73 20 73 65 6e 73 65  d" in this sense
2b470 3a 20 20 49 74 20 75 73 65 73 20 74 68 65 0a 2a  :  It uses the.*
2b480 2a 20 6f 74 68 65 72 20 6c 6f 63 6b 69 6e 67 20  * other locking 
2b490 6d 65 74 68 6f 64 73 20 6f 6e 20 73 65 63 6f 6e  methods on secon
2b4a0 64 61 72 79 20 6c 6f 63 6b 20 66 69 6c 65 73 2e  dary lock files.
2b4b0 20 20 50 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20    Proxy locking 
2b4c0 69 73 20 61 0a 2a 2a 20 6d 65 74 61 2d 6c 61 79  is a.** meta-lay
2b4d0 65 72 20 6f 76 65 72 20 74 6f 70 20 6f 66 20 74  er over top of t
2b4e0 68 65 20 70 72 69 6d 69 74 69 76 65 20 6c 6f 63  he primitive loc
2b4f0 6b 69 6e 67 20 69 6d 70 6c 65 6d 65 6e 74 65 64  king implemented
2b500 20 61 62 6f 76 65 2e 20 20 46 6f 72 0a 2a 2a 20   above.  For.** 
2b510 74 68 69 73 20 72 65 61 73 6f 6e 2c 20 74 68 65  this reason, the
2b520 20 64 69 76 69 73 69 6f 6e 20 74 68 61 74 20 69   division that i
2b530 6d 70 6c 65 6d 65 6e 74 73 20 6f 66 20 70 72 6f  mplements of pro
2b540 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20 64 65  xy locking is de
2b550 66 65 72 72 65 64 0a 2a 2a 20 75 6e 74 69 6c 20  ferred.** until 
2b560 6c 61 74 65 20 69 6e 20 74 68 65 20 66 69 6c 65  late in the file
2b570 20 28 68 65 72 65 29 20 61 66 74 65 72 20 61 6c   (here) after al
2b580 6c 20 6f 66 20 74 68 65 20 6f 74 68 65 72 20 49  l of the other I
2b590 2f 4f 20 6d 65 74 68 6f 64 73 20 68 61 76 65 0a  /O methods have.
2b5a0 2a 2a 20 62 65 65 6e 20 64 65 66 69 6e 65 64 20  ** been defined 
2b5b0 2d 20 73 6f 20 74 68 61 74 20 74 68 65 20 70 72  - so that the pr
2b5c0 69 6d 69 74 69 76 65 20 6c 6f 63 6b 69 6e 67 20  imitive locking 
2b5d0 6d 65 74 68 6f 64 73 20 61 72 65 20 61 76 61 69  methods are avai
2b5e0 6c 61 62 6c 65 0a 2a 2a 20 61 73 20 73 65 72 76  lable.** as serv
2b5f0 69 63 65 73 20 74 6f 20 68 65 6c 70 20 77 69 74  ices to help wit
2b600 68 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  h the implementa
2b610 74 69 6f 6e 20 6f 66 20 70 72 6f 78 79 20 6c 6f  tion of proxy lo
2b620 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a 2a 2a 0a 2a  cking..**.****.*
2b630 2a 0a 2a 2a 20 54 68 65 20 64 65 66 61 75 6c 74  *.** The default
2b640 20 6c 6f 63 6b 69 6e 67 20 73 63 68 65 6d 65 73   locking schemes
2b650 20 69 6e 20 53 51 4c 69 74 65 20 75 73 65 20 62   in SQLite use b
2b660 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 73 20  yte-range locks 
2b670 6f 6e 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  on the.** databa
2b680 73 65 20 66 69 6c 65 20 74 6f 20 63 6f 6f 72 64  se file to coord
2b690 69 6e 61 74 65 20 73 61 66 65 2c 20 63 6f 6e 63  inate safe, conc
2b6a0 75 72 72 65 6e 74 20 61 63 63 65 73 73 20 62 79  urrent access by
2b6b0 20 6d 75 6c 74 69 70 6c 65 20 72 65 61 64 65 72   multiple reader
2b6c0 73 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65 72 73  s.** and writers
2b6d0 20 5b 68 74 74 70 3a 2f 2f 73 71 6c 69 74 65 2e   [http://sqlite.
2b6e0 6f 72 67 2f 6c 6f 63 6b 69 6e 67 76 33 2e 68 74  org/lockingv3.ht
2b6f0 6d 6c 5d 2e 20 20 54 68 65 20 66 69 76 65 20 66  ml].  The five f
2b700 69 6c 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73  ile locking.** s
2b710 74 61 74 65 73 20 28 55 4e 4c 4f 43 4b 45 44 2c  tates (UNLOCKED,
2b720 20 50 45 4e 44 49 4e 47 2c 20 53 48 41 52 45 44   PENDING, SHARED
2b730 2c 20 52 45 53 45 52 56 45 44 2c 20 45 58 43 4c  , RESERVED, EXCL
2b740 55 53 49 56 45 29 20 61 72 65 20 69 6d 70 6c 65  USIVE) are imple
2b750 6d 65 6e 74 65 64 0a 2a 2a 20 61 73 20 50 4f 53  mented.** as POS
2b760 49 58 20 72 65 61 64 20 26 20 77 72 69 74 65 20  IX read & write 
2b770 6c 6f 63 6b 73 20 6f 76 65 72 20 66 69 78 65 64  locks over fixed
2b780 20 73 65 74 20 6f 66 20 6c 6f 63 61 74 69 6f 6e   set of location
2b790 73 20 28 76 69 61 20 66 73 63 74 6c 29 2c 0a 2a  s (via fsctl),.*
2b7a0 2a 20 6f 6e 20 41 46 50 20 61 6e 64 20 53 4d 42  * on AFP and SMB
2b7b0 20 6f 6e 6c 79 20 65 78 63 6c 75 73 69 76 65 20   only exclusive 
2b7c0 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 73  byte-range locks
2b7d0 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 20 76   are available v
2b7e0 69 61 20 66 73 63 74 6c 0a 2a 2a 20 77 69 74 68  ia fsctl.** with
2b7f0 20 5f 49 4f 57 52 28 27 7a 27 2c 20 32 33 2c 20   _IOWR('z', 23, 
2b800 73 74 72 75 63 74 20 42 79 74 65 52 61 6e 67 65  struct ByteRange
2b810 4c 6f 63 6b 50 42 32 29 20 74 6f 20 74 72 61 63  LockPB2) to trac
2b820 6b 20 74 68 65 20 73 61 6d 65 20 35 20 73 74 61  k the same 5 sta
2b830 74 65 73 2e 0a 2a 2a 20 54 6f 20 73 69 6d 75 6c  tes..** To simul
2b840 61 74 65 20 61 20 46 5f 52 44 4c 43 4b 20 6f 6e  ate a F_RDLCK on
2b850 20 74 68 65 20 73 68 61 72 65 64 20 72 61 6e 67   the shared rang
2b860 65 2c 20 6f 6e 20 41 46 50 20 61 20 72 61 6e 64  e, on AFP a rand
2b870 6f 6d 6c 79 20 73 65 6c 65 63 74 65 64 0a 2a 2a  omly selected.**
2b880 20 61 64 64 72 65 73 73 20 69 6e 20 74 68 65 20   address in the 
2b890 73 68 61 72 65 64 20 72 61 6e 67 65 20 69 73 20  shared range is 
2b8a0 74 61 6b 65 6e 20 66 6f 72 20 61 20 53 48 41 52  taken for a SHAR
2b8b0 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20 65 6e 74  ED lock, the ent
2b8c0 69 72 65 0a 2a 2a 20 73 68 61 72 65 64 20 72 61  ire.** shared ra
2b8d0 6e 67 65 20 69 73 20 74 61 6b 65 6e 20 66 6f 72  nge is taken for
2b8e0 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
2b8f0 63 6b 29 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  ck):.**.**      
2b900 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 20 20 20  PENDING_BYTE    
2b910 20 20 20 20 30 78 34 30 30 30 30 30 30 30 09 09      0x40000000..
2b920 20 20 20 09 0a 2a 2a 20 20 20 20 20 20 52 45 53     ..**      RES
2b930 45 52 56 45 44 5f 42 59 54 45 20 20 20 20 20 20  ERVED_BYTE      
2b940 20 30 78 34 30 30 30 30 30 30 31 0a 2a 2a 20 20   0x40000001.**  
2b950 20 20 20 20 53 48 41 52 45 44 5f 52 41 4e 47 45      SHARED_RANGE
2b960 20 20 20 20 20 20 20 20 30 78 34 30 30 30 30 30          0x400000
2b970 30 32 20 2d 3e 20 30 78 34 30 30 30 30 32 30 30  02 -> 0x40000200
2b980 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 6f 72 6b  .**.** This work
2b990 73 20 77 65 6c 6c 20 6f 6e 20 74 68 65 20 6c 6f  s well on the lo
2b9a0 63 61 6c 20 66 69 6c 65 20 73 79 73 74 65 6d 2c  cal file system,
2b9b0 20 62 75 74 20 73 68 6f 77 73 20 61 20 6e 65 61   but shows a nea
2b9c0 72 6c 79 20 31 30 30 78 0a 2a 2a 20 73 6c 6f 77  rly 100x.** slow
2b9d0 64 6f 77 6e 20 69 6e 20 72 65 61 64 20 70 65 72  down in read per
2b9e0 66 6f 72 6d 61 6e 63 65 20 6f 6e 20 41 46 50 20  formance on AFP 
2b9f0 62 65 63 61 75 73 65 20 74 68 65 20 41 46 50 20  because the AFP 
2ba00 63 6c 69 65 6e 74 20 64 69 73 61 62 6c 65 73 0a  client disables.
2ba10 2a 2a 20 74 68 65 20 72 65 61 64 20 63 61 63 68  ** the read cach
2ba20 65 20 77 68 65 6e 20 62 79 74 65 2d 72 61 6e 67  e when byte-rang
2ba30 65 20 6c 6f 63 6b 73 20 61 72 65 20 70 72 65 73  e locks are pres
2ba40 65 6e 74 2e 20 20 45 6e 61 62 6c 69 6e 67 20 74  ent.  Enabling t
2ba50 68 65 20 72 65 61 64 0a 2a 2a 20 63 61 63 68 65  he read.** cache
2ba60 20 65 78 70 6f 73 65 73 20 61 20 63 61 63 68 65   exposes a cache
2ba70 20 63 6f 68 65 72 65 6e 63 79 20 70 72 6f 62 6c   coherency probl
2ba80 65 6d 20 74 68 61 74 20 69 73 20 70 72 65 73 65  em that is prese
2ba90 6e 74 20 6f 6e 20 61 6c 6c 20 4f 53 20 58 0a 2a  nt on all OS X.*
2baa0 2a 20 73 75 70 70 6f 72 74 65 64 20 6e 65 74 77  * supported netw
2bab0 6f 72 6b 20 66 69 6c 65 20 73 79 73 74 65 6d 73  ork file systems
2bac0 2e 20 20 4e 46 53 20 61 6e 64 20 41 46 50 20 62  .  NFS and AFP b
2bad0 6f 74 68 20 6f 62 73 65 72 76 65 20 74 68 65 0a  oth observe the.
2bae0 2a 2a 20 63 6c 6f 73 65 2d 74 6f 2d 6f 70 65 6e  ** close-to-open
2baf0 20 73 65 6d 61 6e 74 69 63 73 20 66 6f 72 20 65   semantics for e
2bb00 6e 73 75 72 69 6e 67 20 63 61 63 68 65 20 63 6f  nsuring cache co
2bb10 68 65 72 65 6e 63 79 0a 2a 2a 20 5b 68 74 74 70  herency.** [http
2bb20 3a 2f 2f 6e 66 73 2e 73 6f 75 72 63 65 66 6f 72  ://nfs.sourcefor
2bb30 67 65 2e 6e 65 74 2f 23 66 61 71 5f 61 38 5d 2c  ge.net/#faq_a8],
2bb40 20 77 68 69 63 68 20 64 6f 65 73 20 6e 6f 74 20   which does not 
2bb50 65 66 66 65 63 74 69 76 65 6c 79 0a 2a 2a 20 61  effectively.** a
2bb60 64 64 72 65 73 73 20 74 68 65 20 72 65 71 75 69  ddress the requi
2bb70 72 65 6d 65 6e 74 73 20 66 6f 72 20 63 6f 6e 63  rements for conc
2bb80 75 72 72 65 6e 74 20 64 61 74 61 62 61 73 65 20  urrent database 
2bb90 61 63 63 65 73 73 20 62 79 20 6d 75 6c 74 69 70  access by multip
2bba0 6c 65 0a 2a 2a 20 72 65 61 64 65 72 73 20 61 6e  le.** readers an
2bbb0 64 20 77 72 69 74 65 72 73 0a 2a 2a 20 5b 68 74  d writers.** [ht
2bbc0 74 70 3a 2f 2f 77 77 77 2e 6e 61 62 62 6c 65 2e  tp://www.nabble.
2bbd0 63 6f 6d 2f 53 51 4c 69 74 65 2d 6f 6e 2d 4e 46  com/SQLite-on-NF
2bbe0 53 2d 63 61 63 68 65 2d 63 6f 68 65 72 65 6e 63  S-cache-coherenc
2bbf0 79 2d 74 64 31 35 36 35 35 37 30 31 2e 68 74 6d  y-td15655701.htm
2bc00 6c 5d 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 64 64  l]..**.** To add
2bc10 72 65 73 73 20 74 68 65 20 70 65 72 66 6f 72 6d  ress the perform
2bc20 61 6e 63 65 20 61 6e 64 20 63 61 63 68 65 20 63  ance and cache c
2bc30 6f 68 65 72 65 6e 63 79 20 69 73 73 75 65 73 2c  oherency issues,
2bc40 20 70 72 6f 78 79 20 66 69 6c 65 20 6c 6f 63 6b   proxy file lock
2bc50 69 6e 67 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74  ing.** changes t
2bc60 68 65 20 77 61 79 20 64 61 74 61 62 61 73 65 20  he way database 
2bc70 61 63 63 65 73 73 20 69 73 20 63 6f 6e 74 72 6f  access is contro
2bc80 6c 6c 65 64 20 62 79 20 6c 69 6d 69 74 69 6e 67  lled by limiting
2bc90 20 61 63 63 65 73 73 20 74 6f 20 61 0a 2a 2a 20   access to a.** 
2bca0 73 69 6e 67 6c 65 20 68 6f 73 74 20 61 74 20 61  single host at a
2bcb0 20 74 69 6d 65 20 61 6e 64 20 6d 6f 76 69 6e 67   time and moving
2bcc0 20 66 69 6c 65 20 6c 6f 63 6b 73 20 6f 66 66 20   file locks off 
2bcd0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
2bce0 66 69 6c 65 0a 2a 2a 20 61 6e 64 20 6f 6e 74 6f  file.** and onto
2bcf0 20 61 20 70 72 6f 78 79 20 66 69 6c 65 20 6f 6e   a proxy file on
2bd00 20 74 68 65 20 6c 6f 63 61 6c 20 66 69 6c 65 20   the local file 
2bd10 73 79 73 74 65 6d 2e 20 20 0a 2a 2a 0a 2a 2a 0a  system.  .**.**.
2bd20 2a 2a 20 55 73 69 6e 67 20 70 72 6f 78 79 20 6c  ** Using proxy l
2bd30 6f 63 6b 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d  ocks.** --------
2bd40 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20  ---------.**.** 
2bd50 43 20 41 50 49 73 0a 2a 2a 0a 2a 2a 20 20 73 71  C APIs.**.**  sq
2bd60 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72  lite3_file_contr
2bd70 6f 6c 28 64 62 2c 20 64 62 6e 61 6d 65 2c 20 53  ol(db, dbname, S
2bd80 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52  QLITE_SET_LOCKPR
2bd90 4f 58 59 46 49 4c 45 2c 0a 2a 2a 20 20 20 20 20  OXYFILE,.**     
2bda0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bdb0 20 20 3c 70 72 6f 78 79 5f 70 61 74 68 3e 20 7c    <proxy_path> |
2bdc0 20 22 3a 61 75 74 6f 3a 22 29 3b 0a 2a 2a 20 20   ":auto:");.**  
2bdd0 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e  sqlite3_file_con
2bde0 74 72 6f 6c 28 64 62 2c 20 64 62 6e 61 6d 65 2c  trol(db, dbname,
2bdf0 20 53 51 4c 49 54 45 5f 47 45 54 5f 4c 4f 43 4b   SQLITE_GET_LOCK
2be00 50 52 4f 58 59 46 49 4c 45 2c 20 26 3c 70 72 6f  PROXYFILE, &<pro
2be10 78 79 5f 70 61 74 68 3e 29 3b 0a 2a 2a 0a 2a 2a  xy_path>);.**.**
2be20 0a 2a 2a 20 53 51 4c 20 70 72 61 67 6d 61 73 0a  .** SQL pragmas.
2be30 2a 2a 0a 2a 2a 20 20 50 52 41 47 4d 41 20 5b 64  **.**  PRAGMA [d
2be40 61 74 61 62 61 73 65 2e 5d 6c 6f 63 6b 5f 70 72  atabase.]lock_pr
2be50 6f 78 79 5f 66 69 6c 65 3d 3c 70 72 6f 78 79 5f  oxy_file=<proxy_
2be60 70 61 74 68 3e 20 7c 20 3a 61 75 74 6f 3a 0a 2a  path> | :auto:.*
2be70 2a 20 20 50 52 41 47 4d 41 20 5b 64 61 74 61 62  *  PRAGMA [datab
2be80 61 73 65 2e 5d 6c 6f 63 6b 5f 70 72 6f 78 79 5f  ase.]lock_proxy_
2be90 66 69 6c 65 0a 2a 2a 0a 2a 2a 20 53 70 65 63 69  file.**.** Speci
2bea0 66 79 69 6e 67 20 22 3a 61 75 74 6f 3a 22 20 6d  fying ":auto:" m
2beb0 65 61 6e 73 20 74 68 61 74 20 69 66 20 74 68 65  eans that if the
2bec0 72 65 20 69 73 20 61 20 63 6f 6e 63 68 20 66 69  re is a conch fi
2bed0 6c 65 20 77 69 74 68 20 61 20 6d 61 74 63 68 69  le with a matchi
2bee0 6e 67 0a 2a 2a 20 68 6f 73 74 20 49 44 20 69 6e  ng.** host ID in
2bef0 20 69 74 2c 20 74 68 65 20 70 72 6f 78 79 20 70   it, the proxy p
2bf00 61 74 68 20 69 6e 20 74 68 65 20 63 6f 6e 63 68  ath in the conch
2bf10 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 75 73   file will be us
2bf20 65 64 2c 20 6f 74 68 65 72 77 69 73 65 0a 2a 2a  ed, otherwise.**
2bf30 20 61 20 70 72 6f 78 79 20 70 61 74 68 20 62 61   a proxy path ba
2bf40 73 65 64 20 6f 6e 20 74 68 65 20 75 73 65 72 27  sed on the user'
2bf50 73 20 74 65 6d 70 20 64 69 72 0a 2a 2a 20 28 76  s temp dir.** (v
2bf60 69 61 20 63 6f 6e 66 73 74 72 28 5f 43 53 5f 44  ia confstr(_CS_D
2bf70 41 52 57 49 4e 5f 55 53 45 52 5f 54 45 4d 50 5f  ARWIN_USER_TEMP_
2bf80 44 49 52 2c 2e 2e 2e 29 29 20 77 69 6c 6c 20 62  DIR,...)) will b
2bf90 65 20 75 73 65 64 20 61 6e 64 20 74 68 65 0a 2a  e used and the.*
2bfa0 2a 20 61 63 74 75 61 6c 20 70 72 6f 78 79 20 66  * actual proxy f
2bfb0 69 6c 65 20 6e 61 6d 65 20 69 73 20 67 65 6e 65  ile name is gene
2bfc0 72 61 74 65 64 20 66 72 6f 6d 20 74 68 65 20 6e  rated from the n
2bfd0 61 6d 65 20 61 6e 64 20 70 61 74 68 20 6f 66 20  ame and path of 
2bfe0 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
2bff0 66 69 6c 65 2e 20 20 46 6f 72 20 65 78 61 6d 70  file.  For examp
2c000 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  le:.**.**       
2c010 46 6f 72 20 64 61 74 61 62 61 73 65 20 70 61 74  For database pat
2c020 68 20 22 2f 55 73 65 72 73 2f 6d 65 2f 66 6f 6f  h "/Users/me/foo
2c030 2e 64 62 22 20 0a 2a 2a 20 20 20 20 20 20 20 54  .db" .**       T
2c040 68 65 20 6c 6f 63 6b 20 70 61 74 68 20 77 69 6c  he lock path wil
2c050 6c 20 62 65 20 22 3c 74 6d 70 64 69 72 3e 2f 73  l be "<tmpdir>/s
2c060 71 6c 69 74 65 70 6c 6f 63 6b 73 2f 5f 55 73 65  qliteplocks/_Use
2c070 72 73 5f 6d 65 5f 66 6f 6f 2e 64 62 3a 61 75 74  rs_me_foo.db:aut
2c080 6f 3a 22 29 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20  o:").**.** Once 
2c090 61 20 6c 6f 63 6b 20 70 72 6f 78 79 20 69 73 20  a lock proxy is 
2c0a0 63 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20 61  configured for a
2c0b0 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
2c0c0 74 69 6f 6e 2c 20 69 74 20 63 61 6e 20 6e 6f 74  tion, it can not
2c0d0 0a 2a 2a 20 62 65 20 72 65 6d 6f 76 65 64 2c 20  .** be removed, 
2c0e0 68 6f 77 65 76 65 72 20 69 74 20 6d 61 79 20 62  however it may b
2c0f0 65 20 73 77 69 74 63 68 65 64 20 74 6f 20 61 20  e switched to a 
2c100 64 69 66 66 65 72 65 6e 74 20 70 72 6f 78 79 20  different proxy 
2c110 70 61 74 68 20 76 69 61 0a 2a 2a 20 74 68 65 20  path via.** the 
2c120 61 62 6f 76 65 20 41 50 49 73 20 28 61 73 73 75  above APIs (assu
2c130 6d 69 6e 67 20 74 68 65 20 63 6f 6e 63 68 20 66  ming the conch f
2c140 69 6c 65 20 69 73 20 6e 6f 74 20 62 65 69 6e 67  ile is not being
2c150 20 68 65 6c 64 20 62 79 20 61 6e 6f 74 68 65 72   held by another
2c160 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f  .** connection o
2c170 72 20 70 72 6f 63 65 73 73 29 2e 20 0a 2a 2a 0a  r process). .**.
2c180 2a 2a 0a 2a 2a 20 48 6f 77 20 70 72 6f 78 79 20  **.** How proxy 
2c190 6c 6f 63 6b 69 6e 67 20 77 6f 72 6b 73 0a 2a 2a  locking works.**
2c1a0 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
2c1b0 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 50  --------.**.** P
2c1c0 72 6f 78 79 20 66 69 6c 65 20 6c 6f 63 6b 69 6e  roxy file lockin
2c1d0 67 20 72 65 6c 69 65 73 20 70 72 69 6d 61 72 69  g relies primari
2c1e0 6c 79 20 6f 6e 20 74 77 6f 20 6e 65 77 20 73 75  ly on two new su
2c1f0 70 70 6f 72 74 69 6e 67 20 66 69 6c 65 73 3a 20  pporting files: 
2c200 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 63 6f 6e 63  .**.**   *  conc
2c210 68 20 66 69 6c 65 20 74 6f 20 6c 69 6d 69 74 20  h file to limit 
2c220 61 63 63 65 73 73 20 74 6f 20 74 68 65 20 64 61  access to the da
2c230 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 61  tabase file to a
2c240 20 73 69 6e 67 6c 65 20 68 6f 73 74 0a 2a 2a 20   single host.** 
2c250 20 20 20 20 20 61 74 20 61 20 74 69 6d 65 0a 2a       at a time.*
2c260 2a 0a 2a 2a 20 20 20 2a 20 20 70 72 6f 78 79 20  *.**   *  proxy 
2c270 66 69 6c 65 20 74 6f 20 61 63 74 20 61 73 20 61  file to act as a
2c280 20 70 72 6f 78 79 20 66 6f 72 20 74 68 65 20 61   proxy for the a
2c290 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20 6e 6f  dvisory locks no
2c2a0 72 6d 61 6c 6c 79 0a 2a 2a 20 20 20 20 20 20 74  rmally.**      t
2c2b0 61 6b 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61  aken on the data
2c2c0 62 61 73 65 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  base.**.** The c
2c2d0 6f 6e 63 68 20 66 69 6c 65 20 2d 20 74 6f 20 75  onch file - to u
2c2e0 73 65 20 61 20 70 72 6f 78 79 20 66 69 6c 65 2c  se a proxy file,
2c2f0 20 73 71 6c 69 74 65 20 6d 75 73 74 20 66 69 72   sqlite must fir
2c300 73 74 20 22 68 6f 6c 64 20 74 68 65 20 63 6f 6e  st "hold the con
2c310 63 68 22 0a 2a 2a 20 62 79 20 74 61 6b 69 6e 67  ch".** by taking
2c320 20 61 6e 20 73 71 6c 69 74 65 2d 73 74 79 6c 65   an sqlite-style
2c330 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20   shared lock on 
2c340 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 2c 20  the conch file, 
2c350 72 65 61 64 69 6e 67 20 74 68 65 0a 2a 2a 20 63  reading the.** c
2c360 6f 6e 74 65 6e 74 73 20 61 6e 64 20 63 6f 6d 70  ontents and comp
2c370 61 72 69 6e 67 20 74 68 65 20 68 6f 73 74 27 73  aring the host's
2c380 20 75 6e 69 71 75 65 20 68 6f 73 74 20 49 44 20   unique host ID 
2c390 28 73 65 65 20 62 65 6c 6f 77 29 20 61 6e 64 20  (see below) and 
2c3a0 6c 6f 63 6b 0a 2a 2a 20 70 72 6f 78 79 20 70 61  lock.** proxy pa
2c3b0 74 68 20 61 67 61 69 6e 73 74 20 74 68 65 20 76  th against the v
2c3c0 61 6c 75 65 73 20 73 74 6f 72 65 64 20 69 6e 20  alues stored in 
2c3d0 74 68 65 20 63 6f 6e 63 68 2e 20 20 54 68 65 20  the conch.  The 
2c3e0 63 6f 6e 63 68 20 66 69 6c 65 20 69 73 0a 2a 2a  conch file is.**
2c3f0 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 73   stored in the s
2c400 61 6d 65 20 64 69 72 65 63 74 6f 72 79 20 61 73  ame directory as
2c410 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2c420 6c 65 20 61 6e 64 20 74 68 65 20 66 69 6c 65 20  le and the file 
2c430 6e 61 6d 65 0a 2a 2a 20 69 73 20 70 61 74 74 65  name.** is patte
2c440 72 6e 65 64 20 61 66 74 65 72 20 74 68 65 20 64  rned after the d
2c450 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d  atabase file nam
2c460 65 20 61 73 20 22 2e 3c 64 61 74 61 62 61 73 65  e as ".<database
2c470 6e 61 6d 65 3e 2d 63 6f 6e 63 68 22 2e 0a 2a 2a  name>-conch"..**
2c480 20 49 66 20 74 68 65 20 63 6f 6e 63 68 20 66 69   If the conch fi
2c490 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  le does not exis
2c4a0 74 2c 20 6f 72 20 69 74 27 73 20 63 6f 6e 74 65  t, or it's conte
2c4b0 6e 74 73 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68  nts do not match
2c4c0 20 74 68 65 0a 2a 2a 20 68 6f 73 74 20 49 44 20   the.** host ID 
2c4d0 61 6e 64 2f 6f 72 20 70 72 6f 78 79 20 70 61 74  and/or proxy pat
2c4e0 68 2c 20 74 68 65 6e 20 74 68 65 20 6c 6f 63 6b  h, then the lock
2c4f0 20 69 73 20 65 73 63 61 6c 61 74 65 64 20 74 6f   is escalated to
2c500 20 61 6e 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a   an exclusive.**
2c510 20 6c 6f 63 6b 20 61 6e 64 20 74 68 65 20 63 6f   lock and the co
2c520 6e 63 68 20 66 69 6c 65 20 63 6f 6e 74 65 6e 74  nch file content
2c530 73 20 69 73 20 75 70 64 61 74 65 64 20 77 69 74  s is updated wit
2c540 68 20 74 68 65 20 68 6f 73 74 20 49 44 20 61 6e  h the host ID an
2c550 64 20 70 72 6f 78 79 0a 2a 2a 20 70 61 74 68 20  d proxy.** path 
2c560 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 69 73 20  and the lock is 
2c570 64 6f 77 6e 67 72 61 64 65 64 20 74 6f 20 61 20  downgraded to a 
2c580 73 68 61 72 65 64 20 6c 6f 63 6b 20 61 67 61 69  shared lock agai
2c590 6e 2e 20 20 49 66 20 74 68 65 20 63 6f 6e 63 68  n.  If the conch
2c5a0 0a 2a 2a 20 69 73 20 68 65 6c 64 20 62 79 20 61  .** is held by a
2c5b0 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 28  nother process (
2c5c0 77 69 74 68 20 61 20 73 68 61 72 65 64 20 6c 6f  with a shared lo
2c5d0 63 6b 29 2c 20 74 68 65 20 65 78 63 6c 75 73 69  ck), the exclusi
2c5e0 76 65 20 6c 6f 63 6b 0a 2a 2a 20 77 69 6c 6c 20  ve lock.** will 
2c5f0 66 61 69 6c 20 61 6e 64 20 53 51 4c 49 54 45 5f  fail and SQLITE_
2c600 42 55 53 59 20 69 73 20 72 65 74 75 72 6e 65 64  BUSY is returned
2c610 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 78  ..**.** The prox
2c620 79 20 66 69 6c 65 20 2d 20 61 20 73 69 6e 67 6c  y file - a singl
2c630 65 2d 62 79 74 65 20 66 69 6c 65 20 75 73 65 64  e-byte file used
2c640 20 66 6f 72 20 61 6c 6c 20 61 64 76 69 73 6f 72   for all advisor
2c650 79 20 66 69 6c 65 20 6c 6f 63 6b 73 0a 2a 2a 20  y file locks.** 
2c660 6e 6f 72 6d 61 6c 6c 79 20 74 61 6b 65 6e 20 6f  normally taken o
2c670 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2c680 69 6c 65 2e 20 20 20 54 68 69 73 20 61 6c 6c 6f  ile.   This allo
2c690 77 73 20 66 6f 72 20 73 61 66 65 20 73 68 61 72  ws for safe shar
2c6a0 69 6e 67 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61  ing.** of the da
2c6b0 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20  tabase file for 
2c6c0 6d 75 6c 74 69 70 6c 65 20 72 65 61 64 65 72 73  multiple readers
2c6d0 20 61 6e 64 20 77 72 69 74 65 72 73 20 6f 6e 20   and writers on 
2c6e0 74 68 65 20 73 61 6d 65 0a 2a 2a 20 68 6f 73 74  the same.** host
2c6f0 20 28 74 68 65 20 63 6f 6e 63 68 20 65 6e 73 75   (the conch ensu
2c700 72 65 73 20 74 68 61 74 20 74 68 65 79 20 61 6c  res that they al
2c710 6c 20 75 73 65 20 74 68 65 20 73 61 6d 65 20 6c  l use the same l
2c720 6f 63 61 6c 20 6c 6f 63 6b 20 66 69 6c 65 29 2e  ocal lock file).
2c730 0a 2a 2a 0a 2a 2a 20 52 65 71 75 65 73 74 69 6e  .**.** Requestin
2c740 67 20 74 68 65 20 6c 6f 63 6b 20 70 72 6f 78 79  g the lock proxy
2c750 20 64 6f 65 73 20 6e 6f 74 20 69 6d 6d 65 64 69   does not immedi
2c760 61 74 65 6c 79 20 74 61 6b 65 20 74 68 65 20 63  ately take the c
2c770 6f 6e 63 68 2c 20 69 74 20 69 73 0a 2a 2a 20 6f  onch, it is.** o
2c780 6e 6c 79 20 74 61 6b 65 6e 20 77 68 65 6e 20 74  nly taken when t
2c790 68 65 20 66 69 72 73 74 20 72 65 71 75 65 73 74  he first request
2c7a0 20 74 6f 20 6c 6f 63 6b 20 64 61 74 61 62 61 73   to lock databas
2c7b0 65 20 66 69 6c 65 20 69 73 20 6d 61 64 65 2e 20  e file is made. 
2c7c0 20 0a 2a 2a 20 54 68 69 73 20 6d 61 74 63 68 65   .** This matche
2c7d0 73 20 74 68 65 20 73 65 6d 61 6e 74 69 63 73 20  s the semantics 
2c7e0 6f 66 20 74 68 65 20 74 72 61 64 69 74 69 6f 6e  of the tradition
2c7f0 61 6c 20 6c 6f 63 6b 69 6e 67 20 62 65 68 61 76  al locking behav
2c800 69 6f 72 2c 20 77 68 65 72 65 0a 2a 2a 20 6f 70  ior, where.** op
2c810 65 6e 69 6e 67 20 61 20 63 6f 6e 6e 65 63 74 69  ening a connecti
2c820 6f 6e 20 74 6f 20 61 20 64 61 74 61 62 61 73 65  on to a database
2c830 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 74   file does not t
2c840 61 6b 65 20 61 20 6c 6f 63 6b 20 6f 6e 20 69 74  ake a lock on it
2c850 2e 0a 2a 2a 20 54 68 65 20 73 68 61 72 65 64 20  ..** The shared 
2c860 6c 6f 63 6b 20 61 6e 64 20 61 6e 20 6f 70 65 6e  lock and an open
2c870 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
2c880 20 61 72 65 20 6d 61 69 6e 74 61 69 6e 65 64 20   are maintained 
2c890 75 6e 74 69 6c 20 0a 2a 2a 20 74 68 65 20 63 6f  until .** the co
2c8a0 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 74 68 65 20  nnection to the 
2c8b0 64 61 74 61 62 61 73 65 20 69 73 20 63 6c 6f 73  database is clos
2c8c0 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  ed. .**.** The p
2c8d0 72 6f 78 79 20 66 69 6c 65 20 61 6e 64 20 74 68  roxy file and th
2c8e0 65 20 6c 6f 63 6b 20 66 69 6c 65 20 61 72 65 20  e lock file are 
2c8f0 6e 65 76 65 72 20 64 65 6c 65 74 65 64 20 73 6f  never deleted so
2c900 20 74 68 65 79 20 6f 6e 6c 79 20 6e 65 65 64 0a   they only need.
2c910 2a 2a 20 74 6f 20 62 65 20 63 72 65 61 74 65 64  ** to be created
2c920 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   the first time 
2c930 74 68 65 79 20 61 72 65 20 75 73 65 64 2e 0a 2a  they are used..*
2c940 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 61 74 69  *.** Configurati
2c950 6f 6e 20 6f 70 74 69 6f 6e 73 0a 2a 2a 20 2d 2d  on options.** --
2c960 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2c970 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 20 53 51 4c 49 54  ---.**.**  SQLIT
2c980 45 5f 50 52 45 46 45 52 5f 50 52 4f 58 59 5f 4c  E_PREFER_PROXY_L
2c990 4f 43 4b 49 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 20  OCKING.**.**    
2c9a0 20 20 20 44 61 74 61 62 61 73 65 20 66 69 6c 65     Database file
2c9b0 73 20 61 63 63 65 73 73 65 64 20 6f 6e 20 6e 6f  s accessed on no
2c9c0 6e 2d 6c 6f 63 61 6c 20 66 69 6c 65 20 73 79 73  n-local file sys
2c9d0 74 65 6d 73 20 61 72 65 0a 2a 2a 20 20 20 20 20  tems are.**     
2c9e0 20 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20    automatically 
2c9f0 63 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20 70  configured for p
2ca00 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 2c 20 6c 6f  roxy locking, lo
2ca10 63 6b 20 66 69 6c 65 73 20 61 72 65 0a 2a 2a 20  ck files are.** 
2ca20 20 20 20 20 20 20 6e 61 6d 65 64 20 61 75 74 6f        named auto
2ca30 6d 61 74 69 63 61 6c 6c 79 20 75 73 69 6e 67 20  matically using 
2ca40 74 68 65 20 73 61 6d 65 20 6c 6f 67 69 63 20 61  the same logic a
2ca50 73 0a 2a 2a 20 20 20 20 20 20 20 50 52 41 47 4d  s.**       PRAGM
2ca60 41 20 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66 69 6c  A lock_proxy_fil
2ca70 65 3d 22 3a 61 75 74 6f 3a 22 0a 2a 2a 20 20 20  e=":auto:".**   
2ca80 20 0a 2a 2a 20 20 53 51 4c 49 54 45 5f 50 52 4f   .**  SQLITE_PRO
2ca90 58 59 5f 44 45 42 55 47 0a 2a 2a 0a 2a 2a 20 20  XY_DEBUG.**.**  
2caa0 20 20 20 20 20 45 6e 61 62 6c 65 73 20 74 68 65       Enables the
2cab0 20 6c 6f 67 67 69 6e 67 20 6f 66 20 65 72 72 6f   logging of erro
2cac0 72 20 6d 65 73 73 61 67 65 73 20 64 75 72 69 6e  r messages durin
2cad0 67 20 68 6f 73 74 20 69 64 20 66 69 6c 65 0a 2a  g host id file.*
2cae0 2a 20 20 20 20 20 20 20 72 65 74 72 69 65 76 61  *       retrieva
2caf0 6c 20 61 6e 64 20 63 72 65 61 74 69 6f 6e 0a 2a  l and creation.*
2cb00 2a 0a 2a 2a 20 20 4c 4f 43 4b 50 52 4f 58 59 44  *.**  LOCKPROXYD
2cb10 49 52 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 4f  IR.**.**       O
2cb20 76 65 72 72 69 64 65 73 20 74 68 65 20 64 65 66  verrides the def
2cb30 61 75 6c 74 20 64 69 72 65 63 74 6f 72 79 20 75  ault directory u
2cb40 73 65 64 20 66 6f 72 20 6c 6f 63 6b 20 70 72 6f  sed for lock pro
2cb50 78 79 20 66 69 6c 65 73 20 74 68 61 74 0a 2a 2a  xy files that.**
2cb60 20 20 20 20 20 20 20 61 72 65 20 6e 61 6d 65 64         are named
2cb70 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 76   automatically v
2cb80 69 61 20 74 68 65 20 22 3a 61 75 74 6f 3a 22 20  ia the ":auto:" 
2cb90 73 65 74 74 69 6e 67 0a 2a 2a 0a 2a 2a 20 20 53  setting.**.**  S
2cba0 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 52  QLITE_DEFAULT_PR
2cbb0 4f 58 59 44 49 52 5f 50 45 52 4d 49 53 53 49 4f  OXYDIR_PERMISSIO
2cbc0 4e 53 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 50  NS.**.**       P
2cbd0 65 72 6d 69 73 73 69 6f 6e 73 20 74 6f 20 75 73  ermissions to us
2cbe0 65 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20  e when creating 
2cbf0 61 20 64 69 72 65 63 74 6f 72 79 20 66 6f 72 20  a directory for 
2cc00 73 74 6f 72 69 6e 67 20 74 68 65 0a 2a 2a 20 20  storing the.**  
2cc10 20 20 20 20 20 6c 6f 63 6b 20 70 72 6f 78 79 20       lock proxy 
2cc20 66 69 6c 65 73 2c 20 6f 6e 6c 79 20 75 73 65 64  files, only used
2cc30 20 77 68 65 6e 20 4c 4f 43 4b 50 52 4f 58 59 44   when LOCKPROXYD
2cc40 49 52 20 69 73 20 6e 6f 74 20 73 65 74 2e 0a 2a  IR is not set..*
2cc50 2a 20 20 20 20 0a 2a 2a 20 20 20 20 0a 2a 2a 20  *    .**    .** 
2cc60 41 73 20 6d 65 6e 74 69 6f 6e 65 64 20 61 62 6f  As mentioned abo
2cc70 76 65 2c 20 77 68 65 6e 20 63 6f 6d 70 69 6c 65  ve, when compile
2cc80 64 20 77 69 74 68 20 53 51 4c 49 54 45 5f 50 52  d with SQLITE_PR
2cc90 45 46 45 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49  EFER_PROXY_LOCKI
2cca0 4e 47 2c 0a 2a 2a 20 73 65 74 74 69 6e 67 20 74  NG,.** setting t
2ccb0 68 65 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76  he environment v
2ccc0 61 72 69 61 62 6c 65 20 53 51 4c 49 54 45 5f 46  ariable SQLITE_F
2ccd0 4f 52 43 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49  ORCE_PROXY_LOCKI
2cce0 4e 47 20 74 6f 20 31 20 77 69 6c 6c 0a 2a 2a 20  NG to 1 will.** 
2ccf0 66 6f 72 63 65 20 70 72 6f 78 79 20 6c 6f 63 6b  force proxy lock
2cd00 69 6e 67 20 74 6f 20 62 65 20 75 73 65 64 20 66  ing to be used f
2cd10 6f 72 20 65 76 65 72 79 20 64 61 74 61 62 61 73  or every databas
2cd20 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 2c 20 61  e file opened, a
2cd30 6e 64 20 30 0a 2a 2a 20 77 69 6c 6c 20 66 6f 72  nd 0.** will for
2cd40 63 65 20 61 75 74 6f 6d 61 74 69 63 20 70 72 6f  ce automatic pro
2cd50 78 79 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 62 65  xy locking to be
2cd60 20 64 69 73 61 62 6c 65 64 20 66 6f 72 20 61 6c   disabled for al
2cd70 6c 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69  l database.** fi
2cd80 6c 65 73 20 28 65 78 70 6c 69 63 69 74 79 20 63  les (explicity c
2cd90 61 6c 6c 69 6e 67 20 74 68 65 20 53 51 4c 49 54  alling the SQLIT
2cda0 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46  E_SET_LOCKPROXYF
2cdb0 49 4c 45 20 70 72 61 67 6d 61 20 6f 72 0a 2a 2a  ILE pragma or.**
2cdc0 20 73 71 6c 69 74 65 5f 66 69 6c 65 5f 63 6f 6e   sqlite_file_con
2cdd0 74 72 6f 6c 20 41 50 49 20 69 73 20 6e 6f 74 20  trol API is not 
2cde0 61 66 66 65 63 74 65 64 20 62 79 20 53 51 4c 49  affected by SQLI
2cdf0 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f 4c  TE_FORCE_PROXY_L
2ce00 4f 43 4b 49 4e 47 29 2e 0a 2a 2f 0a 0a 2f 2a 0a  OCKING)..*/../*.
2ce10 2a 2a 20 50 72 6f 78 79 20 6c 6f 63 6b 69 6e 67  ** Proxy locking
2ce20 20 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62   is only availab
2ce30 6c 65 20 6f 6e 20 4d 61 63 4f 53 58 20 0a 2a 2f  le on MacOSX .*/
2ce40 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  .#if defined(__A
2ce50 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
2ce60 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
2ce70 5f 53 54 59 4c 45 0a 0a 2f 2a 0a 2a 2a 20 54 68  _STYLE../*.** Th
2ce80 65 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f  e proxyLockingCo
2ce90 6e 74 65 78 74 20 68 61 73 20 74 68 65 20 70 61  ntext has the pa
2cea0 74 68 20 61 6e 64 20 66 69 6c 65 20 73 74 72 75  th and file stru
2ceb0 63 74 75 72 65 73 20 66 6f 72 20 74 68 65 20 72  ctures for the r
2cec0 65 6d 6f 74 65 20 0a 2a 2a 20 61 6e 64 20 6c 6f  emote .** and lo
2ced0 63 61 6c 20 70 72 6f 78 79 20 66 69 6c 65 73 20  cal proxy files 
2cee0 69 6e 20 69 74 0a 2a 2f 0a 74 79 70 65 64 65 66  in it.*/.typedef
2cef0 20 73 74 72 75 63 74 20 70 72 6f 78 79 4c 6f 63   struct proxyLoc
2cf00 6b 69 6e 67 43 6f 6e 74 65 78 74 20 70 72 6f 78  kingContext prox
2cf10 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  yLockingContext;
2cf20 0a 73 74 72 75 63 74 20 70 72 6f 78 79 4c 6f 63  .struct proxyLoc
2cf30 6b 69 6e 67 43 6f 6e 74 65 78 74 20 7b 0a 20 20  kingContext {.  
2cf40 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46  unixFile *conchF
2cf50 69 6c 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ile;         /* 
2cf60 4f 70 65 6e 20 63 6f 6e 63 68 20 66 69 6c 65 20  Open conch file 
2cf70 2a 2f 0a 20 20 63 68 61 72 20 2a 63 6f 6e 63 68  */.  char *conch
2cf80 46 69 6c 65 50 61 74 68 3b 20 20 20 20 20 20 20  FilePath;       
2cf90 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
2cfa0 20 63 6f 6e 63 68 20 66 69 6c 65 20 2a 2f 0a 20   conch file */. 
2cfb0 20 75 6e 69 78 46 69 6c 65 20 2a 6c 6f 63 6b 50   unixFile *lockP
2cfc0 72 6f 78 79 3b 20 20 20 20 20 20 20 20 20 2f 2a  roxy;         /*
2cfd0 20 4f 70 65 6e 20 70 72 6f 78 79 20 6c 6f 63 6b   Open proxy lock
2cfe0 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20   file */.  char 
2cff0 2a 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 3b 20  *lockProxyPath; 
2d000 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
2d010 6f 66 20 74 68 65 20 70 72 6f 78 79 20 6c 6f 63  of the proxy loc
2d020 6b 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72  k file */.  char
2d030 20 2a 64 62 50 61 74 68 3b 20 20 20 20 20 20 20   *dbPath;       
2d040 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
2d050 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 66 69 6c   of the open fil
2d060 65 20 2a 2f 0a 20 20 69 6e 74 20 63 6f 6e 63 68  e */.  int conch
2d070 48 65 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20  Held;           
2d080 20 20 20 20 2f 2a 20 31 20 69 66 20 74 68 65 20      /* 1 if the 
2d090 63 6f 6e 63 68 20 69 73 20 68 65 6c 64 2c 20 2d  conch is held, -
2d0a0 31 20 69 66 20 6c 6f 63 6b 6c 65 73 73 20 2a 2f  1 if lockless */
2d0b0 0a 20 20 76 6f 69 64 20 2a 6f 6c 64 4c 6f 63 6b  .  void *oldLock
2d0c0 69 6e 67 43 6f 6e 74 65 78 74 3b 20 20 20 20 20  ingContext;     
2d0d0 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 6c 6f 63 6b  /* Original lock
2d0e0 69 6e 67 63 6f 6e 74 65 78 74 20 74 6f 20 72 65  ingcontext to re
2d0f0 73 74 6f 72 65 20 6f 6e 20 63 6c 6f 73 65 20 2a  store on close *
2d100 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  /.  sqlite3_io_m
2d110 65 74 68 6f 64 73 20 63 6f 6e 73 74 20 2a 70 4f  ethods const *pO
2d120 6c 64 4d 65 74 68 6f 64 3b 20 20 20 20 20 2f 2a  ldMethod;     /*
2d130 20 4f 72 69 67 69 6e 61 6c 20 49 2f 4f 20 6d 65   Original I/O me
2d140 74 68 6f 64 73 20 66 6f 72 20 63 6c 6f 73 65 20  thods for close 
2d150 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 0a 2a 2a 20 54 68  */.};../* .** Th
2d160 65 20 70 72 6f 78 79 20 6c 6f 63 6b 20 66 69 6c  e proxy lock fil
2d170 65 20 70 61 74 68 20 66 6f 72 20 74 68 65 20 64  e path for the d
2d180 61 74 61 62 61 73 65 20 61 74 20 64 62 50 61 74  atabase at dbPat
2d190 68 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74  h is written int
2d1a0 6f 20 6c 50 61 74 68 2c 20 0a 2a 2a 20 77 68 69  o lPath, .** whi
2d1b0 63 68 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f  ch must point to
2d1c0 20 76 61 6c 69 64 2c 20 77 72 69 74 61 62 6c 65   valid, writable
2d1d0 20 6d 65 6d 6f 72 79 20 6c 61 72 67 65 20 65 6e   memory large en
2d1e0 6f 75 67 68 20 66 6f 72 20 61 20 6d 61 78 4c 65  ough for a maxLe
2d1f0 6e 20 6c 65 6e 67 74 68 0a 2a 2a 20 66 69 6c 65  n length.** file
2d200 20 70 61 74 68 2e 20 0a 2a 2f 0a 73 74 61 74 69   path. .*/.stati
2d210 63 20 69 6e 74 20 70 72 6f 78 79 47 65 74 4c 6f  c int proxyGetLo
2d220 63 6b 50 61 74 68 28 63 6f 6e 73 74 20 63 68 61  ckPath(const cha
2d230 72 20 2a 64 62 50 61 74 68 2c 20 63 68 61 72 20  r *dbPath, char 
2d240 2a 6c 50 61 74 68 2c 20 73 69 7a 65 5f 74 20 6d  *lPath, size_t m
2d250 61 78 4c 65 6e 29 7b 0a 20 20 69 6e 74 20 6c 65  axLen){.  int le
2d260 6e 3b 0a 20 20 69 6e 74 20 64 62 4c 65 6e 3b 0a  n;.  int dbLen;.
2d270 20 20 69 6e 74 20 69 3b 0a 0a 23 69 66 64 65 66    int i;..#ifdef
2d280 20 4c 4f 43 4b 50 52 4f 58 59 44 49 52 0a 20 20   LOCKPROXYDIR.  
2d290 6c 65 6e 20 3d 20 73 74 72 6c 63 70 79 28 6c 50  len = strlcpy(lP
2d2a0 61 74 68 2c 20 4c 4f 43 4b 50 52 4f 58 59 44 49  ath, LOCKPROXYDI
2d2b0 52 2c 20 6d 61 78 4c 65 6e 29 3b 0a 23 65 6c 73  R, maxLen);.#els
2d2c0 65 0a 23 20 69 66 64 65 66 20 5f 43 53 5f 44 41  e.# ifdef _CS_DA
2d2d0 52 57 49 4e 5f 55 53 45 52 5f 54 45 4d 50 5f 44  RWIN_USER_TEMP_D
2d2e0 49 52 0a 20 20 7b 0a 20 20 20 20 69 66 28 20 21  IR.  {.    if( !
2d2f0 63 6f 6e 66 73 74 72 28 5f 43 53 5f 44 41 52 57  confstr(_CS_DARW
2d300 49 4e 5f 55 53 45 52 5f 54 45 4d 50 5f 44 49 52  IN_USER_TEMP_DIR
2d310 2c 20 6c 50 61 74 68 2c 20 6d 61 78 4c 65 6e 29  , lPath, maxLen)
2d320 20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43   ){.      OSTRAC
2d330 45 34 28 22 47 45 54 4c 4f 43 4b 50 41 54 48 20  E4("GETLOCKPATH 
2d340 20 66 61 69 6c 65 64 20 25 73 20 65 72 72 6e 6f   failed %s errno
2d350 3d 25 64 20 70 69 64 3d 25 64 5c 6e 22 2c 0a 20  =%d pid=%d\n",. 
2d360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 50                lP
2d370 61 74 68 2c 20 65 72 72 6e 6f 2c 20 67 65 74 70  ath, errno, getp
2d380 69 64 28 29 29 3b 0a 20 20 20 20 20 20 72 65 74  id());.      ret
2d390 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
2d3a0 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  _LOCK;.    }.   
2d3b0 20 6c 65 6e 20 3d 20 73 74 72 6c 63 61 74 28 6c   len = strlcat(l
2d3c0 50 61 74 68 2c 20 22 73 71 6c 69 74 65 70 6c 6f  Path, "sqliteplo
2d3d0 63 6b 73 22 2c 20 6d 61 78 4c 65 6e 29 3b 20 20  cks", maxLen);  
2d3e0 20 20 0a 20 20 7d 0a 23 20 65 6c 73 65 0a 20 20    .  }.# else.  
2d3f0 6c 65 6e 20 3d 20 73 74 72 6c 63 70 79 28 6c 50  len = strlcpy(lP
2d400 61 74 68 2c 20 22 2f 74 6d 70 2f 22 2c 20 6d 61  ath, "/tmp/", ma
2d410 78 4c 65 6e 29 3b 0a 23 20 65 6e 64 69 66 0a 23  xLen);.# endif.#
2d420 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 6c 50 61  endif..  if( lPa
2d430 74 68 5b 6c 65 6e 2d 31 5d 21 3d 27 2f 27 20 29  th[len-1]!='/' )
2d440 7b 0a 20 20 20 20 6c 65 6e 20 3d 20 73 74 72 6c  {.    len = strl
2d450 63 61 74 28 6c 50 61 74 68 2c 20 22 2f 22 2c 20  cat(lPath, "/", 
2d460 6d 61 78 4c 65 6e 29 3b 0a 20 20 7d 0a 20 20 0a  maxLen);.  }.  .
2d470 20 20 2f 2a 20 74 72 61 6e 73 66 6f 72 6d 20 74    /* transform t
2d480 68 65 20 64 62 20 70 61 74 68 20 74 6f 20 61 20  he db path to a 
2d490 75 6e 69 71 75 65 20 63 61 63 68 65 20 6e 61 6d  unique cache nam
2d4a0 65 20 2a 2f 0a 20 20 64 62 4c 65 6e 20 3d 20 28  e */.  dbLen = (
2d4b0 69 6e 74 29 73 74 72 6c 65 6e 28 64 62 50 61 74  int)strlen(dbPat
2d4c0 68 29 3b 0a 20 20 66 6f 72 28 20 69 3d 30 3b 20  h);.  for( i=0; 
2d4d0 69 3c 64 62 4c 65 6e 20 26 26 20 28 69 2b 6c 65  i<dbLen && (i+le
2d4e0 6e 2b 37 29 3c 6d 61 78 4c 65 6e 3b 20 69 2b 2b  n+7)<maxLen; i++
2d4f0 29 7b 0a 20 20 20 20 63 68 61 72 20 63 20 3d 20  ){.    char c = 
2d500 64 62 50 61 74 68 5b 69 5d 3b 0a 20 20 20 20 6c  dbPath[i];.    l
2d510 50 61 74 68 5b 69 2b 6c 65 6e 5d 20 3d 20 28 63  Path[i+len] = (c
2d520 3d 3d 27 2f 27 29 3f 27 5f 27 3a 63 3b 0a 20 20  =='/')?'_':c;.  
2d530 7d 0a 20 20 6c 50 61 74 68 5b 69 2b 6c 65 6e 5d  }.  lPath[i+len]
2d540 3d 27 5c 30 27 3b 0a 20 20 73 74 72 6c 63 61 74  ='\0';.  strlcat
2d550 28 6c 50 61 74 68 2c 20 22 3a 61 75 74 6f 3a 22  (lPath, ":auto:"
2d560 2c 20 6d 61 78 4c 65 6e 29 3b 0a 20 20 4f 53 54  , maxLen);.  OST
2d570 52 41 43 45 33 28 22 47 45 54 4c 4f 43 4b 50 41  RACE3("GETLOCKPA
2d580 54 48 20 20 70 72 6f 78 79 20 6c 6f 63 6b 20 70  TH  proxy lock p
2d590 61 74 68 3d 25 73 20 70 69 64 3d 25 64 5c 6e 22  ath=%s pid=%d\n"
2d5a0 2c 20 6c 50 61 74 68 2c 20 67 65 74 70 69 64 28  , lPath, getpid(
2d5b0 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ));.  return SQL
2d5c0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 0a 20  ITE_OK;.}../* . 
2d5d0 2a 2a 20 43 72 65 61 74 65 73 20 74 68 65 20 6c  ** Creates the l
2d5e0 6f 63 6b 20 66 69 6c 65 20 61 6e 64 20 61 6e 79  ock file and any
2d5f0 20 6d 69 73 73 69 6e 67 20 64 69 72 65 63 74 6f   missing directo
2d600 72 69 65 73 20 69 6e 20 6c 6f 63 6b 50 61 74 68  ries in lockPath
2d610 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  . */.static int 
2d620 70 72 6f 78 79 43 72 65 61 74 65 4c 6f 63 6b 50  proxyCreateLockP
2d630 61 74 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ath(const char *
2d640 6c 6f 63 6b 50 61 74 68 29 7b 0a 20 20 69 6e 74  lockPath){.  int
2d650 20 69 2c 20 6c 65 6e 3b 0a 20 20 63 68 61 72 20   i, len;.  char 
2d660 62 75 66 5b 4d 41 58 50 41 54 48 4c 45 4e 5d 3b  buf[MAXPATHLEN];
2d670 0a 20 20 69 6e 74 20 73 74 61 72 74 20 3d 20 30  .  int start = 0
2d680 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 6c 6f  ;.  .  assert(lo
2d690 63 6b 50 61 74 68 21 3d 4e 55 4c 4c 29 3b 0a 20  ckPath!=NULL);. 
2d6a0 20 2f 2a 20 74 72 79 20 74 6f 20 63 72 65 61 74   /* try to creat
2d6b0 65 20 61 6c 6c 20 74 68 65 20 69 6e 74 65 72 6d  e all the interm
2d6c0 65 64 69 61 74 65 20 64 69 72 65 63 74 6f 72 69  ediate directori
2d6d0 65 73 20 2a 2f 0a 20 20 6c 65 6e 20 3d 20 28 69  es */.  len = (i
2d6e0 6e 74 29 73 74 72 6c 65 6e 28 6c 6f 63 6b 50 61  nt)strlen(lockPa
2d6f0 74 68 29 3b 0a 20 20 62 75 66 5b 30 5d 20 3d 20  th);.  buf[0] = 
2d700 6c 6f 63 6b 50 61 74 68 5b 30 5d 3b 0a 20 20 66  lockPath[0];.  f
2d710 6f 72 28 20 69 3d 31 3b 20 69 3c 6c 65 6e 3b 20  or( i=1; i<len; 
2d720 69 2b 2b 20 29 7b 0a 20 20 20 20 69 66 28 20 6c  i++ ){.    if( l
2d730 6f 63 6b 50 61 74 68 5b 69 5d 20 3d 3d 20 27 2f  ockPath[i] == '/
2d740 27 20 26 26 20 28 69 20 2d 20 73 74 61 72 74 20  ' && (i - start 
2d750 3e 20 30 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  > 0) ){.      /*
2d760 20 6f 6e 6c 79 20 6d 6b 64 69 72 20 69 66 20 6c   only mkdir if l
2d770 65 61 66 20 64 69 72 20 21 3d 20 22 2e 22 20 6f  eaf dir != "." o
2d780 72 20 22 2f 22 20 6f 72 20 22 2e 2e 22 20 2a 2f  r "/" or ".." */
2d790 0a 20 20 20 20 20 20 69 66 28 20 69 2d 73 74 61  .      if( i-sta
2d7a0 72 74 3e 32 20 7c 7c 20 28 69 2d 73 74 61 72 74  rt>2 || (i-start
2d7b0 3d 3d 31 20 26 26 20 62 75 66 5b 73 74 61 72 74  ==1 && buf[start
2d7c0 5d 20 21 3d 20 27 2e 27 20 26 26 20 62 75 66 5b  ] != '.' && buf[
2d7d0 73 74 61 72 74 5d 20 21 3d 20 27 2f 27 29 20 0a  start] != '/') .
2d7e0 20 20 20 20 20 20 20 20 20 7c 7c 20 28 69 2d 73           || (i-s
2d7f0 74 61 72 74 3d 3d 32 20 26 26 20 62 75 66 5b 73  tart==2 && buf[s
2d800 74 61 72 74 5d 20 21 3d 20 27 2e 27 20 26 26 20  tart] != '.' && 
2d810 62 75 66 5b 73 74 61 72 74 2b 31 5d 20 21 3d 20  buf[start+1] != 
2d820 27 2e 27 29 20 29 7b 0a 20 20 20 20 20 20 20 20  '.') ){.        
2d830 62 75 66 5b 69 5d 3d 27 5c 30 27 3b 0a 20 20 20  buf[i]='\0';.   
2d840 20 20 20 20 20 69 66 28 20 6d 6b 64 69 72 28 62       if( mkdir(b
2d850 75 66 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55  uf, SQLITE_DEFAU
2d860 4c 54 5f 50 52 4f 58 59 44 49 52 5f 50 45 52 4d  LT_PROXYDIR_PERM
2d870 49 53 53 49 4f 4e 53 29 20 29 7b 0a 20 20 20 20  ISSIONS) ){.    
2d880 20 20 20 20 20 20 69 6e 74 20 65 72 72 3d 65 72        int err=er
2d890 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 69  rno;.          i
2d8a0 66 28 20 65 72 72 21 3d 45 45 58 49 53 54 20 29  f( err!=EEXIST )
2d8b0 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 4f   {.            O
2d8c0 53 54 52 41 43 45 35 28 22 43 52 45 41 54 45 4c  STRACE5("CREATEL
2d8d0 4f 43 4b 50 41 54 48 20 20 46 41 49 4c 45 44 20  OCKPATH  FAILED 
2d8e0 63 72 65 61 74 69 6e 67 20 25 73 2c 20 22 0a 20  creating %s, ". 
2d8f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d900 20 20 20 20 22 27 25 73 27 20 70 72 6f 78 79 20      "'%s' proxy 
2d910 6c 6f 63 6b 20 70 61 74 68 3d 25 73 20 70 69 64  lock path=%s pid
2d920 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%d\n",.        
2d930 20 20 20 20 20 20 20 20 20 20 20 20 20 62 75 66               buf
2d940 2c 20 73 74 72 65 72 72 6f 72 28 65 72 72 29 2c  , strerror(err),
2d950 20 6c 6f 63 6b 50 61 74 68 2c 20 67 65 74 70 69   lockPath, getpi
2d960 64 28 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  d());.          
2d970 20 20 72 65 74 75 72 6e 20 65 72 72 3b 0a 20 20    return err;.  
2d980 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2d990 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
2d9a0 20 20 73 74 61 72 74 3d 69 2b 31 3b 0a 20 20 20    start=i+1;.   
2d9b0 20 7d 0a 20 20 20 20 62 75 66 5b 69 5d 20 3d 20   }.    buf[i] = 
2d9c0 6c 6f 63 6b 50 61 74 68 5b 69 5d 3b 0a 20 20 7d  lockPath[i];.  }
2d9d0 0a 20 20 4f 53 54 52 41 43 45 33 28 22 43 52 45  .  OSTRACE3("CRE
2d9e0 41 54 45 4c 4f 43 4b 50 41 54 48 20 20 70 72 6f  ATELOCKPATH  pro
2d9f0 78 79 20 6c 6f 63 6b 20 70 61 74 68 3d 25 73 20  xy lock path=%s 
2da00 70 69 64 3d 25 64 5c 6e 22 2c 20 6c 6f 63 6b 50  pid=%d\n", lockP
2da10 61 74 68 2c 20 67 65 74 70 69 64 28 29 29 3b 0a  ath, getpid());.
2da20 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
2da30 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65  *.** Create a ne
2da40 77 20 56 46 53 20 66 69 6c 65 20 64 65 73 63 72  w VFS file descr
2da50 69 70 74 6f 72 20 28 73 74 6f 72 65 64 20 69 6e  iptor (stored in
2da60 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64   memory obtained
2da70 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33   from.** sqlite3
2da80 5f 6d 61 6c 6c 6f 63 29 20 61 6e 64 20 6f 70 65  _malloc) and ope
2da90 6e 20 74 68 65 20 66 69 6c 65 20 6e 61 6d 65 64  n the file named
2daa0 20 22 70 61 74 68 22 20 69 6e 20 74 68 65 20 66   "path" in the f
2dab0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 0a  ile descriptor..
2dac0 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72  **.** The caller
2dad0 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20   is responsible 
2dae0 6e 6f 74 20 6f 6e 6c 79 20 66 6f 72 20 63 6c 6f  not only for clo
2daf0 73 69 6e 67 20 74 68 65 20 66 69 6c 65 20 64 65  sing the file de
2db00 73 63 72 69 70 74 6f 72 0a 2a 2a 20 62 75 74 20  scriptor.** but 
2db10 61 6c 73 6f 20 66 6f 72 20 66 72 65 65 69 6e 67  also for freeing
2db20 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 73 73 6f   the memory asso
2db30 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
2db40 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e  file descriptor.
2db50 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
2db60 72 6f 78 79 43 72 65 61 74 65 55 6e 69 78 46 69  roxyCreateUnixFi
2db70 6c 65 28 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  le(.    const ch
2db80 61 72 20 2a 70 61 74 68 2c 20 20 20 20 20 20 20  ar *path,       
2db90 20 2f 2a 20 70 61 74 68 20 66 6f 72 20 74 68 65   /* path for the
2dba0 20 6e 65 77 20 75 6e 69 78 46 69 6c 65 20 2a 2f   new unixFile */
2dbb0 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 2a  .    unixFile **
2dbc0 70 70 46 69 6c 65 2c 20 20 20 20 20 20 20 2f 2a  ppFile,       /*
2dbd0 20 75 6e 69 78 46 69 6c 65 20 63 72 65 61 74 65   unixFile create
2dbe0 64 20 61 6e 64 20 72 65 74 75 72 6e 65 64 20 62  d and returned b
2dbf0 79 20 72 65 66 20 2a 2f 0a 20 20 20 20 69 6e 74  y ref */.    int
2dc00 20 69 73 6c 6f 63 6b 66 69 6c 65 20 20 20 20 20   islockfile     
2dc10 20 20 20 20 20 20 2f 2a 20 69 66 20 6e 6f 6e 20        /* if non 
2dc20 7a 65 72 6f 20 6d 69 73 73 69 6e 67 20 64 69 72  zero missing dir
2dc30 73 20 77 69 6c 6c 20 62 65 20 63 72 65 61 74 65  s will be create
2dc40 64 20 2a 2f 0a 29 20 7b 0a 20 20 69 6e 74 20 66  d */.) {.  int f
2dc50 64 20 3d 20 2d 31 3b 0a 20 20 69 6e 74 20 64 69  d = -1;.  int di
2dc60 72 66 64 20 3d 20 2d 31 3b 0a 20 20 75 6e 69 78  rfd = -1;.  unix
2dc70 46 69 6c 65 20 2a 70 4e 65 77 3b 0a 20 20 69 6e  File *pNew;.  in
2dc80 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2dc90 3b 0a 20 20 69 6e 74 20 6f 70 65 6e 46 6c 61 67  ;.  int openFlag
2dca0 73 20 3d 20 4f 5f 52 44 57 52 20 7c 20 4f 5f 43  s = O_RDWR | O_C
2dcb0 52 45 41 54 3b 0a 20 20 73 71 6c 69 74 65 33 5f  REAT;.  sqlite3_
2dcc0 76 66 73 20 64 75 6d 6d 79 56 66 73 3b 0a 20 20  vfs dummyVfs;.  
2dcd0 69 6e 74 20 74 65 72 72 6e 6f 20 3d 20 30 3b 0a  int terrno = 0;.
2dce0 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a    UnixUnusedFd *
2dcf0 70 55 6e 75 73 65 64 20 3d 20 4e 55 4c 4c 3b 0a  pUnused = NULL;.
2dd00 0a 20 20 2f 2a 20 31 2e 20 66 69 72 73 74 20 74  .  /* 1. first t
2dd10 72 79 20 74 6f 20 6f 70 65 6e 2f 63 72 65 61 74  ry to open/creat
2dd20 65 20 74 68 65 20 66 69 6c 65 0a 20 20 2a 2a 20  e the file.  ** 
2dd30 32 2e 20 69 66 20 74 68 61 74 20 66 61 69 6c 73  2. if that fails
2dd40 2c 20 61 6e 64 20 74 68 69 73 20 69 73 20 61 20  , and this is a 
2dd50 6c 6f 63 6b 20 66 69 6c 65 20 28 6e 6f 74 2d 63  lock file (not-c
2dd60 6f 6e 63 68 29 2c 20 74 72 79 20 63 72 65 61 74  onch), try creat
2dd70 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 70 61 72  ing.  ** the par
2dd80 65 6e 74 20 64 69 72 65 63 74 6f 72 69 65 73 20  ent directories 
2dd90 61 6e 64 20 74 68 65 6e 20 74 72 79 20 61 67 61  and then try aga
2dda0 69 6e 2e 0a 20 20 2a 2a 20 33 2e 20 69 66 20 74  in..  ** 3. if t
2ddb0 68 61 74 20 66 61 69 6c 73 2c 20 74 72 79 20 74  hat fails, try t
2ddc0 6f 20 6f 70 65 6e 20 74 68 65 20 66 69 6c 65 20  o open the file 
2ddd0 72 65 61 64 2d 6f 6e 6c 79 0a 20 20 2a 2a 20 6f  read-only.  ** o
2dde0 74 68 65 72 77 69 73 65 20 72 65 74 75 72 6e 20  therwise return 
2ddf0 42 55 53 59 20 28 69 66 20 6c 6f 63 6b 20 66 69  BUSY (if lock fi
2de00 6c 65 29 20 6f 72 20 43 41 4e 54 4f 50 45 4e 20  le) or CANTOPEN 
2de10 66 6f 72 20 74 68 65 20 63 6f 6e 63 68 20 66 69  for the conch fi
2de20 6c 65 0a 20 20 2a 2f 0a 20 20 70 55 6e 75 73 65  le.  */.  pUnuse
2de30 64 20 3d 20 66 69 6e 64 52 65 75 73 61 62 6c 65  d = findReusable
2de40 46 64 28 70 61 74 68 2c 20 6f 70 65 6e 46 6c 61  Fd(path, openFla
2de50 67 73 29 3b 0a 20 20 69 66 28 20 70 55 6e 75 73  gs);.  if( pUnus
2de60 65 64 20 29 7b 0a 20 20 20 20 66 64 20 3d 20 70  ed ){.    fd = p
2de70 55 6e 75 73 65 64 2d 3e 66 64 3b 0a 20 20 7d 65  Unused->fd;.  }e
2de80 6c 73 65 7b 0a 20 20 20 20 70 55 6e 75 73 65 64  lse{.    pUnused
2de90 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
2dea0 63 28 73 69 7a 65 6f 66 28 2a 70 55 6e 75 73 65  c(sizeof(*pUnuse
2deb0 64 29 29 3b 0a 20 20 20 20 69 66 28 20 21 70 55  d));.    if( !pU
2dec0 6e 75 73 65 64 20 29 7b 0a 20 20 20 20 20 20 72  nused ){.      r
2ded0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
2dee0 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  EM;.    }.  }.  
2def0 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20  if( fd<0 ){.    
2df00 66 64 20 3d 20 6f 70 65 6e 28 70 61 74 68 2c 20  fd = open(path, 
2df10 6f 70 65 6e 46 6c 61 67 73 2c 20 53 51 4c 49 54  openFlags, SQLIT
2df20 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50  E_DEFAULT_FILE_P
2df30 45 52 4d 49 53 53 49 4f 4e 53 29 3b 0a 20 20 20  ERMISSIONS);.   
2df40 20 74 65 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   terrno = errno;
2df50 0a 20 20 20 20 69 66 28 20 66 64 3c 30 20 26 26  .    if( fd<0 &&
2df60 20 65 72 72 6e 6f 3d 3d 45 4e 4f 45 4e 54 20 26   errno==ENOENT &
2df70 26 20 69 73 6c 6f 63 6b 66 69 6c 65 20 29 7b 0a  & islockfile ){.
2df80 20 20 20 20 20 20 69 66 28 20 70 72 6f 78 79 43        if( proxyC
2df90 72 65 61 74 65 4c 6f 63 6b 50 61 74 68 28 70 61  reateLockPath(pa
2dfa0 74 68 29 20 3d 3d 20 53 51 4c 49 54 45 5f 4f 4b  th) == SQLITE_OK
2dfb0 20 29 7b 0a 20 20 20 20 20 20 20 20 66 64 20 3d   ){.        fd =
2dfc0 20 6f 70 65 6e 28 70 61 74 68 2c 20 6f 70 65 6e   open(path, open
2dfd0 46 6c 61 67 73 2c 20 53 51 4c 49 54 45 5f 44 45  Flags, SQLITE_DE
2dfe0 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49  FAULT_FILE_PERMI
2dff0 53 53 49 4f 4e 53 29 3b 0a 20 20 20 20 20 20 7d  SSIONS);.      }
2e000 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
2e010 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 6f 70 65   fd<0 ){.    ope
2e020 6e 46 6c 61 67 73 20 3d 20 4f 5f 52 44 4f 4e 4c  nFlags = O_RDONL
2e030 59 3b 0a 20 20 20 20 66 64 20 3d 20 6f 70 65 6e  Y;.    fd = open
2e040 28 70 61 74 68 2c 20 6f 70 65 6e 46 6c 61 67 73  (path, openFlags
2e050 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  , SQLITE_DEFAULT
2e060 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e  _FILE_PERMISSION
2e070 53 29 3b 0a 20 20 20 20 74 65 72 72 6e 6f 20 3d  S);.    terrno =
2e080 20 65 72 72 6e 6f 3b 0a 20 20 7d 0a 20 20 69 66   errno;.  }.  if
2e090 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 69 66  ( fd<0 ){.    if
2e0a0 28 20 69 73 6c 6f 63 6b 66 69 6c 65 20 29 7b 0a  ( islockfile ){.
2e0b0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
2e0c0 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a  ITE_BUSY;.    }.
2e0d0 20 20 20 20 73 77 69 74 63 68 20 28 74 65 72 72      switch (terr
2e0e0 6e 6f 29 20 7b 0a 20 20 20 20 20 20 63 61 73 65  no) {.      case
2e0f0 20 45 41 43 43 45 53 3a 0a 20 20 20 20 20 20 20   EACCES:.       
2e100 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50   return SQLITE_P
2e110 45 52 4d 3b 0a 20 20 20 20 20 20 63 61 73 65 20  ERM;.      case 
2e120 45 49 4f 3a 20 0a 20 20 20 20 20 20 20 20 72 65  EIO: .        re
2e130 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
2e140 52 5f 4c 4f 43 4b 3b 20 2f 2a 20 65 76 65 6e 20  R_LOCK; /* even 
2e150 74 68 6f 75 67 68 20 69 74 20 69 73 20 74 68 65  though it is the
2e160 20 63 6f 6e 63 68 20 2a 2f 0a 20 20 20 20 20 20   conch */.      
2e170 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 20  default:.       
2e180 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
2e190 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20  ANTOPEN_BKPT;.  
2e1a0 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 70 4e 65    }.  }.  .  pNe
2e1b0 77 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29  w = (unixFile *)
2e1c0 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73  sqlite3_malloc(s
2e1d0 69 7a 65 6f 66 28 2a 70 4e 65 77 29 29 3b 0a 20  izeof(*pNew));. 
2e1e0 20 69 66 28 20 70 4e 65 77 3d 3d 4e 55 4c 4c 20   if( pNew==NULL 
2e1f0 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
2e200 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f  TE_NOMEM;.    go
2e210 74 6f 20 65 6e 64 5f 63 72 65 61 74 65 5f 70 72  to end_create_pr
2e220 6f 78 79 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65  oxy;.  }.  memse
2e230 74 28 70 4e 65 77 2c 20 30 2c 20 73 69 7a 65 6f  t(pNew, 0, sizeo
2e240 66 28 75 6e 69 78 46 69 6c 65 29 29 3b 0a 20 20  f(unixFile));.  
2e250 70 4e 65 77 2d 3e 6f 70 65 6e 46 6c 61 67 73 20  pNew->openFlags 
2e260 3d 20 6f 70 65 6e 46 6c 61 67 73 3b 0a 20 20 64  = openFlags;.  d
2e270 75 6d 6d 79 56 66 73 2e 70 41 70 70 44 61 74 61  ummyVfs.pAppData
2e280 20 3d 20 28 76 6f 69 64 2a 29 26 61 75 74 6f 6c   = (void*)&autol
2e290 6f 63 6b 49 6f 46 69 6e 64 65 72 3b 0a 20 20 70  ockIoFinder;.  p
2e2a0 55 6e 75 73 65 64 2d 3e 66 64 20 3d 20 66 64 3b  Unused->fd = fd;
2e2b0 0a 20 20 70 55 6e 75 73 65 64 2d 3e 66 6c 61 67  .  pUnused->flag
2e2c0 73 20 3d 20 6f 70 65 6e 46 6c 61 67 73 3b 0a 20  s = openFlags;. 
2e2d0 20 70 4e 65 77 2d 3e 70 55 6e 75 73 65 64 20 3d   pNew->pUnused =
2e2e0 20 70 55 6e 75 73 65 64 3b 0a 20 20 0a 20 20 72   pUnused;.  .  r
2e2f0 63 20 3d 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69  c = fillInUnixFi
2e300 6c 65 28 26 64 75 6d 6d 79 56 66 73 2c 20 66 64  le(&dummyVfs, fd
2e310 2c 20 64 69 72 66 64 2c 20 28 73 71 6c 69 74 65  , dirfd, (sqlite
2e320 33 5f 66 69 6c 65 2a 29 70 4e 65 77 2c 20 70 61  3_file*)pNew, pa
2e330 74 68 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28  th, 0, 0);.  if(
2e340 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2e350 7b 0a 20 20 20 20 2a 70 70 46 69 6c 65 20 3d 20  {.    *ppFile = 
2e360 70 4e 65 77 3b 0a 20 20 20 20 72 65 74 75 72 6e  pNew;.    return
2e370 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
2e380 65 6e 64 5f 63 72 65 61 74 65 5f 70 72 6f 78 79  end_create_proxy
2e390 3a 20 20 20 20 0a 20 20 63 6c 6f 73 65 28 66 64  :    .  close(fd
2e3a0 29 3b 20 2f 2a 20 73 69 6c 65 6e 74 6c 79 20 6c  ); /* silently l
2e3b0 65 61 6b 20 66 64 20 69 66 20 65 72 72 6f 72 2c  eak fd if error,
2e3c0 20 77 65 27 72 65 20 61 6c 72 65 61 64 79 20 69   we're already i
2e3d0 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 73 71 6c  n error */.  sql
2e3e0 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77 29 3b  ite3_free(pNew);
2e3f0 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
2e400 70 55 6e 75 73 65 64 29 3b 0a 20 20 72 65 74 75  pUnused);.  retu
2e410 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66  rn rc;.}..#ifdef
2e420 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 20   SQLITE_TEST./* 
2e430 73 69 6d 75 6c 61 74 65 20 6d 75 6c 74 69 70 6c  simulate multipl
2e440 65 20 68 6f 73 74 73 20 62 79 20 63 72 65 61 74  e hosts by creat
2e450 69 6e 67 20 75 6e 69 71 75 65 20 68 6f 73 74 69  ing unique hosti
2e460 64 20 66 69 6c 65 20 70 61 74 68 73 20 2a 2f 0a  d file paths */.
2e470 69 6e 74 20 73 71 6c 69 74 65 33 5f 68 6f 73 74  int sqlite3_host
2e480 69 64 5f 6e 75 6d 20 3d 20 30 3b 0a 23 65 6e 64  id_num = 0;.#end
2e490 69 66 0a 0a 23 64 65 66 69 6e 65 20 50 52 4f 58  if..#define PROX
2e4a0 59 5f 48 4f 53 54 49 44 4c 45 4e 20 20 20 20 31  Y_HOSTIDLEN    1
2e4b0 36 20 20 2f 2a 20 63 6f 6e 63 68 20 66 69 6c 65  6  /* conch file
2e4c0 20 68 6f 73 74 20 69 64 20 6c 65 6e 67 74 68 20   host id length 
2e4d0 2a 2f 0a 0a 2f 2a 20 67 65 74 20 74 68 65 20 68  */../* get the h
2e4e0 6f 73 74 20 49 44 20 76 69 61 20 67 65 74 68 6f  ost ID via getho
2e4f0 73 74 75 75 69 64 28 29 2c 20 70 48 6f 73 74 49  stuuid(), pHostI
2e500 44 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20  D must point to 
2e510 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 20  PROXY_HOSTIDLEN 
2e520 0a 2a 2a 20 62 79 74 65 73 20 6f 66 20 77 72 69  .** bytes of wri
2e530 74 61 62 6c 65 20 6d 65 6d 6f 72 79 2e 0a 2a 2f  table memory..*/
2e540 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
2e550 79 47 65 74 48 6f 73 74 49 44 28 75 6e 73 69 67  yGetHostID(unsig
2e560 6e 65 64 20 63 68 61 72 20 2a 70 48 6f 73 74 49  ned char *pHostI
2e570 44 2c 20 69 6e 74 20 2a 70 45 72 72 6f 72 29 7b  D, int *pError){
2e580 0a 20 20 73 74 72 75 63 74 20 74 69 6d 65 73 70  .  struct timesp
2e590 65 63 20 74 69 6d 65 6f 75 74 20 3d 20 7b 31 2c  ec timeout = {1,
2e5a0 20 30 7d 3b 20 2f 2a 20 31 20 73 65 63 20 74 69   0}; /* 1 sec ti
2e5b0 6d 65 6f 75 74 20 2a 2f 0a 20 20 0a 20 20 61 73  meout */.  .  as
2e5c0 73 65 72 74 28 50 52 4f 58 59 5f 48 4f 53 54 49  sert(PROXY_HOSTI
2e5d0 44 4c 45 4e 20 3d 3d 20 73 69 7a 65 6f 66 28 75  DLEN == sizeof(u
2e5e0 75 69 64 5f 74 29 29 3b 0a 20 20 6d 65 6d 73 65  uid_t));.  memse
2e5f0 74 28 70 48 6f 73 74 49 44 2c 20 30 2c 20 50 52  t(pHostID, 0, PR
2e600 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 29 3b 0a  OXY_HOSTIDLEN);.
2e610 20 20 69 66 28 20 67 65 74 68 6f 73 74 75 75 69    if( gethostuui
2e620 64 28 70 48 6f 73 74 49 44 2c 20 26 74 69 6d 65  d(pHostID, &time
2e630 6f 75 74 29 20 29 7b 0a 20 20 20 20 69 6e 74 20  out) ){.    int 
2e640 65 72 72 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  err = errno;.   
2e650 20 69 66 28 20 70 45 72 72 6f 72 20 29 7b 0a 20   if( pError ){. 
2e660 20 20 20 20 20 2a 70 45 72 72 6f 72 20 3d 20 65       *pError = e
2e670 72 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  rr;.    }.    re
2e680 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
2e690 52 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51  R;.  }.#ifdef SQ
2e6a0 4c 49 54 45 5f 54 45 53 54 0a 20 20 2f 2a 20 73  LITE_TEST.  /* s
2e6b0 69 6d 75 6c 61 74 65 20 6d 75 6c 74 69 70 6c 65  imulate multiple
2e6c0 20 68 6f 73 74 73 20 62 79 20 63 72 65 61 74 69   hosts by creati
2e6d0 6e 67 20 75 6e 69 71 75 65 20 68 6f 73 74 69 64  ng unique hostid
2e6e0 20 66 69 6c 65 20 70 61 74 68 73 20 2a 2f 0a 20   file paths */. 
2e6f0 20 69 66 28 20 73 71 6c 69 74 65 33 5f 68 6f 73   if( sqlite3_hos
2e700 74 69 64 5f 6e 75 6d 20 21 3d 20 30 29 7b 0a 20  tid_num != 0){. 
2e710 20 20 20 70 48 6f 73 74 49 44 5b 30 5d 20 3d 20     pHostID[0] = 
2e720 28 63 68 61 72 29 28 70 48 6f 73 74 49 44 5b 30  (char)(pHostID[0
2e730 5d 20 2b 20 28 63 68 61 72 29 28 73 71 6c 69 74  ] + (char)(sqlit
2e740 65 33 5f 68 6f 73 74 69 64 5f 6e 75 6d 20 26 20  e3_hostid_num & 
2e750 30 78 46 46 29 29 3b 0a 20 20 7d 0a 23 65 6e 64  0xFF));.  }.#end
2e760 69 66 0a 20 20 0a 20 20 72 65 74 75 72 6e 20 53  if.  .  return S
2e770 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20  QLITE_OK;.}../* 
2e780 54 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 63  The conch file c
2e790 6f 6e 74 61 69 6e 73 20 74 68 65 20 68 65 61 64  ontains the head
2e7a0 65 72 2c 20 68 6f 73 74 20 69 64 20 61 6e 64 20  er, host id and 
2e7b0 6c 6f 63 6b 20 66 69 6c 65 20 70 61 74 68 0a 20  lock file path. 
2e7c0 2a 2f 0a 23 64 65 66 69 6e 65 20 50 52 4f 58 59  */.#define PROXY
2e7d0 5f 43 4f 4e 43 48 56 45 52 53 49 4f 4e 20 32 20  _CONCHVERSION 2 
2e7e0 20 20 2f 2a 20 31 2d 62 79 74 65 20 68 65 61 64    /* 1-byte head
2e7f0 65 72 2c 20 31 36 2d 62 79 74 65 20 68 6f 73 74  er, 16-byte host
2e800 20 69 64 2c 20 70 61 74 68 20 2a 2f 0a 23 64 65   id, path */.#de
2e810 66 69 6e 65 20 50 52 4f 58 59 5f 48 45 41 44 45  fine PROXY_HEADE
2e820 52 4c 45 4e 20 20 20 20 31 20 20 20 2f 2a 20 63  RLEN    1   /* c
2e830 6f 6e 63 68 20 66 69 6c 65 20 68 65 61 64 65 72  onch file header
2e840 20 6c 65 6e 67 74 68 20 2a 2f 0a 23 64 65 66 69   length */.#defi
2e850 6e 65 20 50 52 4f 58 59 5f 50 41 54 48 49 4e 44  ne PROXY_PATHIND
2e860 45 58 20 20 20 20 28 50 52 4f 58 59 5f 48 45 41  EX    (PROXY_HEA
2e870 44 45 52 4c 45 4e 2b 50 52 4f 58 59 5f 48 4f 53  DERLEN+PROXY_HOS
2e880 54 49 44 4c 45 4e 29 0a 23 64 65 66 69 6e 65 20  TIDLEN).#define 
2e890 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45  PROXY_MAXCONCHLE
2e8a0 4e 20 20 28 50 52 4f 58 59 5f 48 45 41 44 45 52  N  (PROXY_HEADER
2e8b0 4c 45 4e 2b 50 52 4f 58 59 5f 48 4f 53 54 49 44  LEN+PROXY_HOSTID
2e8c0 4c 45 4e 2b 4d 41 58 50 41 54 48 4c 45 4e 29 0a  LEN+MAXPATHLEN).
2e8d0 0a 2f 2a 20 0a 2a 2a 20 54 61 6b 65 73 20 61 6e  ./* .** Takes an
2e8e0 20 6f 70 65 6e 20 63 6f 6e 63 68 20 66 69 6c 65   open conch file
2e8f0 2c 20 63 6f 70 69 65 73 20 74 68 65 20 63 6f 6e  , copies the con
2e900 74 65 6e 74 73 20 74 6f 20 61 20 6e 65 77 20 70  tents to a new p
2e910 61 74 68 20 61 6e 64 20 74 68 65 6e 20 6d 6f 76  ath and then mov
2e920 65 73 20 0a 2a 2a 20 69 74 20 62 61 63 6b 2e 20  es .** it back. 
2e930 20 54 68 65 20 6e 65 77 6c 79 20 63 72 65 61 74   The newly creat
2e940 65 64 20 66 69 6c 65 27 73 20 66 69 6c 65 20 64  ed file's file d
2e950 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 73 73  escriptor is ass
2e960 69 67 6e 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20  igned to the.** 
2e970 63 6f 6e 63 68 20 66 69 6c 65 20 73 74 72 75 63  conch file struc
2e980 74 75 72 65 20 61 6e 64 20 66 69 6e 61 6c 6c 79  ture and finally
2e990 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 63 6f   the original co
2e9a0 6e 63 68 20 66 69 6c 65 20 64 65 73 63 72 69 70  nch file descrip
2e9b0 74 6f 72 20 69 73 20 0a 2a 2a 20 63 6c 6f 73 65  tor is .** close
2e9c0 64 2e 20 20 52 65 74 75 72 6e 73 20 7a 65 72 6f  d.  Returns zero
2e9d0 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2e 0a   if successful..
2e9e0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  */.static int pr
2e9f0 6f 78 79 42 72 65 61 6b 43 6f 6e 63 68 4c 6f 63  oxyBreakConchLoc
2ea00 6b 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c  k(unixFile *pFil
2ea10 65 2c 20 75 75 69 64 5f 74 20 6d 79 48 6f 73 74  e, uuid_t myHost
2ea20 49 44 29 7b 0a 20 20 70 72 6f 78 79 4c 6f 63 6b  ID){.  proxyLock
2ea30 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78  ingContext *pCtx
2ea40 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67   = (proxyLocking
2ea50 43 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d  Context *)pFile-
2ea60 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  >lockingContext;
2ea70 20 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f   .  unixFile *co
2ea80 6e 63 68 46 69 6c 65 20 3d 20 70 43 74 78 2d 3e  nchFile = pCtx->
2ea90 63 6f 6e 63 68 46 69 6c 65 3b 0a 20 20 63 68 61  conchFile;.  cha
2eaa0 72 20 74 50 61 74 68 5b 4d 41 58 50 41 54 48 4c  r tPath[MAXPATHL
2eab0 45 4e 5d 3b 0a 20 20 63 68 61 72 20 62 75 66 5b  EN];.  char buf[
2eac0 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45  PROXY_MAXCONCHLE
2ead0 4e 5d 3b 0a 20 20 63 68 61 72 20 2a 63 50 61 74  N];.  char *cPat
2eae0 68 20 3d 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46  h = pCtx->conchF
2eaf0 69 6c 65 50 61 74 68 3b 0a 20 20 73 69 7a 65 5f  ilePath;.  size_
2eb00 74 20 72 65 61 64 4c 65 6e 20 3d 20 30 3b 0a 20  t readLen = 0;. 
2eb10 20 73 69 7a 65 5f 74 20 70 61 74 68 4c 65 6e 20   size_t pathLen 
2eb20 3d 20 30 3b 0a 20 20 63 68 61 72 20 65 72 72 6d  = 0;.  char errm
2eb30 73 67 5b 36 34 5d 20 3d 20 22 22 3b 0a 20 20 69  sg[64] = "";.  i
2eb40 6e 74 20 66 64 20 3d 20 2d 31 3b 0a 20 20 69 6e  nt fd = -1;.  in
2eb50 74 20 72 63 20 3d 20 2d 31 3b 0a 0a 20 20 2f 2a  t rc = -1;..  /*
2eb60 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 70 61   create a new pa
2eb70 74 68 20 62 79 20 72 65 70 6c 61 63 65 20 74 68  th by replace th
2eb80 65 20 74 72 61 69 6c 69 6e 67 20 27 2d 63 6f 6e  e trailing '-con
2eb90 63 68 27 20 77 69 74 68 20 27 2d 62 72 65 61 6b  ch' with '-break
2eba0 27 20 2a 2f 0a 20 20 70 61 74 68 4c 65 6e 20 3d  ' */.  pathLen =
2ebb0 20 73 74 72 6c 63 70 79 28 74 50 61 74 68 2c 20   strlcpy(tPath, 
2ebc0 63 50 61 74 68 2c 20 4d 41 58 50 41 54 48 4c 45  cPath, MAXPATHLE
2ebd0 4e 29 3b 0a 20 20 69 66 28 20 70 61 74 68 4c 65  N);.  if( pathLe
2ebe0 6e 3e 4d 41 58 50 41 54 48 4c 45 4e 20 7c 7c 20  n>MAXPATHLEN || 
2ebf0 70 61 74 68 4c 65 6e 3c 36 20 7c 7c 20 0a 20 20  pathLen<6 || .  
2ec00 20 20 20 28 73 74 72 6c 63 70 79 28 26 74 50 61     (strlcpy(&tPa
2ec10 74 68 5b 70 61 74 68 4c 65 6e 2d 35 5d 2c 20 22  th[pathLen-5], "
2ec20 62 72 65 61 6b 22 2c 20 36 29 20 21 3d 20 35 29  break", 6) != 5)
2ec30 20 29 7b 0a 20 20 20 20 73 70 72 69 6e 74 66 28   ){.    sprintf(
2ec40 65 72 72 6d 73 67 2c 20 22 70 61 74 68 20 65 72  errmsg, "path er
2ec50 72 6f 72 20 28 6c 65 6e 20 25 64 29 22 2c 20 28  ror (len %d)", (
2ec60 69 6e 74 29 70 61 74 68 4c 65 6e 29 3b 0a 20 20  int)pathLen);.  
2ec70 20 20 67 6f 74 6f 20 65 6e 64 5f 62 72 65 61 6b    goto end_break
2ec80 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 2f 2a 20 72  lock;.  }.  /* r
2ec90 65 61 64 20 74 68 65 20 63 6f 6e 63 68 20 63 6f  ead the conch co
2eca0 6e 74 65 6e 74 20 2a 2f 0a 20 20 72 65 61 64 4c  ntent */.  readL
2ecb0 65 6e 20 3d 20 70 72 65 61 64 28 63 6f 6e 63 68  en = pread(conch
2ecc0 46 69 6c 65 2d 3e 68 2c 20 62 75 66 2c 20 50 52  File->h, buf, PR
2ecd0 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 2c  OXY_MAXCONCHLEN,
2ece0 20 30 29 3b 0a 20 20 69 66 28 20 72 65 61 64 4c   0);.  if( readL
2ecf0 65 6e 3c 50 52 4f 58 59 5f 50 41 54 48 49 4e 44  en<PROXY_PATHIND
2ed00 45 58 20 29 7b 0a 20 20 20 20 73 70 72 69 6e 74  EX ){.    sprint
2ed10 66 28 65 72 72 6d 73 67 2c 20 22 72 65 61 64 20  f(errmsg, "read 
2ed20 65 72 72 6f 72 20 28 6c 65 6e 20 25 64 29 22 2c  error (len %d)",
2ed30 20 28 69 6e 74 29 72 65 61 64 4c 65 6e 29 3b 0a   (int)readLen);.
2ed40 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 62 72 65      goto end_bre
2ed50 61 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 2f 2a  aklock;.  }.  /*
2ed60 20 77 72 69 74 65 20 69 74 20 6f 75 74 20 74 6f   write it out to
2ed70 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 62   the temporary b
2ed80 72 65 61 6b 20 66 69 6c 65 20 2a 2f 0a 20 20 66  reak file */.  f
2ed90 64 20 3d 20 6f 70 65 6e 28 74 50 61 74 68 2c 20  d = open(tPath, 
2eda0 28 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 7c  (O_RDWR|O_CREAT|
2edb0 4f 5f 45 58 43 4c 29 2c 20 53 51 4c 49 54 45 5f  O_EXCL), SQLITE_
2edc0 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52  DEFAULT_FILE_PER
2edd0 4d 49 53 53 49 4f 4e 53 29 3b 0a 20 20 69 66 28  MISSIONS);.  if(
2ede0 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 73 70 72   fd<0 ){.    spr
2edf0 69 6e 74 66 28 65 72 72 6d 73 67 2c 20 22 63 72  intf(errmsg, "cr
2ee00 65 61 74 65 20 66 61 69 6c 65 64 20 28 25 64 29  eate failed (%d)
2ee10 22 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 67  ", errno);.    g
2ee20 6f 74 6f 20 65 6e 64 5f 62 72 65 61 6b 6c 6f 63  oto end_breakloc
2ee30 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 77 72  k;.  }.  if( pwr
2ee40 69 74 65 28 66 64 2c 20 62 75 66 2c 20 72 65 61  ite(fd, buf, rea
2ee50 64 4c 65 6e 2c 20 30 29 20 21 3d 20 72 65 61 64  dLen, 0) != read
2ee60 4c 65 6e 20 29 7b 0a 20 20 20 20 73 70 72 69 6e  Len ){.    sprin
2ee70 74 66 28 65 72 72 6d 73 67 2c 20 22 77 72 69 74  tf(errmsg, "writ
2ee80 65 20 66 61 69 6c 65 64 20 28 25 64 29 22 2c 20  e failed (%d)", 
2ee90 65 72 72 6e 6f 29 3b 0a 20 20 20 20 67 6f 74 6f  errno);.    goto
2eea0 20 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a   end_breaklock;.
2eeb0 20 20 7d 0a 20 20 69 66 28 20 72 65 6e 61 6d 65    }.  if( rename
2eec0 28 74 50 61 74 68 2c 20 63 50 61 74 68 29 20 29  (tPath, cPath) )
2eed0 7b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 65 72  {.    sprintf(er
2eee0 72 6d 73 67 2c 20 22 72 65 6e 61 6d 65 20 66 61  rmsg, "rename fa
2eef0 69 6c 65 64 20 28 25 64 29 22 2c 20 65 72 72 6e  iled (%d)", errn
2ef00 6f 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64  o);.    goto end
2ef10 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a  _breaklock;.  }.
2ef20 20 20 72 63 20 3d 20 30 3b 0a 20 20 66 70 72 69    rc = 0;.  fpri
2ef30 6e 74 66 28 73 74 64 65 72 72 2c 20 22 62 72 6f  ntf(stderr, "bro
2ef40 6b 65 20 73 74 61 6c 65 20 6c 6f 63 6b 20 6f 6e  ke stale lock on
2ef50 20 25 73 5c 6e 22 2c 20 63 50 61 74 68 29 3b 0a   %s\n", cPath);.
2ef60 20 20 63 6c 6f 73 65 28 63 6f 6e 63 68 46 69 6c    close(conchFil
2ef70 65 2d 3e 68 29 3b 0a 20 20 63 6f 6e 63 68 46 69  e->h);.  conchFi
2ef80 6c 65 2d 3e 68 20 3d 20 66 64 3b 0a 20 20 63 6f  le->h = fd;.  co
2ef90 6e 63 68 46 69 6c 65 2d 3e 6f 70 65 6e 46 6c 61  nchFile->openFla
2efa0 67 73 20 3d 20 4f 5f 52 44 57 52 20 7c 20 4f 5f  gs = O_RDWR | O_
2efb0 43 52 45 41 54 3b 0a 0a 65 6e 64 5f 62 72 65 61  CREAT;..end_brea
2efc0 6b 6c 6f 63 6b 3a 0a 20 20 69 66 28 20 72 63 20  klock:.  if( rc 
2efd0 29 7b 0a 20 20 20 20 69 66 28 20 66 64 3e 3d 30  ){.    if( fd>=0
2efe0 20 29 7b 0a 20 20 20 20 20 20 75 6e 6c 69 6e 6b   ){.      unlink
2eff0 28 74 50 61 74 68 29 3b 0a 20 20 20 20 20 20 63  (tPath);.      c
2f000 6c 6f 73 65 28 66 64 29 3b 0a 20 20 20 20 7d 0a  lose(fd);.    }.
2f010 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
2f020 72 72 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 62  rr, "failed to b
2f030 72 65 61 6b 20 73 74 61 6c 65 20 6c 6f 63 6b 20  reak stale lock 
2f040 6f 6e 20 25 73 2c 20 25 73 5c 6e 22 2c 20 63 50  on %s, %s\n", cP
2f050 61 74 68 2c 20 65 72 72 6d 73 67 29 3b 0a 20 20  ath, errmsg);.  
2f060 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
2f070 0a 0a 2f 2a 20 54 61 6b 65 20 74 68 65 20 72 65  ../* Take the re
2f080 71 75 65 73 74 65 64 20 6c 6f 63 6b 20 6f 6e 20  quested lock on 
2f090 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 61  the conch file a
2f0a0 6e 64 20 62 72 65 61 6b 20 61 20 73 74 61 6c 65  nd break a stale
2f0b0 20 6c 6f 63 6b 20 69 66 20 74 68 65 20 0a 2a 2a   lock if the .**
2f0c0 20 68 6f 73 74 20 69 64 20 6d 61 74 63 68 65 73   host id matches
2f0d0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2f0e0 70 72 6f 78 79 43 6f 6e 63 68 4c 6f 63 6b 28 75  proxyConchLock(u
2f0f0 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20  nixFile *pFile, 
2f100 75 75 69 64 5f 74 20 6d 79 48 6f 73 74 49 44 2c  uuid_t myHostID,
2f110 20 69 6e 74 20 6c 6f 63 6b 54 79 70 65 29 7b 0a   int lockType){.
2f120 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f    proxyLockingCo
2f130 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20 28 70  ntext *pCtx = (p
2f140 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
2f150 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b  xt *)pFile->lock
2f160 69 6e 67 43 6f 6e 74 65 78 74 3b 20 0a 20 20 75  ingContext; .  u
2f170 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46 69  nixFile *conchFi
2f180 6c 65 20 3d 20 70 43 74 78 2d 3e 63 6f 6e 63 68  le = pCtx->conch
2f190 46 69 6c 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d  File;.  int rc =
2f1a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
2f1b0 74 20 6e 54 72 69 65 73 20 3d 20 30 3b 0a 20 20  t nTries = 0;.  
2f1c0 73 74 72 75 63 74 20 74 69 6d 65 73 70 65 63 20  struct timespec 
2f1d0 63 6f 6e 63 68 4d 6f 64 54 69 6d 65 3b 0a 20 20  conchModTime;.  
2f1e0 0a 20 20 64 6f 20 7b 0a 20 20 20 20 72 63 20 3d  .  do {.    rc =
2f1f0 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74   conchFile->pMet
2f200 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28 73 71 6c 69  hod->xLock((sqli
2f210 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46  te3_file*)conchF
2f220 69 6c 65 2c 20 6c 6f 63 6b 54 79 70 65 29 3b 0a  ile, lockType);.
2f230 20 20 20 20 6e 54 72 69 65 73 20 2b 2b 3b 0a 20      nTries ++;. 
2f240 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2f250 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20  E_BUSY ){.      
2f260 2f 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 20 66  /* If the lock f
2f270 61 69 6c 65 64 20 28 62 75 73 79 29 3a 0a 20 20  ailed (busy):.  
2f280 20 20 20 20 20 2a 20 31 73 74 20 74 72 79 3a 20       * 1st try: 
2f290 67 65 74 20 74 68 65 20 6d 6f 64 20 74 69 6d 65  get the mod time
2f2a0 20 6f 66 20 74 68 65 20 63 6f 6e 63 68 2c 20 77   of the conch, w
2f2b0 61 69 74 20 30 2e 35 73 20 61 6e 64 20 74 72 79  ait 0.5s and try
2f2c0 20 61 67 61 69 6e 2e 20 0a 20 20 20 20 20 20 20   again. .       
2f2d0 2a 20 32 6e 64 20 74 72 79 3a 20 66 61 69 6c 20  * 2nd try: fail 
2f2e0 69 66 20 74 68 65 20 6d 6f 64 20 74 69 6d 65 20  if the mod time 
2f2f0 63 68 61 6e 67 65 64 20 6f 72 20 68 6f 73 74 20  changed or host 
2f300 69 64 20 69 73 20 64 69 66 66 65 72 65 6e 74 2c  id is different,
2f310 20 77 61 69 74 20 0a 20 20 20 20 20 20 20 2a 20   wait .       * 
2f320 20 20 20 20 20 20 20 20 20 20 31 30 20 73 65 63            10 sec
2f330 20 61 6e 64 20 74 72 79 20 61 67 61 69 6e 0a 20   and try again. 
2f340 20 20 20 20 20 20 2a 20 33 72 64 20 74 72 79 3a        * 3rd try:
2f350 20 62 72 65 61 6b 20 74 68 65 20 6c 6f 63 6b 20   break the lock 
2f360 75 6e 6c 65 73 73 20 74 68 65 20 6d 6f 64 20 74  unless the mod t
2f370 69 6d 65 20 68 61 73 20 63 68 61 6e 67 65 64 2e  ime has changed.
2f380 0a 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  .       */.     
2f390 20 73 74 72 75 63 74 20 73 74 61 74 20 62 75 66   struct stat buf
2f3a0 3b 0a 20 20 20 20 20 20 69 66 28 20 66 73 74 61  ;.      if( fsta
2f3b0 74 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20  t(conchFile->h, 
2f3c0 26 62 75 66 29 20 29 7b 0a 20 20 20 20 20 20 20  &buf) ){.       
2f3d0 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
2f3e0 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
2f3f0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2f400 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20  _IOERR_LOCK;.   
2f410 20 20 20 7d 0a 20 20 20 20 20 20 0a 20 20 20 20     }.      .    
2f420 20 20 69 66 28 20 6e 54 72 69 65 73 3d 3d 31 20    if( nTries==1 
2f430 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 63 68  ){.        conch
2f440 4d 6f 64 54 69 6d 65 20 3d 20 62 75 66 2e 73 74  ModTime = buf.st
2f450 5f 6d 74 69 6d 65 73 70 65 63 3b 0a 20 20 20 20  _mtimespec;.    
2f460 20 20 20 20 75 73 6c 65 65 70 28 35 30 30 30 30      usleep(50000
2f470 30 29 3b 20 2f 2a 20 77 61 69 74 20 30 2e 35 20  0); /* wait 0.5 
2f480 73 65 63 20 61 6e 64 20 74 72 79 20 74 68 65 20  sec and try the 
2f490 6c 6f 63 6b 20 61 67 61 69 6e 2a 2f 0a 20 20 20  lock again*/.   
2f4a0 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20       continue;  
2f4b0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
2f4c0 61 73 73 65 72 74 28 20 6e 54 72 69 65 73 3e 31  assert( nTries>1
2f4d0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 63 6f   );.      if( co
2f4e0 6e 63 68 4d 6f 64 54 69 6d 65 2e 74 76 5f 73 65  nchModTime.tv_se
2f4f0 63 20 21 3d 20 62 75 66 2e 73 74 5f 6d 74 69 6d  c != buf.st_mtim
2f500 65 73 70 65 63 2e 74 76 5f 73 65 63 20 7c 7c 20  espec.tv_sec || 
2f510 0a 20 20 20 20 20 20 20 20 20 63 6f 6e 63 68 4d  .         conchM
2f520 6f 64 54 69 6d 65 2e 74 76 5f 6e 73 65 63 20 21  odTime.tv_nsec !
2f530 3d 20 62 75 66 2e 73 74 5f 6d 74 69 6d 65 73 70  = buf.st_mtimesp
2f540 65 63 2e 74 76 5f 6e 73 65 63 20 29 7b 0a 20 20  ec.tv_nsec ){.  
2f550 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
2f560 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20  ITE_BUSY;.      
2f570 7d 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20 69  }.      .      i
2f580 66 28 20 6e 54 72 69 65 73 3d 3d 32 20 29 7b 20  f( nTries==2 ){ 
2f590 20 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 74   .        char t
2f5a0 42 75 66 5b 50 52 4f 58 59 5f 4d 41 58 43 4f 4e  Buf[PROXY_MAXCON
2f5b0 43 48 4c 45 4e 5d 3b 0a 20 20 20 20 20 20 20 20  CHLEN];.        
2f5c0 69 6e 74 20 6c 65 6e 20 3d 20 70 72 65 61 64 28  int len = pread(
2f5d0 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 74 42  conchFile->h, tB
2f5e0 75 66 2c 20 50 52 4f 58 59 5f 4d 41 58 43 4f 4e  uf, PROXY_MAXCON
2f5f0 43 48 4c 45 4e 2c 20 30 29 3b 0a 20 20 20 20 20  CHLEN, 0);.     
2f600 20 20 20 69 66 28 20 6c 65 6e 3c 30 20 29 7b 0a     if( len<0 ){.
2f610 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
2f620 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72  >lastErrno = err
2f630 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  no;.          re
2f640 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
2f650 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20  R_LOCK;.        
2f660 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c 65  }.        if( le
2f670 6e 3e 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45  n>PROXY_PATHINDE
2f680 58 20 26 26 20 74 42 75 66 5b 30 5d 3d 3d 28 63  X && tBuf[0]==(c
2f690 68 61 72 29 50 52 4f 58 59 5f 43 4f 4e 43 48 56  har)PROXY_CONCHV
2f6a0 45 52 53 49 4f 4e 29 7b 0a 20 20 20 20 20 20 20  ERSION){.       
2f6b0 20 20 20 2f 2a 20 64 6f 6e 27 74 20 62 72 65 61     /* don't brea
2f6c0 6b 20 74 68 65 20 6c 6f 63 6b 20 69 66 20 74 68  k the lock if th
2f6d0 65 20 68 6f 73 74 20 69 64 20 64 6f 65 73 6e 27  e host id doesn'
2f6e0 74 20 6d 61 74 63 68 20 2a 2f 0a 20 20 20 20 20  t match */.     
2f6f0 20 20 20 20 20 69 66 28 20 30 21 3d 6d 65 6d 63       if( 0!=memc
2f700 6d 70 28 26 74 42 75 66 5b 50 52 4f 58 59 5f 48  mp(&tBuf[PROXY_H
2f710 45 41 44 45 52 4c 45 4e 5d 2c 20 6d 79 48 6f 73  EADERLEN], myHos
2f720 74 49 44 2c 20 50 52 4f 58 59 5f 48 4f 53 54 49  tID, PROXY_HOSTI
2f730 44 4c 45 4e 29 20 29 7b 0a 20 20 20 20 20 20 20  DLEN) ){.       
2f740 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2f750 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20  TE_BUSY;.       
2f760 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c     }.        }el
2f770 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  se{.          /*
2f780 20 64 6f 6e 27 74 20 62 72 65 61 6b 20 74 68 65   don't break the
2f790 20 6c 6f 63 6b 20 6f 6e 20 73 68 6f 72 74 20 72   lock on short r
2f7a0 65 61 64 20 6f 72 20 61 20 76 65 72 73 69 6f 6e  ead or a version
2f7b0 20 6d 69 73 6d 61 74 63 68 20 2a 2f 0a 20 20 20   mismatch */.   
2f7c0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
2f7d0 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20  LITE_BUSY;.     
2f7e0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 75 73 6c     }.        usl
2f7f0 65 65 70 28 31 30 30 30 30 30 30 30 29 3b 20 2f  eep(10000000); /
2f800 2a 20 77 61 69 74 20 31 30 20 73 65 63 20 61 6e  * wait 10 sec an
2f810 64 20 74 72 79 20 74 68 65 20 6c 6f 63 6b 20 61  d try the lock a
2f820 67 61 69 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20  gain */.        
2f830 63 6f 6e 74 69 6e 75 65 3b 20 0a 20 20 20 20 20  continue; .     
2f840 20 7d 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20   }.      .      
2f850 61 73 73 65 72 74 28 20 6e 54 72 69 65 73 3d 3d  assert( nTries==
2f860 33 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 30  3 );.      if( 0
2f870 3d 3d 70 72 6f 78 79 42 72 65 61 6b 43 6f 6e 63  ==proxyBreakConc
2f880 68 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 6d 79 48  hLock(pFile, myH
2f890 6f 73 74 49 44 29 20 29 7b 0a 20 20 20 20 20 20  ostID) ){.      
2f8a0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
2f8b0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c 6f  ;.        if( lo
2f8c0 63 6b 54 79 70 65 3d 3d 45 58 43 4c 55 53 49 56  ckType==EXCLUSIV
2f8d0 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20  E_LOCK ){.      
2f8e0 20 20 20 20 72 63 20 3d 20 63 6f 6e 63 68 46 69      rc = conchFi
2f8f0 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f  le->pMethod->xLo
2f900 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ck((sqlite3_file
2f910 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 53 48 41  *)conchFile, SHA
2f920 52 45 44 5f 4c 4f 43 4b 29 3b 20 20 20 20 20 20  RED_LOCK);      
2f930 20 20 20 20 0a 20 20 20 20 20 20 20 20 7d 0a 20      .        }. 
2f940 20 20 20 20 20 20 20 69 66 28 20 21 72 63 20 29         if( !rc )
2f950 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
2f960 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74   conchFile->pMet
2f970 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28 73 71 6c 69  hod->xLock((sqli
2f980 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46  te3_file*)conchF
2f990 69 6c 65 2c 20 6c 6f 63 6b 54 79 70 65 29 3b 0a  ile, lockType);.
2f9a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2f9b0 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 77 68 69 6c  }.    }.  } whil
2f9c0 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  e( rc==SQLITE_BU
2f9d0 53 59 20 26 26 20 6e 54 72 69 65 73 3c 33 20 29  SY && nTries<3 )
2f9e0 3b 0a 20 20 0a 20 20 72 65 74 75 72 6e 20 72 63  ;.  .  return rc
2f9f0 3b 0a 7d 0a 0a 2f 2a 20 54 61 6b 65 73 20 74 68  ;.}../* Takes th
2fa00 65 20 63 6f 6e 63 68 20 62 79 20 74 61 6b 69 6e  e conch by takin
2fa10 67 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  g a shared lock 
2fa20 61 6e 64 20 72 65 61 64 20 74 68 65 20 63 6f 6e  and read the con
2fa30 74 65 6e 74 73 20 63 6f 6e 63 68 2c 20 69 66 20  tents conch, if 
2fa40 0a 2a 2a 20 6c 6f 63 6b 50 61 74 68 20 69 73 20  .** lockPath is 
2fa50 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74 68 65 20 68 6f  non-NULL, the ho
2fa60 73 74 20 49 44 20 61 6e 64 20 6c 6f 63 6b 20 66  st ID and lock f
2fa70 69 6c 65 20 70 61 74 68 20 6d 75 73 74 20 6d 61  ile path must ma
2fa80 74 63 68 2e 20 20 41 20 4e 55 4c 4c 20 0a 2a 2a  tch.  A NULL .**
2fa90 20 6c 6f 63 6b 50 61 74 68 20 6d 65 61 6e 73 20   lockPath means 
2faa0 74 68 61 74 20 74 68 65 20 6c 6f 63 6b 50 61 74  that the lockPat
2fab0 68 20 69 6e 20 74 68 65 20 63 6f 6e 63 68 20 66  h in the conch f
2fac0 69 6c 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64  ile will be used
2fad0 20 69 66 20 74 68 65 20 0a 2a 2a 20 68 6f 73 74   if the .** host
2fae0 20 49 44 73 20 6d 61 74 63 68 2c 20 6f 72 20 61   IDs match, or a
2faf0 20 6e 65 77 20 6c 6f 63 6b 20 70 61 74 68 20 77   new lock path w
2fb00 69 6c 6c 20 62 65 20 67 65 6e 65 72 61 74 65 64  ill be generated
2fb10 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 0a   automatically .
2fb20 2a 2a 20 61 6e 64 20 77 72 69 74 74 65 6e 20 74  ** and written t
2fb30 6f 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65  o the conch file
2fb40 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2fb50 70 72 6f 78 79 54 61 6b 65 43 6f 6e 63 68 28 75  proxyTakeConch(u
2fb60 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b  nixFile *pFile){
2fb70 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43  .  proxyLockingC
2fb80 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20 28  ontext *pCtx = (
2fb90 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
2fba0 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63  ext *)pFile->loc
2fbb0 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20 0a 20 20  kingContext; .  
2fbc0 0a 20 20 69 66 28 20 70 43 74 78 2d 3e 63 6f 6e  .  if( pCtx->con
2fbd0 63 68 48 65 6c 64 21 3d 30 20 29 7b 0a 20 20 20  chHeld!=0 ){.   
2fbe0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2fbf0 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  K;.  }else{.    
2fc00 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46  unixFile *conchF
2fc10 69 6c 65 20 3d 20 70 43 74 78 2d 3e 63 6f 6e 63  ile = pCtx->conc
2fc20 68 46 69 6c 65 3b 0a 20 20 20 20 75 75 69 64 5f  hFile;.    uuid_
2fc30 74 20 6d 79 48 6f 73 74 49 44 3b 0a 20 20 20 20  t myHostID;.    
2fc40 69 6e 74 20 70 45 72 72 6f 72 20 3d 20 30 3b 0a  int pError = 0;.
2fc50 20 20 20 20 63 68 61 72 20 72 65 61 64 42 75 66      char readBuf
2fc60 5b 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c  [PROXY_MAXCONCHL
2fc70 45 4e 5d 3b 0a 20 20 20 20 63 68 61 72 20 6c 6f  EN];.    char lo
2fc80 63 6b 50 61 74 68 5b 4d 41 58 50 41 54 48 4c 45  ckPath[MAXPATHLE
2fc90 4e 5d 3b 0a 20 20 20 20 63 68 61 72 20 2a 74 65  N];.    char *te
2fca0 6d 70 4c 6f 63 6b 50 61 74 68 20 3d 20 4e 55 4c  mpLockPath = NUL
2fcb0 4c 3b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20  L;.    int rc = 
2fcc0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 69  SQLITE_OK;.    i
2fcd0 6e 74 20 63 72 65 61 74 65 43 6f 6e 63 68 20 3d  nt createConch =
2fce0 20 30 3b 0a 20 20 20 20 69 6e 74 20 68 6f 73 74   0;.    int host
2fcf0 49 64 4d 61 74 63 68 20 3d 20 30 3b 0a 20 20 20  IdMatch = 0;.   
2fd00 20 69 6e 74 20 72 65 61 64 4c 65 6e 20 3d 20 30   int readLen = 0
2fd10 3b 0a 20 20 20 20 69 6e 74 20 74 72 79 4f 6c 64  ;.    int tryOld
2fd20 4c 6f 63 6b 50 61 74 68 20 3d 20 30 3b 0a 20 20  LockPath = 0;.  
2fd30 20 20 69 6e 74 20 66 6f 72 63 65 4e 65 77 4c 6f    int forceNewLo
2fd40 63 6b 50 61 74 68 20 3d 20 30 3b 0a 20 20 20 20  ckPath = 0;.    
2fd50 0a 20 20 20 20 4f 53 54 52 41 43 45 34 28 22 54  .    OSTRACE4("T
2fd60 41 4b 45 43 4f 4e 43 48 20 20 25 64 20 66 6f 72  AKECONCH  %d for
2fd70 20 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c 20 63   %s pid=%d\n", c
2fd80 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 0a 20 20 20  onchFile->h,.   
2fd90 20 20 20 20 20 20 20 20 20 20 28 70 43 74 78 2d            (pCtx-
2fda0 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 3f  >lockProxyPath ?
2fdb0 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79   pCtx->lockProxy
2fdc0 50 61 74 68 20 3a 20 22 3a 61 75 74 6f 3a 22 29  Path : ":auto:")
2fdd0 2c 20 67 65 74 70 69 64 28 29 29 3b 0a 0a 20 20  , getpid());..  
2fde0 20 20 72 63 20 3d 20 70 72 6f 78 79 47 65 74 48    rc = proxyGetH
2fdf0 6f 73 74 49 44 28 6d 79 48 6f 73 74 49 44 2c 20  ostID(myHostID, 
2fe00 26 70 45 72 72 6f 72 29 3b 0a 20 20 20 20 69 66  &pError);.    if
2fe10 28 20 28 72 63 26 30 78 66 66 29 3d 3d 53 51 4c  ( (rc&0xff)==SQL
2fe20 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20  ITE_IOERR ){.   
2fe30 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
2fe40 72 6e 6f 20 3d 20 70 45 72 72 6f 72 3b 0a 20 20  rno = pError;.  
2fe50 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b      goto end_tak
2fe60 65 63 6f 6e 63 68 3b 0a 20 20 20 20 7d 0a 20 20  econch;.    }.  
2fe70 20 20 72 63 20 3d 20 70 72 6f 78 79 43 6f 6e 63    rc = proxyConc
2fe80 68 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 6d 79 48  hLock(pFile, myH
2fe90 6f 73 74 49 44 2c 20 53 48 41 52 45 44 5f 4c 4f  ostID, SHARED_LO
2fea0 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  CK);.    if( rc!
2feb0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2fec0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b      goto end_tak
2fed0 65 63 6f 6e 63 68 3b 0a 20 20 20 20 7d 0a 20 20  econch;.    }.  
2fee0 20 20 2f 2a 20 72 65 61 64 20 74 68 65 20 65 78    /* read the ex
2fef0 69 73 74 69 6e 67 20 63 6f 6e 63 68 20 66 69 6c  isting conch fil
2ff00 65 20 2a 2f 0a 20 20 20 20 72 65 61 64 4c 65 6e  e */.    readLen
2ff10 20 3d 20 73 65 65 6b 41 6e 64 52 65 61 64 28 28   = seekAndRead((
2ff20 75 6e 69 78 46 69 6c 65 2a 29 63 6f 6e 63 68 46  unixFile*)conchF
2ff30 69 6c 65 2c 20 30 2c 20 72 65 61 64 42 75 66 2c  ile, 0, readBuf,
2ff40 20 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c   PROXY_MAXCONCHL
2ff50 45 4e 29 3b 0a 20 20 20 20 69 66 28 20 72 65 61  EN);.    if( rea
2ff60 64 4c 65 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20  dLen<0 ){.      
2ff70 2f 2a 20 49 2f 4f 20 65 72 72 6f 72 3a 20 6c 61  /* I/O error: la
2ff80 73 74 45 72 72 6e 6f 20 73 65 74 20 62 79 20 73  stErrno set by s
2ff90 65 65 6b 41 6e 64 52 65 61 64 20 2a 2f 0a 20 20  eekAndRead */.  
2ffa0 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
2ffb0 72 72 6e 6f 20 3d 20 63 6f 6e 63 68 46 69 6c 65  rrno = conchFile
2ffc0 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20  ->lastErrno;.   
2ffd0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
2ffe0 4f 45 52 52 5f 52 45 41 44 3b 0a 20 20 20 20 20  OERR_READ;.     
2fff0 20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b 65 63 6f   goto end_takeco
30000 6e 63 68 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  nch;.    }else i
30010 66 28 20 72 65 61 64 4c 65 6e 3c 3d 28 50 52 4f  f( readLen<=(PRO
30020 58 59 5f 48 45 41 44 45 52 4c 45 4e 2b 50 52 4f  XY_HEADERLEN+PRO
30030 58 59 5f 48 4f 53 54 49 44 4c 45 4e 29 20 7c 7c  XY_HOSTIDLEN) ||
30040 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 72   .             r
30050 65 61 64 42 75 66 5b 30 5d 21 3d 28 63 68 61 72  eadBuf[0]!=(char
30060 29 50 52 4f 58 59 5f 43 4f 4e 43 48 56 45 52 53  )PROXY_CONCHVERS
30070 49 4f 4e 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ION ){.      /* 
30080 61 20 73 68 6f 72 74 20 72 65 61 64 20 6f 72 20  a short read or 
30090 76 65 72 73 69 6f 6e 20 66 6f 72 6d 61 74 20 6d  version format m
300a0 69 73 6d 61 74 63 68 20 6d 65 61 6e 73 20 77 65  ismatch means we
300b0 20 6e 65 65 64 20 74 6f 20 63 72 65 61 74 65 20   need to create 
300c0 61 20 6e 65 77 20 0a 20 20 20 20 20 20 2a 2a 20  a new .      ** 
300d0 63 6f 6e 63 68 20 66 69 6c 65 2e 20 0a 20 20 20  conch file. .   
300e0 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 72 65 61     */.      crea
300f0 74 65 43 6f 6e 63 68 20 3d 20 31 3b 0a 20 20 20  teConch = 1;.   
30100 20 7d 0a 20 20 20 20 2f 2a 20 69 66 20 74 68 65   }.    /* if the
30110 20 68 6f 73 74 20 69 64 20 6d 61 74 63 68 65 73   host id matches
30120 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 70 61   and the lock pa
30130 74 68 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  th already exist
30140 73 20 69 6e 20 74 68 65 20 63 6f 6e 63 68 0a 20  s in the conch. 
30150 20 20 20 2a 2a 20 77 65 27 6c 6c 20 74 72 79 20     ** we'll try 
30160 74 6f 20 75 73 65 20 74 68 65 20 70 61 74 68 20  to use the path 
30170 74 68 65 72 65 2c 20 69 66 20 77 65 20 63 61 6e  there, if we can
30180 27 74 20 6f 70 65 6e 20 74 68 61 74 20 70 61 74  't open that pat
30190 68 2c 20 77 65 27 6c 6c 20 0a 20 20 20 20 2a 2a  h, we'll .    **
301a0 20 72 65 74 72 79 20 77 69 74 68 20 61 20 6e 65   retry with a ne
301b0 77 20 61 75 74 6f 2d 67 65 6e 65 72 61 74 65 64  w auto-generated
301c0 20 70 61 74 68 20 0a 20 20 20 20 2a 2f 0a 20 20   path .    */.  
301d0 20 20 64 6f 20 7b 20 2f 2a 20 69 6e 20 63 61 73    do { /* in cas
301e0 65 20 77 65 20 6e 65 65 64 20 74 6f 20 74 72 79  e we need to try
301f0 20 61 67 61 69 6e 20 66 6f 72 20 61 6e 20 3a 61   again for an :a
30200 75 74 6f 3a 20 6e 61 6d 65 64 20 6c 6f 63 6b 20  uto: named lock 
30210 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 20 20 69  file */..      i
30220 66 28 20 21 63 72 65 61 74 65 43 6f 6e 63 68 20  f( !createConch 
30230 26 26 20 21 66 6f 72 63 65 4e 65 77 4c 6f 63 6b  && !forceNewLock
30240 50 61 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20  Path ){.        
30250 68 6f 73 74 49 64 4d 61 74 63 68 20 3d 20 21 6d  hostIdMatch = !m
30260 65 6d 63 6d 70 28 26 72 65 61 64 42 75 66 5b 50  emcmp(&readBuf[P
30270 52 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e 5d 2c  ROXY_HEADERLEN],
30280 20 6d 79 48 6f 73 74 49 44 2c 20 0a 20 20 20 20   myHostID, .    
30290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
302a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 52                PR
302b0 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 29 3b 0a  OXY_HOSTIDLEN);.
302c0 20 20 20 20 20 20 20 20 2f 2a 20 69 66 20 74 68          /* if th
302d0 65 20 63 6f 6e 63 68 20 68 61 73 20 64 61 74 61  e conch has data
302e0 20 63 6f 6d 70 61 72 65 20 74 68 65 20 63 6f 6e   compare the con
302f0 74 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 20  tents */.       
30300 20 69 66 28 20 21 70 43 74 78 2d 3e 6c 6f 63 6b   if( !pCtx->lock
30310 50 72 6f 78 79 50 61 74 68 20 29 7b 0a 20 20 20  ProxyPath ){.   
30320 20 20 20 20 20 20 20 2f 2a 20 66 6f 72 20 61 75         /* for au
30330 74 6f 2d 6e 61 6d 65 64 20 6c 6f 63 61 6c 20 6c  to-named local l
30340 6f 63 6b 20 66 69 6c 65 2c 20 6a 75 73 74 20 63  ock file, just c
30350 68 65 63 6b 20 74 68 65 20 68 6f 73 74 20 49 44  heck the host ID
30360 20 61 6e 64 20 77 65 27 6c 6c 0a 20 20 20 20 20   and we'll.     
30370 20 20 20 20 20 20 2a 2a 20 75 73 65 20 74 68 65        ** use the
30380 20 6c 6f 63 61 6c 20 6c 6f 63 6b 20 66 69 6c 65   local lock file
30390 20 70 61 74 68 20 74 68 61 74 27 73 20 61 6c 72   path that's alr
303a0 65 61 64 79 20 69 6e 20 74 68 65 72 65 0a 20 20  eady in there.  
303b0 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
303c0 20 20 20 20 20 20 69 66 28 20 68 6f 73 74 49 64        if( hostId
303d0 4d 61 74 63 68 20 29 7b 0a 20 20 20 20 20 20 20  Match ){.       
303e0 20 20 20 20 20 73 69 7a 65 5f 74 20 70 61 74 68       size_t path
303f0 4c 65 6e 20 3d 20 28 72 65 61 64 4c 65 6e 20 2d  Len = (readLen -
30400 20 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58   PROXY_PATHINDEX
30410 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 0a  );.            .
30420 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
30430 70 61 74 68 4c 65 6e 3e 3d 4d 41 58 50 41 54 48  pathLen>=MAXPATH
30440 4c 45 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  LEN ){.         
30450 20 20 20 20 20 70 61 74 68 4c 65 6e 3d 4d 41 58       pathLen=MAX
30460 50 41 54 48 4c 45 4e 2d 31 3b 0a 20 20 20 20 20  PATHLEN-1;.     
30470 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
30480 20 20 20 20 20 6d 65 6d 63 70 79 28 6c 6f 63 6b       memcpy(lock
30490 50 61 74 68 2c 20 26 72 65 61 64 42 75 66 5b 50  Path, &readBuf[P
304a0 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 5d 2c  ROXY_PATHINDEX],
304b0 20 70 61 74 68 4c 65 6e 29 3b 0a 20 20 20 20 20   pathLen);.     
304c0 20 20 20 20 20 20 20 6c 6f 63 6b 50 61 74 68 5b         lockPath[
304d0 70 61 74 68 4c 65 6e 5d 20 3d 20 30 3b 0a 20 20  pathLen] = 0;.  
304e0 20 20 20 20 20 20 20 20 20 20 74 65 6d 70 4c 6f            tempLo
304f0 63 6b 50 61 74 68 20 3d 20 6c 6f 63 6b 50 61 74  ckPath = lockPat
30500 68 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  h;.            t
30510 72 79 4f 6c 64 4c 6f 63 6b 50 61 74 68 20 3d 20  ryOldLockPath = 
30520 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  1;.            /
30530 2a 20 63 72 65 61 74 65 20 61 20 63 6f 70 79 20  * create a copy 
30540 6f 66 20 74 68 65 20 6c 6f 63 6b 20 70 61 74 68  of the lock path
30550 20 69 66 20 74 68 65 20 63 6f 6e 63 68 20 69 73   if the conch is
30560 20 74 61 6b 65 6e 20 2a 2f 0a 20 20 20 20 20 20   taken */.      
30570 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 74        goto end_t
30580 61 6b 65 63 6f 6e 63 68 3b 0a 20 20 20 20 20 20  akeconch;.      
30590 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65      }.        }e
305a0 6c 73 65 20 69 66 28 20 68 6f 73 74 49 64 4d 61  lse if( hostIdMa
305b0 74 63 68 0a 20 20 20 20 20 20 20 20 20 20 20 20  tch.            
305c0 20 20 20 26 26 20 21 73 74 72 6e 63 6d 70 28 70     && !strncmp(p
305d0 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61  Ctx->lockProxyPa
305e0 74 68 2c 20 26 72 65 61 64 42 75 66 5b 50 52 4f  th, &readBuf[PRO
305f0 58 59 5f 50 41 54 48 49 4e 44 45 58 5d 2c 0a 20  XY_PATHINDEX],. 
30600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30610 20 20 20 20 20 20 20 20 20 20 72 65 61 64 4c 65            readLe
30620 6e 2d 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45  n-PROXY_PATHINDE
30630 58 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  X).        ){.  
30640 20 20 20 20 20 20 20 20 2f 2a 20 63 6f 6e 63 68          /* conch
30650 20 68 6f 73 74 20 61 6e 64 20 6c 6f 63 6b 20 70   host and lock p
30660 61 74 68 20 6d 61 74 63 68 20 2a 2f 0a 20 20 20  ath match */.   
30670 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
30680 74 61 6b 65 63 6f 6e 63 68 3b 20 0a 20 20 20 20  takeconch; .    
30690 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
306a0 20 20 20 20 0a 20 20 20 20 20 20 2f 2a 20 69 66      .      /* if
306b0 20 74 68 65 20 63 6f 6e 63 68 20 69 73 6e 27 74   the conch isn't
306c0 20 77 72 69 74 61 62 6c 65 20 61 6e 64 20 64 6f   writable and do
306d0 65 73 6e 27 74 20 6d 61 74 63 68 2c 20 77 65 20  esn't match, we 
306e0 63 61 6e 27 74 20 74 61 6b 65 20 69 74 20 2a 2f  can't take it */
306f0 0a 20 20 20 20 20 20 69 66 28 20 28 63 6f 6e 63  .      if( (conc
30700 68 46 69 6c 65 2d 3e 6f 70 65 6e 46 6c 61 67 73  hFile->openFlags
30710 26 4f 5f 52 44 57 52 29 20 3d 3d 20 30 20 29 7b  &O_RDWR) == 0 ){
30720 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
30730 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20  LITE_BUSY;.     
30740 20 20 20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b 65     goto end_take
30750 63 6f 6e 63 68 3b 0a 20 20 20 20 20 20 7d 0a 20  conch;.      }. 
30760 20 20 20 20 20 0a 20 20 20 20 20 20 2f 2a 20 65       .      /* e
30770 69 74 68 65 72 20 74 68 65 20 63 6f 6e 63 68 20  ither the conch 
30780 64 69 64 6e 27 74 20 6d 61 74 63 68 20 6f 72 20  didn't match or 
30790 77 65 20 6e 65 65 64 20 74 6f 20 63 72 65 61 74  we need to creat
307a0 65 20 61 20 6e 65 77 20 6f 6e 65 20 2a 2f 0a 20  e a new one */. 
307b0 20 20 20 20 20 69 66 28 20 21 70 43 74 78 2d 3e       if( !pCtx->
307c0 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 29 7b  lockProxyPath ){
307d0 0a 20 20 20 20 20 20 20 20 70 72 6f 78 79 47 65  .        proxyGe
307e0 74 4c 6f 63 6b 50 61 74 68 28 70 43 74 78 2d 3e  tLockPath(pCtx->
307f0 64 62 50 61 74 68 2c 20 6c 6f 63 6b 50 61 74 68  dbPath, lockPath
30800 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a 20  , MAXPATHLEN);. 
30810 20 20 20 20 20 20 20 74 65 6d 70 4c 6f 63 6b 50         tempLockP
30820 61 74 68 20 3d 20 6c 6f 63 6b 50 61 74 68 3b 0a  ath = lockPath;.
30830 20 20 20 20 20 20 20 20 2f 2a 20 63 72 65 61 74          /* creat
30840 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  e a copy of the 
30850 6c 6f 63 6b 20 70 61 74 68 20 5f 6f 6e 6c 79 5f  lock path _only_
30860 20 69 66 20 74 68 65 20 63 6f 6e 63 68 20 69 73   if the conch is
30870 20 74 61 6b 65 6e 20 2a 2f 0a 20 20 20 20 20 20   taken */.      
30880 7d 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20 2f  }.      .      /
30890 2a 20 75 70 64 61 74 65 20 63 6f 6e 63 68 20 77  * update conch w
308a0 69 74 68 20 68 6f 73 74 20 61 6e 64 20 70 61 74  ith host and pat
308b0 68 20 28 74 68 69 73 20 77 69 6c 6c 20 66 61 69  h (this will fai
308c0 6c 20 69 66 20 6f 74 68 65 72 20 70 72 6f 63 65  l if other proce
308d0 73 73 0a 20 20 20 20 20 20 2a 2a 20 68 61 73 20  ss.      ** has 
308e0 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 61 6c  a shared lock al
308f0 72 65 61 64 79 29 2c 20 69 66 20 74 68 65 20 68  ready), if the h
30900 6f 73 74 20 69 64 20 6d 61 74 63 68 65 73 2c 20  ost id matches, 
30910 75 73 65 20 74 68 65 20 62 69 67 0a 20 20 20 20  use the big.    
30920 20 20 2a 2a 20 73 74 69 63 6b 2e 0a 20 20 20 20    ** stick..    
30930 20 20 2a 2f 0a 20 20 20 20 20 20 66 75 74 69 6d    */.      futim
30940 65 73 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c  es(conchFile->h,
30950 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 69 66   NULL);.      if
30960 28 20 68 6f 73 74 49 64 4d 61 74 63 68 20 26 26  ( hostIdMatch &&
30970 20 21 63 72 65 61 74 65 43 6f 6e 63 68 20 29 7b   !createConch ){
30980 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 6f 6e  .        if( con
30990 63 68 46 69 6c 65 2d 3e 70 4c 6f 63 6b 20 26 26  chFile->pLock &&
309a0 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4c 6f 63   conchFile->pLoc
309b0 6b 2d 3e 63 6e 74 3e 31 20 29 7b 0a 20 20 20 20  k->cnt>1 ){.    
309c0 20 20 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20        /* We are 
309d0 74 72 79 69 6e 67 20 66 6f 72 20 61 6e 20 65 78  trying for an ex
309e0 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 62 75 74  clusive lock but
309f0 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64 20   another thread 
30a00 69 6e 20 74 68 69 73 0a 20 20 20 20 20 20 20 20  in this.        
30a10 20 20 20 2a 2a 20 73 61 6d 65 20 70 72 6f 63 65     ** same proce
30a20 73 73 20 69 73 20 73 74 69 6c 6c 20 68 6f 6c 64  ss is still hold
30a30 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c 6f 63  ing a shared loc
30a40 6b 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  k. */.          
30a50 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
30a60 3b 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65  ;.        } else
30a70 20 7b 20 20 20 20 20 20 20 20 20 20 0a 20 20 20   {          .   
30a80 20 20 20 20 20 20 20 72 63 20 3d 20 70 72 6f 78         rc = prox
30a90 79 43 6f 6e 63 68 4c 6f 63 6b 28 70 46 69 6c 65  yConchLock(pFile
30aa0 2c 20 6d 79 48 6f 73 74 49 44 2c 20 45 58 43 4c  , myHostID, EXCL
30ab0 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20  USIVE_LOCK);.   
30ac0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
30ad0 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  se{.        rc =
30ae0 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74   conchFile->pMet
30af0 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28 73 71 6c 69  hod->xLock((sqli
30b00 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46  te3_file*)conchF
30b10 69 6c 65 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c  ile, EXCLUSIVE_L
30b20 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OCK);.      }.  
30b30 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
30b40 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
30b50 20 63 68 61 72 20 77 72 69 74 65 42 75 66 66 65   char writeBuffe
30b60 72 5b 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48  r[PROXY_MAXCONCH
30b70 4c 45 4e 5d 3b 0a 20 20 20 20 20 20 20 20 69 6e  LEN];.        in
30b80 74 20 77 72 69 74 65 53 69 7a 65 20 3d 20 30 3b  t writeSize = 0;
30b90 0a 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20  .        .      
30ba0 20 20 77 72 69 74 65 42 75 66 66 65 72 5b 30 5d    writeBuffer[0]
30bb0 20 3d 20 28 63 68 61 72 29 50 52 4f 58 59 5f 43   = (char)PROXY_C
30bc0 4f 4e 43 48 56 45 52 53 49 4f 4e 3b 0a 20 20 20  ONCHVERSION;.   
30bd0 20 20 20 20 20 6d 65 6d 63 70 79 28 26 77 72 69       memcpy(&wri
30be0 74 65 42 75 66 66 65 72 5b 50 52 4f 58 59 5f 48  teBuffer[PROXY_H
30bf0 45 41 44 45 52 4c 45 4e 5d 2c 20 6d 79 48 6f 73  EADERLEN], myHos
30c00 74 49 44 2c 20 50 52 4f 58 59 5f 48 4f 53 54 49  tID, PROXY_HOSTI
30c10 44 4c 45 4e 29 3b 0a 20 20 20 20 20 20 20 20 69  DLEN);.        i
30c20 66 28 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f  f( pCtx->lockPro
30c30 78 79 50 61 74 68 21 3d 4e 55 4c 4c 20 29 7b 0a  xyPath!=NULL ){.
30c40 20 20 20 20 20 20 20 20 20 20 73 74 72 6c 63 70            strlcp
30c50 79 28 26 77 72 69 74 65 42 75 66 66 65 72 5b 50  y(&writeBuffer[P
30c60 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 5d 2c  ROXY_PATHINDEX],
30c70 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79   pCtx->lockProxy
30c80 50 61 74 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e  Path, MAXPATHLEN
30c90 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
30ca0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 72 6c  {.          strl
30cb0 63 70 79 28 26 77 72 69 74 65 42 75 66 66 65 72  cpy(&writeBuffer
30cc0 5b 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58  [PROXY_PATHINDEX
30cd0 5d 2c 20 74 65 6d 70 4c 6f 63 6b 50 61 74 68 2c  ], tempLockPath,
30ce0 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a 20 20   MAXPATHLEN);.  
30cf0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
30d00 77 72 69 74 65 53 69 7a 65 20 3d 20 50 52 4f 58  writeSize = PROX
30d10 59 5f 50 41 54 48 49 4e 44 45 58 20 2b 20 73 74  Y_PATHINDEX + st
30d20 72 6c 65 6e 28 26 77 72 69 74 65 42 75 66 66 65  rlen(&writeBuffe
30d30 72 5b 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45  r[PROXY_PATHINDE
30d40 58 5d 29 3b 0a 20 20 20 20 20 20 20 20 66 74 72  X]);.        ftr
30d50 75 6e 63 61 74 65 28 63 6f 6e 63 68 46 69 6c 65  uncate(conchFile
30d60 2d 3e 68 2c 20 77 72 69 74 65 53 69 7a 65 29 3b  ->h, writeSize);
30d70 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e  .        rc = un
30d80 69 78 57 72 69 74 65 28 28 73 71 6c 69 74 65 33  ixWrite((sqlite3
30d90 5f 66 69 6c 65 20 2a 29 63 6f 6e 63 68 46 69 6c  _file *)conchFil
30da0 65 2c 20 77 72 69 74 65 42 75 66 66 65 72 2c 20  e, writeBuffer, 
30db0 77 72 69 74 65 53 69 7a 65 2c 20 30 29 3b 0a 20  writeSize, 0);. 
30dc0 20 20 20 20 20 20 20 66 73 79 6e 63 28 63 6f 6e         fsync(con
30dd0 63 68 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 20 20  chFile->h);.    
30de0 20 20 20 20 2f 2a 20 49 66 20 77 65 20 63 72 65      /* If we cre
30df0 61 74 65 64 20 61 20 6e 65 77 20 63 6f 6e 63 68  ated a new conch
30e00 20 66 69 6c 65 20 28 6e 6f 74 20 6a 75 73 74 20   file (not just 
30e10 75 70 64 61 74 65 64 20 74 68 65 20 63 6f 6e 74  updated the cont
30e20 65 6e 74 73 20 6f 66 20 61 20 0a 20 20 20 20 20  ents of a .     
30e30 20 20 20 20 2a 2a 20 76 61 6c 69 64 20 63 6f 6e      ** valid con
30e40 63 68 20 66 69 6c 65 29 2c 20 74 72 79 20 74 6f  ch file), try to
30e50 20 6d 61 74 63 68 20 74 68 65 20 70 65 72 6d 69   match the permi
30e60 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 64 61  ssions of the da
30e70 74 61 62 61 73 65 20 0a 20 20 20 20 20 20 20 20  tabase .        
30e80 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
30e90 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
30ea0 20 63 72 65 61 74 65 43 6f 6e 63 68 20 29 7b 0a   createConch ){.
30eb0 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74            struct
30ec0 20 73 74 61 74 20 62 75 66 3b 0a 20 20 20 20 20   stat buf;.     
30ed0 20 20 20 20 20 69 6e 74 20 65 72 72 20 3d 20 66       int err = f
30ee0 73 74 61 74 28 70 46 69 6c 65 2d 3e 68 2c 20 26  stat(pFile->h, &
30ef0 62 75 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20  buf);.          
30f00 69 66 28 20 65 72 72 3d 3d 30 20 29 7b 0a 20 20  if( err==0 ){.  
30f10 20 20 20 20 20 20 20 20 20 20 6d 6f 64 65 5f 74            mode_t
30f20 20 63 6d 6f 64 65 20 3d 20 62 75 66 2e 73 74 5f   cmode = buf.st_
30f30 6d 6f 64 65 26 28 53 5f 49 52 55 53 52 7c 53 5f  mode&(S_IRUSR|S_
30f40 49 57 55 53 52 20 7c 20 53 5f 49 52 47 52 50 7c  IWUSR | S_IRGRP|
30f50 53 5f 49 57 47 52 50 20 7c 0a 20 20 20 20 20 20  S_IWGRP |.      
30f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30f80 20 20 53 5f 49 52 4f 54 48 7c 53 5f 49 57 4f 54    S_IROTH|S_IWOT
30f90 48 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  H);.            
30fa0 2f 2a 20 74 72 79 20 74 6f 20 6d 61 74 63 68 20  /* try to match 
30fb0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
30fc0 65 20 52 2f 57 20 70 65 72 6d 69 73 73 69 6f 6e  e R/W permission
30fd0 73 2c 20 69 67 6e 6f 72 65 20 66 61 69 6c 75 72  s, ignore failur
30fe0 65 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  e */.#ifndef SQL
30ff0 49 54 45 5f 50 52 4f 58 59 5f 44 45 42 55 47 0a  ITE_PROXY_DEBUG.
31000 20 20 20 20 20 20 20 20 20 20 20 20 66 63 68 6d              fchm
31010 6f 64 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c  od(conchFile->h,
31020 20 63 6d 6f 64 65 29 3b 0a 23 65 6c 73 65 0a 20   cmode);.#else. 
31030 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 66             if( f
31040 63 68 6d 6f 64 28 63 6f 6e 63 68 46 69 6c 65 2d  chmod(conchFile-
31050 3e 68 2c 20 63 6d 6f 64 65 29 21 3d 30 20 29 7b  >h, cmode)!=0 ){
31060 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
31070 6e 74 20 63 6f 64 65 20 3d 20 65 72 72 6e 6f 3b  nt code = errno;
31080 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66  .              f
31090 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
310a0 66 63 68 6d 6f 64 20 25 6f 20 46 41 49 4c 45 44  fchmod %o FAILED
310b0 20 77 69 74 68 20 25 64 20 25 73 5c 6e 22 2c 0a   with %d %s\n",.
310c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
310d0 20 20 20 20 20 20 63 6d 6f 64 65 2c 20 63 6f 64        cmode, cod
310e0 65 2c 20 73 74 72 65 72 72 6f 72 28 63 6f 64 65  e, strerror(code
310f0 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ));.            
31100 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20  } else {.       
31110 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73         fprintf(s
31120 74 64 65 72 72 2c 20 22 66 63 68 6d 6f 64 20 25  tderr, "fchmod %
31130 6f 20 53 55 43 43 45 44 45 44 5c 6e 22 2c 63 6d  o SUCCEDED\n",cm
31140 6f 64 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ode);.          
31150 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65    }.          }e
31160 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
31170 20 69 6e 74 20 63 6f 64 65 20 3d 20 65 72 72 6e   int code = errn
31180 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  o;.            f
31190 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
311a0 53 54 41 54 20 46 41 49 4c 45 44 5b 25 64 5d 20  STAT FAILED[%d] 
311b0 77 69 74 68 20 25 64 20 25 73 5c 6e 22 2c 20 0a  with %d %s\n", .
311c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
311d0 20 20 20 20 65 72 72 2c 20 63 6f 64 65 2c 20 73      err, code, s
311e0 74 72 65 72 72 6f 72 28 63 6f 64 65 29 29 3b 0a  trerror(code));.
311f0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20  #endif.         
31200 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
31210 20 20 20 7d 0a 20 20 20 20 20 20 63 6f 6e 63 68     }.      conch
31220 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78  File->pMethod->x
31230 55 6e 6c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f  Unlock((sqlite3_
31240 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c  file*)conchFile,
31250 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20   SHARED_LOCK);. 
31260 20 20 20 20 20 0a 20 20 20 20 65 6e 64 5f 74 61       .    end_ta
31270 6b 65 63 6f 6e 63 68 3a 0a 20 20 20 20 20 20 4f  keconch:.      O
31280 53 54 52 41 43 45 32 28 22 54 52 41 4e 53 50 52  STRACE2("TRANSPR
31290 4f 58 59 3a 20 43 4c 4f 53 45 20 20 25 64 5c 6e  OXY: CLOSE  %d\n
312a0 22 2c 20 70 46 69 6c 65 2d 3e 68 29 3b 0a 20 20  ", pFile->h);.  
312b0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
312c0 54 45 5f 4f 4b 20 26 26 20 70 46 69 6c 65 2d 3e  TE_OK && pFile->
312d0 6f 70 65 6e 46 6c 61 67 73 20 29 7b 0a 20 20 20  openFlags ){.   
312e0 20 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e       if( pFile->
312f0 68 3e 3d 30 20 29 7b 0a 23 69 66 64 65 66 20 53  h>=0 ){.#ifdef S
31300 54 52 49 43 54 5f 43 4c 4f 53 45 5f 45 52 52 4f  TRICT_CLOSE_ERRO
31310 52 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  R.          if( 
31320 63 6c 6f 73 65 28 70 46 69 6c 65 2d 3e 68 29 20  close(pFile->h) 
31330 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
31340 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
31350 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20  = errno;.       
31360 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
31370 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53 45 3b 0a  TE_IOERR_CLOSE;.
31380 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65 6c 73            }.#els
31390 65 0a 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73  e.          clos
313a0 65 28 70 46 69 6c 65 2d 3e 68 29 3b 20 2f 2a 20  e(pFile->h); /* 
313b0 73 69 6c 65 6e 74 6c 79 20 6c 65 61 6b 20 66 64  silently leak fd
313c0 20 69 66 20 66 61 69 6c 20 2a 2f 0a 23 65 6e 64   if fail */.#end
313d0 69 66 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  if.        }.   
313e0 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20       pFile->h = 
313f0 2d 31 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  -1;.        int 
31400 66 64 20 3d 20 6f 70 65 6e 28 70 43 74 78 2d 3e  fd = open(pCtx->
31410 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2d 3e 6f  dbPath, pFile->o
31420 70 65 6e 46 6c 61 67 73 2c 0a 20 20 20 20 20 20  penFlags,.      
31430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31440 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46  SQLITE_DEFAULT_F
31450 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 29  ILE_PERMISSIONS)
31460 3b 0a 20 20 20 20 20 20 20 20 4f 53 54 52 41 43  ;.        OSTRAC
31470 45 32 28 22 54 52 41 4e 53 50 52 4f 58 59 3a 20  E2("TRANSPROXY: 
31480 4f 50 45 4e 20 20 25 64 5c 6e 22 2c 20 66 64 29  OPEN  %d\n", fd)
31490 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 66 64  ;.        if( fd
314a0 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >=0 ){.         
314b0 20 70 46 69 6c 65 2d 3e 68 20 3d 20 66 64 3b 0a   pFile->h = fd;.
314c0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
314d0 20 20 20 20 20 20 20 20 20 72 63 3d 53 51 4c 49           rc=SQLI
314e0 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54  TE_CANTOPEN_BKPT
314f0 3b 20 2f 2a 20 53 51 4c 49 54 45 5f 42 55 53 59  ; /* SQLITE_BUSY
31500 3f 20 70 72 6f 78 79 54 61 6b 65 43 6f 6e 63 68  ? proxyTakeConch
31510 20 63 61 6c 6c 65 64 0a 20 20 20 20 20 20 20 20   called.        
31520 20 20 20 64 75 72 69 6e 67 20 6c 6f 63 6b 69 6e     during lockin
31530 67 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20  g */.        }. 
31540 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
31550 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
31560 26 20 21 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f  & !pCtx->lockPro
31570 78 79 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  xy ){.        ch
31580 61 72 20 2a 70 61 74 68 20 3d 20 74 65 6d 70 4c  ar *path = tempL
31590 6f 63 6b 50 61 74 68 20 3f 20 74 65 6d 70 4c 6f  ockPath ? tempLo
315a0 63 6b 50 61 74 68 20 3a 20 70 43 74 78 2d 3e 6c  ckPath : pCtx->l
315b0 6f 63 6b 50 72 6f 78 79 50 61 74 68 3b 0a 20 20  ockProxyPath;.  
315c0 20 20 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79        rc = proxy
315d0 43 72 65 61 74 65 55 6e 69 78 46 69 6c 65 28 70  CreateUnixFile(p
315e0 61 74 68 2c 20 26 70 43 74 78 2d 3e 6c 6f 63 6b  ath, &pCtx->lock
315f0 50 72 6f 78 79 2c 20 31 29 3b 0a 20 20 20 20 20  Proxy, 1);.     
31600 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
31610 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49  E_OK && rc!=SQLI
31620 54 45 5f 4e 4f 4d 45 4d 20 26 26 20 74 72 79 4f  TE_NOMEM && tryO
31630 6c 64 4c 6f 63 6b 50 61 74 68 20 29 7b 0a 20 20  ldLockPath ){.  
31640 20 20 20 20 20 20 20 20 2f 2a 20 77 65 20 63 6f          /* we co
31650 75 6c 64 6e 27 74 20 63 72 65 61 74 65 20 74 68  uldn't create th
31660 65 20 70 72 6f 78 79 20 6c 6f 63 6b 20 66 69 6c  e proxy lock fil
31670 65 20 77 69 74 68 20 74 68 65 20 6f 6c 64 20 6c  e with the old l
31680 6f 63 6b 20 66 69 6c 65 20 70 61 74 68 0a 20 20  ock file path.  
31690 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20 74           ** so t
316a0 72 79 20 61 67 61 69 6e 20 76 69 61 20 61 75 74  ry again via aut
316b0 6f 2d 6e 61 6d 69 6e 67 20 0a 20 20 20 20 20 20  o-naming .      
316c0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
316d0 20 20 66 6f 72 63 65 4e 65 77 4c 6f 63 6b 50 61    forceNewLockPa
316e0 74 68 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  th = 1;.        
316f0 20 20 74 72 79 4f 6c 64 4c 6f 63 6b 50 61 74 68    tryOldLockPath
31700 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
31710 63 6f 6e 74 69 6e 75 65 3b 20 2f 2a 20 67 6f 20  continue; /* go 
31720 62 61 63 6b 20 74 6f 20 74 68 65 20 64 6f 20 7b  back to the do {
31730 7d 20 77 68 69 6c 65 20 73 74 61 72 74 20 70 6f  } while start po
31740 69 6e 74 2c 20 74 72 79 20 61 67 61 69 6e 20 2a  int, try again *
31750 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  /.        }.    
31760 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
31770 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
31780 20 20 20 20 20 20 20 2f 2a 20 4e 65 65 64 20 74         /* Need t
31790 6f 20 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66  o make a copy of
317a0 20 70 61 74 68 20 69 66 20 77 65 20 65 78 74 72   path if we extr
317b0 61 63 74 65 64 20 74 68 65 20 76 61 6c 75 65 0a  acted the value.
317c0 20 20 20 20 20 20 20 20 20 2a 2a 20 66 72 6f 6d           ** from
317d0 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20   the conch file 
317e0 6f 72 20 74 68 65 20 70 61 74 68 20 77 61 73 20  or the path was 
317f0 61 6c 6c 6f 63 61 74 65 64 20 6f 6e 20 74 68 65  allocated on the
31800 20 73 74 61 63 6b 0a 20 20 20 20 20 20 20 20 20   stack.         
31810 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 74  */.        if( t
31820 65 6d 70 4c 6f 63 6b 50 61 74 68 20 29 7b 0a 20  empLockPath ){. 
31830 20 20 20 20 20 20 20 20 20 70 43 74 78 2d 3e 6c           pCtx->l
31840 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 3d 20 73  ockProxyPath = s
31850 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 30  qlite3DbStrDup(0
31860 2c 20 74 65 6d 70 4c 6f 63 6b 50 61 74 68 29 3b  , tempLockPath);
31870 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
31880 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50  pCtx->lockProxyP
31890 61 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ath ){.         
318a0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
318b0 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20  OMEM;.          
318c0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
318d0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
318e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
318f0 20 20 20 20 20 20 20 70 43 74 78 2d 3e 63 6f 6e         pCtx->con
31900 63 68 48 65 6c 64 20 3d 20 31 3b 0a 20 20 20 20  chHeld = 1;.    
31910 20 20 20 20 0a 20 20 20 20 20 20 20 20 69 66 28      .        if(
31920 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79   pCtx->lockProxy
31930 2d 3e 70 4d 65 74 68 6f 64 20 3d 3d 20 26 61 66  ->pMethod == &af
31940 70 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20  pIoMethods ){.  
31950 20 20 20 20 20 20 20 20 61 66 70 4c 6f 63 6b 69          afpLocki
31960 6e 67 43 6f 6e 74 65 78 74 20 2a 61 66 70 43 74  ngContext *afpCt
31970 78 3b 0a 20 20 20 20 20 20 20 20 20 20 61 66 70  x;.          afp
31980 43 74 78 20 3d 20 28 61 66 70 4c 6f 63 6b 69 6e  Ctx = (afpLockin
31990 67 43 6f 6e 74 65 78 74 20 2a 29 70 43 74 78 2d  gContext *)pCtx-
319a0 3e 6c 6f 63 6b 50 72 6f 78 79 2d 3e 6c 6f 63 6b  >lockProxy->lock
319b0 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20  ingContext;.    
319c0 20 20 20 20 20 20 61 66 70 43 74 78 2d 3e 64 62        afpCtx->db
319d0 50 61 74 68 20 3d 20 70 43 74 78 2d 3e 6c 6f 63  Path = pCtx->loc
319e0 6b 50 72 6f 78 79 50 61 74 68 3b 0a 20 20 20 20  kProxyPath;.    
319f0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 65 6c      }.      } el
31a00 73 65 20 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e  se {.        con
31a10 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d  chFile->pMethod-
31a20 3e 78 55 6e 6c 6f 63 6b 28 28 73 71 6c 69 74 65  >xUnlock((sqlite
31a30 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c  3_file*)conchFil
31a40 65 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20  e, NO_LOCK);.   
31a50 20 20 20 7d 0a 20 20 20 20 20 20 4f 53 54 52 41     }.      OSTRA
31a60 43 45 33 28 22 54 41 4b 45 43 4f 4e 43 48 20 20  CE3("TAKECONCH  
31a70 25 64 20 25 73 5c 6e 22 2c 20 63 6f 6e 63 68 46  %d %s\n", conchF
31a80 69 6c 65 2d 3e 68 2c 20 72 63 3d 3d 53 51 4c 49  ile->h, rc==SQLI
31a90 54 45 5f 4f 4b 3f 22 6f 6b 22 3a 22 66 61 69 6c  TE_OK?"ok":"fail
31aa0 65 64 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ed");.      retu
31ab0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 20 77 68 69  rn rc;.    } whi
31ac0 6c 65 20 28 31 29 3b 20 2f 2a 20 69 6e 20 63 61  le (1); /* in ca
31ad0 73 65 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65  se we need to re
31ae0 74 72 79 20 74 68 65 20 3a 61 75 74 6f 3a 20 6c  try the :auto: l
31af0 6f 63 6b 20 66 69 6c 65 20 2d 20 77 65 20 73 68  ock file - we sh
31b00 6f 75 6c 64 20 6e 65 76 65 72 20 67 65 74 20 68  ould never get h
31b10 65 72 65 20 65 78 63 65 70 74 20 76 69 61 20 74  ere except via t
31b20 68 65 20 27 63 6f 6e 74 69 6e 75 65 27 20 63 61  he 'continue' ca
31b30 6c 6c 2e 20 2a 2f 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ll. */.  }.}../*
31b40 0a 2a 2a 20 49 66 20 70 46 69 6c 65 20 68 6f 6c  .** If pFile hol
31b50 64 73 20 61 20 6c 6f 63 6b 20 6f 6e 20 61 20 63  ds a lock on a c
31b60 6f 6e 63 68 20 66 69 6c 65 2c 20 74 68 65 6e 20  onch file, then 
31b70 72 65 6c 65 61 73 65 20 74 68 61 74 20 6c 6f 63  release that loc
31b80 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  k..*/.static int
31b90 20 70 72 6f 78 79 52 65 6c 65 61 73 65 43 6f 6e   proxyReleaseCon
31ba0 63 68 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  ch(unixFile *pFi
31bb0 6c 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  le){.  int rc;  
31bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31bd0 20 20 20 2f 2a 20 53 75 62 72 6f 75 74 69 6e 65     /* Subroutine
31be0 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   return code */.
31bf0 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f    proxyLockingCo
31c00 6e 74 65 78 74 20 2a 70 43 74 78 3b 20 20 2f 2a  ntext *pCtx;  /*
31c10 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e   The locking con
31c20 74 65 78 74 20 66 6f 72 20 74 68 65 20 70 72 6f  text for the pro
31c30 78 79 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 69  xy lock */.  uni
31c40 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46 69 6c 65  xFile *conchFile
31c50 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65  ;        /* Name
31c60 20 6f 66 20 74 68 65 20 63 6f 6e 63 68 20 66 69   of the conch fi
31c70 6c 65 20 2a 2f 0a 0a 20 20 70 43 74 78 20 3d 20  le */..  pCtx = 
31c80 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e  (proxyLockingCon
31c90 74 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f  text *)pFile->lo
31ca0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20  ckingContext;.  
31cb0 63 6f 6e 63 68 46 69 6c 65 20 3d 20 70 43 74 78  conchFile = pCtx
31cc0 2d 3e 63 6f 6e 63 68 46 69 6c 65 3b 0a 20 20 4f  ->conchFile;.  O
31cd0 53 54 52 41 43 45 34 28 22 52 45 4c 45 41 53 45  STRACE4("RELEASE
31ce0 43 4f 4e 43 48 20 20 25 64 20 66 6f 72 20 25 73  CONCH  %d for %s
31cf0 20 70 69 64 3d 25 64 5c 6e 22 2c 20 63 6f 6e 63   pid=%d\n", conc
31d00 68 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20  hFile->h,.      
31d10 20 20 20 20 20 28 70 43 74 78 2d 3e 6c 6f 63 6b       (pCtx->lock
31d20 50 72 6f 78 79 50 61 74 68 20 3f 20 70 43 74 78  ProxyPath ? pCtx
31d30 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20  ->lockProxyPath 
31d40 3a 20 22 3a 61 75 74 6f 3a 22 29 2c 20 0a 20 20  : ":auto:"), .  
31d50 20 20 20 20 20 20 20 20 20 67 65 74 70 69 64 28           getpid(
31d60 29 29 3b 0a 20 20 69 66 28 20 70 43 74 78 2d 3e  ));.  if( pCtx->
31d70 63 6f 6e 63 68 48 65 6c 64 3e 30 20 29 7b 0a 20  conchHeld>0 ){. 
31d80 20 20 20 72 63 20 3d 20 63 6f 6e 63 68 46 69 6c     rc = conchFil
31d90 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c  e->pMethod->xUnl
31da0 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c  ock((sqlite3_fil
31db0 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 4e 4f  e*)conchFile, NO
31dc0 5f 4c 4f 43 4b 29 3b 0a 20 20 7d 0a 20 20 70 43  _LOCK);.  }.  pC
31dd0 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 20 3d 20  tx->conchHeld = 
31de0 30 3b 0a 20 20 4f 53 54 52 41 43 45 33 28 22 52  0;.  OSTRACE3("R
31df0 45 4c 45 41 53 45 43 4f 4e 43 48 20 20 25 64 20  ELEASECONCH  %d 
31e00 25 73 5c 6e 22 2c 20 63 6f 6e 63 68 46 69 6c 65  %s\n", conchFile
31e10 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ->h,.           
31e20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f  (rc==SQLITE_OK ?
31e30 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22   "ok" : "failed"
31e40 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ));.  return rc;
31e50 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  .}../*.** Given 
31e60 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 64 61  the name of a da
31e70 74 61 62 61 73 65 20 66 69 6c 65 2c 20 63 6f 6d  tabase file, com
31e80 70 75 74 65 20 74 68 65 20 6e 61 6d 65 20 6f 66  pute the name of
31e90 20 69 74 73 20 63 6f 6e 63 68 20 66 69 6c 65 2e   its conch file.
31ea0 0a 2a 2a 20 53 74 6f 72 65 20 74 68 65 20 63 6f  .** Store the co
31eb0 6e 63 68 20 66 69 6c 65 6e 61 6d 65 20 69 6e 20  nch filename in 
31ec0 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20  memory obtained 
31ed0 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  from sqlite3_mal
31ee0 6c 6f 63 28 29 2e 0a 2a 2a 20 4d 61 6b 65 20 2a  loc()..** Make *
31ef0 70 43 6f 6e 63 68 50 61 74 68 20 70 6f 69 6e 74  pConchPath point
31f00 20 74 6f 20 74 68 65 20 6e 65 77 20 6e 61 6d 65   to the new name
31f10 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
31f20 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 0a 2a  _OK on success.*
31f30 2a 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  * or SQLITE_NOME
31f40 4d 20 69 66 20 75 6e 61 62 6c 65 20 74 6f 20 6f  M if unable to o
31f50 62 74 61 69 6e 20 6d 65 6d 6f 72 79 2e 0a 2a 2a  btain memory..**
31f60 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 69  .** The caller i
31f70 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
31f80 72 20 65 6e 73 75 72 69 6e 67 20 74 68 61 74 20  r ensuring that 
31f90 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 6d 65  the allocated me
31fa0 6d 6f 72 79 0a 2a 2a 20 73 70 61 63 65 20 69 73  mory.** space is
31fb0 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65   eventually free
31fc0 64 2e 0a 2a 2a 0a 2a 2a 20 2a 70 43 6f 6e 63 68  d..**.** *pConch
31fd0 50 61 74 68 20 69 73 20 73 65 74 20 74 6f 20 4e  Path is set to N
31fe0 55 4c 4c 20 69 66 20 61 20 6d 65 6d 6f 72 79 20  ULL if a memory 
31ff0 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72  allocation error
32000 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74   occurs..*/.stat
32010 69 63 20 69 6e 74 20 70 72 6f 78 79 43 72 65 61  ic int proxyCrea
32020 74 65 43 6f 6e 63 68 50 61 74 68 6e 61 6d 65 28  teConchPathname(
32030 63 68 61 72 20 2a 64 62 50 61 74 68 2c 20 63 68  char *dbPath, ch
32040 61 72 20 2a 2a 70 43 6f 6e 63 68 50 61 74 68 29  ar **pConchPath)
32050 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  {.  int i;      
32060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32070 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
32080 72 20 2a 2f 0a 20 20 69 6e 74 20 6c 65 6e 20 3d  r */.  int len =
32090 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 64 62 50   (int)strlen(dbP
320a0 61 74 68 29 3b 20 2f 2a 20 4c 65 6e 67 74 68 20  ath); /* Length 
320b0 6f 66 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  of database file
320c0 6e 61 6d 65 20 2d 20 64 62 50 61 74 68 20 2a 2f  name - dbPath */
320d0 0a 20 20 63 68 61 72 20 2a 63 6f 6e 63 68 50 61  .  char *conchPa
320e0 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  th;             
320f0 20 2f 2a 20 62 75 66 66 65 72 20 69 6e 20 77 68   /* buffer in wh
32100 69 63 68 20 74 6f 20 63 6f 6e 73 74 72 75 63 74  ich to construct
32110 20 63 6f 6e 63 68 20 6e 61 6d 65 20 2a 2f 0a 0a   conch name */..
32120 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70    /* Allocate sp
32130 61 63 65 20 66 6f 72 20 74 68 65 20 63 6f 6e 63  ace for the conc
32140 68 20 66 69 6c 65 6e 61 6d 65 20 61 6e 64 20 69  h filename and i
32150 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6e 61  nitialize the na
32160 6d 65 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 6e  me to.  ** the n
32170 61 6d 65 20 6f 66 20 74 68 65 20 6f 72 69 67 69  ame of the origi
32180 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c  nal database fil
32190 65 2e 20 2a 2f 20 20 0a 20 20 2a 70 43 6f 6e 63  e. */  .  *pConc
321a0 68 50 61 74 68 20 3d 20 63 6f 6e 63 68 50 61 74  hPath = conchPat
321b0 68 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69  h = (char *)sqli
321c0 74 65 33 5f 6d 61 6c 6c 6f 63 28 6c 65 6e 20 2b  te3_malloc(len +
321d0 20 38 29 3b 0a 20 20 69 66 28 20 63 6f 6e 63 68   8);.  if( conch
321e0 50 61 74 68 3d 3d 30 20 29 7b 0a 20 20 20 20 72  Path==0 ){.    r
321f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
32200 45 4d 3b 0a 20 20 7d 0a 20 20 6d 65 6d 63 70 79  EM;.  }.  memcpy
32210 28 63 6f 6e 63 68 50 61 74 68 2c 20 64 62 50 61  (conchPath, dbPa
32220 74 68 2c 20 6c 65 6e 2b 31 29 3b 0a 20 20 0a 20  th, len+1);.  . 
32230 20 2f 2a 20 6e 6f 77 20 69 6e 73 65 72 74 20 61   /* now insert a
32240 20 22 2e 22 20 62 65 66 6f 72 65 20 74 68 65 20   "." before the 
32250 6c 61 73 74 20 2f 20 63 68 61 72 61 63 74 65 72  last / character
32260 20 2a 2f 0a 20 20 66 6f 72 28 20 69 3d 28 6c 65   */.  for( i=(le
32270 6e 2d 31 29 3b 20 69 3e 3d 30 3b 20 69 2d 2d 20  n-1); i>=0; i-- 
32280 29 7b 0a 20 20 20 20 69 66 28 20 63 6f 6e 63 68  ){.    if( conch
32290 50 61 74 68 5b 69 5d 3d 3d 27 2f 27 20 29 7b 0a  Path[i]=='/' ){.
322a0 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20        i++;.     
322b0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
322c0 7d 0a 20 20 63 6f 6e 63 68 50 61 74 68 5b 69 5d  }.  conchPath[i]
322d0 3d 27 2e 27 3b 0a 20 20 77 68 69 6c 65 20 28 20  ='.';.  while ( 
322e0 69 3c 6c 65 6e 20 29 7b 0a 20 20 20 20 63 6f 6e  i<len ){.    con
322f0 63 68 50 61 74 68 5b 69 2b 31 5d 3d 64 62 50 61  chPath[i+1]=dbPa
32300 74 68 5b 69 5d 3b 0a 20 20 20 20 69 2b 2b 3b 0a  th[i];.    i++;.
32310 20 20 7d 0a 0a 20 20 2f 2a 20 61 70 70 65 6e 64    }..  /* append
32320 20 74 68 65 20 22 2d 63 6f 6e 63 68 22 20 73 75   the "-conch" su
32330 66 66 69 78 20 74 6f 20 74 68 65 20 66 69 6c 65  ffix to the file
32340 20 2a 2f 0a 20 20 6d 65 6d 63 70 79 28 26 63 6f   */.  memcpy(&co
32350 6e 63 68 50 61 74 68 5b 69 2b 31 5d 2c 20 22 2d  nchPath[i+1], "-
32360 63 6f 6e 63 68 22 2c 20 37 29 3b 0a 20 20 61 73  conch", 7);.  as
32370 73 65 72 74 28 20 28 69 6e 74 29 73 74 72 6c 65  sert( (int)strle
32380 6e 28 63 6f 6e 63 68 50 61 74 68 29 20 3d 3d 20  n(conchPath) == 
32390 6c 65 6e 2b 37 20 29 3b 0a 0a 20 20 72 65 74 75  len+7 );..  retu
323a0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
323b0 0a 0a 2f 2a 20 54 61 6b 65 73 20 61 20 66 75 6c  ../* Takes a ful
323c0 6c 79 20 63 6f 6e 66 69 67 75 72 65 64 20 70 72  ly configured pr
323d0 6f 78 79 20 6c 6f 63 6b 69 6e 67 2d 73 74 79 6c  oxy locking-styl
323e0 65 20 75 6e 69 78 20 66 69 6c 65 20 61 6e 64 20  e unix file and 
323f0 73 77 69 74 63 68 65 73 0a 2a 2a 20 74 68 65 20  switches.** the 
32400 6c 6f 63 61 6c 20 6c 6f 63 6b 20 66 69 6c 65 20  local lock file 
32410 70 61 74 68 20 0a 2a 2f 0a 73 74 61 74 69 63 20  path .*/.static 
32420 69 6e 74 20 73 77 69 74 63 68 4c 6f 63 6b 50 72  int switchLockPr
32430 6f 78 79 50 61 74 68 28 75 6e 69 78 46 69 6c 65  oxyPath(unixFile
32440 20 2a 70 46 69 6c 65 2c 20 63 6f 6e 73 74 20 63   *pFile, const c
32450 68 61 72 20 2a 70 61 74 68 29 20 7b 0a 20 20 70  har *path) {.  p
32460 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
32470 78 74 20 2a 70 43 74 78 20 3d 20 28 70 72 6f 78  xt *pCtx = (prox
32480 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2a  yLockingContext*
32490 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43  )pFile->lockingC
324a0 6f 6e 74 65 78 74 3b 0a 20 20 63 68 61 72 20 2a  ontext;.  char *
324b0 6f 6c 64 50 61 74 68 20 3d 20 70 43 74 78 2d 3e  oldPath = pCtx->
324c0 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 3b 0a 20  lockProxyPath;. 
324d0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
324e0 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 70 46 69 6c  _OK;..  if( pFil
324f0 65 2d 3e 6c 6f 63 6b 74 79 70 65 21 3d 4e 4f 5f  e->locktype!=NO_
32500 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  LOCK ){.    retu
32510 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a  rn SQLITE_BUSY;.
32520 20 20 7d 20 20 0a 0a 20 20 2f 2a 20 6e 6f 74 68    }  ..  /* noth
32530 69 6e 67 20 74 6f 20 64 6f 20 69 66 20 74 68 65  ing to do if the
32540 20 70 61 74 68 20 69 73 20 4e 55 4c 4c 2c 20 3a   path is NULL, :
32550 61 75 74 6f 3a 20 6f 72 20 6d 61 74 63 68 65 73  auto: or matches
32560 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 70 61   the existing pa
32570 74 68 20 2a 2f 0a 20 20 69 66 28 20 21 70 61 74  th */.  if( !pat
32580 68 20 7c 7c 20 70 61 74 68 5b 30 5d 3d 3d 27 5c  h || path[0]=='\
32590 30 27 20 7c 7c 20 21 73 74 72 63 6d 70 28 70 61  0' || !strcmp(pa
325a0 74 68 2c 20 22 3a 61 75 74 6f 3a 22 29 20 7c 7c  th, ":auto:") ||
325b0 0a 20 20 20 20 28 6f 6c 64 50 61 74 68 20 26 26  .    (oldPath &&
325c0 20 21 73 74 72 6e 63 6d 70 28 6f 6c 64 50 61 74   !strncmp(oldPat
325d0 68 2c 20 70 61 74 68 2c 20 4d 41 58 50 41 54 48  h, path, MAXPATH
325e0 4c 45 4e 29 29 20 29 7b 0a 20 20 20 20 72 65 74  LEN)) ){.    ret
325f0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
32600 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 6e 69 78   }else{.    unix
32610 46 69 6c 65 20 2a 6c 6f 63 6b 50 72 6f 78 79 20  File *lockProxy 
32620 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78  = pCtx->lockProx
32630 79 3b 0a 20 20 20 20 70 43 74 78 2d 3e 6c 6f 63  y;.    pCtx->loc
32640 6b 50 72 6f 78 79 3d 4e 55 4c 4c 3b 0a 20 20 20  kProxy=NULL;.   
32650 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64   pCtx->conchHeld
32660 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 6c 6f   = 0;.    if( lo
32670 63 6b 50 72 6f 78 79 21 3d 4e 55 4c 4c 20 29 7b  ckProxy!=NULL ){
32680 0a 20 20 20 20 20 20 72 63 3d 6c 6f 63 6b 50 72  .      rc=lockPr
32690 6f 78 79 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 43  oxy->pMethod->xC
326a0 6c 6f 73 65 28 28 73 71 6c 69 74 65 33 5f 66 69  lose((sqlite3_fi
326b0 6c 65 20 2a 29 6c 6f 63 6b 50 72 6f 78 79 29 3b  le *)lockProxy);
326c0 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
326d0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
326e0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 6c 6f   sqlite3_free(lo
326f0 63 6b 50 72 6f 78 79 29 3b 0a 20 20 20 20 7d 0a  ckProxy);.    }.
32700 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
32710 28 6f 6c 64 50 61 74 68 29 3b 0a 20 20 20 20 70  (oldPath);.    p
32720 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61  Ctx->lockProxyPa
32730 74 68 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  th = sqlite3DbSt
32740 72 44 75 70 28 30 2c 20 70 61 74 68 29 3b 0a 20  rDup(0, path);. 
32750 20 7d 0a 20 20 0a 20 20 72 65 74 75 72 6e 20 72   }.  .  return r
32760 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 46 69 6c  c;.}../*.** pFil
32770 65 20 69 73 20 61 20 66 69 6c 65 20 74 68 61 74  e is a file that
32780 20 68 61 73 20 62 65 65 6e 20 6f 70 65 6e 65 64   has been opened
32790 20 62 79 20 61 20 70 72 69 6f 72 20 78 4f 70 65   by a prior xOpe
327a0 6e 20 63 61 6c 6c 2e 20 20 64 62 50 61 74 68 0a  n call.  dbPath.
327b0 2a 2a 20 69 73 20 61 20 73 74 72 69 6e 67 20 62  ** is a string b
327c0 75 66 66 65 72 20 61 74 20 6c 65 61 73 74 20 4d  uffer at least M
327d0 41 58 50 41 54 48 4c 45 4e 2b 31 20 63 68 61 72  AXPATHLEN+1 char
327e0 61 63 74 65 72 73 20 69 6e 20 73 69 7a 65 2e 0a  acters in size..
327f0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
32800 6e 65 20 66 69 6e 64 20 74 68 65 20 66 69 6c 65  ne find the file
32810 6e 61 6d 65 20 61 73 73 6f 63 69 61 74 65 64 20  name associated 
32820 77 69 74 68 20 70 46 69 6c 65 20 61 6e 64 20 77  with pFile and w
32830 72 69 74 65 73 20 69 74 0a 2a 2a 20 69 6e 74 20  rites it.** int 
32840 64 62 50 61 74 68 2e 0a 2a 2f 0a 73 74 61 74 69  dbPath..*/.stati
32850 63 20 69 6e 74 20 70 72 6f 78 79 47 65 74 44 62  c int proxyGetDb
32860 50 61 74 68 46 6f 72 55 6e 69 78 46 69 6c 65 28  PathForUnixFile(
32870 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c  unixFile *pFile,
32880 20 63 68 61 72 20 2a 64 62 50 61 74 68 29 7b 0a   char *dbPath){.
32890 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50  #if defined(__AP
328a0 50 4c 45 5f 5f 29 0a 20 20 69 66 28 20 70 46 69  PLE__).  if( pFi
328b0 6c 65 2d 3e 70 4d 65 74 68 6f 64 20 3d 3d 20 26  le->pMethod == &
328c0 61 66 70 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a  afpIoMethods ){.
328d0 20 20 20 20 2f 2a 20 61 66 70 20 73 74 79 6c 65      /* afp style
328e0 20 6b 65 65 70 73 20 61 20 72 65 66 65 72 65 6e   keeps a referen
328f0 63 65 20 74 6f 20 74 68 65 20 64 62 20 70 61 74  ce to the db pat
32900 68 20 69 6e 20 74 68 65 20 66 69 6c 65 50 61 74  h in the filePat
32910 68 20 66 69 65 6c 64 20 0a 20 20 20 20 2a 2a 20  h field .    ** 
32920 6f 66 20 74 68 65 20 73 74 72 75 63 74 20 2a 2f  of the struct */
32930 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 69 6e  .    assert( (in
32940 74 29 73 74 72 6c 65 6e 28 28 63 68 61 72 2a 29  t)strlen((char*)
32950 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
32960 6e 74 65 78 74 29 3c 3d 4d 41 58 50 41 54 48 4c  ntext)<=MAXPATHL
32970 45 4e 20 29 3b 0a 20 20 20 20 73 74 72 6c 63 70  EN );.    strlcp
32980 79 28 64 62 50 61 74 68 2c 20 28 28 61 66 70 4c  y(dbPath, ((afpL
32990 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29  ockingContext *)
329a0 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
329b0 6e 74 65 78 74 29 2d 3e 64 62 50 61 74 68 2c 20  ntext)->dbPath, 
329c0 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a 20 20 7d  MAXPATHLEN);.  }
329d0 20 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 69   else.#endif.  i
329e0 66 28 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f  f( pFile->pMetho
329f0 64 20 3d 3d 20 26 64 6f 74 6c 6f 63 6b 49 6f 4d  d == &dotlockIoM
32a00 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f 2a  ethods ){.    /*
32a10 20 64 6f 74 20 6c 6f 63 6b 20 73 74 79 6c 65 20   dot lock style 
32a20 75 73 65 73 20 74 68 65 20 6c 6f 63 6b 69 6e 67  uses the locking
32a30 20 63 6f 6e 74 65 78 74 20 74 6f 20 73 74 6f 72   context to stor
32a40 65 20 74 68 65 20 64 6f 74 20 6c 6f 63 6b 0a 20  e the dot lock. 
32a50 20 20 20 2a 2a 20 66 69 6c 65 20 70 61 74 68 20     ** file path 
32a60 2a 2f 0a 20 20 20 20 69 6e 74 20 6c 65 6e 20 3d  */.    int len =
32a70 20 73 74 72 6c 65 6e 28 28 63 68 61 72 20 2a 29   strlen((char *)
32a80 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
32a90 6e 74 65 78 74 29 20 2d 20 73 74 72 6c 65 6e 28  ntext) - strlen(
32aa0 44 4f 54 4c 4f 43 4b 5f 53 55 46 46 49 58 29 3b  DOTLOCK_SUFFIX);
32ab0 0a 20 20 20 20 6d 65 6d 63 70 79 28 64 62 50 61  .    memcpy(dbPa
32ac0 74 68 2c 20 28 63 68 61 72 20 2a 29 70 46 69 6c  th, (char *)pFil
32ad0 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
32ae0 74 2c 20 6c 65 6e 20 2b 20 31 29 3b 0a 20 20 7d  t, len + 1);.  }
32af0 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 61 6c 6c  else{.    /* all
32b00 20 6f 74 68 65 72 20 73 74 79 6c 65 73 20 75 73   other styles us
32b10 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f  e the locking co
32b20 6e 74 65 78 74 20 74 6f 20 73 74 6f 72 65 20 74  ntext to store t
32b30 68 65 20 64 62 20 66 69 6c 65 20 70 61 74 68 20  he db file path 
32b40 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  */.    assert( s
32b50 74 72 6c 65 6e 28 28 63 68 61 72 2a 29 70 46 69  trlen((char*)pFi
32b60 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
32b70 78 74 29 3c 3d 4d 41 58 50 41 54 48 4c 45 4e 20  xt)<=MAXPATHLEN 
32b80 29 3b 0a 20 20 20 20 73 74 72 6c 63 70 79 28 64  );.    strlcpy(d
32b90 62 50 61 74 68 2c 20 28 63 68 61 72 20 2a 29 70  bPath, (char *)p
32ba0 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
32bb0 74 65 78 74 2c 20 4d 41 58 50 41 54 48 4c 45 4e  text, MAXPATHLEN
32bc0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
32bd0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
32be0 0a 2a 2a 20 54 61 6b 65 73 20 61 6e 20 61 6c 72  .** Takes an alr
32bf0 65 61 64 79 20 66 69 6c 6c 65 64 20 69 6e 20 75  eady filled in u
32c00 6e 69 78 20 66 69 6c 65 20 61 6e 64 20 61 6c 74  nix file and alt
32c10 65 72 73 20 69 74 20 73 6f 20 61 6c 6c 20 66 69  ers it so all fi
32c20 6c 65 20 6c 6f 63 6b 69 6e 67 20 0a 2a 2a 20 77  le locking .** w
32c30 69 6c 6c 20 62 65 20 70 65 72 66 6f 72 6d 65 64  ill be performed
32c40 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 72   on the local pr
32c50 6f 78 79 20 6c 6f 63 6b 20 66 69 6c 65 2e 20 20  oxy lock file.  
32c60 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69  The following fi
32c70 65 6c 64 73 0a 2a 2a 20 61 72 65 20 70 72 65 73  elds.** are pres
32c80 65 72 76 65 64 20 69 6e 20 74 68 65 20 6c 6f 63  erved in the loc
32c90 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 73 6f 20  king context so 
32ca0 74 68 61 74 20 74 68 65 79 20 63 61 6e 20 62 65  that they can be
32cb0 20 72 65 73 74 6f 72 65 64 20 61 6e 64 20 0a 2a   restored and .*
32cc0 2a 20 74 68 65 20 75 6e 69 78 20 73 74 72 75 63  * the unix struc
32cd0 74 75 72 65 20 70 72 6f 70 65 72 6c 79 20 63 6c  ture properly cl
32ce0 65 61 6e 65 64 20 75 70 20 61 74 20 63 6c 6f 73  eaned up at clos
32cf0 65 20 74 69 6d 65 3a 0a 2a 2a 20 20 2d 3e 6c 6f  e time:.**  ->lo
32d00 63 6b 69 6e 67 43 6f 6e 74 65 78 74 0a 2a 2a 20  ckingContext.** 
32d10 20 2d 3e 70 4d 65 74 68 6f 64 0a 2a 2f 0a 73 74   ->pMethod.*/.st
32d20 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 54 72  atic int proxyTr
32d30 61 6e 73 66 6f 72 6d 55 6e 69 78 46 69 6c 65 28  ansformUnixFile(
32d40 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c  unixFile *pFile,
32d50 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 61 74   const char *pat
32d60 68 29 20 7b 0a 20 20 70 72 6f 78 79 4c 6f 63 6b  h) {.  proxyLock
32d70 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78  ingContext *pCtx
32d80 3b 0a 20 20 63 68 61 72 20 64 62 50 61 74 68 5b  ;.  char dbPath[
32d90 4d 41 58 50 41 54 48 4c 45 4e 2b 31 5d 3b 20 20  MAXPATHLEN+1];  
32da0 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
32db0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
32dc0 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 6c 6f 63  e */.  char *loc
32dd0 6b 50 61 74 68 3d 4e 55 4c 4c 3b 0a 20 20 69 6e  kPath=NULL;.  in
32de0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
32df0 3b 0a 20 20 0a 20 20 69 66 28 20 70 46 69 6c 65  ;.  .  if( pFile
32e00 2d 3e 6c 6f 63 6b 74 79 70 65 21 3d 4e 4f 5f 4c  ->locktype!=NO_L
32e10 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  OCK ){.    retur
32e20 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  n SQLITE_BUSY;. 
32e30 20 7d 0a 20 20 70 72 6f 78 79 47 65 74 44 62 50   }.  proxyGetDbP
32e40 61 74 68 46 6f 72 55 6e 69 78 46 69 6c 65 28 70  athForUnixFile(p
32e50 46 69 6c 65 2c 20 64 62 50 61 74 68 29 3b 0a 20  File, dbPath);. 
32e60 20 69 66 28 20 21 70 61 74 68 20 7c 7c 20 70 61   if( !path || pa
32e70 74 68 5b 30 5d 3d 3d 27 5c 30 27 20 7c 7c 20 21  th[0]=='\0' || !
32e80 73 74 72 63 6d 70 28 70 61 74 68 2c 20 22 3a 61  strcmp(path, ":a
32e90 75 74 6f 3a 22 29 20 29 7b 0a 20 20 20 20 6c 6f  uto:") ){.    lo
32ea0 63 6b 50 61 74 68 3d 4e 55 4c 4c 3b 0a 20 20 7d  ckPath=NULL;.  }
32eb0 65 6c 73 65 7b 0a 20 20 20 20 6c 6f 63 6b 50 61  else{.    lockPa
32ec0 74 68 3d 28 63 68 61 72 20 2a 29 70 61 74 68 3b  th=(char *)path;
32ed0 0a 20 20 7d 0a 20 20 0a 20 20 4f 53 54 52 41 43  .  }.  .  OSTRAC
32ee0 45 34 28 22 54 52 41 4e 53 50 52 4f 58 59 20 20  E4("TRANSPROXY  
32ef0 25 64 20 66 6f 72 20 25 73 20 70 69 64 3d 25 64  %d for %s pid=%d
32f00 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20  \n", pFile->h,. 
32f10 20 20 20 20 20 20 20 20 20 20 28 6c 6f 63 6b 50            (lockP
32f20 61 74 68 20 3f 20 6c 6f 63 6b 50 61 74 68 20 3a  ath ? lockPath :
32f30 20 22 3a 61 75 74 6f 3a 22 29 2c 20 67 65 74 70   ":auto:"), getp
32f40 69 64 28 29 29 3b 0a 0a 20 20 70 43 74 78 20 3d  id());..  pCtx =
32f50 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
32f60 20 73 69 7a 65 6f 66 28 2a 70 43 74 78 29 20 29   sizeof(*pCtx) )
32f70 3b 0a 20 20 69 66 28 20 70 43 74 78 3d 3d 30 20  ;.  if( pCtx==0 
32f80 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
32f90 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
32fa0 20 20 6d 65 6d 73 65 74 28 70 43 74 78 2c 20 30    memset(pCtx, 0
32fb0 2c 20 73 69 7a 65 6f 66 28 2a 70 43 74 78 29 29  , sizeof(*pCtx))
32fc0 3b 0a 0a 20 20 72 63 20 3d 20 70 72 6f 78 79 43  ;..  rc = proxyC
32fd0 72 65 61 74 65 43 6f 6e 63 68 50 61 74 68 6e 61  reateConchPathna
32fe0 6d 65 28 64 62 50 61 74 68 2c 20 26 70 43 74 78  me(dbPath, &pCtx
32ff0 2d 3e 63 6f 6e 63 68 46 69 6c 65 50 61 74 68 29  ->conchFilePath)
33000 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
33010 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
33020 3d 20 70 72 6f 78 79 43 72 65 61 74 65 55 6e 69  = proxyCreateUni
33030 78 46 69 6c 65 28 70 43 74 78 2d 3e 63 6f 6e 63  xFile(pCtx->conc
33040 68 46 69 6c 65 50 61 74 68 2c 20 26 70 43 74 78  hFilePath, &pCtx
33050 2d 3e 63 6f 6e 63 68 46 69 6c 65 2c 20 30 29 3b  ->conchFile, 0);
33060 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
33070 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 26 26 20  ITE_CANTOPEN && 
33080 28 28 70 46 69 6c 65 2d 3e 6f 70 65 6e 46 6c 61  ((pFile->openFla
33090 67 73 26 4f 5f 52 44 57 52 29 20 3d 3d 20 30 29  gs&O_RDWR) == 0)
330a0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 69 66 20   ){.      /* if 
330b0 28 61 29 20 74 68 65 20 6f 70 65 6e 20 66 6c 61  (a) the open fla
330c0 67 73 20 61 72 65 20 6e 6f 74 20 4f 5f 52 44 57  gs are not O_RDW
330d0 52 2c 20 28 62 29 20 74 68 65 20 63 6f 6e 63 68  R, (b) the conch
330e0 20 69 73 6e 27 74 20 74 68 65 72 65 2c 20 61 6e   isn't there, an
330f0 64 0a 20 20 20 20 20 20 2a 2a 20 28 63 29 20 74  d.      ** (c) t
33100 68 65 20 66 69 6c 65 20 73 79 73 74 65 6d 20 69  he file system i
33110 73 20 72 65 61 64 2d 6f 6e 6c 79 2c 20 74 68 65  s read-only, the
33120 6e 20 65 6e 61 62 6c 65 20 6e 6f 2d 6c 6f 63 6b  n enable no-lock
33130 69 6e 67 20 61 63 63 65 73 73 2e 0a 20 20 20 20  ing access..    
33140 20 20 2a 2a 20 55 67 68 2c 20 73 69 6e 63 65 20    ** Ugh, since 
33150 4f 5f 52 44 4f 4e 4c 59 3d 3d 30 78 30 30 30 30  O_RDONLY==0x0000
33160 20 77 65 20 74 65 73 74 20 66 6f 72 20 21 4f 5f   we test for !O_
33170 52 44 57 52 20 73 69 6e 63 65 20 75 6e 69 78 4f  RDWR since unixO
33180 70 65 6e 20 61 73 73 65 72 74 73 0a 20 20 20 20  pen asserts.    
33190 20 20 2a 2a 20 74 68 61 74 20 6f 70 65 6e 46 6c    ** that openFl
331a0 61 67 73 20 77 69 6c 6c 20 68 61 76 65 20 6f 6e  ags will have on
331b0 6c 79 20 6f 6e 65 20 6f 66 20 4f 5f 52 44 4f 4e  ly one of O_RDON
331c0 4c 59 20 6f 72 20 4f 5f 52 44 57 52 2e 0a 20 20  LY or O_RDWR..  
331d0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 74 72      */.      str
331e0 75 63 74 20 73 74 61 74 66 73 20 66 73 49 6e 66  uct statfs fsInf
331f0 6f 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  o;.      struct 
33200 73 74 61 74 20 63 6f 6e 63 68 49 6e 66 6f 3b 0a  stat conchInfo;.
33210 20 20 20 20 20 20 69 6e 74 20 67 6f 4c 6f 63 6b        int goLock
33220 6c 65 73 73 20 3d 20 30 3b 0a 0a 20 20 20 20 20  less = 0;..     
33230 20 69 66 28 20 73 74 61 74 28 70 43 74 78 2d 3e   if( stat(pCtx->
33240 63 6f 6e 63 68 46 69 6c 65 50 61 74 68 2c 20 26  conchFilePath, &
33250 63 6f 6e 63 68 49 6e 66 6f 29 20 3d 3d 20 2d 31  conchInfo) == -1
33260 20 29 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74   ) {.        int
33270 20 65 72 72 20 3d 20 65 72 72 6e 6f 3b 0a 20 20   err = errno;.  
33280 20 20 20 20 20 20 69 66 28 20 28 65 72 72 3d 3d        if( (err==
33290 45 4e 4f 45 4e 54 29 20 26 26 20 28 73 74 61 74  ENOENT) && (stat
332a0 66 73 28 64 62 50 61 74 68 2c 20 26 66 73 49 6e  fs(dbPath, &fsIn
332b0 66 6f 29 20 21 3d 20 2d 31 29 20 29 7b 0a 20 20  fo) != -1) ){.  
332c0 20 20 20 20 20 20 20 20 67 6f 4c 6f 63 6b 6c 65          goLockle
332d0 73 73 20 3d 20 28 66 73 49 6e 66 6f 2e 66 5f 66  ss = (fsInfo.f_f
332e0 6c 61 67 73 26 4d 4e 54 5f 52 44 4f 4e 4c 59 29  lags&MNT_RDONLY)
332f0 20 3d 3d 20 4d 4e 54 5f 52 44 4f 4e 4c 59 3b 0a   == MNT_RDONLY;.
33300 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
33310 7d 0a 20 20 20 20 20 20 69 66 28 20 67 6f 4c 6f  }.      if( goLo
33320 63 6b 6c 65 73 73 20 29 7b 0a 20 20 20 20 20 20  ckless ){.      
33330 20 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c    pCtx->conchHel
33340 64 20 3d 20 2d 31 3b 20 2f 2a 20 72 65 61 64 20  d = -1; /* read 
33350 6f 6e 6c 79 20 46 53 2f 20 6c 6f 63 6b 6c 65 73  only FS/ lockles
33360 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20  s */.        rc 
33370 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
33380 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 20     }.    }.  }  
33390 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
333a0 45 5f 4f 4b 20 26 26 20 6c 6f 63 6b 50 61 74 68  E_OK && lockPath
333b0 20 29 7b 0a 20 20 20 20 70 43 74 78 2d 3e 6c 6f   ){.    pCtx->lo
333c0 63 6b 50 72 6f 78 79 50 61 74 68 20 3d 20 73 71  ckProxyPath = sq
333d0 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 30 2c  lite3DbStrDup(0,
333e0 20 6c 6f 63 6b 50 61 74 68 29 3b 0a 20 20 7d 0a   lockPath);.  }.
333f0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
33400 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 43 74 78  E_OK ){.    pCtx
33410 2d 3e 64 62 50 61 74 68 20 3d 20 73 71 6c 69 74  ->dbPath = sqlit
33420 65 33 44 62 53 74 72 44 75 70 28 30 2c 20 64 62  e3DbStrDup(0, db
33430 50 61 74 68 29 3b 0a 20 20 20 20 69 66 28 20 70  Path);.    if( p
33440 43 74 78 2d 3e 64 62 50 61 74 68 3d 3d 4e 55 4c  Ctx->dbPath==NUL
33450 4c 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  L ){.      rc = 
33460 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
33470 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63    }.  }.  if( rc
33480 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
33490 20 20 20 2f 2a 20 61 6c 6c 20 6d 65 6d 6f 72 79     /* all memory
334a0 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 2c 20 70   is allocated, p
334b0 72 6f 78 79 73 20 61 72 65 20 63 72 65 61 74 65  roxys are create
334c0 64 20 61 6e 64 20 61 73 73 69 67 6e 65 64 2c 20  d and assigned, 
334d0 0a 20 20 20 20 2a 2a 20 73 77 69 74 63 68 20 74  .    ** switch t
334e0 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65  he locking conte
334f0 78 74 20 61 6e 64 20 70 4d 65 74 68 6f 64 20 74  xt and pMethod t
33500 68 65 6e 20 72 65 74 75 72 6e 2e 0a 20 20 20 20  hen return..    
33510 2a 2f 0a 20 20 20 20 70 43 74 78 2d 3e 6f 6c 64  */.    pCtx->old
33520 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d  LockingContext =
33530 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43   pFile->lockingC
33540 6f 6e 74 65 78 74 3b 0a 20 20 20 20 70 46 69 6c  ontext;.    pFil
33550 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
33560 74 20 3d 20 70 43 74 78 3b 0a 20 20 20 20 70 43  t = pCtx;.    pC
33570 74 78 2d 3e 70 4f 6c 64 4d 65 74 68 6f 64 20 3d  tx->pOldMethod =
33580 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 3b   pFile->pMethod;
33590 0a 20 20 20 20 70 46 69 6c 65 2d 3e 70 4d 65 74  .    pFile->pMet
335a0 68 6f 64 20 3d 20 26 70 72 6f 78 79 49 6f 4d 65  hod = &proxyIoMe
335b0 74 68 6f 64 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a  thods;.  }else{.
335c0 20 20 20 20 69 66 28 20 70 43 74 78 2d 3e 63 6f      if( pCtx->co
335d0 6e 63 68 46 69 6c 65 20 29 7b 20 0a 20 20 20 20  nchFile ){ .    
335e0 20 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c    pCtx->conchFil
335f0 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 43 6c 6f  e->pMethod->xClo
33600 73 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  se((sqlite3_file
33610 20 2a 29 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69   *)pCtx->conchFi
33620 6c 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  le);.      sqlit
33630 65 33 5f 66 72 65 65 28 70 43 74 78 2d 3e 63 6f  e3_free(pCtx->co
33640 6e 63 68 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a  nchFile);.    }.
33650 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
33660 28 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79  (pCtx->lockProxy
33670 50 61 74 68 29 3b 0a 20 20 20 20 73 71 6c 69 74  Path);.    sqlit
33680 65 33 5f 66 72 65 65 28 70 43 74 78 2d 3e 63 6f  e3_free(pCtx->co
33690 6e 63 68 46 69 6c 65 50 61 74 68 29 3b 20 0a 20  nchFilePath); . 
336a0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
336b0 70 43 74 78 29 3b 0a 20 20 7d 0a 20 20 4f 53 54  pCtx);.  }.  OST
336c0 52 41 43 45 33 28 22 54 52 41 4e 53 50 52 4f 58  RACE3("TRANSPROX
336d0 59 20 20 25 64 20 25 73 5c 6e 22 2c 20 70 46 69  Y  %d %s\n", pFi
336e0 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20  le->h,.         
336f0 20 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b    (rc==SQLITE_OK
33700 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65   ? "ok" : "faile
33710 64 22 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  d"));.  return r
33720 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  c;.}.../*.** Thi
33730 73 20 72 6f 75 74 69 6e 65 20 68 61 6e 64 6c 65  s routine handle
33740 73 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63  s sqlite3_file_c
33750 6f 6e 74 72 6f 6c 28 29 20 63 61 6c 6c 73 20 74  ontrol() calls t
33760 68 61 74 20 61 72 65 20 73 70 65 63 69 66 69 63  hat are specific
33770 0a 2a 2a 20 74 6f 20 70 72 6f 78 79 20 6c 6f 63  .** to proxy loc
33780 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  king..*/.static 
33790 69 6e 74 20 70 72 6f 78 79 46 69 6c 65 43 6f 6e  int proxyFileCon
337a0 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c  trol(sqlite3_fil
337b0 65 20 2a 69 64 2c 20 69 6e 74 20 6f 70 2c 20 76  e *id, int op, v
337c0 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 73 77  oid *pArg){.  sw
337d0 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20  itch( op ){.    
337e0 63 61 73 65 20 53 51 4c 49 54 45 5f 47 45 54 5f  case SQLITE_GET_
337f0 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 3a 20 7b  LOCKPROXYFILE: {
33800 0a 20 20 20 20 20 20 75 6e 69 78 46 69 6c 65 20  .      unixFile 
33810 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
33820 6c 65 2a 29 69 64 3b 0a 20 20 20 20 20 20 69 66  le*)id;.      if
33830 28 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64  ( pFile->pMethod
33840 20 3d 3d 20 26 70 72 6f 78 79 49 6f 4d 65 74 68   == &proxyIoMeth
33850 6f 64 73 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ods ){.        p
33860 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
33870 78 74 20 2a 70 43 74 78 20 3d 20 28 70 72 6f 78  xt *pCtx = (prox
33880 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2a  yLockingContext*
33890 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43  )pFile->lockingC
338a0 6f 6e 74 65 78 74 3b 0a 20 20 20 20 20 20 20 20  ontext;.        
338b0 70 72 6f 78 79 54 61 6b 65 43 6f 6e 63 68 28 70  proxyTakeConch(p
338c0 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 69  File);.        i
338d0 66 28 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f  f( pCtx->lockPro
338e0 78 79 50 61 74 68 20 29 7b 0a 20 20 20 20 20 20  xyPath ){.      
338f0 20 20 20 20 2a 28 63 6f 6e 73 74 20 63 68 61 72      *(const char
33900 20 2a 2a 29 70 41 72 67 20 3d 20 70 43 74 78 2d   **)pArg = pCtx-
33910 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 3b 0a  >lockProxyPath;.
33920 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
33930 20 20 20 20 20 20 20 20 20 2a 28 63 6f 6e 73 74           *(const
33940 20 63 68 61 72 20 2a 2a 29 70 41 72 67 20 3d 20   char **)pArg = 
33950 22 3a 61 75 74 6f 3a 20 28 6e 6f 74 20 68 65 6c  ":auto: (not hel
33960 64 29 22 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  d)";.        }. 
33970 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20       } else {.  
33980 20 20 20 20 20 20 2a 28 63 6f 6e 73 74 20 63 68        *(const ch
33990 61 72 20 2a 2a 29 70 41 72 67 20 3d 20 4e 55 4c  ar **)pArg = NUL
339a0 4c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  L;.      }.     
339b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
339c0 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  K;.    }.    cas
339d0 65 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43  e SQLITE_SET_LOC
339e0 4b 50 52 4f 58 59 46 49 4c 45 3a 20 7b 0a 20 20  KPROXYFILE: {.  
339f0 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46      unixFile *pF
33a00 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
33a10 29 69 64 3b 0a 20 20 20 20 20 20 69 6e 74 20 72  )id;.      int r
33a20 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
33a30 20 20 20 20 20 69 6e 74 20 69 73 50 72 6f 78 79       int isProxy
33a40 53 74 79 6c 65 20 3d 20 28 70 46 69 6c 65 2d 3e  Style = (pFile->
33a50 70 4d 65 74 68 6f 64 20 3d 3d 20 26 70 72 6f 78  pMethod == &prox
33a60 79 49 6f 4d 65 74 68 6f 64 73 29 3b 0a 20 20 20  yIoMethods);.   
33a70 20 20 20 69 66 28 20 70 41 72 67 3d 3d 4e 55 4c     if( pArg==NUL
33a80 4c 20 7c 7c 20 28 63 6f 6e 73 74 20 63 68 61 72  L || (const char
33a90 20 2a 29 70 41 72 67 3d 3d 30 20 29 7b 0a 20 20   *)pArg==0 ){.  
33aa0 20 20 20 20 20 20 69 66 28 20 69 73 50 72 6f 78        if( isProx
33ab0 79 53 74 79 6c 65 20 29 7b 0a 20 20 20 20 20 20  yStyle ){.      
33ac0 20 20 20 20 2f 2a 20 74 75 72 6e 20 6f 66 66 20      /* turn off 
33ad0 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 2d 20  proxy locking - 
33ae0 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 20 2a 2f  not supported */
33af0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
33b00 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 2f 2a 53  SQLITE_ERROR /*S
33b10 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 3f 20  QLITE_PROTOCOL? 
33b20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3f 2a 2f  SQLITE_MISUSE?*/
33b30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
33b40 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74 75  .          /* tu
33b50 72 6e 20 6f 66 66 20 70 72 6f 78 79 20 6c 6f 63  rn off proxy loc
33b60 6b 69 6e 67 20 2d 20 61 6c 72 65 61 64 79 20 6f  king - already o
33b70 66 66 20 2d 20 4e 4f 4f 50 20 2a 2f 0a 20 20 20  ff - NOOP */.   
33b80 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
33b90 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d  TE_OK;.        }
33ba0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
33bb0 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
33bc0 20 2a 70 72 6f 78 79 50 61 74 68 20 3d 20 28 63   *proxyPath = (c
33bd0 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 41 72 67  onst char *)pArg
33be0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 73  ;.        if( is
33bf0 50 72 6f 78 79 53 74 79 6c 65 20 29 7b 0a 20 20  ProxyStyle ){.  
33c00 20 20 20 20 20 20 20 20 70 72 6f 78 79 4c 6f 63          proxyLoc
33c10 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74  kingContext *pCt
33c20 78 20 3d 20 0a 20 20 20 20 20 20 20 20 20 20 20  x = .           
33c30 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f   (proxyLockingCo
33c40 6e 74 65 78 74 2a 29 70 46 69 6c 65 2d 3e 6c 6f  ntext*)pFile->lo
33c50 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20  ckingContext;.  
33c60 20 20 20 20 20 20 20 20 69 66 28 20 21 73 74 72          if( !str
33c70 63 6d 70 28 70 41 72 67 2c 20 22 3a 61 75 74 6f  cmp(pArg, ":auto
33c80 3a 22 29 20 0a 20 20 20 20 20 20 20 20 20 20 20  :") .           
33c90 7c 7c 20 28 70 43 74 78 2d 3e 6c 6f 63 6b 50 72  || (pCtx->lockPr
33ca0 6f 78 79 50 61 74 68 20 26 26 0a 20 20 20 20 20  oxyPath &&.     
33cb0 20 20 20 20 20 20 20 20 20 20 21 73 74 72 6e 63            !strnc
33cc0 6d 70 28 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f  mp(pCtx->lockPro
33cd0 78 79 50 61 74 68 2c 20 70 72 6f 78 79 50 61 74  xyPath, proxyPat
33ce0 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29 29 0a  h, MAXPATHLEN)).
33cf0 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20            ){.   
33d00 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
33d10 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
33d20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
33d30 20 20 20 20 20 20 72 63 20 3d 20 73 77 69 74 63        rc = switc
33d40 68 4c 6f 63 6b 50 72 6f 78 79 50 61 74 68 28 70  hLockProxyPath(p
33d50 46 69 6c 65 2c 20 70 72 6f 78 79 50 61 74 68 29  File, proxyPath)
33d60 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
33d70 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
33d80 20 20 20 20 20 20 20 2f 2a 20 74 75 72 6e 20 6f         /* turn o
33d90 6e 20 70 72 6f 78 79 20 66 69 6c 65 20 6c 6f 63  n proxy file loc
33da0 6b 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 20 20  king */.        
33db0 20 20 72 63 20 3d 20 70 72 6f 78 79 54 72 61 6e    rc = proxyTran
33dc0 73 66 6f 72 6d 55 6e 69 78 46 69 6c 65 28 70 46  sformUnixFile(pF
33dd0 69 6c 65 2c 20 70 72 6f 78 79 50 61 74 68 29 3b  ile, proxyPath);
33de0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
33df0 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
33e00 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65  rc;.    }.    de
33e10 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61  fault: {.      a
33e20 73 73 65 72 74 28 20 30 20 29 3b 20 20 2f 2a 20  ssert( 0 );  /* 
33e30 54 68 65 20 63 61 6c 6c 20 61 73 73 75 72 65 73  The call assures
33e40 20 74 68 61 74 20 6f 6e 6c 79 20 76 61 6c 69 64   that only valid
33e50 20 6f 70 63 6f 64 65 73 20 61 72 65 20 73 65 6e   opcodes are sen
33e60 74 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  t */.    }.  }. 
33e70 20 2f 2a 4e 4f 54 52 45 41 43 48 45 44 2a 2f 0a   /*NOTREACHED*/.
33e80 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
33e90 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ERROR;.}../*.** 
33ea0 57 69 74 68 69 6e 20 74 68 69 73 20 64 69 76 69  Within this divi
33eb0 73 69 6f 6e 20 28 74 68 65 20 70 72 6f 78 79 69  sion (the proxyi
33ec0 6e 67 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c 65  ng locking imple
33ed0 6d 65 6e 74 61 74 69 6f 6e 29 20 74 68 65 20 70  mentation) the p
33ee0 72 6f 63 65 64 75 72 65 73 0a 2a 2a 20 61 62 6f  rocedures.** abo
33ef0 76 65 20 74 68 69 73 20 70 6f 69 6e 74 20 61 72  ve this point ar
33f00 65 20 61 6c 6c 20 75 74 69 6c 69 74 69 65 73 2e  e all utilities.
33f10 20 20 54 68 65 20 6c 6f 63 6b 2d 72 65 6c 61 74    The lock-relat
33f20 65 64 20 6d 65 74 68 6f 64 73 20 6f 66 20 74 68  ed methods of th
33f30 65 0a 2a 2a 20 70 72 6f 78 79 2d 6c 6f 63 6b 69  e.** proxy-locki
33f40 6e 67 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  ng sqlite3_io_me
33f50 74 68 6f 64 20 6f 62 6a 65 63 74 20 66 6f 6c 6c  thod object foll
33f60 6f 77 2e 0a 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 54  ow..*/.../*.** T
33f70 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63  his routine chec
33f80 6b 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61  ks if there is a
33f90 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68   RESERVED lock h
33fa0 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69  eld on the speci
33fb0 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20  fied.** file by 
33fc0 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65  this or any othe
33fd0 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75  r process. If su
33fe0 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c  ch a lock is hel
33ff0 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a  d, set *pResOut.
34000 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f  ** to a non-zero
34010 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65   value otherwise
34020 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65 74   *pResOut is set
34030 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72   to zero.  The r
34040 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69  eturn value.** i
34050 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f  s set to SQLITE_
34060 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f  OK unless an I/O
34070 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75   error occurs du
34080 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69  ring lock checki
34090 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
340a0 74 20 70 72 6f 78 79 43 68 65 63 6b 52 65 73 65  t proxyCheckRese
340b0 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33  rvedLock(sqlite3
340c0 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a  _file *id, int *
340d0 70 52 65 73 4f 75 74 29 20 7b 0a 20 20 75 6e 69  pResOut) {.  uni
340e0 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
340f0 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
34100 69 6e 74 20 72 63 20 3d 20 70 72 6f 78 79 54 61  int rc = proxyTa
34110 6b 65 43 6f 6e 63 68 28 70 46 69 6c 65 29 3b 0a  keConch(pFile);.
34120 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
34130 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 72 6f 78 79  _OK ){.    proxy
34140 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
34150 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63  pCtx = (proxyLoc
34160 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 46  kingContext *)pF
34170 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
34180 65 78 74 3b 0a 20 20 20 20 69 66 28 20 70 43 74  ext;.    if( pCt
34190 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 3e 30 20 29  x->conchHeld>0 )
341a0 7b 0a 20 20 20 20 20 20 75 6e 69 78 46 69 6c 65  {.      unixFile
341b0 20 2a 70 72 6f 78 79 20 3d 20 70 43 74 78 2d 3e   *proxy = pCtx->
341c0 6c 6f 63 6b 50 72 6f 78 79 3b 0a 20 20 20 20 20  lockProxy;.     
341d0 20 72 65 74 75 72 6e 20 70 72 6f 78 79 2d 3e 70   return proxy->p
341e0 4d 65 74 68 6f 64 2d 3e 78 43 68 65 63 6b 52 65  Method->xCheckRe
341f0 73 65 72 76 65 64 4c 6f 63 6b 28 28 73 71 6c 69  servedLock((sqli
34200 74 65 33 5f 66 69 6c 65 2a 29 70 72 6f 78 79 2c  te3_file*)proxy,
34210 20 70 52 65 73 4f 75 74 29 3b 0a 20 20 20 20 7d   pResOut);.    }
34220 65 6c 73 65 7b 20 2f 2a 20 63 6f 6e 63 68 48 65  else{ /* conchHe
34230 6c 64 20 3c 20 30 20 69 73 20 6c 6f 63 6b 6c 65  ld < 0 is lockle
34240 73 73 20 2a 2f 0a 20 20 20 20 20 20 70 52 65 73  ss */.      pRes
34250 4f 75 74 3d 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  Out=0;.    }.  }
34260 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
34270 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20  ./*.** Lock the 
34280 66 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f  file with the lo
34290 63 6b 20 73 70 65 63 69 66 69 65 64 20 62 79 20  ck specified by 
342a0 70 61 72 61 6d 65 74 65 72 20 6c 6f 63 6b 74 79  parameter lockty
342b0 70 65 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74  pe - one.** of t
342c0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a  he following:.**
342d0 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41 52  .**     (1) SHAR
342e0 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  ED_LOCK.**     (
342f0 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  2) RESERVED_LOCK
34300 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44  .**     (3) PEND
34310 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  ING_LOCK.**     
34320 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  (4) EXCLUSIVE_LO
34330 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d  CK.**.** Sometim
34340 65 73 20 77 68 65 6e 20 72 65 71 75 65 73 74 69  es when requesti
34350 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74  ng one lock stat
34360 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f  e, additional lo
34370 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65  ck states.** are
34380 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74   inserted in bet
34390 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69  ween.  The locki
343a0 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e  ng might fail on
343b0 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65   one of the late
343c0 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73  r.** transitions
343d0 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63   leaving the loc
343e0 6b 20 73 74 61 74 65 20 64 69 66 66 65 72 65 6e  k state differen
343f0 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73  t from what it s
34400 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74  tarted but.** st
34410 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73  ill short of its
34420 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c   goal.  The foll
34430 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77  owing chart show
34440 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a  s the allowed.**
34450 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64   transitions and
34460 20 74 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e   the inserted in
34470 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65  termediate state
34480 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f  s:.**.**    UNLO
34490 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a  CKED -> SHARED.*
344a0 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52  *    SHARED -> R
344b0 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48  ESERVED.**    SH
344c0 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47  ARED -> (PENDING
344d0 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  ) -> EXCLUSIVE.*
344e0 2a 20 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e  *    RESERVED ->
344f0 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58   (PENDING) -> EX
34500 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45  CLUSIVE.**    PE
34510 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49  NDING -> EXCLUSI
34520 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  VE.**.** This ro
34530 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20  utine will only 
34540 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e  increase a lock.
34550 20 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65    Use the sqlite
34560 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72  3OsUnlock().** r
34570 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20  outine to lower 
34580 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e  a locking level.
34590 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
345a0 72 6f 78 79 4c 6f 63 6b 28 73 71 6c 69 74 65 33  roxyLock(sqlite3
345b0 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c  _file *id, int l
345c0 6f 63 6b 74 79 70 65 29 20 7b 0a 20 20 75 6e 69  ocktype) {.  uni
345d0 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
345e0 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
345f0 69 6e 74 20 72 63 20 3d 20 70 72 6f 78 79 54 61  int rc = proxyTa
34600 6b 65 43 6f 6e 63 68 28 70 46 69 6c 65 29 3b 0a  keConch(pFile);.
34610 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
34620 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 72 6f 78 79  _OK ){.    proxy
34630 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
34640 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63  pCtx = (proxyLoc
34650 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 46  kingContext *)pF
34660 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
34670 65 78 74 3b 0a 20 20 20 20 69 66 28 20 70 43 74  ext;.    if( pCt
34680 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 3e 30 20 29  x->conchHeld>0 )
34690 7b 0a 20 20 20 20 20 20 75 6e 69 78 46 69 6c 65  {.      unixFile
346a0 20 2a 70 72 6f 78 79 20 3d 20 70 43 74 78 2d 3e   *proxy = pCtx->
346b0 6c 6f 63 6b 50 72 6f 78 79 3b 0a 20 20 20 20 20  lockProxy;.     
346c0 20 72 63 20 3d 20 70 72 6f 78 79 2d 3e 70 4d 65   rc = proxy->pMe
346d0 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28 73 71 6c  thod->xLock((sql
346e0 69 74 65 33 5f 66 69 6c 65 2a 29 70 72 6f 78 79  ite3_file*)proxy
346f0 2c 20 6c 6f 63 6b 74 79 70 65 29 3b 0a 20 20 20  , locktype);.   
34700 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79     pFile->lockty
34710 70 65 20 3d 20 70 72 6f 78 79 2d 3e 6c 6f 63 6b  pe = proxy->lock
34720 74 79 70 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  type;.    }else{
34730 0a 20 20 20 20 20 20 2f 2a 20 63 6f 6e 63 68 48  .      /* conchH
34740 65 6c 64 20 3c 20 30 20 69 73 20 6c 6f 63 6b 6c  eld < 0 is lockl
34750 65 73 73 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d  ess */.    }.  }
34760 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
34770 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68  ../*.** Lower th
34780 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
34790 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  on file descript
347a0 6f 72 20 70 46 69 6c 65 20 74 6f 20 6c 6f 63 6b  or pFile to lock
347b0 74 79 70 65 2e 20 20 6c 6f 63 6b 74 79 70 65 0a  type.  locktype.
347c0 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65  ** must be eithe
347d0 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41  r NO_LOCK or SHA
347e0 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20  RED_LOCK..**.** 
347f0 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  If the locking l
34800 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65  evel of the file
34810 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61   descriptor is a
34820 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c  lready at or bel
34830 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73  ow.** the reques
34840 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  ted locking leve
34850 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  l, this routine 
34860 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
34870 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 55  tatic int proxyU
34880 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  nlock(sqlite3_fi
34890 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b  le *id, int lock
348a0 74 79 70 65 29 20 7b 0a 20 20 75 6e 69 78 46 69  type) {.  unixFi
348b0 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
348c0 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74  xFile*)id;.  int
348d0 20 72 63 20 3d 20 70 72 6f 78 79 54 61 6b 65 43   rc = proxyTakeC
348e0 6f 6e 63 68 28 70 46 69 6c 65 29 3b 0a 20 20 69  onch(pFile);.  i
348f0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
34900 20 29 7b 0a 20 20 20 20 70 72 6f 78 79 4c 6f 63   ){.    proxyLoc
34910 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74  kingContext *pCt
34920 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e  x = (proxyLockin
34930 67 43 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c 65  gContext *)pFile
34940 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
34950 3b 0a 20 20 20 20 69 66 28 20 70 43 74 78 2d 3e  ;.    if( pCtx->
34960 63 6f 6e 63 68 48 65 6c 64 3e 30 20 29 7b 0a 20  conchHeld>0 ){. 
34970 20 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70       unixFile *p
34980 72 6f 78 79 20 3d 20 70 43 74 78 2d 3e 6c 6f 63  roxy = pCtx->loc
34990 6b 50 72 6f 78 79 3b 0a 20 20 20 20 20 20 72 63  kProxy;.      rc
349a0 20 3d 20 70 72 6f 78 79 2d 3e 70 4d 65 74 68 6f   = proxy->pMetho
349b0 64 2d 3e 78 55 6e 6c 6f 63 6b 28 28 73 71 6c 69  d->xUnlock((sqli
349c0 74 65 33 5f 66 69 6c 65 2a 29 70 72 6f 78 79 2c  te3_file*)proxy,
349d0 20 6c 6f 63 6b 74 79 70 65 29 3b 0a 20 20 20 20   locktype);.    
349e0 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70    pFile->locktyp
349f0 65 20 3d 20 70 72 6f 78 79 2d 3e 6c 6f 63 6b 74  e = proxy->lockt
34a00 79 70 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ype;.    }else{.
34a10 20 20 20 20 20 20 2f 2a 20 63 6f 6e 63 68 48 65        /* conchHe
34a20 6c 64 20 3c 20 30 20 69 73 20 6c 6f 63 6b 6c 65  ld < 0 is lockle
34a30 73 73 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a  ss */.    }.  }.
34a40 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
34a50 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69  /*.** Close a fi
34a60 6c 65 20 74 68 61 74 20 75 73 65 73 20 70 72 6f  le that uses pro
34a70 78 79 20 6c 6f 63 6b 73 2e 0a 2a 2f 0a 73 74 61  xy locks..*/.sta
34a80 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43 6c 6f  tic int proxyClo
34a90 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  se(sqlite3_file 
34aa0 2a 69 64 29 20 7b 0a 20 20 69 66 28 20 69 64 20  *id) {.  if( id 
34ab0 29 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20  ){.    unixFile 
34ac0 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
34ad0 6c 65 2a 29 69 64 3b 0a 20 20 20 20 70 72 6f 78  le*)id;.    prox
34ae0 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  yLockingContext 
34af0 2a 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f  *pCtx = (proxyLo
34b00 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70  ckingContext *)p
34b10 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
34b20 74 65 78 74 3b 0a 20 20 20 20 75 6e 69 78 46 69  text;.    unixFi
34b30 6c 65 20 2a 6c 6f 63 6b 50 72 6f 78 79 20 3d 20  le *lockProxy = 
34b40 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 3b  pCtx->lockProxy;
34b50 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 63  .    unixFile *c
34b60 6f 6e 63 68 46 69 6c 65 20 3d 20 70 43 74 78 2d  onchFile = pCtx-
34b70 3e 63 6f 6e 63 68 46 69 6c 65 3b 0a 20 20 20 20  >conchFile;.    
34b80 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
34b90 4f 4b 3b 0a 20 20 20 20 0a 20 20 20 20 69 66 28  OK;.    .    if(
34ba0 20 6c 6f 63 6b 50 72 6f 78 79 20 29 7b 0a 20 20   lockProxy ){.  
34bb0 20 20 20 20 72 63 20 3d 20 6c 6f 63 6b 50 72 6f      rc = lockPro
34bc0 78 79 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 55 6e  xy->pMethod->xUn
34bd0 6c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69  lock((sqlite3_fi
34be0 6c 65 2a 29 6c 6f 63 6b 50 72 6f 78 79 2c 20 4e  le*)lockProxy, N
34bf0 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69  O_LOCK);.      i
34c00 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
34c10 63 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 6f  c;.      rc = lo
34c20 63 6b 50 72 6f 78 79 2d 3e 70 4d 65 74 68 6f 64  ckProxy->pMethod
34c30 2d 3e 78 43 6c 6f 73 65 28 28 73 71 6c 69 74 65  ->xClose((sqlite
34c40 33 5f 66 69 6c 65 2a 29 6c 6f 63 6b 50 72 6f 78  3_file*)lockProx
34c50 79 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  y);.      if( rc
34c60 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
34c70 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
34c80 28 6c 6f 63 6b 50 72 6f 78 79 29 3b 0a 20 20 20  (lockProxy);.   
34c90 20 20 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f     pCtx->lockPro
34ca0 78 79 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  xy = 0;.    }.  
34cb0 20 20 69 66 28 20 63 6f 6e 63 68 46 69 6c 65 20    if( conchFile 
34cc0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43 74  ){.      if( pCt
34cd0 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 20 29 7b 0a  x->conchHeld ){.
34ce0 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 72 6f          rc = pro
34cf0 78 79 52 65 6c 65 61 73 65 43 6f 6e 63 68 28 70  xyReleaseConch(p
34d00 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 69  File);.        i
34d10 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
34d20 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  c;.      }.     
34d30 20 72 63 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d   rc = conchFile-
34d40 3e 70 4d 65 74 68 6f 64 2d 3e 78 43 6c 6f 73 65  >pMethod->xClose
34d50 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29  ((sqlite3_file*)
34d60 63 6f 6e 63 68 46 69 6c 65 29 3b 0a 20 20 20 20  conchFile);.    
34d70 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
34d80 6e 20 72 63 3b 0a 20 20 20 20 20 20 73 71 6c 69  n rc;.      sqli
34d90 74 65 33 5f 66 72 65 65 28 63 6f 6e 63 68 46 69  te3_free(conchFi
34da0 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  le);.    }.    s
34db0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 74 78  qlite3_free(pCtx
34dc0 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 29  ->lockProxyPath)
34dd0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
34de0 65 65 28 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69  ee(pCtx->conchFi
34df0 6c 65 50 61 74 68 29 3b 0a 20 20 20 20 73 71 6c  lePath);.    sql
34e00 69 74 65 33 5f 66 72 65 65 28 70 43 74 78 2d 3e  ite3_free(pCtx->
34e10 64 62 50 61 74 68 29 3b 0a 20 20 20 20 2f 2a 20  dbPath);.    /* 
34e20 72 65 73 74 6f 72 65 20 74 68 65 20 6f 72 69 67  restore the orig
34e30 69 6e 61 6c 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e  inal locking con
34e40 74 65 78 74 20 61 6e 64 20 70 4d 65 74 68 6f 64  text and pMethod
34e50 20 74 68 65 6e 20 63 6c 6f 73 65 20 69 74 20 2a   then close it *
34e60 2f 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63  /.    pFile->loc
34e70 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20 70 43  kingContext = pC
34e80 74 78 2d 3e 6f 6c 64 4c 6f 63 6b 69 6e 67 43 6f  tx->oldLockingCo
34e90 6e 74 65 78 74 3b 0a 20 20 20 20 70 46 69 6c 65  ntext;.    pFile
34ea0 2d 3e 70 4d 65 74 68 6f 64 20 3d 20 70 43 74 78  ->pMethod = pCtx
34eb0 2d 3e 70 4f 6c 64 4d 65 74 68 6f 64 3b 0a 20 20  ->pOldMethod;.  
34ec0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
34ed0 43 74 78 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  Ctx);.    return
34ee0 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d   pFile->pMethod-
34ef0 3e 78 43 6c 6f 73 65 28 69 64 29 3b 0a 20 20 7d  >xClose(id);.  }
34f00 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
34f10 5f 4f 4b 3b 0a 7d 0a 0a 0a 0a 23 65 6e 64 69 66  _OK;.}....#endif
34f20 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41 50   /* defined(__AP
34f30 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45  PLE__) && SQLITE
34f40 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
34f50 53 54 59 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a 20 54  STYLE */./*.** T
34f60 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67  he proxy locking
34f70 20 73 74 79 6c 65 20 69 73 20 69 6e 74 65 6e 64   style is intend
34f80 65 64 20 66 6f 72 20 75 73 65 20 77 69 74 68 20  ed for use with 
34f90 41 46 50 20 66 69 6c 65 73 79 73 74 65 6d 73 2e  AFP filesystems.
34fa0 0a 2a 2a 20 41 6e 64 20 73 69 6e 63 65 20 41 46  .** And since AF
34fb0 50 20 69 73 20 6f 6e 6c 79 20 73 75 70 70 6f 72  P is only suppor
34fc0 74 65 64 20 6f 6e 20 4d 61 63 4f 53 58 2c 20 74  ted on MacOSX, t
34fd0 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67  he proxy locking
34fe0 20 69 73 20 61 6c 73 6f 0a 2a 2a 20 72 65 73 74   is also.** rest
34ff0 72 69 63 74 65 64 20 74 6f 20 4d 61 63 4f 53 58  ricted to MacOSX
35000 2e 0a 2a 2a 20 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ..** .**.*******
35010 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64  ************ End
35020 20 6f 66 20 74 68 65 20 70 72 6f 78 79 20 6c 6f   of the proxy lo
35030 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ck implementatio
35040 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  n **************
35050 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
35060 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
35070 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
35080 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
35090 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
350a0 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  *******/../*.** 
350b0 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6f  Initialize the o
350c0 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
350d0 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2a 0a 2a 2a  interface..**.**
350e0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
350f0 67 69 73 74 65 72 73 20 61 6c 6c 20 56 46 53 20  gisters all VFS 
35100 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20  implementations 
35110 66 6f 72 20 75 6e 69 78 2d 6c 69 6b 65 20 6f 70  for unix-like op
35120 65 72 61 74 69 6e 67 0a 2a 2a 20 73 79 73 74 65  erating.** syste
35130 6d 73 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ms.  This routin
35140 65 2c 20 61 6e 64 20 74 68 65 20 73 71 6c 69 74  e, and the sqlit
35150 65 33 5f 6f 73 5f 65 6e 64 28 29 20 72 6f 75 74  e3_os_end() rout
35160 69 6e 65 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73  ine that follows
35170 2c 0a 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20 74  ,.** should be t
35180 68 65 20 6f 6e 6c 79 20 72 6f 75 74 69 6e 65 73  he only routines
35190 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 74 68   in this file th
351a0 61 74 20 61 72 65 20 76 69 73 69 62 6c 65 20 66  at are visible f
351b0 72 6f 6d 20 6f 74 68 65 72 0a 2a 2a 20 66 69 6c  rom other.** fil
351c0 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  es..**.** This r
351d0 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
351e0 20 6f 6e 63 65 20 64 75 72 69 6e 67 20 53 51 4c   once during SQL
351f0 69 74 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  ite initializati
35200 6f 6e 20 61 6e 64 20 62 79 20 61 0a 2a 2a 20 73  on and by a.** s
35210 69 6e 67 6c 65 20 74 68 72 65 61 64 2e 20 20 54  ingle thread.  T
35220 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  he memory alloca
35230 74 69 6f 6e 20 61 6e 64 20 6d 75 74 65 78 20 73  tion and mutex s
35240 75 62 73 79 73 74 65 6d 73 20 68 61 76 65 20 6e  ubsystems have n
35250 6f 74 0a 2a 2a 20 6e 65 63 65 73 73 61 72 69 6c  ot.** necessaril
35260 79 20 62 65 65 6e 20 69 6e 69 74 69 61 6c 69 7a  y been initializ
35270 65 64 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  ed when this rou
35280 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20  tine is called, 
35290 61 6e 64 20 73 6f 20 74 68 65 79 0a 2a 2a 20 73  and so they.** s
352a0 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 75 73 65  hould not be use
352b0 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
352c0 33 5f 6f 73 5f 69 6e 69 74 28 76 6f 69 64 29 7b  3_os_init(void){
352d0 20 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 54 68 65   .  /* .  ** The
352e0 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f   following macro
352f0 20 64 65 66 69 6e 65 73 20 61 6e 20 69 6e 69 74   defines an init
35300 69 61 6c 69 7a 65 72 20 66 6f 72 20 61 6e 20 73  ializer for an s
35310 71 6c 69 74 65 33 5f 76 66 73 20 6f 62 6a 65 63  qlite3_vfs objec
35320 74 2e 0a 20 20 2a 2a 20 54 68 65 20 6e 61 6d 65  t..  ** The name
35330 20 6f 66 20 74 68 65 20 56 46 53 20 69 73 20 4e   of the VFS is N
35340 41 4d 45 2e 20 20 54 68 65 20 70 41 70 70 44 61  AME.  The pAppDa
35350 74 61 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  ta is a pointer 
35360 74 6f 20 61 20 70 6f 69 6e 74 65 72 0a 20 20 2a  to a pointer.  *
35370 2a 20 74 6f 20 74 68 65 20 22 66 69 6e 64 65 72  * to the "finder
35380 22 20 66 75 6e 63 74 69 6f 6e 2e 20 20 28 70 41  " function.  (pA
35390 70 70 44 61 74 61 20 69 73 20 61 20 70 6f 69 6e  ppData is a poin
353a0 74 65 72 20 74 6f 20 61 20 70 6f 69 6e 74 65 72  ter to a pointer
353b0 20 62 65 63 61 75 73 65 0a 20 20 2a 2a 20 73 69   because.  ** si
353c0 6c 6c 79 20 43 39 30 20 72 75 6c 65 73 20 70 72  lly C90 rules pr
353d0 6f 68 69 62 69 74 20 61 20 76 6f 69 64 2a 20 66  ohibit a void* f
353e0 72 6f 6d 20 62 65 69 6e 67 20 63 61 73 74 20 74  rom being cast t
353f0 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69  o a function poi
35400 6e 74 65 72 0a 20 20 2a 2a 20 61 6e 64 20 73 6f  nter.  ** and so
35410 20 77 65 20 68 61 76 65 20 74 6f 20 67 6f 20 74   we have to go t
35420 68 72 6f 75 67 68 20 74 68 65 20 69 6e 74 65 72  hrough the inter
35430 6d 65 64 69 61 74 65 20 70 6f 69 6e 74 65 72 20  mediate pointer 
35440 74 6f 20 61 76 6f 69 64 20 70 72 6f 62 6c 65 6d  to avoid problem
35450 73 0a 20 20 2a 2a 20 77 68 65 6e 20 63 6f 6d 70  s.  ** when comp
35460 69 6c 69 6e 67 20 77 69 74 68 20 2d 70 65 64 61  iling with -peda
35470 6e 74 69 63 2d 65 72 72 6f 72 73 20 6f 6e 20 47  ntic-errors on G
35480 43 43 2e 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  CC.).  **.  ** T
35490 68 65 20 46 49 4e 44 45 52 20 70 61 72 61 6d 65  he FINDER parame
354a0 74 65 72 20 74 6f 20 74 68 69 73 20 6d 61 63 72  ter to this macr
354b0 6f 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  o is the name of
354c0 20 74 68 65 20 70 6f 69 6e 74 65 72 20 74 6f 20   the pointer to 
354d0 74 68 65 0a 20 20 2a 2a 20 66 69 6e 64 65 72 2d  the.  ** finder-
354e0 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 66  function.  The f
354f0 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 72  inder-function r
35500 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72  eturns a pointer
35510 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c   to the.  ** sql
35520 69 74 65 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f  ite_io_methods o
35530 62 6a 65 63 74 20 74 68 61 74 20 69 6d 70 6c 65  bject that imple
35540 6d 65 6e 74 73 20 74 68 65 20 64 65 73 69 72 65  ments the desire
35550 64 20 6c 6f 63 6b 69 6e 67 0a 20 20 2a 2a 20 62  d locking.  ** b
35560 65 68 61 76 69 6f 72 73 2e 20 20 53 65 65 20 74  ehaviors.  See t
35570 68 65 20 64 69 76 69 73 69 6f 6e 20 61 62 6f 76  he division abov
35580 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  e that contains 
35590 74 68 65 20 49 4f 4d 45 54 48 4f 44 53 0a 20 20  the IOMETHODS.  
355a0 2a 2a 20 6d 61 63 72 6f 20 66 6f 72 20 61 64 64  ** macro for add
355b0 69 74 69 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f  ition informatio
355c0 6e 20 6f 6e 20 66 69 6e 64 65 72 2d 66 75 6e 63  n on finder-func
355d0 74 69 6f 6e 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  tions..  **.  **
355e0 20 4d 6f 73 74 20 66 69 6e 64 65 72 73 20 73 69   Most finders si
355f0 6d 70 6c 79 20 72 65 74 75 72 6e 20 61 20 70 6f  mply return a po
35600 69 6e 74 65 72 20 74 6f 20 61 20 66 69 78 65 64  inter to a fixed
35610 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
35620 6f 64 73 0a 20 20 2a 2a 20 6f 62 6a 65 63 74 2e  ods.  ** object.
35630 20 20 42 75 74 20 74 68 65 20 22 61 75 74 6f 6c    But the "autol
35640 6f 63 6b 49 6f 46 69 6e 64 65 72 22 20 61 76 61  ockIoFinder" ava
35650 69 6c 61 62 6c 65 20 6f 6e 20 4d 61 63 4f 53 58  ilable on MacOSX
35660 20 64 6f 65 73 20 61 20 6c 69 74 74 6c 65 0a 20   does a little. 
35670 20 2a 2a 20 6d 6f 72 65 20 74 68 61 6e 20 74 68   ** more than th
35680 61 74 3b 20 69 74 20 6c 6f 6f 6b 73 20 61 74 20  at; it looks at 
35690 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d 20 74  the filesystem t
356a0 79 70 65 20 74 68 61 74 20 68 6f 73 74 73 20 74  ype that hosts t
356b0 68 65 20 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  he .  ** databas
356c0 65 20 66 69 6c 65 20 61 6e 64 20 74 72 69 65 73  e file and tries
356d0 20 74 6f 20 63 68 6f 6f 73 65 20 61 6e 20 6c 6f   to choose an lo
356e0 63 6b 69 6e 67 20 6d 65 74 68 6f 64 20 61 70 70  cking method app
356f0 72 6f 70 72 69 61 74 65 20 66 6f 72 0a 20 20 2a  ropriate for.  *
35700 2a 20 74 68 61 74 20 66 69 6c 65 73 79 73 74 65  * that filesyste
35710 6d 20 74 69 6d 65 2e 0a 20 20 2a 2f 0a 20 20 23  m time..  */.  #
35720 64 65 66 69 6e 65 20 55 4e 49 58 56 46 53 28 56  define UNIXVFS(V
35730 46 53 4e 41 4d 45 2c 20 46 49 4e 44 45 52 29 20  FSNAME, FINDER) 
35740 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {               
35750 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 32           \.    2
35760 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
35770 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e       /* iVersion
35780 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
35790 20 20 20 20 20 20 20 5c 0a 20 20 20 20 73 69 7a         \.    siz
357a0 65 6f 66 28 75 6e 69 78 46 69 6c 65 29 2c 20 20  eof(unixFile),  
357b0 20 20 20 2f 2a 20 73 7a 4f 73 46 69 6c 65 20 2a     /* szOsFile *
357c0 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
357d0 20 20 20 20 20 5c 0a 20 20 20 20 4d 41 58 5f 50       \.    MAX_P
357e0 41 54 48 4e 41 4d 45 2c 20 20 20 20 20 20 20 20  ATHNAME,        
357f0 20 2f 2a 20 6d 78 50 61 74 68 6e 61 6d 65 20 2a   /* mxPathname *
35800 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
35810 20 20 20 5c 0a 20 20 20 20 30 2c 20 20 20 20 20     \.    0,     
35820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
35830 2a 20 70 4e 65 78 74 20 2a 2f 20 20 20 20 20 20  * pNext */      
35840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35850 20 5c 0a 20 20 20 20 56 46 53 4e 41 4d 45 2c 20   \.    VFSNAME, 
35860 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
35870 7a 4e 61 6d 65 20 2a 2f 20 20 20 20 20 20 20 20  zName */        
35880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
35890 0a 20 20 20 20 28 76 6f 69 64 2a 29 26 46 49 4e  .    (void*)&FIN
358a0 44 45 52 2c 20 20 20 20 20 20 20 2f 2a 20 70 41  DER,       /* pA
358b0 70 70 44 61 74 61 20 2a 2f 20 20 20 20 20 20 20  ppData */       
358c0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
358d0 20 20 20 75 6e 69 78 4f 70 65 6e 2c 20 20 20 20     unixOpen,    
358e0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4f 70 65           /* xOpe
358f0 6e 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  n */            
35900 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
35910 20 75 6e 69 78 44 65 6c 65 74 65 2c 20 20 20 20   unixDelete,    
35920 20 20 20 20 20 20 20 2f 2a 20 78 44 65 6c 65 74         /* xDelet
35930 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  e */            
35940 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75           \.    u
35950 6e 69 78 41 63 63 65 73 73 2c 20 20 20 20 20 20  nixAccess,      
35960 20 20 20 20 20 2f 2a 20 78 41 63 63 65 73 73 20       /* xAccess 
35970 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
35980 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69         \.    uni
35990 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 20  xFullPathname,  
359a0 20 20 20 2f 2a 20 78 46 75 6c 6c 50 61 74 68 6e     /* xFullPathn
359b0 61 6d 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ame */          
359c0 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 44       \.    unixD
359d0 6c 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20  lOpen,          
359e0 20 2f 2a 20 78 44 6c 4f 70 65 6e 20 2a 2f 20 20   /* xDlOpen */  
359f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35a00 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 44 6c 45     \.    unixDlE
35a10 72 72 6f 72 2c 20 20 20 20 20 20 20 20 20 20 2f  rror,          /
35a20 2a 20 78 44 6c 45 72 72 6f 72 20 2a 2f 20 20 20  * xDlError */   
35a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35a40 20 5c 0a 20 20 20 20 75 6e 69 78 44 6c 53 79 6d   \.    unixDlSym
35a50 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
35a60 78 44 6c 53 79 6d 20 2a 2f 20 20 20 20 20 20 20  xDlSym */       
35a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
35a80 0a 20 20 20 20 75 6e 69 78 44 6c 43 6c 6f 73 65  .    unixDlClose
35a90 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44  ,          /* xD
35aa0 6c 43 6c 6f 73 65 20 2a 2f 20 20 20 20 20 20 20  lClose */       
35ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
35ac0 20 20 20 75 6e 69 78 52 61 6e 64 6f 6d 6e 65 73     unixRandomnes
35ad0 73 2c 20 20 20 20 20 20 20 2f 2a 20 78 52 61 6e  s,       /* xRan
35ae0 64 6f 6d 6e 65 73 73 20 2a 2f 20 20 20 20 20 20  domness */      
35af0 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
35b00 20 75 6e 69 78 53 6c 65 65 70 2c 20 20 20 20 20   unixSleep,     
35b10 20 20 20 20 20 20 20 2f 2a 20 78 53 6c 65 65 70         /* xSleep
35b20 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
35b30 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75           \.    u
35b40 6e 69 78 43 75 72 72 65 6e 74 54 69 6d 65 2c 20  nixCurrentTime, 
35b50 20 20 20 20 20 2f 2a 20 78 43 75 72 72 65 6e 74       /* xCurrent
35b60 54 69 6d 65 20 2a 2f 20 20 20 20 20 20 20 20 20  Time */         
35b70 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69         \.    uni
35b80 78 47 65 74 4c 61 73 74 45 72 72 6f 72 2c 20 20  xGetLastError,  
35b90 20 20 20 2f 2a 20 78 47 65 74 4c 61 73 74 45 72     /* xGetLastEr
35ba0 72 6f 72 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ror */          
35bb0 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 53       \.    unixS
35bc0 68 6d 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20  hmOpen,         
35bd0 20 2f 2a 20 78 53 68 6d 4f 70 65 6e 20 2a 2f 20   /* xShmOpen */ 
35be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35bf0 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 53 68 6d     \.    unixShm
35c00 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 2f  Size,          /
35c10 2a 20 78 53 68 6d 53 69 7a 65 20 2a 2f 20 20 20  * xShmSize */   
35c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35c30 20 5c 0a 20 20 20 20 75 6e 69 78 53 68 6d 47 65   \.    unixShmGe
35c40 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t,           /* 
35c50 78 53 68 6d 47 65 74 20 2a 2f 20 20 20 20 20 20  xShmGet */      
35c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
35c70 0a 20 20 20 20 75 6e 69 78 53 68 6d 52 65 6c 65  .    unixShmRele
35c80 61 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 78 53  ase,       /* xS
35c90 68 6d 52 65 6c 65 61 73 65 20 2a 2f 20 20 20 20  hmRelease */    
35ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
35cb0 20 20 20 75 6e 69 78 53 68 6d 4c 6f 63 6b 2c 20     unixShmLock, 
35cc0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d           /* xShm
35cd0 4c 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20 20 20  Lock */         
35ce0 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
35cf0 20 75 6e 69 78 53 68 6d 43 6c 6f 73 65 2c 20 20   unixShmClose,  
35d00 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 43 6c         /* xShmCl
35d10 6f 73 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ose */          
35d20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 30           \.    0
35d30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
35d40 20 20 20 20 20 2f 2a 20 78 52 65 6e 61 6d 65 20       /* xRename 
35d50 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
35d60 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69         \.    uni
35d70 78 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36  xCurrentTimeInt6
35d80 34 2c 20 2f 2a 20 78 43 75 72 72 65 6e 74 54 69  4, /* xCurrentTi
35d90 6d 65 49 6e 74 36 34 20 2a 2f 20 20 20 20 20 20  meInt64 */      
35da0 20 20 20 20 20 5c 0a 20 20 7d 0a 0a 20 20 2f 2a       \.  }..  /*
35db0 0a 20 20 2a 2a 20 41 6c 6c 20 64 65 66 61 75 6c  .  ** All defaul
35dc0 74 20 56 46 53 65 73 20 66 6f 72 20 75 6e 69 78  t VFSes for unix
35dd0 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 69   are contained i
35de0 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  n the following 
35df0 61 72 72 61 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  array..  **.  **
35e00 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 73   Note that the s
35e10 71 6c 69 74 65 33 5f 76 66 73 2e 70 4e 65 78 74  qlite3_vfs.pNext
35e20 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 56 46   field of the VF
35e30 53 20 6f 62 6a 65 63 74 20 69 73 20 6d 6f 64 69  S object is modi
35e40 66 69 65 64 0a 20 20 2a 2a 20 62 79 20 74 68 65  fied.  ** by the
35e50 20 53 51 4c 69 74 65 20 63 6f 72 65 20 77 68 65   SQLite core whe
35e60 6e 20 74 68 65 20 56 46 53 20 69 73 20 72 65 67  n the VFS is reg
35e70 69 73 74 65 72 65 64 2e 20 20 53 6f 20 74 68 65  istered.  So the
35e80 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 2a 2a 20   following.  ** 
35e90 61 72 72 61 79 20 63 61 6e 6e 6f 74 20 62 65 20  array cannot be 
35ea0 63 6f 6e 73 74 2e 0a 20 20 2a 2f 0a 20 20 73 74  const..  */.  st
35eb0 61 74 69 63 20 73 71 6c 69 74 65 33 5f 76 66 73  atic sqlite3_vfs
35ec0 20 61 56 66 73 5b 5d 20 3d 20 7b 0a 23 69 66 20   aVfs[] = {.#if 
35ed0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
35ee0 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 28  CKING_STYLE && (
35ef0 4f 53 5f 56 58 57 4f 52 4b 53 20 7c 7c 20 64 65  OS_VXWORKS || de
35f00 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
35f10 29 0a 20 20 20 20 55 4e 49 58 56 46 53 28 22 75  ).    UNIXVFS("u
35f20 6e 69 78 22 2c 20 20 20 20 20 20 20 20 20 20 61  nix",          a
35f30 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 20  utolockIoFinder 
35f40 29 2c 0a 23 65 6c 73 65 0a 20 20 20 20 55 4e 49  ),.#else.    UNI
35f50 58 56 46 53 28 22 75 6e 69 78 22 2c 20 20 20 20  XVFS("unix",    
35f60 20 20 20 20 20 20 70 6f 73 69 78 49 6f 46 69 6e        posixIoFin
35f70 64 65 72 20 29 2c 0a 23 65 6e 64 69 66 0a 20 20  der ),.#endif.  
35f80 20 20 55 4e 49 58 56 46 53 28 22 75 6e 69 78 2d    UNIXVFS("unix-
35f90 6e 6f 6e 65 22 2c 20 20 20 20 20 6e 6f 6c 6f 63  none",     noloc
35fa0 6b 49 6f 46 69 6e 64 65 72 20 29 2c 0a 20 20 20  kIoFinder ),.   
35fb0 20 55 4e 49 58 56 46 53 28 22 75 6e 69 78 2d 64   UNIXVFS("unix-d
35fc0 6f 74 66 69 6c 65 22 2c 20 20 64 6f 74 6c 6f 63  otfile",  dotloc
35fd0 6b 49 6f 46 69 6e 64 65 72 20 29 2c 0a 23 69 66  kIoFinder ),.#if
35fe0 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 20 20   OS_VXWORKS.    
35ff0 55 4e 49 58 56 46 53 28 22 75 6e 69 78 2d 6e 61  UNIXVFS("unix-na
36000 6d 65 64 73 65 6d 22 2c 20 73 65 6d 49 6f 46 69  medsem", semIoFi
36010 6e 64 65 72 20 29 2c 0a 23 65 6e 64 69 66 0a 23  nder ),.#endif.#
36020 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
36030 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20  _LOCKING_STYLE. 
36040 20 20 20 55 4e 49 58 56 46 53 28 22 75 6e 69 78     UNIXVFS("unix
36050 2d 70 6f 73 69 78 22 2c 20 20 20 20 70 6f 73 69  -posix",    posi
36060 78 49 6f 46 69 6e 64 65 72 20 29 2c 0a 23 69 66  xIoFinder ),.#if
36070 20 21 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 20   !OS_VXWORKS.   
36080 20 55 4e 49 58 56 46 53 28 22 75 6e 69 78 2d 66   UNIXVFS("unix-f
36090 6c 6f 63 6b 22 2c 20 20 20 20 66 6c 6f 63 6b 49  lock",    flockI
360a0 6f 46 69 6e 64 65 72 20 29 2c 0a 23 65 6e 64 69  oFinder ),.#endi
360b0 66 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  f.#endif.#if SQL
360c0 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
360d0 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69  NG_STYLE && defi
360e0 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20  ned(__APPLE__). 
360f0 20 20 20 55 4e 49 58 56 46 53 28 22 75 6e 69 78     UNIXVFS("unix
36100 2d 61 66 70 22 2c 20 20 20 20 20 20 61 66 70 49  -afp",      afpI
36110 6f 46 69 6e 64 65 72 20 29 2c 0a 20 20 20 20 55  oFinder ),.    U
36120 4e 49 58 56 46 53 28 22 75 6e 69 78 2d 6e 66 73  NIXVFS("unix-nfs
36130 22 2c 20 20 20 20 20 20 6e 66 73 49 6f 46 69 6e  ",      nfsIoFin
36140 64 65 72 20 29 2c 0a 20 20 20 20 55 4e 49 58 56  der ),.    UNIXV
36150 46 53 28 22 75 6e 69 78 2d 70 72 6f 78 79 22 2c  FS("unix-proxy",
36160 20 20 20 20 70 72 6f 78 79 49 6f 46 69 6e 64 65      proxyIoFinde
36170 72 20 29 2c 0a 23 65 6e 64 69 66 0a 20 20 7d 3b  r ),.#endif.  };
36180 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  .  unsigned int 
36190 69 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  i;          /* L
361a0 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a  oop counter */..
361b0 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 61 6c    /* Register al
361c0 6c 20 56 46 53 65 73 20 64 65 66 69 6e 65 64 20  l VFSes defined 
361d0 69 6e 20 74 68 65 20 61 56 66 73 5b 5d 20 61 72  in the aVfs[] ar
361e0 72 61 79 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ray */.  for(i=0
361f0 3b 20 69 3c 28 73 69 7a 65 6f 66 28 61 56 66 73  ; i<(sizeof(aVfs
36200 29 2f 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33  )/sizeof(sqlite3
36210 5f 76 66 73 29 29 3b 20 69 2b 2b 29 7b 0a 20 20  _vfs)); i++){.  
36220 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65    sqlite3_vfs_re
36230 67 69 73 74 65 72 28 26 61 56 66 73 5b 69 5d 2c  gister(&aVfs[i],
36240 20 69 3d 3d 30 29 3b 0a 20 20 7d 0a 20 20 72 65   i==0);.  }.  re
36250 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  turn SQLITE_OK; 
36260 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68 75 74 64 6f  .}../*.** Shutdo
36270 77 6e 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67  wn the operating
36280 20 73 79 73 74 65 6d 20 69 6e 74 65 72 66 61 63   system interfac
36290 65 2e 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 20 6f 70  e..**.** Some op
362a0 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 73 20  erating systems 
362b0 6d 69 67 68 74 20 6e 65 65 64 20 74 6f 20 64 6f  might need to do
362c0 20 73 6f 6d 65 20 63 6c 65 61 6e 75 70 20 69 6e   some cleanup in
362d0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 0a 2a   this routine,.*
362e0 2a 20 74 6f 20 72 65 6c 65 61 73 65 20 64 79 6e  * to release dyn
362f0 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74  amically allocat
36300 65 64 20 6f 62 6a 65 63 74 73 2e 20 20 42 75 74  ed objects.  But
36310 20 6e 6f 74 20 6f 6e 20 75 6e 69 78 2e 0a 2a 2a   not on unix..**
36320 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
36330 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 75 6e 69   a no-op for uni
36340 78 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  x..*/.int sqlite
36350 33 5f 6f 73 5f 65 6e 64 28 76 6f 69 64 29 7b 20  3_os_end(void){ 
36360 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
36370 5f 4f 4b 3b 20 0a 7d 0a 20 0a 23 65 6e 64 69 66  _OK; .}. .#endif
36380 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 53 5f 55 4e   /* SQLITE_OS_UN
36390 49 58 20 2a 2f 0a                                IX */.