/ Hex Artifact Content
Login

Artifact 5369272992c14dd198c02ddfc2fd7a1516906c40:


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 0a 23 69 66 20 53 51 4c 49 54  no.h>..#if SQLIT
1140: 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
1150: 5f 53 54 59 4c 45 0a 23 20 69 6e 63 6c 75 64 65  _STYLE.# include
1160: 20 3c 73 79 73 2f 69 6f 63 74 6c 2e 68 3e 0a 23   <sys/ioctl.h>.#
1170: 20 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 23   if OS_VXWORKS.#
1180: 20 20 69 6e 63 6c 75 64 65 20 3c 73 65 6d 61 70    include <semap
1190: 68 6f 72 65 2e 68 3e 0a 23 20 20 69 6e 63 6c 75  hore.h>.#  inclu
11a0: 64 65 20 3c 6c 69 6d 69 74 73 2e 68 3e 0a 23 20  de <limits.h>.# 
11b0: 65 6c 73 65 0a 23 20 20 69 6e 63 6c 75 64 65 20  else.#  include 
11c0: 3c 73 79 73 2f 66 69 6c 65 2e 68 3e 0a 23 20 20  <sys/file.h>.#  
11d0: 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 70 61 72  include <sys/par
11e0: 61 6d 2e 68 3e 0a 23 20 20 69 6e 63 6c 75 64 65  am.h>.#  include
11f0: 20 3c 73 79 73 2f 6d 6f 75 6e 74 2e 68 3e 0a 23   <sys/mount.h>.#
1200: 20 65 6e 64 69 66 0a 23 65 6e 64 69 66 20 2f 2a   endif.#endif /*
1210: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
1220: 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a  OCKING_STYLE */.
1230: 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65 20 61 72 65  ./*.** If we are
1240: 20 74 6f 20 62 65 20 74 68 72 65 61 64 2d 73 61   to be thread-sa
1250: 66 65 2c 20 69 6e 63 6c 75 64 65 20 74 68 65 20  fe, include the 
1260: 70 74 68 72 65 61 64 73 20 68 65 61 64 65 72 20  pthreads header 
1270: 61 6e 64 20 64 65 66 69 6e 65 0a 2a 2a 20 74 68  and define.** th
1280: 65 20 53 51 4c 49 54 45 5f 55 4e 49 58 5f 54 48  e SQLITE_UNIX_TH
1290: 52 45 41 44 53 20 6d 61 63 72 6f 2e 0a 2a 2f 0a  READS macro..*/.
12a0: 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41  #if SQLITE_THREA
12b0: 44 53 41 46 45 0a 23 20 69 6e 63 6c 75 64 65 20  DSAFE.# include 
12c0: 3c 70 74 68 72 65 61 64 2e 68 3e 0a 23 20 64 65  <pthread.h>.# de
12d0: 66 69 6e 65 20 53 51 4c 49 54 45 5f 55 4e 49 58  fine SQLITE_UNIX
12e0: 5f 54 48 52 45 41 44 53 20 31 0a 23 65 6e 64 69  _THREADS 1.#endi
12f0: 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 61 75 6c 74  f../*.** Default
1300: 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 77 68 65   permissions whe
1310: 6e 20 63 72 65 61 74 69 6e 67 20 61 20 6e 65 77  n creating a new
1320: 20 66 69 6c 65 0a 2a 2f 0a 23 69 66 6e 64 65 66   file.*/.#ifndef
1330: 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
1340: 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53  FILE_PERMISSIONS
1350: 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45  .# define SQLITE
1360: 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45  _DEFAULT_FILE_PE
1370: 52 4d 49 53 53 49 4f 4e 53 20 30 36 34 34 0a 23  RMISSIONS 0644.#
1380: 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 2a 20 44 65  endif../*. ** De
1390: 66 61 75 6c 74 20 70 65 72 6d 69 73 73 69 6f 6e  fault permission
13a0: 73 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20  s when creating 
13b0: 61 75 74 6f 20 70 72 6f 78 79 20 64 69 72 0a 20  auto proxy dir. 
13c0: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
13d0: 45 5f 44 45 46 41 55 4c 54 5f 50 52 4f 58 59 44  E_DEFAULT_PROXYD
13e0: 49 52 5f 50 45 52 4d 49 53 53 49 4f 4e 53 0a 23  IR_PERMISSIONS.#
13f0: 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 44   define SQLITE_D
1400: 45 46 41 55 4c 54 5f 50 52 4f 58 59 44 49 52 5f  EFAULT_PROXYDIR_
1410: 50 45 52 4d 49 53 53 49 4f 4e 53 20 30 37 35 35  PERMISSIONS 0755
1420: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d  .#endif../*.** M
1430: 61 78 69 6d 75 6d 20 73 75 70 70 6f 72 74 65 64  aximum supported
1440: 20 70 61 74 68 2d 6c 65 6e 67 74 68 2e 0a 2a 2f   path-length..*/
1450: 0a 23 64 65 66 69 6e 65 20 4d 41 58 5f 50 41 54  .#define MAX_PAT
1460: 48 4e 41 4d 45 20 35 31 32 0a 0a 2f 2a 0a 2a 2a  HNAME 512../*.**
1470: 20 4f 6e 6c 79 20 73 65 74 20 74 68 65 20 6c 61   Only set the la
1480: 73 74 45 72 72 6e 6f 20 69 66 20 74 68 65 20 65  stErrno if the e
1490: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 61 20 72  rror code is a r
14a0: 65 61 6c 20 65 72 72 6f 72 20 61 6e 64 20 6e 6f  eal error and no
14b0: 74 20 0a 2a 2a 20 61 20 6e 6f 72 6d 61 6c 20 65  t .** a normal e
14c0: 78 70 65 63 74 65 64 20 72 65 74 75 72 6e 20 63  xpected return c
14d0: 6f 64 65 20 6f 66 20 53 51 4c 49 54 45 5f 42 55  ode of SQLITE_BU
14e0: 53 59 20 6f 72 20 53 51 4c 49 54 45 5f 4f 4b 0a  SY or SQLITE_OK.
14f0: 2a 2f 0a 23 64 65 66 69 6e 65 20 49 53 5f 4c 4f  */.#define IS_LO
1500: 43 4b 5f 45 52 52 4f 52 28 78 29 20 20 28 28 78  CK_ERROR(x)  ((x
1510: 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 29 20 26   != SQLITE_OK) &
1520: 26 20 28 78 20 21 3d 20 53 51 4c 49 54 45 5f 42  & (x != SQLITE_B
1530: 55 53 59 29 29 0a 0a 0a 2f 2a 0a 2a 2a 20 53 6f  USY)).../*.** So
1540: 6d 65 74 69 6d 65 73 2c 20 61 66 74 65 72 20 61  metimes, after a
1550: 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 69 73 20   file handle is 
1560: 63 6c 6f 73 65 64 20 62 79 20 53 51 4c 69 74 65  closed by SQLite
1570: 2c 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  , the file descr
1580: 69 70 74 6f 72 0a 2a 2a 20 63 61 6e 6e 6f 74 20  iptor.** cannot 
1590: 62 65 20 63 6c 6f 73 65 64 20 69 6d 6d 65 64 69  be closed immedi
15a0: 61 74 65 6c 79 2e 20 49 6e 20 74 68 65 73 65 20  ately. In these 
15b0: 63 61 73 65 73 2c 20 69 6e 73 74 61 6e 63 65 73  cases, instances
15c0: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
15d0: 67 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 61  g.** structure a
15e0: 72 65 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65  re used to store
15f0: 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
1600: 70 74 6f 72 20 77 68 69 6c 65 20 77 61 69 74 69  ptor while waiti
1610: 6e 67 20 66 6f 72 20 61 6e 0a 2a 2a 20 6f 70 70  ng for an.** opp
1620: 6f 72 74 75 6e 69 74 79 20 74 6f 20 65 69 74 68  ortunity to eith
1630: 65 72 20 63 6c 6f 73 65 20 6f 72 20 72 65 75 73  er close or reus
1640: 65 20 69 74 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  e it..*/.typedef
1650: 20 73 74 72 75 63 74 20 55 6e 69 78 55 6e 75 73   struct UnixUnus
1660: 65 64 46 64 20 55 6e 69 78 55 6e 75 73 65 64 46  edFd UnixUnusedF
1670: 64 3b 0a 73 74 72 75 63 74 20 55 6e 69 78 55 6e  d;.struct UnixUn
1680: 75 73 65 64 46 64 20 7b 0a 20 20 69 6e 74 20 66  usedFd {.  int f
1690: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
16a0: 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73       /* File des
16b0: 63 72 69 70 74 6f 72 20 74 6f 20 63 6c 6f 73 65  criptor to close
16c0: 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 3b   */.  int flags;
16d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16e0: 2f 2a 20 46 6c 61 67 73 20 74 68 69 73 20 66 69  /* Flags this fi
16f0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 77 61  le descriptor wa
1700: 73 20 6f 70 65 6e 65 64 20 77 69 74 68 20 2a 2f  s opened with */
1710: 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20  .  UnixUnusedFd 
1720: 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 2f 2a 20  *pNext;      /* 
1730: 4e 65 78 74 20 75 6e 75 73 65 64 20 66 69 6c 65  Next unused file
1740: 20 64 65 73 63 72 69 70 74 6f 72 20 6f 6e 20 73   descriptor on s
1750: 61 6d 65 20 66 69 6c 65 20 2a 2f 0a 7d 3b 0a 0a  ame file */.};..
1760: 2f 2a 0a 2a 2a 20 54 68 65 20 75 6e 69 78 46 69  /*.** The unixFi
1770: 6c 65 20 73 74 72 75 63 74 75 72 65 20 69 73 20  le structure is 
1780: 73 75 62 63 6c 61 73 73 20 6f 66 20 73 71 6c 69  subclass of sqli
1790: 74 65 33 5f 66 69 6c 65 20 73 70 65 63 69 66 69  te3_file specifi
17a0: 63 20 74 6f 20 74 68 65 20 75 6e 69 78 0a 2a 2a  c to the unix.**
17b0: 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74 61 74   VFS implementat
17c0: 69 6f 6e 73 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  ions..*/.typedef
17d0: 20 73 74 72 75 63 74 20 75 6e 69 78 46 69 6c 65   struct unixFile
17e0: 20 75 6e 69 78 46 69 6c 65 3b 0a 73 74 72 75 63   unixFile;.struc
17f0: 74 20 75 6e 69 78 46 69 6c 65 20 7b 0a 20 20 73  t unixFile {.  s
1800: 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
1810: 73 20 63 6f 6e 73 74 20 2a 70 4d 65 74 68 6f 64  s const *pMethod
1820: 3b 20 20 2f 2a 20 41 6c 77 61 79 73 20 74 68 65  ;  /* Always the
1830: 20 66 69 72 73 74 20 65 6e 74 72 79 20 2a 2f 0a   first entry */.
1840: 20 20 73 74 72 75 63 74 20 75 6e 69 78 4f 70 65    struct unixOpe
1850: 6e 43 6e 74 20 2a 70 4f 70 65 6e 3b 20 20 20 20  nCnt *pOpen;    
1860: 20 20 20 2f 2a 20 49 6e 66 6f 20 61 62 6f 75 74     /* Info about
1870: 20 61 6c 6c 20 6f 70 65 6e 20 66 64 27 73 20 6f   all open fd's o
1880: 6e 20 74 68 69 73 20 69 6e 6f 64 65 20 2a 2f 0a  n this inode */.
1890: 20 20 73 74 72 75 63 74 20 75 6e 69 78 4c 6f 63    struct unixLoc
18a0: 6b 49 6e 66 6f 20 2a 70 4c 6f 63 6b 3b 20 20 20  kInfo *pLock;   
18b0: 20 20 20 2f 2a 20 49 6e 66 6f 20 61 62 6f 75 74     /* Info about
18c0: 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 69 73 20 69   locks on this i
18d0: 6e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 68 3b  node */.  int h;
18e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1900: 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
1910: 72 20 2a 2f 0a 20 20 69 6e 74 20 64 69 72 66 64  r */.  int dirfd
1920: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1930: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20          /* File 
1940: 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20 74  descriptor for t
1950: 68 65 20 64 69 72 65 63 74 6f 72 79 20 2a 2f 0a  he directory */.
1960: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
1970: 6c 6f 63 6b 74 79 70 65 3b 20 20 20 20 20 20 20  locktype;       
1980: 20 20 20 2f 2a 20 54 68 65 20 74 79 70 65 20 6f     /* The type o
1990: 66 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74  f lock held on t
19a0: 68 69 73 20 66 64 20 2a 2f 0a 20 20 69 6e 74 20  his fd */.  int 
19b0: 6c 61 73 74 45 72 72 6e 6f 3b 20 20 20 20 20 20  lastErrno;      
19c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19d0: 54 68 65 20 75 6e 69 78 20 65 72 72 6e 6f 20 66  The unix errno f
19e0: 72 6f 6d 20 74 68 65 20 6c 61 73 74 20 49 2f 4f  rom the last I/O
19f0: 20 65 72 72 6f 72 20 2a 2f 0a 20 20 76 6f 69 64   error */.  void
1a00: 20 2a 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74   *lockingContext
1a10: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
1a20: 4c 6f 63 6b 69 6e 67 20 73 74 79 6c 65 20 73 70  Locking style sp
1a30: 65 63 69 66 69 63 20 73 74 61 74 65 20 2a 2f 0a  ecific state */.
1a40: 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a    UnixUnusedFd *
1a50: 70 55 6e 75 73 65 64 3b 20 20 20 20 20 20 20 20  pUnused;        
1a60: 20 20 20 2f 2a 20 50 72 65 2d 61 6c 6c 6f 63 61     /* Pre-alloca
1a70: 74 65 64 20 55 6e 69 78 55 6e 75 73 65 64 46 64  ted UnixUnusedFd
1a80: 20 2a 2f 0a 20 20 69 6e 74 20 66 69 6c 65 46 6c   */.  int fileFl
1a90: 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
1aa0: 20 20 20 20 20 20 20 2f 2a 20 4d 69 73 63 65 6c         /* Miscel
1ab0: 6c 61 6e 6f 75 73 20 66 6c 61 67 73 20 2a 2f 0a  lanous flags */.
1ac0: 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  #if SQLITE_ENABL
1ad0: 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
1ae0: 20 20 69 6e 74 20 6f 70 65 6e 46 6c 61 67 73 3b    int openFlags;
1af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b00: 20 20 20 2f 2a 20 54 68 65 20 66 6c 61 67 73 20     /* The flags 
1b10: 73 70 65 63 69 66 69 65 64 20 61 74 20 6f 70 65  specified at ope
1b20: 6e 28 29 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69  n() */.#endif.#i
1b30: 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53  f SQLITE_THREADS
1b40: 41 46 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f  AFE && defined(_
1b50: 5f 6c 69 6e 75 78 5f 5f 29 0a 20 20 70 74 68 72  _linux__).  pthr
1b60: 65 61 64 5f 74 20 74 69 64 3b 20 20 20 20 20 20  ead_t tid;      
1b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b80: 54 68 65 20 74 68 72 65 61 64 20 74 68 61 74 20  The thread that 
1b90: 22 6f 77 6e 73 22 20 74 68 69 73 20 75 6e 69 78  "owns" this unix
1ba0: 46 69 6c 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 23  File */.#endif.#
1bb0: 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  if OS_VXWORKS.  
1bc0: 69 6e 74 20 69 73 44 65 6c 65 74 65 3b 20 20 20  int isDelete;   
1bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1be0: 20 2f 2a 20 44 65 6c 65 74 65 20 6f 6e 20 63 6c   /* Delete on cl
1bf0: 6f 73 65 20 69 66 20 74 72 75 65 20 2a 2f 0a 20  ose if true */. 
1c00: 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46   struct vxworksF
1c10: 69 6c 65 49 64 20 2a 70 49 64 3b 20 20 20 20 20  ileId *pId;     
1c20: 20 20 2f 2a 20 55 6e 69 71 75 65 20 66 69 6c 65    /* Unique file
1c30: 20 49 44 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69   ID */.#endif.#i
1c40: 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 2f  fndef NDEBUG.  /
1c50: 2a 20 54 68 65 20 6e 65 78 74 20 67 72 6f 75 70  * The next group
1c60: 20 6f 66 20 76 61 72 69 61 62 6c 65 73 20 61 72   of variables ar
1c70: 65 20 75 73 65 64 20 74 6f 20 74 72 61 63 6b 20  e used to track 
1c80: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
1c90: 68 65 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  he.  ** transact
1ca0: 69 6f 6e 20 63 6f 75 6e 74 65 72 20 69 6e 20 62  ion counter in b
1cb0: 79 74 65 73 20 32 34 2d 32 37 20 6f 66 20 64 61  ytes 24-27 of da
1cc0: 74 61 62 61 73 65 20 66 69 6c 65 73 20 61 72 65  tabase files are
1cd0: 20 75 70 64 61 74 65 64 0a 20 20 2a 2a 20 77 68   updated.  ** wh
1ce0: 65 6e 65 76 65 72 20 61 6e 79 20 70 61 72 74 20  enever any part 
1cf0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1d00: 63 68 61 6e 67 65 73 2e 20 20 41 6e 20 61 73 73  changes.  An ass
1d10: 65 72 74 69 6f 6e 20 66 61 75 6c 74 20 77 69 6c  ertion fault wil
1d20: 6c 0a 20 20 2a 2a 20 6f 63 63 75 72 20 69 66 20  l.  ** occur if 
1d30: 61 20 66 69 6c 65 20 69 73 20 75 70 64 61 74 65  a file is update
1d40: 64 20 77 69 74 68 6f 75 74 20 61 6c 73 6f 20 75  d without also u
1d50: 70 64 61 74 69 6e 67 20 74 68 65 20 74 72 61 6e  pdating the tran
1d60: 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 63 6f 75  saction.  ** cou
1d70: 6e 74 65 72 2e 20 20 54 68 69 73 20 74 65 73 74  nter.  This test
1d80: 20 69 73 20 6d 61 64 65 20 74 6f 20 61 76 6f 69   is made to avoi
1d90: 64 20 6e 65 77 20 70 72 6f 62 6c 65 6d 73 20 73  d new problems s
1da0: 69 6d 69 6c 61 72 20 74 6f 20 74 68 65 0a 20 20  imilar to the.  
1db0: 2a 2a 20 6f 6e 65 20 64 65 73 63 72 69 62 65 64  ** one described
1dc0: 20 62 79 20 74 69 63 6b 65 74 20 23 33 35 38 34   by ticket #3584
1dd0: 2e 20 0a 20 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  . .  */.  unsign
1de0: 65 64 20 63 68 61 72 20 74 72 61 6e 73 43 6e 74  ed char transCnt
1df0: 72 43 68 6e 67 3b 20 20 20 2f 2a 20 54 72 75 65  rChng;   /* True
1e00: 20 69 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   if the transact
1e10: 69 6f 6e 20 63 6f 75 6e 74 65 72 20 63 68 61 6e  ion counter chan
1e20: 67 65 64 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ged */.  unsigne
1e30: 64 20 63 68 61 72 20 64 62 55 70 64 61 74 65 3b  d char dbUpdate;
1e40: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1e50: 69 66 20 61 6e 79 20 70 61 72 74 20 6f 66 20 64  if any part of d
1e60: 61 74 61 62 61 73 65 20 66 69 6c 65 20 63 68 61  atabase file cha
1e70: 6e 67 65 64 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  nged */.  unsign
1e80: 65 64 20 63 68 61 72 20 69 6e 4e 6f 72 6d 61 6c  ed char inNormal
1e90: 57 72 69 74 65 3b 20 20 20 2f 2a 20 54 72 75 65  Write;   /* True
1ea0: 20 69 66 20 69 6e 20 61 20 6e 6f 72 6d 61 6c 20   if in a normal 
1eb0: 77 72 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 20  write operation 
1ec0: 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  */.#endif.#ifdef
1ed0: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 2f   SQLITE_TEST.  /
1ee0: 2a 20 49 6e 20 74 65 73 74 20 6d 6f 64 65 2c 20  * In test mode, 
1ef0: 69 6e 63 72 65 61 73 65 20 74 68 65 20 73 69 7a  increase the siz
1f00: 65 20 6f 66 20 74 68 69 73 20 73 74 72 75 63 74  e of this struct
1f10: 75 72 65 20 61 20 62 69 74 20 73 6f 20 74 68 61  ure a bit so tha
1f20: 74 20 0a 20 20 2a 2a 20 69 74 20 69 73 20 6c 61  t .  ** it is la
1f30: 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 73 74  rger than the st
1f40: 72 75 63 74 20 43 72 61 73 68 46 69 6c 65 20 64  ruct CrashFile d
1f50: 65 66 69 6e 65 64 20 69 6e 20 74 65 73 74 36 2e  efined in test6.
1f60: 63 2e 0a 20 20 2a 2f 0a 20 20 63 68 61 72 20 61  c..  */.  char a
1f70: 50 61 64 64 69 6e 67 5b 33 32 5d 3b 0a 23 65 6e  Padding[32];.#en
1f80: 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68  dif.};../*.** Th
1f90: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72  e following macr
1fa0: 6f 73 20 64 65 66 69 6e 65 20 62 69 74 73 20 69  os define bits i
1fb0: 6e 20 75 6e 69 78 46 69 6c 65 2e 66 69 6c 65 46  n unixFile.fileF
1fc0: 6c 61 67 73 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  lags.*/.#define 
1fd0: 53 51 4c 49 54 45 5f 57 48 4f 4c 45 5f 46 49 4c  SQLITE_WHOLE_FIL
1fe0: 45 5f 4c 4f 43 4b 49 4e 47 20 20 30 78 30 30 30  E_LOCKING  0x000
1ff0: 31 20 20 20 2f 2a 20 55 73 65 20 77 68 6f 6c 65  1   /* Use whole
2000: 2d 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 2a 2f  -file locking */
2010: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 6c 75 64 65 20  ../*.** Include 
2020: 63 6f 64 65 20 74 68 61 74 20 69 73 20 63 6f 6d  code that is com
2030: 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6f 73 5f 2a 2e  mon to all os_*.
2040: 63 20 66 69 6c 65 73 0a 2a 2f 0a 23 69 6e 63 6c  c files.*/.#incl
2050: 75 64 65 20 22 6f 73 5f 63 6f 6d 6d 6f 6e 2e 68  ude "os_common.h
2060: 22 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65 20  "../*.** Define 
2070: 76 61 72 69 6f 75 73 20 6d 61 63 72 6f 73 20 74  various macros t
2080: 68 61 74 20 61 72 65 20 6d 69 73 73 69 6e 67 20  hat are missing 
2090: 66 72 6f 6d 20 73 6f 6d 65 20 73 79 73 74 65 6d  from some system
20a0: 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4f 5f  s..*/.#ifndef O_
20b0: 4c 41 52 47 45 46 49 4c 45 0a 23 20 64 65 66 69  LARGEFILE.# defi
20c0: 6e 65 20 4f 5f 4c 41 52 47 45 46 49 4c 45 20 30  ne O_LARGEFILE 0
20d0: 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53  .#endif.#ifdef S
20e0: 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 4c 46  QLITE_DISABLE_LF
20f0: 53 0a 23 20 75 6e 64 65 66 20 4f 5f 4c 41 52 47  S.# undef O_LARG
2100: 45 46 49 4c 45 0a 23 20 64 65 66 69 6e 65 20 4f  EFILE.# define O
2110: 5f 4c 41 52 47 45 46 49 4c 45 20 30 0a 23 65 6e  _LARGEFILE 0.#en
2120: 64 69 66 0a 23 69 66 6e 64 65 66 20 4f 5f 4e 4f  dif.#ifndef O_NO
2130: 46 4f 4c 4c 4f 57 0a 23 20 64 65 66 69 6e 65 20  FOLLOW.# define 
2140: 4f 5f 4e 4f 46 4f 4c 4c 4f 57 20 30 0a 23 65 6e  O_NOFOLLOW 0.#en
2150: 64 69 66 0a 23 69 66 6e 64 65 66 20 4f 5f 42 49  dif.#ifndef O_BI
2160: 4e 41 52 59 0a 23 20 64 65 66 69 6e 65 20 4f 5f  NARY.# define O_
2170: 42 49 4e 41 52 59 20 30 0a 23 65 6e 64 69 66 0a  BINARY 0.#endif.
2180: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 44 4a 47 50 50  ./*.** The DJGPP
2190: 20 63 6f 6d 70 69 6c 65 72 20 65 6e 76 69 72 6f   compiler enviro
21a0: 6e 6d 65 6e 74 20 6c 6f 6f 6b 73 20 6d 6f 73 74  nment looks most
21b0: 6c 79 20 6c 69 6b 65 20 55 6e 69 78 2c 20 62 75  ly like Unix, bu
21c0: 74 20 69 74 0a 2a 2a 20 6c 61 63 6b 73 20 74 68  t it.** lacks th
21d0: 65 20 66 63 6e 74 6c 28 29 20 73 79 73 74 65 6d  e fcntl() system
21e0: 20 63 61 6c 6c 2e 20 20 53 6f 20 72 65 64 65 66   call.  So redef
21f0: 69 6e 65 20 66 63 6e 74 6c 28 29 20 74 6f 20 62  ine fcntl() to b
2200: 65 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 74  e something.** t
2210: 68 61 74 20 61 6c 77 61 79 73 20 73 75 63 63 65  hat always succe
2220: 65 64 73 2e 20 20 54 68 69 73 20 6d 65 61 6e 73  eds.  This means
2230: 20 74 68 61 74 20 6c 6f 63 6b 69 6e 67 20 64 6f   that locking do
2240: 65 73 20 6e 6f 74 20 6f 63 63 75 72 20 75 6e 64  es not occur und
2250: 65 72 0a 2a 2a 20 44 4a 47 50 50 2e 20 20 42 75  er.** DJGPP.  Bu
2260: 74 20 69 74 20 69 73 20 44 4f 53 20 2d 20 77 68  t it is DOS - wh
2270: 61 74 20 64 69 64 20 79 6f 75 20 65 78 70 65 63  at did you expec
2280: 74 3f 0a 2a 2f 0a 23 69 66 64 65 66 20 5f 5f 44  t?.*/.#ifdef __D
2290: 4a 47 50 50 5f 5f 0a 23 20 64 65 66 69 6e 65 20  JGPP__.# define 
22a0: 66 63 6e 74 6c 28 41 2c 42 2c 43 29 20 30 0a 23  fcntl(A,B,C) 0.#
22b0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
22c0: 20 74 68 72 65 61 64 69 64 20 6d 61 63 72 6f 20   threadid macro 
22d0: 72 65 73 6f 6c 76 65 73 20 74 6f 20 74 68 65 20  resolves to the 
22e0: 74 68 72 65 61 64 2d 69 64 20 6f 72 20 74 6f 20  thread-id or to 
22f0: 30 2e 20 20 55 73 65 64 20 66 6f 72 0a 2a 2a 20  0.  Used for.** 
2300: 74 65 73 74 69 6e 67 20 61 6e 64 20 64 65 62 75  testing and debu
2310: 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23  gging only..*/.#
2320: 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44  if SQLITE_THREAD
2330: 53 41 46 45 0a 23 64 65 66 69 6e 65 20 74 68 72  SAFE.#define thr
2340: 65 61 64 69 64 20 70 74 68 72 65 61 64 5f 73 65  eadid pthread_se
2350: 6c 66 28 29 0a 23 65 6c 73 65 0a 23 64 65 66 69  lf().#else.#defi
2360: 6e 65 20 74 68 72 65 61 64 69 64 20 30 0a 23 65  ne threadid 0.#e
2370: 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 48 65 6c  ndif.../*.** Hel
2380: 70 65 72 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f  per functions to
2390: 20 6f 62 74 61 69 6e 20 61 6e 64 20 72 65 6c 69   obtain and reli
23a0: 6e 71 75 69 73 68 20 74 68 65 20 67 6c 6f 62 61  nquish the globa
23b0: 6c 20 6d 75 74 65 78 2e 20 54 68 65 0a 2a 2a 20  l mutex. The.** 
23c0: 67 6c 6f 62 61 6c 20 6d 75 74 65 78 20 69 73 20  global mutex is 
23d0: 75 73 65 64 20 74 6f 20 70 72 6f 74 65 63 74 20  used to protect 
23e0: 74 68 65 20 75 6e 69 78 4f 70 65 6e 43 6e 74 2c  the unixOpenCnt,
23f0: 20 75 6e 69 78 4c 6f 63 6b 49 6e 66 6f 20 61 6e   unixLockInfo an
2400: 64 0a 2a 2a 20 76 78 77 6f 72 6b 73 46 69 6c 65  d.** vxworksFile
2410: 49 64 20 6f 62 6a 65 63 74 73 20 75 73 65 64 20  Id objects used 
2420: 62 79 20 74 68 69 73 20 66 69 6c 65 2c 20 61 6c  by this file, al
2430: 6c 20 6f 66 20 77 68 69 63 68 20 6d 61 79 20 62  l of which may b
2440: 65 20 0a 2a 2a 20 73 68 61 72 65 64 20 62 79 20  e .** shared by 
2450: 6d 75 6c 74 69 70 6c 65 20 74 68 72 65 61 64 73  multiple threads
2460: 2e 0a 2a 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e  ..**.** Function
2470: 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29   unixMutexHeld()
2480: 20 69 73 20 75 73 65 64 20 74 6f 20 61 73 73 65   is used to asse
2490: 72 74 28 29 20 74 68 61 74 20 74 68 65 20 67 6c  rt() that the gl
24a0: 6f 62 61 6c 20 6d 75 74 65 78 20 0a 2a 2a 20 69  obal mutex .** i
24b0: 73 20 68 65 6c 64 20 77 68 65 6e 20 72 65 71 75  s held when requ
24c0: 69 72 65 64 2e 20 54 68 69 73 20 66 75 6e 63 74  ired. This funct
24d0: 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64  ion is only used
24e0: 20 61 73 20 70 61 72 74 20 6f 66 20 61 73 73 65   as part of asse
24f0: 72 74 28 29 20 0a 2a 2a 20 73 74 61 74 65 6d 65  rt() .** stateme
2500: 6e 74 73 2e 20 65 2e 67 2e 0a 2a 2a 0a 2a 2a 20  nts. e.g..**.** 
2510: 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
2520: 28 29 0a 2a 2a 20 20 20 20 20 61 73 73 65 72 74  ().**     assert
2530: 28 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28  ( unixMutexHeld(
2540: 29 20 29 3b 0a 2a 2a 20 20 20 75 6e 69 78 45 6e  ) );.**   unixEn
2550: 74 65 72 4c 65 61 76 65 28 29 0a 2a 2f 0a 73 74  terLeave().*/.st
2560: 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 45 6e  atic void unixEn
2570: 74 65 72 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a  terMutex(void){.
2580: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
2590: 65 6e 74 65 72 28 73 71 6c 69 74 65 33 4d 75 74  enter(sqlite3Mut
25a0: 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  exAlloc(SQLITE_M
25b0: 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54  UTEX_STATIC_MAST
25c0: 45 52 29 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76  ER));.}.static v
25d0: 6f 69 64 20 75 6e 69 78 4c 65 61 76 65 4d 75 74  oid unixLeaveMut
25e0: 65 78 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69  ex(void){.  sqli
25f0: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
2600: 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
2610: 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
2620: 54 41 54 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a  TATIC_MASTER));.
2630: 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
2640: 44 45 42 55 47 0a 73 74 61 74 69 63 20 69 6e 74  DEBUG.static int
2650: 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 76   unixMutexHeld(v
2660: 6f 69 64 29 20 7b 0a 20 20 72 65 74 75 72 6e 20  oid) {.  return 
2670: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
2680: 6c 64 28 73 71 6c 69 74 65 33 4d 75 74 65 78 41  ld(sqlite3MutexA
2690: 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
26a0: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29  X_STATIC_MASTER)
26b0: 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23 69  );.}.#endif...#i
26c0: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
26d0: 47 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66  G./*.** Helper f
26e0: 75 6e 63 74 69 6f 6e 20 66 6f 72 20 70 72 69 6e  unction for prin
26f0: 74 69 6e 67 20 6f 75 74 20 74 72 61 63 65 20 69  ting out trace i
2700: 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20  nformation from 
2710: 64 65 62 75 67 67 69 6e 67 0a 2a 2a 20 62 69 6e  debugging.** bin
2720: 61 72 69 65 73 2e 20 54 68 69 73 20 72 65 74 75  aries. This retu
2730: 72 6e 73 20 74 68 65 20 73 74 72 69 6e 67 20 72  rns the string r
2740: 65 70 72 65 73 65 74 61 74 69 6f 6e 20 6f 66 20  epresetation of 
2750: 74 68 65 20 73 75 70 70 6c 69 65 64 0a 2a 2a 20  the supplied.** 
2760: 69 6e 74 65 67 65 72 20 6c 6f 63 6b 2d 74 79 70  integer lock-typ
2770: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  e..*/.static con
2780: 73 74 20 63 68 61 72 20 2a 6c 6f 63 6b 74 79 70  st char *locktyp
2790: 65 4e 61 6d 65 28 69 6e 74 20 6c 6f 63 6b 74 79  eName(int lockty
27a0: 70 65 29 7b 0a 20 20 73 77 69 74 63 68 28 20 6c  pe){.  switch( l
27b0: 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 63  ocktype ){.    c
27c0: 61 73 65 20 4e 4f 5f 4c 4f 43 4b 3a 20 72 65 74  ase NO_LOCK: ret
27d0: 75 72 6e 20 22 4e 4f 4e 45 22 3b 0a 20 20 20 20  urn "NONE";.    
27e0: 63 61 73 65 20 53 48 41 52 45 44 5f 4c 4f 43 4b  case SHARED_LOCK
27f0: 3a 20 72 65 74 75 72 6e 20 22 53 48 41 52 45 44  : return "SHARED
2800: 22 3b 0a 20 20 20 20 63 61 73 65 20 52 45 53 45  ";.    case RESE
2810: 52 56 45 44 5f 4c 4f 43 4b 3a 20 72 65 74 75 72  RVED_LOCK: retur
2820: 6e 20 22 52 45 53 45 52 56 45 44 22 3b 0a 20 20  n "RESERVED";.  
2830: 20 20 63 61 73 65 20 50 45 4e 44 49 4e 47 5f 4c    case PENDING_L
2840: 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 50 45 4e  OCK: return "PEN
2850: 44 49 4e 47 22 3b 0a 20 20 20 20 63 61 73 65 20  DING";.    case 
2860: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3a 20  EXCLUSIVE_LOCK: 
2870: 72 65 74 75 72 6e 20 22 45 58 43 4c 55 53 49 56  return "EXCLUSIV
2880: 45 22 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  E";.  }.  return
2890: 20 22 45 52 52 4f 52 22 3b 0a 7d 0a 23 65 6e 64   "ERROR";.}.#end
28a0: 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  if..#ifdef SQLIT
28b0: 45 5f 4c 4f 43 4b 5f 54 52 41 43 45 0a 2f 2a 0a  E_LOCK_TRACE./*.
28c0: 2a 2a 20 50 72 69 6e 74 20 6f 75 74 20 69 6e 66  ** Print out inf
28d0: 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 61  ormation about a
28e0: 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6f 70 65 72 61  ll locking opera
28f0: 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  tions..**.** Thi
2900: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
2910: 64 20 66 6f 72 20 74 72 6f 75 62 6c 65 73 68 6f  d for troublesho
2920: 6f 74 69 6e 67 20 6c 6f 63 6b 73 20 6f 6e 20 6d  oting locks on m
2930: 75 6c 74 69 74 68 72 65 61 64 65 64 0a 2a 2a 20  ultithreaded.** 
2940: 70 6c 61 74 66 6f 72 6d 73 2e 20 20 45 6e 61 62  platforms.  Enab
2950: 6c 65 20 62 79 20 63 6f 6d 70 69 6c 69 6e 67 20  le by compiling 
2960: 77 69 74 68 20 74 68 65 20 2d 44 53 51 4c 49 54  with the -DSQLIT
2970: 45 5f 4c 4f 43 4b 5f 54 52 41 43 45 0a 2a 2a 20  E_LOCK_TRACE.** 
2980: 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 6f 70 74  command-line opt
2990: 69 6f 6e 20 6f 6e 20 74 68 65 20 63 6f 6d 70 69  ion on the compi
29a0: 6c 65 72 2e 20 20 54 68 69 73 20 63 6f 64 65 20  ler.  This code 
29b0: 69 73 20 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a 20 74  is normally.** t
29c0: 75 72 6e 65 64 20 6f 66 66 2e 0a 2a 2f 0a 73 74  urned off..*/.st
29d0: 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b 54 72 61  atic int lockTra
29e0: 63 65 28 69 6e 74 20 66 64 2c 20 69 6e 74 20 6f  ce(int fd, int o
29f0: 70 2c 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20  p, struct flock 
2a00: 2a 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4f 70  *p){.  char *zOp
2a10: 4e 61 6d 65 2c 20 2a 7a 54 79 70 65 3b 0a 20 20  Name, *zType;.  
2a20: 69 6e 74 20 73 3b 0a 20 20 69 6e 74 20 73 61 76  int s;.  int sav
2a30: 65 64 45 72 72 6e 6f 3b 0a 20 20 69 66 28 20 6f  edErrno;.  if( o
2a40: 70 3d 3d 46 5f 47 45 54 4c 4b 20 29 7b 0a 20 20  p==F_GETLK ){.  
2a50: 20 20 7a 4f 70 4e 61 6d 65 20 3d 20 22 47 45 54    zOpName = "GET
2a60: 4c 4b 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  LK";.  }else if(
2a70: 20 6f 70 3d 3d 46 5f 53 45 54 4c 4b 20 29 7b 0a   op==F_SETLK ){.
2a80: 20 20 20 20 7a 4f 70 4e 61 6d 65 20 3d 20 22 53      zOpName = "S
2a90: 45 54 4c 4b 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ETLK";.  }else{.
2aa0: 20 20 20 20 73 20 3d 20 66 63 6e 74 6c 28 66 64      s = fcntl(fd
2ab0: 2c 20 6f 70 2c 20 70 29 3b 0a 20 20 20 20 73 71  , op, p);.    sq
2ac0: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
2ad0: 28 22 66 63 6e 74 6c 20 75 6e 6b 6e 6f 77 6e 20  ("fcntl unknown 
2ae0: 25 64 20 25 64 20 25 64 5c 6e 22 2c 20 66 64 2c  %d %d %d\n", fd,
2af0: 20 6f 70 2c 20 73 29 3b 0a 20 20 20 20 72 65 74   op, s);.    ret
2b00: 75 72 6e 20 73 3b 0a 20 20 7d 0a 20 20 69 66 28  urn s;.  }.  if(
2b10: 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44   p->l_type==F_RD
2b20: 4c 43 4b 20 29 7b 0a 20 20 20 20 7a 54 79 70 65  LCK ){.    zType
2b30: 20 3d 20 22 52 44 4c 43 4b 22 3b 0a 20 20 7d 65   = "RDLCK";.  }e
2b40: 6c 73 65 20 69 66 28 20 70 2d 3e 6c 5f 74 79 70  lse if( p->l_typ
2b50: 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 7b 0a 20 20  e==F_WRLCK ){.  
2b60: 20 20 7a 54 79 70 65 20 3d 20 22 57 52 4c 43 4b    zType = "WRLCK
2b70: 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  ";.  }else if( p
2b80: 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 55 4e 4c 43  ->l_type==F_UNLC
2b90: 4b 20 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d  K ){.    zType =
2ba0: 20 22 55 4e 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73   "UNLCK";.  }els
2bb0: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 30  e{.    assert( 0
2bc0: 20 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   );.  }.  assert
2bd0: 28 20 70 2d 3e 6c 5f 77 68 65 6e 63 65 3d 3d 53  ( p->l_whence==S
2be0: 45 45 4b 5f 53 45 54 20 29 3b 0a 20 20 73 20 3d  EEK_SET );.  s =
2bf0: 20 66 63 6e 74 6c 28 66 64 2c 20 6f 70 2c 20 70   fcntl(fd, op, p
2c00: 29 3b 0a 20 20 73 61 76 65 64 45 72 72 6e 6f 20  );.  savedErrno 
2c10: 3d 20 65 72 72 6e 6f 3b 0a 20 20 73 71 6c 69 74  = errno;.  sqlit
2c20: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 66  e3DebugPrintf("f
2c30: 63 6e 74 6c 20 25 64 20 25 64 20 25 73 20 25 73  cntl %d %d %s %s
2c40: 20 25 64 20 25 64 20 25 64 20 25 64 5c 6e 22 2c   %d %d %d %d\n",
2c50: 0a 20 20 20 20 20 74 68 72 65 61 64 69 64 2c 20  .     threadid, 
2c60: 66 64 2c 20 7a 4f 70 4e 61 6d 65 2c 20 7a 54 79  fd, zOpName, zTy
2c70: 70 65 2c 20 28 69 6e 74 29 70 2d 3e 6c 5f 73 74  pe, (int)p->l_st
2c80: 61 72 74 2c 20 28 69 6e 74 29 70 2d 3e 6c 5f 6c  art, (int)p->l_l
2c90: 65 6e 2c 0a 20 20 20 20 20 28 69 6e 74 29 70 2d  en,.     (int)p-
2ca0: 3e 6c 5f 70 69 64 2c 20 73 29 3b 0a 20 20 69 66  >l_pid, s);.  if
2cb0: 28 20 73 3d 3d 28 2d 31 29 20 26 26 20 6f 70 3d  ( s==(-1) && op=
2cc0: 3d 46 5f 53 45 54 4c 4b 20 26 26 20 28 70 2d 3e  =F_SETLK && (p->
2cd0: 6c 5f 74 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20  l_type==F_RDLCK 
2ce0: 7c 7c 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f  || p->l_type==F_
2cf0: 57 52 4c 43 4b 29 20 29 7b 0a 20 20 20 20 73 74  WRLCK) ){.    st
2d00: 72 75 63 74 20 66 6c 6f 63 6b 20 6c 32 3b 0a 20  ruct flock l2;. 
2d10: 20 20 20 6c 32 20 3d 20 2a 70 3b 0a 20 20 20 20     l2 = *p;.    
2d20: 66 63 6e 74 6c 28 66 64 2c 20 46 5f 47 45 54 4c  fcntl(fd, F_GETL
2d30: 4b 2c 20 26 6c 32 29 3b 0a 20 20 20 20 69 66 28  K, &l2);.    if(
2d40: 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44   l2.l_type==F_RD
2d50: 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 7a 54 79  LCK ){.      zTy
2d60: 70 65 20 3d 20 22 52 44 4c 43 4b 22 3b 0a 20 20  pe = "RDLCK";.  
2d70: 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 32 2e 6c    }else if( l2.l
2d80: 5f 74 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29  _type==F_WRLCK )
2d90: 7b 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20  {.      zType = 
2da0: 22 57 52 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c  "WRLCK";.    }el
2db0: 73 65 20 69 66 28 20 6c 32 2e 6c 5f 74 79 70 65  se if( l2.l_type
2dc0: 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20  ==F_UNLCK ){.   
2dd0: 20 20 20 7a 54 79 70 65 20 3d 20 22 55 4e 4c 43     zType = "UNLC
2de0: 4b 22 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  K";.    }else{. 
2df0: 20 20 20 20 20 61 73 73 65 72 74 28 20 30 20 29       assert( 0 )
2e00: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
2e10: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
2e20: 66 63 6e 74 6c 2d 66 61 69 6c 75 72 65 2d 72 65  fcntl-failure-re
2e30: 61 73 6f 6e 3a 20 25 73 20 25 64 20 25 64 20 25  ason: %s %d %d %
2e40: 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 7a 54 79  d\n",.       zTy
2e50: 70 65 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f 73 74  pe, (int)l2.l_st
2e60: 61 72 74 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f 6c  art, (int)l2.l_l
2e70: 65 6e 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f 70 69  en, (int)l2.l_pi
2e80: 64 29 3b 0a 20 20 7d 0a 20 20 65 72 72 6e 6f 20  d);.  }.  errno 
2e90: 3d 20 73 61 76 65 64 45 72 72 6e 6f 3b 0a 20 20  = savedErrno;.  
2ea0: 72 65 74 75 72 6e 20 73 3b 0a 7d 0a 23 64 65 66  return s;.}.#def
2eb0: 69 6e 65 20 66 63 6e 74 6c 20 6c 6f 63 6b 54 72  ine fcntl lockTr
2ec0: 61 63 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ace.#endif /* SQ
2ed0: 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52 41 43 45 20  LITE_LOCK_TRACE 
2ee0: 2a 2f 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  */..../*.** This
2ef0: 20 72 6f 75 74 69 6e 65 20 74 72 61 6e 73 6c 61   routine transla
2f00: 74 65 73 20 61 20 73 74 61 6e 64 61 72 64 20 50  tes a standard P
2f10: 4f 53 49 58 20 65 72 72 6e 6f 20 63 6f 64 65 20  OSIX errno code 
2f20: 69 6e 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a  into something.*
2f30: 2a 20 75 73 65 66 75 6c 20 74 6f 20 74 68 65 20  * useful to the 
2f40: 63 6c 69 65 6e 74 73 20 6f 66 20 74 68 65 20 73  clients of the s
2f50: 71 6c 69 74 65 33 20 66 75 6e 63 74 69 6f 6e 73  qlite3 functions
2f60: 2e 20 20 53 70 65 63 69 66 69 63 61 6c 6c 79 2c  .  Specifically,
2f70: 20 69 74 20 69 73 0a 2a 2a 20 69 6e 74 65 6e 64   it is.** intend
2f80: 65 64 20 74 6f 20 74 72 61 6e 73 6c 61 74 65 20  ed to translate 
2f90: 61 20 76 61 72 69 65 74 79 20 6f 66 20 22 74 72  a variety of "tr
2fa0: 79 20 61 67 61 69 6e 22 20 65 72 72 6f 72 73 20  y again" errors 
2fb0: 69 6e 74 6f 20 53 51 4c 49 54 45 5f 42 55 53 59  into SQLITE_BUSY
2fc0: 0a 2a 2a 20 61 6e 64 20 61 20 76 61 72 69 65 74  .** and a variet
2fd0: 79 20 6f 66 20 22 70 6c 65 61 73 65 20 63 6c 6f  y of "please clo
2fe0: 73 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  se the file desc
2ff0: 72 69 70 74 6f 72 20 4e 4f 57 22 20 65 72 72 6f  riptor NOW" erro
3000: 72 73 20 69 6e 74 6f 20 0a 2a 2a 20 53 51 4c 49  rs into .** SQLI
3010: 54 45 5f 49 4f 45 52 52 0a 2a 2a 20 0a 2a 2a 20  TE_IOERR.** .** 
3020: 45 72 72 6f 72 73 20 64 75 72 69 6e 67 20 69 6e  Errors during in
3030: 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20  itialization of 
3040: 6c 6f 63 6b 73 2c 20 6f 72 20 66 69 6c 65 20 73  locks, or file s
3050: 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20 66 6f  ystem support fo
3060: 72 20 6c 6f 63 6b 73 2c 0a 2a 2a 20 73 68 6f 75  r locks,.** shou
3070: 6c 64 20 68 61 6e 64 6c 65 20 45 4e 4f 4c 43 4b  ld handle ENOLCK
3080: 2c 20 45 4e 4f 54 53 55 50 2c 20 45 4f 50 4e 4f  , ENOTSUP, EOPNO
3090: 54 53 55 50 50 20 73 65 70 61 72 61 74 65 6c 79  TSUPP separately
30a0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
30b0: 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
30c0: 6f 73 69 78 45 72 72 6f 72 28 69 6e 74 20 70 6f  osixError(int po
30d0: 73 69 78 45 72 72 6f 72 2c 20 69 6e 74 20 73 71  sixError, int sq
30e0: 6c 69 74 65 49 4f 45 72 72 29 20 7b 0a 20 20 73  liteIOErr) {.  s
30f0: 77 69 74 63 68 20 28 70 6f 73 69 78 45 72 72 6f  witch (posixErro
3100: 72 29 20 7b 0a 20 20 63 61 73 65 20 30 3a 20 0a  r) {.  case 0: .
3110: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
3120: 45 5f 4f 4b 3b 0a 20 20 20 20 0a 20 20 63 61 73  E_OK;.    .  cas
3130: 65 20 45 41 47 41 49 4e 3a 0a 20 20 63 61 73 65  e EAGAIN:.  case
3140: 20 45 54 49 4d 45 44 4f 55 54 3a 0a 20 20 63 61   ETIMEDOUT:.  ca
3150: 73 65 20 45 42 55 53 59 3a 0a 20 20 63 61 73 65  se EBUSY:.  case
3160: 20 45 49 4e 54 52 3a 0a 20 20 63 61 73 65 20 45   EINTR:.  case E
3170: 4e 4f 4c 43 4b 3a 20 20 0a 20 20 20 20 2f 2a 20  NOLCK:  .    /* 
3180: 72 61 6e 64 6f 6d 20 4e 46 53 20 72 65 74 72 79  random NFS retry
3190: 20 65 72 72 6f 72 2c 20 75 6e 6c 65 73 73 20 64   error, unless d
31a0: 75 72 69 6e 67 20 66 69 6c 65 20 73 79 73 74 65  uring file syste
31b0: 6d 20 73 75 70 70 6f 72 74 20 0a 20 20 20 20 20  m support .     
31c0: 2a 20 69 6e 74 72 6f 73 70 65 63 74 69 6f 6e 2c  * introspection,
31d0: 20 69 6e 20 77 68 69 63 68 20 69 74 20 61 63 74   in which it act
31e0: 75 61 6c 6c 79 20 6d 65 61 6e 73 20 77 68 61 74  ually means what
31f0: 20 69 74 20 73 61 79 73 20 2a 2f 0a 20 20 20 20   it says */.    
3200: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
3210: 53 59 3b 0a 20 20 20 20 0a 20 20 63 61 73 65 20  SY;.    .  case 
3220: 45 41 43 43 45 53 3a 20 0a 20 20 20 20 2f 2a 20  EACCES: .    /* 
3230: 45 41 43 43 45 53 20 69 73 20 6c 69 6b 65 20 45  EACCES is like E
3240: 41 47 41 49 4e 20 64 75 72 69 6e 67 20 6c 6f 63  AGAIN during loc
3250: 6b 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73 2c  king operations,
3260: 20 62 75 74 20 6e 6f 74 20 61 6e 79 20 6f 74 68   but not any oth
3270: 65 72 20 74 69 6d 65 2a 2f 0a 20 20 20 20 69 66  er time*/.    if
3280: 28 20 28 73 71 6c 69 74 65 49 4f 45 72 72 20 3d  ( (sqliteIOErr =
3290: 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c  = SQLITE_IOERR_L
32a0: 4f 43 4b 29 20 7c 7c 20 0a 09 28 73 71 6c 69 74  OCK) || ..(sqlit
32b0: 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49 54 45  eIOErr == SQLITE
32c0: 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 20 7c  _IOERR_UNLOCK) |
32d0: 7c 20 0a 09 28 73 71 6c 69 74 65 49 4f 45 72 72  | ..(sqliteIOErr
32e0: 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52   == SQLITE_IOERR
32f0: 5f 52 44 4c 4f 43 4b 29 20 7c 7c 0a 09 28 73 71  _RDLOCK) ||..(sq
3300: 6c 69 74 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c  liteIOErr == SQL
3310: 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52  ITE_IOERR_CHECKR
3320: 45 53 45 52 56 45 44 4c 4f 43 4b 29 20 29 7b 0a  ESERVEDLOCK) ){.
3330: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
3340: 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a  ITE_BUSY;.    }.
3350: 20 20 20 20 2f 2a 20 65 6c 73 65 20 66 61 6c 6c      /* else fall
3360: 20 74 68 72 6f 75 67 68 20 2a 2f 0a 20 20 63 61   through */.  ca
3370: 73 65 20 45 50 45 52 4d 3a 20 0a 20 20 20 20 72  se EPERM: .    r
3380: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52  eturn SQLITE_PER
3390: 4d 3b 0a 20 20 20 20 0a 20 20 63 61 73 65 20 45  M;.    .  case E
33a0: 44 45 41 44 4c 4b 3a 0a 20 20 20 20 72 65 74 75  DEADLK:.    retu
33b0: 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
33c0: 42 4c 4f 43 4b 45 44 3b 0a 20 20 20 20 0a 23 69  BLOCKED;.    .#i
33d0: 66 20 45 4f 50 4e 4f 54 53 55 50 50 21 3d 45 4e  f EOPNOTSUPP!=EN
33e0: 4f 54 53 55 50 0a 20 20 63 61 73 65 20 45 4f 50  OTSUP.  case EOP
33f0: 4e 4f 54 53 55 50 50 3a 20 0a 20 20 20 20 2f 2a  NOTSUPP: .    /*
3400: 20 73 6f 6d 65 74 68 69 6e 67 20 77 65 6e 74 20   something went 
3410: 74 65 72 72 69 62 6c 79 20 61 77 72 79 2c 20 75  terribly awry, u
3420: 6e 6c 65 73 73 20 64 75 72 69 6e 67 20 66 69 6c  nless during fil
3430: 65 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74  e system support
3440: 20 0a 20 20 20 20 20 2a 20 69 6e 74 72 6f 73 70   .     * introsp
3450: 65 63 74 69 6f 6e 2c 20 69 6e 20 77 68 69 63 68  ection, in which
3460: 20 69 74 20 61 63 74 75 61 6c 6c 79 20 6d 65 61   it actually mea
3470: 6e 73 20 77 68 61 74 20 69 74 20 73 61 79 73 20  ns what it says 
3480: 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  */.#endif.#ifdef
3490: 20 45 4e 4f 54 53 55 50 0a 20 20 63 61 73 65 20   ENOTSUP.  case 
34a0: 45 4e 4f 54 53 55 50 3a 20 0a 20 20 20 20 2f 2a  ENOTSUP: .    /*
34b0: 20 69 6e 76 61 6c 69 64 20 66 64 2c 20 75 6e 6c   invalid fd, unl
34c0: 65 73 73 20 64 75 72 69 6e 67 20 66 69 6c 65 20  ess during file 
34d0: 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20 69  system support i
34e0: 6e 74 72 6f 73 70 65 63 74 69 6f 6e 2c 20 69 6e  ntrospection, in
34f0: 20 77 68 69 63 68 20 0a 20 20 20 20 20 2a 20 69   which .     * i
3500: 74 20 61 63 74 75 61 6c 6c 79 20 6d 65 61 6e 73  t actually means
3510: 20 77 68 61 74 20 69 74 20 73 61 79 73 20 2a 2f   what it says */
3520: 0a 23 65 6e 64 69 66 0a 20 20 63 61 73 65 20 45  .#endif.  case E
3530: 49 4f 3a 0a 20 20 63 61 73 65 20 45 42 41 44 46  IO:.  case EBADF
3540: 3a 0a 20 20 63 61 73 65 20 45 49 4e 56 41 4c 3a  :.  case EINVAL:
3550: 0a 20 20 63 61 73 65 20 45 4e 4f 54 43 4f 4e 4e  .  case ENOTCONN
3560: 3a 0a 20 20 63 61 73 65 20 45 4e 4f 44 45 56 3a  :.  case ENODEV:
3570: 0a 20 20 63 61 73 65 20 45 4e 58 49 4f 3a 0a 20  .  case ENXIO:. 
3580: 20 63 61 73 65 20 45 4e 4f 45 4e 54 3a 0a 20 20   case ENOENT:.  
3590: 63 61 73 65 20 45 53 54 41 4c 45 3a 0a 20 20 63  case ESTALE:.  c
35a0: 61 73 65 20 45 4e 4f 53 59 53 3a 0a 20 20 20 20  ase ENOSYS:.    
35b0: 2f 2a 20 74 68 65 73 65 20 73 68 6f 75 6c 64 20  /* these should 
35c0: 66 6f 72 63 65 20 74 68 65 20 63 6c 69 65 6e 74  force the client
35d0: 20 74 6f 20 63 6c 6f 73 65 20 74 68 65 20 66 69   to close the fi
35e0: 6c 65 20 61 6e 64 20 72 65 63 6f 6e 6e 65 63 74  le and reconnect
35f0: 20 2a 2f 0a 20 20 20 20 0a 20 20 64 65 66 61 75   */.    .  defau
3600: 6c 74 3a 20 0a 20 20 20 20 72 65 74 75 72 6e 20  lt: .    return 
3610: 73 71 6c 69 74 65 49 4f 45 72 72 3b 0a 20 20 7d  sqliteIOErr;.  }
3620: 0a 7d 0a 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  .}..../*********
3630: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3640: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3650: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3660: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3670: 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
3680: 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 55  ******** Begin U
3690: 6e 69 71 75 65 20 46 69 6c 65 20 49 44 20 55 74  nique File ID Ut
36a0: 69 6c 69 74 79 20 55 73 65 64 20 42 79 20 56 78  ility Used By Vx
36b0: 57 6f 72 6b 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  Works **********
36c0: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4f 6e 20 6d  *****.**.** On m
36d0: 6f 73 74 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  ost versions of 
36e0: 75 6e 69 78 2c 20 77 65 20 63 61 6e 20 67 65 74  unix, we can get
36f0: 20 61 20 75 6e 69 71 75 65 20 49 44 20 66 6f 72   a unique ID for
3700: 20 61 20 66 69 6c 65 20 62 79 20 63 6f 6e 63 61   a file by conca
3710: 74 65 6e 61 74 69 6e 67 0a 2a 2a 20 74 68 65 20  tenating.** the 
3720: 64 65 76 69 63 65 20 6e 75 6d 62 65 72 20 61 6e  device number an
3730: 64 20 74 68 65 20 69 6e 6f 64 65 20 6e 75 6d 62  d the inode numb
3740: 65 72 2e 20 20 42 75 74 20 74 68 69 73 20 64 6f  er.  But this do
3750: 65 73 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 56  es not work on V
3760: 78 57 6f 72 6b 73 2e 0a 2a 2a 20 4f 6e 20 56 78  xWorks..** On Vx
3770: 57 6f 72 6b 73 2c 20 61 20 75 6e 69 71 75 65 20  Works, a unique 
3780: 66 69 6c 65 20 69 64 20 6d 75 73 74 20 62 65 20  file id must be 
3790: 62 61 73 65 64 20 6f 6e 20 74 68 65 20 63 61 6e  based on the can
37a0: 6f 6e 69 63 61 6c 20 66 69 6c 65 6e 61 6d 65 2e  onical filename.
37b0: 0a 2a 2a 0a 2a 2a 20 41 20 70 6f 69 6e 74 65 72  .**.** A pointer
37c0: 20 74 6f 20 61 6e 20 69 6e 73 74 61 6e 63 65 20   to an instance 
37d0: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
37e0: 20 73 74 72 75 63 74 75 72 65 20 63 61 6e 20 62   structure can b
37f0: 65 20 75 73 65 64 20 61 73 20 61 0a 2a 2a 20 75  e used as a.** u
3800: 6e 69 71 75 65 20 66 69 6c 65 20 49 44 20 69 6e  nique file ID in
3810: 20 56 78 57 6f 72 6b 73 2e 20 20 45 61 63 68 20   VxWorks.  Each 
3820: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73  instance of this
3830: 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61   structure conta
3840: 69 6e 73 0a 2a 2a 20 61 20 63 6f 70 79 20 6f 66  ins.** a copy of
3850: 20 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c 20 66   the canonical f
3860: 69 6c 65 6e 61 6d 65 2e 20 20 54 68 65 72 65 20  ilename.  There 
3870: 69 73 20 61 6c 73 6f 20 61 20 72 65 66 65 72 65  is also a refere
3880: 6e 63 65 20 63 6f 75 6e 74 2e 20 20 0a 2a 2a 20  nce count.  .** 
3890: 54 68 65 20 73 74 72 75 63 74 75 72 65 20 69 73  The structure is
38a0: 20 72 65 63 6c 61 69 6d 65 64 20 77 68 65 6e 20   reclaimed when 
38b0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 6f  the number of po
38c0: 69 6e 74 65 72 73 20 74 6f 20 69 74 20 64 72 6f  inters to it dro
38d0: 70 73 20 74 6f 0a 2a 2a 20 7a 65 72 6f 2e 0a 2a  ps to.** zero..*
38e0: 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20 6e  *.** There are n
38f0: 65 76 65 72 20 76 65 72 79 20 6d 61 6e 79 20 66  ever very many f
3900: 69 6c 65 73 20 6f 70 65 6e 20 61 74 20 6f 6e 65  iles open at one
3910: 20 74 69 6d 65 20 61 6e 64 20 6c 6f 6f 6b 75 70   time and lookup
3920: 73 20 61 72 65 20 6e 6f 74 0a 2a 2a 20 61 20 70  s are not.** a p
3930: 65 72 66 6f 72 6d 61 6e 63 65 2d 63 72 69 74 69  erformance-criti
3940: 63 61 6c 20 70 61 74 68 2c 20 73 6f 20 69 74 20  cal path, so it 
3950: 69 73 20 73 75 66 66 69 63 69 65 6e 74 20 74 6f  is sufficient to
3960: 20 70 75 74 20 74 68 65 73 65 0a 2a 2a 20 73 74   put these.** st
3970: 72 75 63 74 75 72 65 73 20 6f 6e 20 61 20 6c 69  ructures on a li
3980: 6e 6b 65 64 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74  nked list..*/.st
3990: 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65  ruct vxworksFile
39a0: 49 64 20 7b 0a 20 20 73 74 72 75 63 74 20 76 78  Id {.  struct vx
39b0: 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 4e 65  worksFileId *pNe
39c0: 78 74 3b 20 20 2f 2a 20 4e 65 78 74 20 69 6e 20  xt;  /* Next in 
39d0: 61 20 6c 69 73 74 20 6f 66 20 74 68 65 6d 20 61  a list of them a
39e0: 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66  ll */.  int nRef
39f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3a00: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
3a10: 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  of references to
3a20: 20 74 68 69 73 20 6f 6e 65 20 2a 2f 0a 20 20 69   this one */.  i
3a30: 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20  nt nName;       
3a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3a50: 4c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 7a 43  Length of the zC
3a60: 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 5b 5d 20 73  anonicalName[] s
3a70: 74 72 69 6e 67 20 2a 2f 0a 20 20 63 68 61 72 20  tring */.  char 
3a80: 2a 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 3b  *zCanonicalName;
3a90: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61 6e 6f           /* Cano
3aa0: 6e 69 63 61 6c 20 66 69 6c 65 6e 61 6d 65 20 2a  nical filename *
3ab0: 2f 0a 7d 3b 0a 0a 23 69 66 20 4f 53 5f 56 58 57  /.};..#if OS_VXW
3ac0: 4f 52 4b 53 0a 2f 2a 20 0a 2a 2a 20 41 6c 6c 20  ORKS./* .** All 
3ad0: 75 6e 69 71 75 65 20 66 69 6c 65 6e 61 6d 65 73  unique filenames
3ae0: 20 61 72 65 20 68 65 6c 64 20 6f 6e 20 61 20 6c   are held on a l
3af0: 69 6e 6b 65 64 20 6c 69 73 74 20 68 65 61 64 65  inked list heade
3b00: 64 20 62 79 20 74 68 69 73 0a 2a 2a 20 76 61 72  d by this.** var
3b10: 69 61 62 6c 65 3a 0a 2a 2f 0a 73 74 61 74 69 63  iable:.*/.static
3b20: 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46   struct vxworksF
3b30: 69 6c 65 49 64 20 2a 76 78 77 6f 72 6b 73 46 69  ileId *vxworksFi
3b40: 6c 65 4c 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a 0a  leList = 0;../*.
3b50: 2a 2a 20 53 69 6d 70 6c 69 66 79 20 61 20 66 69  ** Simplify a fi
3b60: 6c 65 6e 61 6d 65 20 69 6e 74 6f 20 69 74 73 20  lename into its 
3b70: 63 61 6e 6f 6e 69 63 61 6c 20 66 6f 72 6d 0a 2a  canonical form.*
3b80: 2a 20 62 79 20 6d 61 6b 69 6e 67 20 74 68 65 20  * by making the 
3b90: 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 6e 67 65  following change
3ba0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 2a 20 72 65 6d 6f  s:.**.**  * remo
3bb0: 76 69 6e 67 20 61 6e 79 20 74 72 61 69 6c 69 6e  ving any trailin
3bc0: 67 20 61 6e 64 20 64 75 70 6c 69 63 61 74 65 20  g and duplicate 
3bd0: 2f 0a 2a 2a 20 20 2a 20 63 6f 6e 76 65 72 74 20  /.**  * convert 
3be0: 2f 2e 2f 20 69 6e 74 6f 20 6a 75 73 74 20 2f 0a  /./ into just /.
3bf0: 2a 2a 20 20 2a 20 63 6f 6e 76 65 72 74 20 2f 41  **  * convert /A
3c00: 2f 2e 2e 2f 20 77 68 65 72 65 20 41 20 69 73 20  /../ where A is 
3c10: 61 6e 79 20 73 69 6d 70 6c 65 20 6e 61 6d 65 20  any simple name 
3c20: 69 6e 74 6f 20 6a 75 73 74 20 2f 0a 2a 2a 0a 2a  into just /.**.*
3c30: 2a 20 43 68 61 6e 67 65 73 20 61 72 65 20 6d 61  * Changes are ma
3c40: 64 65 20 69 6e 2d 70 6c 61 63 65 2e 20 20 52 65  de in-place.  Re
3c50: 74 75 72 6e 20 74 68 65 20 6e 65 77 20 6e 61 6d  turn the new nam
3c60: 65 20 6c 65 6e 67 74 68 2e 0a 2a 2a 0a 2a 2a 20  e length..**.** 
3c70: 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c  The original fil
3c80: 65 6e 61 6d 65 20 69 73 20 69 6e 20 7a 5b 30 2e  ename is in z[0.
3c90: 2e 6e 2d 31 5d 2e 20 20 52 65 74 75 72 6e 20 74  .n-1].  Return t
3ca0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  he number of.** 
3cb0: 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 74 68  characters in th
3cc0: 65 20 73 69 6d 70 6c 69 66 69 65 64 20 6e 61 6d  e simplified nam
3cd0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
3ce0: 20 76 78 77 6f 72 6b 73 53 69 6d 70 6c 69 66 79   vxworksSimplify
3cf0: 4e 61 6d 65 28 63 68 61 72 20 2a 7a 2c 20 69 6e  Name(char *z, in
3d00: 74 20 6e 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a  t n){.  int i, j
3d10: 3b 0a 20 20 77 68 69 6c 65 28 20 6e 3e 31 20 26  ;.  while( n>1 &
3d20: 26 20 7a 5b 6e 2d 31 5d 3d 3d 27 2f 27 20 29 7b  & z[n-1]=='/' ){
3d30: 20 6e 2d 2d 3b 20 7d 0a 20 20 66 6f 72 28 69 3d   n--; }.  for(i=
3d40: 6a 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a  j=0; i<n; i++){.
3d50: 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 2f      if( z[i]=='/
3d60: 27 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 7a  ' ){.      if( z
3d70: 5b 69 2b 31 5d 3d 3d 27 2f 27 20 29 20 63 6f 6e  [i+1]=='/' ) con
3d80: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28  tinue;.      if(
3d90: 20 7a 5b 69 2b 31 5d 3d 3d 27 2e 27 20 26 26 20   z[i+1]=='.' && 
3da0: 69 2b 32 3c 6e 20 26 26 20 7a 5b 69 2b 32 5d 3d  i+2<n && z[i+2]=
3db0: 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='/' ){.        
3dc0: 69 20 2b 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  i += 1;.        
3dd0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
3de0: 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2b  }.      if( z[i+
3df0: 31 5d 3d 3d 27 2e 27 20 26 26 20 69 2b 33 3c 6e  1]=='.' && i+3<n
3e00: 20 26 26 20 7a 5b 69 2b 32 5d 3d 3d 27 2e 27 20   && z[i+2]=='.' 
3e10: 26 26 20 7a 5b 69 2b 33 5d 3d 3d 27 2f 27 20 29  && z[i+3]=='/' )
3e20: 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  {.        while(
3e30: 20 6a 3e 30 20 26 26 20 7a 5b 6a 2d 31 5d 21 3d   j>0 && z[j-1]!=
3e40: 27 2f 27 20 29 7b 20 6a 2d 2d 3b 20 7d 0a 20 20  '/' ){ j--; }.  
3e50: 20 20 20 20 20 20 69 66 28 20 6a 3e 30 20 29 7b        if( j>0 ){
3e60: 20 6a 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 20 20   j--; }.        
3e70: 69 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 20 20  i += 2;.        
3e80: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
3e90: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 5b 6a 2b  }.    }.    z[j+
3ea0: 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a 20 20 7d 0a 20  +] = z[i];.  }. 
3eb0: 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20 72 65 74   z[j] = 0;.  ret
3ec0: 75 72 6e 20 6a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn j;.}../*.** 
3ed0: 46 69 6e 64 20 61 20 75 6e 69 71 75 65 20 66 69  Find a unique fi
3ee0: 6c 65 20 49 44 20 66 6f 72 20 74 68 65 20 67 69  le ID for the gi
3ef0: 76 65 6e 20 61 62 73 6f 6c 75 74 65 20 70 61 74  ven absolute pat
3f00: 68 6e 61 6d 65 2e 20 20 52 65 74 75 72 6e 0a 2a  hname.  Return.*
3f10: 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  * a pointer to t
3f20: 68 65 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64  he vxworksFileId
3f30: 20 6f 62 6a 65 63 74 2e 20 20 54 68 69 73 20 70   object.  This p
3f40: 6f 69 6e 74 65 72 20 69 73 20 74 68 65 20 75 6e  ointer is the un
3f50: 69 71 75 65 0a 2a 2a 20 66 69 6c 65 20 49 44 2e  ique.** file ID.
3f60: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 52 65 66 20  .**.** The nRef 
3f70: 66 69 65 6c 64 20 6f 66 20 74 68 65 20 76 78 77  field of the vxw
3f80: 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65 63  orksFileId objec
3f90: 74 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64  t is incremented
3fa0: 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20 6f   before.** the o
3fb0: 62 6a 65 63 74 20 69 73 20 72 65 74 75 72 6e 65  bject is returne
3fc0: 64 2e 20 20 41 20 6e 65 77 20 76 78 77 6f 72 6b  d.  A new vxwork
3fd0: 73 46 69 6c 65 49 64 20 6f 62 6a 65 63 74 20 69  sFileId object i
3fe0: 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64  s created.** and
3ff0: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 67 6c   added to the gl
4000: 6f 62 61 6c 20 6c 69 73 74 20 69 66 20 6e 65 63  obal list if nec
4010: 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66  essary..**.** If
4020: 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61   a memory alloca
4030: 74 69 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  tion error occur
4040: 73 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a  s, return NULL..
4050: 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74  */.static struct
4060: 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a   vxworksFileId *
4070: 76 78 77 6f 72 6b 73 46 69 6e 64 46 69 6c 65 49  vxworksFindFileI
4080: 64 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41  d(const char *zA
4090: 62 73 6f 6c 75 74 65 4e 61 6d 65 29 7b 0a 20 20  bsoluteName){.  
40a0: 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69  struct vxworksFi
40b0: 6c 65 49 64 20 2a 70 4e 65 77 3b 20 20 20 20 20  leId *pNew;     
40c0: 20 20 20 20 2f 2a 20 73 65 61 72 63 68 20 6b 65      /* search ke
40d0: 79 20 61 6e 64 20 6e 65 77 20 66 69 6c 65 20 49  y and new file I
40e0: 44 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 76 78  D */.  struct vx
40f0: 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 43 61  worksFileId *pCa
4100: 6e 64 69 64 61 74 65 3b 20 20 20 2f 2a 20 46 6f  ndidate;   /* Fo
4110: 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 65  r looping over e
4120: 78 69 73 74 69 6e 67 20 66 69 6c 65 20 49 44 73  xisting file IDs
4130: 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20   */.  int n;    
4140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4150: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e            /* Len
4160: 67 74 68 20 6f 66 20 7a 41 62 73 6f 6c 75 74 65  gth of zAbsolute
4170: 4e 61 6d 65 20 73 74 72 69 6e 67 20 2a 2f 0a 0a  Name string */..
4180: 20 20 61 73 73 65 72 74 28 20 7a 41 62 73 6f 6c    assert( zAbsol
4190: 75 74 65 4e 61 6d 65 5b 30 5d 3d 3d 27 2f 27 20  uteName[0]=='/' 
41a0: 29 3b 0a 20 20 6e 20 3d 20 28 69 6e 74 29 73 74  );.  n = (int)st
41b0: 72 6c 65 6e 28 7a 41 62 73 6f 6c 75 74 65 4e 61  rlen(zAbsoluteNa
41c0: 6d 65 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71  me);.  pNew = sq
41d0: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69  lite3_malloc( si
41e0: 7a 65 6f 66 28 2a 70 4e 65 77 29 20 2b 20 28 6e  zeof(*pNew) + (n
41f0: 2b 31 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65  +1) );.  if( pNe
4200: 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  w==0 ) return 0;
4210: 0a 20 20 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69  .  pNew->zCanoni
4220: 63 61 6c 4e 61 6d 65 20 3d 20 28 63 68 61 72 2a  calName = (char*
4230: 29 26 70 4e 65 77 5b 31 5d 3b 0a 20 20 6d 65 6d  )&pNew[1];.  mem
4240: 63 70 79 28 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e  cpy(pNew->zCanon
4250: 69 63 61 6c 4e 61 6d 65 2c 20 7a 41 62 73 6f 6c  icalName, zAbsol
4260: 75 74 65 4e 61 6d 65 2c 20 6e 2b 31 29 3b 0a 20  uteName, n+1);. 
4270: 20 6e 20 3d 20 76 78 77 6f 72 6b 73 53 69 6d 70   n = vxworksSimp
4280: 6c 69 66 79 4e 61 6d 65 28 70 4e 65 77 2d 3e 7a  lifyName(pNew->z
4290: 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20 6e  CanonicalName, n
42a0: 29 3b 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68 20  );..  /* Search 
42b0: 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e 67 20  for an existing 
42c0: 65 6e 74 72 79 20 74 68 61 74 20 6d 61 74 63 68  entry that match
42d0: 69 6e 67 20 74 68 65 20 63 61 6e 6f 6e 69 63 61  ing the canonica
42e0: 6c 20 6e 61 6d 65 2e 0a 20 20 2a 2a 20 49 66 20  l name..  ** If 
42f0: 66 6f 75 6e 64 2c 20 69 6e 63 72 65 6d 65 6e 74  found, increment
4300: 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63   the reference c
4310: 6f 75 6e 74 20 61 6e 64 20 72 65 74 75 72 6e 20  ount and return 
4320: 61 20 70 6f 69 6e 74 65 72 20 74 6f 0a 20 20 2a  a pointer to.  *
4330: 2a 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 66  * the existing f
4340: 69 6c 65 20 49 44 2e 0a 20 20 2a 2f 0a 20 20 75  ile ID..  */.  u
4350: 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
4360: 0a 20 20 66 6f 72 28 70 43 61 6e 64 69 64 61 74  .  for(pCandidat
4370: 65 3d 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73  e=vxworksFileLis
4380: 74 3b 20 70 43 61 6e 64 69 64 61 74 65 3b 20 70  t; pCandidate; p
4390: 43 61 6e 64 69 64 61 74 65 3d 70 43 61 6e 64 69  Candidate=pCandi
43a0: 64 61 74 65 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  date->pNext){.  
43b0: 20 20 69 66 28 20 70 43 61 6e 64 69 64 61 74 65    if( pCandidate
43c0: 2d 3e 6e 4e 61 6d 65 3d 3d 6e 20 0a 20 20 20 20  ->nName==n .    
43d0: 20 26 26 20 6d 65 6d 63 6d 70 28 70 43 61 6e 64   && memcmp(pCand
43e0: 69 64 61 74 65 2d 3e 7a 43 61 6e 6f 6e 69 63 61  idate->zCanonica
43f0: 6c 4e 61 6d 65 2c 20 70 4e 65 77 2d 3e 7a 43 61  lName, pNew->zCa
4400: 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20 6e 29 3d  nonicalName, n)=
4410: 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  =0.    ){.      
4420: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e   sqlite3_free(pN
4430: 65 77 29 3b 0a 20 20 20 20 20 20 20 70 43 61 6e  ew);.       pCan
4440: 64 69 64 61 74 65 2d 3e 6e 52 65 66 2b 2b 3b 0a  didate->nRef++;.
4450: 20 20 20 20 20 20 20 75 6e 69 78 4c 65 61 76 65         unixLeave
4460: 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 20 20 20  Mutex();.       
4470: 72 65 74 75 72 6e 20 70 43 61 6e 64 69 64 61 74  return pCandidat
4480: 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  e;.    }.  }..  
4490: 2f 2a 20 4e 6f 20 6d 61 74 63 68 20 77 61 73 20  /* No match was 
44a0: 66 6f 75 6e 64 2e 20 20 57 65 20 77 69 6c 6c 20  found.  We will 
44b0: 6d 61 6b 65 20 61 20 6e 65 77 20 66 69 6c 65 20  make a new file 
44c0: 49 44 20 2a 2f 0a 20 20 70 4e 65 77 2d 3e 6e 52  ID */.  pNew->nR
44d0: 65 66 20 3d 20 31 3b 0a 20 20 70 4e 65 77 2d 3e  ef = 1;.  pNew->
44e0: 6e 4e 61 6d 65 20 3d 20 6e 3b 0a 20 20 70 4e 65  nName = n;.  pNe
44f0: 77 2d 3e 70 4e 65 78 74 20 3d 20 76 78 77 6f 72  w->pNext = vxwor
4500: 6b 73 46 69 6c 65 4c 69 73 74 3b 0a 20 20 76 78  ksFileList;.  vx
4510: 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74 20 3d 20  worksFileList = 
4520: 70 4e 65 77 3b 0a 20 20 75 6e 69 78 4c 65 61 76  pNew;.  unixLeav
4530: 65 4d 75 74 65 78 28 29 3b 0a 20 20 72 65 74 75  eMutex();.  retu
4540: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pNew;.}../*.*
4550: 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20  * Decrement the 
4560: 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
4570: 6f 6e 20 61 20 76 78 77 6f 72 6b 73 46 69 6c 65  on a vxworksFile
4580: 49 64 20 6f 62 6a 65 63 74 2e 20 20 46 72 65 65  Id object.  Free
4590: 0a 2a 2a 20 74 68 65 20 6f 62 6a 65 63 74 20 77  .** the object w
45a0: 68 65 6e 20 74 68 65 20 72 65 66 65 72 65 6e 63  hen the referenc
45b0: 65 20 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20  e count reaches 
45c0: 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  zero..*/.static 
45d0: 76 6f 69 64 20 76 78 77 6f 72 6b 73 52 65 6c 65  void vxworksRele
45e0: 61 73 65 46 69 6c 65 49 64 28 73 74 72 75 63 74  aseFileId(struct
45f0: 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a   vxworksFileId *
4600: 70 49 64 29 7b 0a 20 20 75 6e 69 78 45 6e 74 65  pId){.  unixEnte
4610: 72 4d 75 74 65 78 28 29 3b 0a 20 20 61 73 73 65  rMutex();.  asse
4620: 72 74 28 20 70 49 64 2d 3e 6e 52 65 66 3e 30 20  rt( pId->nRef>0 
4630: 29 3b 0a 20 20 70 49 64 2d 3e 6e 52 65 66 2d 2d  );.  pId->nRef--
4640: 3b 0a 20 20 69 66 28 20 70 49 64 2d 3e 6e 52 65  ;.  if( pId->nRe
4650: 66 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 72 75  f==0 ){.    stru
4660: 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64  ct vxworksFileId
4670: 20 2a 2a 70 70 3b 0a 20 20 20 20 66 6f 72 28 70   **pp;.    for(p
4680: 70 3d 26 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69  p=&vxworksFileLi
4690: 73 74 3b 20 2a 70 70 20 26 26 20 2a 70 70 21 3d  st; *pp && *pp!=
46a0: 70 49 64 3b 20 70 70 20 3d 20 26 28 28 2a 70 70  pId; pp = &((*pp
46b0: 29 2d 3e 70 4e 65 78 74 29 29 7b 7d 0a 20 20 20  )->pNext)){}.   
46c0: 20 61 73 73 65 72 74 28 20 2a 70 70 3d 3d 70 49   assert( *pp==pI
46d0: 64 20 29 3b 0a 20 20 20 20 2a 70 70 20 3d 20 70  d );.    *pp = p
46e0: 49 64 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 73  Id->pNext;.    s
46f0: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49 64 29  qlite3_free(pId)
4700: 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 4c 65 61 76  ;.  }.  unixLeav
4710: 65 4d 75 74 65 78 28 29 3b 0a 7d 0a 23 65 6e 64  eMutex();.}.#end
4720: 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53  if /* OS_VXWORKS
4730: 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   */./***********
4740: 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 55 6e 69 71  **** End of Uniq
4750: 75 65 20 46 69 6c 65 20 49 44 20 55 74 69 6c 69  ue File ID Utili
4760: 74 79 20 55 73 65 64 20 42 79 20 56 78 57 6f 72  ty Used By VxWor
4770: 6b 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ks *************
4780: 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
4790: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
47a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
47b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
47c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
47d0: 2a 2a 2f 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  **/.../*********
47e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
47f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4800: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4810: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4820: 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
4830: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4840: 2a 20 50 6f 73 69 78 20 41 64 76 69 73 6f 72 79  * Posix Advisory
4850: 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a   Locking *******
4860: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4870: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 50 4f 53 49  *****.**.** POSI
4880: 58 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73  X advisory locks
4890: 20 61 72 65 20 62 72 6f 6b 65 6e 20 62 79 20 64   are broken by d
48a0: 65 73 69 67 6e 2e 20 20 41 4e 53 49 20 53 54 44  esign.  ANSI STD
48b0: 20 31 30 30 33 2e 31 20 28 31 39 39 36 29 0a 2a   1003.1 (1996).*
48c0: 2a 20 73 65 63 74 69 6f 6e 20 36 2e 35 2e 32 2e  * section 6.5.2.
48d0: 32 20 6c 69 6e 65 73 20 34 38 33 20 74 68 72 6f  2 lines 483 thro
48e0: 75 67 68 20 34 39 30 20 73 70 65 63 69 66 79 20  ugh 490 specify 
48f0: 74 68 61 74 20 77 68 65 6e 20 61 20 70 72 6f 63  that when a proc
4900: 65 73 73 0a 2a 2a 20 73 65 74 73 20 6f 72 20 63  ess.** sets or c
4910: 6c 65 61 72 73 20 61 20 6c 6f 63 6b 2c 20 74 68  lears a lock, th
4920: 61 74 20 6f 70 65 72 61 74 69 6f 6e 20 6f 76 65  at operation ove
4930: 72 72 69 64 65 73 20 61 6e 79 20 70 72 69 6f 72  rrides any prior
4940: 20 6c 6f 63 6b 73 20 73 65 74 0a 2a 2a 20 62 79   locks set.** by
4950: 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73   the same proces
4960: 73 2e 20 20 49 74 20 64 6f 65 73 20 6e 6f 74 20  s.  It does not 
4970: 65 78 70 6c 69 63 69 74 6c 79 20 73 61 79 20 73  explicitly say s
4980: 6f 2c 20 62 75 74 20 74 68 69 73 20 69 6d 70 6c  o, but this impl
4990: 69 65 73 0a 2a 2a 20 74 68 61 74 20 69 74 20 6f  ies.** that it o
49a0: 76 65 72 72 69 64 65 73 20 6c 6f 63 6b 73 20 73  verrides locks s
49b0: 65 74 20 62 79 20 74 68 65 20 73 61 6d 65 20 70  et by the same p
49c0: 72 6f 63 65 73 73 20 75 73 69 6e 67 20 61 20 64  rocess using a d
49d0: 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66 69 6c 65  ifferent.** file
49e0: 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 43 6f   descriptor.  Co
49f0: 6e 73 69 64 65 72 20 74 68 69 73 20 74 65 73 74  nsider this test
4a00: 20 63 61 73 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   case:.**.**    
4a10: 20 20 20 69 6e 74 20 66 64 31 20 3d 20 6f 70 65     int fd1 = ope
4a20: 6e 28 22 2e 2f 66 69 6c 65 31 22 2c 20 4f 5f 52  n("./file1", O_R
4a30: 44 57 52 7c 4f 5f 43 52 45 41 54 2c 20 30 36 34  DWR|O_CREAT, 064
4a40: 34 29 3b 0a 2a 2a 20 20 20 20 20 20 20 69 6e 74  4);.**       int
4a50: 20 66 64 32 20 3d 20 6f 70 65 6e 28 22 2e 2f 66   fd2 = open("./f
4a60: 69 6c 65 32 22 2c 20 4f 5f 52 44 57 52 7c 4f 5f  ile2", O_RDWR|O_
4a70: 43 52 45 41 54 2c 20 30 36 34 34 29 3b 0a 2a 2a  CREAT, 0644);.**
4a80: 0a 2a 2a 20 53 75 70 70 6f 73 65 20 2e 2f 66 69  .** Suppose ./fi
4a90: 6c 65 31 20 61 6e 64 20 2e 2f 66 69 6c 65 32 20  le1 and ./file2 
4aa0: 61 72 65 20 72 65 61 6c 6c 79 20 74 68 65 20 73  are really the s
4ab0: 61 6d 65 20 66 69 6c 65 20 28 62 65 63 61 75 73  ame file (becaus
4ac0: 65 0a 2a 2a 20 6f 6e 65 20 69 73 20 61 20 68 61  e.** one is a ha
4ad0: 72 64 20 6f 72 20 73 79 6d 62 6f 6c 69 63 20 6c  rd or symbolic l
4ae0: 69 6e 6b 20 74 6f 20 74 68 65 20 6f 74 68 65 72  ink to the other
4af0: 29 20 74 68 65 6e 20 69 66 20 79 6f 75 20 73 65  ) then if you se
4b00: 74 0a 2a 2a 20 61 6e 20 65 78 63 6c 75 73 69 76  t.** an exclusiv
4b10: 65 20 6c 6f 63 6b 20 6f 6e 20 66 64 31 2c 20 74  e lock on fd1, t
4b20: 68 65 6e 20 74 72 79 20 74 6f 20 67 65 74 20 61  hen try to get a
4b30: 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
4b40: 0a 2a 2a 20 6f 6e 20 66 64 32 2c 20 69 74 20 77  .** on fd2, it w
4b50: 6f 72 6b 73 2e 20 20 49 20 77 6f 75 6c 64 20 68  orks.  I would h
4b60: 61 76 65 20 65 78 70 65 63 74 65 64 20 74 68 65  ave expected the
4b70: 20 73 65 63 6f 6e 64 20 6c 6f 63 6b 20 74 6f 0a   second lock to.
4b80: 2a 2a 20 66 61 69 6c 20 73 69 6e 63 65 20 74 68  ** fail since th
4b90: 65 72 65 20 77 61 73 20 61 6c 72 65 61 64 79 20  ere was already 
4ba0: 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69  a lock on the fi
4bb0: 6c 65 20 64 75 65 20 74 6f 20 66 64 31 2e 0a 2a  le due to fd1..*
4bc0: 2a 20 42 75 74 20 6e 6f 74 20 73 6f 2e 20 20 53  * But not so.  S
4bd0: 69 6e 63 65 20 62 6f 74 68 20 6c 6f 63 6b 73 20  ince both locks 
4be0: 63 61 6d 65 20 66 72 6f 6d 20 74 68 65 20 73 61  came from the sa
4bf0: 6d 65 20 70 72 6f 63 65 73 73 2c 20 74 68 65 0a  me process, the.
4c00: 2a 2a 20 73 65 63 6f 6e 64 20 6f 76 65 72 72 69  ** second overri
4c10: 64 65 73 20 74 68 65 20 66 69 72 73 74 2c 20 65  des the first, e
4c20: 76 65 6e 20 74 68 6f 75 67 68 20 74 68 65 79 20  ven though they 
4c30: 77 65 72 65 20 6f 6e 20 64 69 66 66 65 72 65 6e  were on differen
4c40: 74 0a 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69  t.** file descri
4c50: 70 74 6f 72 73 20 6f 70 65 6e 65 64 20 6f 6e 20  ptors opened on 
4c60: 64 69 66 66 65 72 65 6e 74 20 66 69 6c 65 20 6e  different file n
4c70: 61 6d 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ames..**.** This
4c80: 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 63   means that we c
4c90: 61 6e 6e 6f 74 20 75 73 65 20 50 4f 53 49 58 20  annot use POSIX 
4ca0: 6c 6f 63 6b 73 20 74 6f 20 73 79 6e 63 68 72 6f  locks to synchro
4cb0: 6e 69 7a 65 20 66 69 6c 65 20 61 63 63 65 73 73  nize file access
4cc0: 0a 2a 2a 20 61 6d 6f 6e 67 20 63 6f 6d 70 65 74  .** among compet
4cd0: 69 6e 67 20 74 68 72 65 61 64 73 20 6f 66 20 74  ing threads of t
4ce0: 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 2e  he same process.
4cf0: 20 20 50 4f 53 49 58 20 6c 6f 63 6b 73 20 77 69    POSIX locks wi
4d00: 6c 6c 20 77 6f 72 6b 20 66 69 6e 65 0a 2a 2a 20  ll work fine.** 
4d10: 74 6f 20 73 79 6e 63 68 72 6f 6e 69 7a 65 20 61  to synchronize a
4d20: 63 63 65 73 73 20 66 6f 72 20 74 68 72 65 61 64  ccess for thread
4d30: 73 20 69 6e 20 73 65 70 61 72 61 74 65 20 70 72  s in separate pr
4d40: 6f 63 65 73 73 65 73 2c 20 62 75 74 20 6e 6f 74  ocesses, but not
4d50: 0a 2a 2a 20 74 68 72 65 61 64 73 20 77 69 74 68  .** threads with
4d60: 69 6e 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63  in the same proc
4d70: 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 77 6f  ess..**.** To wo
4d80: 72 6b 20 61 72 6f 75 6e 64 20 74 68 65 20 70 72  rk around the pr
4d90: 6f 62 6c 65 6d 2c 20 53 51 4c 69 74 65 20 68 61  oblem, SQLite ha
4da0: 73 20 74 6f 20 6d 61 6e 61 67 65 20 66 69 6c 65  s to manage file
4db0: 20 6c 6f 63 6b 73 20 69 6e 74 65 72 6e 61 6c 6c   locks internall
4dc0: 79 0a 2a 2a 20 6f 6e 20 69 74 73 20 6f 77 6e 2e  y.** on its own.
4dd0: 20 20 57 68 65 6e 65 76 65 72 20 61 20 6e 65 77    Whenever a new
4de0: 20 64 61 74 61 62 61 73 65 20 69 73 20 6f 70 65   database is ope
4df0: 6e 65 64 2c 20 77 65 20 68 61 76 65 20 74 6f 20  ned, we have to 
4e00: 66 69 6e 64 20 74 68 65 0a 2a 2a 20 73 70 65 63  find the.** spec
4e10: 69 66 69 63 20 69 6e 6f 64 65 20 6f 66 20 74 68  ific inode of th
4e20: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
4e30: 28 74 68 65 20 69 6e 6f 64 65 20 69 73 20 64 65  (the inode is de
4e40: 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 0a  termined by the.
4e50: 2a 2a 20 73 74 5f 64 65 76 20 61 6e 64 20 73 74  ** st_dev and st
4e60: 5f 69 6e 6f 20 66 69 65 6c 64 73 20 6f 66 20 74  _ino fields of t
4e70: 68 65 20 73 74 61 74 20 73 74 72 75 63 74 75 72  he stat structur
4e80: 65 20 74 68 61 74 20 66 73 74 61 74 28 29 20 66  e that fstat() f
4e90: 69 6c 6c 73 20 69 6e 29 0a 2a 2a 20 61 6e 64 20  ills in).** and 
4ea0: 63 68 65 63 6b 20 66 6f 72 20 6c 6f 63 6b 73 20  check for locks 
4eb0: 61 6c 72 65 61 64 79 20 65 78 69 73 74 69 6e 67  already existing
4ec0: 20 6f 6e 20 74 68 61 74 20 69 6e 6f 64 65 2e 20   on that inode. 
4ed0: 20 57 68 65 6e 20 6c 6f 63 6b 73 20 61 72 65 0a   When locks are.
4ee0: 2a 2a 20 63 72 65 61 74 65 64 20 6f 72 20 72 65  ** created or re
4ef0: 6d 6f 76 65 64 2c 20 77 65 20 68 61 76 65 20 74  moved, we have t
4f00: 6f 20 6c 6f 6f 6b 20 61 74 20 6f 75 72 20 6f 77  o look at our ow
4f10: 6e 20 69 6e 74 65 72 6e 61 6c 20 72 65 63 6f 72  n internal recor
4f20: 64 20 6f 66 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b  d of the.** lock
4f30: 73 20 74 6f 20 73 65 65 20 69 66 20 61 6e 6f 74  s to see if anot
4f40: 68 65 72 20 74 68 72 65 61 64 20 68 61 73 20 70  her thread has p
4f50: 72 65 76 69 6f 75 73 6c 79 20 73 65 74 20 61 20  reviously set a 
4f60: 6c 6f 63 6b 20 6f 6e 20 74 68 61 74 20 73 61 6d  lock on that sam
4f70: 65 0a 2a 2a 20 69 6e 6f 64 65 2e 0a 2a 2a 0a 2a  e.** inode..**.*
4f80: 2a 20 28 41 73 69 64 65 3a 20 54 68 65 20 75 73  * (Aside: The us
4f90: 65 20 6f 66 20 69 6e 6f 64 65 20 6e 75 6d 62 65  e of inode numbe
4fa0: 72 73 20 61 73 20 75 6e 69 71 75 65 20 49 44 73  rs as unique IDs
4fb0: 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 6f   does not work o
4fc0: 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a 20 46 6f  n VxWorks..** Fo
4fd0: 72 20 56 78 57 6f 72 6b 73 2c 20 77 65 20 68 61  r VxWorks, we ha
4fe0: 76 65 20 74 6f 20 75 73 65 20 74 68 65 20 61 6c  ve to use the al
4ff0: 74 65 72 6e 61 74 69 76 65 20 75 6e 69 71 75 65  ternative unique
5000: 20 49 44 20 73 79 73 74 65 6d 20 62 61 73 65 64   ID system based
5010: 20 6f 6e 0a 2a 2a 20 63 61 6e 6f 6e 69 63 61 6c   on.** canonical
5020: 20 66 69 6c 65 6e 61 6d 65 20 61 6e 64 20 69 6d   filename and im
5030: 70 6c 65 6d 65 6e 74 65 64 20 69 6e 20 74 68 65  plemented in the
5040: 20 70 72 65 76 69 6f 75 73 20 64 69 76 69 73 69   previous divisi
5050: 6f 6e 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  on.).**.** The s
5060: 71 6c 69 74 65 33 5f 66 69 6c 65 20 73 74 72 75  qlite3_file stru
5070: 63 74 75 72 65 20 66 6f 72 20 50 4f 53 49 58 20  cture for POSIX 
5080: 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6a 75 73  is no longer jus
5090: 74 20 61 6e 20 69 6e 74 65 67 65 72 20 66 69 6c  t an integer fil
50a0: 65 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 2e  e.** descriptor.
50b0: 20 20 49 74 20 69 73 20 6e 6f 77 20 61 20 73 74    It is now a st
50c0: 72 75 63 74 75 72 65 20 74 68 61 74 20 68 6f 6c  ructure that hol
50d0: 64 73 20 74 68 65 20 69 6e 74 65 67 65 72 20 66  ds the integer f
50e0: 69 6c 65 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f  ile.** descripto
50f0: 72 20 61 6e 64 20 61 20 70 6f 69 6e 74 65 72 20  r and a pointer 
5100: 74 6f 20 61 20 73 74 72 75 63 74 75 72 65 20 74  to a structure t
5110: 68 61 74 20 64 65 73 63 72 69 62 65 73 20 74 68  hat describes th
5120: 65 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a 20 6c 6f  e internal.** lo
5130: 63 6b 73 20 6f 6e 20 74 68 65 20 63 6f 72 72 65  cks on the corre
5140: 73 70 6f 6e 64 69 6e 67 20 69 6e 6f 64 65 2e 20  sponding inode. 
5150: 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 6c 6f   There is one lo
5160: 63 6b 69 6e 67 20 73 74 72 75 63 74 75 72 65 0a  cking structure.
5170: 2a 2a 20 70 65 72 20 69 6e 6f 64 65 2c 20 73 6f  ** per inode, so
5180: 20 69 66 20 74 68 65 20 73 61 6d 65 20 69 6e 6f   if the same ino
5190: 64 65 20 69 73 20 6f 70 65 6e 65 64 20 74 77 69  de is opened twi
51a0: 63 65 2c 20 62 6f 74 68 20 75 6e 69 78 46 69 6c  ce, both unixFil
51b0: 65 20 73 74 72 75 63 74 75 72 65 73 0a 2a 2a 20  e structures.** 
51c0: 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 73 61 6d  point to the sam
51d0: 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63 74  e locking struct
51e0: 75 72 65 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e  ure.  The lockin
51f0: 67 20 73 74 72 75 63 74 75 72 65 20 6b 65 65 70  g structure keep
5200: 73 0a 2a 2a 20 61 20 72 65 66 65 72 65 6e 63 65  s.** a reference
5210: 20 63 6f 75 6e 74 20 28 73 6f 20 77 65 20 77 69   count (so we wi
5220: 6c 6c 20 6b 6e 6f 77 20 77 68 65 6e 20 74 6f 20  ll know when to 
5230: 64 65 6c 65 74 65 20 69 74 29 20 61 6e 64 20 61  delete it) and a
5240: 20 22 63 6e 74 22 0a 2a 2a 20 66 69 65 6c 64 20   "cnt".** field 
5250: 74 68 61 74 20 74 65 6c 6c 73 20 75 73 20 69 74  that tells us it
5260: 73 20 69 6e 74 65 72 6e 61 6c 20 6c 6f 63 6b 20  s internal lock 
5270: 73 74 61 74 75 73 2e 20 20 63 6e 74 3d 3d 30 20  status.  cnt==0 
5280: 6d 65 61 6e 73 20 74 68 65 0a 2a 2a 20 66 69 6c  means the.** fil
5290: 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 2e 20 20  e is unlocked.  
52a0: 63 6e 74 3d 3d 2d 31 20 6d 65 61 6e 73 20 74 68  cnt==-1 means th
52b0: 65 20 66 69 6c 65 20 68 61 73 20 61 6e 20 65 78  e file has an ex
52c0: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e 0a 2a 2a  clusive lock..**
52d0: 20 63 6e 74 3e 30 20 6d 65 61 6e 73 20 74 68 65   cnt>0 means the
52e0: 72 65 20 61 72 65 20 63 6e 74 20 73 68 61 72 65  re are cnt share
52f0: 64 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 20 66  d locks on the f
5300: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 61  ile..**.** Any a
5310: 74 74 65 6d 70 74 20 74 6f 20 6c 6f 63 6b 20 6f  ttempt to lock o
5320: 72 20 75 6e 6c 6f 63 6b 20 61 20 66 69 6c 65 20  r unlock a file 
5330: 66 69 72 73 74 20 63 68 65 63 6b 73 20 74 68 65  first checks the
5340: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73 74 72 75   locking.** stru
5350: 63 74 75 72 65 2e 20 20 54 68 65 20 66 63 6e 74  cture.  The fcnt
5360: 6c 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  l() system call 
5370: 69 73 20 6f 6e 6c 79 20 69 6e 76 6f 6b 65 64 20  is only invoked 
5380: 74 6f 20 73 65 74 20 61 20 0a 2a 2a 20 50 4f 53  to set a .** POS
5390: 49 58 20 6c 6f 63 6b 20 69 66 20 74 68 65 20 69  IX lock if the i
53a0: 6e 74 65 72 6e 61 6c 20 6c 6f 63 6b 20 73 74 72  nternal lock str
53b0: 75 63 74 75 72 65 20 74 72 61 6e 73 69 74 69 6f  ucture transitio
53c0: 6e 73 20 62 65 74 77 65 65 6e 0a 2a 2a 20 61 20  ns between.** a 
53d0: 6c 6f 63 6b 65 64 20 61 6e 64 20 61 6e 20 75 6e  locked and an un
53e0: 6c 6f 63 6b 65 64 20 73 74 61 74 65 2e 0a 2a 2a  locked state..**
53f0: 0a 2a 2a 20 42 75 74 20 77 61 69 74 3a 20 20 74  .** But wait:  t
5400: 68 65 72 65 20 61 72 65 20 79 65 74 20 6d 6f 72  here are yet mor
5410: 65 20 70 72 6f 62 6c 65 6d 73 20 77 69 74 68 20  e problems with 
5420: 50 4f 53 49 58 20 61 64 76 69 73 6f 72 79 20 6c  POSIX advisory l
5430: 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 79  ocks..**.** If y
5440: 6f 75 20 63 6c 6f 73 65 20 61 20 66 69 6c 65 20  ou close a file 
5450: 64 65 73 63 72 69 70 74 6f 72 20 74 68 61 74 20  descriptor that 
5460: 70 6f 69 6e 74 73 20 74 6f 20 61 20 66 69 6c 65  points to a file
5470: 20 74 68 61 74 20 68 61 73 20 6c 6f 63 6b 73 2c   that has locks,
5480: 0a 2a 2a 20 61 6c 6c 20 6c 6f 63 6b 73 20 6f 6e  .** all locks on
5490: 20 74 68 61 74 20 66 69 6c 65 20 74 68 61 74 20   that file that 
54a0: 61 72 65 20 6f 77 6e 65 64 20 62 79 20 74 68 65  are owned by the
54b0: 20 63 75 72 72 65 6e 74 20 70 72 6f 63 65 73 73   current process
54c0: 20 61 72 65 0a 2a 2a 20 72 65 6c 65 61 73 65 64   are.** released
54d0: 2e 20 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e  .  To work aroun
54e0: 64 20 74 68 69 73 20 70 72 6f 62 6c 65 6d 2c 20  d this problem, 
54f0: 65 61 63 68 20 75 6e 69 78 46 69 6c 65 20 73 74  each unixFile st
5500: 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73  ructure contains
5510: 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  .** a pointer to
5520: 20 61 6e 20 75 6e 69 78 4f 70 65 6e 43 6e 74 20   an unixOpenCnt 
5530: 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65 72  structure.  Ther
5540: 65 20 69 73 20 6f 6e 65 20 75 6e 69 78 4f 70 65  e is one unixOpe
5550: 6e 43 6e 74 20 73 74 72 75 63 74 75 72 65 0a 2a  nCnt structure.*
5560: 2a 20 70 65 72 20 6f 70 65 6e 20 69 6e 6f 64 65  * per open inode
5570: 2c 20 77 68 69 63 68 20 6d 65 61 6e 73 20 74 68  , which means th
5580: 61 74 20 6d 75 6c 74 69 70 6c 65 20 75 6e 69 78  at multiple unix
5590: 46 69 6c 65 20 63 61 6e 20 70 6f 69 6e 74 20 74  File can point t
55a0: 6f 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 75 6e  o a single.** un
55b0: 69 78 4f 70 65 6e 43 6e 74 2e 20 20 57 68 65 6e  ixOpenCnt.  When
55c0: 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d   an attempt is m
55d0: 61 64 65 20 74 6f 20 63 6c 6f 73 65 20 61 6e 20  ade to close an 
55e0: 75 6e 69 78 46 69 6c 65 2c 20 69 66 20 74 68 65  unixFile, if the
55f0: 72 65 20 61 72 65 0a 2a 2a 20 6f 74 68 65 72 20  re are.** other 
5600: 75 6e 69 78 46 69 6c 65 20 6f 70 65 6e 20 6f 6e  unixFile open on
5610: 20 74 68 65 20 73 61 6d 65 20 69 6e 6f 64 65 20   the same inode 
5620: 74 68 61 74 20 61 72 65 20 68 6f 6c 64 69 6e 67  that are holding
5630: 20 6c 6f 63 6b 73 2c 20 74 68 65 20 63 61 6c 6c   locks, the call
5640: 0a 2a 2a 20 74 6f 20 63 6c 6f 73 65 28 29 20 74  .** to close() t
5650: 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
5660: 6f 72 20 69 73 20 64 65 66 65 72 72 65 64 20 75  or is deferred u
5670: 6e 74 69 6c 20 61 6c 6c 20 6f 66 20 74 68 65 20  ntil all of the 
5680: 6c 6f 63 6b 73 20 63 6c 65 61 72 2e 0a 2a 2a 20  locks clear..** 
5690: 54 68 65 20 75 6e 69 78 4f 70 65 6e 43 6e 74 20  The unixOpenCnt 
56a0: 73 74 72 75 63 74 75 72 65 20 6b 65 65 70 73 20  structure keeps 
56b0: 61 20 6c 69 73 74 20 6f 66 20 66 69 6c 65 20 64  a list of file d
56c0: 65 73 63 72 69 70 74 6f 72 73 20 74 68 61 74 20  escriptors that 
56d0: 6e 65 65 64 20 74 6f 0a 2a 2a 20 62 65 20 63 6c  need to.** be cl
56e0: 6f 73 65 64 20 61 6e 64 20 74 68 61 74 20 6c 69  osed and that li
56f0: 73 74 20 69 73 20 77 61 6c 6b 65 64 20 28 61 6e  st is walked (an
5700: 64 20 63 6c 65 61 72 65 64 29 20 77 68 65 6e 20  d cleared) when 
5710: 74 68 65 20 6c 61 73 74 20 6c 6f 63 6b 0a 2a 2a  the last lock.**
5720: 20 63 6c 65 61 72 73 2e 0a 2a 2a 0a 2a 2a 20 59   clears..**.** Y
5730: 65 74 20 61 6e 6f 74 68 65 72 20 70 72 6f 62 6c  et another probl
5740: 65 6d 3a 20 20 4c 69 6e 75 78 54 68 72 65 61 64  em:  LinuxThread
5750: 73 20 64 6f 20 6e 6f 74 20 70 6c 61 79 20 77 65  s do not play we
5760: 6c 6c 20 77 69 74 68 20 70 6f 73 69 78 20 6c 6f  ll with posix lo
5770: 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 4d 61 6e 79 20  cks..**.** Many 
5780: 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 73 20 6f  older versions o
5790: 66 20 6c 69 6e 75 78 20 75 73 65 20 74 68 65 20  f linux use the 
57a0: 4c 69 6e 75 78 54 68 72 65 61 64 73 20 6c 69 62  LinuxThreads lib
57b0: 72 61 72 79 20 77 68 69 63 68 20 69 73 0a 2a 2a  rary which is.**
57c0: 20 6e 6f 74 20 70 6f 73 69 78 20 63 6f 6d 70 6c   not posix compl
57d0: 69 61 6e 74 2e 20 20 55 6e 64 65 72 20 4c 69 6e  iant.  Under Lin
57e0: 75 78 54 68 72 65 61 64 73 2c 20 61 20 6c 6f 63  uxThreads, a loc
57f0: 6b 20 63 72 65 61 74 65 64 20 62 79 20 74 68 72  k created by thr
5800: 65 61 64 0a 2a 2a 20 41 20 63 61 6e 6e 6f 74 20  ead.** A cannot 
5810: 62 65 20 6d 6f 64 69 66 69 65 64 20 6f 72 20 6f  be modified or o
5820: 76 65 72 72 69 64 64 65 6e 20 62 79 20 61 20 64  verridden by a d
5830: 69 66 66 65 72 65 6e 74 20 74 68 72 65 61 64 20  ifferent thread 
5840: 42 2e 0a 2a 2a 20 4f 6e 6c 79 20 74 68 72 65 61  B..** Only threa
5850: 64 20 41 20 63 61 6e 20 6d 6f 64 69 66 79 20 74  d A can modify t
5860: 68 65 20 6c 6f 63 6b 2e 20 20 4c 6f 63 6b 69 6e  he lock.  Lockin
5870: 67 20 62 65 68 61 76 69 6f 72 20 69 73 20 63 6f  g behavior is co
5880: 72 72 65 63 74 0a 2a 2a 20 69 66 20 74 68 65 20  rrect.** if the 
5890: 61 70 70 6c 69 61 74 69 6f 6e 20 75 73 65 73 20  appliation uses 
58a0: 74 68 65 20 6e 65 77 65 72 20 4e 61 74 69 76 65  the newer Native
58b0: 20 50 6f 73 69 78 20 54 68 72 65 61 64 20 4c 69   Posix Thread Li
58c0: 62 72 61 72 79 20 28 4e 50 54 4c 29 0a 2a 2a 20  brary (NPTL).** 
58d0: 6f 6e 20 6c 69 6e 75 78 20 2d 20 77 69 74 68 20  on linux - with 
58e0: 4e 50 54 4c 20 61 20 6c 6f 63 6b 20 63 72 65 61  NPTL a lock crea
58f0: 74 65 64 20 62 79 20 74 68 72 65 61 64 20 41 20  ted by thread A 
5900: 63 61 6e 20 6f 76 65 72 72 69 64 65 20 6c 6f 63  can override loc
5910: 6b 73 0a 2a 2a 20 69 6e 20 74 68 72 65 61 64 20  ks.** in thread 
5920: 42 2e 20 20 42 75 74 20 74 68 65 72 65 20 69 73  B.  But there is
5930: 20 6e 6f 20 77 61 79 20 74 6f 20 6b 6e 6f 77 20   no way to know 
5940: 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  at compile-time 
5950: 77 68 69 63 68 0a 2a 2a 20 74 68 72 65 61 64 69  which.** threadi
5960: 6e 67 20 6c 69 62 72 61 72 79 20 69 73 20 62 65  ng library is be
5970: 69 6e 67 20 75 73 65 64 2e 20 20 53 6f 20 74 68  ing used.  So th
5980: 65 72 65 20 69 73 20 6e 6f 20 77 61 79 20 74 6f  ere is no way to
5990: 20 6b 6e 6f 77 20 61 74 0a 2a 2a 20 63 6f 6d 70   know at.** comp
59a0: 69 6c 65 2d 74 69 6d 65 20 77 68 65 74 68 65 72  ile-time whether
59b0: 20 6f 72 20 6e 6f 74 20 74 68 72 65 61 64 20 41   or not thread A
59c0: 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20 6c 6f   can override lo
59d0: 63 6b 73 20 6f 6e 20 74 68 72 65 61 64 20 42 2e  cks on thread B.
59e0: 0a 2a 2a 20 57 65 20 68 61 76 65 20 74 6f 20 64  .** We have to d
59f0: 6f 20 61 20 72 75 6e 2d 74 69 6d 65 20 63 68 65  o a run-time che
5a00: 63 6b 20 74 6f 20 64 69 73 63 6f 76 65 72 20 74  ck to discover t
5a10: 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20 74  he behavior of t
5a20: 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 70 72  he.** current pr
5a30: 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20  ocess..**.** On 
5a40: 73 79 73 74 65 6d 73 20 77 68 65 72 65 20 74 68  systems where th
5a50: 72 65 61 64 20 41 20 69 73 20 75 6e 61 62 6c 65  read A is unable
5a60: 20 74 6f 20 6d 6f 64 69 66 79 20 6c 6f 63 6b 73   to modify locks
5a70: 20 63 72 65 61 74 65 64 20 62 79 0a 2a 2a 20 74   created by.** t
5a80: 68 72 65 61 64 20 42 2c 20 77 65 20 68 61 76 65  hread B, we have
5a90: 20 74 6f 20 6b 65 65 70 20 74 72 61 63 6b 20 6f   to keep track o
5aa0: 66 20 77 68 69 63 68 20 74 68 72 65 61 64 20 63  f which thread c
5ab0: 72 65 61 74 65 64 20 65 61 63 68 0a 2a 2a 20 6c  reated each.** l
5ac0: 6f 63 6b 2e 20 20 48 65 6e 63 65 20 74 68 65 72  ock.  Hence ther
5ad0: 65 20 69 73 20 61 6e 20 65 78 74 72 61 20 66 69  e is an extra fi
5ae0: 65 6c 64 20 69 6e 20 74 68 65 20 6b 65 79 20 74  eld in the key t
5af0: 6f 20 74 68 65 20 75 6e 69 78 4c 6f 63 6b 49 6e  o the unixLockIn
5b00: 66 6f 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20  fo.** structure 
5b10: 74 6f 20 72 65 63 6f 72 64 20 74 68 69 73 20 69  to record this i
5b20: 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 41 6e 64  nformation.  And
5b30: 20 6f 6e 20 74 68 6f 73 65 20 73 79 73 74 65 6d   on those system
5b40: 73 20 69 74 0a 2a 2a 20 69 73 20 69 6c 6c 65 67  s it.** is illeg
5b50: 61 6c 20 74 6f 20 62 65 67 69 6e 20 61 20 74 72  al to begin a tr
5b60: 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 6f 6e 65  ansaction in one
5b70: 20 74 68 72 65 61 64 20 61 6e 64 20 66 69 6e 69   thread and fini
5b80: 73 68 20 69 74 0a 2a 2a 20 69 6e 20 61 6e 6f 74  sh it.** in anot
5b90: 68 65 72 2e 20 20 46 6f 72 20 74 68 69 73 20 6c  her.  For this l
5ba0: 61 74 74 65 72 20 72 65 73 74 72 69 63 74 69 6f  atter restrictio
5bb0: 6e 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77  n, there is no w
5bc0: 6f 72 6b 2d 61 72 6f 75 6e 64 2e 0a 2a 2a 20 49  ork-around..** I
5bd0: 74 20 69 73 20 61 20 6c 69 6d 69 74 61 74 69 6f  t is a limitatio
5be0: 6e 20 6f 66 20 4c 69 6e 75 78 54 68 72 65 61 64  n of LinuxThread
5bf0: 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  s..*/../*.** Set
5c00: 20 6f 72 20 63 68 65 63 6b 20 74 68 65 20 75 6e   or check the un
5c10: 69 78 46 69 6c 65 2e 74 69 64 20 66 69 65 6c 64  ixFile.tid field
5c20: 2e 20 20 54 68 69 73 20 66 69 65 6c 64 20 69 73  .  This field is
5c30: 20 73 65 74 20 77 68 65 6e 20 61 6e 20 75 6e 69   set when an uni
5c40: 78 46 69 6c 65 0a 2a 2a 20 69 73 20 66 69 72 73  xFile.** is firs
5c50: 74 20 6f 70 65 6e 65 64 2e 20 20 41 6c 6c 20 73  t opened.  All s
5c60: 75 62 73 65 71 75 65 6e 74 20 75 73 65 73 20 6f  ubsequent uses o
5c70: 66 20 74 68 65 20 75 6e 69 78 46 69 6c 65 20 76  f the unixFile v
5c80: 65 72 69 66 79 20 74 68 61 74 20 74 68 65 0a 2a  erify that the.*
5c90: 2a 20 73 61 6d 65 20 74 68 72 65 61 64 20 69 73  * same thread is
5ca0: 20 6f 70 65 72 61 74 69 6e 67 20 6f 6e 20 74 68   operating on th
5cb0: 65 20 75 6e 69 78 46 69 6c 65 2e 20 20 53 6f 6d  e unixFile.  Som
5cc0: 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  e operating syst
5cd0: 65 6d 73 20 64 6f 0a 2a 2a 20 6e 6f 74 20 61 6c  ems do.** not al
5ce0: 6c 6f 77 20 6c 6f 63 6b 73 20 74 6f 20 62 65 20  low locks to be 
5cf0: 6f 76 65 72 72 69 64 64 65 6e 20 62 79 20 6f 74  overridden by ot
5d00: 68 65 72 20 74 68 72 65 61 64 73 20 61 6e 64 20  her threads and 
5d10: 74 68 61 74 20 72 65 73 74 72 69 63 74 69 6f 6e  that restriction
5d20: 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 61 74 20 73  .** means that s
5d30: 71 6c 69 74 65 33 2a 20 64 61 74 61 62 61 73 65  qlite3* database
5d40: 20 68 61 6e 64 6c 65 73 20 63 61 6e 6e 6f 74 20   handles cannot 
5d50: 62 65 20 6d 6f 76 65 64 20 66 72 6f 6d 20 6f 6e  be moved from on
5d60: 65 20 74 68 72 65 61 64 0a 2a 2a 20 74 6f 20 61  e thread.** to a
5d70: 6e 6f 74 68 65 72 20 77 68 69 6c 65 20 6c 6f 63  nother while loc
5d80: 6b 73 20 61 72 65 20 68 65 6c 64 2e 0a 2a 2a 0a  ks are held..**.
5d90: 2a 2a 20 56 65 72 73 69 6f 6e 20 33 2e 33 2e 31  ** Version 3.3.1
5da0: 20 28 32 30 30 36 2d 30 31 2d 31 35 29 3a 20 20   (2006-01-15):  
5db0: 75 6e 69 78 46 69 6c 65 20 63 61 6e 20 62 65 20  unixFile can be 
5dc0: 6d 6f 76 65 64 20 66 72 6f 6d 20 6f 6e 65 20 74  moved from one t
5dd0: 68 72 65 61 64 20 74 6f 0a 2a 2a 20 61 6e 6f 74  hread to.** anot
5de0: 68 65 72 20 61 73 20 6c 6f 6e 67 20 61 73 20 77  her as long as w
5df0: 65 20 61 72 65 20 72 75 6e 6e 69 6e 67 20 6f 6e  e are running on
5e00: 20 61 20 73 79 73 74 65 6d 20 74 68 61 74 20 73   a system that s
5e10: 75 70 70 6f 72 74 73 20 74 68 72 65 61 64 73 0a  upports threads.
5e20: 2a 2a 20 6f 76 65 72 72 69 64 69 6e 67 20 65 61  ** overriding ea
5e30: 63 68 20 6f 74 68 65 72 73 20 6c 6f 63 6b 73 20  ch others locks 
5e40: 28 77 68 69 63 68 20 69 73 20 6e 6f 77 20 74 68  (which is now th
5e50: 65 20 6d 6f 73 74 20 63 6f 6d 6d 6f 6e 20 62 65  e most common be
5e60: 68 61 76 69 6f 72 29 0a 2a 2a 20 6f 72 20 69 66  havior).** or if
5e70: 20 6e 6f 20 6c 6f 63 6b 73 20 61 72 65 20 68 65   no locks are he
5e80: 6c 64 2e 20 20 42 75 74 20 74 68 65 20 75 6e 69  ld.  But the uni
5e90: 78 46 69 6c 65 2e 70 4c 6f 63 6b 20 66 69 65 6c  xFile.pLock fiel
5ea0: 64 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 2a 2a  d needs to be.**
5eb0: 20 72 65 63 6f 6d 70 75 74 65 64 20 62 65 63 61   recomputed beca
5ec0: 75 73 65 20 69 74 73 20 6b 65 79 20 69 6e 63 6c  use its key incl
5ed0: 75 64 65 73 20 74 68 65 20 74 68 72 65 61 64 2d  udes the thread-
5ee0: 69 64 2e 20 20 53 65 65 20 74 68 65 20 0a 2a 2a  id.  See the .**
5ef0: 20 74 72 61 6e 73 66 65 72 4f 77 6e 65 72 73 68   transferOwnersh
5f00: 69 70 28 29 20 66 75 6e 63 74 69 6f 6e 20 62 65  ip() function be
5f10: 6c 6f 77 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  low for addition
5f20: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a  al information.*
5f30: 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52  /.#if SQLITE_THR
5f40: 45 41 44 53 41 46 45 20 26 26 20 64 65 66 69 6e  EADSAFE && defin
5f50: 65 64 28 5f 5f 6c 69 6e 75 78 5f 5f 29 0a 23 20  ed(__linux__).# 
5f60: 64 65 66 69 6e 65 20 53 45 54 5f 54 48 52 45 41  define SET_THREA
5f70: 44 49 44 28 58 29 20 20 20 28 58 29 2d 3e 74 69  DID(X)   (X)->ti
5f80: 64 20 3d 20 70 74 68 72 65 61 64 5f 73 65 6c 66  d = pthread_self
5f90: 28 29 0a 23 20 64 65 66 69 6e 65 20 43 48 45 43  ().# define CHEC
5fa0: 4b 5f 54 48 52 45 41 44 49 44 28 58 29 20 28 74  K_THREADID(X) (t
5fb0: 68 72 65 61 64 73 4f 76 65 72 72 69 64 65 45 61  hreadsOverrideEa
5fc0: 63 68 4f 74 68 65 72 73 4c 6f 63 6b 73 3d 3d 30  chOthersLocks==0
5fd0: 20 26 26 20 5c 0a 20 20 20 20 20 20 20 20 20 20   && \.          
5fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ff0: 20 20 21 70 74 68 72 65 61 64 5f 65 71 75 61 6c    !pthread_equal
6000: 28 28 58 29 2d 3e 74 69 64 2c 20 70 74 68 72 65  ((X)->tid, pthre
6010: 61 64 5f 73 65 6c 66 28 29 29 29 0a 23 65 6c 73  ad_self())).#els
6020: 65 0a 23 20 64 65 66 69 6e 65 20 53 45 54 5f 54  e.# define SET_T
6030: 48 52 45 41 44 49 44 28 58 29 0a 23 20 64 65 66  HREADID(X).# def
6040: 69 6e 65 20 43 48 45 43 4b 5f 54 48 52 45 41 44  ine CHECK_THREAD
6050: 49 44 28 58 29 20 30 0a 23 65 6e 64 69 66 0a 0a  ID(X) 0.#endif..
6060: 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63  /*.** An instanc
6070: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
6080: 6e 67 20 73 74 72 75 63 74 75 72 65 20 73 65 72  ng structure ser
6090: 76 65 73 20 61 73 20 74 68 65 20 6b 65 79 20 75  ves as the key u
60a0: 73 65 64 0a 2a 2a 20 74 6f 20 6c 6f 63 61 74 65  sed.** to locate
60b0: 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 75 6e   a particular un
60c0: 69 78 4f 70 65 6e 43 6e 74 20 73 74 72 75 63 74  ixOpenCnt struct
60d0: 75 72 65 20 67 69 76 65 6e 20 69 74 73 20 69 6e  ure given its in
60e0: 6f 64 65 2e 20 20 54 68 69 73 0a 2a 2a 20 69 73  ode.  This.** is
60f0: 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65   the same as the
6100: 20 75 6e 69 78 4c 6f 63 6b 4b 65 79 20 65 78 63   unixLockKey exc
6110: 65 70 74 20 74 68 61 74 20 74 68 65 20 74 68 72  ept that the thr
6120: 65 61 64 20 49 44 20 69 73 20 6f 6d 69 74 74 65  ead ID is omitte
6130: 64 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 75 6e 69  d..*/.struct uni
6140: 78 46 69 6c 65 49 64 20 7b 0a 20 20 64 65 76 5f  xFileId {.  dev_
6150: 74 20 64 65 76 3b 20 20 20 20 20 20 20 20 20 20  t dev;          
6160: 20 20 20 20 20 20 20 20 2f 2a 20 44 65 76 69 63          /* Devic
6170: 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 23 69 66 20  e number */.#if 
6180: 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74 72  OS_VXWORKS.  str
6190: 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49  uct vxworksFileI
61a0: 64 20 2a 70 49 64 3b 20 20 2f 2a 20 55 6e 69 71  d *pId;  /* Uniq
61b0: 75 65 20 66 69 6c 65 20 49 44 20 66 6f 72 20 76  ue file ID for v
61c0: 78 77 6f 72 6b 73 2e 20 2a 2f 0a 23 65 6c 73 65  xworks. */.#else
61d0: 0a 20 20 69 6e 6f 5f 74 20 69 6e 6f 3b 20 20 20  .  ino_t ino;   
61e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
61f0: 2a 20 49 6e 6f 64 65 20 6e 75 6d 62 65 72 20 2a  * Inode number *
6200: 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a  /.#endif.};../*.
6210: 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f  ** An instance o
6220: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
6230: 73 74 72 75 63 74 75 72 65 20 73 65 72 76 65 73  structure serves
6240: 20 61 73 20 74 68 65 20 6b 65 79 20 75 73 65 64   as the key used
6250: 0a 2a 2a 20 74 6f 20 6c 6f 63 61 74 65 20 61 20  .** to locate a 
6260: 70 61 72 74 69 63 75 6c 61 72 20 75 6e 69 78 4c  particular unixL
6270: 6f 63 6b 49 6e 66 6f 20 73 74 72 75 63 74 75 72  ockInfo structur
6280: 65 20 67 69 76 65 6e 20 69 74 73 20 69 6e 6f 64  e given its inod
6290: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 72 65  e..**.** If thre
62a0: 61 64 73 20 63 61 6e 6e 6f 74 20 6f 76 65 72 72  ads cannot overr
62b0: 69 64 65 20 65 61 63 68 20 6f 74 68 65 72 73 20  ide each others 
62c0: 6c 6f 63 6b 73 20 28 4c 69 6e 75 78 54 68 72 65  locks (LinuxThre
62d0: 61 64 73 29 2c 20 74 68 65 6e 20 77 65 0a 2a 2a  ads), then we.**
62e0: 20 73 65 74 20 74 68 65 20 75 6e 69 78 4c 6f 63   set the unixLoc
62f0: 6b 4b 65 79 2e 74 69 64 20 66 69 65 6c 64 20 74  kKey.tid field t
6300: 6f 20 74 68 65 20 74 68 72 65 61 64 20 49 44 2e  o the thread ID.
6310: 20 20 49 66 20 74 68 72 65 61 64 73 20 63 61 6e    If threads can
6320: 20 6f 76 65 72 72 69 64 65 0a 2a 2a 20 65 61 63   override.** eac
6330: 68 20 6f 74 68 65 72 73 20 6c 6f 63 6b 73 20 28  h others locks (
6340: 50 6f 73 69 78 20 61 6e 64 20 4e 50 54 4c 29 20  Posix and NPTL) 
6350: 74 68 65 6e 20 74 69 64 20 69 73 20 61 6c 77 61  then tid is alwa
6360: 79 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 0a  ys set to zero..
6370: 2a 2a 20 74 69 64 20 69 73 20 6f 6d 69 74 74 65  ** tid is omitte
6380: 64 20 69 66 20 77 65 20 63 6f 6d 70 69 6c 65 20  d if we compile 
6390: 77 69 74 68 6f 75 74 20 74 68 72 65 61 64 69 6e  without threadin
63a0: 67 20 73 75 70 70 6f 72 74 20 6f 72 20 6f 6e 20  g support or on 
63b0: 61 6e 20 4f 53 0a 2a 2a 20 6f 74 68 65 72 20 74  an OS.** other t
63c0: 68 61 6e 20 6c 69 6e 75 78 2e 0a 2a 2f 0a 73 74  han linux..*/.st
63d0: 72 75 63 74 20 75 6e 69 78 4c 6f 63 6b 4b 65 79  ruct unixLockKey
63e0: 20 7b 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78   {.  struct unix
63f0: 46 69 6c 65 49 64 20 66 69 64 3b 20 20 2f 2a 20  FileId fid;  /* 
6400: 55 6e 69 71 75 65 20 69 64 65 6e 74 69 66 69 65  Unique identifie
6410: 72 20 66 6f 72 20 74 68 65 20 66 69 6c 65 20 2a  r for the file *
6420: 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52  /.#if SQLITE_THR
6430: 45 41 44 53 41 46 45 20 26 26 20 64 65 66 69 6e  EADSAFE && defin
6440: 65 64 28 5f 5f 6c 69 6e 75 78 5f 5f 29 0a 20 20  ed(__linux__).  
6450: 70 74 68 72 65 61 64 5f 74 20 74 69 64 3b 20 20  pthread_t tid;  
6460: 2f 2a 20 54 68 72 65 61 64 20 49 44 20 6f 66 20  /* Thread ID of 
6470: 6c 6f 63 6b 20 6f 77 6e 65 72 2e 20 5a 65 72 6f  lock owner. Zero
6480: 20 69 66 20 6e 6f 74 20 75 73 69 6e 67 20 4c 69   if not using Li
6490: 6e 75 78 54 68 72 65 61 64 73 20 2a 2f 0a 23 65  nuxThreads */.#e
64a0: 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  ndif.};../*.** A
64b0: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
64c0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
64d0: 63 74 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74  cture is allocat
64e0: 65 64 20 66 6f 72 20 65 61 63 68 20 6f 70 65 6e  ed for each open
64f0: 0a 2a 2a 20 69 6e 6f 64 65 2e 20 20 4f 72 2c 20  .** inode.  Or, 
6500: 6f 6e 20 4c 69 6e 75 78 54 68 72 65 61 64 73 2c  on LinuxThreads,
6510: 20 74 68 65 72 65 20 69 73 20 6f 6e 65 20 6f 66   there is one of
6520: 20 74 68 65 73 65 20 73 74 72 75 63 74 75 72 65   these structure
6530: 73 20 66 6f 72 0a 2a 2a 20 65 61 63 68 20 69 6e  s for.** each in
6540: 6f 64 65 20 6f 70 65 6e 65 64 20 62 79 20 65 61  ode opened by ea
6550: 63 68 20 74 68 72 65 61 64 2e 0a 2a 2a 0a 2a 2a  ch thread..**.**
6560: 20 41 20 73 69 6e 67 6c 65 20 69 6e 6f 64 65 20   A single inode 
6570: 63 61 6e 20 68 61 76 65 20 6d 75 6c 74 69 70 6c  can have multipl
6580: 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
6590: 72 73 2c 20 73 6f 20 65 61 63 68 20 75 6e 69 78  rs, so each unix
65a0: 46 69 6c 65 0a 2a 2a 20 73 74 72 75 63 74 75 72  File.** structur
65b0: 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69  e contains a poi
65c0: 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e 73 74 61  nter to an insta
65d0: 6e 63 65 20 6f 66 20 74 68 69 73 20 6f 62 6a 65  nce of this obje
65e0: 63 74 20 61 6e 64 20 74 68 69 73 0a 2a 2a 20 6f  ct and this.** o
65f0: 62 6a 65 63 74 20 6b 65 65 70 73 20 61 20 63 6f  bject keeps a co
6600: 75 6e 74 20 6f 66 20 74 68 65 20 6e 75 6d 62 65  unt of the numbe
6610: 72 20 6f 66 20 75 6e 69 78 46 69 6c 65 20 70 6f  r of unixFile po
6620: 69 6e 74 69 6e 67 20 74 6f 20 69 74 2e 0a 2a 2f  inting to it..*/
6630: 0a 73 74 72 75 63 74 20 75 6e 69 78 4c 6f 63 6b  .struct unixLock
6640: 49 6e 66 6f 20 7b 0a 20 20 73 74 72 75 63 74 20  Info {.  struct 
6650: 75 6e 69 78 4c 6f 63 6b 4b 65 79 20 6c 6f 63 6b  unixLockKey lock
6660: 4b 65 79 3b 20 20 20 20 20 2f 2a 20 54 68 65 20  Key;     /* The 
6670: 6c 6f 6f 6b 75 70 20 6b 65 79 20 2a 2f 0a 20 20  lookup key */.  
6680: 69 6e 74 20 63 6e 74 3b 20 20 20 20 20 20 20 20  int cnt;        
6690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
66a0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 53 48 41  /* Number of SHA
66b0: 52 45 44 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a  RED locks held *
66c0: 2f 0a 20 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65  /.  int locktype
66d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
66e0: 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 53 48      /* One of SH
66f0: 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45 53 45 52  ARED_LOCK, RESER
6700: 56 45 44 5f 4c 4f 43 4b 20 65 74 63 2e 20 2a 2f  VED_LOCK etc. */
6710: 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20  .  int nRef;    
6720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6730: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
6740: 70 6f 69 6e 74 65 72 73 20 74 6f 20 74 68 69 73  pointers to this
6750: 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20   structure */.  
6760: 73 74 72 75 63 74 20 75 6e 69 78 4c 6f 63 6b 49  struct unixLockI
6770: 6e 66 6f 20 2a 70 4e 65 78 74 3b 20 20 20 20 20  nfo *pNext;     
6780: 2f 2a 20 4c 69 73 74 20 6f 66 20 61 6c 6c 20 75  /* List of all u
6790: 6e 69 78 4c 6f 63 6b 49 6e 66 6f 20 6f 62 6a 65  nixLockInfo obje
67a0: 63 74 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  cts */.  struct 
67b0: 75 6e 69 78 4c 6f 63 6b 49 6e 66 6f 20 2a 70 50  unixLockInfo *pP
67c0: 72 65 76 3b 20 20 20 20 20 2f 2a 20 20 20 20 2e  rev;     /*    .
67d0: 2e 2e 2e 20 64 6f 75 62 6c 79 20 6c 69 6e 6b 65  ... doubly linke
67e0: 64 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  d */.};../*.** A
67f0: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
6800: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
6810: 63 74 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74  cture is allocat
6820: 65 64 20 66 6f 72 20 65 61 63 68 20 6f 70 65 6e  ed for each open
6830: 0a 2a 2a 20 69 6e 6f 64 65 2e 20 20 54 68 69 73  .** inode.  This
6840: 20 73 74 72 75 63 74 75 72 65 20 6b 65 65 70 73   structure keeps
6850: 20 74 72 61 63 6b 20 6f 66 20 74 68 65 20 6e 75   track of the nu
6860: 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73 20 6f 6e  mber of locks on
6870: 20 74 68 61 74 0a 2a 2a 20 69 6e 6f 64 65 2e 20   that.** inode. 
6880: 20 49 66 20 61 20 63 6c 6f 73 65 20 69 73 20 61   If a close is a
6890: 74 74 65 6d 70 74 65 64 20 61 67 61 69 6e 73 74  ttempted against
68a0: 20 61 6e 20 69 6e 6f 64 65 20 74 68 61 74 20 69   an inode that i
68b0: 73 20 68 6f 6c 64 69 6e 67 0a 2a 2a 20 6c 6f 63  s holding.** loc
68c0: 6b 73 2c 20 74 68 65 20 63 6c 6f 73 65 20 69 73  ks, the close is
68d0: 20 64 65 66 65 72 72 65 64 20 75 6e 74 69 6c 20   deferred until 
68e0: 61 6c 6c 20 6c 6f 63 6b 73 20 63 6c 65 61 72 20  all locks clear 
68f0: 62 79 20 61 64 64 69 6e 67 20 74 68 65 0a 2a 2a  by adding the.**
6900: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
6910: 20 74 6f 20 62 65 20 63 6c 6f 73 65 64 20 74 6f   to be closed to
6920: 20 74 68 65 20 70 65 6e 64 69 6e 67 20 6c 69 73   the pending lis
6930: 74 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 20  t..**.** TODO:  
6940: 43 6f 6e 73 69 64 65 72 20 63 68 61 6e 67 69 6e  Consider changin
6950: 67 20 74 68 69 73 20 73 6f 20 74 68 61 74 20 74  g this so that t
6960: 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 61 20 73  here is only a s
6970: 69 6e 67 6c 65 20 66 69 6c 65 0a 2a 2a 20 64 65  ingle file.** de
6980: 73 63 72 69 70 74 6f 72 20 66 6f 72 20 65 61 63  scriptor for eac
6990: 68 20 6f 70 65 6e 20 66 69 6c 65 2c 20 65 76 65  h open file, eve
69a0: 6e 20 77 68 65 6e 20 69 74 20 69 73 20 6f 70 65  n when it is ope
69b0: 6e 65 64 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d  ned multiple tim
69c0: 65 73 2e 0a 2a 2a 20 54 68 65 20 63 6c 6f 73 65  es..** The close
69d0: 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 77  () system call w
69e0: 6f 75 6c 64 20 6f 6e 6c 79 20 6f 63 63 75 72 20  ould only occur 
69f0: 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20 64 61  when the last da
6a00: 74 61 62 61 73 65 0a 2a 2a 20 75 73 69 6e 67 20  tabase.** using 
6a10: 74 68 65 20 66 69 6c 65 20 63 6c 6f 73 65 73 2e  the file closes.
6a20: 0a 2a 2f 0a 73 74 72 75 63 74 20 75 6e 69 78 4f  .*/.struct unixO
6a30: 70 65 6e 43 6e 74 20 7b 0a 20 20 73 74 72 75 63  penCnt {.  struc
6a40: 74 20 75 6e 69 78 46 69 6c 65 49 64 20 66 69 6c  t unixFileId fil
6a50: 65 49 64 3b 20 20 20 2f 2a 20 54 68 65 20 6c 6f  eId;   /* The lo
6a60: 6f 6b 75 70 20 6b 65 79 20 2a 2f 0a 20 20 69 6e  okup key */.  in
6a70: 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20  t nRef;         
6a80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
6a90: 62 65 72 20 6f 66 20 70 6f 69 6e 74 65 72 73 20  ber of pointers 
6aa0: 74 6f 20 74 68 69 73 20 73 74 72 75 63 74 75 72  to this structur
6ab0: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f 63 6b  e */.  int nLock
6ac0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
6ad0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
6ae0: 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b  outstanding lock
6af0: 73 20 2a 2f 0a 20 20 55 6e 69 78 55 6e 75 73 65  s */.  UnixUnuse
6b00: 64 46 64 20 2a 70 55 6e 75 73 65 64 3b 20 20 20  dFd *pUnused;   
6b10: 20 20 20 2f 2a 20 55 6e 75 73 65 64 20 66 69 6c     /* Unused fil
6b20: 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 74 6f  e descriptors to
6b30: 20 63 6c 6f 73 65 20 2a 2f 0a 23 69 66 20 4f 53   close */.#if OS
6b40: 5f 56 58 57 4f 52 4b 53 0a 20 20 73 65 6d 5f 74  _VXWORKS.  sem_t
6b50: 20 2a 70 53 65 6d 3b 20 20 20 20 20 20 20 20 20   *pSem;         
6b60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
6b70: 61 6d 65 64 20 50 4f 53 49 58 20 73 65 6d 61 70  amed POSIX semap
6b80: 68 6f 72 65 20 2a 2f 0a 20 20 63 68 61 72 20 61  hore */.  char a
6b90: 53 65 6d 4e 61 6d 65 5b 4d 41 58 5f 50 41 54 48  SemName[MAX_PATH
6ba0: 4e 41 4d 45 2b 32 5d 3b 20 20 20 2f 2a 20 4e 61  NAME+2];   /* Na
6bb0: 6d 65 20 6f 66 20 74 68 61 74 20 73 65 6d 61 70  me of that semap
6bc0: 68 6f 72 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 20  hore */.#endif. 
6bd0: 20 73 74 72 75 63 74 20 75 6e 69 78 4f 70 65 6e   struct unixOpen
6be0: 43 6e 74 20 2a 70 4e 65 78 74 2c 20 2a 70 50 72  Cnt *pNext, *pPr
6bf0: 65 76 3b 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66  ev;   /* List of
6c00: 20 61 6c 6c 20 75 6e 69 78 4f 70 65 6e 43 6e 74   all unixOpenCnt
6c10: 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 7d 3b 0a 0a   objects */.};..
6c20: 2f 2a 0a 2a 2a 20 4c 69 73 74 73 20 6f 66 20 61  /*.** Lists of a
6c30: 6c 6c 20 75 6e 69 78 4c 6f 63 6b 49 6e 66 6f 20  ll unixLockInfo 
6c40: 61 6e 64 20 75 6e 69 78 4f 70 65 6e 43 6e 74 20  and unixOpenCnt 
6c50: 6f 62 6a 65 63 74 73 2e 20 20 54 68 65 73 65 20  objects.  These 
6c60: 75 73 65 64 20 74 6f 20 62 65 20 68 61 73 68 0a  used to be hash.
6c70: 2a 2a 20 74 61 62 6c 65 73 2e 20 20 42 75 74 20  ** tables.  But 
6c80: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f 62  the number of ob
6c90: 6a 65 63 74 73 20 69 73 20 72 61 72 65 6c 79 20  jects is rarely 
6ca0: 6d 6f 72 65 20 74 68 61 6e 20 61 20 64 6f 7a 65  more than a doze
6cb0: 6e 20 61 6e 64 0a 2a 2a 20 6e 65 76 65 72 20 65  n and.** never e
6cc0: 78 63 65 65 64 73 20 61 20 66 65 77 20 74 68 6f  xceeds a few tho
6cd0: 75 73 61 6e 64 2e 20 20 41 6e 64 20 6c 6f 6f 6b  usand.  And look
6ce0: 75 70 20 69 73 20 6e 6f 74 20 6f 6e 20 61 20 63  up is not on a c
6cf0: 72 69 74 69 63 61 6c 0a 2a 2a 20 70 61 74 68 20  ritical.** path 
6d00: 73 6f 20 61 20 73 69 6d 70 6c 65 20 6c 69 6e 6b  so a simple link
6d10: 65 64 20 6c 69 73 74 20 77 69 6c 6c 20 73 75 66  ed list will suf
6d20: 66 69 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  fice..*/.static 
6d30: 73 74 72 75 63 74 20 75 6e 69 78 4c 6f 63 6b 49  struct unixLockI
6d40: 6e 66 6f 20 2a 6c 6f 63 6b 4c 69 73 74 20 3d 20  nfo *lockList = 
6d50: 30 3b 0a 73 74 61 74 69 63 20 73 74 72 75 63 74  0;.static struct
6d60: 20 75 6e 69 78 4f 70 65 6e 43 6e 74 20 2a 6f 70   unixOpenCnt *op
6d70: 65 6e 4c 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a 0a  enList = 0;../*.
6d80: 2a 2a 20 54 68 69 73 20 76 61 72 69 61 62 6c 65  ** This variable
6d90: 20 72 65 6d 65 6d 62 65 72 73 20 77 68 65 74 68   remembers wheth
6da0: 65 72 20 6f 72 20 6e 6f 74 20 74 68 72 65 61 64  er or not thread
6db0: 73 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20 65  s can override e
6dc0: 61 63 68 20 6f 74 68 65 72 73 0a 2a 2a 20 6c 6f  ach others.** lo
6dd0: 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 30 3a  cks..**.**    0:
6de0: 20 20 4e 6f 2e 20 20 54 68 72 65 61 64 73 20 63    No.  Threads c
6df0: 61 6e 6e 6f 74 20 6f 76 65 72 72 69 64 65 20 65  annot override e
6e00: 61 63 68 20 6f 74 68 65 72 73 20 6c 6f 63 6b 73  ach others locks
6e10: 2e 20 20 28 4c 69 6e 75 78 54 68 72 65 61 64 73  .  (LinuxThreads
6e20: 29 0a 2a 2a 20 20 20 20 31 3a 20 20 59 65 73 2e  ).**    1:  Yes.
6e30: 20 20 54 68 72 65 61 64 73 20 63 61 6e 20 6f 76    Threads can ov
6e40: 65 72 72 69 64 65 20 65 61 63 68 20 6f 74 68 65  erride each othe
6e50: 72 73 20 6c 6f 63 6b 73 2e 20 20 28 50 6f 73 69  rs locks.  (Posi
6e60: 78 20 26 20 4e 4c 50 54 29 0a 2a 2a 20 20 20 2d  x & NLPT).**   -
6e70: 31 3a 20 20 57 65 20 64 6f 6e 27 74 20 6b 6e 6f  1:  We don't kno
6e80: 77 20 79 65 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20  w yet..**.** On 
6e90: 73 6f 6d 65 20 73 79 73 74 65 6d 73 2c 20 77 65  some systems, we
6ea0: 20 6b 6e 6f 77 20 61 74 20 63 6f 6d 70 69 6c 65   know at compile
6eb0: 2d 74 69 6d 65 20 69 66 20 74 68 72 65 61 64 73  -time if threads
6ec0: 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20 65 61   can override ea
6ed0: 63 68 0a 2a 2a 20 6f 74 68 65 72 73 20 6c 6f 63  ch.** others loc
6ee0: 6b 73 2e 20 20 4f 6e 20 74 68 6f 73 65 20 73 79  ks.  On those sy
6ef0: 73 74 65 6d 73 2c 20 74 68 65 20 53 51 4c 49 54  stems, the SQLIT
6f00: 45 5f 54 48 52 45 41 44 5f 4f 56 45 52 52 49 44  E_THREAD_OVERRID
6f10: 45 5f 4c 4f 43 4b 20 6d 61 63 72 6f 0a 2a 2a 20  E_LOCK macro.** 
6f20: 77 69 6c 6c 20 62 65 20 73 65 74 20 61 70 70 72  will be set appr
6f30: 6f 70 72 69 61 74 65 6c 79 2e 20 20 4f 6e 20 6f  opriately.  On o
6f40: 74 68 65 72 20 73 79 73 74 65 6d 73 2c 20 77 65  ther systems, we
6f50: 20 68 61 76 65 20 74 6f 20 63 68 65 63 6b 20 61   have to check a
6f60: 74 0a 2a 2a 20 72 75 6e 74 69 6d 65 2e 20 20 4f  t.** runtime.  O
6f70: 6e 20 74 68 65 73 65 20 6c 61 74 74 65 72 20 73  n these latter s
6f80: 79 73 74 65 6d 73 2c 20 53 51 4c 54 49 45 5f 54  ystems, SQLTIE_T
6f90: 48 52 45 41 44 5f 4f 56 45 52 52 49 44 45 5f 4c  HREAD_OVERRIDE_L
6fa0: 4f 43 4b 20 69 73 0a 2a 2a 20 75 6e 64 65 66 69  OCK is.** undefi
6fb0: 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ned..**.** This 
6fc0: 76 61 72 69 61 62 6c 65 20 6e 6f 72 6d 61 6c 6c  variable normall
6fd0: 79 20 68 61 73 20 66 69 6c 65 20 73 63 6f 70 65  y has file scope
6fe0: 20 6f 6e 6c 79 2e 20 20 42 75 74 20 64 75 72 69   only.  But duri
6ff0: 6e 67 20 74 65 73 74 69 6e 67 2c 20 77 65 20 6d  ng testing, we m
7000: 61 6b 65 0a 2a 2a 20 69 74 20 61 20 67 6c 6f 62  ake.** it a glob
7010: 61 6c 20 73 6f 20 74 68 61 74 20 74 68 65 20 74  al so that the t
7020: 65 73 74 20 63 6f 64 65 20 63 61 6e 20 63 68 61  est code can cha
7030: 6e 67 65 20 69 74 73 20 76 61 6c 75 65 20 69 6e  nge its value in
7040: 20 6f 72 64 65 72 20 74 6f 20 76 65 72 69 66 79   order to verify
7050: 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 72 69 67  .** that the rig
7060: 68 74 20 73 74 75 66 66 20 68 61 70 70 65 6e 73  ht stuff happens
7070: 20 69 6e 20 65 69 74 68 65 72 20 63 61 73 65 2e   in either case.
7080: 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 54  .*/.#if SQLITE_T
7090: 48 52 45 41 44 53 41 46 45 20 26 26 20 64 65 66  HREADSAFE && def
70a0: 69 6e 65 64 28 5f 5f 6c 69 6e 75 78 5f 5f 29 0a  ined(__linux__).
70b0: 23 20 20 69 66 6e 64 65 66 20 53 51 4c 49 54 45  #  ifndef SQLITE
70c0: 5f 54 48 52 45 41 44 5f 4f 56 45 52 52 49 44 45  _THREAD_OVERRIDE
70d0: 5f 4c 4f 43 4b 0a 23 20 20 20 20 64 65 66 69 6e  _LOCK.#    defin
70e0: 65 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 5f  e SQLITE_THREAD_
70f0: 4f 56 45 52 52 49 44 45 5f 4c 4f 43 4b 20 2d 31  OVERRIDE_LOCK -1
7100: 0a 23 20 20 65 6e 64 69 66 0a 23 20 20 69 66 64  .#  endif.#  ifd
7110: 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69  ef SQLITE_TEST.i
7120: 6e 74 20 74 68 72 65 61 64 73 4f 76 65 72 72 69  nt threadsOverri
7130: 64 65 45 61 63 68 4f 74 68 65 72 73 4c 6f 63 6b  deEachOthersLock
7140: 73 20 3d 20 53 51 4c 49 54 45 5f 54 48 52 45 41  s = SQLITE_THREA
7150: 44 5f 4f 56 45 52 52 49 44 45 5f 4c 4f 43 4b 3b  D_OVERRIDE_LOCK;
7160: 0a 23 20 20 65 6c 73 65 0a 73 74 61 74 69 63 20  .#  else.static 
7170: 69 6e 74 20 74 68 72 65 61 64 73 4f 76 65 72 72  int threadsOverr
7180: 69 64 65 45 61 63 68 4f 74 68 65 72 73 4c 6f 63  ideEachOthersLoc
7190: 6b 73 20 3d 20 53 51 4c 49 54 45 5f 54 48 52 45  ks = SQLITE_THRE
71a0: 41 44 5f 4f 56 45 52 52 49 44 45 5f 4c 4f 43 4b  AD_OVERRIDE_LOCK
71b0: 3b 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69  ;.#  endif.#endi
71c0: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 73 74  f../*.** This st
71d0: 72 75 63 74 75 72 65 20 68 6f 6c 64 73 20 69 6e  ructure holds in
71e0: 66 6f 72 6d 61 74 69 6f 6e 20 70 61 73 73 65 64  formation passed
71f0: 20 69 6e 74 6f 20 69 6e 64 69 76 69 64 75 61 6c   into individual
7200: 20 74 65 73 74 0a 2a 2a 20 74 68 72 65 61 64 73   test.** threads
7210: 20 62 79 20 74 68 65 20 74 65 73 74 54 68 72 65   by the testThre
7220: 61 64 4c 6f 63 6b 69 6e 67 42 65 68 61 76 69 6f  adLockingBehavio
7230: 72 28 29 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a  r() routine..*/.
7240: 73 74 72 75 63 74 20 74 68 72 65 61 64 54 65 73  struct threadTes
7250: 74 44 61 74 61 20 7b 0a 20 20 69 6e 74 20 66 64  tData {.  int fd
7260: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7270: 20 2f 2a 20 46 69 6c 65 20 74 6f 20 62 65 20 6c   /* File to be l
7280: 6f 63 6b 65 64 20 2a 2f 0a 20 20 73 74 72 75 63  ocked */.  struc
7290: 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 20 20 20  t flock lock;   
72a0: 20 20 2f 2a 20 54 68 65 20 6c 6f 63 6b 69 6e 67    /* The locking
72b0: 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20   operation */.  
72c0: 69 6e 74 20 72 65 73 75 6c 74 3b 20 20 20 20 20  int result;     
72d0: 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
72e0: 20 6f 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   of the locking 
72f0: 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 7d 3b 0a  operation */.};.
7300: 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45  .#if SQLITE_THRE
7310: 41 44 53 41 46 45 20 26 26 20 64 65 66 69 6e 65  ADSAFE && define
7320: 64 28 5f 5f 6c 69 6e 75 78 5f 5f 29 0a 2f 2a 0a  d(__linux__)./*.
7330: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
7340: 20 69 73 20 75 73 65 64 20 61 73 20 74 68 65 20   is used as the 
7350: 6d 61 69 6e 20 72 6f 75 74 69 6e 65 20 66 6f 72  main routine for
7360: 20 61 20 74 68 72 65 61 64 20 6c 61 75 6e 63 68   a thread launch
7370: 65 64 20 62 79 0a 2a 2a 20 74 65 73 74 54 68 72  ed by.** testThr
7380: 65 61 64 4c 6f 63 6b 69 6e 67 42 65 68 61 76 69  eadLockingBehavi
7390: 6f 72 28 29 2e 20 49 74 20 74 65 73 74 73 20 77  or(). It tests w
73a0: 68 65 74 68 65 72 20 74 68 65 20 73 68 61 72 65  hether the share
73b0: 64 2d 6c 6f 63 6b 20 6f 62 74 61 69 6e 65 64 0a  d-lock obtained.
73c0: 2a 2a 20 62 79 20 74 68 65 20 6d 61 69 6e 20 74  ** by the main t
73d0: 68 72 65 61 64 20 69 6e 20 74 65 73 74 54 68 72  hread in testThr
73e0: 65 61 64 4c 6f 63 6b 69 6e 67 42 65 68 61 76 69  eadLockingBehavi
73f0: 6f 72 28 29 20 63 6f 6e 66 6c 69 63 74 73 20 77  or() conflicts w
7400: 69 74 68 20 61 0a 2a 2a 20 68 79 70 6f 74 68 65  ith a.** hypothe
7410: 74 69 63 61 6c 20 77 72 69 74 65 2d 6c 6f 63 6b  tical write-lock
7420: 20 6f 62 74 61 69 6e 65 64 20 62 79 20 74 68 69   obtained by thi
7430: 73 20 74 68 72 65 61 64 20 6f 6e 20 74 68 65 20  s thread on the 
7440: 73 61 6d 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  same file..**.**
7450: 20 54 68 65 20 77 72 69 74 65 2d 6c 6f 63 6b 20   The write-lock 
7460: 69 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20  is not actually 
7470: 61 63 71 75 69 72 65 64 2c 20 61 73 20 74 68 69  acquired, as thi
7480: 73 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  s is not possibl
7490: 65 20 69 66 20 0a 2a 2a 20 74 68 65 20 66 69 6c  e if .** the fil
74a0: 65 20 69 73 20 6f 70 65 6e 20 69 6e 20 72 65 61  e is open in rea
74b0: 64 2d 6f 6e 6c 79 20 6d 6f 64 65 20 28 73 65 65  d-only mode (see
74c0: 20 74 69 63 6b 65 74 20 23 33 34 37 32 29 2e 0a   ticket #3472)..
74d0: 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20  */ .static void 
74e0: 2a 74 68 72 65 61 64 4c 6f 63 6b 69 6e 67 54 65  *threadLockingTe
74f0: 73 74 28 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a  st(void *pArg){.
7500: 20 20 73 74 72 75 63 74 20 74 68 72 65 61 64 54    struct threadT
7510: 65 73 74 44 61 74 61 20 2a 70 44 61 74 61 20 3d  estData *pData =
7520: 20 28 73 74 72 75 63 74 20 74 68 72 65 61 64 54   (struct threadT
7530: 65 73 74 44 61 74 61 2a 29 70 41 72 67 3b 0a 20  estData*)pArg;. 
7540: 20 70 44 61 74 61 2d 3e 72 65 73 75 6c 74 20 3d   pData->result =
7550: 20 66 63 6e 74 6c 28 70 44 61 74 61 2d 3e 66 64   fcntl(pData->fd
7560: 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 70 44 61 74  , F_GETLK, &pDat
7570: 61 2d 3e 6c 6f 63 6b 29 3b 0a 20 20 72 65 74 75  a->lock);.  retu
7580: 72 6e 20 70 41 72 67 3b 0a 7d 0a 23 65 6e 64 69  rn pArg;.}.#endi
7590: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 54 48 52 45  f /* SQLITE_THRE
75a0: 41 44 53 41 46 45 20 26 26 20 64 65 66 69 6e 65  ADSAFE && define
75b0: 64 28 5f 5f 6c 69 6e 75 78 5f 5f 29 20 2a 2f 0a  d(__linux__) */.
75c0: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52  ..#if SQLITE_THR
75d0: 45 41 44 53 41 46 45 20 26 26 20 64 65 66 69 6e  EADSAFE && defin
75e0: 65 64 28 5f 5f 6c 69 6e 75 78 5f 5f 29 0a 2f 2a  ed(__linux__)./*
75f0: 0a 2a 2a 20 54 68 69 73 20 70 72 6f 63 65 64 75  .** This procedu
7600: 72 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20 64  re attempts to d
7610: 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72  etermine whether
7620: 20 6f 72 20 6e 6f 74 20 74 68 72 65 61 64 73 0a   or not threads.
7630: 2a 2a 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20  ** can override 
7640: 65 61 63 68 20 6f 74 68 65 72 73 20 6c 6f 63 6b  each others lock
7650: 73 20 74 68 65 6e 20 73 65 74 73 20 74 68 65 20  s then sets the 
7660: 0a 2a 2a 20 74 68 72 65 61 64 73 4f 76 65 72 72  .** threadsOverr
7670: 69 64 65 45 61 63 68 4f 74 68 65 72 73 4c 6f 63  ideEachOthersLoc
7680: 6b 73 20 76 61 72 69 61 62 6c 65 20 61 70 70 72  ks variable appr
7690: 6f 70 72 69 61 74 65 6c 79 2e 0a 2a 2f 0a 73 74  opriately..*/.st
76a0: 61 74 69 63 20 76 6f 69 64 20 74 65 73 74 54 68  atic void testTh
76b0: 72 65 61 64 4c 6f 63 6b 69 6e 67 42 65 68 61 76  readLockingBehav
76c0: 69 6f 72 28 69 6e 74 20 66 64 5f 6f 72 69 67 29  ior(int fd_orig)
76d0: 7b 0a 20 20 69 6e 74 20 66 64 3b 0a 20 20 69 6e  {.  int fd;.  in
76e0: 74 20 72 63 3b 0a 20 20 73 74 72 75 63 74 20 74  t rc;.  struct t
76f0: 68 72 65 61 64 54 65 73 74 44 61 74 61 20 64 3b  hreadTestData d;
7700: 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20  .  struct flock 
7710: 6c 3b 0a 20 20 70 74 68 72 65 61 64 5f 74 20 74  l;.  pthread_t t
7720: 3b 0a 0a 20 20 66 64 20 3d 20 64 75 70 28 66 64  ;..  fd = dup(fd
7730: 5f 6f 72 69 67 29 3b 0a 20 20 69 66 28 20 66 64  _orig);.  if( fd
7740: 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 6d  <0 ) return;.  m
7750: 65 6d 73 65 74 28 26 6c 2c 20 30 2c 20 73 69 7a  emset(&l, 0, siz
7760: 65 6f 66 28 6c 29 29 3b 0a 20 20 6c 2e 6c 5f 74  eof(l));.  l.l_t
7770: 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20  ype = F_RDLCK;. 
7780: 20 6c 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20   l.l_len = 1;.  
7790: 6c 2e 6c 5f 73 74 61 72 74 20 3d 20 30 3b 0a 20  l.l_start = 0;. 
77a0: 20 6c 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45   l.l_whence = SE
77b0: 45 4b 5f 53 45 54 3b 0a 20 20 72 63 20 3d 20 66  EK_SET;.  rc = f
77c0: 63 6e 74 6c 28 66 64 5f 6f 72 69 67 2c 20 46 5f  cntl(fd_orig, F_
77d0: 53 45 54 4c 4b 2c 20 26 6c 29 3b 0a 20 20 69 66  SETLK, &l);.  if
77e0: 28 20 72 63 21 3d 30 20 29 20 72 65 74 75 72 6e  ( rc!=0 ) return
77f0: 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 2c 20 30  ;.  memset(&d, 0
7800: 2c 20 73 69 7a 65 6f 66 28 64 29 29 3b 0a 20 20  , sizeof(d));.  
7810: 64 2e 66 64 20 3d 20 66 64 3b 0a 20 20 64 2e 6c  d.fd = fd;.  d.l
7820: 6f 63 6b 20 3d 20 6c 3b 0a 20 20 64 2e 6c 6f 63  ock = l;.  d.loc
7830: 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57 52 4c  k.l_type = F_WRL
7840: 43 4b 3b 0a 20 20 69 66 28 20 70 74 68 72 65 61  CK;.  if( pthrea
7850: 64 5f 63 72 65 61 74 65 28 26 74 2c 20 30 2c 20  d_create(&t, 0, 
7860: 74 68 72 65 61 64 4c 6f 63 6b 69 6e 67 54 65 73  threadLockingTes
7870: 74 2c 20 26 64 29 3d 3d 30 20 29 7b 0a 20 20 20  t, &d)==0 ){.   
7880: 20 70 74 68 72 65 61 64 5f 6a 6f 69 6e 28 74 2c   pthread_join(t,
7890: 20 30 29 3b 0a 20 20 7d 0a 20 20 63 6c 6f 73 65   0);.  }.  close
78a0: 28 66 64 29 3b 0a 20 20 69 66 28 20 64 2e 72 65  (fd);.  if( d.re
78b0: 73 75 6c 74 21 3d 30 20 29 20 72 65 74 75 72 6e  sult!=0 ) return
78c0: 3b 0a 20 20 74 68 72 65 61 64 73 4f 76 65 72 72  ;.  threadsOverr
78d0: 69 64 65 45 61 63 68 4f 74 68 65 72 73 4c 6f 63  ideEachOthersLoc
78e0: 6b 73 20 3d 20 28 64 2e 6c 6f 63 6b 2e 6c 5f 74  ks = (d.lock.l_t
78f0: 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 29 3b 0a 7d  ype==F_UNLCK);.}
7900: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
7910: 45 5f 54 48 52 45 41 44 53 41 46 45 20 26 26 20  E_THREADSAFE && 
7920: 64 65 66 69 6e 65 64 28 5f 5f 6c 69 6e 75 78 5f  defined(__linux_
7930: 5f 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c  _) */../*.** Rel
7940: 65 61 73 65 20 61 20 75 6e 69 78 4c 6f 63 6b 49  ease a unixLockI
7950: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 70 72  nfo structure pr
7960: 65 76 69 6f 75 73 6c 79 20 61 6c 6c 6f 63 61 74  eviously allocat
7970: 65 64 20 62 79 20 66 69 6e 64 4c 6f 63 6b 49 6e  ed by findLockIn
7980: 66 6f 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  fo()..**.** The 
7990: 6d 75 74 65 78 20 65 6e 74 65 72 65 64 20 75 73  mutex entered us
79a0: 69 6e 67 20 74 68 65 20 75 6e 69 78 45 6e 74 65  ing the unixEnte
79b0: 72 4d 75 74 65 78 28 29 20 66 75 6e 63 74 69 6f  rMutex() functio
79c0: 6e 20 6d 75 73 74 20 62 65 20 68 65 6c 64 0a 2a  n must be held.*
79d0: 2a 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  * when this func
79e0: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a  tion is called..
79f0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
7a00: 65 6c 65 61 73 65 4c 6f 63 6b 49 6e 66 6f 28 73  eleaseLockInfo(s
7a10: 74 72 75 63 74 20 75 6e 69 78 4c 6f 63 6b 49 6e  truct unixLockIn
7a20: 66 6f 20 2a 70 4c 6f 63 6b 29 7b 0a 20 20 61 73  fo *pLock){.  as
7a30: 73 65 72 74 28 20 75 6e 69 78 4d 75 74 65 78 48  sert( unixMutexH
7a40: 65 6c 64 28 29 20 29 3b 0a 20 20 69 66 28 20 70  eld() );.  if( p
7a50: 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70 4c 6f 63  Lock ){.    pLoc
7a60: 6b 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 69  k->nRef--;.    i
7a70: 66 28 20 70 4c 6f 63 6b 2d 3e 6e 52 65 66 3d 3d  f( pLock->nRef==
7a80: 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  0 ){.      if( p
7a90: 4c 6f 63 6b 2d 3e 70 50 72 65 76 20 29 7b 0a 20  Lock->pPrev ){. 
7aa0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
7ab0: 4c 6f 63 6b 2d 3e 70 50 72 65 76 2d 3e 70 4e 65  Lock->pPrev->pNe
7ac0: 78 74 3d 3d 70 4c 6f 63 6b 20 29 3b 0a 20 20 20  xt==pLock );.   
7ad0: 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 70 50 72 65       pLock->pPre
7ae0: 76 2d 3e 70 4e 65 78 74 20 3d 20 70 4c 6f 63 6b  v->pNext = pLock
7af0: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  ->pNext;.      }
7b00: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73  else{.        as
7b10: 73 65 72 74 28 20 6c 6f 63 6b 4c 69 73 74 3d 3d  sert( lockList==
7b20: 70 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 20 20 20  pLock );.       
7b30: 20 6c 6f 63 6b 4c 69 73 74 20 3d 20 70 4c 6f 63   lockList = pLoc
7b40: 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  k->pNext;.      
7b50: 7d 0a 20 20 20 20 20 20 69 66 28 20 70 4c 6f 63  }.      if( pLoc
7b60: 6b 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20  k->pNext ){.    
7b70: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63      assert( pLoc
7b80: 6b 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 3d  k->pNext->pPrev=
7b90: 3d 70 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 20 20  =pLock );.      
7ba0: 20 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 2d 3e    pLock->pNext->
7bb0: 70 50 72 65 76 20 3d 20 70 4c 6f 63 6b 2d 3e 70  pPrev = pLock->p
7bc0: 50 72 65 76 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Prev;.      }.  
7bd0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
7be0: 28 70 4c 6f 63 6b 29 3b 0a 20 20 20 20 7d 0a 20  (pLock);.    }. 
7bf0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65   }.}../*.** Rele
7c00: 61 73 65 20 61 20 75 6e 69 78 4f 70 65 6e 43 6e  ase a unixOpenCn
7c10: 74 20 73 74 72 75 63 74 75 72 65 20 70 72 65 76  t structure prev
7c20: 69 6f 75 73 6c 79 20 61 6c 6c 6f 63 61 74 65 64  iously allocated
7c30: 20 62 79 20 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f   by findLockInfo
7c40: 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 75  ()..**.** The mu
7c50: 74 65 78 20 65 6e 74 65 72 65 64 20 75 73 69 6e  tex entered usin
7c60: 67 20 74 68 65 20 75 6e 69 78 45 6e 74 65 72 4d  g the unixEnterM
7c70: 75 74 65 78 28 29 20 66 75 6e 63 74 69 6f 6e 20  utex() function 
7c80: 6d 75 73 74 20 62 65 20 68 65 6c 64 0a 2a 2a 20  must be held.** 
7c90: 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
7ca0: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f  on is called..*/
7cb0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c  .static void rel
7cc0: 65 61 73 65 4f 70 65 6e 43 6e 74 28 73 74 72 75  easeOpenCnt(stru
7cd0: 63 74 20 75 6e 69 78 4f 70 65 6e 43 6e 74 20 2a  ct unixOpenCnt *
7ce0: 70 4f 70 65 6e 29 7b 0a 20 20 61 73 73 65 72 74  pOpen){.  assert
7cf0: 28 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28  ( unixMutexHeld(
7d00: 29 20 29 3b 0a 20 20 69 66 28 20 70 4f 70 65 6e  ) );.  if( pOpen
7d10: 20 29 7b 0a 20 20 20 20 70 4f 70 65 6e 2d 3e 6e   ){.    pOpen->n
7d20: 52 65 66 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70  Ref--;.    if( p
7d30: 4f 70 65 6e 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b  Open->nRef==0 ){
7d40: 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70 65 6e  .      if( pOpen
7d50: 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20 20  ->pPrev ){.     
7d60: 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 65 6e     assert( pOpen
7d70: 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 3d 3d  ->pPrev->pNext==
7d80: 70 4f 70 65 6e 20 29 3b 0a 20 20 20 20 20 20 20  pOpen );.       
7d90: 20 70 4f 70 65 6e 2d 3e 70 50 72 65 76 2d 3e 70   pOpen->pPrev->p
7da0: 4e 65 78 74 20 3d 20 70 4f 70 65 6e 2d 3e 70 4e  Next = pOpen->pN
7db0: 65 78 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ext;.      }else
7dc0: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
7dd0: 28 20 6f 70 65 6e 4c 69 73 74 3d 3d 70 4f 70 65  ( openList==pOpe
7de0: 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 6f 70 65  n );.        ope
7df0: 6e 4c 69 73 74 20 3d 20 70 4f 70 65 6e 2d 3e 70  nList = pOpen->p
7e00: 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Next;.      }.  
7e10: 20 20 20 20 69 66 28 20 70 4f 70 65 6e 2d 3e 70      if( pOpen->p
7e20: 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Next ){.        
7e30: 61 73 73 65 72 74 28 20 70 4f 70 65 6e 2d 3e 70  assert( pOpen->p
7e40: 4e 65 78 74 2d 3e 70 50 72 65 76 3d 3d 70 4f 70  Next->pPrev==pOp
7e50: 65 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4f  en );.        pO
7e60: 70 65 6e 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65  pen->pNext->pPre
7e70: 76 20 3d 20 70 4f 70 65 6e 2d 3e 70 50 72 65 76  v = pOpen->pPrev
7e80: 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 20 53 51  ;.      }.#if SQ
7e90: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 20  LITE_THREADSAFE 
7ea0: 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 6c 69 6e  && defined(__lin
7eb0: 75 78 5f 5f 29 0a 20 20 20 20 20 20 61 73 73 65  ux__).      asse
7ec0: 72 74 28 20 21 70 4f 70 65 6e 2d 3e 70 55 6e 75  rt( !pOpen->pUnu
7ed0: 73 65 64 20 7c 7c 20 74 68 72 65 61 64 73 4f 76  sed || threadsOv
7ee0: 65 72 72 69 64 65 45 61 63 68 4f 74 68 65 72 73  errideEachOthers
7ef0: 4c 6f 63 6b 73 3d 3d 30 20 29 3b 0a 23 65 6e 64  Locks==0 );.#end
7f00: 69 66 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  if..      /* If 
7f10: 70 4f 70 65 6e 2d 3e 70 55 6e 75 73 65 64 20 69  pOpen->pUnused i
7f20: 73 20 6e 6f 74 20 6e 75 6c 6c 2c 20 74 68 65 6e  s not null, then
7f30: 20 6d 65 6d 6f 72 79 20 61 6e 64 20 66 69 6c 65   memory and file
7f40: 2d 64 65 73 63 72 69 70 74 6f 72 73 0a 20 20 20  -descriptors.   
7f50: 20 20 20 2a 2a 20 61 72 65 20 6c 65 61 6b 65 64     ** are leaked
7f60: 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
7f70: 20 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 6f 6e   ** This will on
7f80: 6c 79 20 68 61 70 70 65 6e 20 69 66 2c 20 75 6e  ly happen if, un
7f90: 64 65 72 20 4c 69 6e 75 78 74 68 72 65 61 64 73  der Linuxthreads
7fa0: 2c 20 74 68 65 20 75 73 65 72 20 68 61 73 20 6f  , the user has o
7fb0: 70 65 6e 65 64 0a 20 20 20 20 20 20 2a 2a 20 61  pened.      ** a
7fc0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20   transaction in 
7fd0: 6f 6e 65 20 74 68 72 65 61 64 2c 20 74 68 65 6e  one thread, then
7fe0: 20 61 74 74 65 6d 70 74 73 20 74 6f 20 63 6c 6f   attempts to clo
7ff0: 73 65 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  se the database.
8000: 20 20 20 20 20 20 2a 2a 20 68 61 6e 64 6c 65 20        ** handle 
8010: 66 72 6f 6d 20 61 6e 6f 74 68 65 72 20 74 68 72  from another thr
8020: 65 61 64 20 28 77 69 74 68 6f 75 74 20 66 69 72  ead (without fir
8030: 73 74 20 75 6e 6c 6f 63 6b 69 6e 67 20 74 68 65  st unlocking the
8040: 20 64 62 20 66 69 6c 65 29 2e 0a 20 20 20 20 20   db file)..     
8050: 20 2a 2a 20 54 68 69 73 20 69 73 20 61 20 6d 69   ** This is a mi
8060: 73 75 73 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20  suse.  */.      
8070: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4f 70  sqlite3_free(pOp
8080: 65 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  en);.    }.  }.}
8090: 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20  ../*.** Given a 
80a0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2c  file descriptor,
80b0: 20 6c 6f 63 61 74 65 20 75 6e 69 78 4c 6f 63 6b   locate unixLock
80c0: 49 6e 66 6f 20 61 6e 64 20 75 6e 69 78 4f 70 65  Info and unixOpe
80d0: 6e 43 6e 74 20 73 74 72 75 63 74 75 72 65 73 20  nCnt structures 
80e0: 74 68 61 74 0a 2a 2a 20 64 65 73 63 72 69 62 65  that.** describe
80f0: 73 20 74 68 61 74 20 66 69 6c 65 20 64 65 73 63  s that file desc
8100: 72 69 70 74 6f 72 2e 20 20 43 72 65 61 74 65 20  riptor.  Create 
8110: 6e 65 77 20 6f 6e 65 73 20 69 66 20 6e 65 63 65  new ones if nece
8120: 73 73 61 72 79 2e 20 20 54 68 65 0a 2a 2a 20 72  ssary.  The.** r
8130: 65 74 75 72 6e 20 76 61 6c 75 65 73 20 6d 69 67  eturn values mig
8140: 68 74 20 62 65 20 75 6e 69 6e 69 74 69 61 6c 69  ht be uninitiali
8150: 7a 65 64 20 69 66 20 61 6e 20 65 72 72 6f 72 20  zed if an error 
8160: 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  occurs..**.** Th
8170: 65 20 6d 75 74 65 78 20 65 6e 74 65 72 65 64 20  e mutex entered 
8180: 75 73 69 6e 67 20 74 68 65 20 75 6e 69 78 45 6e  using the unixEn
8190: 74 65 72 4d 75 74 65 78 28 29 20 66 75 6e 63 74  terMutex() funct
81a0: 69 6f 6e 20 6d 75 73 74 20 62 65 20 68 65 6c 64  ion must be held
81b0: 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73 20 66 75  .** when this fu
81c0: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
81d0: 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ..**.** Return a
81e0: 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72  n appropriate er
81f0: 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61  ror code..*/.sta
8200: 74 69 63 20 69 6e 74 20 66 69 6e 64 4c 6f 63 6b  tic int findLock
8210: 49 6e 66 6f 28 0a 20 20 75 6e 69 78 46 69 6c 65  Info(.  unixFile
8220: 20 2a 70 46 69 6c 65 2c 20 20 20 20 20 20 20 20   *pFile,        
8230: 20 20 20 20 20 20 20 2f 2a 20 55 6e 69 78 20 66         /* Unix f
8240: 69 6c 65 20 77 69 74 68 20 66 69 6c 65 20 64 65  ile with file de
8250: 73 63 20 75 73 65 64 20 69 6e 20 74 68 65 20 6b  sc used in the k
8260: 65 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 75  ey */.  struct u
8270: 6e 69 78 4c 6f 63 6b 49 6e 66 6f 20 2a 2a 70 70  nixLockInfo **pp
8280: 4c 6f 63 6b 2c 20 20 2f 2a 20 52 65 74 75 72 6e  Lock,  /* Return
8290: 20 74 68 65 20 75 6e 69 78 4c 6f 63 6b 49 6e 66   the unixLockInf
82a0: 6f 20 73 74 72 75 63 74 75 72 65 20 68 65 72 65  o structure here
82b0: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 75 6e 69   */.  struct uni
82c0: 78 4f 70 65 6e 43 6e 74 20 2a 2a 70 70 4f 70 65  xOpenCnt **ppOpe
82d0: 6e 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74  n    /* Return t
82e0: 68 65 20 75 6e 69 78 4f 70 65 6e 43 6e 74 20 73  he unixOpenCnt s
82f0: 74 72 75 63 74 75 72 65 20 68 65 72 65 20 2a 2f  tructure here */
8300: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  .){.  int rc;   
8310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8320: 20 20 20 20 20 2f 2a 20 53 79 73 74 65 6d 20 63       /* System c
8330: 61 6c 6c 20 72 65 74 75 72 6e 20 63 6f 64 65 20  all return code 
8340: 2a 2f 0a 20 20 69 6e 74 20 66 64 3b 20 20 20 20  */.  int fd;    
8350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8360: 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20      /* The file 
8370: 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20 70  descriptor for p
8380: 46 69 6c 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  File */.  struct
8390: 20 75 6e 69 78 4c 6f 63 6b 4b 65 79 20 6c 6f 63   unixLockKey loc
83a0: 6b 4b 65 79 3b 20 20 20 20 2f 2a 20 4c 6f 6f 6b  kKey;    /* Look
83b0: 75 70 20 6b 65 79 20 66 6f 72 20 74 68 65 20 75  up key for the u
83c0: 6e 69 78 4c 6f 63 6b 49 6e 66 6f 20 73 74 72 75  nixLockInfo stru
83d0: 63 74 75 72 65 20 2a 2f 0a 20 20 73 74 72 75 63  cture */.  struc
83e0: 74 20 75 6e 69 78 46 69 6c 65 49 64 20 66 69 6c  t unixFileId fil
83f0: 65 49 64 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 6f  eId;      /* Loo
8400: 6b 75 70 20 6b 65 79 20 66 6f 72 20 74 68 65 20  kup key for the 
8410: 75 6e 69 78 4f 70 65 6e 43 6e 74 20 73 74 72 75  unixOpenCnt stru
8420: 63 74 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73  ct */.  struct s
8430: 74 61 74 20 73 74 61 74 62 75 66 3b 20 20 20 20  tat statbuf;    
8440: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 77 2d 6c 65         /* Low-le
8450: 76 65 6c 20 66 69 6c 65 20 69 6e 66 6f 72 6d 61  vel file informa
8460: 74 69 6f 6e 20 2a 2f 0a 20 20 73 74 72 75 63 74  tion */.  struct
8470: 20 75 6e 69 78 4c 6f 63 6b 49 6e 66 6f 20 2a 70   unixLockInfo *p
8480: 4c 6f 63 6b 20 3d 20 30 3b 2f 2a 20 43 61 6e 64  Lock = 0;/* Cand
8490: 69 64 61 74 65 20 75 6e 69 78 4c 6f 63 6b 49 6e  idate unixLockIn
84a0: 66 6f 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 73  fo object */.  s
84b0: 74 72 75 63 74 20 75 6e 69 78 4f 70 65 6e 43 6e  truct unixOpenCn
84c0: 74 20 2a 70 4f 70 65 6e 3b 20 20 20 20 20 2f 2a  t *pOpen;     /*
84d0: 20 43 61 6e 64 69 64 61 74 65 20 75 6e 69 78 4f   Candidate unixO
84e0: 70 65 6e 43 6e 74 20 6f 62 6a 65 63 74 20 2a 2f  penCnt object */
84f0: 0a 0a 20 20 61 73 73 65 72 74 28 20 75 6e 69 78  ..  assert( unix
8500: 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 0a  MutexHeld() );..
8510: 20 20 2f 2a 20 47 65 74 20 6c 6f 77 2d 6c 65 76    /* Get low-lev
8520: 65 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  el information a
8530: 62 6f 75 74 20 74 68 65 20 66 69 6c 65 20 74 68  bout the file th
8540: 61 74 20 77 65 20 63 61 6e 20 75 73 65 64 20 74  at we can used t
8550: 6f 0a 20 20 2a 2a 20 63 72 65 61 74 65 20 61 20  o.  ** create a 
8560: 75 6e 69 71 75 65 20 6e 61 6d 65 20 66 6f 72 20  unique name for 
8570: 74 68 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20  the file..  */. 
8580: 20 66 64 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a   fd = pFile->h;.
8590: 20 20 72 63 20 3d 20 66 73 74 61 74 28 66 64 2c    rc = fstat(fd,
85a0: 20 26 73 74 61 74 62 75 66 29 3b 0a 20 20 69 66   &statbuf);.  if
85b0: 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 70  ( rc!=0 ){.    p
85c0: 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
85d0: 3d 20 65 72 72 6e 6f 3b 0a 23 69 66 64 65 66 20  = errno;.#ifdef 
85e0: 45 4f 56 45 52 46 4c 4f 57 0a 20 20 20 20 69 66  EOVERFLOW.    if
85f0: 28 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  ( pFile->lastErr
8600: 6e 6f 3d 3d 45 4f 56 45 52 46 4c 4f 57 20 29 20  no==EOVERFLOW ) 
8610: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
8620: 4c 46 53 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  LFS;.#endif.    
8630: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
8640: 45 52 52 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66  ERR;.  }..#ifdef
8650: 20 5f 5f 41 50 50 4c 45 5f 5f 0a 20 20 2f 2a 20   __APPLE__.  /* 
8660: 4f 6e 20 4f 53 20 58 20 6f 6e 20 61 6e 20 6d 73  On OS X on an ms
8670: 64 6f 73 20 66 69 6c 65 73 79 73 74 65 6d 2c 20  dos filesystem, 
8680: 74 68 65 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72  the inode number
8690: 20 69 73 20 72 65 70 6f 72 74 65 64 0a 20 20 2a   is reported.  *
86a0: 2a 20 69 6e 63 6f 72 72 65 63 74 6c 79 20 66 6f  * incorrectly fo
86b0: 72 20 7a 65 72 6f 2d 73 69 7a 65 20 66 69 6c 65  r zero-size file
86c0: 73 2e 20 20 53 65 65 20 74 69 63 6b 65 74 20 23  s.  See ticket #
86d0: 33 32 36 30 2e 20 20 54 6f 20 77 6f 72 6b 0a 20  3260.  To work. 
86e0: 20 2a 2a 20 61 72 6f 75 6e 64 20 74 68 69 73 20   ** around this 
86f0: 70 72 6f 62 6c 65 6d 20 28 77 65 20 63 6f 6e 73  problem (we cons
8700: 69 64 65 72 20 69 74 20 61 20 62 75 67 20 69 6e  ider it a bug in
8710: 20 4f 53 20 58 2c 20 6e 6f 74 20 53 51 4c 69 74   OS X, not SQLit
8720: 65 29 0a 20 20 2a 2a 20 77 65 20 61 6c 77 61 79  e).  ** we alway
8730: 73 20 69 6e 63 72 65 61 73 65 20 74 68 65 20 66  s increase the f
8740: 69 6c 65 20 73 69 7a 65 20 74 6f 20 31 20 62 79  ile size to 1 by
8750: 20 77 72 69 74 69 6e 67 20 61 20 73 69 6e 67 6c   writing a singl
8760: 65 20 62 79 74 65 0a 20 20 2a 2a 20 70 72 69 6f  e byte.  ** prio
8770: 72 20 74 6f 20 61 63 63 65 73 73 69 6e 67 20 74  r to accessing t
8780: 68 65 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72 2e  he inode number.
8790: 20 20 54 68 65 20 6f 6e 65 20 62 79 74 65 20 77    The one byte w
87a0: 72 69 74 74 65 6e 20 69 73 0a 20 20 2a 2a 20 61  ritten is.  ** a
87b0: 6e 20 41 53 43 49 49 20 27 53 27 20 63 68 61 72  n ASCII 'S' char
87c0: 61 63 74 65 72 20 77 68 69 63 68 20 61 6c 73 6f  acter which also
87d0: 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20 74   happens to be t
87e0: 68 65 20 66 69 72 73 74 20 62 79 74 65 0a 20 20  he first byte.  
87f0: 2a 2a 20 69 6e 20 74 68 65 20 68 65 61 64 65 72  ** in the header
8800: 20 6f 66 20 65 76 65 72 79 20 53 51 4c 69 74 65   of every SQLite
8810: 20 64 61 74 61 62 61 73 65 2e 20 20 49 6e 20 74   database.  In t
8820: 68 69 73 20 77 61 79 2c 20 69 66 20 74 68 65 72  his way, if ther
8830: 65 0a 20 20 2a 2a 20 69 73 20 61 20 72 61 63 65  e.  ** is a race
8840: 20 63 6f 6e 64 69 74 69 6f 6e 20 73 75 63 68 20   condition such 
8850: 74 68 61 74 20 61 6e 6f 74 68 65 72 20 74 68 72  that another thr
8860: 65 61 64 20 68 61 73 20 61 6c 72 65 61 64 79 20  ead has already 
8870: 70 6f 70 75 6c 61 74 65 64 0a 20 20 2a 2a 20 74  populated.  ** t
8880: 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66  he first page of
8890: 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 6e   the database, n
88a0: 6f 20 64 61 6d 61 67 65 20 69 73 20 64 6f 6e 65  o damage is done
88b0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 74 61  ..  */.  if( sta
88c0: 74 62 75 66 2e 73 74 5f 73 69 7a 65 3d 3d 30 20  tbuf.st_size==0 
88d0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 77 72 69 74  ){.    rc = writ
88e0: 65 28 66 64 2c 20 22 53 22 2c 20 31 29 3b 0a 20  e(fd, "S", 1);. 
88f0: 20 20 20 69 66 28 20 72 63 21 3d 31 20 29 7b 0a     if( rc!=1 ){.
8900: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
8910: 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20 7d  ITE_IOERR;.    }
8920: 0a 20 20 20 20 72 63 20 3d 20 66 73 74 61 74 28  .    rc = fstat(
8930: 66 64 2c 20 26 73 74 61 74 62 75 66 29 3b 0a 20  fd, &statbuf);. 
8940: 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a     if( rc!=0 ){.
8950: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
8960: 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
8970: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
8980: 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20 7d  ITE_IOERR;.    }
8990: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 6d  .  }.#endif..  m
89a0: 65 6d 73 65 74 28 26 6c 6f 63 6b 4b 65 79 2c 20  emset(&lockKey, 
89b0: 30 2c 20 73 69 7a 65 6f 66 28 6c 6f 63 6b 4b 65  0, sizeof(lockKe
89c0: 79 29 29 3b 0a 20 20 6c 6f 63 6b 4b 65 79 2e 66  y));.  lockKey.f
89d0: 69 64 2e 64 65 76 20 3d 20 73 74 61 74 62 75 66  id.dev = statbuf
89e0: 2e 73 74 5f 64 65 76 3b 0a 23 69 66 20 4f 53 5f  .st_dev;.#if OS_
89f0: 56 58 57 4f 52 4b 53 0a 20 20 6c 6f 63 6b 4b 65  VXWORKS.  lockKe
8a00: 79 2e 66 69 64 2e 70 49 64 20 3d 20 70 46 69 6c  y.fid.pId = pFil
8a10: 65 2d 3e 70 49 64 3b 0a 23 65 6c 73 65 0a 20 20  e->pId;.#else.  
8a20: 6c 6f 63 6b 4b 65 79 2e 66 69 64 2e 69 6e 6f 20  lockKey.fid.ino 
8a30: 3d 20 73 74 61 74 62 75 66 2e 73 74 5f 69 6e 6f  = statbuf.st_ino
8a40: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  ;.#endif.#if SQL
8a50: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 20 26  ITE_THREADSAFE &
8a60: 26 20 64 65 66 69 6e 65 64 28 5f 5f 6c 69 6e 75  & defined(__linu
8a70: 78 5f 5f 29 0a 20 20 69 66 28 20 74 68 72 65 61  x__).  if( threa
8a80: 64 73 4f 76 65 72 72 69 64 65 45 61 63 68 4f 74  dsOverrideEachOt
8a90: 68 65 72 73 4c 6f 63 6b 73 3c 30 20 29 7b 0a 20  hersLocks<0 ){. 
8aa0: 20 20 20 74 65 73 74 54 68 72 65 61 64 4c 6f 63     testThreadLoc
8ab0: 6b 69 6e 67 42 65 68 61 76 69 6f 72 28 66 64 29  kingBehavior(fd)
8ac0: 3b 0a 20 20 7d 0a 20 20 6c 6f 63 6b 4b 65 79 2e  ;.  }.  lockKey.
8ad0: 74 69 64 20 3d 20 74 68 72 65 61 64 73 4f 76 65  tid = threadsOve
8ae0: 72 72 69 64 65 45 61 63 68 4f 74 68 65 72 73 4c  rrideEachOthersL
8af0: 6f 63 6b 73 20 3f 20 30 20 3a 20 70 74 68 72 65  ocks ? 0 : pthre
8b00: 61 64 5f 73 65 6c 66 28 29 3b 0a 23 65 6e 64 69  ad_self();.#endi
8b10: 66 0a 20 20 66 69 6c 65 49 64 20 3d 20 6c 6f 63  f.  fileId = loc
8b20: 6b 4b 65 79 2e 66 69 64 3b 0a 20 20 69 66 28 20  kKey.fid;.  if( 
8b30: 70 70 4c 6f 63 6b 21 3d 30 20 29 7b 0a 20 20 20  ppLock!=0 ){.   
8b40: 20 70 4c 6f 63 6b 20 3d 20 6c 6f 63 6b 4c 69 73   pLock = lockLis
8b50: 74 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 4c  t;.    while( pL
8b60: 6f 63 6b 20 26 26 20 6d 65 6d 63 6d 70 28 26 6c  ock && memcmp(&l
8b70: 6f 63 6b 4b 65 79 2c 20 26 70 4c 6f 63 6b 2d 3e  ockKey, &pLock->
8b80: 6c 6f 63 6b 4b 65 79 2c 20 73 69 7a 65 6f 66 28  lockKey, sizeof(
8b90: 6c 6f 63 6b 4b 65 79 29 29 20 29 7b 0a 20 20 20  lockKey)) ){.   
8ba0: 20 20 20 70 4c 6f 63 6b 20 3d 20 70 4c 6f 63 6b     pLock = pLock
8bb0: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20  ->pNext;.    }. 
8bc0: 20 20 20 69 66 28 20 70 4c 6f 63 6b 3d 3d 30 20     if( pLock==0 
8bd0: 29 7b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 20 3d  ){.      pLock =
8be0: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
8bf0: 20 73 69 7a 65 6f 66 28 2a 70 4c 6f 63 6b 29 20   sizeof(*pLock) 
8c00: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 6f  );.      if( pLo
8c10: 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ck==0 ){.       
8c20: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
8c30: 45 4d 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  EM;.        goto
8c40: 20 65 78 69 74 5f 66 69 6e 64 6c 6f 63 6b 69 6e   exit_findlockin
8c50: 66 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  fo;.      }.    
8c60: 20 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 4b 65 79    pLock->lockKey
8c70: 20 3d 20 6c 6f 63 6b 4b 65 79 3b 0a 20 20 20 20   = lockKey;.    
8c80: 20 20 70 4c 6f 63 6b 2d 3e 6e 52 65 66 20 3d 20    pLock->nRef = 
8c90: 31 3b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e  1;.      pLock->
8ca0: 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  cnt = 0;.      p
8cb0: 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d  Lock->locktype =
8cc0: 20 30 3b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 2d   0;.      pLock-
8cd0: 3e 70 4e 65 78 74 20 3d 20 6c 6f 63 6b 4c 69 73  >pNext = lockLis
8ce0: 74 3b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e  t;.      pLock->
8cf0: 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 20  pPrev = 0;.     
8d00: 20 69 66 28 20 6c 6f 63 6b 4c 69 73 74 20 29 20   if( lockList ) 
8d10: 6c 6f 63 6b 4c 69 73 74 2d 3e 70 50 72 65 76 20  lockList->pPrev 
8d20: 3d 20 70 4c 6f 63 6b 3b 0a 20 20 20 20 20 20 6c  = pLock;.      l
8d30: 6f 63 6b 4c 69 73 74 20 3d 20 70 4c 6f 63 6b 3b  ockList = pLock;
8d40: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
8d50: 20 20 70 4c 6f 63 6b 2d 3e 6e 52 65 66 2b 2b 3b    pLock->nRef++;
8d60: 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 70 4c 6f  .    }.    *ppLo
8d70: 63 6b 20 3d 20 70 4c 6f 63 6b 3b 0a 20 20 7d 0a  ck = pLock;.  }.
8d80: 20 20 69 66 28 20 70 70 4f 70 65 6e 21 3d 30 20    if( ppOpen!=0 
8d90: 29 7b 0a 20 20 20 20 70 4f 70 65 6e 20 3d 20 6f  ){.    pOpen = o
8da0: 70 65 6e 4c 69 73 74 3b 0a 20 20 20 20 77 68 69  penList;.    whi
8db0: 6c 65 28 20 70 4f 70 65 6e 20 26 26 20 6d 65 6d  le( pOpen && mem
8dc0: 63 6d 70 28 26 66 69 6c 65 49 64 2c 20 26 70 4f  cmp(&fileId, &pO
8dd0: 70 65 6e 2d 3e 66 69 6c 65 49 64 2c 20 73 69 7a  pen->fileId, siz
8de0: 65 6f 66 28 66 69 6c 65 49 64 29 29 20 29 7b 0a  eof(fileId)) ){.
8df0: 20 20 20 20 20 20 70 4f 70 65 6e 20 3d 20 70 4f        pOpen = pO
8e00: 70 65 6e 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  pen->pNext;.    
8e10: 7d 0a 20 20 20 20 69 66 28 20 70 4f 70 65 6e 3d  }.    if( pOpen=
8e20: 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4f 70 65  =0 ){.      pOpe
8e30: 6e 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  n = sqlite3_mall
8e40: 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 4f 70 65  oc( sizeof(*pOpe
8e50: 6e 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  n) );.      if( 
8e60: 70 4f 70 65 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  pOpen==0 ){.    
8e70: 20 20 20 20 72 65 6c 65 61 73 65 4c 6f 63 6b 49      releaseLockI
8e80: 6e 66 6f 28 70 4c 6f 63 6b 29 3b 0a 20 20 20 20  nfo(pLock);.    
8e90: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
8ea0: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 67  NOMEM;.        g
8eb0: 6f 74 6f 20 65 78 69 74 5f 66 69 6e 64 6c 6f 63  oto exit_findloc
8ec0: 6b 69 6e 66 6f 3b 0a 20 20 20 20 20 20 7d 0a 20  kinfo;.      }. 
8ed0: 20 20 20 20 20 6d 65 6d 73 65 74 28 70 4f 70 65       memset(pOpe
8ee0: 6e 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 4f  n, 0, sizeof(*pO
8ef0: 70 65 6e 29 29 3b 0a 20 20 20 20 20 20 70 4f 70  pen));.      pOp
8f00: 65 6e 2d 3e 66 69 6c 65 49 64 20 3d 20 66 69 6c  en->fileId = fil
8f10: 65 49 64 3b 0a 20 20 20 20 20 20 70 4f 70 65 6e  eId;.      pOpen
8f20: 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20  ->nRef = 1;.    
8f30: 20 20 70 4f 70 65 6e 2d 3e 70 4e 65 78 74 20 3d    pOpen->pNext =
8f40: 20 6f 70 65 6e 4c 69 73 74 3b 0a 20 20 20 20 20   openList;.     
8f50: 20 69 66 28 20 6f 70 65 6e 4c 69 73 74 20 29 20   if( openList ) 
8f60: 6f 70 65 6e 4c 69 73 74 2d 3e 70 50 72 65 76 20  openList->pPrev 
8f70: 3d 20 70 4f 70 65 6e 3b 0a 20 20 20 20 20 20 6f  = pOpen;.      o
8f80: 70 65 6e 4c 69 73 74 20 3d 20 70 4f 70 65 6e 3b  penList = pOpen;
8f90: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
8fa0: 20 20 70 4f 70 65 6e 2d 3e 6e 52 65 66 2b 2b 3b    pOpen->nRef++;
8fb0: 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 70 4f 70  .    }.    *ppOp
8fc0: 65 6e 20 3d 20 70 4f 70 65 6e 3b 0a 20 20 7d 0a  en = pOpen;.  }.
8fd0: 0a 65 78 69 74 5f 66 69 6e 64 6c 6f 63 6b 69 6e  .exit_findlockin
8fe0: 66 6f 3a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  fo:.  return rc;
8ff0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65 20  .}../*.** If we 
9000: 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e  are currently in
9010: 20 61 20 64 69 66 66 65 72 65 6e 74 20 74 68 72   a different thr
9020: 65 61 64 20 74 68 61 6e 20 74 68 65 20 74 68 72  ead than the thr
9030: 65 61 64 20 74 68 61 74 20 74 68 65 0a 2a 2a 20  ead that the.** 
9040: 75 6e 69 78 46 69 6c 65 20 61 72 67 75 6d 65 6e  unixFile argumen
9050: 74 20 62 65 6c 6f 6e 67 73 20 74 6f 2c 20 74 68  t belongs to, th
9060: 65 6e 20 74 72 61 6e 73 66 65 72 20 6f 77 6e 65  en transfer owne
9070: 72 73 68 69 70 20 6f 66 20 74 68 65 20 75 6e 69  rship of the uni
9080: 78 46 69 6c 65 0a 2a 2a 20 6f 76 65 72 20 74 6f  xFile.** over to
9090: 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 68 72   the current thr
90a0: 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 75 6e 69  ead..**.** A uni
90b0: 78 46 69 6c 65 20 69 73 20 6f 6e 6c 79 20 6f 77  xFile is only ow
90c0: 6e 65 64 20 62 79 20 61 20 74 68 72 65 61 64 20  ned by a thread 
90d0: 6f 6e 20 73 79 73 74 65 6d 73 20 74 68 61 74 20  on systems that 
90e0: 75 73 65 20 4c 69 6e 75 78 54 68 72 65 61 64 73  use LinuxThreads
90f0: 2e 0a 2a 2a 0a 2a 2a 20 4f 77 6e 65 72 73 68 69  ..**.** Ownershi
9100: 70 20 74 72 61 6e 73 66 65 72 20 69 73 20 6f 6e  p transfer is on
9110: 6c 79 20 61 6c 6c 6f 77 65 64 20 69 66 20 74 68  ly allowed if th
9120: 65 20 75 6e 69 78 46 69 6c 65 20 69 73 20 63 75  e unixFile is cu
9130: 72 72 65 6e 74 6c 79 20 75 6e 6c 6f 63 6b 65 64  rrently unlocked
9140: 2e 0a 2a 2a 20 49 66 20 74 68 65 20 75 6e 69 78  ..** If the unix
9150: 46 69 6c 65 20 69 73 20 6c 6f 63 6b 65 64 20 61  File is locked a
9160: 6e 64 20 61 6e 20 6f 77 6e 65 72 73 68 69 70 20  nd an ownership 
9170: 69 73 20 77 72 6f 6e 67 2c 20 74 68 65 6e 20 72  is wrong, then r
9180: 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f  eturn.** SQLITE_
9190: 4d 49 53 55 53 45 2e 20 20 53 51 4c 49 54 45 5f  MISUSE.  SQLITE_
91a0: 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  OK is returned i
91b0: 66 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f 72  f everything wor
91c0: 6b 73 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54  ks..*/.#if SQLIT
91d0: 45 5f 54 48 52 45 41 44 53 41 46 45 20 26 26 20  E_THREADSAFE && 
91e0: 64 65 66 69 6e 65 64 28 5f 5f 6c 69 6e 75 78 5f  defined(__linux_
91f0: 5f 29 0a 73 74 61 74 69 63 20 69 6e 74 20 74 72  _).static int tr
9200: 61 6e 73 66 65 72 4f 77 6e 65 72 73 68 69 70 28  ansferOwnership(
9210: 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 29  unixFile *pFile)
9220: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 70 74  {.  int rc;.  pt
9230: 68 72 65 61 64 5f 74 20 68 53 65 6c 66 3b 0a 20  hread_t hSelf;. 
9240: 20 69 66 28 20 74 68 72 65 61 64 73 4f 76 65 72   if( threadsOver
9250: 72 69 64 65 45 61 63 68 4f 74 68 65 72 73 4c 6f  rideEachOthersLo
9260: 63 6b 73 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 77  cks ){.    /* Ow
9270: 6e 65 72 73 68 69 70 20 74 72 61 6e 73 66 65 72  nership transfer
9280: 73 20 6e 6f 74 20 6e 65 65 64 65 64 20 6f 6e 20  s not needed on 
9290: 74 68 69 73 20 73 79 73 74 65 6d 20 2a 2f 0a 20  this system */. 
92a0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
92b0: 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 68 53 65 6c 66  _OK;.  }.  hSelf
92c0: 20 3d 20 70 74 68 72 65 61 64 5f 73 65 6c 66 28   = pthread_self(
92d0: 29 3b 0a 20 20 69 66 28 20 70 74 68 72 65 61 64  );.  if( pthread
92e0: 5f 65 71 75 61 6c 28 70 46 69 6c 65 2d 3e 74 69  _equal(pFile->ti
92f0: 64 2c 20 68 53 65 6c 66 29 20 29 7b 0a 20 20 20  d, hSelf) ){.   
9300: 20 2f 2a 20 57 65 20 61 72 65 20 73 74 69 6c 6c   /* We are still
9310: 20 69 6e 20 74 68 65 20 73 61 6d 65 20 74 68 72   in the same thr
9320: 65 61 64 20 2a 2f 0a 20 20 20 20 4f 53 54 52 41  ead */.    OSTRA
9330: 43 45 31 28 22 4e 6f 2d 74 72 61 6e 73 66 65 72  CE1("No-transfer
9340: 2c 20 73 61 6d 65 20 74 68 72 65 61 64 5c 6e 22  , same thread\n"
9350: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
9360: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69  LITE_OK;.  }.  i
9370: 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  f( pFile->lockty
9380: 70 65 21 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20  pe!=NO_LOCK ){. 
9390: 20 20 20 2f 2a 20 57 65 20 63 61 6e 6e 6f 74 20     /* We cannot 
93a0: 63 68 61 6e 67 65 20 6f 77 6e 65 72 73 68 69 70  change ownership
93b0: 20 77 68 69 6c 65 20 77 65 20 61 72 65 20 68 6f   while we are ho
93c0: 6c 64 69 6e 67 20 61 20 6c 6f 63 6b 21 20 2a 2f  lding a lock! */
93d0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
93e0: 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20 7d 0a 20  TE_MISUSE;.  }. 
93f0: 20 4f 53 54 52 41 43 45 34 28 22 54 72 61 6e 73   OSTRACE4("Trans
9400: 66 65 72 20 6f 77 6e 65 72 73 68 69 70 20 6f 66  fer ownership of
9410: 20 25 64 20 66 72 6f 6d 20 25 64 20 74 6f 20 25   %d from %d to %
9420: 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
9430: 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70 46 69 6c    pFile->h, pFil
9440: 65 2d 3e 74 69 64 2c 20 68 53 65 6c 66 29 3b 0a  e->tid, hSelf);.
9450: 20 20 70 46 69 6c 65 2d 3e 74 69 64 20 3d 20 68    pFile->tid = h
9460: 53 65 6c 66 3b 0a 20 20 69 66 20 28 70 46 69 6c  Self;.  if (pFil
9470: 65 2d 3e 70 4c 6f 63 6b 20 21 3d 20 4e 55 4c 4c  e->pLock != NULL
9480: 29 20 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 4c  ) {.    releaseL
9490: 6f 63 6b 49 6e 66 6f 28 70 46 69 6c 65 2d 3e 70  ockInfo(pFile->p
94a0: 4c 6f 63 6b 29 3b 0a 20 20 20 20 72 63 20 3d 20  Lock);.    rc = 
94b0: 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28 70 46 69  findLockInfo(pFi
94c0: 6c 65 2c 20 26 70 46 69 6c 65 2d 3e 70 4c 6f 63  le, &pFile->pLoc
94d0: 6b 2c 20 30 29 3b 0a 20 20 20 20 4f 53 54 52 41  k, 0);.    OSTRA
94e0: 43 45 35 28 22 4c 4f 43 4b 20 20 20 20 25 64 20  CE5("LOCK    %d 
94f0: 69 73 20 6e 6f 77 20 25 73 28 25 73 2c 25 64 29  is now %s(%s,%d)
9500: 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20  \n", pFile->h,. 
9510: 20 20 20 20 20 20 20 20 20 20 6c 6f 63 6b 74 79            lockty
9520: 70 65 4e 61 6d 65 28 70 46 69 6c 65 2d 3e 6c 6f  peName(pFile->lo
9530: 63 6b 74 79 70 65 29 2c 0a 20 20 20 20 20 20 20  cktype),.       
9540: 20 20 20 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65      locktypeName
9550: 28 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 2d 3e 6c  (pFile->pLock->l
9560: 6f 63 6b 74 79 70 65 29 2c 20 70 46 69 6c 65 2d  ocktype), pFile-
9570: 3e 70 4c 6f 63 6b 2d 3e 63 6e 74 29 3b 0a 20 20  >pLock->cnt);.  
9580: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
9590: 20 65 6c 73 65 20 7b 0a 20 20 20 20 72 65 74 75   else {.    retu
95a0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
95b0: 7d 0a 7d 0a 23 65 6c 73 65 20 20 2f 2a 20 69 66  }.}.#else  /* if
95c0: 20 6e 6f 74 20 53 51 4c 49 54 45 5f 54 48 52 45   not SQLITE_THRE
95d0: 41 44 53 41 46 45 20 2a 2f 0a 20 20 2f 2a 20 4f  ADSAFE */.  /* O
95e0: 6e 20 73 69 6e 67 6c 65 2d 74 68 72 65 61 64 65  n single-threade
95f0: 64 20 62 75 69 6c 64 73 2c 20 6f 77 6e 65 72 73  d builds, owners
9600: 68 69 70 20 74 72 61 6e 73 66 65 72 20 69 73 20  hip transfer is 
9610: 61 20 6e 6f 2d 6f 70 20 2a 2f 0a 23 20 64 65 66  a no-op */.# def
9620: 69 6e 65 20 74 72 61 6e 73 66 65 72 4f 77 6e 65  ine transferOwne
9630: 72 73 68 69 70 28 58 29 20 53 51 4c 49 54 45 5f  rship(X) SQLITE_
9640: 4f 4b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  OK.#endif /* SQL
9650: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 20 2a  ITE_THREADSAFE *
9660: 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  /.../*.** This r
9670: 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66  outine checks if
9680: 20 74 68 65 72 65 20 69 73 20 61 20 52 45 53 45   there is a RESE
9690: 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f  RVED lock held o
96a0: 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64 0a  n the specified.
96b0: 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73 20  ** file by this 
96c0: 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f  or any other pro
96d0: 63 65 73 73 2e 20 49 66 20 73 75 63 68 20 61 20  cess. If such a 
96e0: 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65  lock is held, se
96f0: 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f  t *pResOut.** to
9700: 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75   a non-zero valu
9710: 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65  e otherwise *pRe
9720: 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a  sOut is set to z
9730: 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e  ero.  The return
9740: 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74   value.** is set
9750: 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e   to SQLITE_OK un
9760: 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f  less an I/O erro
9770: 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20  r occurs during 
9780: 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a  lock checking..*
9790: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
97a0: 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
97b0: 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
97c0: 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75  *id, int *pResOu
97d0: 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
97e0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
97f0: 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20  reserved = 0;.  
9800: 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
9810: 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
9820: 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ..  SimulateIOEr
9830: 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
9840: 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45  TE_IOERR_CHECKRE
9850: 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 0a  SERVEDLOCK; );..
9860: 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
9870: 29 3b 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75  );.  unixEnterMu
9880: 74 65 78 28 29 3b 20 2f 2a 20 42 65 63 61 75 73  tex(); /* Becaus
9890: 65 20 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 20 69  e pFile->pLock i
98a0: 73 20 73 68 61 72 65 64 20 61 63 72 6f 73 73 20  s shared across 
98b0: 74 68 72 65 61 64 73 20 2a 2f 0a 0a 20 20 2f 2a  threads */..  /*
98c0: 20 43 68 65 63 6b 20 69 66 20 61 20 74 68 72 65   Check if a thre
98d0: 61 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65  ad in this proce
98e0: 73 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20  ss holds such a 
98f0: 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46  lock */.  if( pF
9900: 69 6c 65 2d 3e 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b  ile->pLock->lock
9910: 74 79 70 65 3e 53 48 41 52 45 44 5f 4c 4f 43 4b  type>SHARED_LOCK
9920: 20 29 7b 0a 20 20 20 20 72 65 73 65 72 76 65 64   ){.    reserved
9930: 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 1;.  }..  /* 
9940: 4f 74 68 65 72 77 69 73 65 20 73 65 65 20 69 66  Otherwise see if
9950: 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63   some other proc
9960: 65 73 73 20 68 6f 6c 64 73 20 69 74 2e 0a 20 20  ess holds it..  
9970: 2a 2f 0a 23 69 66 6e 64 65 66 20 5f 5f 44 4a 47  */.#ifndef __DJG
9980: 50 50 5f 5f 0a 20 20 69 66 28 20 21 72 65 73 65  PP__.  if( !rese
9990: 72 76 65 64 20 29 7b 0a 20 20 20 20 73 74 72 75  rved ){.    stru
99a0: 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20  ct flock lock;. 
99b0: 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65     lock.l_whence
99c0: 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20   = SEEK_SET;.   
99d0: 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
99e0: 52 45 53 45 52 56 45 44 5f 42 59 54 45 3b 0a 20  RESERVED_BYTE;. 
99f0: 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20     lock.l_len = 
9a00: 31 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79  1;.    lock.l_ty
9a10: 70 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20 20  pe = F_WRLCK;.  
9a20: 20 20 69 66 20 28 2d 31 20 3d 3d 20 66 63 6e 74    if (-1 == fcnt
9a30: 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 47 45  l(pFile->h, F_GE
9a40: 54 4c 4b 2c 20 26 6c 6f 63 6b 29 29 20 7b 0a 20  TLK, &lock)) {. 
9a50: 20 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20       int tErrno 
9a60: 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72  = errno;.      r
9a70: 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  c = sqliteErrorF
9a80: 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
9a90: 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45  rrno, SQLITE_IOE
9aa0: 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44  RR_CHECKRESERVED
9ab0: 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 70 46 69  LOCK);.      pFi
9ac0: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
9ad0: 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 20 65 6c  tErrno;.    } el
9ae0: 73 65 20 69 66 28 20 6c 6f 63 6b 2e 6c 5f 74 79  se if( lock.l_ty
9af0: 70 65 21 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20  pe!=F_UNLCK ){. 
9b00: 20 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20       reserved = 
9b10: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  1;.    }.  }.#en
9b20: 64 69 66 0a 20 20 0a 20 20 75 6e 69 78 4c 65 61  dif.  .  unixLea
9b30: 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53 54  veMutex();.  OST
9b40: 52 41 43 45 34 28 22 54 45 53 54 20 57 52 2d 4c  RACE4("TEST WR-L
9b50: 4f 43 4b 20 25 64 20 25 64 20 25 64 5c 6e 22 2c  OCK %d %d %d\n",
9b60: 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72   pFile->h, rc, r
9b70: 65 73 65 72 76 65 64 29 3b 0a 0a 20 20 2a 70 52  eserved);..  *pR
9b80: 65 73 4f 75 74 20 3d 20 72 65 73 65 72 76 65 64  esOut = reserved
9b90: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
9ba0: 0a 0a 2f 2a 0a 2a 2a 20 50 65 72 66 6f 72 6d 20  ../*.** Perform 
9bb0: 61 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 6f  a file locking o
9bc0: 70 65 72 61 74 69 6f 6e 20 6f 6e 20 61 20 72 61  peration on a ra
9bd0: 6e 67 65 20 6f 66 20 62 79 74 65 73 20 69 6e 20  nge of bytes in 
9be0: 61 20 66 69 6c 65 2e 0a 2a 2a 20 54 68 65 20 22  a file..** The "
9bf0: 6f 70 22 20 70 61 72 61 6d 65 74 65 72 20 73 68  op" parameter sh
9c00: 6f 75 6c 64 20 62 65 20 6f 6e 65 20 6f 66 20 46  ould be one of F
9c10: 5f 52 44 4c 43 4b 2c 20 46 5f 57 52 4c 43 4b 2c  _RDLCK, F_WRLCK,
9c20: 20 6f 72 20 46 5f 55 4e 4c 43 4b 2e 0a 2a 2a 20   or F_UNLCK..** 
9c30: 52 65 74 75 72 6e 20 30 20 6f 6e 20 73 75 63 63  Return 0 on succ
9c40: 65 73 73 20 6f 72 20 2d 31 20 66 6f 72 20 66 61  ess or -1 for fa
9c50: 69 6c 75 72 65 2e 20 20 4f 6e 20 66 61 69 6c 75  ilure.  On failu
9c60: 72 65 2c 20 77 72 69 74 65 20 74 68 65 20 65 72  re, write the er
9c70: 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 69 6e 74 6f  ror.** code into
9c80: 20 2a 70 45 72 72 63 6f 64 65 2e 0a 2a 2a 0a 2a   *pErrcode..**.*
9c90: 2a 20 49 66 20 74 68 65 20 53 51 4c 49 54 45 5f  * If the SQLITE_
9ca0: 57 48 4f 4c 45 5f 46 49 4c 45 5f 4c 4f 43 4b 49  WHOLE_FILE_LOCKI
9cb0: 4e 47 20 62 69 74 20 69 73 20 63 6c 65 61 72 2c  NG bit is clear,
9cc0: 20 74 68 65 6e 20 6f 6e 6c 79 20 6c 6f 63 6b 0a   then only lock.
9cd0: 2a 2a 20 74 68 65 20 72 61 6e 67 65 20 6f 66 20  ** the range of 
9ce0: 62 79 74 65 73 20 6f 6e 20 74 68 65 20 6c 6f 63  bytes on the loc
9cf0: 6b 69 6e 67 20 70 61 67 65 20 62 65 74 77 65 65  king page betwee
9d00: 6e 20 53 48 41 52 45 44 5f 46 49 52 53 54 20 61  n SHARED_FIRST a
9d10: 6e 64 0a 2a 2a 20 53 48 41 52 45 44 5f 53 49 5a  nd.** SHARED_SIZ
9d20: 45 2e 20 20 49 66 20 53 51 4c 49 54 45 5f 57 48  E.  If SQLITE_WH
9d30: 4f 4c 45 5f 46 49 4c 45 5f 4c 4f 43 4b 49 4e 47  OLE_FILE_LOCKING
9d40: 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 6c 6f   is set, then lo
9d50: 63 6b 20 61 6c 6c 0a 2a 2a 20 62 79 74 65 73 20  ck all.** bytes 
9d60: 66 72 6f 6d 20 30 20 75 70 20 74 6f 20 62 75 74  from 0 up to but
9d70: 20 6e 6f 74 20 69 6e 63 6c 75 64 69 6e 67 20 50   not including P
9d80: 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 61 6e 64  ENDING_BYTE, and
9d90: 20 61 6c 6c 20 62 79 74 65 73 0a 2a 2a 20 74 68   all bytes.** th
9da0: 61 74 20 66 6f 6c 6c 6f 77 20 53 48 41 52 45 44  at follow SHARED
9db0: 5f 46 49 52 53 54 2e 0a 2a 2a 0a 2a 2a 20 49 6e  _FIRST..**.** In
9dc0: 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 6f 66   other words, of
9dd0: 20 53 51 4c 49 54 45 5f 57 48 4f 4c 45 5f 46 49   SQLITE_WHOLE_FI
9de0: 4c 45 5f 4c 4f 43 4b 49 4e 47 20 69 66 20 66 61  LE_LOCKING if fa
9df0: 6c 73 65 20 28 74 68 65 20 68 69 73 74 6f 72 69  lse (the histori
9e00: 63 61 6c 0a 2a 2a 20 64 65 66 61 75 6c 74 20 63  cal.** default c
9e10: 61 73 65 29 20 74 68 65 6e 20 6f 6e 6c 79 20 6c  ase) then only l
9e20: 6f 63 6b 20 61 20 73 6d 61 6c 6c 20 72 61 6e 67  ock a small rang
9e30: 65 20 6f 66 20 62 79 74 65 73 20 66 72 6f 6d 20  e of bytes from 
9e40: 53 48 41 52 45 44 5f 46 49 52 53 54 0a 2a 2a 20  SHARED_FIRST.** 
9e50: 74 68 72 6f 75 67 68 20 53 48 41 52 45 44 5f 46  through SHARED_F
9e60: 49 52 53 54 2b 53 48 41 52 45 44 5f 53 49 5a 45  IRST+SHARED_SIZE
9e70: 2d 31 2e 20 20 42 75 74 20 69 66 20 53 51 4c 49  -1.  But if SQLI
9e80: 54 45 5f 57 48 4f 4c 45 5f 46 49 4c 45 5f 4c 4f  TE_WHOLE_FILE_LO
9e90: 43 4b 49 4e 47 20 69 73 0a 2a 2a 20 74 72 75 65  CKING is.** true
9ea0: 20 74 68 65 6e 20 6c 6f 63 6b 20 65 76 65 72 79   then lock every
9eb0: 20 62 79 74 65 20 69 6e 20 74 68 65 20 66 69 6c   byte in the fil
9ec0: 65 20 65 78 63 65 70 74 20 66 6f 72 20 50 45 4e  e except for PEN
9ed0: 44 49 4e 47 5f 42 59 54 45 20 61 6e 64 0a 2a 2a  DING_BYTE and.**
9ee0: 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2e 0a   RESERVED_BYTE..
9ef0: 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 57 48 4f  **.** SQLITE_WHO
9f00: 4c 45 5f 46 49 4c 45 5f 4c 4f 43 4b 49 4e 47 3d  LE_FILE_LOCKING=
9f10: 74 72 75 65 20 6f 76 65 72 6c 61 70 73 20 53 51  true overlaps SQ
9f20: 4c 49 54 45 5f 57 48 4f 4c 45 5f 46 49 4c 45 5f  LITE_WHOLE_FILE_
9f30: 4c 4f 43 4b 49 4e 47 3d 66 61 6c 73 65 0a 2a 2a  LOCKING=false.**
9f40: 20 61 6e 64 20 73 6f 20 74 68 65 20 6c 6f 63 6b   and so the lock
9f50: 69 6e 67 20 73 63 68 65 6d 65 73 20 61 72 65 20  ing schemes are 
9f60: 63 6f 6d 70 61 74 69 62 6c 65 2e 20 20 4f 6e 65  compatible.  One
9f70: 20 74 79 70 65 20 6f 66 20 6c 6f 63 6b 20 77 69   type of lock wi
9f80: 6c 6c 0a 2a 2a 20 65 66 66 65 63 74 69 76 65 6c  ll.** effectivel
9f90: 79 20 65 78 63 6c 75 64 65 20 74 68 65 20 6f 74  y exclude the ot
9fa0: 68 65 72 20 74 79 70 65 2e 20 20 54 68 65 20 72  her type.  The r
9fb0: 65 61 73 6f 6e 20 66 6f 72 20 75 73 69 6e 67 20  eason for using 
9fc0: 74 68 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 57 48  the.** SQLITE_WH
9fd0: 4f 4c 45 5f 46 49 4c 45 5f 4c 4f 43 4b 49 4e 47  OLE_FILE_LOCKING
9fe0: 3d 74 72 75 65 20 69 73 20 74 68 61 74 20 62 79  =true is that by
9ff0: 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68 65 20   indicating the 
a000: 66 75 6c 6c 20 72 61 6e 67 65 0a 2a 2a 20 6f 66  full range.** of
a010: 20 62 79 74 65 73 20 74 6f 20 62 65 20 72 65 61   bytes to be rea
a020: 64 20 6f 72 20 77 72 69 74 74 65 6e 2c 20 77 65  d or written, we
a030: 20 67 69 76 65 20 68 69 6e 74 73 20 74 6f 20 4e   give hints to N
a040: 46 53 20 74 6f 20 68 65 6c 70 20 69 74 0a 2a 2a  FS to help it.**
a050: 20 6d 61 69 6e 74 61 69 6e 20 63 61 63 68 65 20   maintain cache 
a060: 63 6f 68 65 72 65 6e 63 79 2e 20 20 4f 6e 20 74  coherency.  On t
a070: 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 77  he other hand, w
a080: 68 6f 6c 65 20 66 69 6c 65 20 6c 6f 63 6b 69 6e  hole file lockin
a090: 67 0a 2a 2a 20 69 73 20 73 6c 6f 77 65 72 2c 20  g.** is slower, 
a0a0: 73 6f 20 77 65 20 64 6f 6e 27 74 20 77 61 6e 74  so we don't want
a0b0: 20 74 6f 20 75 73 65 20 69 74 20 65 78 63 65 70   to use it excep
a0c0: 74 20 66 6f 72 20 4e 46 53 2e 0a 2a 2f 0a 73 74  t for NFS..*/.st
a0d0: 61 74 69 63 20 69 6e 74 20 72 61 6e 67 65 4c 6f  atic int rangeLo
a0e0: 63 6b 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  ck(unixFile *pFi
a0f0: 6c 65 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20  le, int op, int 
a100: 2a 70 45 72 72 63 6f 64 65 29 7b 0a 20 20 73 74  *pErrcode){.  st
a110: 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b  ruct flock lock;
a120: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 6c 6f 63  .  int rc;.  loc
a130: 6b 2e 6c 5f 74 79 70 65 20 3d 20 6f 70 3b 0a 20  k.l_type = op;. 
a140: 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
a150: 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20  SHARED_FIRST;.  
a160: 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20  lock.l_whence = 
a170: 53 45 45 4b 5f 53 45 54 3b 0a 20 20 69 66 28 20  SEEK_SET;.  if( 
a180: 28 70 46 69 6c 65 2d 3e 66 69 6c 65 46 6c 61 67  (pFile->fileFlag
a190: 73 20 26 20 53 51 4c 49 54 45 5f 57 48 4f 4c 45  s & SQLITE_WHOLE
a1a0: 5f 46 49 4c 45 5f 4c 4f 43 4b 49 4e 47 29 3d 3d  _FILE_LOCKING)==
a1b0: 30 20 29 7b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  0 ){.    lock.l_
a1c0: 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a  len = SHARED_SIZ
a1d0: 45 3b 0a 20 20 20 20 72 63 20 3d 20 66 63 6e 74  E;.    rc = fcnt
a1e0: 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53 45  l(pFile->h, F_SE
a1f0: 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3b 0a 20 20 20  TLK, &lock);.   
a200: 20 2a 70 45 72 72 63 6f 64 65 20 3d 20 65 72 72   *pErrcode = err
a210: 6e 6f 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  no;.  }else{.   
a220: 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 30 3b   lock.l_len = 0;
a230: 0a 20 20 20 20 72 63 20 3d 20 66 63 6e 74 6c 28  .    rc = fcntl(
a240: 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c  pFile->h, F_SETL
a250: 4b 2c 20 26 6c 6f 63 6b 29 3b 0a 20 20 20 20 2a  K, &lock);.    *
a260: 70 45 72 72 63 6f 64 65 20 3d 20 65 72 72 6e 6f  pErrcode = errno
a270: 3b 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52 28  ;.    if( NEVER(
a280: 6f 70 3d 3d 46 5f 55 4e 4c 43 4b 29 20 7c 7c 20  op==F_UNLCK) || 
a290: 72 63 21 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20  rc!=(-1) ){.    
a2a0: 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
a2b0: 20 30 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c   0;.      lock.l
a2c0: 5f 6c 65 6e 20 3d 20 50 45 4e 44 49 4e 47 5f 42  _len = PENDING_B
a2d0: 59 54 45 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  YTE;.      rc = 
a2e0: 66 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20  fcntl(pFile->h, 
a2f0: 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3b  F_SETLK, &lock);
a300: 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57 41 59  .      if( ALWAY
a310: 53 28 6f 70 21 3d 46 5f 55 4e 4c 43 4b 29 20 26  S(op!=F_UNLCK) &
a320: 26 20 72 63 3d 3d 28 2d 31 29 20 29 7b 0a 20 20  & rc==(-1) ){.  
a330: 20 20 20 20 20 20 2a 70 45 72 72 63 6f 64 65 20        *pErrcode 
a340: 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20  = errno;.       
a350: 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46   lock.l_type = F
a360: 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 20 20 20 20  _UNLCK;.        
a370: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53  lock.l_start = S
a380: 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20  HARED_FIRST;.   
a390: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20       lock.l_len 
a3a0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 66 63 6e  = 0;.        fcn
a3b0: 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53  tl(pFile->h, F_S
a3c0: 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3b 0a 20 20  ETLK, &lock);.  
a3d0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
a3e0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
a3f0: 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66  /*.** Lock the f
a400: 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63  ile with the loc
a410: 6b 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70  k specified by p
a420: 61 72 61 6d 65 74 65 72 20 6c 6f 63 6b 74 79 70  arameter locktyp
a430: 65 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68  e - one.** of th
a440: 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
a450: 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45  **     (1) SHARE
a460: 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32  D_LOCK.**     (2
a470: 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a  ) RESERVED_LOCK.
a480: 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49  **     (3) PENDI
a490: 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  NG_LOCK.**     (
a4a0: 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  4) EXCLUSIVE_LOC
a4b0: 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65  K.**.** Sometime
a4c0: 73 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e  s when requestin
a4d0: 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65  g one lock state
a4e0: 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63  , additional loc
a4f0: 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20  k states.** are 
a500: 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77  inserted in betw
a510: 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e  een.  The lockin
a520: 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20  g might fail on 
a530: 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72  one of the later
a540: 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  .** transitions 
a550: 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b  leaving the lock
a560: 20 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74   state different
a570: 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74   from what it st
a580: 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69  arted but.** sti
a590: 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20  ll short of its 
a5a0: 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  goal.  The follo
a5b0: 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73  wing chart shows
a5c0: 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20   the allowed.** 
a5d0: 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20  transitions and 
a5e0: 74 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74  the inserted int
a5f0: 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73  ermediate states
a600: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43  :.**.**    UNLOC
a610: 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a  KED -> SHARED.**
a620: 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45      SHARED -> RE
a630: 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41  SERVED.**    SHA
a640: 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  RED -> (PENDING)
a650: 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
a660: 20 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20      RESERVED -> 
a670: 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43  (PENDING) -> EXC
a680: 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e  LUSIVE.**    PEN
a690: 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56  DING -> EXCLUSIV
a6a0: 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  E.**.** This rou
a6b0: 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69  tine will only i
a6c0: 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20  ncrease a lock. 
a6d0: 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33   Use the sqlite3
a6e0: 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f  OsUnlock().** ro
a6f0: 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61  utine to lower a
a700: 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a   locking level..
a710: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
a720: 69 78 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  ixLock(sqlite3_f
a730: 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63  ile *id, int loc
a740: 6b 74 79 70 65 29 7b 0a 20 20 2f 2a 20 54 68 65  ktype){.  /* The
a750: 20 66 6f 6c 6c 6f 77 69 6e 67 20 64 65 73 63 72   following descr
a760: 69 62 65 73 20 74 68 65 20 69 6d 70 6c 65 6d 65  ibes the impleme
a770: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 76  ntation of the v
a780: 61 72 69 6f 75 73 20 6c 6f 63 6b 73 20 61 6e 64  arious locks and
a790: 0a 20 20 2a 2a 20 6c 6f 63 6b 20 74 72 61 6e 73  .  ** lock trans
a7a0: 69 74 69 6f 6e 73 20 69 6e 20 74 65 72 6d 73 20  itions in terms 
a7b0: 6f 66 20 74 68 65 20 50 4f 53 49 58 20 61 64 76  of the POSIX adv
a7c0: 69 73 6f 72 79 20 73 68 61 72 65 64 20 61 6e 64  isory shared and
a7d0: 20 65 78 63 6c 75 73 69 76 65 0a 20 20 2a 2a 20   exclusive.  ** 
a7e0: 6c 6f 63 6b 20 70 72 69 6d 69 74 69 76 65 73 20  lock primitives 
a7f0: 28 63 61 6c 6c 65 64 20 72 65 61 64 2d 6c 6f 63  (called read-loc
a800: 6b 73 20 61 6e 64 20 77 72 69 74 65 2d 6c 6f 63  ks and write-loc
a810: 6b 73 20 62 65 6c 6f 77 2c 20 74 6f 20 61 76 6f  ks below, to avo
a820: 69 64 0a 20 20 2a 2a 20 63 6f 6e 66 75 73 69 6f  id.  ** confusio
a830: 6e 20 77 69 74 68 20 53 51 4c 69 74 65 20 6c 6f  n with SQLite lo
a840: 63 6b 20 6e 61 6d 65 73 29 2e 20 54 68 65 20 61  ck names). The a
a850: 6c 67 6f 72 69 74 68 6d 73 20 61 72 65 20 63 6f  lgorithms are co
a860: 6d 70 6c 69 63 61 74 65 64 0a 20 20 2a 2a 20 73  mplicated.  ** s
a870: 6c 69 67 68 74 6c 79 20 69 6e 20 6f 72 64 65 72  lightly in order
a880: 20 74 6f 20 62 65 20 63 6f 6d 70 61 74 69 62 6c   to be compatibl
a890: 65 20 77 69 74 68 20 77 69 6e 64 6f 77 73 20 73  e with windows s
a8a0: 79 73 74 65 6d 73 20 73 69 6d 75 6c 74 61 6e 65  ystems simultane
a8b0: 6f 75 73 6c 79 0a 20 20 2a 2a 20 61 63 63 65 73  ously.  ** acces
a8c0: 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20 64 61  sing the same da
a8d0: 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69 6e 20  tabase file, in 
a8e0: 63 61 73 65 20 74 68 61 74 20 69 73 20 65 76 65  case that is eve
a8f0: 72 20 72 65 71 75 69 72 65 64 2e 0a 20 20 2a 2a  r required..  **
a900: 0a 20 20 2a 2a 20 53 79 6d 62 6f 6c 73 20 64 65  .  ** Symbols de
a910: 66 69 6e 65 64 20 69 6e 20 6f 73 2e 68 20 69 6e  fined in os.h in
a920: 64 65 6e 74 69 66 79 20 74 68 65 20 27 70 65 6e  dentify the 'pen
a930: 64 69 6e 67 20 62 79 74 65 27 20 61 6e 64 20 74  ding byte' and t
a940: 68 65 20 27 72 65 73 65 72 76 65 64 0a 20 20 2a  he 'reserved.  *
a950: 2a 20 62 79 74 65 27 2c 20 65 61 63 68 20 73 69  * byte', each si
a960: 6e 67 6c 65 20 62 79 74 65 73 20 61 74 20 77 65  ngle bytes at we
a970: 6c 6c 20 6b 6e 6f 77 6e 20 6f 66 66 73 65 74 73  ll known offsets
a980: 2c 20 61 6e 64 20 74 68 65 20 27 73 68 61 72 65  , and the 'share
a990: 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67  d byte.  ** rang
a9a0: 65 27 2c 20 61 20 72 61 6e 67 65 20 6f 66 20 35  e', a range of 5
a9b0: 31 30 20 62 79 74 65 73 20 61 74 20 61 20 77 65  10 bytes at a we
a9c0: 6c 6c 20 6b 6e 6f 77 6e 20 6f 66 66 73 65 74 2e  ll known offset.
a9d0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 6f 20 6f 62  .  **.  ** To ob
a9e0: 74 61 69 6e 20 61 20 53 48 41 52 45 44 20 6c 6f  tain a SHARED lo
a9f0: 63 6b 2c 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  ck, a read-lock 
aa00: 69 73 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74  is obtained on t
aa10: 68 65 20 27 70 65 6e 64 69 6e 67 0a 20 20 2a 2a  he 'pending.  **
aa20: 20 62 79 74 65 27 2e 20 20 49 66 20 74 68 69 73   byte'.  If this
aa30: 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20   is successful, 
aa40: 61 20 72 61 6e 64 6f 6d 20 62 79 74 65 20 66 72  a random byte fr
aa50: 6f 6d 20 74 68 65 20 27 73 68 61 72 65 64 20 62  om the 'shared b
aa60: 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27 20  yte.  ** range' 
aa70: 69 73 20 72 65 61 64 2d 6c 6f 63 6b 65 64 20 61  is read-locked a
aa80: 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74  nd the lock on t
aa90: 68 65 20 27 70 65 6e 64 69 6e 67 20 62 79 74 65  he 'pending byte
aaa0: 27 20 72 65 6c 65 61 73 65 64 2e 0a 20 20 2a 2a  ' released..  **
aab0: 0a 20 20 2a 2a 20 41 20 70 72 6f 63 65 73 73 20  .  ** A process 
aac0: 6d 61 79 20 6f 6e 6c 79 20 6f 62 74 61 69 6e 20  may only obtain 
aad0: 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
aae0: 61 66 74 65 72 20 69 74 20 68 61 73 20 61 20 53  after it has a S
aaf0: 48 41 52 45 44 20 6c 6f 63 6b 2e 0a 20 20 2a 2a  HARED lock..  **
ab00: 20 41 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   A RESERVED lock
ab10: 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   is implemented 
ab20: 62 79 20 67 72 61 62 62 69 6e 67 20 61 20 77 72  by grabbing a wr
ab30: 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a  ite-lock on the.
ab40: 20 20 2a 2a 20 27 72 65 73 65 72 76 65 64 20 62    ** 'reserved b
ab50: 79 74 65 27 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a  yte'. .  **.  **
ab60: 20 41 20 70 72 6f 63 65 73 73 20 6d 61 79 20 6f   A process may o
ab70: 6e 6c 79 20 6f 62 74 61 69 6e 20 61 20 50 45 4e  nly obtain a PEN
ab80: 44 49 4e 47 20 6c 6f 63 6b 20 61 66 74 65 72 20  DING lock after 
ab90: 69 74 20 68 61 73 20 6f 62 74 61 69 6e 65 64 20  it has obtained 
aba0: 61 0a 20 20 2a 2a 20 53 48 41 52 45 44 20 6c 6f  a.  ** SHARED lo
abb0: 63 6b 2e 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f  ck. A PENDING lo
abc0: 63 6b 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65  ck is implemente
abd0: 64 20 62 79 20 6f 62 74 61 69 6e 69 6e 67 20 61  d by obtaining a
abe0: 20 77 72 69 74 65 2d 6c 6f 63 6b 0a 20 20 2a 2a   write-lock.  **
abf0: 20 6f 6e 20 74 68 65 20 27 70 65 6e 64 69 6e 67   on the 'pending
ac00: 20 62 79 74 65 27 2e 20 54 68 69 73 20 65 6e 73   byte'. This ens
ac10: 75 72 65 73 20 74 68 61 74 20 6e 6f 20 6e 65 77  ures that no new
ac20: 20 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 63 61   SHARED locks ca
ac30: 6e 20 62 65 0a 20 20 2a 2a 20 6f 62 74 61 69 6e  n be.  ** obtain
ac40: 65 64 2c 20 62 75 74 20 65 78 69 73 74 69 6e 67  ed, but existing
ac50: 20 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 61 72   SHARED locks ar
ac60: 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20 70 65 72  e allowed to per
ac70: 73 69 73 74 2e 20 41 20 70 72 6f 63 65 73 73 0a  sist. A process.
ac80: 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 68 61    ** does not ha
ac90: 76 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 52  ve to obtain a R
aca0: 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20  ESERVED lock on 
acb0: 74 68 65 20 77 61 79 20 74 6f 20 61 20 50 45 4e  the way to a PEN
acc0: 44 49 4e 47 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20  DING lock..  ** 
acd0: 54 68 69 73 20 70 72 6f 70 65 72 74 79 20 69 73  This property is
ace0: 20 75 73 65 64 20 62 79 20 74 68 65 20 61 6c 67   used by the alg
acf0: 6f 72 69 74 68 6d 20 66 6f 72 20 72 6f 6c 6c 69  orithm for rolli
ad00: 6e 67 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61  ng back a journa
ad10: 6c 20 66 69 6c 65 0a 20 20 2a 2a 20 61 66 74 65  l file.  ** afte
ad20: 72 20 61 20 63 72 61 73 68 2e 0a 20 20 2a 2a 0a  r a crash..  **.
ad30: 20 20 2a 2a 20 41 6e 20 45 58 43 4c 55 53 49 56    ** An EXCLUSIV
ad40: 45 20 6c 6f 63 6b 2c 20 6f 62 74 61 69 6e 65 64  E lock, obtained
ad50: 20 61 66 74 65 72 20 61 20 50 45 4e 44 49 4e 47   after a PENDING
ad60: 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 69   lock is held, i
ad70: 73 0a 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74  s.  ** implement
ad80: 65 64 20 62 79 20 6f 62 74 61 69 6e 69 6e 67 20  ed by obtaining 
ad90: 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20  a write-lock on 
ada0: 74 68 65 20 65 6e 74 69 72 65 20 27 73 68 61 72  the entire 'shar
adb0: 65 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e  ed byte.  ** ran
adc0: 67 65 27 2e 20 53 69 6e 63 65 20 61 6c 6c 20 6f  ge'. Since all o
add0: 74 68 65 72 20 6c 6f 63 6b 73 20 72 65 71 75 69  ther locks requi
ade0: 72 65 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f  re a read-lock o
adf0: 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 62 79 74  n one of the byt
ae00: 65 73 0a 20 20 2a 2a 20 77 69 74 68 69 6e 20 74  es.  ** within t
ae10: 68 69 73 20 72 61 6e 67 65 2c 20 74 68 69 73 20  his range, this 
ae20: 65 6e 73 75 72 65 73 20 74 68 61 74 20 6e 6f 20  ensures that no 
ae30: 6f 74 68 65 72 20 6c 6f 63 6b 73 20 61 72 65 20  other locks are 
ae40: 68 65 6c 64 20 6f 6e 20 74 68 65 0a 20 20 2a 2a  held on the.  **
ae50: 20 64 61 74 61 62 61 73 65 2e 20 0a 20 20 2a 2a   database. .  **
ae60: 0a 20 20 2a 2a 20 54 68 65 20 72 65 61 73 6f 6e  .  ** The reason
ae70: 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20 63   a single byte c
ae80: 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 20 69 6e  annot be used in
ae90: 73 74 65 61 64 20 6f 66 20 74 68 65 20 27 73 68  stead of the 'sh
aea0: 61 72 65 64 20 62 79 74 65 0a 20 20 2a 2a 20 72  ared byte.  ** r
aeb0: 61 6e 67 65 27 20 69 73 20 74 68 61 74 20 73 6f  ange' is that so
aec0: 6d 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 77  me versions of w
aed0: 69 6e 64 6f 77 73 20 64 6f 20 6e 6f 74 20 73 75  indows do not su
aee0: 70 70 6f 72 74 20 72 65 61 64 2d 6c 6f 63 6b 73  pport read-locks
aef0: 2e 20 42 79 0a 20 20 2a 2a 20 6c 6f 63 6b 69 6e  . By.  ** lockin
af00: 67 20 61 20 72 61 6e 64 6f 6d 20 62 79 74 65 20  g a random byte 
af10: 66 72 6f 6d 20 61 20 72 61 6e 67 65 2c 20 63 6f  from a range, co
af20: 6e 63 75 72 72 65 6e 74 20 53 48 41 52 45 44 20  ncurrent SHARED 
af30: 6c 6f 63 6b 73 20 6d 61 79 20 65 78 69 73 74 0a  locks may exist.
af40: 20 20 2a 2a 20 65 76 65 6e 20 69 66 20 74 68 65    ** even if the
af50: 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69 74 69   locking primiti
af60: 76 65 20 75 73 65 64 20 69 73 20 61 6c 77 61 79  ve used is alway
af70: 73 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 2e 0a  s a write-lock..
af80: 20 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20    */.  int rc = 
af90: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69  SQLITE_OK;.  uni
afa0: 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
afb0: 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
afc0: 73 74 72 75 63 74 20 75 6e 69 78 4c 6f 63 6b 49  struct unixLockI
afd0: 6e 66 6f 20 2a 70 4c 6f 63 6b 20 3d 20 70 46 69  nfo *pLock = pFi
afe0: 6c 65 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 73 74 72  le->pLock;.  str
aff0: 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a  uct flock lock;.
b000: 20 20 69 6e 74 20 73 20 3d 20 30 3b 0a 20 20 69    int s = 0;.  i
b010: 6e 74 20 74 45 72 72 6e 6f 3b 0a 0a 20 20 61 73  nt tErrno;..  as
b020: 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
b030: 20 4f 53 54 52 41 43 45 37 28 22 4c 4f 43 4b 20   OSTRACE7("LOCK 
b040: 20 20 20 25 64 20 25 73 20 77 61 73 20 25 73 28     %d %s was %s(
b050: 25 73 2c 25 64 29 20 70 69 64 3d 25 64 5c 6e 22  %s,%d) pid=%d\n"
b060: 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20  , pFile->h,.    
b070: 20 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28 6c    locktypeName(l
b080: 6f 63 6b 74 79 70 65 29 2c 20 6c 6f 63 6b 74 79  ocktype), lockty
b090: 70 65 4e 61 6d 65 28 70 46 69 6c 65 2d 3e 6c 6f  peName(pFile->lo
b0a0: 63 6b 74 79 70 65 29 2c 0a 20 20 20 20 20 20 6c  cktype),.      l
b0b0: 6f 63 6b 74 79 70 65 4e 61 6d 65 28 70 4c 6f 63  ocktypeName(pLoc
b0c0: 6b 2d 3e 6c 6f 63 6b 74 79 70 65 29 2c 20 70 4c  k->locktype), pL
b0d0: 6f 63 6b 2d 3e 63 6e 74 20 2c 20 67 65 74 70 69  ock->cnt , getpi
b0e0: 64 28 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  d());..  /* If t
b0f0: 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20  here is already 
b100: 61 20 6c 6f 63 6b 20 6f 66 20 74 68 69 73 20 74  a lock of this t
b110: 79 70 65 20 6f 72 20 6d 6f 72 65 20 72 65 73 74  ype or more rest
b120: 72 69 63 74 69 76 65 20 6f 6e 20 74 68 65 0a 20  rictive on the. 
b130: 20 2a 2a 20 75 6e 69 78 46 69 6c 65 2c 20 64 6f   ** unixFile, do
b140: 20 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e 27 74 20   nothing. Don't 
b150: 75 73 65 20 74 68 65 20 65 6e 64 5f 6c 6f 63 6b  use the end_lock
b160: 3a 20 65 78 69 74 20 70 61 74 68 2c 20 61 73 0a  : exit path, as.
b170: 20 20 2a 2a 20 75 6e 69 78 45 6e 74 65 72 4d 75    ** unixEnterMu
b180: 74 65 78 28 29 20 68 61 73 6e 27 74 20 62 65 65  tex() hasn't bee
b190: 6e 20 63 61 6c 6c 65 64 20 79 65 74 2e 0a 20 20  n called yet..  
b1a0: 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
b1b0: 6c 6f 63 6b 74 79 70 65 3e 3d 6c 6f 63 6b 74 79  locktype>=lockty
b1c0: 70 65 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43  pe ){.    OSTRAC
b1d0: 45 33 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25  E3("LOCK    %d %
b1e0: 73 20 6f 6b 20 28 61 6c 72 65 61 64 79 20 68 65  s ok (already he
b1f0: 6c 64 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  ld)\n", pFile->h
b200: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 6f  ,.            lo
b210: 63 6b 74 79 70 65 4e 61 6d 65 28 6c 6f 63 6b 74  cktypeName(lockt
b220: 79 70 65 29 29 3b 0a 20 20 20 20 72 65 74 75 72  ype));.    retur
b230: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
b240: 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
b250: 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 73 65 71   the locking seq
b260: 75 65 6e 63 65 20 69 73 20 63 6f 72 72 65 63 74  uence is correct
b270: 2e 0a 20 20 2a 2a 20 20 28 31 29 20 57 65 20 6e  ..  **  (1) We n
b280: 65 76 65 72 20 6d 6f 76 65 20 66 72 6f 6d 20 75  ever move from u
b290: 6e 6c 6f 63 6b 65 64 20 74 6f 20 61 6e 79 74 68  nlocked to anyth
b2a0: 69 6e 67 20 68 69 67 68 65 72 20 74 68 61 6e 20  ing higher than 
b2b0: 73 68 61 72 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a  shared lock..  *
b2c0: 2a 20 20 28 32 29 20 53 51 4c 69 74 65 20 6e 65  *  (2) SQLite ne
b2d0: 76 65 72 20 65 78 70 6c 69 63 69 74 6c 79 20 72  ver explicitly r
b2e0: 65 71 75 65 73 74 73 20 61 20 70 65 6e 64 69 67  equests a pendig
b2f0: 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28 33 29   lock..  **  (3)
b300: 20 41 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 69   A shared lock i
b310: 73 20 61 6c 77 61 79 73 20 68 65 6c 64 20 77 68  s always held wh
b320: 65 6e 20 61 20 72 65 73 65 72 76 65 20 6c 6f 63  en a reserve loc
b330: 6b 20 69 73 20 72 65 71 75 65 73 74 65 64 2e 0a  k is requested..
b340: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
b350: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 21 3d  File->locktype!=
b360: 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 6c 6f 63 6b 74  NO_LOCK || lockt
b370: 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype==SHARED_LOCK
b380: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 6f   );.  assert( lo
b390: 63 6b 74 79 70 65 21 3d 50 45 4e 44 49 4e 47 5f  cktype!=PENDING_
b3a0: 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
b3b0: 28 20 6c 6f 63 6b 74 79 70 65 21 3d 52 45 53 45  ( locktype!=RESE
b3c0: 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69  RVED_LOCK || pFi
b3d0: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 53 48  le->locktype==SH
b3e0: 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20  ARED_LOCK );..  
b3f0: 2f 2a 20 54 68 69 73 20 6d 75 74 65 78 20 69 73  /* This mutex is
b400: 20 6e 65 65 64 65 64 20 62 65 63 61 75 73 65 20   needed because 
b410: 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 20 69 73 20  pFile->pLock is 
b420: 73 68 61 72 65 64 20 61 63 72 6f 73 73 20 74 68  shared across th
b430: 72 65 61 64 73 0a 20 20 2a 2f 0a 20 20 75 6e 69  reads.  */.  uni
b440: 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 0a  xEnterMutex();..
b450: 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
b460: 68 65 20 63 75 72 72 65 6e 74 20 74 68 72 65 61  he current threa
b470: 64 20 6f 77 6e 73 20 74 68 65 20 70 46 69 6c 65  d owns the pFile
b480: 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 74 72  ..  */.  rc = tr
b490: 61 6e 73 66 65 72 4f 77 6e 65 72 73 68 69 70 28  ansferOwnership(
b4a0: 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 72 63  pFile);.  if( rc
b4b0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
b4c0: 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65     unixLeaveMute
b4d0: 78 28 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  x();.    return 
b4e0: 72 63 3b 0a 20 20 7d 0a 20 20 70 4c 6f 63 6b 20  rc;.  }.  pLock 
b4f0: 3d 20 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 3b 0a  = pFile->pLock;.
b500: 0a 20 20 2f 2a 20 49 66 20 73 6f 6d 65 20 74 68  .  /* If some th
b510: 72 65 61 64 20 75 73 69 6e 67 20 74 68 69 73 20  read using this 
b520: 50 49 44 20 68 61 73 20 61 20 6c 6f 63 6b 20 76  PID has a lock v
b530: 69 61 20 61 20 64 69 66 66 65 72 65 6e 74 20 75  ia a different u
b540: 6e 69 78 46 69 6c 65 2a 0a 20 20 2a 2a 20 68 61  nixFile*.  ** ha
b550: 6e 64 6c 65 20 74 68 61 74 20 70 72 65 63 6c 75  ndle that preclu
b560: 64 65 73 20 74 68 65 20 72 65 71 75 65 73 74 65  des the requeste
b570: 64 20 6c 6f 63 6b 2c 20 72 65 74 75 72 6e 20 42  d lock, return B
b580: 55 53 59 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  USY..  */.  if( 
b590: 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65  (pFile->locktype
b5a0: 21 3d 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70  !=pLock->locktyp
b5b0: 65 20 26 26 20 0a 20 20 20 20 20 20 20 20 20 20  e && .          
b5c0: 28 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65  (pLock->locktype
b5d0: 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 7c  >=PENDING_LOCK |
b5e0: 7c 20 6c 6f 63 6b 74 79 70 65 3e 53 48 41 52 45  | locktype>SHARE
b5f0: 44 5f 4c 4f 43 4b 29 29 0a 20 20 29 7b 0a 20 20  D_LOCK)).  ){.  
b600: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
b610: 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64  SY;.    goto end
b620: 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  _lock;.  }..  /*
b630: 20 49 66 20 61 20 53 48 41 52 45 44 20 6c 6f 63   If a SHARED loc
b640: 6b 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20  k is requested, 
b650: 61 6e 64 20 73 6f 6d 65 20 74 68 72 65 61 64 20  and some thread 
b660: 75 73 69 6e 67 20 74 68 69 73 20 50 49 44 20 61  using this PID a
b670: 6c 72 65 61 64 79 0a 20 20 2a 2a 20 68 61 73 20  lready.  ** has 
b680: 61 20 53 48 41 52 45 44 20 6f 72 20 52 45 53 45  a SHARED or RESE
b690: 52 56 45 44 20 6c 6f 63 6b 2c 20 74 68 65 6e 20  RVED lock, then 
b6a0: 69 6e 63 72 65 6d 65 6e 74 20 72 65 66 65 72 65  increment refere
b6b0: 6e 63 65 20 63 6f 75 6e 74 73 20 61 6e 64 0a 20  nce counts and. 
b6c0: 20 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54   ** return SQLIT
b6d0: 45 5f 4f 4b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  E_OK..  */.  if(
b6e0: 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45   locktype==SHARE
b6f0: 44 5f 4c 4f 43 4b 20 26 26 20 0a 20 20 20 20 20  D_LOCK && .     
b700: 20 28 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70   (pLock->locktyp
b710: 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c  e==SHARED_LOCK |
b720: 7c 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70  | pLock->locktyp
b730: 65 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  e==RESERVED_LOCK
b740: 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ) ){.    assert(
b750: 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45   locktype==SHARE
b760: 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 61 73  D_LOCK );.    as
b770: 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63  sert( pFile->loc
b780: 6b 74 79 70 65 3d 3d 30 20 29 3b 0a 20 20 20 20  ktype==0 );.    
b790: 61 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 63  assert( pLock->c
b7a0: 6e 74 3e 30 20 29 3b 0a 20 20 20 20 70 46 69 6c  nt>0 );.    pFil
b7b0: 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 53 48  e->locktype = SH
b7c0: 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70  ARED_LOCK;.    p
b7d0: 4c 6f 63 6b 2d 3e 63 6e 74 2b 2b 3b 0a 20 20 20  Lock->cnt++;.   
b7e0: 20 70 46 69 6c 65 2d 3e 70 4f 70 65 6e 2d 3e 6e   pFile->pOpen->n
b7f0: 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f  Lock++;.    goto
b800: 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a   end_lock;.  }..
b810: 0a 20 20 2f 2a 20 41 20 50 45 4e 44 49 4e 47 20  .  /* A PENDING 
b820: 6c 6f 63 6b 20 69 73 20 6e 65 65 64 65 64 20 62  lock is needed b
b830: 65 66 6f 72 65 20 61 63 71 75 69 72 69 6e 67 20  efore acquiring 
b840: 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 61 6e  a SHARED lock an
b850: 64 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20 61 63  d before.  ** ac
b860: 71 75 69 72 69 6e 67 20 61 6e 20 45 58 43 4c 55  quiring an EXCLU
b870: 53 49 56 45 20 6c 6f 63 6b 2e 20 20 46 6f 72 20  SIVE lock.  For 
b880: 74 68 65 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c  the SHARED lock,
b890: 20 74 68 65 20 50 45 4e 44 49 4e 47 20 77 69 6c   the PENDING wil
b8a0: 6c 0a 20 20 2a 2a 20 62 65 20 72 65 6c 65 61 73  l.  ** be releas
b8b0: 65 64 2e 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b 2e  ed..  */.  lock.
b8c0: 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 20 20 6c 6f  l_len = 1L;.  lo
b8d0: 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45  ck.l_whence = SE
b8e0: 45 4b 5f 53 45 54 3b 0a 20 20 69 66 28 20 6c 6f  EK_SET;.  if( lo
b8f0: 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c  cktype==SHARED_L
b900: 4f 43 4b 20 0a 20 20 20 20 20 20 7c 7c 20 28 6c  OCK .      || (l
b910: 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53 49  ocktype==EXCLUSI
b920: 56 45 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65  VE_LOCK && pFile
b930: 2d 3e 6c 6f 63 6b 74 79 70 65 3c 50 45 4e 44 49  ->locktype<PENDI
b940: 4e 47 5f 4c 4f 43 4b 29 0a 20 20 29 7b 0a 20 20  NG_LOCK).  ){.  
b950: 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20    lock.l_type = 
b960: 28 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45  (locktype==SHARE
b970: 44 5f 4c 4f 43 4b 3f 46 5f 52 44 4c 43 4b 3a 46  D_LOCK?F_RDLCK:F
b980: 5f 57 52 4c 43 4b 29 3b 0a 20 20 20 20 6c 6f 63  _WRLCK);.    loc
b990: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50 45 4e 44  k.l_start = PEND
b9a0: 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20 20 73 20  ING_BYTE;.    s 
b9b0: 3d 20 66 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68  = fcntl(pFile->h
b9c0: 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b  , F_SETLK, &lock
b9d0: 29 3b 0a 20 20 20 20 69 66 28 20 73 3d 3d 28 2d  );.    if( s==(-
b9e0: 31 29 20 29 7b 0a 20 20 20 20 20 20 74 45 72 72  1) ){.      tErr
b9f0: 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
ba00: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72    rc = sqliteErr
ba10: 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72  orFromPosixError
ba20: 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f  (tErrno, SQLITE_
ba30: 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20  IOERR_LOCK);.   
ba40: 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
ba50: 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20  RROR(rc) ){.    
ba60: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
ba70: 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20  rrno = tErrno;. 
ba80: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74       }.      got
ba90: 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20  o end_lock;.    
baa0: 7d 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 49 66 20  }.  }...  /* If 
bab0: 63 6f 6e 74 72 6f 6c 20 67 65 74 73 20 74 6f 20  control gets to 
bac0: 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e  this point, then
bad0: 20 61 63 74 75 61 6c 6c 79 20 67 6f 20 61 68 65   actually go ahe
bae0: 61 64 20 61 6e 64 20 6d 61 6b 65 0a 20 20 2a 2a  ad and make.  **
baf0: 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
bb00: 6d 20 63 61 6c 6c 73 20 66 6f 72 20 74 68 65 20  m calls for the 
bb10: 73 70 65 63 69 66 69 65 64 20 6c 6f 63 6b 2e 0a  specified lock..
bb20: 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74    */.  if( lockt
bb30: 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype==SHARED_LOCK
bb40: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
bb50: 70 4c 6f 63 6b 2d 3e 63 6e 74 3d 3d 30 20 29 3b  pLock->cnt==0 );
bb60: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f  .    assert( pLo
bb70: 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 30 20  ck->locktype==0 
bb80: 29 3b 0a 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 67  );..    /* Now g
bb90: 65 74 20 74 68 65 20 72 65 61 64 2d 6c 6f 63 6b  et the read-lock
bba0: 20 2a 2f 0a 20 20 20 20 73 20 3d 20 72 61 6e 67   */.    s = rang
bbb0: 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 46 5f 52  eLock(pFile, F_R
bbc0: 44 4c 43 4b 2c 20 26 74 45 72 72 6e 6f 29 3b 0a  DLCK, &tErrno);.
bbd0: 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 74 68 65  .    /* Drop the
bbe0: 20 74 65 6d 70 6f 72 61 72 79 20 50 45 4e 44 49   temporary PENDI
bbf0: 4e 47 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c  NG lock */.    l
bc00: 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50 45  ock.l_start = PE
bc10: 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20 20  NDING_BYTE;.    
bc20: 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c 3b  lock.l_len = 1L;
bc30: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65  .    lock.l_type
bc40: 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20   = F_UNLCK;.    
bc50: 69 66 28 20 66 63 6e 74 6c 28 70 46 69 6c 65 2d  if( fcntl(pFile-
bc60: 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f  >h, F_SETLK, &lo
bc70: 63 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ck)!=0 ){.      
bc80: 69 66 28 20 73 20 21 3d 20 2d 31 20 29 7b 0a 20  if( s != -1 ){. 
bc90: 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63         /* This c
bca0: 6f 75 6c 64 20 68 61 70 70 65 6e 20 77 69 74 68  ould happen with
bcb0: 20 61 20 6e 65 74 77 6f 72 6b 20 6d 6f 75 6e 74   a network mount
bcc0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 74 45 72 72   */.        tErr
bcd0: 6e 6f 20 3d 20 65 72 72 6e 6f 3b 20 0a 20 20 20  no = errno; .   
bce0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
bcf0: 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
bd00: 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49  ror(tErrno, SQLI
bd10: 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29  TE_IOERR_UNLOCK)
bd20: 3b 20 0a 20 20 20 20 20 20 20 20 69 66 28 20 49  ; .        if( I
bd30: 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29  S_LOCK_ERROR(rc)
bd40: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46   ){.          pF
bd50: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
bd60: 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20   tErrno;.       
bd70: 20 7d 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20   }.        goto 
bd80: 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 20 20  end_lock;.      
bd90: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
bda0: 73 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20  s==(-1) ){.     
bdb0: 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f   rc = sqliteErro
bdc0: 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28  rFromPosixError(
bdd0: 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49  tErrno, SQLITE_I
bde0: 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  OERR_LOCK);.    
bdf0: 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52    if( IS_LOCK_ER
be00: 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20  ROR(rc) ){.     
be10: 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
be20: 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20  rno = tErrno;.  
be30: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
be40: 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f  .      pFile->lo
be50: 63 6b 74 79 70 65 20 3d 20 53 48 41 52 45 44 5f  cktype = SHARED_
be60: 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 70 46 69 6c  LOCK;.      pFil
be70: 65 2d 3e 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 2b  e->pOpen->nLock+
be80: 2b 3b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e  +;.      pLock->
be90: 63 6e 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  cnt = 1;.    }. 
bea0: 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b 74   }else if( lockt
beb0: 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ype==EXCLUSIVE_L
bec0: 4f 43 4b 20 26 26 20 70 4c 6f 63 6b 2d 3e 63 6e  OCK && pLock->cn
bed0: 74 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 57 65  t>1 ){.    /* We
bee0: 20 61 72 65 20 74 72 79 69 6e 67 20 66 6f 72 20   are trying for 
bef0: 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
bf00: 6b 20 62 75 74 20 61 6e 6f 74 68 65 72 20 74 68  k but another th
bf10: 72 65 61 64 20 69 6e 20 74 68 69 73 0a 20 20 20  read in this.   
bf20: 20 2a 2a 20 73 61 6d 65 20 70 72 6f 63 65 73 73   ** same process
bf30: 20 69 73 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e   is still holdin
bf40: 67 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e  g a shared lock.
bf50: 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   */.    rc = SQL
bf60: 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 65 6c 73  ITE_BUSY;.  }els
bf70: 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65  e{.    /* The re
bf80: 71 75 65 73 74 20 77 61 73 20 66 6f 72 20 61 20  quest was for a 
bf90: 52 45 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c  RESERVED or EXCL
bfa0: 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 49 74 20  USIVE lock.  It 
bfb0: 69 73 0a 20 20 20 20 2a 2a 20 61 73 73 75 6d 65  is.    ** assume
bfc0: 64 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20  d that there is 
bfd0: 61 20 53 48 41 52 45 44 20 6f 72 20 67 72 65 61  a SHARED or grea
bfe0: 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ter lock on the 
bff0: 66 69 6c 65 0a 20 20 20 20 2a 2a 20 61 6c 72 65  file.    ** alre
c000: 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ady..    */.    
c010: 61 73 73 65 72 74 28 20 30 21 3d 70 46 69 6c 65  assert( 0!=pFile
c020: 2d 3e 6c 6f 63 6b 74 79 70 65 20 29 3b 0a 20 20  ->locktype );.  
c030: 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20    lock.l_type = 
c040: 46 5f 57 52 4c 43 4b 3b 0a 20 20 20 20 73 77 69  F_WRLCK;.    swi
c050: 74 63 68 28 20 6c 6f 63 6b 74 79 70 65 20 29 7b  tch( locktype ){
c060: 0a 20 20 20 20 20 20 63 61 73 65 20 52 45 53 45  .      case RESE
c070: 52 56 45 44 5f 4c 4f 43 4b 3a 0a 20 20 20 20 20  RVED_LOCK:.     
c080: 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20     lock.l_start 
c090: 3d 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 3b  = RESERVED_BYTE;
c0a0: 0a 20 20 20 20 20 20 20 20 73 20 3d 20 66 63 6e  .        s = fcn
c0b0: 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53  tl(pFile->h, F_S
c0c0: 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3b 0a 20 20  ETLK, &lock);.  
c0d0: 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65        tErrno = e
c0e0: 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 62 72  rrno;.        br
c0f0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
c100: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3a 0a  EXCLUSIVE_LOCK:.
c110: 20 20 20 20 20 20 20 20 73 20 3d 20 72 61 6e 67          s = rang
c120: 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 46 5f 57  eLock(pFile, F_W
c130: 52 4c 43 4b 2c 20 26 74 45 72 72 6e 6f 29 3b 0a  RLCK, &tErrno);.
c140: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
c150: 20 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20       default:.  
c160: 20 20 20 20 20 20 61 73 73 65 72 74 28 30 29 3b        assert(0);
c170: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
c180: 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20  ==(-1) ){.      
c190: 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72  rc = sqliteError
c1a0: 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74  FromPosixError(t
c1b0: 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f  Errno, SQLITE_IO
c1c0: 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  ERR_LOCK);.     
c1d0: 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
c1e0: 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20  OR(rc) ){.      
c1f0: 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
c200: 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20  no = tErrno;.   
c210: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
c220: 20 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55   ..#ifndef NDEBU
c230: 47 0a 20 20 2f 2a 20 53 65 74 20 75 70 20 74 68  G.  /* Set up th
c240: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2d 63 6f  e transaction-co
c250: 75 6e 74 65 72 20 63 68 61 6e 67 65 20 63 68 65  unter change che
c260: 63 6b 69 6e 67 20 66 6c 61 67 73 20 77 68 65 6e  cking flags when
c270: 0a 20 20 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  .  ** transition
c280: 69 6e 67 20 66 72 6f 6d 20 61 20 53 48 41 52 45  ing from a SHARE
c290: 44 20 74 6f 20 61 20 52 45 53 45 52 56 45 44 20  D to a RESERVED 
c2a0: 6c 6f 63 6b 2e 20 20 54 68 65 20 63 68 61 6e 67  lock.  The chang
c2b0: 65 0a 20 20 2a 2a 20 66 72 6f 6d 20 53 48 41 52  e.  ** from SHAR
c2c0: 45 44 20 74 6f 20 52 45 53 45 52 56 45 44 20 6d  ED to RESERVED m
c2d0: 61 72 6b 73 20 74 68 65 20 62 65 67 69 6e 6e 69  arks the beginni
c2e0: 6e 67 20 6f 66 20 61 20 6e 6f 72 6d 61 6c 0a 20  ng of a normal. 
c2f0: 20 2a 2a 20 77 72 69 74 65 20 6f 70 65 72 61 74   ** write operat
c300: 69 6f 6e 20 28 6e 6f 74 20 61 20 68 6f 74 20 6a  ion (not a hot j
c310: 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 29  ournal rollback)
c320: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d  ..  */.  if( rc=
c330: 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 26 26  =SQLITE_OK.   &&
c340: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
c350: 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 20 20  <=SHARED_LOCK.  
c360: 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 52 45   && locktype==RE
c370: 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 20 20 29 7b  SERVED_LOCK.  ){
c380: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 74 72 61 6e  .    pFile->tran
c390: 73 43 6e 74 72 43 68 6e 67 20 3d 20 30 3b 0a 20  sCntrChng = 0;. 
c3a0: 20 20 20 70 46 69 6c 65 2d 3e 64 62 55 70 64 61     pFile->dbUpda
c3b0: 74 65 20 3d 20 30 3b 0a 20 20 20 20 70 46 69 6c  te = 0;.    pFil
c3c0: 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65  e->inNormalWrite
c3d0: 20 3d 20 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66   = 1;.  }.#endif
c3e0: 0a 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  ...  if( rc==SQL
c3f0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 46  ITE_OK ){.    pF
c400: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20  ile->locktype = 
c410: 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20 70 4c  locktype;.    pL
c420: 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20  ock->locktype = 
c430: 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 7d 65 6c 73  locktype;.  }els
c440: 65 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d  e if( locktype==
c450: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
c460: 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63  {.    pFile->loc
c470: 6b 74 79 70 65 20 3d 20 50 45 4e 44 49 4e 47 5f  ktype = PENDING_
c480: 4c 4f 43 4b 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d  LOCK;.    pLock-
c490: 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 50 45 4e 44  >locktype = PEND
c4a0: 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a 0a 65  ING_LOCK;.  }..e
c4b0: 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 75 6e 69 78 4c  nd_lock:.  unixL
c4c0: 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f  eaveMutex();.  O
c4d0: 53 54 52 41 43 45 34 28 22 4c 4f 43 4b 20 20 20  STRACE4("LOCK   
c4e0: 20 25 64 20 25 73 20 25 73 5c 6e 22 2c 20 70 46   %d %s %s\n", pF
c4f0: 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70 65  ile->h, locktype
c500: 4e 61 6d 65 28 6c 6f 63 6b 74 79 70 65 29 2c 20  Name(locktype), 
c510: 0a 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54  .      rc==SQLIT
c520: 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66  E_OK ? "ok" : "f
c530: 61 69 6c 65 64 22 29 3b 0a 20 20 72 65 74 75 72  ailed");.  retur
c540: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
c550: 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65 20 64 65  lose all file de
c560: 73 63 72 69 70 74 6f 72 73 20 61 63 63 75 6d 75  scriptors accumu
c570: 61 74 65 64 20 69 6e 20 74 68 65 20 75 6e 69 78  ated in the unix
c580: 4f 70 65 6e 43 6e 74 2d 3e 70 55 6e 75 73 65 64  OpenCnt->pUnused
c590: 20 6c 69 73 74 2e 0a 2a 2a 20 49 66 20 61 6c 6c   list..** If all
c5a0: 20 73 75 63 68 20 66 69 6c 65 20 64 65 73 63 72   such file descr
c5b0: 69 70 74 6f 72 73 20 61 72 65 20 63 6c 6f 73 65  iptors are close
c5c0: 64 20 77 69 74 68 6f 75 74 20 65 72 72 6f 72 2c  d without error,
c5d0: 20 74 68 65 20 6c 69 73 74 20 69 73 0a 2a 2a 20   the list is.** 
c5e0: 63 6c 65 61 72 65 64 20 61 6e 64 20 53 51 4c 49  cleared and SQLI
c5f0: 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a  TE_OK returned..
c600: 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  **.** Otherwise,
c610: 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   if an error occ
c620: 75 72 73 2c 20 74 68 65 6e 20 73 75 63 63 65 73  urs, then succes
c630: 73 66 75 6c 6c 79 20 63 6c 6f 73 65 64 20 66 69  sfully closed fi
c640: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 0a 2a 2a  le descriptor.**
c650: 20 65 6e 74 72 69 65 73 20 61 72 65 20 72 65 6d   entries are rem
c660: 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 6c 69  oved from the li
c670: 73 74 2c 20 61 6e 64 20 53 51 4c 49 54 45 5f 49  st, and SQLITE_I
c680: 4f 45 52 52 5f 43 4c 4f 53 45 20 72 65 74 75 72  OERR_CLOSE retur
c690: 6e 65 64 2e 20 0a 2a 2a 20 6e 6f 74 20 64 65 6c  ned. .** not del
c6a0: 65 74 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f  eted and SQLITE_
c6b0: 49 4f 45 52 52 5f 43 4c 4f 53 45 20 72 65 74 75  IOERR_CLOSE retu
c6c0: 72 6e 65 64 2e 0a 2a 2f 20 0a 73 74 61 74 69 63  rned..*/ .static
c6d0: 20 69 6e 74 20 63 6c 6f 73 65 50 65 6e 64 69 6e   int closePendin
c6e0: 67 46 64 73 28 75 6e 69 78 46 69 6c 65 20 2a 70  gFds(unixFile *p
c6f0: 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20 72 63 20  File){.  int rc 
c700: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73  = SQLITE_OK;.  s
c710: 74 72 75 63 74 20 75 6e 69 78 4f 70 65 6e 43 6e  truct unixOpenCn
c720: 74 20 2a 70 4f 70 65 6e 20 3d 20 70 46 69 6c 65  t *pOpen = pFile
c730: 2d 3e 70 4f 70 65 6e 3b 0a 20 20 55 6e 69 78 55  ->pOpen;.  UnixU
c740: 6e 75 73 65 64 46 64 20 2a 70 45 72 72 6f 72 20  nusedFd *pError 
c750: 3d 20 30 3b 0a 20 20 55 6e 69 78 55 6e 75 73 65  = 0;.  UnixUnuse
c760: 64 46 64 20 2a 70 3b 0a 20 20 55 6e 69 78 55 6e  dFd *p;.  UnixUn
c770: 75 73 65 64 46 64 20 2a 70 4e 65 78 74 3b 0a 20  usedFd *pNext;. 
c780: 20 66 6f 72 28 70 3d 70 4f 70 65 6e 2d 3e 70 55   for(p=pOpen->pU
c790: 6e 75 73 65 64 3b 20 70 3b 20 70 3d 70 4e 65 78  nused; p; p=pNex
c7a0: 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20  t){.    pNext = 
c7b0: 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 69 66  p->pNext;.    if
c7c0: 28 20 63 6c 6f 73 65 28 70 2d 3e 66 64 29 20 29  ( close(p->fd) )
c7d0: 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  {.      pFile->l
c7e0: 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  astErrno = errno
c7f0: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  ;.      rc = SQL
c800: 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53 45 3b  ITE_IOERR_CLOSE;
c810: 0a 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20  .      p->pNext 
c820: 3d 20 70 45 72 72 6f 72 3b 0a 20 20 20 20 20 20  = pError;.      
c830: 70 45 72 72 6f 72 20 3d 20 70 3b 0a 20 20 20 20  pError = p;.    
c840: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
c850: 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
c860: 20 20 7d 0a 20 20 7d 0a 20 20 70 4f 70 65 6e 2d    }.  }.  pOpen-
c870: 3e 70 55 6e 75 73 65 64 20 3d 20 70 45 72 72 6f  >pUnused = pErro
c880: 72 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  r;.  return rc;.
c890: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74 68 65  }../*.** Add the
c8a0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
c8b0: 20 75 73 65 64 20 62 79 20 66 69 6c 65 20 68 61   used by file ha
c8c0: 6e 64 6c 65 20 70 46 69 6c 65 20 74 6f 20 74 68  ndle pFile to th
c8d0: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a  e corresponding.
c8e0: 2a 2a 20 70 55 6e 75 73 65 64 20 6c 69 73 74 2e  ** pUnused list.
c8f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
c900: 73 65 74 50 65 6e 64 69 6e 67 46 64 28 75 6e 69  setPendingFd(uni
c910: 78 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20  xFile *pFile){. 
c920: 20 73 74 72 75 63 74 20 75 6e 69 78 4f 70 65 6e   struct unixOpen
c930: 43 6e 74 20 2a 70 4f 70 65 6e 20 3d 20 70 46 69  Cnt *pOpen = pFi
c940: 6c 65 2d 3e 70 4f 70 65 6e 3b 0a 20 20 55 6e 69  le->pOpen;.  Uni
c950: 78 55 6e 75 73 65 64 46 64 20 2a 70 20 3d 20 70  xUnusedFd *p = p
c960: 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64 3b 0a 20  File->pUnused;. 
c970: 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 4f 70 65   p->pNext = pOpe
c980: 6e 2d 3e 70 55 6e 75 73 65 64 3b 0a 20 20 70 4f  n->pUnused;.  pO
c990: 70 65 6e 2d 3e 70 55 6e 75 73 65 64 20 3d 20 70  pen->pUnused = p
c9a0: 3b 0a 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 2d  ;.  pFile->h = -
c9b0: 31 3b 0a 20 20 70 46 69 6c 65 2d 3e 70 55 6e 75  1;.  pFile->pUnu
c9c0: 73 65 64 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  sed = 0;.}../*.*
c9d0: 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b  * Lower the lock
c9e0: 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c  ing level on fil
c9f0: 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69  e descriptor pFi
ca00: 6c 65 20 74 6f 20 6c 6f 63 6b 74 79 70 65 2e 20  le to locktype. 
ca10: 20 6c 6f 63 6b 74 79 70 65 0a 2a 2a 20 6d 75 73   locktype.** mus
ca20: 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c  t be either NO_L
ca30: 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f  OCK or SHARED_LO
ca40: 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  CK..**.** If the
ca50: 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
ca60: 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  f the file descr
ca70: 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79  iptor is already
ca80: 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20   at or below.** 
ca90: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
caa0: 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69  cking level, thi
cab0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
cac0: 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
cad0: 69 6e 74 20 75 6e 69 78 55 6e 6c 6f 63 6b 28 73  int unixUnlock(s
cae0: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
caf0: 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a   int locktype){.
cb00: 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
cb10: 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
cb20: 64 3b 20 2f 2a 20 54 68 65 20 6f 70 65 6e 20 66  d; /* The open f
cb30: 69 6c 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ile */.  struct 
cb40: 75 6e 69 78 4c 6f 63 6b 49 6e 66 6f 20 2a 70 4c  unixLockInfo *pL
cb50: 6f 63 6b 3b 20 20 20 20 20 20 2f 2a 20 53 74 72  ock;      /* Str
cb60: 75 63 74 75 72 65 20 64 65 73 63 72 69 62 69 6e  ucture describin
cb70: 67 20 63 75 72 72 65 6e 74 20 6c 6f 63 6b 20 73  g current lock s
cb80: 74 61 74 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  tate */.  struct
cb90: 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 20 20 20 20   flock lock;    
cba0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
cbb0: 66 6f 72 6d 61 74 69 6f 6e 20 70 61 73 73 65 64  formation passed
cbc0: 20 69 6e 74 6f 20 66 63 6e 74 6c 28 29 20 2a 2f   into fcntl() */
cbd0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
cbe0: 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
cbf0: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
cc00: 64 65 20 66 72 6f 6d 20 74 68 69 73 20 69 6e 74  de from this int
cc10: 65 72 66 61 63 65 20 2a 2f 0a 20 20 69 6e 74 20  erface */.  int 
cc20: 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h;              
cc30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
cc40: 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 66  The underlying f
cc50: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a  ile descriptor *
cc60: 2f 0a 20 20 69 6e 74 20 74 45 72 72 6e 6f 3b 20  /.  int tErrno; 
cc70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc80: 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f       /* Error co
cc90: 64 65 20 66 72 6f 6d 20 73 79 73 74 65 6d 20 63  de from system c
cca0: 61 6c 6c 20 65 72 72 6f 72 73 20 2a 2f 0a 0a 20  all errors */.. 
ccb0: 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
ccc0: 3b 0a 20 20 4f 53 54 52 41 43 45 37 28 22 55 4e  ;.  OSTRACE7("UN
ccd0: 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73 20  LOCK  %d %d was 
cce0: 25 64 28 25 64 2c 25 64 29 20 70 69 64 3d 25 64  %d(%d,%d) pid=%d
ccf0: 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6c  \n", pFile->h, l
cd00: 6f 63 6b 74 79 70 65 2c 0a 20 20 20 20 20 20 70  ocktype,.      p
cd10: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20  File->locktype, 
cd20: 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 2d 3e 6c 6f  pFile->pLock->lo
cd30: 63 6b 74 79 70 65 2c 20 70 46 69 6c 65 2d 3e 70  cktype, pFile->p
cd40: 4c 6f 63 6b 2d 3e 63 6e 74 2c 20 67 65 74 70 69  Lock->cnt, getpi
cd50: 64 28 29 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  d());..  assert(
cd60: 20 6c 6f 63 6b 74 79 70 65 3c 3d 53 48 41 52 45   locktype<=SHARE
cd70: 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20  D_LOCK );.  if( 
cd80: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3c  pFile->locktype<
cd90: 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20  =locktype ){.   
cda0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
cdb0: 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 43 48 45  K;.  }.  if( CHE
cdc0: 43 4b 5f 54 48 52 45 41 44 49 44 28 70 46 69 6c  CK_THREADID(pFil
cdd0: 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  e) ){.    return
cde0: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a   SQLITE_MISUSE;.
cdf0: 20 20 7d 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d    }.  unixEnterM
ce00: 75 74 65 78 28 29 3b 0a 20 20 68 20 3d 20 70 46  utex();.  h = pF
ce10: 69 6c 65 2d 3e 68 3b 0a 20 20 70 4c 6f 63 6b 20  ile->h;.  pLock 
ce20: 3d 20 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 3b 0a  = pFile->pLock;.
ce30: 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d    assert( pLock-
ce40: 3e 63 6e 74 21 3d 30 20 29 3b 0a 20 20 69 66 28  >cnt!=0 );.  if(
ce50: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
ce60: 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  >SHARED_LOCK ){.
ce70: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63      assert( pLoc
ce80: 6b 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 70 46 69  k->locktype==pFi
ce90: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 29 3b 0a  le->locktype );.
cea0: 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72      SimulateIOEr
ceb0: 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20  rorBenign(1);.  
cec0: 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
ced0: 72 28 20 68 3d 28 2d 31 29 20 29 0a 20 20 20 20  r( h=(-1) ).    
cee0: 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42  SimulateIOErrorB
cef0: 65 6e 69 67 6e 28 30 29 3b 0a 0a 23 69 66 6e 64  enign(0);..#ifnd
cf00: 65 66 20 4e 44 45 42 55 47 0a 20 20 20 20 2f 2a  ef NDEBUG.    /*
cf10: 20 57 68 65 6e 20 72 65 64 75 63 69 6e 67 20 61   When reducing a
cf20: 20 6c 6f 63 6b 20 73 75 63 68 20 74 68 61 74 20   lock such that 
cf30: 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 20  other processes 
cf40: 63 61 6e 20 73 74 61 72 74 0a 20 20 20 20 2a 2a  can start.    **
cf50: 20 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74   reading the dat
cf60: 61 62 61 73 65 20 66 69 6c 65 20 61 67 61 69 6e  abase file again
cf70: 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  , make sure that
cf80: 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e   the.    ** tran
cf90: 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20  saction counter 
cfa0: 77 61 73 20 75 70 64 61 74 65 64 20 69 66 20 61  was updated if a
cfb0: 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65 20 64  ny part of the d
cfc0: 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66  atabase.    ** f
cfd0: 69 6c 65 20 63 68 61 6e 67 65 64 2e 20 20 49 66  ile changed.  If
cfe0: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
cff0: 20 63 6f 75 6e 74 65 72 20 69 73 20 6e 6f 74 20   counter is not 
d000: 75 70 64 61 74 65 64 2c 0a 20 20 20 20 2a 2a 20  updated,.    ** 
d010: 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
d020: 73 20 74 6f 20 74 68 65 20 73 61 6d 65 20 66 69  s to the same fi
d030: 6c 65 20 6d 69 67 68 74 20 6e 6f 74 20 72 65 61  le might not rea
d040: 6c 69 7a 65 20 74 68 61 74 0a 20 20 20 20 2a 2a  lize that.    **
d050: 20 74 68 65 20 66 69 6c 65 20 68 61 73 20 63 68   the file has ch
d060: 61 6e 67 65 64 20 61 6e 64 20 68 65 6e 63 65 20  anged and hence 
d070: 6d 69 67 68 74 20 6e 6f 74 20 6b 6e 6f 77 20 74  might not know t
d080: 6f 20 66 6c 75 73 68 20 74 68 65 69 72 0a 20 20  o flush their.  
d090: 20 20 2a 2a 20 63 61 63 68 65 2e 20 20 54 68 65    ** cache.  The
d0a0: 20 75 73 65 20 6f 66 20 61 20 73 74 61 6c 65 20   use of a stale 
d0b0: 63 61 63 68 65 20 63 61 6e 20 6c 65 61 64 20 74  cache can lead t
d0c0: 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75  o database corru
d0d0: 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  ption..    */.  
d0e0: 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d    assert( pFile-
d0f0: 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 3d 3d  >inNormalWrite==
d100: 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 46  0.         || pF
d110: 69 6c 65 2d 3e 64 62 55 70 64 61 74 65 3d 3d 30  ile->dbUpdate==0
d120: 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 46 69  .         || pFi
d130: 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e  le->transCntrChn
d140: 67 3d 3d 31 20 29 3b 0a 20 20 20 20 70 46 69 6c  g==1 );.    pFil
d150: 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65  e->inNormalWrite
d160: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 0a 20   = 0;.#endif... 
d170: 20 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d     if( locktype=
d180: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  =SHARED_LOCK ){.
d190: 20 20 20 20 20 20 69 66 28 20 72 61 6e 67 65 4c        if( rangeL
d1a0: 6f 63 6b 28 70 46 69 6c 65 2c 20 46 5f 52 44 4c  ock(pFile, F_RDL
d1b0: 43 4b 2c 20 26 74 45 72 72 6e 6f 29 3d 3d 28 2d  CK, &tErrno)==(-
d1c0: 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  1) ){.        rc
d1d0: 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
d1e0: 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
d1f0: 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
d200: 52 5f 52 44 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  R_RDLOCK);.     
d210: 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
d220: 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20  RROR(rc) ){.    
d230: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
d240: 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b  tErrno = tErrno;
d250: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
d260: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f     goto end_unlo
d270: 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ck;.      }.    
d280: 7d 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70  }.    lock.l_typ
d290: 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20  e = F_UNLCK;.   
d2a0: 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d   lock.l_whence =
d2b0: 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 6c   SEEK_SET;.    l
d2c0: 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50 45  ock.l_start = PE
d2d0: 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20 20  NDING_BYTE;.    
d2e0: 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 32 4c 3b  lock.l_len = 2L;
d2f0: 20 20 61 73 73 65 72 74 28 20 50 45 4e 44 49 4e    assert( PENDIN
d300: 47 5f 42 59 54 45 2b 31 3d 3d 52 45 53 45 52 56  G_BYTE+1==RESERV
d310: 45 44 5f 42 59 54 45 20 29 3b 0a 20 20 20 20 69  ED_BYTE );.    i
d320: 66 28 20 66 63 6e 74 6c 28 68 2c 20 46 5f 53 45  f( fcntl(h, F_SE
d330: 54 4c 4b 2c 20 26 6c 6f 63 6b 29 21 3d 28 2d 31  TLK, &lock)!=(-1
d340: 29 20 29 7b 0a 20 20 20 20 20 20 70 4c 6f 63 6b  ) ){.      pLock
d350: 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 53 48 41  ->locktype = SHA
d360: 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65  RED_LOCK;.    }e
d370: 6c 73 65 7b 0a 20 20 20 20 20 20 74 45 72 72 6e  lse{.      tErrn
d380: 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
d390: 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f   rc = sqliteErro
d3a0: 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28  rFromPosixError(
d3b0: 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49  tErrno, SQLITE_I
d3c0: 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20 20  OERR_UNLOCK);.  
d3d0: 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
d3e0: 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20  ERROR(rc) ){.   
d3f0: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
d400: 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a  Errno = tErrno;.
d410: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f        }.      go
d420: 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20  to end_unlock;. 
d430: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6c     }.  }.  if( l
d440: 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b  ocktype==NO_LOCK
d450: 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 75   ){.    struct u
d460: 6e 69 78 4f 70 65 6e 43 6e 74 20 2a 70 4f 70 65  nixOpenCnt *pOpe
d470: 6e 3b 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72 65  n;..    /* Decre
d480: 6d 65 6e 74 20 74 68 65 20 73 68 61 72 65 64 20  ment the shared 
d490: 6c 6f 63 6b 20 63 6f 75 6e 74 65 72 2e 20 20 52  lock counter.  R
d4a0: 65 6c 65 61 73 65 20 74 68 65 20 6c 6f 63 6b 20  elease the lock 
d4b0: 75 73 69 6e 67 20 61 6e 0a 20 20 20 20 2a 2a 20  using an.    ** 
d4c0: 4f 53 20 63 61 6c 6c 20 6f 6e 6c 79 20 77 68 65  OS call only whe
d4d0: 6e 20 61 6c 6c 20 74 68 72 65 61 64 73 20 69 6e  n all threads in
d4e0: 20 74 68 69 73 20 73 61 6d 65 20 70 72 6f 63 65   this same proce
d4f0: 73 73 20 68 61 76 65 20 72 65 6c 65 61 73 65 64  ss have released
d500: 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c 6f 63 6b  .    ** the lock
d510: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 4c 6f  ..    */.    pLo
d520: 63 6b 2d 3e 63 6e 74 2d 2d 3b 0a 20 20 20 20 69  ck->cnt--;.    i
d530: 66 28 20 70 4c 6f 63 6b 2d 3e 63 6e 74 3d 3d 30  f( pLock->cnt==0
d540: 20 29 7b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c   ){.      lock.l
d550: 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b  _type = F_UNLCK;
d560: 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68  .      lock.l_wh
d570: 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b  ence = SEEK_SET;
d580: 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74  .      lock.l_st
d590: 61 72 74 20 3d 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e  art = lock.l_len
d5a0: 20 3d 20 30 4c 3b 0a 20 20 20 20 20 20 53 69 6d   = 0L;.      Sim
d5b0: 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69  ulateIOErrorBeni
d5c0: 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 53 69 6d  gn(1);.      Sim
d5d0: 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 68 3d  ulateIOError( h=
d5e0: 28 2d 31 29 20 29 0a 20 20 20 20 20 20 53 69 6d  (-1) ).      Sim
d5f0: 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69  ulateIOErrorBeni
d600: 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 69 66 28  gn(0);.      if(
d610: 20 66 63 6e 74 6c 28 68 2c 20 46 5f 53 45 54 4c   fcntl(h, F_SETL
d620: 4b 2c 20 26 6c 6f 63 6b 29 21 3d 28 2d 31 29 20  K, &lock)!=(-1) 
d630: 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 6f 63 6b  ){.        pLock
d640: 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 4e 4f 5f  ->locktype = NO_
d650: 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  LOCK;.      }els
d660: 65 7b 0a 20 20 20 20 20 20 20 20 74 45 72 72 6e  e{.        tErrn
d670: 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
d680: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72     rc = sqliteEr
d690: 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f  rorFromPosixErro
d6a0: 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45  r(tErrno, SQLITE
d6b0: 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a  _IOERR_UNLOCK);.
d6c0: 20 20 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c          if( IS_L
d6d0: 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b  OCK_ERROR(rc) ){
d6e0: 0a 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65  .          pFile
d6f0: 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45  ->lastErrno = tE
d700: 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 7d 0a  rrno;.        }.
d710: 20 20 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 6c          pLock->l
d720: 6f 63 6b 74 79 70 65 20 3d 20 4e 4f 5f 4c 4f 43  ocktype = NO_LOC
d730: 4b 3b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65  K;.        pFile
d740: 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 4e 4f 5f  ->locktype = NO_
d750: 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  LOCK;.      }.  
d760: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72    }..    /* Decr
d770: 65 6d 65 6e 74 20 74 68 65 20 63 6f 75 6e 74 20  ement the count 
d780: 6f 66 20 6c 6f 63 6b 73 20 61 67 61 69 6e 73 74  of locks against
d790: 20 74 68 69 73 20 73 61 6d 65 20 66 69 6c 65 2e   this same file.
d7a0: 20 20 57 68 65 6e 20 74 68 65 0a 20 20 20 20 2a    When the.    *
d7b0: 2a 20 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20  * count reaches 
d7c0: 7a 65 72 6f 2c 20 63 6c 6f 73 65 20 61 6e 79 20  zero, close any 
d7d0: 6f 74 68 65 72 20 66 69 6c 65 20 64 65 73 63 72  other file descr
d7e0: 69 70 74 6f 72 73 20 77 68 6f 73 65 20 63 6c 6f  iptors whose clo
d7f0: 73 65 0a 20 20 20 20 2a 2a 20 77 61 73 20 64 65  se.    ** was de
d800: 66 65 72 72 65 64 20 62 65 63 61 75 73 65 20 6f  ferred because o
d810: 66 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f  f outstanding lo
d820: 63 6b 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  cks..    */.    
d830: 70 4f 70 65 6e 20 3d 20 70 46 69 6c 65 2d 3e 70  pOpen = pFile->p
d840: 4f 70 65 6e 3b 0a 20 20 20 20 70 4f 70 65 6e 2d  Open;.    pOpen-
d850: 3e 6e 4c 6f 63 6b 2d 2d 3b 0a 20 20 20 20 61 73  >nLock--;.    as
d860: 73 65 72 74 28 20 70 4f 70 65 6e 2d 3e 6e 4c 6f  sert( pOpen->nLo
d870: 63 6b 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  ck>=0 );.    if(
d880: 20 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 3d 3d 30   pOpen->nLock==0
d890: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63   ){.      int rc
d8a0: 32 20 3d 20 63 6c 6f 73 65 50 65 6e 64 69 6e 67  2 = closePending
d8b0: 46 64 73 28 70 46 69 6c 65 29 3b 0a 20 20 20 20  Fds(pFile);.    
d8c0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
d8d0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
d8e0: 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 20 20 7d  c = rc2;.      }
d8f0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 09 0a 65 6e 64  .    }.  }...end
d900: 5f 75 6e 6c 6f 63 6b 3a 0a 20 20 75 6e 69 78 4c  _unlock:.  unixL
d910: 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 69  eaveMutex();.  i
d920: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
d930: 20 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79   ) pFile->lockty
d940: 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20  pe = locktype;. 
d950: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
d960: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
d970: 6f 6e 20 70 65 72 66 6f 72 6d 73 20 74 68 65 20  on performs the 
d980: 70 61 72 74 73 20 6f 66 20 74 68 65 20 22 63 6c  parts of the "cl
d990: 6f 73 65 20 66 69 6c 65 22 20 6f 70 65 72 61 74  ose file" operat
d9a0: 69 6f 6e 20 0a 2a 2a 20 63 6f 6d 6d 6f 6e 20 74  ion .** common t
d9b0: 6f 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 73 63  o all locking sc
d9c0: 68 65 6d 65 73 2e 20 49 74 20 63 6c 6f 73 65 73  hemes. It closes
d9d0: 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 61   the directory a
d9e0: 6e 64 20 66 69 6c 65 0a 2a 2a 20 68 61 6e 64 6c  nd file.** handl
d9f0: 65 73 2c 20 69 66 20 74 68 65 79 20 61 72 65 20  es, if they are 
da00: 76 61 6c 69 64 2c 20 61 6e 64 20 73 65 74 73 20  valid, and sets 
da10: 61 6c 6c 20 66 69 65 6c 64 73 20 6f 66 20 74 68  all fields of th
da20: 65 20 75 6e 69 78 46 69 6c 65 0a 2a 2a 20 73 74  e unixFile.** st
da30: 72 75 63 74 75 72 65 20 74 6f 20 30 2e 0a 2a 2a  ructure to 0..**
da40: 0a 2a 2a 20 49 74 20 69 73 20 2a 6e 6f 74 2a 20  .** It is *not* 
da50: 6e 65 63 65 73 73 61 72 79 20 74 6f 20 68 6f 6c  necessary to hol
da60: 64 20 74 68 65 20 6d 75 74 65 78 20 77 68 65 6e  d the mutex when
da70: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
da80: 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 65 76 65 6e   called,.** even
da90: 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 20 20 41 20   on VxWorks.  A 
daa0: 6d 75 74 65 78 20 77 69 6c 6c 20 62 65 20 61 63  mutex will be ac
dab0: 71 75 69 72 65 64 20 6f 6e 20 56 78 57 6f 72 6b  quired on VxWork
dac0: 73 20 62 79 20 74 68 65 0a 2a 2a 20 76 78 77 6f  s by the.** vxwo
dad0: 72 6b 73 52 65 6c 65 61 73 65 46 69 6c 65 49 64  rksReleaseFileId
dae0: 28 29 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73  () routine..*/.s
daf0: 74 61 74 69 63 20 69 6e 74 20 63 6c 6f 73 65 55  tatic int closeU
db00: 6e 69 78 46 69 6c 65 28 73 71 6c 69 74 65 33 5f  nixFile(sqlite3_
db10: 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 75 6e 69  file *id){.  uni
db20: 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
db30: 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
db40: 69 66 28 20 70 46 69 6c 65 20 29 7b 0a 20 20 20  if( pFile ){.   
db50: 20 69 66 28 20 70 46 69 6c 65 2d 3e 64 69 72 66   if( pFile->dirf
db60: 64 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  d>=0 ){.      in
db70: 74 20 65 72 72 20 3d 20 63 6c 6f 73 65 28 70 46  t err = close(pF
db80: 69 6c 65 2d 3e 64 69 72 66 64 29 3b 0a 20 20 20  ile->dirfd);.   
db90: 20 20 20 69 66 28 20 65 72 72 20 29 7b 0a 20 20     if( err ){.  
dba0: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
dbb0: 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
dbc0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
dbd0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f  QLITE_IOERR_DIR_
dbe0: 43 4c 4f 53 45 3b 0a 20 20 20 20 20 20 7d 65 6c  CLOSE;.      }el
dbf0: 73 65 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c  se{.        pFil
dc00: 65 2d 3e 64 69 72 66 64 3d 2d 31 3b 0a 20 20 20  e->dirfd=-1;.   
dc10: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
dc20: 66 28 20 70 46 69 6c 65 2d 3e 68 3e 3d 30 20 29  f( pFile->h>=0 )
dc30: 7b 0a 20 20 20 20 20 20 69 6e 74 20 65 72 72 20  {.      int err 
dc40: 3d 20 63 6c 6f 73 65 28 70 46 69 6c 65 2d 3e 68  = close(pFile->h
dc50: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65 72 72  );.      if( err
dc60: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c   ){.        pFil
dc70: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65  e->lastErrno = e
dc80: 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 72 65  rrno;.        re
dc90: 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
dca0: 52 5f 43 4c 4f 53 45 3b 0a 20 20 20 20 20 20 7d  R_CLOSE;.      }
dcb0: 0a 20 20 20 20 7d 0a 23 69 66 20 4f 53 5f 56 58  .    }.#if OS_VX
dcc0: 57 4f 52 4b 53 0a 20 20 20 20 69 66 28 20 70 46  WORKS.    if( pF
dcd0: 69 6c 65 2d 3e 70 49 64 20 29 7b 0a 20 20 20 20  ile->pId ){.    
dce0: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 69 73 44    if( pFile->isD
dcf0: 65 6c 65 74 65 20 29 7b 0a 20 20 20 20 20 20 20  elete ){.       
dd00: 20 75 6e 6c 69 6e 6b 28 70 46 69 6c 65 2d 3e 70   unlink(pFile->p
dd10: 49 64 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61  Id->zCanonicalNa
dd20: 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  me);.      }.   
dd30: 20 20 20 76 78 77 6f 72 6b 73 52 65 6c 65 61 73     vxworksReleas
dd40: 65 46 69 6c 65 49 64 28 70 46 69 6c 65 2d 3e 70  eFileId(pFile->p
dd50: 49 64 29 3b 0a 20 20 20 20 20 20 70 46 69 6c 65  Id);.      pFile
dd60: 2d 3e 70 49 64 20 3d 20 30 3b 0a 20 20 20 20 7d  ->pId = 0;.    }
dd70: 0a 23 65 6e 64 69 66 0a 20 20 20 20 4f 53 54 52  .#endif.    OSTR
dd80: 41 43 45 32 28 22 43 4c 4f 53 45 20 20 20 25 2d  ACE2("CLOSE   %-
dd90: 33 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29  3d\n", pFile->h)
dda0: 3b 0a 20 20 20 20 4f 70 65 6e 43 6f 75 6e 74 65  ;.    OpenCounte
ddb0: 72 28 2d 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  r(-1);.    sqlit
ddc0: 65 33 5f 66 72 65 65 28 70 46 69 6c 65 2d 3e 70  e3_free(pFile->p
ddd0: 55 6e 75 73 65 64 29 3b 0a 20 20 20 20 6d 65 6d  Unused);.    mem
dde0: 73 65 74 28 70 46 69 6c 65 2c 20 30 2c 20 73 69  set(pFile, 0, si
ddf0: 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65 29 29 3b  zeof(unixFile));
de00: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
de10: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
de20: 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a  * Close a file..
de30: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
de40: 69 78 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f  ixClose(sqlite3_
de50: 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 69 6e 74  file *id){.  int
de60: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
de70: 0a 20 20 69 66 28 20 69 64 20 29 7b 0a 20 20 20  .  if( id ){.   
de80: 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
de90: 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 69   = (unixFile *)i
dea0: 64 3b 0a 20 20 20 20 75 6e 69 78 55 6e 6c 6f 63  d;.    unixUnloc
deb0: 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a  k(id, NO_LOCK);.
dec0: 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74      unixEnterMut
ded0: 65 78 28 29 3b 0a 20 20 20 20 69 66 28 20 70 46  ex();.    if( pF
dee0: 69 6c 65 2d 3e 70 4f 70 65 6e 20 26 26 20 70 46  ile->pOpen && pF
def0: 69 6c 65 2d 3e 70 4f 70 65 6e 2d 3e 6e 4c 6f 63  ile->pOpen->nLoc
df00: 6b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  k ){.      /* If
df10: 20 74 68 65 72 65 20 61 72 65 20 6f 75 74 73 74   there are outst
df20: 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 2c 20 64 6f  anding locks, do
df30: 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 63 6c   not actually cl
df40: 6f 73 65 20 74 68 65 20 66 69 6c 65 20 6a 75 73  ose the file jus
df50: 74 0a 20 20 20 20 20 20 2a 2a 20 79 65 74 20 62  t.      ** yet b
df60: 65 63 61 75 73 65 20 74 68 61 74 20 77 6f 75 6c  ecause that woul
df70: 64 20 63 6c 65 61 72 20 74 68 6f 73 65 20 6c 6f  d clear those lo
df80: 63 6b 73 2e 20 20 49 6e 73 74 65 61 64 2c 20 61  cks.  Instead, a
df90: 64 64 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20  dd the file.    
dfa0: 20 20 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20    ** descriptor 
dfb0: 74 6f 20 70 4f 70 65 6e 2d 3e 70 55 6e 75 73 65  to pOpen->pUnuse
dfc0: 64 20 6c 69 73 74 2e 20 20 49 74 20 77 69 6c 6c  d list.  It will
dfd0: 20 62 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c   be automaticall
dfe0: 79 20 63 6c 6f 73 65 64 20 0a 20 20 20 20 20 20  y closed .      
dff0: 2a 2a 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74  ** when the last
e000: 20 6c 6f 63 6b 20 69 73 20 63 6c 65 61 72 65 64   lock is cleared
e010: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
e020: 20 73 65 74 50 65 6e 64 69 6e 67 46 64 28 70 46   setPendingFd(pF
e030: 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ile);.    }.    
e040: 72 65 6c 65 61 73 65 4c 6f 63 6b 49 6e 66 6f 28  releaseLockInfo(
e050: 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 29 3b 0a 20  pFile->pLock);. 
e060: 20 20 20 72 65 6c 65 61 73 65 4f 70 65 6e 43 6e     releaseOpenCn
e070: 74 28 70 46 69 6c 65 2d 3e 70 4f 70 65 6e 29 3b  t(pFile->pOpen);
e080: 0a 20 20 20 20 72 63 20 3d 20 63 6c 6f 73 65 55  .    rc = closeU
e090: 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 20 20 20  nixFile(id);.   
e0a0: 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
e0b0: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
e0c0: 72 63 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  rc;.}../********
e0d0: 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68  ****** End of th
e0e0: 65 20 70 6f 73 69 78 20 61 64 76 69 73 6f 72 79  e posix advisory
e0f0: 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61   lock implementa
e100: 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  tion ***********
e110: 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
e120: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e160: 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  *****/../*******
e170: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e180: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e190: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e1a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e1b0: 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
e1c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e1d0: 2a 2a 2a 2a 2a 2a 20 4e 6f 2d 6f 70 20 4c 6f 63  ****** No-op Loc
e1e0: 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  king ***********
e1f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e200: 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4f 66  *******.**.** Of
e210: 20 74 68 65 20 76 61 72 69 6f 75 73 20 6c 6f 63   the various loc
e220: 6b 69 6e 67 20 69 6d 70 6c 65 6d 65 6e 74 61 74  king implementat
e230: 69 6f 6e 73 20 61 76 61 69 6c 61 62 6c 65 2c 20  ions available, 
e240: 74 68 69 73 20 69 73 20 62 79 20 66 61 72 20 74  this is by far t
e250: 68 65 0a 2a 2a 20 73 69 6d 70 6c 65 73 74 3a 20  he.** simplest: 
e260: 20 6c 6f 63 6b 69 6e 67 20 69 73 20 69 67 6e 6f   locking is igno
e270: 72 65 64 2e 20 20 4e 6f 20 61 74 74 65 6d 70 74  red.  No attempt
e280: 20 69 73 20 6d 61 64 65 20 74 6f 20 6c 6f 63 6b   is made to lock
e290: 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
e2a0: 20 66 69 6c 65 20 66 6f 72 20 72 65 61 64 69 6e   file for readin
e2b0: 67 20 6f 72 20 77 72 69 74 69 6e 67 2e 0a 2a 2a  g or writing..**
e2c0: 0a 2a 2a 20 54 68 69 73 20 6c 6f 63 6b 69 6e 67  .** This locking
e2d0: 20 6d 6f 64 65 20 69 73 20 61 70 70 72 6f 70 72   mode is appropr
e2e0: 69 61 74 65 20 66 6f 72 20 75 73 65 20 6f 6e 20  iate for use on 
e2f0: 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61  read-only databa
e300: 73 65 73 0a 2a 2a 20 28 65 78 3a 20 64 61 74 61  ses.** (ex: data
e310: 62 61 73 65 73 20 74 68 61 74 20 61 72 65 20 62  bases that are b
e320: 75 72 6e 65 64 20 69 6e 74 6f 20 43 44 2d 52 4f  urned into CD-RO
e330: 4d 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2e 29  M, for example.)
e340: 20 20 49 74 20 63 61 6e 0a 2a 2a 20 61 6c 73 6f    It can.** also
e350: 20 62 65 20 75 73 65 64 20 69 66 20 74 68 65 20   be used if the 
e360: 61 70 70 6c 69 63 61 74 69 6f 6e 20 65 6d 70 6c  application empl
e370: 6f 79 73 20 73 6f 6d 65 20 65 78 74 65 72 6e 61  oys some externa
e380: 6c 20 6d 65 63 68 61 6e 69 73 6d 20 74 6f 0a 2a  l mechanism to.*
e390: 2a 20 70 72 65 76 65 6e 74 20 73 69 6d 75 6c 74  * prevent simult
e3a0: 61 6e 65 6f 75 73 20 61 63 63 65 73 73 20 6f 66  aneous access of
e3b0: 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61   the same databa
e3c0: 73 65 20 62 79 20 74 77 6f 20 6f 72 20 6d 6f 72  se by two or mor
e3d0: 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f  e.** database co
e3e0: 6e 6e 65 63 74 69 6f 6e 73 2e 20 20 42 75 74 20  nnections.  But 
e3f0: 74 68 65 72 65 20 69 73 20 61 20 73 65 72 69 6f  there is a serio
e400: 75 73 20 72 69 73 6b 20 6f 66 20 64 61 74 61 62  us risk of datab
e410: 61 73 65 0a 2a 2a 20 63 6f 72 72 75 70 74 69 6f  ase.** corruptio
e420: 6e 20 69 66 20 74 68 69 73 20 6c 6f 63 6b 69 6e  n if this lockin
e430: 67 20 6d 6f 64 65 20 69 73 20 75 73 65 64 20 69  g mode is used i
e440: 6e 20 73 69 74 75 61 74 69 6f 6e 73 20 77 68 65  n situations whe
e450: 72 65 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 64  re multiple.** d
e460: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
e470: 6f 6e 73 20 61 72 65 20 61 63 63 65 73 73 69 6e  ons are accessin
e480: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
e490: 61 73 65 20 66 69 6c 65 20 61 74 20 74 68 65 20  ase file at the 
e4a0: 73 61 6d 65 0a 2a 2a 20 74 69 6d 65 20 61 6e 64  same.** time and
e4b0: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20   one or more of 
e4c0: 74 68 6f 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  those connection
e4d0: 73 20 61 72 65 20 77 72 69 74 69 6e 67 2e 0a 2a  s are writing..*
e4e0: 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f  /..static int no
e4f0: 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65  lockCheckReserve
e500: 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  dLock(sqlite3_fi
e510: 6c 65 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74  le *NotUsed, int
e520: 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 55 4e   *pResOut){.  UN
e530: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
e540: 6f 74 55 73 65 64 29 3b 0a 20 20 2a 70 52 65 73  otUsed);.  *pRes
e550: 4f 75 74 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  Out = 0;.  retur
e560: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 73  n SQLITE_OK;.}.s
e570: 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b  tatic int nolock
e580: 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
e590: 65 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20  e *NotUsed, int 
e5a0: 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20 55 4e 55  NotUsed2){.  UNU
e5b0: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 32 28 4e  SED_PARAMETER2(N
e5c0: 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73 65 64 32  otUsed, NotUsed2
e5d0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
e5e0: 54 45 5f 4f 4b 3b 0a 7d 0a 73 74 61 74 69 63 20  TE_OK;.}.static 
e5f0: 69 6e 74 20 6e 6f 6c 6f 63 6b 55 6e 6c 6f 63 6b  int nolockUnlock
e600: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e  (sqlite3_file *N
e610: 6f 74 55 73 65 64 2c 20 69 6e 74 20 4e 6f 74 55  otUsed, int NotU
e620: 73 65 64 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f  sed2){.  UNUSED_
e630: 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73  PARAMETER2(NotUs
e640: 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20  ed, NotUsed2);. 
e650: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
e660: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  K;.}../*.** Clos
e670: 65 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73  e the file..*/.s
e680: 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b  tatic int nolock
e690: 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69  Close(sqlite3_fi
e6a0: 6c 65 20 2a 69 64 29 20 7b 0a 20 20 72 65 74 75  le *id) {.  retu
e6b0: 72 6e 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65  rn closeUnixFile
e6c0: 28 69 64 29 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a  (id);.}../******
e6d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e  ************* En
e6e0: 64 20 6f 66 20 74 68 65 20 6e 6f 2d 6f 70 20 6c  d of the no-op l
e6f0: 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ock implementati
e700: 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  on *************
e710: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
e720: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e730: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e740: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e750: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e760: 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a  *******/../*****
e770: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e780: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e790: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e7a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e7b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
e7c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e7d0: 2a 2a 2a 20 42 65 67 69 6e 20 64 6f 74 2d 66 69  *** Begin dot-fi
e7e0: 6c 65 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a  le Locking *****
e7f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e800: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20  *********.**.** 
e810: 54 68 65 20 64 6f 74 66 69 6c 65 20 6c 6f 63 6b  The dotfile lock
e820: 69 6e 67 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ing implementati
e830: 6f 6e 20 75 73 65 73 20 74 68 65 20 65 78 69 73  on uses the exis
e840: 74 61 6e 63 65 20 6f 66 20 73 65 70 61 72 61 74  tance of separat
e850: 65 20 6c 6f 63 6b 0a 2a 2a 20 66 69 6c 65 73 20  e lock.** files 
e860: 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f 6e 74  in order to cont
e870: 72 6f 6c 20 61 63 63 65 73 73 20 74 6f 20 74 68  rol access to th
e880: 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 69  e database.  Thi
e890: 73 20 77 6f 72 6b 73 20 6f 6e 20 6a 75 73 74 0a  s works on just.
e8a0: 2a 2a 20 61 62 6f 75 74 20 65 76 65 72 79 20 66  ** about every f
e8b0: 69 6c 65 73 79 73 74 65 6d 20 69 6d 61 67 69 6e  ilesystem imagin
e8c0: 61 62 6c 65 2e 20 20 42 75 74 20 74 68 65 72 65  able.  But there
e8d0: 20 61 72 65 20 73 65 72 69 6f 75 73 20 64 6f 77   are serious dow
e8e0: 6e 73 69 64 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  nsides:.**.**   
e8f0: 20 28 31 29 20 20 54 68 65 72 65 20 69 73 20 7a   (1)  There is z
e900: 65 72 6f 20 63 6f 6e 63 75 72 72 65 6e 63 79 2e  ero concurrency.
e910: 20 20 41 20 73 69 6e 67 6c 65 20 72 65 61 64 65    A single reade
e920: 72 20 62 6c 6f 63 6b 73 20 61 6c 6c 20 6f 74 68  r blocks all oth
e930: 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 63 6f  er.**         co
e940: 6e 6e 65 63 74 69 6f 6e 73 20 66 72 6f 6d 20 72  nnections from r
e950: 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e  eading or writin
e960: 67 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  g the database..
e970: 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20 41 6e  **.**    (2)  An
e980: 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 63 72 61   application cra
e990: 73 68 20 6f 72 20 70 6f 77 65 72 20 6c 6f 73 73  sh or power loss
e9a0: 20 63 61 6e 20 6c 65 61 76 65 20 73 74 61 6c 65   can leave stale
e9b0: 20 6c 6f 63 6b 20 66 69 6c 65 73 0a 2a 2a 20 20   lock files.**  
e9c0: 20 20 20 20 20 20 20 73 69 74 74 69 6e 67 20 61         sitting a
e9d0: 72 6f 75 6e 64 20 74 68 61 74 20 6e 65 65 64 20  round that need 
e9e0: 74 6f 20 62 65 20 63 6c 65 61 72 65 64 20 6d 61  to be cleared ma
e9f0: 6e 75 61 6c 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4e 65  nually..**.** Ne
ea00: 76 65 72 74 68 65 6c 65 73 73 2c 20 61 20 64 6f  vertheless, a do
ea10: 74 6c 6f 63 6b 20 69 73 20 61 6e 20 61 70 70 72  tlock is an appr
ea20: 6f 70 72 69 61 74 65 20 6c 6f 63 6b 69 6e 67 20  opriate locking 
ea30: 6d 6f 64 65 20 66 6f 72 20 75 73 65 20 69 66 20  mode for use if 
ea40: 6e 6f 0a 2a 2a 20 6f 74 68 65 72 20 6c 6f 63 6b  no.** other lock
ea50: 69 6e 67 20 73 74 72 61 74 65 67 79 20 69 73 20  ing strategy is 
ea60: 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  available..**.**
ea70: 20 44 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67   Dotfile locking
ea80: 20 77 6f 72 6b 73 20 62 79 20 63 72 65 61 74 69   works by creati
ea90: 6e 67 20 61 20 66 69 6c 65 20 69 6e 20 74 68 65  ng a file in the
eaa0: 20 73 61 6d 65 20 64 69 72 65 63 74 6f 72 79 20   same directory 
eab0: 61 73 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  as the.** databa
eac0: 73 65 20 61 6e 64 20 77 69 74 68 20 74 68 65 20  se and with the 
ead0: 73 61 6d 65 20 6e 61 6d 65 20 62 75 74 20 77 69  same name but wi
eae0: 74 68 20 61 20 22 2e 6c 6f 63 6b 22 20 65 78 74  th a ".lock" ext
eaf0: 65 6e 73 69 6f 6e 20 61 64 64 65 64 2e 0a 2a 2a  ension added..**
eb00: 20 54 68 65 20 65 78 69 73 74 61 6e 63 65 20 6f   The existance o
eb10: 66 20 61 20 6c 6f 63 6b 20 66 69 6c 65 20 69 6d  f a lock file im
eb20: 70 6c 69 65 73 20 61 6e 20 45 58 43 4c 55 53 49  plies an EXCLUSI
eb30: 56 45 20 6c 6f 63 6b 2e 20 20 41 6c 6c 20 6f 74  VE lock.  All ot
eb40: 68 65 72 20 6c 6f 63 6b 0a 2a 2a 20 74 79 70 65  her lock.** type
eb50: 73 20 28 53 48 41 52 45 44 2c 20 52 45 53 45 52  s (SHARED, RESER
eb60: 56 45 44 2c 20 50 45 4e 44 49 4e 47 29 20 61 72  VED, PENDING) ar
eb70: 65 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 45 58  e mapped into EX
eb80: 43 4c 55 53 49 56 45 2e 0a 2a 2f 0a 0a 2f 2a 0a  CLUSIVE..*/../*.
eb90: 2a 2a 20 54 68 65 20 66 69 6c 65 20 73 75 66 66  ** The file suff
eba0: 69 78 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  ix added to the 
ebb0: 64 61 74 61 20 62 61 73 65 20 66 69 6c 65 6e 61  data base filena
ebc0: 6d 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63  me in order to c
ebd0: 72 65 61 74 65 20 74 68 65 0a 2a 2a 20 6c 6f 63  reate the.** loc
ebe0: 6b 20 66 69 6c 65 2e 0a 2a 2f 0a 23 64 65 66 69  k file..*/.#defi
ebf0: 6e 65 20 44 4f 54 4c 4f 43 4b 5f 53 55 46 46 49  ne DOTLOCK_SUFFI
ec00: 58 20 22 2e 6c 6f 63 6b 22 0a 0a 2f 2a 0a 2a 2a  X ".lock"../*.**
ec10: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68   This routine ch
ec20: 65 63 6b 73 20 69 66 20 74 68 65 72 65 20 69 73  ecks if there is
ec30: 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
ec40: 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65   held on the spe
ec50: 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62  cified.** file b
ec60: 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74  y this or any ot
ec70: 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20  her process. If 
ec80: 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68  such a lock is h
ec90: 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75  eld, set *pResOu
eca0: 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65  t.** to a non-ze
ecb0: 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69  ro value otherwi
ecc0: 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73  se *pResOut is s
ecd0: 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65  et to zero.  The
ece0: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a   return value.**
ecf0: 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54   is set to SQLIT
ed00: 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49  E_OK unless an I
ed10: 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  /O error occurs 
ed20: 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63  during lock chec
ed30: 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 64  king..**.** In d
ed40: 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2c 20  otfile locking, 
ed50: 65 69 74 68 65 72 20 61 20 6c 6f 63 6b 20 65 78  either a lock ex
ed60: 69 73 74 73 20 6f 72 20 69 74 20 64 6f 65 73 20  ists or it does 
ed70: 6e 6f 74 2e 20 20 53 6f 20 69 6e 20 74 68 69 73  not.  So in this
ed80: 0a 2a 2a 20 76 61 72 69 61 74 69 6f 6e 20 6f 66  .** variation of
ed90: 20 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f   CheckReservedLo
eda0: 63 6b 28 29 2c 20 2a 70 52 65 73 4f 75 74 20 69  ck(), *pResOut i
edb0: 73 20 73 65 74 20 74 6f 20 74 72 75 65 20 69 66  s set to true if
edc0: 20 61 6e 79 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20   any lock.** is 
edd0: 68 65 6c 64 20 6f 6e 20 74 68 65 20 66 69 6c 65  held on the file
ede0: 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20 74 68   and false if th
edf0: 65 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b  e file is unlock
ee00: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
ee10: 74 20 64 6f 74 6c 6f 63 6b 43 68 65 63 6b 52 65  t dotlockCheckRe
ee20: 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74  servedLock(sqlit
ee30: 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
ee40: 20 2a 70 52 65 73 4f 75 74 29 20 7b 0a 20 20 69   *pResOut) {.  i
ee50: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
ee60: 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65  K;.  int reserve
ee70: 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c  d = 0;.  unixFil
ee80: 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
ee90: 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53 69 6d  File*)id;..  Sim
eea0: 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65  ulateIOError( re
eeb0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
eec0: 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c  R_CHECKRESERVEDL
eed0: 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73  OCK; );.  .  ass
eee0: 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 0a 20  ert( pFile );.. 
eef0: 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20 74   /* Check if a t
ef00: 68 72 65 61 64 20 69 6e 20 74 68 69 73 20 70 72  hread in this pr
ef10: 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63 68  ocess holds such
ef20: 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28   a lock */.  if(
ef30: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
ef40: 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  >SHARED_LOCK ){.
ef50: 20 20 20 20 2f 2a 20 45 69 74 68 65 72 20 74 68      /* Either th
ef60: 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 72  is connection or
ef70: 20 73 6f 6d 65 20 6f 74 68 65 72 20 63 6f 6e 6e   some other conn
ef80: 65 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 73 61  ection in the sa
ef90: 6d 65 20 70 72 6f 63 65 73 73 0a 20 20 20 20 2a  me process.    *
efa0: 2a 20 68 6f 6c 64 73 20 61 20 6c 6f 63 6b 20 6f  * holds a lock o
efb0: 6e 20 74 68 65 20 66 69 6c 65 2e 20 20 4e 6f 20  n the file.  No 
efc0: 6e 65 65 64 20 74 6f 20 63 68 65 63 6b 20 66 75  need to check fu
efd0: 72 74 68 65 72 2e 20 2a 2f 0a 20 20 20 20 72 65  rther. */.    re
efe0: 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d 65  served = 1;.  }e
eff0: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  lse{.    /* The 
f000: 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 69 66 20  lock is held if 
f010: 61 6e 64 20 6f 6e 6c 79 20 69 66 20 74 68 65 20  and only if the 
f020: 6c 6f 63 6b 66 69 6c 65 20 65 78 69 73 74 73 20  lockfile exists 
f030: 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  */.    const cha
f040: 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28  r *zLockFile = (
f050: 63 6f 6e 73 74 20 63 68 61 72 2a 29 70 46 69 6c  const char*)pFil
f060: 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
f070: 74 3b 0a 20 20 20 20 72 65 73 65 72 76 65 64 20  t;.    reserved 
f080: 3d 20 61 63 63 65 73 73 28 7a 4c 6f 63 6b 46 69  = access(zLockFi
f090: 6c 65 2c 20 30 29 3d 3d 30 3b 0a 20 20 7d 0a 20  le, 0)==0;.  }. 
f0a0: 20 4f 53 54 52 41 43 45 34 28 22 54 45 53 54 20   OSTRACE4("TEST 
f0b0: 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64  WR-LOCK %d %d %d
f0c0: 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72  \n", pFile->h, r
f0d0: 63 2c 20 72 65 73 65 72 76 65 64 29 3b 0a 20 20  c, reserved);.  
f0e0: 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72  *pResOut = reser
f0f0: 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ved;.  return rc
f100: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20  ;.}../*.** Lock 
f110: 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74 68  the file with th
f120: 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64  e lock specified
f130: 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 6c 6f   by parameter lo
f140: 63 6b 74 79 70 65 20 2d 20 6f 6e 65 0a 2a 2a 20  cktype - one.** 
f150: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
f160: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20  :.**.**     (1) 
f170: 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20  SHARED_LOCK.**  
f180: 20 20 20 28 32 29 20 52 45 53 45 52 56 45 44 5f     (2) RESERVED_
f190: 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20  LOCK.**     (3) 
f1a0: 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20  PENDING_LOCK.** 
f1b0: 20 20 20 20 28 34 29 20 45 58 43 4c 55 53 49 56      (4) EXCLUSIV
f1c0: 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d  E_LOCK.**.** Som
f1d0: 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75  etimes when requ
f1e0: 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20  esting one lock 
f1f0: 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61  state, additiona
f200: 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a  l lock states.**
f210: 20 61 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e   are inserted in
f220: 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c   between.  The l
f230: 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69  ocking might fai
f240: 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  l on one of the 
f250: 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74  later.** transit
f260: 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65  ions leaving the
f270: 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66   lock state diff
f280: 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20  erent from what 
f290: 69 74 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a  it started but.*
f2a0: 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66  * still short of
f2b0: 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20   its goal.  The 
f2c0: 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20  following chart 
f2d0: 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65  shows the allowe
f2e0: 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73  d.** transitions
f2f0: 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65   and the inserte
f300: 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73  d intermediate s
f310: 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  tates:.**.**    
f320: 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52  UNLOCKED -> SHAR
f330: 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20  ED.**    SHARED 
f340: 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20  -> RESERVED.**  
f350: 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e    SHARED -> (PEN
f360: 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49  DING) -> EXCLUSI
f370: 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45  VE.**    RESERVE
f380: 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d  D -> (PENDING) -
f390: 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  > EXCLUSIVE.**  
f3a0: 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43    PENDING -> EXC
f3b0: 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69  LUSIVE.**.** Thi
f3c0: 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f  s routine will o
f3d0: 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c  nly increase a l
f3e0: 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71  ock.  Use the sq
f3f0: 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a  lite3OsUnlock().
f400: 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f  ** routine to lo
f410: 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65  wer a locking le
f420: 76 65 6c 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 20  vel..**.** With 
f430: 64 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2c  dotfile locking,
f440: 20 77 65 20 72 65 61 6c 6c 79 20 6f 6e 6c 79 20   we really only 
f450: 73 75 70 70 6f 72 74 20 73 74 61 74 65 20 28 34  support state (4
f460: 29 3a 20 45 58 43 4c 55 53 49 56 45 2e 0a 2a 2a  ): EXCLUSIVE..**
f470: 20 42 75 74 20 77 65 20 74 72 61 63 6b 20 74 68   But we track th
f480: 65 20 6f 74 68 65 72 20 6c 6f 63 6b 69 6e 67 20  e other locking 
f490: 6c 65 76 65 6c 73 20 69 6e 74 65 72 6e 61 6c 6c  levels internall
f4a0: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
f4b0: 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c   dotlockLock(sql
f4c0: 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
f4d0: 6e 74 20 6c 6f 63 6b 74 79 70 65 29 20 7b 0a 20  nt locktype) {. 
f4e0: 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
f4f0: 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
f500: 3b 0a 20 20 69 6e 74 20 66 64 3b 0a 20 20 63 68  ;.  int fd;.  ch
f510: 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20  ar *zLockFile = 
f520: 28 63 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e 6c  (char *)pFile->l
f530: 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20  ockingContext;. 
f540: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
f550: 5f 4f 4b 3b 0a 0a 0a 20 20 2f 2a 20 49 66 20 77  _OK;...  /* If w
f560: 65 20 68 61 76 65 20 61 6e 79 20 6c 6f 63 6b 2c  e have any lock,
f570: 20 74 68 65 6e 20 74 68 65 20 6c 6f 63 6b 20 66   then the lock f
f580: 69 6c 65 20 61 6c 72 65 61 64 79 20 65 78 69 73  ile already exis
f590: 74 73 2e 20 20 41 6c 6c 20 77 65 20 68 61 76 65  ts.  All we have
f5a0: 0a 20 20 2a 2a 20 74 6f 20 64 6f 20 69 73 20 61  .  ** to do is a
f5b0: 64 6a 75 73 74 20 6f 75 72 20 69 6e 74 65 72 6e  djust our intern
f5c0: 61 6c 20 72 65 63 6f 72 64 20 6f 66 20 74 68 65  al record of the
f5d0: 20 6c 6f 63 6b 20 6c 65 76 65 6c 2e 0a 20 20 2a   lock level..  *
f5e0: 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c  /.  if( pFile->l
f5f0: 6f 63 6b 74 79 70 65 20 3e 20 4e 4f 5f 4c 4f 43  ocktype > NO_LOC
f600: 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  K ){.    pFile->
f610: 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74  locktype = lockt
f620: 79 70 65 3b 0a 23 69 66 20 21 4f 53 5f 56 58 57  ype;.#if !OS_VXW
f630: 4f 52 4b 53 0a 20 20 20 20 2f 2a 20 41 6c 77 61  ORKS.    /* Alwa
f640: 79 73 20 75 70 64 61 74 65 20 74 68 65 20 74 69  ys update the ti
f650: 6d 65 73 74 61 6d 70 20 6f 6e 20 74 68 65 20 6f  mestamp on the o
f660: 6c 64 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 75  ld file */.    u
f670: 74 69 6d 65 73 28 7a 4c 6f 63 6b 46 69 6c 65 2c  times(zLockFile,
f680: 20 4e 55 4c 4c 29 3b 0a 23 65 6e 64 69 66 0a 20   NULL);.#endif. 
f690: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
f6a0: 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  _OK;.  }.  .  /*
f6b0: 20 67 72 61 62 20 61 6e 20 65 78 63 6c 75 73 69   grab an exclusi
f6c0: 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 66 64 20  ve lock */.  fd 
f6d0: 3d 20 6f 70 65 6e 28 7a 4c 6f 63 6b 46 69 6c 65  = open(zLockFile
f6e0: 2c 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f 43 52 45 41  ,O_RDONLY|O_CREA
f6f0: 54 7c 4f 5f 45 58 43 4c 2c 30 36 30 30 29 3b 0a  T|O_EXCL,0600);.
f700: 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20    if( fd<0 ){.  
f710: 20 20 2f 2a 20 66 61 69 6c 65 64 20 74 6f 20 6f    /* failed to o
f720: 70 65 6e 2f 63 72 65 61 74 65 20 74 68 65 20 66  pen/create the f
f730: 69 6c 65 2c 20 73 6f 6d 65 6f 6e 65 20 65 6c 73  ile, someone els
f740: 65 20 6d 61 79 20 68 61 76 65 20 73 74 6f 6c 65  e may have stole
f750: 6e 20 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20  n the lock */.  
f760: 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65    int tErrno = e
f770: 72 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20 45 45  rrno;.    if( EE
f780: 58 49 53 54 20 3d 3d 20 74 45 72 72 6e 6f 20 29  XIST == tErrno )
f790: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
f7a0: 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 20  ITE_BUSY;.    } 
f7b0: 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 72 63 20  else {.      rc 
f7c0: 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  = sqliteErrorFro
f7d0: 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72  mPosixError(tErr
f7e0: 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  no, SQLITE_IOERR
f7f0: 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66  _LOCK);.      if
f800: 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  ( IS_LOCK_ERROR(
f810: 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  rc) ){.        p
f820: 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
f830: 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20  = tErrno;.      
f840: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  }.    }.    retu
f850: 72 6e 20 72 63 3b 0a 20 20 7d 20 0a 20 20 69 66  rn rc;.  } .  if
f860: 28 20 63 6c 6f 73 65 28 66 64 29 20 29 7b 0a 20  ( close(fd) ){. 
f870: 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
f880: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
f890: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
f8a0: 52 52 5f 43 4c 4f 53 45 3b 0a 20 20 7d 0a 20 20  RR_CLOSE;.  }.  
f8b0: 0a 20 20 2f 2a 20 67 6f 74 20 69 74 2c 20 73 65  .  /* got it, se
f8c0: 74 20 74 68 65 20 74 79 70 65 20 61 6e 64 20 72  t the type and r
f8d0: 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20 70 46  eturn ok */.  pF
f8e0: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20  ile->locktype = 
f8f0: 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 72 65 74 75  locktype;.  retu
f900: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
f910: 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e  Lower the lockin
f920: 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20  g level on file 
f930: 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65  descriptor pFile
f940: 20 74 6f 20 6c 6f 63 6b 74 79 70 65 2e 20 20 6c   to locktype.  l
f950: 6f 63 6b 74 79 70 65 0a 2a 2a 20 6d 75 73 74 20  ocktype.** must 
f960: 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43  be either NO_LOC
f970: 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b  K or SHARED_LOCK
f980: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c  ..**.** If the l
f990: 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20  ocking level of 
f9a0: 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
f9b0: 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61  tor is already a
f9c0: 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68  t or below.** th
f9d0: 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
f9e0: 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20  ing level, this 
f9f0: 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
fa00: 6f 70 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74  op..**.** When t
fa10: 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
fa20: 20 72 65 61 63 68 65 73 20 4e 4f 5f 4c 4f 43 4b   reaches NO_LOCK
fa30: 2c 20 64 65 6c 65 74 65 20 74 68 65 20 6c 6f 63  , delete the loc
fa40: 6b 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  k file..*/.stati
fa50: 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 55 6e 6c  c int dotlockUnl
fa60: 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
fa70: 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79   *id, int lockty
fa80: 70 65 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65  pe) {.  unixFile
fa90: 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
faa0: 69 6c 65 2a 29 69 64 3b 0a 20 20 63 68 61 72 20  ile*)id;.  char 
fab0: 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63 68  *zLockFile = (ch
fac0: 61 72 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ar *)pFile->lock
fad0: 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 0a 20 20 61  ingContext;..  a
fae0: 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
faf0: 20 20 4f 53 54 52 41 43 45 35 28 22 55 4e 4c 4f    OSTRACE5("UNLO
fb00: 43 4b 20 20 25 64 20 25 64 20 77 61 73 20 25 64  CK  %d %d was %d
fb10: 20 70 69 64 3d 25 64 5c 6e 22 2c 20 70 46 69 6c   pid=%d\n", pFil
fb20: 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70 65 2c 0a  e->h, locktype,.
fb30: 09 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  .   pFile->lockt
fb40: 79 70 65 2c 20 67 65 74 70 69 64 28 29 29 3b 0a  ype, getpid());.
fb50: 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79    assert( lockty
fb60: 70 65 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  pe<=SHARED_LOCK 
fb70: 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70  );.  .  /* no-op
fb80: 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a   if possible */.
fb90: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63    if( pFile->loc
fba0: 6b 74 79 70 65 3d 3d 6c 6f 63 6b 74 79 70 65 20  ktype==locktype 
fbb0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
fbc0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
fbd0: 2f 2a 20 54 6f 20 64 6f 77 6e 67 72 61 64 65 20  /* To downgrade 
fbe0: 74 6f 20 73 68 61 72 65 64 2c 20 73 69 6d 70 6c  to shared, simpl
fbf0: 79 20 75 70 64 61 74 65 20 6f 75 72 20 69 6e 74  y update our int
fc00: 65 72 6e 61 6c 20 6e 6f 74 69 6f 6e 20 6f 66 20  ernal notion of 
fc10: 74 68 65 0a 20 20 2a 2a 20 6c 6f 63 6b 20 73 74  the.  ** lock st
fc20: 61 74 65 2e 20 20 4e 6f 20 6e 65 65 64 20 74 6f  ate.  No need to
fc30: 20 6d 65 73 73 20 77 69 74 68 20 74 68 65 20 66   mess with the f
fc40: 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 2a  ile on disk..  *
fc50: 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65  /.  if( locktype
fc60: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b  ==SHARED_LOCK ){
fc70: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  .    pFile->lock
fc80: 74 79 70 65 20 3d 20 53 48 41 52 45 44 5f 4c 4f  type = SHARED_LO
fc90: 43 4b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  CK;.    return S
fca0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
fcb0: 0a 20 20 2f 2a 20 54 6f 20 66 75 6c 6c 79 20 75  .  /* To fully u
fcc0: 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61  nlock the databa
fcd0: 73 65 2c 20 64 65 6c 65 74 65 20 74 68 65 20 6c  se, delete the l
fce0: 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a 20 20 61 73  ock file */.  as
fcf0: 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 3d 3d  sert( locktype==
fd00: 4e 4f 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28  NO_LOCK );.  if(
fd10: 20 75 6e 6c 69 6e 6b 28 7a 4c 6f 63 6b 46 69 6c   unlink(zLockFil
fd20: 65 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  e) ){.    int rc
fd30: 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 74 45   = 0;.    int tE
fd40: 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
fd50: 20 20 69 66 28 20 45 4e 4f 45 4e 54 20 21 3d 20    if( ENOENT != 
fd60: 74 45 72 72 6e 6f 20 29 7b 0a 20 20 20 20 20 20  tErrno ){.      
fd70: 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72  rc = sqliteError
fd80: 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74  FromPosixError(t
fd90: 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f  Errno, SQLITE_IO
fda0: 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20  ERR_UNLOCK);.   
fdb0: 20 7d 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f   }.    if( IS_LO
fdc0: 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a  CK_ERROR(rc) ){.
fdd0: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
fde0: 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b  tErrno = tErrno;
fdf0: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
fe00: 6e 20 72 63 3b 20 0a 20 20 7d 0a 20 20 70 46 69  n rc; .  }.  pFi
fe10: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 4e  le->locktype = N
fe20: 4f 5f 4c 4f 43 4b 3b 0a 20 20 72 65 74 75 72 6e  O_LOCK;.  return
fe30: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
fe40: 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c  *.** Close a fil
fe50: 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68  e.  Make sure th
fe60: 65 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e 20  e lock has been 
fe70: 72 65 6c 65 61 73 65 64 20 62 65 66 6f 72 65 20  released before 
fe80: 63 6c 6f 73 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  closing..*/.stat
fe90: 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 43 6c  ic int dotlockCl
fea0: 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ose(sqlite3_file
feb0: 20 2a 69 64 29 20 7b 0a 20 20 69 6e 74 20 72 63   *id) {.  int rc
fec0: 3b 0a 20 20 69 66 28 20 69 64 20 29 7b 0a 20 20  ;.  if( id ){.  
fed0: 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
fee0: 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
fef0: 64 3b 0a 20 20 20 20 64 6f 74 6c 6f 63 6b 55 6e  d;.    dotlockUn
ff00: 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b  lock(id, NO_LOCK
ff10: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
ff20: 72 65 65 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69  ree(pFile->locki
ff30: 6e 67 43 6f 6e 74 65 78 74 29 3b 0a 20 20 7d 0a  ngContext);.  }.
ff40: 20 20 72 63 20 3d 20 63 6c 6f 73 65 55 6e 69 78    rc = closeUnix
ff50: 46 69 6c 65 28 69 64 29 3b 0a 20 20 72 65 74 75  File(id);.  retu
ff60: 72 6e 20 72 63 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a  rn rc;.}./******
ff70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64  ************ End
ff80: 20 6f 66 20 74 68 65 20 64 6f 74 2d 66 69 6c 65   of the dot-file
ff90: 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61   lock implementa
ffa0: 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  tion ***********
ffb0: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
ffc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ffd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ffe0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fff0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10000 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a  *******/../*****
10010 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10020 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10030 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10040 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10050 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
10060 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10070 2a 2a 2a 2a 20 42 65 67 69 6e 20 66 6c 6f 63 6b  **** Begin flock
10080 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a   Locking *******
10090 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
100a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20  *********.**.** 
100b0 55 73 65 20 74 68 65 20 66 6c 6f 63 6b 28 29 20  Use the flock() 
100c0 73 79 73 74 65 6d 20 63 61 6c 6c 20 74 6f 20 64  system call to d
100d0 6f 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2e 0a  o file locking..
100e0 2a 2a 0a 2a 2a 20 66 6c 6f 63 6b 28 29 20 6c 6f  **.** flock() lo
100f0 63 6b 69 6e 67 20 69 73 20 6c 69 6b 65 20 64 6f  cking is like do
10100 74 2d 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69  t-file locking i
10110 6e 20 74 68 61 74 20 74 68 65 20 76 61 72 69 6f  n that the vario
10120 75 73 0a 2a 2a 20 66 69 6e 65 2d 67 72 61 69 6e  us.** fine-grain
10130 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 73 20   locking levels 
10140 73 75 70 70 6f 72 74 65 64 20 62 79 20 53 51 4c  supported by SQL
10150 69 74 65 20 61 72 65 20 63 6f 6c 6c 61 70 73 65  ite are collapse
10160 64 20 69 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e 67  d into.** a sing
10170 6c 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  le exclusive loc
10180 6b 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  k.  In other wor
10190 64 73 2c 20 53 48 41 52 45 44 2c 20 52 45 53 45  ds, SHARED, RESE
101a0 52 56 45 44 2c 20 61 6e 64 0a 2a 2a 20 50 45 4e  RVED, and.** PEN
101b0 44 49 4e 47 20 6c 6f 63 6b 73 20 61 72 65 20 74  DING locks are t
101c0 68 65 20 73 61 6d 65 20 74 68 69 6e 67 20 61 73  he same thing as
101d0 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
101e0 63 6b 2e 20 20 53 51 4c 69 74 65 0a 2a 2a 20 73  ck.  SQLite.** s
101f0 74 69 6c 6c 20 77 6f 72 6b 73 20 77 68 65 6e 20  till works when 
10200 79 6f 75 20 64 6f 20 74 68 69 73 2c 20 62 75 74  you do this, but
10210 20 63 6f 6e 63 75 72 72 65 6e 63 79 20 69 73 20   concurrency is 
10220 72 65 64 75 63 65 64 20 73 69 6e 63 65 0a 2a 2a  reduced since.**
10230 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 70   only a single p
10240 72 6f 63 65 73 73 20 63 61 6e 20 62 65 20 72 65  rocess can be re
10250 61 64 69 6e 67 20 74 68 65 20 64 61 74 61 62 61  ading the databa
10260 73 65 20 61 74 20 61 20 74 69 6d 65 2e 0a 2a 2a  se at a time..**
10270 0a 2a 2a 20 4f 6d 69 74 20 74 68 69 73 20 73 65  .** Omit this se
10280 63 74 69 6f 6e 20 69 66 20 53 51 4c 49 54 45 5f  ction if SQLITE_
10290 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
102a0 54 59 4c 45 20 69 73 20 74 75 72 6e 65 64 20 6f  TYLE is turned o
102b0 66 66 20 6f 72 20 69 66 0a 2a 2a 20 63 6f 6d 70  ff or if.** comp
102c0 69 6c 69 6e 67 20 66 6f 72 20 56 58 57 4f 52 4b  iling for VXWORK
102d0 53 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45  S..*/.#if SQLITE
102e0 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
102f0 53 54 59 4c 45 20 26 26 20 21 4f 53 5f 56 58 57  STYLE && !OS_VXW
10300 4f 52 4b 53 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ORKS../*.** This
10310 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20   routine checks 
10320 69 66 20 74 68 65 72 65 20 69 73 20 61 20 52 45  if there is a RE
10330 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64  SERVED lock held
10340 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65   on the specifie
10350 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69  d.** file by thi
10360 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70  s or any other p
10370 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68 20  rocess. If such 
10380 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20  a lock is held, 
10390 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20  set *pResOut.** 
103a0 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61  to a non-zero va
103b0 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70  lue otherwise *p
103c0 52 65 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f  ResOut is set to
103d0 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75   zero.  The retu
103e0 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73  rn value.** is s
103f0 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20  et to SQLITE_OK 
10400 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72  unless an I/O er
10410 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ror occurs durin
10420 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e  g lock checking.
10430 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
10440 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65  lockCheckReserve
10450 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  dLock(sqlite3_fi
10460 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65  le *id, int *pRe
10470 73 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72 63 20  sOut){.  int rc 
10480 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
10490 6e 74 20 72 65 73 65 72 76 65 64 20 3d 20 30 3b  nt reserved = 0;
104a0 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
104b0 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
104c0 69 64 3b 0a 20 20 0a 20 20 53 69 6d 75 6c 61 74  id;.  .  Simulat
104d0 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
104e0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48   SQLITE_IOERR_CH
104f0 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b  ECKRESERVEDLOCK;
10500 20 29 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28   );.  .  assert(
10510 20 70 46 69 6c 65 20 29 3b 0a 20 20 0a 20 20 2f   pFile );.  .  /
10520 2a 20 43 68 65 63 6b 20 69 66 20 61 20 74 68 72  * Check if a thr
10530 65 61 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63  ead in this proc
10540 65 73 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61  ess holds such a
10550 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70   lock */.  if( p
10560 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 53  File->locktype>S
10570 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  HARED_LOCK ){.  
10580 20 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a    reserved = 1;.
10590 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74 68 65    }.  .  /* Othe
105a0 72 77 69 73 65 20 73 65 65 20 69 66 20 73 6f 6d  rwise see if som
105b0 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  e other process 
105c0 68 6f 6c 64 73 20 69 74 2e 20 2a 2f 0a 20 20 69  holds it. */.  i
105d0 66 28 20 21 72 65 73 65 72 76 65 64 20 29 7b 0a  f( !reserved ){.
105e0 20 20 20 20 2f 2a 20 61 74 74 65 6d 70 74 20 74      /* attempt t
105f0 6f 20 67 65 74 20 74 68 65 20 6c 6f 63 6b 20 2a  o get the lock *
10600 2f 0a 20 20 20 20 69 6e 74 20 6c 72 63 20 3d 20  /.    int lrc = 
10610 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20  flock(pFile->h, 
10620 4c 4f 43 4b 5f 45 58 20 7c 20 4c 4f 43 4b 5f 4e  LOCK_EX | LOCK_N
10630 42 29 3b 0a 20 20 20 20 69 66 28 20 21 6c 72 63  B);.    if( !lrc
10640 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 67 6f 74   ){.      /* got
10650 20 74 68 65 20 6c 6f 63 6b 2c 20 75 6e 6c 6f 63   the lock, unloc
10660 6b 20 69 74 20 2a 2f 0a 20 20 20 20 20 20 6c 72  k it */.      lr
10670 63 20 3d 20 66 6c 6f 63 6b 28 70 46 69 6c 65 2d  c = flock(pFile-
10680 3e 68 2c 20 4c 4f 43 4b 5f 55 4e 29 3b 0a 20 20  >h, LOCK_UN);.  
10690 20 20 20 20 69 66 20 28 20 6c 72 63 20 29 20 7b      if ( lrc ) {
106a0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74 45 72  .        int tEr
106b0 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
106c0 20 20 20 20 20 2f 2a 20 75 6e 6c 6f 63 6b 20 66       /* unlock f
106d0 61 69 6c 65 64 20 77 69 74 68 20 61 6e 20 65 72  ailed with an er
106e0 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 6c  ror */.        l
106f0 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72  rc = sqliteError
10700 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74  FromPosixError(t
10710 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f  Errno, SQLITE_IO
10720 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 20 0a 20 20  ERR_UNLOCK); .  
10730 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43        if( IS_LOC
10740 4b 5f 45 52 52 4f 52 28 6c 72 63 29 20 29 7b 0a  K_ERROR(lrc) ){.
10750 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
10760 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72  >lastErrno = tEr
10770 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 72  rno;.          r
10780 63 20 3d 20 6c 72 63 3b 0a 20 20 20 20 20 20 20  c = lrc;.       
10790 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
107a0 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 69 6e   else {.      in
107b0 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  t tErrno = errno
107c0 3b 0a 20 20 20 20 20 20 72 65 73 65 72 76 65 64  ;.      reserved
107d0 20 3d 20 31 3b 0a 20 20 20 20 20 20 2f 2a 20 73   = 1;.      /* s
107e0 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 6d 69 67 68  omeone else migh
107f0 74 20 68 61 76 65 20 69 74 20 72 65 73 65 72 76  t have it reserv
10800 65 64 20 2a 2f 0a 20 20 20 20 20 20 6c 72 63 20  ed */.      lrc 
10810 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  = sqliteErrorFro
10820 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72  mPosixError(tErr
10830 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  no, SQLITE_IOERR
10840 5f 4c 4f 43 4b 29 3b 20 0a 20 20 20 20 20 20 69  _LOCK); .      i
10850 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
10860 28 6c 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20  (lrc) ){.       
10870 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
10880 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20  o = tErrno;.    
10890 20 20 20 20 72 63 20 3d 20 6c 72 63 3b 0a 20 20      rc = lrc;.  
108a0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
108b0 20 20 4f 53 54 52 41 43 45 34 28 22 54 45 53 54    OSTRACE4("TEST
108c0 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25   WR-LOCK %d %d %
108d0 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  d\n", pFile->h, 
108e0 72 63 2c 20 72 65 73 65 72 76 65 64 29 3b 0a 0a  rc, reserved);..
108f0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 49 47  #ifdef SQLITE_IG
10900 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f  NORE_FLOCK_LOCK_
10910 45 52 52 4f 52 53 0a 20 20 69 66 28 20 28 72 63  ERRORS.  if( (rc
10920 20 26 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29   & SQLITE_IOERR)
10930 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52   == SQLITE_IOERR
10940 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
10950 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 72 65 73 65  ITE_OK;.    rese
10960 72 76 65 64 3d 31 3b 0a 20 20 7d 0a 23 65 6e 64  rved=1;.  }.#end
10970 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e  if /* SQLITE_IGN
10980 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45  ORE_FLOCK_LOCK_E
10990 52 52 4f 52 53 20 2a 2f 0a 20 20 2a 70 52 65 73  RRORS */.  *pRes
109a0 4f 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a  Out = reserved;.
109b0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
109c0 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66  /*.** Lock the f
109d0 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63  ile with the loc
109e0 6b 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70  k specified by p
109f0 61 72 61 6d 65 74 65 72 20 6c 6f 63 6b 74 79 70  arameter locktyp
10a00 65 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68  e - one.** of th
10a10 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
10a20 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45  **     (1) SHARE
10a30 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32  D_LOCK.**     (2
10a40 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a  ) RESERVED_LOCK.
10a50 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49  **     (3) PENDI
10a60 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  NG_LOCK.**     (
10a70 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  4) EXCLUSIVE_LOC
10a80 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65  K.**.** Sometime
10a90 73 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e  s when requestin
10aa0 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65  g one lock state
10ab0 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63  , additional loc
10ac0 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20  k states.** are 
10ad0 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77  inserted in betw
10ae0 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e  een.  The lockin
10af0 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20  g might fail on 
10b00 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72  one of the later
10b10 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  .** transitions 
10b20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b  leaving the lock
10b30 20 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74   state different
10b40 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74   from what it st
10b50 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69  arted but.** sti
10b60 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20  ll short of its 
10b70 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  goal.  The follo
10b80 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73  wing chart shows
10b90 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20   the allowed.** 
10ba0 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20  transitions and 
10bb0 74 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74  the inserted int
10bc0 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73  ermediate states
10bd0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43  :.**.**    UNLOC
10be0 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a  KED -> SHARED.**
10bf0 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45      SHARED -> RE
10c00 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41  SERVED.**    SHA
10c10 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  RED -> (PENDING)
10c20 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
10c30 20 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20      RESERVED -> 
10c40 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43  (PENDING) -> EXC
10c50 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e  LUSIVE.**    PEN
10c60 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56  DING -> EXCLUSIV
10c70 45 0a 2a 2a 0a 2a 2a 20 66 6c 6f 63 6b 28 29 20  E.**.** flock() 
10c80 6f 6e 6c 79 20 72 65 61 6c 6c 79 20 73 75 70 70  only really supp
10c90 6f 72 74 20 45 58 43 4c 55 53 49 56 45 20 6c 6f  ort EXCLUSIVE lo
10ca0 63 6b 73 2e 20 20 57 65 20 74 72 61 63 6b 20 69  cks.  We track i
10cb0 6e 74 65 72 6d 65 64 69 61 74 65 0a 2a 2a 20 6c  ntermediate.** l
10cc0 6f 63 6b 20 73 74 61 74 65 73 20 69 6e 20 74 68  ock states in th
10cd0 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 73  e sqlite3_file s
10ce0 74 72 75 63 74 75 72 65 2c 20 62 75 74 20 61 6c  tructure, but al
10cf0 6c 20 6c 6f 63 6b 73 20 53 48 41 52 45 44 20 6f  l locks SHARED o
10d00 72 0a 2a 2a 20 61 62 6f 76 65 20 61 72 65 20 72  r.** above are r
10d10 65 61 6c 6c 79 20 45 58 43 4c 55 53 49 56 45 20  eally EXCLUSIVE 
10d20 6c 6f 63 6b 73 20 61 6e 64 20 65 78 63 6c 75 64  locks and exclud
10d30 65 20 61 6c 6c 20 6f 74 68 65 72 20 70 72 6f 63  e all other proc
10d40 65 73 73 65 73 20 66 72 6f 6d 0a 2a 2a 20 61 63  esses from.** ac
10d50 63 65 73 73 20 74 68 65 20 66 69 6c 65 2e 0a 2a  cess the file..*
10d60 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
10d70 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72  e will only incr
10d80 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73  ease a lock.  Us
10d90 65 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55  e the sqlite3OsU
10da0 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69  nlock().** routi
10db0 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f  ne to lower a lo
10dc0 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a  cking level..*/.
10dd0 73 74 61 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b  static int flock
10de0 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
10df0 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74  e *id, int lockt
10e00 79 70 65 29 20 7b 0a 20 20 69 6e 74 20 72 63 20  ype) {.  int rc 
10e10 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75  = SQLITE_OK;.  u
10e20 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
10e30 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
10e40 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
10e50 20 29 3b 0a 0a 20 20 2f 2a 20 69 66 20 77 65 20   );..  /* if we 
10e60 61 6c 72 65 61 64 79 20 68 61 76 65 20 61 20 6c  already have a l
10e70 6f 63 6b 2c 20 69 74 20 69 73 20 65 78 63 6c 75  ock, it is exclu
10e80 73 69 76 65 2e 20 20 0a 20 20 2a 2a 20 4a 75 73  sive.  .  ** Jus
10e90 74 20 61 64 6a 75 73 74 20 6c 65 76 65 6c 20 61  t adjust level a
10ea0 6e 64 20 70 75 6e 74 20 6f 6e 20 6f 75 74 74 61  nd punt on outta
10eb0 20 68 65 72 65 2e 20 2a 2f 0a 20 20 69 66 20 28   here. */.  if (
10ec0 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20  pFile->locktype 
10ed0 3e 20 4e 4f 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20  > NO_LOCK) {.   
10ee0 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
10ef0 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20   = locktype;.   
10f00 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
10f10 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 67  K;.  }.  .  /* g
10f20 72 61 62 20 61 6e 20 65 78 63 6c 75 73 69 76 65  rab an exclusive
10f30 20 6c 6f 63 6b 20 2a 2f 0a 20 20 0a 20 20 69 66   lock */.  .  if
10f40 20 28 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68   (flock(pFile->h
10f50 2c 20 4c 4f 43 4b 5f 45 58 20 7c 20 4c 4f 43 4b  , LOCK_EX | LOCK
10f60 5f 4e 42 29 29 20 7b 0a 20 20 20 20 69 6e 74 20  _NB)) {.    int 
10f70 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
10f80 20 20 20 20 2f 2a 20 64 69 64 6e 27 74 20 67 65      /* didn't ge
10f90 74 2c 20 6d 75 73 74 20 62 65 20 62 75 73 79 20  t, must be busy 
10fa0 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
10fb0 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78  teErrorFromPosix
10fc0 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51  Error(tErrno, SQ
10fd0 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29  LITE_IOERR_LOCK)
10fe0 3b 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43  ;.    if( IS_LOC
10ff0 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20  K_ERROR(rc) ){. 
11000 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
11010 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a  Errno = tErrno;.
11020 20 20 20 20 7d 0a 20 20 7d 20 65 6c 73 65 20 7b      }.  } else {
11030 0a 20 20 20 20 2f 2a 20 67 6f 74 20 69 74 2c 20  .    /* got it, 
11040 73 65 74 20 74 68 65 20 74 79 70 65 20 61 6e 64  set the type and
11050 20 72 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20   return ok */.  
11060 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70    pFile->locktyp
11070 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20  e = locktype;.  
11080 7d 0a 20 20 4f 53 54 52 41 43 45 34 28 22 4c 4f  }.  OSTRACE4("LO
11090 43 4b 20 20 20 20 25 64 20 25 73 20 25 73 5c 6e  CK    %d %s %s\n
110a0 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63  ", pFile->h, loc
110b0 6b 74 79 70 65 4e 61 6d 65 28 6c 6f 63 6b 74 79  ktypeName(lockty
110c0 70 65 29 2c 20 0a 20 20 20 20 20 20 20 20 20 20  pe), .          
110d0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f   rc==SQLITE_OK ?
110e0 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22   "ok" : "failed"
110f0 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
11100 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f  _IGNORE_FLOCK_LO
11110 43 4b 5f 45 52 52 4f 52 53 0a 20 20 69 66 28 20  CK_ERRORS.  if( 
11120 28 72 63 20 26 20 53 51 4c 49 54 45 5f 49 4f 45  (rc & SQLITE_IOE
11130 52 52 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f  RR) == SQLITE_IO
11140 45 52 52 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ERR ){.    rc = 
11150 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d  SQLITE_BUSY;.  }
11160 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
11170 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c  E_IGNORE_FLOCK_L
11180 4f 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20  OCK_ERRORS */.  
11190 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
111a0 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c  *.** Lower the l
111b0 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20  ocking level on 
111c0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
111d0 70 46 69 6c 65 20 74 6f 20 6c 6f 63 6b 74 79 70  pFile to locktyp
111e0 65 2e 20 20 6c 6f 63 6b 74 79 70 65 0a 2a 2a 20  e.  locktype.** 
111f0 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e  must be either N
11200 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44  O_LOCK or SHARED
11210 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  _LOCK..**.** If 
11220 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
11230 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65  l of the file de
11240 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65  scriptor is alre
11250 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a  ady at or below.
11260 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ** the requested
11270 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20   locking level, 
11280 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
11290 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  a no-op..*/.stat
112a0 69 63 20 69 6e 74 20 66 6c 6f 63 6b 55 6e 6c 6f  ic int flockUnlo
112b0 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
112c0 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70  *id, int locktyp
112d0 65 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  e) {.  unixFile 
112e0 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
112f0 6c 65 2a 29 69 64 3b 0a 20 20 0a 20 20 61 73 73  le*)id;.  .  ass
11300 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
11310 4f 53 54 52 41 43 45 35 28 22 55 4e 4c 4f 43 4b  OSTRACE5("UNLOCK
11320 20 20 25 64 20 25 64 20 77 61 73 20 25 64 20 70    %d %d was %d p
11330 69 64 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d  id=%d\n", pFile-
11340 3e 68 2c 20 6c 6f 63 6b 74 79 70 65 2c 0a 20 20  >h, locktype,.  
11350 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e           pFile->
11360 6c 6f 63 6b 74 79 70 65 2c 20 67 65 74 70 69 64  locktype, getpid
11370 28 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6c  ());.  assert( l
11380 6f 63 6b 74 79 70 65 3c 3d 53 48 41 52 45 44 5f  ocktype<=SHARED_
11390 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20  LOCK );.  .  /* 
113a0 6e 6f 2d 6f 70 20 69 66 20 70 6f 73 73 69 62 6c  no-op if possibl
113b0 65 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65  e */.  if( pFile
113c0 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 6c 6f 63 6b  ->locktype==lock
113d0 74 79 70 65 20 29 7b 0a 20 20 20 20 72 65 74 75  type ){.    retu
113e0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
113f0 7d 0a 20 20 0a 20 20 2f 2a 20 73 68 61 72 65 64  }.  .  /* shared
11400 20 63 61 6e 20 6a 75 73 74 20 62 65 20 73 65 74   can just be set
11410 20 62 65 63 61 75 73 65 20 77 65 20 61 6c 77 61   because we alwa
11420 79 73 20 68 61 76 65 20 61 6e 20 65 78 63 6c 75  ys have an exclu
11430 73 69 76 65 20 2a 2f 0a 20 20 69 66 20 28 6c 6f  sive */.  if (lo
11440 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c  cktype==SHARED_L
11450 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65  OCK) {.    pFile
11460 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63  ->locktype = loc
11470 6b 74 79 70 65 3b 0a 20 20 20 20 72 65 74 75 72  ktype;.    retur
11480 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
11490 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2c 20 72 65 61  .  .  /* no, rea
114a0 6c 6c 79 2c 20 75 6e 6c 6f 63 6b 2e 20 2a 2f 0a  lly, unlock. */.
114b0 20 20 69 6e 74 20 72 63 20 3d 20 66 6c 6f 63 6b    int rc = flock
114c0 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f  (pFile->h, LOCK_
114d0 55 4e 29 3b 0a 20 20 69 66 20 28 72 63 29 20 7b  UN);.  if (rc) {
114e0 0a 20 20 20 20 69 6e 74 20 72 2c 20 74 45 72 72  .    int r, tErr
114f0 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
11500 72 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  r = sqliteErrorF
11510 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
11520 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45  rrno, SQLITE_IOE
11530 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20  RR_UNLOCK);.    
11540 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  if( IS_LOCK_ERRO
11550 52 28 72 29 20 29 7b 0a 20 20 20 20 20 20 70 46  R(r) ){.      pF
11560 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
11570 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 23   tErrno;.    }.#
11580 69 66 64 65 66 20 53 51 4c 49 54 45 5f 49 47 4e  ifdef SQLITE_IGN
11590 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45  ORE_FLOCK_LOCK_E
115a0 52 52 4f 52 53 0a 20 20 20 20 69 66 28 20 28 72  RRORS.    if( (r
115b0 20 26 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29   & SQLITE_IOERR)
115c0 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52   == SQLITE_IOERR
115d0 20 29 7b 0a 20 20 20 20 20 20 72 20 3d 20 53 51   ){.      r = SQ
115e0 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d  LITE_BUSY;.    }
115f0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
11600 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c  E_IGNORE_FLOCK_L
11610 4f 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20  OCK_ERRORS */.  
11620 20 20 0a 20 20 20 20 72 65 74 75 72 6e 20 72 3b    .    return r;
11630 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20  .  } else {.    
11640 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20  pFile->locktype 
11650 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 72  = NO_LOCK;.    r
11660 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
11670 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  .  }.}../*.** Cl
11680 6f 73 65 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73  ose a file..*/.s
11690 74 61 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b 43  tatic int flockC
116a0 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  lose(sqlite3_fil
116b0 65 20 2a 69 64 29 20 7b 0a 20 20 69 66 28 20 69  e *id) {.  if( i
116c0 64 20 29 7b 0a 20 20 20 20 66 6c 6f 63 6b 55 6e  d ){.    flockUn
116d0 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b  lock(id, NO_LOCK
116e0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
116f0 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64  closeUnixFile(id
11700 29 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20  );.}..#endif /* 
11710 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
11720 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 21  CKING_STYLE && !
11730 4f 53 5f 56 58 57 4f 52 4b 20 2a 2f 0a 0a 2f 2a  OS_VXWORK */../*
11740 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11750 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 66 6c  ** End of the fl
11760 6f 63 6b 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65  ock lock impleme
11770 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a  ntation ********
11780 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
11790 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
117a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
117b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
117c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
117d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f  ************/../
117e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
117f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11800 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11810 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11820 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
11830 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11840 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 4e 61  ******* Begin Na
11850 6d 65 64 20 53 65 6d 61 70 68 6f 72 65 20 4c 6f  med Semaphore Lo
11860 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  cking **********
11870 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
11880 2a 0a 2a 2a 20 4e 61 6d 65 64 20 73 65 6d 61 70  *.** Named semap
11890 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20  hore locking is 
118a0 6f 6e 6c 79 20 73 75 70 70 6f 72 74 65 64 20 6f  only supported o
118b0 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a 0a 2a 2a  n VxWorks..**.**
118c0 20 53 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69   Semaphore locki
118d0 6e 67 20 69 73 20 6c 69 6b 65 20 64 6f 74 2d 6c  ng is like dot-l
118e0 6f 63 6b 20 61 6e 64 20 66 6c 6f 63 6b 20 69 6e  ock and flock in
118f0 20 74 68 61 74 20 69 74 20 72 65 61 6c 6c 79 20   that it really 
11900 6f 6e 6c 79 0a 2a 2a 20 73 75 70 70 6f 72 74 73  only.** supports
11910 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 69   EXCLUSIVE locki
11920 6e 67 2e 20 20 4f 6e 6c 79 20 61 20 73 69 6e 67  ng.  Only a sing
11930 6c 65 20 70 72 6f 63 65 73 73 20 63 61 6e 20 72  le process can r
11940 65 61 64 20 6f 72 20 77 72 69 74 65 0a 2a 2a 20  ead or write.** 
11950 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
11960 65 20 61 74 20 61 20 74 69 6d 65 2e 20 20 54 68  e at a time.  Th
11970 69 73 20 72 65 64 75 63 65 73 20 70 6f 74 65 6e  is reduces poten
11980 74 69 61 6c 20 63 6f 6e 63 75 72 72 65 6e 63 79  tial concurrency
11990 2c 20 62 75 74 0a 2a 2a 20 6d 61 6b 65 73 20 74  , but.** makes t
119a0 68 65 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e  he lock implemen
119b0 74 61 74 69 6f 6e 20 6d 75 63 68 20 65 61 73 69  tation much easi
119c0 65 72 2e 0a 2a 2f 0a 23 69 66 20 4f 53 5f 56 58  er..*/.#if OS_VX
119d0 57 4f 52 4b 53 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  WORKS../*.** Thi
119e0 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73  s routine checks
119f0 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 52   if there is a R
11a00 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c  ESERVED lock hel
11a10 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69  d on the specifi
11a20 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68  ed.** file by th
11a30 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20  is or any other 
11a40 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68  process. If such
11a50 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c   a lock is held,
11a60 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a   set *pResOut.**
11a70 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76   to a non-zero v
11a80 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a  alue otherwise *
11a90 70 52 65 73 4f 75 74 20 69 73 20 73 65 74 20 74  pResOut is set t
11aa0 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74  o zero.  The ret
11ab0 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20  urn value.** is 
11ac0 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b  set to SQLITE_OK
11ad0 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65   unless an I/O e
11ae0 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69  rror occurs duri
11af0 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67  ng lock checking
11b00 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
11b10 73 65 6d 43 68 65 63 6b 52 65 73 65 72 76 65 64  semCheckReserved
11b20 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
11b30 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73  e *id, int *pRes
11b40 4f 75 74 29 20 7b 0a 20 20 69 6e 74 20 72 63 20  Out) {.  int rc 
11b50 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
11b60 6e 74 20 72 65 73 65 72 76 65 64 20 3d 20 30 3b  nt reserved = 0;
11b70 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
11b80 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
11b90 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49  id;..  SimulateI
11ba0 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53  OError( return S
11bb0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43  QLITE_IOERR_CHEC
11bc0 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29  KRESERVEDLOCK; )
11bd0 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 70  ;.  .  assert( p
11be0 46 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 43 68  File );..  /* Ch
11bf0 65 63 6b 20 69 66 20 61 20 74 68 72 65 61 64 20  eck if a thread 
11c00 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 20  in this process 
11c10 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c 6f 63  holds such a loc
11c20 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65  k */.  if( pFile
11c30 2d 3e 6c 6f 63 6b 74 79 70 65 3e 53 48 41 52 45  ->locktype>SHARE
11c40 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65  D_LOCK ){.    re
11c50 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a  served = 1;.  }.
11c60 20 20 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69 73    .  /* Otherwis
11c70 65 20 73 65 65 20 69 66 20 73 6f 6d 65 20 6f 74  e see if some ot
11c80 68 65 72 20 70 72 6f 63 65 73 73 20 68 6f 6c 64  her process hold
11c90 73 20 69 74 2e 20 2a 2f 0a 20 20 69 66 28 20 21  s it. */.  if( !
11ca0 72 65 73 65 72 76 65 64 20 29 7b 0a 20 20 20 20  reserved ){.    
11cb0 73 65 6d 5f 74 20 2a 70 53 65 6d 20 3d 20 70 46  sem_t *pSem = pF
11cc0 69 6c 65 2d 3e 70 4f 70 65 6e 2d 3e 70 53 65 6d  ile->pOpen->pSem
11cd0 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73 74 61  ;.    struct sta
11ce0 74 20 73 74 61 74 42 75 66 3b 0a 0a 20 20 20 20  t statBuf;..    
11cf0 69 66 28 20 73 65 6d 5f 74 72 79 77 61 69 74 28  if( sem_trywait(
11d00 70 53 65 6d 29 3d 3d 2d 31 20 29 7b 0a 20 20 20  pSem)==-1 ){.   
11d10 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20     int tErrno = 
11d20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 69 66 28  errno;.      if(
11d30 20 45 41 47 41 49 4e 20 21 3d 20 74 45 72 72 6e   EAGAIN != tErrn
11d40 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  o ){.        rc 
11d50 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  = sqliteErrorFro
11d60 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72  mPosixError(tErr
11d70 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  no, SQLITE_IOERR
11d80 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f  _CHECKRESERVEDLO
11d90 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 70 46 69  CK);.        pFi
11da0 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
11db0 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 20  tErrno;.      } 
11dc0 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 2f  else {.        /
11dd0 2a 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 68  * someone else h
11de0 61 73 20 74 68 65 20 6c 6f 63 6b 20 77 68 65 6e  as the lock when
11df0 20 77 65 20 61 72 65 20 69 6e 20 4e 4f 5f 4c 4f   we are in NO_LO
11e00 43 4b 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65  CK */.        re
11e10 73 65 72 76 65 64 20 3d 20 28 70 46 69 6c 65 2d  served = (pFile-
11e20 3e 6c 6f 63 6b 74 79 70 65 20 3c 20 53 48 41 52  >locktype < SHAR
11e30 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  ED_LOCK);.      
11e40 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
11e50 20 20 20 2f 2a 20 77 65 20 63 6f 75 6c 64 20 68     /* we could h
11e60 61 76 65 20 69 74 20 69 66 20 77 65 20 77 61 6e  ave it if we wan
11e70 74 20 69 74 20 2a 2f 0a 20 20 20 20 20 20 73 65  t it */.      se
11e80 6d 5f 70 6f 73 74 28 70 53 65 6d 29 3b 0a 20 20  m_post(pSem);.  
11e90 20 20 7d 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43    }.  }.  OSTRAC
11ea0 45 34 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b  E4("TEST WR-LOCK
11eb0 20 25 64 20 25 64 20 25 64 5c 6e 22 2c 20 70 46   %d %d %d\n", pF
11ec0 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65  ile->h, rc, rese
11ed0 72 76 65 64 29 3b 0a 0a 20 20 2a 70 52 65 73 4f  rved);..  *pResO
11ee0 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20  ut = reserved;. 
11ef0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
11f00 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69  *.** Lock the fi
11f10 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b  le with the lock
11f20 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61   specified by pa
11f30 72 61 6d 65 74 65 72 20 6c 6f 63 6b 74 79 70 65  rameter locktype
11f40 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65   - one.** of the
11f50 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
11f60 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45 44  *     (1) SHARED
11f70 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29  _LOCK.**     (2)
11f80 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a   RESERVED_LOCK.*
11f90 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e  *     (3) PENDIN
11fa0 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34  G_LOCK.**     (4
11fb0 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ) EXCLUSIVE_LOCK
11fc0 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73  .**.** Sometimes
11fd0 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67   when requesting
11fe0 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c   one lock state,
11ff0 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b   additional lock
12000 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69   states.** are i
12010 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77 65  nserted in betwe
12020 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67  en.  The locking
12030 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f   might fail on o
12040 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a  ne of the later.
12050 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c  ** transitions l
12060 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20  eaving the lock 
12070 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74 20  state different 
12080 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61  from what it sta
12090 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c  rted but.** stil
120a0 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67  l short of its g
120b0 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  oal.  The follow
120c0 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73 20  ing chart shows 
120d0 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74  the allowed.** t
120e0 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74  ransitions and t
120f0 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65  he inserted inte
12100 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73 3a  rmediate states:
12110 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b  .**.**    UNLOCK
12120 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20  ED -> SHARED.** 
12130 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53     SHARED -> RES
12140 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52  ERVED.**    SHAR
12150 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20  ED -> (PENDING) 
12160 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  -> EXCLUSIVE.** 
12170 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28     RESERVED -> (
12180 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c  PENDING) -> EXCL
12190 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44  USIVE.**    PEND
121a0 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  ING -> EXCLUSIVE
121b0 0a 2a 2a 0a 2a 2a 20 53 65 6d 61 70 68 6f 72 65  .**.** Semaphore
121c0 20 6c 6f 63 6b 73 20 6f 6e 6c 79 20 72 65 61 6c   locks only real
121d0 6c 79 20 73 75 70 70 6f 72 74 20 45 58 43 4c 55  ly support EXCLU
121e0 53 49 56 45 20 6c 6f 63 6b 73 2e 20 20 57 65 20  SIVE locks.  We 
121f0 74 72 61 63 6b 20 69 6e 74 65 72 6d 65 64 69 61  track intermedia
12200 74 65 0a 2a 2a 20 6c 6f 63 6b 20 73 74 61 74 65  te.** lock state
12210 73 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65 33  s in the sqlite3
12220 5f 66 69 6c 65 20 73 74 72 75 63 74 75 72 65 2c  _file structure,
12230 20 62 75 74 20 61 6c 6c 20 6c 6f 63 6b 73 20 53   but all locks S
12240 48 41 52 45 44 20 6f 72 0a 2a 2a 20 61 62 6f 76  HARED or.** abov
12250 65 20 61 72 65 20 72 65 61 6c 6c 79 20 45 58 43  e are really EXC
12260 4c 55 53 49 56 45 20 6c 6f 63 6b 73 20 61 6e 64  LUSIVE locks and
12270 20 65 78 63 6c 75 64 65 20 61 6c 6c 20 6f 74 68   exclude all oth
12280 65 72 20 70 72 6f 63 65 73 73 65 73 20 66 72 6f  er processes fro
12290 6d 0a 2a 2a 20 61 63 63 65 73 73 20 74 68 65 20  m.** access the 
122a0 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  file..**.** This
122b0 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e   routine will on
122c0 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f  ly increase a lo
122d0 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c  ck.  Use the sql
122e0 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a  ite3OsUnlock().*
122f0 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77  * routine to low
12300 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  er a locking lev
12310 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  el..*/.static in
12320 74 20 73 65 6d 4c 6f 63 6b 28 73 71 6c 69 74 65  t semLock(sqlite
12330 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
12340 6c 6f 63 6b 74 79 70 65 29 20 7b 0a 20 20 75 6e  locktype) {.  un
12350 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
12360 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
12370 20 69 6e 74 20 66 64 3b 0a 20 20 73 65 6d 5f 74   int fd;.  sem_t
12380 20 2a 70 53 65 6d 20 3d 20 70 46 69 6c 65 2d 3e   *pSem = pFile->
12390 70 4f 70 65 6e 2d 3e 70 53 65 6d 3b 0a 20 20 69  pOpen->pSem;.  i
123a0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
123b0 4b 3b 0a 0a 20 20 2f 2a 20 69 66 20 77 65 20 61  K;..  /* if we a
123c0 6c 72 65 61 64 79 20 68 61 76 65 20 61 20 6c 6f  lready have a lo
123d0 63 6b 2c 20 69 74 20 69 73 20 65 78 63 6c 75 73  ck, it is exclus
123e0 69 76 65 2e 20 20 0a 20 20 2a 2a 20 4a 75 73 74  ive.  .  ** Just
123f0 20 61 64 6a 75 73 74 20 6c 65 76 65 6c 20 61 6e   adjust level an
12400 64 20 70 75 6e 74 20 6f 6e 20 6f 75 74 74 61 20  d punt on outta 
12410 68 65 72 65 2e 20 2a 2f 0a 20 20 69 66 20 28 70  here. */.  if (p
12420 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3e  File->locktype >
12430 20 4e 4f 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20   NO_LOCK) {.    
12440 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20  pFile->locktype 
12450 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20  = locktype;.    
12460 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
12470 20 20 20 20 67 6f 74 6f 20 73 65 6d 5f 65 6e 64      goto sem_end
12480 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 0a 20 20  _lock;.  }.  .  
12490 2f 2a 20 6c 6f 63 6b 20 73 65 6d 61 70 68 6f 72  /* lock semaphor
124a0 65 20 6e 6f 77 20 62 75 74 20 62 61 69 6c 20 6f  e now but bail o
124b0 75 74 20 77 68 65 6e 20 61 6c 72 65 61 64 79 20  ut when already 
124c0 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20 69 66 28  locked. */.  if(
124d0 20 73 65 6d 5f 74 72 79 77 61 69 74 28 70 53 65   sem_trywait(pSe
124e0 6d 29 3d 3d 2d 31 20 29 7b 0a 20 20 20 20 72 63  m)==-1 ){.    rc
124f0 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
12500 20 20 20 20 67 6f 74 6f 20 73 65 6d 5f 65 6e 64      goto sem_end
12510 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  _lock;.  }..  /*
12520 20 67 6f 74 20 69 74 2c 20 73 65 74 20 74 68 65   got it, set the
12530 20 74 79 70 65 20 61 6e 64 20 72 65 74 75 72 6e   type and return
12540 20 6f 6b 20 2a 2f 0a 20 20 70 46 69 6c 65 2d 3e   ok */.  pFile->
12550 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74  locktype = lockt
12560 79 70 65 3b 0a 0a 20 73 65 6d 5f 65 6e 64 5f 6c  ype;.. sem_end_l
12570 6f 63 6b 3a 0a 20 20 72 65 74 75 72 6e 20 72 63  ock:.  return rc
12580 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72  ;.}../*.** Lower
12590 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
125a0 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72  el on file descr
125b0 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 6c  iptor pFile to l
125c0 6f 63 6b 74 79 70 65 2e 20 20 6c 6f 63 6b 74 79  ocktype.  lockty
125d0 70 65 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69  pe.** must be ei
125e0 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20  ther NO_LOCK or 
125f0 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a  SHARED_LOCK..**.
12600 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e  ** If the lockin
12610 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66  g level of the f
12620 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
12630 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20  s already at or 
12640 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71  below.** the req
12650 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c  uested locking l
12660 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69  evel, this routi
12670 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
12680 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6d  /.static int sem
12690 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  Unlock(sqlite3_f
126a0 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63  ile *id, int loc
126b0 6b 74 79 70 65 29 20 7b 0a 20 20 75 6e 69 78 46  ktype) {.  unixF
126c0 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
126d0 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 73 65  ixFile*)id;.  se
126e0 6d 5f 74 20 2a 70 53 65 6d 20 3d 20 70 46 69 6c  m_t *pSem = pFil
126f0 65 2d 3e 70 4f 70 65 6e 2d 3e 70 53 65 6d 3b 0a  e->pOpen->pSem;.
12700 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
12710 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53   );.  assert( pS
12720 65 6d 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 35  em );.  OSTRACE5
12730 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20  ("UNLOCK  %d %d 
12740 77 61 73 20 25 64 20 70 69 64 3d 25 64 5c 6e 22  was %d pid=%d\n"
12750 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b  , pFile->h, lock
12760 74 79 70 65 2c 0a 09 20 20 20 70 46 69 6c 65 2d  type,..   pFile-
12770 3e 6c 6f 63 6b 74 79 70 65 2c 20 67 65 74 70 69  >locktype, getpi
12780 64 28 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20  d());.  assert( 
12790 6c 6f 63 6b 74 79 70 65 3c 3d 53 48 41 52 45 44  locktype<=SHARED
127a0 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a  _LOCK );.  .  /*
127b0 20 6e 6f 2d 6f 70 20 69 66 20 70 6f 73 73 69 62   no-op if possib
127c0 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  le */.  if( pFil
127d0 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 6c 6f 63  e->locktype==loc
127e0 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 72 65 74  ktype ){.    ret
127f0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
12800 20 7d 0a 20 20 0a 20 20 2f 2a 20 73 68 61 72 65   }.  .  /* share
12810 64 20 63 61 6e 20 6a 75 73 74 20 62 65 20 73 65  d can just be se
12820 74 20 62 65 63 61 75 73 65 20 77 65 20 61 6c 77  t because we alw
12830 61 79 73 20 68 61 76 65 20 61 6e 20 65 78 63 6c  ays have an excl
12840 75 73 69 76 65 20 2a 2f 0a 20 20 69 66 20 28 6c  usive */.  if (l
12850 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f  ocktype==SHARED_
12860 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c  LOCK) {.    pFil
12870 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f  e->locktype = lo
12880 63 6b 74 79 70 65 3b 0a 20 20 20 20 72 65 74 75  cktype;.    retu
12890 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
128a0 7d 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2c 20 72 65  }.  .  /* no, re
128b0 61 6c 6c 79 20 75 6e 6c 6f 63 6b 2e 20 2a 2f 0a  ally unlock. */.
128c0 20 20 69 66 20 28 20 73 65 6d 5f 70 6f 73 74 28    if ( sem_post(
128d0 70 53 65 6d 29 3d 3d 2d 31 20 29 20 7b 0a 20 20  pSem)==-1 ) {.  
128e0 20 20 69 6e 74 20 72 63 2c 20 74 45 72 72 6e 6f    int rc, tErrno
128f0 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 72 63   = errno;.    rc
12900 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
12910 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
12920 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
12930 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20 69  R_UNLOCK);.    i
12940 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
12950 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 70 46  (rc) ){.      pF
12960 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
12970 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20   tErrno;.    }. 
12980 20 20 20 72 65 74 75 72 6e 20 72 63 3b 20 0a 20     return rc; . 
12990 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b   }.  pFile->lock
129a0 74 79 70 65 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a  type = NO_LOCK;.
129b0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
129c0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2a 20 43 6c  OK;.}../*. ** Cl
129d0 6f 73 65 20 61 20 66 69 6c 65 2e 0a 20 2a 2f 0a  ose a file.. */.
129e0 73 74 61 74 69 63 20 69 6e 74 20 73 65 6d 43 6c  static int semCl
129f0 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ose(sqlite3_file
12a00 20 2a 69 64 29 20 7b 0a 20 20 69 66 28 20 69 64   *id) {.  if( id
12a10 20 29 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65   ){.    unixFile
12a20 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
12a30 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20 73 65 6d  ile*)id;.    sem
12a40 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f  Unlock(id, NO_LO
12a50 43 4b 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  CK);.    assert(
12a60 20 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 75 6e   pFile );.    un
12a70 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
12a80 20 20 20 20 72 65 6c 65 61 73 65 4c 6f 63 6b 49      releaseLockI
12a90 6e 66 6f 28 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b  nfo(pFile->pLock
12aa0 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 4f 70  );.    releaseOp
12ab0 65 6e 43 6e 74 28 70 46 69 6c 65 2d 3e 70 4f 70  enCnt(pFile->pOp
12ac0 65 6e 29 3b 0a 20 20 20 20 75 6e 69 78 4c 65 61  en);.    unixLea
12ad0 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 63  veMutex();.    c
12ae0 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29  loseUnixFile(id)
12af0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
12b00 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e  QLITE_OK;.}..#en
12b10 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b  dif /* OS_VXWORK
12b20 53 20 2a 2f 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65 64  S */./*.** Named
12b30 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69   semaphore locki
12b40 6e 67 20 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c  ng is only avail
12b50 61 62 6c 65 20 6f 6e 20 56 78 57 6f 72 6b 73 2e  able on VxWorks.
12b60 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .**.************
12b70 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6e  *** End of the n
12b80 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6c  amed semaphore l
12b90 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ock implementati
12ba0 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  on *************
12bb0 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
12bc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12bd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12be0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12bf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12c00 2a 2a 2f 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  **/.../*********
12c10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12c20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12c30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12c40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12c50 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
12c60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12c70 2a 20 42 65 67 69 6e 20 41 46 50 20 4c 6f 63 6b  * Begin AFP Lock
12c80 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ing ************
12c90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12ca0 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 41 46 50 20  *****.**.** AFP 
12cb0 69 73 20 74 68 65 20 41 70 70 6c 65 20 46 69 6c  is the Apple Fil
12cc0 69 6e 67 20 50 72 6f 74 6f 63 6f 6c 2e 20 20 41  ing Protocol.  A
12cd0 46 50 20 69 73 20 61 20 6e 65 74 77 6f 72 6b 20  FP is a network 
12ce0 66 69 6c 65 73 79 73 74 65 6d 20 66 6f 75 6e 64  filesystem found
12cf0 0a 2a 2a 20 6f 6e 20 41 70 70 6c 65 20 4d 61 63  .** on Apple Mac
12d00 69 6e 74 6f 73 68 20 63 6f 6d 70 75 74 65 72 73  intosh computers
12d10 20 2d 20 62 6f 74 68 20 4f 53 39 20 61 6e 64 20   - both OS9 and 
12d20 4f 53 58 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 72 64  OSX..**.** Third
12d30 2d 70 61 72 74 79 20 69 6d 70 6c 65 6d 65 6e 74  -party implement
12d40 61 74 69 6f 6e 73 20 6f 66 20 41 46 50 20 61 72  ations of AFP ar
12d50 65 20 61 76 61 69 6c 61 62 6c 65 2e 20 20 42 75  e available.  Bu
12d60 74 20 74 68 69 73 20 63 6f 64 65 20 68 65 72 65  t this code here
12d70 0a 2a 2a 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 6f  .** only works o
12d80 6e 20 4f 53 58 2e 0a 2a 2f 0a 0a 23 69 66 20 64  n OSX..*/..#if d
12d90 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
12da0 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42  ) && SQLITE_ENAB
12db0 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
12dc0 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 66 70 4c 6f  ./*.** The afpLo
12dd0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 73 74 72  ckingContext str
12de0 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 20  ucture contains 
12df0 61 6c 6c 20 61 66 70 20 6c 6f 63 6b 20 73 70 65  all afp lock spe
12e00 63 69 66 69 63 20 73 74 61 74 65 0a 2a 2f 0a 74  cific state.*/.t
12e10 79 70 65 64 65 66 20 73 74 72 75 63 74 20 61 66  ypedef struct af
12e20 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  pLockingContext 
12e30 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
12e40 74 3b 0a 73 74 72 75 63 74 20 61 66 70 4c 6f 63  t;.struct afpLoc
12e50 6b 69 6e 67 43 6f 6e 74 65 78 74 20 7b 0a 20 20  kingContext {.  
12e60 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f  unsigned long lo
12e70 6e 67 20 73 68 61 72 65 64 42 79 74 65 3b 0a 20  ng sharedByte;. 
12e80 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 64 62 50   const char *dbP
12e90 61 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20  ath;            
12ea0 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
12eb0 6f 70 65 6e 20 66 69 6c 65 20 2a 2f 0a 7d 3b 0a  open file */.};.
12ec0 0a 73 74 72 75 63 74 20 42 79 74 65 52 61 6e 67  .struct ByteRang
12ed0 65 4c 6f 63 6b 50 42 32 0a 7b 0a 20 20 75 6e 73  eLockPB2.{.  uns
12ee0 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20  igned long long 
12ef0 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 2f  offset;        /
12f00 2a 20 6f 66 66 73 65 74 20 74 6f 20 66 69 72 73  * offset to firs
12f10 74 20 62 79 74 65 20 74 6f 20 6c 6f 63 6b 20 2a  t byte to lock *
12f20 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  /.  unsigned lon
12f30 67 20 6c 6f 6e 67 20 6c 65 6e 67 74 68 3b 20 20  g long length;  
12f40 20 20 20 20 20 20 2f 2a 20 6e 62 72 20 6f 66 20        /* nbr of 
12f50 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f  bytes to lock */
12f60 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  .  unsigned long
12f70 20 6c 6f 6e 67 20 72 65 74 52 61 6e 67 65 53 74   long retRangeSt
12f80 61 72 74 3b 20 2f 2a 20 6e 62 72 20 6f 66 20 31  art; /* nbr of 1
12f90 73 74 20 62 79 74 65 20 6c 6f 63 6b 65 64 20 69  st byte locked i
12fa0 66 20 73 75 63 63 65 73 73 66 75 6c 20 2a 2f 0a  f successful */.
12fb0 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
12fc0 75 6e 4c 6f 63 6b 46 6c 61 67 3b 20 20 20 20 20  unLockFlag;     
12fd0 20 20 20 20 2f 2a 20 31 20 3d 20 75 6e 6c 6f 63      /* 1 = unloc
12fe0 6b 2c 20 30 20 3d 20 6c 6f 63 6b 20 2a 2f 0a 20  k, 0 = lock */. 
12ff0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 73   unsigned char s
13000 74 61 72 74 45 6e 64 46 6c 61 67 3b 20 20 20 20  tartEndFlag;    
13010 20 20 20 2f 2a 20 31 3d 72 65 6c 20 74 6f 20 65     /* 1=rel to e
13020 6e 64 20 6f 66 20 66 6f 72 6b 2c 20 30 3d 72 65  nd of fork, 0=re
13030 6c 20 74 6f 20 73 74 61 72 74 20 2a 2f 0a 20 20  l to start */.  
13040 69 6e 74 20 66 64 3b 20 20 20 20 20 20 20 20 20  int fd;         
13050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13060 20 20 2f 2a 20 66 69 6c 65 20 64 65 73 63 20 74    /* file desc t
13070 6f 20 61 73 73 6f 63 20 74 68 69 73 20 6c 6f 63  o assoc this loc
13080 6b 20 77 69 74 68 20 2a 2f 0a 7d 3b 0a 0a 23 64  k with */.};..#d
13090 65 66 69 6e 65 20 61 66 70 66 73 42 79 74 65 52  efine afpfsByteR
130a0 61 6e 67 65 4c 6f 63 6b 32 46 53 43 54 4c 20 20  angeLock2FSCTL  
130b0 20 20 20 20 20 20 5f 49 4f 57 52 28 27 7a 27 2c        _IOWR('z',
130c0 20 32 33 2c 20 73 74 72 75 63 74 20 42 79 74 65   23, struct Byte
130d0 52 61 6e 67 65 4c 6f 63 6b 50 42 32 29 0a 0a 2f  RangeLockPB2)../
130e0 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 75  *.** This is a u
130f0 74 69 6c 69 74 79 20 66 6f 72 20 73 65 74 74 69  tility for setti
13100 6e 67 20 6f 72 20 63 6c 65 61 72 69 6e 67 20 61  ng or clearing a
13110 20 62 69 74 2d 72 61 6e 67 65 20 6c 6f 63 6b 20   bit-range lock 
13120 6f 6e 20 61 6e 0a 2a 2a 20 41 46 50 20 66 69 6c  on an.** AFP fil
13130 65 73 79 73 74 65 6d 2e 0a 2a 2a 20 0a 2a 2a 20  esystem..** .** 
13140 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
13150 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 53 51 4c   on success, SQL
13160 49 54 45 5f 42 55 53 59 20 6f 6e 20 66 61 69 6c  ITE_BUSY on fail
13170 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ure..*/.static i
13180 6e 74 20 61 66 70 53 65 74 4c 6f 63 6b 28 0a 20  nt afpSetLock(. 
13190 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 61 74   const char *pat
131a0 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h,              
131b0 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66  /* Name of the f
131c0 69 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64  ile to be locked
131d0 20 6f 72 20 75 6e 6c 6f 63 6b 65 64 20 2a 2f 0a   or unlocked */.
131e0 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
131f0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
13200 20 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20 64 65   /* Open file de
13210 73 63 72 69 70 74 6f 72 20 6f 6e 20 70 61 74 68  scriptor on path
13220 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c   */.  unsigned l
13230 6f 6e 67 20 6c 6f 6e 67 20 6f 66 66 73 65 74 2c  ong long offset,
13240 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79       /* First by
13250 74 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20  te to be locked 
13260 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f  */.  unsigned lo
13270 6e 67 20 6c 6f 6e 67 20 6c 65 6e 67 74 68 2c 20  ng long length, 
13280 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
13290 20 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20 2a   bytes to lock *
132a0 2f 0a 20 20 69 6e 74 20 73 65 74 4c 6f 63 6b 46  /.  int setLockF
132b0 6c 61 67 20 20 20 20 20 20 20 20 20 20 20 20 20  lag             
132c0 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 73 65     /* True to se
132d0 74 20 6c 6f 63 6b 2e 20 20 46 61 6c 73 65 20 74  t lock.  False t
132e0 6f 20 63 6c 65 61 72 20 6c 6f 63 6b 20 2a 2f 0a  o clear lock */.
132f0 29 7b 0a 20 20 73 74 72 75 63 74 20 42 79 74 65  ){.  struct Byte
13300 52 61 6e 67 65 4c 6f 63 6b 50 42 32 20 70 62 3b  RangeLockPB2 pb;
13310 0a 20 20 69 6e 74 20 65 72 72 3b 0a 20 20 0a 20  .  int err;.  . 
13320 20 70 62 2e 75 6e 4c 6f 63 6b 46 6c 61 67 20 3d   pb.unLockFlag =
13330 20 73 65 74 4c 6f 63 6b 46 6c 61 67 20 3f 20 30   setLockFlag ? 0
13340 20 3a 20 31 3b 0a 20 20 70 62 2e 73 74 61 72 74   : 1;.  pb.start
13350 45 6e 64 46 6c 61 67 20 3d 20 30 3b 0a 20 20 70  EndFlag = 0;.  p
13360 62 2e 6f 66 66 73 65 74 20 3d 20 6f 66 66 73 65  b.offset = offse
13370 74 3b 0a 20 20 70 62 2e 6c 65 6e 67 74 68 20 3d  t;.  pb.length =
13380 20 6c 65 6e 67 74 68 3b 20 0a 20 20 70 62 2e 66   length; .  pb.f
13390 64 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 20 20  d = pFile->h;.  
133a0 0a 20 20 4f 53 54 52 41 43 45 36 28 22 41 46 50  .  OSTRACE6("AFP
133b0 53 45 54 4c 4f 43 4b 20 5b 25 73 5d 20 66 6f 72  SETLOCK [%s] for
133c0 20 25 64 25 73 20 69 6e 20 72 61 6e 67 65 20 25   %d%s in range %
133d0 6c 6c 78 3a 25 6c 6c 78 5c 6e 22 2c 20 0a 20 20  llx:%llx\n", .  
133e0 20 20 28 73 65 74 4c 6f 63 6b 46 6c 61 67 3f 22    (setLockFlag?"
133f0 4f 4e 22 3a 22 4f 46 46 22 29 2c 20 70 46 69 6c  ON":"OFF"), pFil
13400 65 2d 3e 68 2c 20 28 70 62 2e 66 64 3d 3d 2d 31  e->h, (pb.fd==-1
13410 3f 22 5b 74 65 73 74 76 61 6c 2d 31 5d 22 3a 22  ?"[testval-1]":"
13420 22 29 2c 0a 20 20 20 20 6f 66 66 73 65 74 2c 20  "),.    offset, 
13430 6c 65 6e 67 74 68 29 3b 0a 20 20 65 72 72 20 3d  length);.  err =
13440 20 66 73 63 74 6c 28 70 61 74 68 2c 20 61 66 70   fsctl(path, afp
13450 66 73 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 32  fsByteRangeLock2
13460 46 53 43 54 4c 2c 20 26 70 62 2c 20 30 29 3b 0a  FSCTL, &pb, 0);.
13470 20 20 69 66 20 28 20 65 72 72 3d 3d 2d 31 20 29    if ( err==-1 )
13480 20 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20   {.    int rc;. 
13490 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20     int tErrno = 
134a0 65 72 72 6e 6f 3b 0a 20 20 20 20 4f 53 54 52 41  errno;.    OSTRA
134b0 43 45 34 28 22 41 46 50 53 45 54 4c 4f 43 4b 20  CE4("AFPSETLOCK 
134c0 66 61 69 6c 65 64 20 74 6f 20 66 73 63 74 6c 28  failed to fsctl(
134d0 29 20 27 25 73 27 20 25 64 20 25 73 5c 6e 22 2c  ) '%s' %d %s\n",
134e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61  .             pa
134f0 74 68 2c 20 74 45 72 72 6e 6f 2c 20 73 74 72 65  th, tErrno, stre
13500 72 72 6f 72 28 74 45 72 72 6e 6f 29 29 3b 0a 23  rror(tErrno));.#
13510 69 66 64 65 66 20 53 51 4c 49 54 45 5f 49 47 4e  ifdef SQLITE_IGN
13520 4f 52 45 5f 41 46 50 5f 4c 4f 43 4b 5f 45 52 52  ORE_AFP_LOCK_ERR
13530 4f 52 53 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  ORS.    rc = SQL
13540 49 54 45 5f 42 55 53 59 3b 0a 23 65 6c 73 65 0a  ITE_BUSY;.#else.
13550 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45      rc = sqliteE
13560 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
13570 6f 72 28 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20  or(tErrno,.     
13580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
13590 65 74 4c 6f 63 6b 46 6c 61 67 20 3f 20 53 51 4c  etLockFlag ? SQL
135a0 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 20 3a  ITE_IOERR_LOCK :
135b0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e   SQLITE_IOERR_UN
135c0 4c 4f 43 4b 29 3b 0a 23 65 6e 64 69 66 20 2f 2a  LOCK);.#endif /*
135d0 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 41   SQLITE_IGNORE_A
135e0 46 50 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20 2a  FP_LOCK_ERRORS *
135f0 2f 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43  /.    if( IS_LOC
13600 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20  K_ERROR(rc) ){. 
13610 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
13620 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a  Errno = tErrno;.
13630 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
13640 20 72 63 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a   rc;.  } else {.
13650 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
13660 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  E_OK;.  }.}../*.
13670 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
13680 63 68 65 63 6b 73 20 69 66 20 74 68 65 72 65 20  checks if there 
13690 69 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  is a RESERVED lo
136a0 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73  ck held on the s
136b0 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65  pecified.** file
136c0 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20   by this or any 
136d0 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49  other process. I
136e0 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73  f such a lock is
136f0 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73   held, set *pRes
13700 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d  Out.** to a non-
13710 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72  zero value other
13720 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73  wise *pResOut is
13730 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54   set to zero.  T
13740 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a  he return value.
13750 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c  ** is set to SQL
13760 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e  ITE_OK unless an
13770 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72   I/O error occur
13780 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68  s during lock ch
13790 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  ecking..*/.stati
137a0 63 20 69 6e 74 20 61 66 70 43 68 65 63 6b 52 65  c int afpCheckRe
137b0 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74  servedLock(sqlit
137c0 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
137d0 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e   *pResOut){.  in
137e0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
137f0 3b 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65 64  ;.  int reserved
13800 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65   = 0;.  unixFile
13810 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
13820 69 6c 65 2a 29 69 64 3b 0a 20 20 0a 20 20 53 69  ile*)id;.  .  Si
13830 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
13840 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
13850 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44  RR_CHECKRESERVED
13860 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73  LOCK; );.  .  as
13870 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
13880 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65   afpLockingConte
13890 78 74 20 2a 63 6f 6e 74 65 78 74 20 3d 20 28 61  xt *context = (a
138a0 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
138b0 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69   *) pFile->locki
138c0 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 0a 20 20  ngContext;.  .  
138d0 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20 74 68  /* Check if a th
138e0 72 65 61 64 20 69 6e 20 74 68 69 73 20 70 72 6f  read in this pro
138f0 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63 68 20  cess holds such 
13900 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20  a lock */.  if( 
13910 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e  pFile->locktype>
13920 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20  SHARED_LOCK ){. 
13930 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b     reserved = 1;
13940 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74 68  .  }.  .  /* Oth
13950 65 72 77 69 73 65 20 73 65 65 20 69 66 20 73 6f  erwise see if so
13960 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  me other process
13970 20 68 6f 6c 64 73 20 69 74 2e 0a 20 20 20 2a 2f   holds it..   */
13980 0a 20 20 69 66 28 20 21 72 65 73 65 72 76 65 64  .  if( !reserved
13990 20 29 7b 0a 20 20 20 20 2f 2a 20 6c 6f 63 6b 20   ){.    /* lock 
139a0 74 68 65 20 52 45 53 45 52 56 45 44 20 62 79 74  the RESERVED byt
139b0 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6c 72 63  e */.    int lrc
139c0 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f   = afpSetLock(co
139d0 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70  ntext->dbPath, p
139e0 46 69 6c 65 2c 20 52 45 53 45 52 56 45 44 5f 42  File, RESERVED_B
139f0 59 54 45 2c 20 31 2c 31 29 3b 20 20 0a 20 20 20  YTE, 1,1);  .   
13a00 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d   if( SQLITE_OK==
13a10 6c 72 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  lrc ){.      /* 
13a20 69 66 20 77 65 20 73 75 63 63 65 65 64 65 64 20  if we succeeded 
13a30 69 6e 20 74 61 6b 69 6e 67 20 74 68 65 20 72 65  in taking the re
13a40 73 65 72 76 65 64 20 6c 6f 63 6b 2c 20 75 6e 6c  served lock, unl
13a50 6f 63 6b 20 69 74 20 74 6f 20 72 65 73 74 6f 72  ock it to restor
13a60 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6f  e.      ** the o
13a70 72 69 67 69 6e 61 6c 20 73 74 61 74 65 20 2a 2f  riginal state */
13a80 0a 20 20 20 20 20 20 6c 72 63 20 3d 20 61 66 70  .      lrc = afp
13a90 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d  SetLock(context-
13aa0 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20  >dbPath, pFile, 
13ab0 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 31  RESERVED_BYTE, 1
13ac0 2c 20 30 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65  , 0);.    } else
13ad0 20 7b 0a 20 20 20 20 20 20 2f 2a 20 69 66 20 77   {.      /* if w
13ae0 65 20 66 61 69 6c 65 64 20 74 6f 20 67 65 74 20  e failed to get 
13af0 74 68 65 20 6c 6f 63 6b 20 74 68 65 6e 20 73 6f  the lock then so
13b00 6d 65 6f 6e 65 20 65 6c 73 65 20 6d 75 73 74 20  meone else must 
13b10 68 61 76 65 20 69 74 20 2a 2f 0a 20 20 20 20 20  have it */.     
13b20 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20   reserved = 1;. 
13b30 20 20 20 7d 0a 20 20 20 20 69 66 28 20 49 53 5f     }.    if( IS_
13b40 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 29 20  LOCK_ERROR(lrc) 
13b50 29 7b 0a 20 20 20 20 20 20 72 63 3d 6c 72 63 3b  ){.      rc=lrc;
13b60 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20  .    }.  }.  .  
13b70 4f 53 54 52 41 43 45 34 28 22 54 45 53 54 20 57  OSTRACE4("TEST W
13b80 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 5c  R-LOCK %d %d %d\
13b90 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63  n", pFile->h, rc
13ba0 2c 20 72 65 73 65 72 76 65 64 29 3b 0a 20 20 0a  , reserved);.  .
13bb0 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73    *pResOut = res
13bc0 65 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20  erved;.  return 
13bd0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63  rc;.}../*.** Loc
13be0 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74 68 20  k the file with 
13bf0 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69  the lock specifi
13c00 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20  ed by parameter 
13c10 6c 6f 63 6b 74 79 70 65 20 2d 20 6f 6e 65 0a 2a  locktype - one.*
13c20 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  * of the followi
13c30 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31  ng:.**.**     (1
13c40 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a  ) SHARED_LOCK.**
13c50 20 20 20 20 20 28 32 29 20 52 45 53 45 52 56 45       (2) RESERVE
13c60 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33  D_LOCK.**     (3
13c70 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a  ) PENDING_LOCK.*
13c80 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c 55 53  *     (4) EXCLUS
13c90 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53  IVE_LOCK.**.** S
13ca0 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65  ometimes when re
13cb0 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63  questing one loc
13cc0 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f  k state, additio
13cd0 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a  nal lock states.
13ce0 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64 20  ** are inserted 
13cf0 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65  in between.  The
13d00 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66   locking might f
13d10 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68  ail on one of th
13d20 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73  e later.** trans
13d30 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74  itions leaving t
13d40 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69  he lock state di
13d50 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61  fferent from wha
13d60 74 20 69 74 20 73 74 61 72 74 65 64 20 62 75 74  t it started but
13d70 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20  .** still short 
13d80 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68  of its goal.  Th
13d90 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72  e following char
13da0 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f  t shows the allo
13db0 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  wed.** transitio
13dc0 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72  ns and the inser
13dd0 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65  ted intermediate
13de0 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20   states:.**.**  
13df0 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48    UNLOCKED -> SH
13e00 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  ARED.**    SHARE
13e10 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a  D -> RESERVED.**
13e20 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50      SHARED -> (P
13e30 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
13e40 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52  SIVE.**    RESER
13e50 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  VED -> (PENDING)
13e60 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
13e70 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45      PENDING -> E
13e80 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54  XCLUSIVE.**.** T
13e90 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
13ea0 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61   only increase a
13eb0 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20   lock.  Use the 
13ec0 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28  sqlite3OsUnlock(
13ed0 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20  ).** routine to 
13ee0 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20  lower a locking 
13ef0 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63  level..*/.static
13f00 20 69 6e 74 20 61 66 70 4c 6f 63 6b 28 73 71 6c   int afpLock(sql
13f10 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
13f20 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20  nt locktype){.  
13f30 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
13f40 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  OK;.  unixFile *
13f50 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
13f60 65 2a 29 69 64 3b 0a 20 20 61 66 70 4c 6f 63 6b  e*)id;.  afpLock
13f70 69 6e 67 43 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  ingContext *cont
13f80 65 78 74 20 3d 20 28 61 66 70 4c 6f 63 6b 69 6e  ext = (afpLockin
13f90 67 43 6f 6e 74 65 78 74 20 2a 29 20 70 46 69 6c  gContext *) pFil
13fa0 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
13fb0 74 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20  t;.  .  assert( 
13fc0 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41  pFile );.  OSTRA
13fd0 43 45 35 28 22 4c 4f 43 4b 20 20 20 20 25 64 20  CE5("LOCK    %d 
13fe0 25 73 20 77 61 73 20 25 73 20 70 69 64 3d 25 64  %s was %s pid=%d
13ff0 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20  \n", pFile->h,. 
14000 20 20 20 20 20 20 20 20 6c 6f 63 6b 74 79 70 65          locktype
14010 4e 61 6d 65 28 6c 6f 63 6b 74 79 70 65 29 2c 20  Name(locktype), 
14020 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28 70 46 69  locktypeName(pFi
14030 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 2c 20 67  le->locktype), g
14040 65 74 70 69 64 28 29 29 3b 0a 0a 20 20 2f 2a 20  etpid());..  /* 
14050 49 66 20 74 68 65 72 65 20 69 73 20 61 6c 72 65  If there is alre
14060 61 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20 74 68  ady a lock of th
14070 69 73 20 74 79 70 65 20 6f 72 20 6d 6f 72 65 20  is type or more 
14080 72 65 73 74 72 69 63 74 69 76 65 20 6f 6e 20 74  restrictive on t
14090 68 65 0a 20 20 2a 2a 20 75 6e 69 78 46 69 6c 65  he.  ** unixFile
140a0 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44 6f  , do nothing. Do
140b0 6e 27 74 20 75 73 65 20 74 68 65 20 61 66 70 5f  n't use the afp_
140c0 65 6e 64 5f 6c 6f 63 6b 3a 20 65 78 69 74 20 70  end_lock: exit p
140d0 61 74 68 2c 20 61 73 0a 20 20 2a 2a 20 75 6e 69  ath, as.  ** uni
140e0 78 45 6e 74 65 72 4d 75 74 65 78 28 29 20 68 61  xEnterMutex() ha
140f0 73 6e 27 74 20 62 65 65 6e 20 63 61 6c 6c 65 64  sn't been called
14100 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   yet..  */.  if(
14110 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
14120 3e 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20  >=locktype ){.  
14130 20 20 4f 53 54 52 41 43 45 33 28 22 4c 4f 43 4b    OSTRACE3("LOCK
14140 20 20 20 20 25 64 20 25 73 20 6f 6b 20 28 61 6c      %d %s ok (al
14150 72 65 61 64 79 20 68 65 6c 64 29 5c 6e 22 2c 20  ready held)\n", 
14160 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20  pFile->h,.      
14170 20 20 20 20 20 6c 6f 63 6b 74 79 70 65 4e 61 6d       locktypeNam
14180 65 28 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 20 20  e(locktype));.  
14190 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
141a0 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61  OK;.  }..  /* Ma
141b0 6b 65 20 73 75 72 65 20 74 68 65 20 6c 6f 63 6b  ke sure the lock
141c0 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73 20  ing sequence is 
141d0 63 6f 72 72 65 63 74 0a 20 20 2a 2f 0a 20 20 61  correct.  */.  a
141e0 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f  ssert( pFile->lo
141f0 63 6b 74 79 70 65 21 3d 4e 4f 5f 4c 4f 43 4b 20  cktype!=NO_LOCK 
14200 7c 7c 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41  || locktype==SHA
14210 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73  RED_LOCK );.  as
14220 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 21 3d  sert( locktype!=
14230 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a  PENDING_LOCK );.
14240 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79    assert( lockty
14250 70 65 21 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  pe!=RESERVED_LOC
14260 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  K || pFile->lock
14270 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  type==SHARED_LOC
14280 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 54 68 69  K );.  .  /* Thi
14290 73 20 6d 75 74 65 78 20 69 73 20 6e 65 65 64 65  s mutex is neede
142a0 64 20 62 65 63 61 75 73 65 20 70 46 69 6c 65 2d  d because pFile-
142b0 3e 70 4c 6f 63 6b 20 69 73 20 73 68 61 72 65 64  >pLock is shared
142c0 20 61 63 72 6f 73 73 20 74 68 72 65 61 64 73 0a   across threads.
142d0 20 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72    */.  unixEnter
142e0 4d 75 74 65 78 28 29 3b 0a 0a 20 20 2f 2a 20 4d  Mutex();..  /* M
142f0 61 6b 65 20 73 75 72 65 20 74 68 65 20 63 75 72  ake sure the cur
14300 72 65 6e 74 20 74 68 72 65 61 64 20 6f 77 6e 73  rent thread owns
14310 20 74 68 65 20 70 46 69 6c 65 2e 0a 20 20 2a 2f   the pFile..  */
14320 0a 20 20 72 63 20 3d 20 74 72 61 6e 73 66 65 72  .  rc = transfer
14330 4f 77 6e 65 72 73 68 69 70 28 70 46 69 6c 65 29  Ownership(pFile)
14340 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
14350 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 75 6e 69  TE_OK ){.    uni
14360 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  xLeaveMutex();. 
14370 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
14380 7d 0a 20 20 20 20 0a 20 20 2f 2a 20 41 20 50 45  }.    .  /* A PE
14390 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 6e 65  NDING lock is ne
143a0 65 64 65 64 20 62 65 66 6f 72 65 20 61 63 71 75  eded before acqu
143b0 69 72 69 6e 67 20 61 20 53 48 41 52 45 44 20 6c  iring a SHARED l
143c0 6f 63 6b 20 61 6e 64 20 62 65 66 6f 72 65 0a 20  ock and before. 
143d0 20 2a 2a 20 61 63 71 75 69 72 69 6e 67 20 61 6e   ** acquiring an
143e0 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
143f0 20 20 46 6f 72 20 74 68 65 20 53 48 41 52 45 44    For the SHARED
14400 20 6c 6f 63 6b 2c 20 74 68 65 20 50 45 4e 44 49   lock, the PENDI
14410 4e 47 20 77 69 6c 6c 0a 20 20 2a 2a 20 62 65 20  NG will.  ** be 
14420 72 65 6c 65 61 73 65 64 2e 0a 20 20 2a 2f 0a 20  released..  */. 
14430 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53   if( locktype==S
14440 48 41 52 45 44 5f 4c 4f 43 4b 20 0a 20 20 20 20  HARED_LOCK .    
14450 20 20 7c 7c 20 28 6c 6f 63 6b 74 79 70 65 3d 3d    || (locktype==
14460 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26  EXCLUSIVE_LOCK &
14470 26 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  & pFile->locktyp
14480 65 3c 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 29 0a  e<PENDING_LOCK).
14490 20 20 29 7b 0a 20 20 20 20 69 6e 74 20 66 61 69    ){.    int fai
144a0 6c 65 64 3b 0a 20 20 20 20 66 61 69 6c 65 64 20  led;.    failed 
144b0 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e  = afpSetLock(con
144c0 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46  text->dbPath, pF
144d0 69 6c 65 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54  ile, PENDING_BYT
144e0 45 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 69 66  E, 1, 1);.    if
144f0 20 28 66 61 69 6c 65 64 29 20 7b 0a 20 20 20 20   (failed) {.    
14500 20 20 72 63 20 3d 20 66 61 69 6c 65 64 3b 0a 20    rc = failed;. 
14510 20 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e       goto afp_en
14520 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20  d_lock;.    }.  
14530 7d 0a 20 20 0a 20 20 2f 2a 20 49 66 20 63 6f 6e  }.  .  /* If con
14540 74 72 6f 6c 20 67 65 74 73 20 74 6f 20 74 68 69  trol gets to thi
14550 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 61 63  s point, then ac
14560 74 75 61 6c 6c 79 20 67 6f 20 61 68 65 61 64 20  tually go ahead 
14570 61 6e 64 20 6d 61 6b 65 0a 20 20 2a 2a 20 6f 70  and make.  ** op
14580 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 63  erating system c
14590 61 6c 6c 73 20 66 6f 72 20 74 68 65 20 73 70 65  alls for the spe
145a0 63 69 66 69 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a  cified lock..  *
145b0 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65  /.  if( locktype
145c0 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b  ==SHARED_LOCK ){
145d0 0a 20 20 20 20 69 6e 74 20 6c 6b 2c 20 6c 72 63  .    int lk, lrc
145e0 31 2c 20 6c 72 63 32 2c 20 6c 72 63 31 45 72 72  1, lrc2, lrc1Err
145f0 6e 6f 3b 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20  no;.    .    /* 
14600 4e 6f 77 20 67 65 74 20 74 68 65 20 72 65 61 64  Now get the read
14610 2d 6c 6f 63 6b 20 53 48 41 52 45 44 5f 4c 4f 43  -lock SHARED_LOC
14620 4b 20 2a 2f 0a 20 20 20 20 2f 2a 20 6e 6f 74 65  K */.    /* note
14630 20 74 68 61 74 20 74 68 65 20 71 75 61 6c 69 74   that the qualit
14640 79 20 6f 66 20 74 68 65 20 72 61 6e 64 6f 6d 6e  y of the randomn
14650 65 73 73 20 64 6f 65 73 6e 27 74 20 6d 61 74 74  ess doesn't matt
14660 65 72 20 74 68 61 74 20 6d 75 63 68 20 2a 2f 0a  er that much */.
14670 20 20 20 20 6c 6b 20 3d 20 72 61 6e 64 6f 6d 28      lk = random(
14680 29 3b 20 0a 20 20 20 20 63 6f 6e 74 65 78 74 2d  ); .    context-
14690 3e 73 68 61 72 65 64 42 79 74 65 20 3d 20 28 6c  >sharedByte = (l
146a0 6b 20 26 20 30 78 37 66 66 66 66 66 66 66 29 25  k & 0x7fffffff)%
146b0 28 53 48 41 52 45 44 5f 53 49 5a 45 20 2d 20 31  (SHARED_SIZE - 1
146c0 29 3b 0a 20 20 20 20 6c 72 63 31 20 3d 20 61 66  );.    lrc1 = af
146d0 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  pSetLock(context
146e0 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
146f0 20 0a 20 20 20 20 20 20 20 20 20 20 53 48 41 52   .          SHAR
14700 45 44 5f 46 49 52 53 54 2b 63 6f 6e 74 65 78 74  ED_FIRST+context
14710 2d 3e 73 68 61 72 65 64 42 79 74 65 2c 20 31 2c  ->sharedByte, 1,
14720 20 31 29 3b 0a 20 20 20 20 69 66 28 20 49 53 5f   1);.    if( IS_
14730 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 31 29  LOCK_ERROR(lrc1)
14740 20 29 7b 0a 20 20 20 20 20 20 6c 72 63 31 45 72   ){.      lrc1Er
14750 72 6e 6f 20 3d 20 70 46 69 6c 65 2d 3e 6c 61 73  rno = pFile->las
14760 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20  tErrno;.    }.  
14770 20 20 2f 2a 20 44 72 6f 70 20 74 68 65 20 74 65    /* Drop the te
14780 6d 70 6f 72 61 72 79 20 50 45 4e 44 49 4e 47 20  mporary PENDING 
14790 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c 72 63 32  lock */.    lrc2
147a0 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f   = afpSetLock(co
147b0 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70  ntext->dbPath, p
147c0 46 69 6c 65 2c 20 50 45 4e 44 49 4e 47 5f 42 59  File, PENDING_BY
147d0 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 0a  TE, 1, 0);.    .
147e0 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
147f0 45 52 52 4f 52 28 6c 72 63 31 29 20 29 20 7b 0a  ERROR(lrc1) ) {.
14800 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
14810 74 45 72 72 6e 6f 20 3d 20 6c 72 63 31 45 72 72  tErrno = lrc1Err
14820 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6c  no;.      rc = l
14830 72 63 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  rc1;.      goto 
14840 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20  afp_end_lock;.  
14850 20 20 7d 20 65 6c 73 65 20 69 66 28 20 49 53 5f    } else if( IS_
14860 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 32 29  LOCK_ERROR(lrc2)
14870 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6c   ){.      rc = l
14880 72 63 32 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  rc2;.      goto 
14890 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20  afp_end_lock;.  
148a0 20 20 7d 20 65 6c 73 65 20 69 66 28 20 6c 72 63    } else if( lrc
148b0 31 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 29  1 != SQLITE_OK )
148c0 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 72   {.      rc = lr
148d0 63 31 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  c1;.    } else {
148e0 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f  .      pFile->lo
148f0 63 6b 74 79 70 65 20 3d 20 53 48 41 52 45 44 5f  cktype = SHARED_
14900 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 70 46 69 6c  LOCK;.      pFil
14910 65 2d 3e 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 2b  e->pOpen->nLock+
14920 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  +;.    }.  }else
14930 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71  {.    /* The req
14940 75 65 73 74 20 77 61 73 20 66 6f 72 20 61 20 52  uest was for a R
14950 45 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55  ESERVED or EXCLU
14960 53 49 56 45 20 6c 6f 63 6b 2e 20 20 49 74 20 69  SIVE lock.  It i
14970 73 0a 20 20 20 20 2a 2a 20 61 73 73 75 6d 65 64  s.    ** assumed
14980 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20 61   that there is a
14990 20 53 48 41 52 45 44 20 6f 72 20 67 72 65 61 74   SHARED or great
149a0 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66  er lock on the f
149b0 69 6c 65 0a 20 20 20 20 2a 2a 20 61 6c 72 65 61  ile.    ** alrea
149c0 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  dy..    */.    i
149d0 6e 74 20 66 61 69 6c 65 64 20 3d 20 30 3b 0a 20  nt failed = 0;. 
149e0 20 20 20 61 73 73 65 72 74 28 20 30 21 3d 70 46     assert( 0!=pF
149f0 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 29 3b  ile->locktype );
14a00 0a 20 20 20 20 69 66 20 28 6c 6f 63 6b 74 79 70  .    if (locktyp
14a10 65 20 3e 3d 20 52 45 53 45 52 56 45 44 5f 4c 4f  e >= RESERVED_LO
14a20 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e 6c 6f 63  CK && pFile->loc
14a30 6b 74 79 70 65 20 3c 20 52 45 53 45 52 56 45 44  ktype < RESERVED
14a40 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 20 20 20  _LOCK) {.       
14a50 20 2f 2a 20 41 63 71 75 69 72 65 20 61 20 52 45   /* Acquire a RE
14a60 53 45 52 56 45 44 20 6c 6f 63 6b 20 2a 2f 0a 20  SERVED lock */. 
14a70 20 20 20 20 20 20 20 66 61 69 6c 65 64 20 3d 20         failed = 
14a80 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  afpSetLock(conte
14a90 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  xt->dbPath, pFil
14aa0 65 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45  e, RESERVED_BYTE
14ab0 2c 20 31 2c 31 29 3b 0a 20 20 20 20 7d 0a 20 20  , 1,1);.    }.  
14ac0 20 20 69 66 20 28 21 66 61 69 6c 65 64 20 26 26    if (!failed &&
14ad0 20 6c 6f 63 6b 74 79 70 65 20 3d 3d 20 45 58 43   locktype == EXC
14ae0 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 20 7b 0a 20  LUSIVE_LOCK) {. 
14af0 20 20 20 20 20 2f 2a 20 41 63 71 75 69 72 65 20       /* Acquire 
14b00 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
14b10 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 0a 20 20  k */.        .  
14b20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68      /* Remove th
14b30 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 62 65  e shared lock be
14b40 66 6f 72 65 20 74 72 79 69 6e 67 20 74 68 65 20  fore trying the 
14b50 72 61 6e 67 65 2e 20 20 77 65 27 6c 6c 20 6e 65  range.  we'll ne
14b60 65 64 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20  ed to .      ** 
14b70 72 65 65 73 74 61 62 6c 69 73 68 20 74 68 65 20  reestablish the 
14b80 73 68 61 72 65 64 20 6c 6f 63 6b 20 69 66 20 77  shared lock if w
14b90 65 20 63 61 6e 27 74 20 67 65 74 20 74 68 65 20  e can't get the 
14ba0 20 61 66 70 55 6e 6c 6f 63 6b 0a 20 20 20 20 20   afpUnlock.     
14bb0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21 28   */.      if( !(
14bc0 66 61 69 6c 65 64 20 3d 20 61 66 70 53 65 74 4c  failed = afpSetL
14bd0 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50  ock(context->dbP
14be0 61 74 68 2c 20 70 46 69 6c 65 2c 20 53 48 41 52  ath, pFile, SHAR
14bf0 45 44 5f 46 49 52 53 54 20 2b 0a 20 20 20 20 20  ED_FIRST +.     
14c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c10 20 20 20 20 63 6f 6e 74 65 78 74 2d 3e 73 68 61      context->sha
14c20 72 65 64 42 79 74 65 2c 20 31 2c 20 30 29 29 20  redByte, 1, 0)) 
14c30 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 66  ){.        int f
14c40 61 69 6c 65 64 32 20 3d 20 53 51 4c 49 54 45 5f  ailed2 = SQLITE_
14c50 4f 4b 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 6e  OK;.        /* n
14c60 6f 77 20 61 74 74 65 6d 6d 70 74 20 74 6f 20 67  ow attemmpt to g
14c70 65 74 20 74 68 65 20 65 78 63 6c 75 73 69 76 65  et the exclusive
14c80 20 6c 6f 63 6b 20 72 61 6e 67 65 20 2a 2f 0a 20   lock range */. 
14c90 20 20 20 20 20 20 20 66 61 69 6c 65 64 20 3d 20         failed = 
14ca0 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  afpSetLock(conte
14cb0 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  xt->dbPath, pFil
14cc0 65 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c  e, SHARED_FIRST,
14cd0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
14ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14cf0 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 31 29   SHARED_SIZE, 1)
14d00 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 66 61  ;.        if( fa
14d10 69 6c 65 64 20 26 26 20 28 66 61 69 6c 65 64 32  iled && (failed2
14d20 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f   = afpSetLock(co
14d30 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70  ntext->dbPath, p
14d40 46 69 6c 65 2c 20 0a 20 20 20 20 20 20 20 20 20  File, .         
14d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 48                SH
14d60 41 52 45 44 5f 46 49 52 53 54 20 2b 20 63 6f 6e  ARED_FIRST + con
14d70 74 65 78 74 2d 3e 73 68 61 72 65 64 42 79 74 65  text->sharedByte
14d80 2c 20 31 2c 20 31 29 29 20 29 7b 0a 20 20 20 20  , 1, 1)) ){.    
14d90 20 20 20 20 20 20 2f 2a 20 43 61 6e 27 74 20 72        /* Can't r
14da0 65 65 73 74 61 62 6c 69 73 68 20 74 68 65 20 73  eestablish the s
14db0 68 61 72 65 64 20 6c 6f 63 6b 2e 20 20 53 71 6c  hared lock.  Sql
14dc0 69 74 65 20 63 61 6e 27 74 20 64 65 61 6c 2c 20  ite can't deal, 
14dd0 74 68 69 73 20 69 73 0a 20 20 20 20 20 20 20 20  this is.        
14de0 20 20 2a 2a 20 61 20 63 72 69 74 69 63 61 6c 20    ** a critical 
14df0 49 2f 4f 20 65 72 72 6f 72 0a 20 20 20 20 20 20  I/O error.      
14e00 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
14e10 20 72 63 20 3d 20 28 28 66 61 69 6c 65 64 20 26   rc = ((failed &
14e20 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 20 3d   SQLITE_IOERR) =
14e30 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 20  = SQLITE_IOERR) 
14e40 3f 20 66 61 69 6c 65 64 32 20 3a 20 0a 20 20 20  ? failed2 : .   
14e50 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
14e60 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20  TE_IOERR_LOCK;. 
14e70 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 61 66           goto af
14e80 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20  p_end_lock;.    
14e90 20 20 20 20 7d 20 0a 20 20 20 20 20 20 7d 65 6c      } .      }el
14ea0 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  se{.        rc =
14eb0 20 66 61 69 6c 65 64 3b 20 0a 20 20 20 20 20 20   failed; .      
14ec0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
14ed0 66 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20  failed ){.      
14ee0 72 63 20 3d 20 66 61 69 6c 65 64 3b 0a 20 20 20  rc = failed;.   
14ef0 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 69 66 28 20   }.  }.  .  if( 
14f00 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
14f10 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  .    pFile->lock
14f20 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b  type = locktype;
14f30 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63  .  }else if( loc
14f40 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45  ktype==EXCLUSIVE
14f50 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46 69  _LOCK ){.    pFi
14f60 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 50  le->locktype = P
14f70 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 7d  ENDING_LOCK;.  }
14f80 0a 20 20 0a 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b  .  .afp_end_lock
14f90 3a 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74  :.  unixLeaveMut
14fa0 65 78 28 29 3b 0a 20 20 4f 53 54 52 41 43 45 34  ex();.  OSTRACE4
14fb0 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20  ("LOCK    %d %s 
14fc0 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  %s\n", pFile->h,
14fd0 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28 6c 6f   locktypeName(lo
14fe0 63 6b 74 79 70 65 29 2c 20 0a 20 20 20 20 20 20  cktype), .      
14ff0 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b     rc==SQLITE_OK
15000 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65   ? "ok" : "faile
15010 64 22 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  d");.  return rc
15020 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72  ;.}../*.** Lower
15030 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
15040 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72  el on file descr
15050 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 6c  iptor pFile to l
15060 6f 63 6b 74 79 70 65 2e 20 20 6c 6f 63 6b 74 79  ocktype.  lockty
15070 70 65 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69  pe.** must be ei
15080 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20  ther NO_LOCK or 
15090 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a  SHARED_LOCK..**.
150a0 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e  ** If the lockin
150b0 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66  g level of the f
150c0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
150d0 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20  s already at or 
150e0 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71  below.** the req
150f0 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c  uested locking l
15100 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69  evel, this routi
15110 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
15120 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66 70  /.static int afp
15130 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  Unlock(sqlite3_f
15140 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63  ile *id, int loc
15150 6b 74 79 70 65 29 20 7b 0a 20 20 69 6e 74 20 72  ktype) {.  int r
15160 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
15170 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
15180 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
15190 3b 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f  ;.  afpLockingCo
151a0 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20 28 61  ntext *pCtx = (a
151b0 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
151c0 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69   *) pFile->locki
151d0 6e 67 43 6f 6e 74 65 78 74 3b 0a 0a 20 20 61 73  ngContext;..  as
151e0 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
151f0 20 4f 53 54 52 41 43 45 35 28 22 55 4e 4c 4f 43   OSTRACE5("UNLOC
15200 4b 20 20 25 64 20 25 64 20 77 61 73 20 25 64 20  K  %d %d was %d 
15210 70 69 64 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65  pid=%d\n", pFile
15220 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70 65 2c 0a 20  ->h, locktype,. 
15230 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c          pFile->l
15240 6f 63 6b 74 79 70 65 2c 20 67 65 74 70 69 64 28  ocktype, getpid(
15250 29 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6c  ));..  assert( l
15260 6f 63 6b 74 79 70 65 3c 3d 53 48 41 52 45 44 5f  ocktype<=SHARED_
15270 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70 46  LOCK );.  if( pF
15280 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3c 3d 6c  ile->locktype<=l
15290 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 72  ocktype ){.    r
152a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
152b0 0a 20 20 7d 0a 20 20 69 66 28 20 43 48 45 43 4b  .  }.  if( CHECK
152c0 5f 54 48 52 45 41 44 49 44 28 70 46 69 6c 65 29  _THREADID(pFile)
152d0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
152e0 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20  QLITE_MISUSE;.  
152f0 7d 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74  }.  unixEnterMut
15300 65 78 28 29 3b 0a 20 20 69 66 28 20 70 46 69 6c  ex();.  if( pFil
15310 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 53 48 41 52  e->locktype>SHAR
15320 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 0a  ED_LOCK ){.    .
15330 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c      if( pFile->l
15340 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53 49  ocktype==EXCLUSI
15350 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20  VE_LOCK ){.     
15360 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b   rc = afpSetLock
15370 28 70 43 74 78 2d 3e 64 62 50 61 74 68 2c 20 70  (pCtx->dbPath, p
15380 46 69 6c 65 2c 20 53 48 41 52 45 44 5f 46 49 52  File, SHARED_FIR
15390 53 54 2c 20 53 48 41 52 45 44 5f 53 49 5a 45 2c  ST, SHARED_SIZE,
153a0 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   0);.      if( r
153b0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
153c0 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44  locktype==SHARED
153d0 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 20  _LOCK ){.       
153e0 20 2f 2a 20 6f 6e 6c 79 20 72 65 2d 65 73 74 61   /* only re-esta
153f0 62 6c 69 73 68 20 74 68 65 20 73 68 61 72 65 64  blish the shared
15400 20 6c 6f 63 6b 20 69 66 20 6e 65 63 65 73 73 61   lock if necessa
15410 72 79 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  ry */.        in
15420 74 20 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65  t sharedLockByte
15430 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b   = SHARED_FIRST+
15440 70 43 74 78 2d 3e 73 68 61 72 65 64 42 79 74 65  pCtx->sharedByte
15450 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61  ;.        rc = a
15460 66 70 53 65 74 4c 6f 63 6b 28 70 43 74 78 2d 3e  fpSetLock(pCtx->
15470 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 73  dbPath, pFile, s
15480 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 31  haredLockByte, 1
15490 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 1);.      }.  
154a0 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
154b0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 46 69  SQLITE_OK && pFi
154c0 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 50 45  le->locktype>=PE
154d0 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 7b 0a 20 20  NDING_LOCK ){.  
154e0 20 20 20 20 72 63 20 3d 20 61 66 70 53 65 74 4c      rc = afpSetL
154f0 6f 63 6b 28 70 43 74 78 2d 3e 64 62 50 61 74 68  ock(pCtx->dbPath
15500 2c 20 70 46 69 6c 65 2c 20 50 45 4e 44 49 4e 47  , pFile, PENDING
15510 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20  _BYTE, 1, 0);.  
15520 20 20 7d 20 0a 20 20 20 20 69 66 28 20 72 63 3d    } .    if( rc=
15530 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 46  =SQLITE_OK && pF
15540 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 52  ile->locktype>=R
15550 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a  ESERVED_LOCK ){.
15560 20 20 20 20 20 20 72 63 20 3d 20 61 66 70 53 65        rc = afpSe
15570 74 4c 6f 63 6b 28 70 43 74 78 2d 3e 64 62 50 61  tLock(pCtx->dbPa
15580 74 68 2c 20 70 46 69 6c 65 2c 20 52 45 53 45 52  th, pFile, RESER
15590 56 45 44 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b  VED_BYTE, 1, 0);
155a0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
155b0 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f  f( locktype==NO_
155c0 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 63  LOCK ){.    /* c
155d0 6c 65 61 72 20 74 68 65 20 73 68 61 72 65 64 20  lear the shared 
155e0 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 69 6e 74 20  lock */.    int 
155f0 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 20 3d  sharedLockByte =
15600 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b 70 43   SHARED_FIRST+pC
15610 74 78 2d 3e 73 68 61 72 65 64 42 79 74 65 3b 0a  tx->sharedByte;.
15620 20 20 20 20 72 63 20 3d 20 61 66 70 53 65 74 4c      rc = afpSetL
15630 6f 63 6b 28 70 43 74 78 2d 3e 64 62 50 61 74 68  ock(pCtx->dbPath
15640 2c 20 70 46 69 6c 65 2c 20 73 68 61 72 65 64 4c  , pFile, sharedL
15650 6f 63 6b 42 79 74 65 2c 20 31 2c 20 30 29 3b 0a  ockByte, 1, 0);.
15660 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53    }..  if( rc==S
15670 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
15680 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f  if( locktype==NO
15690 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 73  _LOCK ){.      s
156a0 74 72 75 63 74 20 75 6e 69 78 4f 70 65 6e 43 6e  truct unixOpenCn
156b0 74 20 2a 70 4f 70 65 6e 20 3d 20 70 46 69 6c 65  t *pOpen = pFile
156c0 2d 3e 70 4f 70 65 6e 3b 0a 20 20 20 20 20 20 70  ->pOpen;.      p
156d0 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 2d 2d 3b 0a 20  Open->nLock--;. 
156e0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70       assert( pOp
156f0 65 6e 2d 3e 6e 4c 6f 63 6b 3e 3d 30 20 29 3b 0a  en->nLock>=0 );.
15700 20 20 20 20 20 20 69 66 28 20 70 4f 70 65 6e 2d        if( pOpen-
15710 3e 6e 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20  >nLock==0 ){.   
15720 20 20 20 20 20 72 63 20 3d 20 63 6c 6f 73 65 50       rc = closeP
15730 65 6e 64 69 6e 67 46 64 73 28 70 46 69 6c 65 29  endingFds(pFile)
15740 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
15750 20 20 7d 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d    }.  unixLeaveM
15760 75 74 65 78 28 29 3b 0a 20 20 69 66 28 20 72 63  utex();.  if( rc
15770 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
15780 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79     pFile->lockty
15790 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20  pe = locktype;. 
157a0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
157b0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
157c0 20 66 69 6c 65 20 26 20 63 6c 65 61 6e 75 70 20   file & cleanup 
157d0 41 46 50 20 73 70 65 63 69 66 69 63 20 6c 6f 63  AFP specific loc
157e0 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 0a 2a 2f  king context .*/
157f0 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66 70 43  .static int afpC
15800 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  lose(sqlite3_fil
15810 65 20 2a 69 64 29 20 7b 0a 20 20 69 66 28 20 69  e *id) {.  if( i
15820 64 20 29 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c  d ){.    unixFil
15830 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
15840 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20 61 66  File*)id;.    af
15850 70 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c  pUnlock(id, NO_L
15860 4f 43 4b 29 3b 0a 20 20 20 20 75 6e 69 78 45 6e  OCK);.    unixEn
15870 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20  terMutex();.    
15880 69 66 28 20 70 46 69 6c 65 2d 3e 70 4f 70 65 6e  if( pFile->pOpen
15890 20 26 26 20 70 46 69 6c 65 2d 3e 70 4f 70 65 6e   && pFile->pOpen
158a0 2d 3e 6e 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20  ->nLock ){.     
158b0 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
158c0 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63   outstanding loc
158d0 6b 73 2c 20 64 6f 20 6e 6f 74 20 61 63 74 75 61  ks, do not actua
158e0 6c 6c 79 20 63 6c 6f 73 65 20 74 68 65 20 66 69  lly close the fi
158f0 6c 65 20 6a 75 73 74 0a 20 20 20 20 20 20 2a 2a  le just.      **
15900 20 79 65 74 20 62 65 63 61 75 73 65 20 74 68 61   yet because tha
15910 74 20 77 6f 75 6c 64 20 63 6c 65 61 72 20 74 68  t would clear th
15920 6f 73 65 20 6c 6f 63 6b 73 2e 20 20 49 6e 73 74  ose locks.  Inst
15930 65 61 64 2c 20 61 64 64 20 74 68 65 20 66 69 6c  ead, add the fil
15940 65 0a 20 20 20 20 20 20 2a 2a 20 64 65 73 63 72  e.      ** descr
15950 69 70 74 6f 72 20 74 6f 20 70 4f 70 65 6e 2d 3e  iptor to pOpen->
15960 61 50 65 6e 64 69 6e 67 2e 20 20 49 74 20 77 69  aPending.  It wi
15970 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74 69 63 61  ll be automatica
15980 6c 6c 79 20 63 6c 6f 73 65 64 20 77 68 65 6e 0a  lly closed when.
15990 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6c 61 73        ** the las
159a0 74 20 6c 6f 63 6b 20 69 73 20 63 6c 65 61 72 65  t lock is cleare
159b0 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
159c0 20 20 73 65 74 50 65 6e 64 69 6e 67 46 64 28 70    setPendingFd(p
159d0 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  File);.    }.   
159e0 20 72 65 6c 65 61 73 65 4f 70 65 6e 43 6e 74 28   releaseOpenCnt(
159f0 70 46 69 6c 65 2d 3e 70 4f 70 65 6e 29 3b 0a 20  pFile->pOpen);. 
15a00 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
15a10 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
15a20 6e 74 65 78 74 29 3b 0a 20 20 20 20 63 6c 6f 73  ntext);.    clos
15a30 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 20  eUnixFile(id);. 
15a40 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65     unixLeaveMute
15a50 78 28 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  x();.  }.  retur
15a60 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
15a70 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65  #endif /* define
15a80 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20  d(__APPLE__) && 
15a90 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
15aa0 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 2f  CKING_STYLE */./
15ab0 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 61 62  *.** The code ab
15ac0 6f 76 65 20 69 73 20 74 68 65 20 41 46 50 20 6c  ove is the AFP l
15ad0 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ock implementati
15ae0 6f 6e 2e 20 20 54 68 65 20 63 6f 64 65 20 69 73  on.  The code is
15af0 20 73 70 65 63 69 66 69 63 0a 2a 2a 20 74 6f 20   specific.** to 
15b00 4d 61 63 4f 53 58 20 61 6e 64 20 64 6f 65 73 20  MacOSX and does 
15b10 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 6f 74 68 65  not work on othe
15b20 72 20 75 6e 69 78 20 70 6c 61 74 66 6f 72 6d 73  r unix platforms
15b30 2e 20 20 4e 6f 20 61 6c 74 65 72 6e 61 74 69 76  .  No alternativ
15b40 65 0a 2a 2a 20 69 73 20 61 76 61 69 6c 61 62 6c  e.** is availabl
15b50 65 2e 20 20 49 66 20 79 6f 75 20 64 6f 6e 27 74  e.  If you don't
15b60 20 63 6f 6d 70 69 6c 65 20 66 6f 72 20 61 20 6d   compile for a m
15b70 61 63 2c 20 74 68 65 6e 20 74 68 65 20 22 75 6e  ac, then the "un
15b80 69 78 2d 61 66 70 22 0a 2a 2a 20 56 46 53 20 69  ix-afp".** VFS i
15b90 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e  s not available.
15ba0 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .**.************
15bb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66  ********* End of
15bc0 20 74 68 65 20 41 46 50 20 6c 6f 63 6b 20 69 6d   the AFP lock im
15bd0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a  plementation ***
15be0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15bf0 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
15c00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15c10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15c20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15c30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15c40 2a 2a 2f 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  **/.../*********
15c50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15c60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15c70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15c80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15c90 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
15ca0 2a 2a 2a 2a 2a 2a 20 4e 6f 6e 2d 6c 6f 63 6b 69  ****** Non-locki
15cb0 6e 67 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ng sqlite3_file 
15cc0 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a  methods ********
15cd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15ce0 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20  *****.**.** The 
15cf0 6e 65 78 74 20 64 69 76 69 73 69 6f 6e 20 63 6f  next division co
15d00 6e 74 61 69 6e 73 20 69 6d 70 6c 65 6d 65 6e 74  ntains implement
15d10 61 74 69 6f 6e 73 20 66 6f 72 20 61 6c 6c 20 6d  ations for all m
15d20 65 74 68 6f 64 73 20 6f 66 20 74 68 65 20 0a 2a  ethods of the .*
15d30 2a 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 6f  * sqlite3_file o
15d40 62 6a 65 63 74 20 6f 74 68 65 72 20 74 68 61 6e  bject other than
15d50 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74   the locking met
15d60 68 6f 64 73 2e 20 20 54 68 65 20 6c 6f 63 6b 69  hods.  The locki
15d70 6e 67 0a 2a 2a 20 6d 65 74 68 6f 64 73 20 77 65  ng.** methods we
15d80 72 65 20 64 65 66 69 6e 65 64 20 69 6e 20 64 69  re defined in di
15d90 76 69 73 69 6f 6e 73 20 61 62 6f 76 65 20 28 6f  visions above (o
15da0 6e 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f  ne locking metho
15db0 64 20 70 65 72 0a 2a 2a 20 64 69 76 69 73 69 6f  d per.** divisio
15dc0 6e 29 2e 20 20 54 68 6f 73 65 20 6d 65 74 68 6f  n).  Those metho
15dd0 64 73 20 74 68 61 74 20 61 72 65 20 63 6f 6d 6d  ds that are comm
15de0 6f 6e 20 74 6f 20 61 6c 6c 20 6c 6f 63 6b 69 6e  on to all lockin
15df0 67 20 6d 6f 64 65 73 0a 2a 2a 20 61 72 65 20 67  g modes.** are g
15e00 61 74 68 65 72 20 74 6f 67 65 74 68 65 72 20 69  ather together i
15e10 6e 74 6f 20 74 68 69 73 20 64 69 76 69 73 69 6f  nto this divisio
15e20 6e 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 65  n..*/../*.** See
15e30 6b 20 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20  k to the offset 
15e40 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
15e50 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 20 74  cond argument, t
15e60 68 65 6e 20 72 65 61 64 20 63 6e 74 20 0a 2a 2a  hen read cnt .**
15e70 20 62 79 74 65 73 20 69 6e 74 6f 20 70 42 75 66   bytes into pBuf
15e80 2e 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  . Return the num
15e90 62 65 72 20 6f 66 20 62 79 74 65 73 20 61 63 74  ber of bytes act
15ea0 75 61 6c 6c 79 20 72 65 61 64 2e 0a 2a 2a 0a 2a  ually read..**.*
15eb0 2a 20 4e 42 3a 20 20 49 66 20 79 6f 75 20 64 65  * NB:  If you de
15ec0 66 69 6e 65 20 55 53 45 5f 50 52 45 41 44 20 6f  fine USE_PREAD o
15ed0 72 20 55 53 45 5f 50 52 45 41 44 36 34 2c 20 74  r USE_PREAD64, t
15ee0 68 65 6e 20 69 74 20 6d 69 67 68 74 20 61 6c 73  hen it might als
15ef0 6f 0a 2a 2a 20 62 65 20 6e 65 63 65 73 73 61 72  o.** be necessar
15f00 79 20 74 6f 20 64 65 66 69 6e 65 20 5f 58 4f 50  y to define _XOP
15f10 45 4e 5f 53 4f 55 52 43 45 20 74 6f 20 62 65 20  EN_SOURCE to be 
15f20 35 30 30 2e 20 20 54 68 69 73 20 76 61 72 69 65  500.  This varie
15f30 73 20 66 72 6f 6d 0a 2a 2a 20 6f 6e 65 20 73 79  s from.** one sy
15f40 73 74 65 6d 20 74 6f 20 61 6e 6f 74 68 65 72 2e  stem to another.
15f50 20 20 53 69 6e 63 65 20 53 51 4c 69 74 65 20 64    Since SQLite d
15f60 6f 65 73 20 6e 6f 74 20 64 65 66 69 6e 65 20 55  oes not define U
15f70 53 45 5f 50 52 45 41 44 0a 2a 2a 20 61 6e 79 20  SE_PREAD.** any 
15f80 61 6e 79 20 66 6f 72 6d 20 62 79 20 64 65 66 61  any form by defa
15f90 75 6c 74 2c 20 77 65 20 77 69 6c 6c 20 6e 6f 74  ult, we will not
15fa0 20 61 74 74 65 6d 70 74 20 74 6f 20 64 65 66 69   attempt to defi
15fb0 6e 65 20 5f 58 4f 50 45 4e 5f 53 4f 55 52 43 45  ne _XOPEN_SOURCE
15fc0 2e 0a 2a 2a 20 53 65 65 20 74 69 63 6b 65 74 73  ..** See tickets
15fd0 20 23 32 37 34 31 20 61 6e 64 20 23 32 36 38 31   #2741 and #2681
15fe0 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 76 6f 69 64  ..**.** To avoid
15ff0 20 73 74 6f 6d 70 69 6e 67 20 74 68 65 20 65 72   stomping the er
16000 72 6e 6f 20 76 61 6c 75 65 20 6f 6e 20 61 20 66  rno value on a f
16010 61 69 6c 65 64 20 72 65 61 64 20 74 68 65 20 6c  ailed read the l
16020 61 73 74 45 72 72 6e 6f 20 76 61 6c 75 65 0a 2a  astErrno value.*
16030 2a 20 69 73 20 73 65 74 20 62 65 66 6f 72 65 20  * is set before 
16040 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74  returning..*/.st
16050 61 74 69 63 20 69 6e 74 20 73 65 65 6b 41 6e 64  atic int seekAnd
16060 52 65 61 64 28 75 6e 69 78 46 69 6c 65 20 2a 69  Read(unixFile *i
16070 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  d, sqlite3_int64
16080 20 6f 66 66 73 65 74 2c 20 76 6f 69 64 20 2a 70   offset, void *p
16090 42 75 66 2c 20 69 6e 74 20 63 6e 74 29 7b 0a 20  Buf, int cnt){. 
160a0 20 69 6e 74 20 67 6f 74 3b 0a 20 20 69 36 34 20   int got;.  i64 
160b0 6e 65 77 4f 66 66 73 65 74 3b 0a 20 20 54 49 4d  newOffset;.  TIM
160c0 45 52 5f 53 54 41 52 54 3b 0a 23 69 66 20 64 65  ER_START;.#if de
160d0 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29  fined(USE_PREAD)
160e0 0a 20 20 67 6f 74 20 3d 20 70 72 65 61 64 28 69  .  got = pread(i
160f0 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 2c  d->h, pBuf, cnt,
16100 20 6f 66 66 73 65 74 29 3b 0a 20 20 53 69 6d 75   offset);.  Simu
16110 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 67 6f 74  lateIOError( got
16120 20 3d 20 2d 31 20 29 3b 0a 23 65 6c 69 66 20 64   = -1 );.#elif d
16130 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44  efined(USE_PREAD
16140 36 34 29 0a 20 20 67 6f 74 20 3d 20 70 72 65 61  64).  got = prea
16150 64 36 34 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c  d64(id->h, pBuf,
16160 20 63 6e 74 2c 20 6f 66 66 73 65 74 29 3b 0a 20   cnt, offset);. 
16170 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
16180 28 20 67 6f 74 20 3d 20 2d 31 20 29 3b 0a 23 65  ( got = -1 );.#e
16190 6c 73 65 0a 20 20 6e 65 77 4f 66 66 73 65 74 20  lse.  newOffset 
161a0 3d 20 6c 73 65 65 6b 28 69 64 2d 3e 68 2c 20 6f  = lseek(id->h, o
161b0 66 66 73 65 74 2c 20 53 45 45 4b 5f 53 45 54 29  ffset, SEEK_SET)
161c0 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ;.  SimulateIOEr
161d0 72 6f 72 28 20 6e 65 77 4f 66 66 73 65 74 2d 2d  ror( newOffset--
161e0 20 29 3b 0a 20 20 69 66 28 20 6e 65 77 4f 66 66   );.  if( newOff
161f0 73 65 74 21 3d 6f 66 66 73 65 74 20 29 7b 0a 20  set!=offset ){. 
16200 20 20 20 69 66 28 20 6e 65 77 4f 66 66 73 65 74     if( newOffset
16210 20 3d 3d 20 2d 31 20 29 7b 0a 20 20 20 20 20 20   == -1 ){.      
16220 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d  ((unixFile*)id)-
16230 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72  >lastErrno = err
16240 6e 6f 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  no;.    }else{. 
16250 20 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a       ((unixFile*
16260 29 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  )id)->lastErrno 
16270 3d 20 30 3b 09 09 09 0a 20 20 20 20 7d 0a 20 20  = 0;....    }.  
16280 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d    return -1;.  }
16290 0a 20 20 67 6f 74 20 3d 20 72 65 61 64 28 69 64  .  got = read(id
162a0 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 29 3b  ->h, pBuf, cnt);
162b0 0a 23 65 6e 64 69 66 0a 20 20 54 49 4d 45 52 5f  .#endif.  TIMER_
162c0 45 4e 44 3b 0a 20 20 69 66 28 20 67 6f 74 3c 30  END;.  if( got<0
162d0 20 29 7b 0a 20 20 20 20 28 28 75 6e 69 78 46 69   ){.    ((unixFi
162e0 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72 72  le*)id)->lastErr
162f0 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 7d 0a  no = errno;.  }.
16300 20 20 4f 53 54 52 41 43 45 35 28 22 52 45 41 44    OSTRACE5("READ
16310 20 20 20 20 25 2d 33 64 20 25 35 64 20 25 37 6c      %-3d %5d %7l
16320 6c 64 20 25 6c 6c 75 5c 6e 22 2c 20 69 64 2d 3e  ld %llu\n", id->
16330 68 2c 20 67 6f 74 2c 20 6f 66 66 73 65 74 2c 20  h, got, offset, 
16340 54 49 4d 45 52 5f 45 4c 41 50 53 45 44 29 3b 0a  TIMER_ELAPSED);.
16350 20 20 72 65 74 75 72 6e 20 67 6f 74 3b 0a 7d 0a    return got;.}.
16360 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 64 61 74 61  ./*.** Read data
16370 20 66 72 6f 6d 20 61 20 66 69 6c 65 20 69 6e 74   from a file int
16380 6f 20 61 20 62 75 66 66 65 72 2e 20 20 52 65 74  o a buffer.  Ret
16390 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
163a0 20 61 6c 6c 0a 2a 2a 20 62 79 74 65 73 20 77 65   all.** bytes we
163b0 72 65 20 72 65 61 64 20 73 75 63 63 65 73 73 66  re read successf
163c0 75 6c 6c 79 20 61 6e 64 20 53 51 4c 49 54 45 5f  ully and SQLITE_
163d0 49 4f 45 52 52 20 69 66 20 61 6e 79 74 68 69 6e  IOERR if anythin
163e0 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e  g goes.** wrong.
163f0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
16400 6e 69 78 52 65 61 64 28 0a 20 20 73 71 6c 69 74  nixRead(.  sqlit
16410 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 0a 20 20  e3_file *id, .  
16420 76 6f 69 64 20 2a 70 42 75 66 2c 20 0a 20 20 69  void *pBuf, .  i
16430 6e 74 20 61 6d 74 2c 0a 20 20 73 71 6c 69 74 65  nt amt,.  sqlite
16440 33 5f 69 6e 74 36 34 20 6f 66 66 73 65 74 0a 29  3_int64 offset.)
16450 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  {.  unixFile *pF
16460 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 20  ile = (unixFile 
16470 2a 29 69 64 3b 0a 20 20 69 6e 74 20 67 6f 74 3b  *)id;.  int got;
16480 0a 20 20 61 73 73 65 72 74 28 20 69 64 20 29 3b  .  assert( id );
16490 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69  ..  /* If this i
164a0 73 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  s a database fil
164b0 65 20 28 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c  e (not a journal
164c0 2c 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  , master-journal
164d0 20 6f 72 20 74 65 6d 70 0a 20 20 2a 2a 20 66 69   or temp.  ** fi
164e0 6c 65 29 2c 20 74 68 65 20 62 79 74 65 73 20 69  le), the bytes i
164f0 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 72 61  n the locking ra
16500 6e 67 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72  nge should never
16510 20 62 65 20 72 65 61 64 20 6f 72 20 77 72 69 74   be read or writ
16520 74 65 6e 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74  ten. */.  assert
16530 28 20 70 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64  ( pFile->pUnused
16540 3d 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66  ==0.       || of
16550 66 73 65 74 3e 3d 50 45 4e 44 49 4e 47 5f 42 59  fset>=PENDING_BY
16560 54 45 2b 35 31 32 0a 20 20 20 20 20 20 20 7c 7c  TE+512.       ||
16570 20 6f 66 66 73 65 74 2b 61 6d 74 3c 3d 50 45 4e   offset+amt<=PEN
16580 44 49 4e 47 5f 42 59 54 45 20 0a 20 20 29 3b 0a  DING_BYTE .  );.
16590 0a 20 20 67 6f 74 20 3d 20 73 65 65 6b 41 6e 64  .  got = seekAnd
165a0 52 65 61 64 28 70 46 69 6c 65 2c 20 6f 66 66 73  Read(pFile, offs
165b0 65 74 2c 20 70 42 75 66 2c 20 61 6d 74 29 3b 0a  et, pBuf, amt);.
165c0 20 20 69 66 28 20 67 6f 74 3d 3d 61 6d 74 20 29    if( got==amt )
165d0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
165e0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20  ITE_OK;.  }else 
165f0 69 66 28 20 67 6f 74 3c 30 20 29 7b 0a 20 20 20  if( got<0 ){.   
16600 20 2f 2a 20 6c 61 73 74 45 72 72 6e 6f 20 73 65   /* lastErrno se
16610 74 20 62 79 20 73 65 65 6b 41 6e 64 52 65 61 64  t by seekAndRead
16620 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
16630 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44  QLITE_IOERR_READ
16640 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
16650 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
16660 3d 20 30 3b 20 2f 2a 20 6e 6f 74 20 61 20 73 79  = 0; /* not a sy
16670 73 74 65 6d 20 65 72 72 6f 72 20 2a 2f 0a 20 20  stem error */.  
16680 20 20 2f 2a 20 55 6e 72 65 61 64 20 70 61 72 74    /* Unread part
16690 73 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20  s of the buffer 
166a0 6d 75 73 74 20 62 65 20 7a 65 72 6f 2d 66 69 6c  must be zero-fil
166b0 6c 65 64 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65  led */.    memse
166c0 74 28 26 28 28 63 68 61 72 2a 29 70 42 75 66 29  t(&((char*)pBuf)
166d0 5b 67 6f 74 5d 2c 20 30 2c 20 61 6d 74 2d 67 6f  [got], 0, amt-go
166e0 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  t);.    return S
166f0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
16700 54 5f 52 45 41 44 3b 0a 20 20 7d 0a 7d 0a 0a 2f  T_READ;.  }.}../
16710 2a 0a 2a 2a 20 53 65 65 6b 20 74 6f 20 74 68 65  *.** Seek to the
16720 20 6f 66 66 73 65 74 20 69 6e 20 69 64 2d 3e 6f   offset in id->o
16730 66 66 73 65 74 20 74 68 65 6e 20 72 65 61 64 20  ffset then read 
16740 63 6e 74 20 62 79 74 65 73 20 69 6e 74 6f 20 70  cnt bytes into p
16750 42 75 66 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74  Buf..** Return t
16760 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
16770 65 73 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64  es actually read
16780 2e 20 20 55 70 64 61 74 65 20 74 68 65 20 6f 66  .  Update the of
16790 66 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61  fset..**.** To a
167a0 76 6f 69 64 20 73 74 6f 6d 70 69 6e 67 20 74 68  void stomping th
167b0 65 20 65 72 72 6e 6f 20 76 61 6c 75 65 20 6f 6e  e errno value on
167c0 20 61 20 66 61 69 6c 65 64 20 77 72 69 74 65 20   a failed write 
167d0 74 68 65 20 6c 61 73 74 45 72 72 6e 6f 20 76 61  the lastErrno va
167e0 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 62 65  lue.** is set be
167f0 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
16800 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
16810 65 6b 41 6e 64 57 72 69 74 65 28 75 6e 69 78 46  ekAndWrite(unixF
16820 69 6c 65 20 2a 69 64 2c 20 69 36 34 20 6f 66 66  ile *id, i64 off
16830 73 65 74 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20  set, const void 
16840 2a 70 42 75 66 2c 20 69 6e 74 20 63 6e 74 29 7b  *pBuf, int cnt){
16850 0a 20 20 69 6e 74 20 67 6f 74 3b 0a 20 20 69 36  .  int got;.  i6
16860 34 20 6e 65 77 4f 66 66 73 65 74 3b 0a 20 20 54  4 newOffset;.  T
16870 49 4d 45 52 5f 53 54 41 52 54 3b 0a 23 69 66 20  IMER_START;.#if 
16880 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41  defined(USE_PREA
16890 44 29 0a 20 20 67 6f 74 20 3d 20 70 77 72 69 74  D).  got = pwrit
168a0 65 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63  e(id->h, pBuf, c
168b0 6e 74 2c 20 6f 66 66 73 65 74 29 3b 0a 23 65 6c  nt, offset);.#el
168c0 69 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50  if defined(USE_P
168d0 52 45 41 44 36 34 29 0a 20 20 67 6f 74 20 3d 20  READ64).  got = 
168e0 70 77 72 69 74 65 36 34 28 69 64 2d 3e 68 2c 20  pwrite64(id->h, 
168f0 70 42 75 66 2c 20 63 6e 74 2c 20 6f 66 66 73 65  pBuf, cnt, offse
16900 74 29 3b 0a 23 65 6c 73 65 0a 20 20 6e 65 77 4f  t);.#else.  newO
16910 66 66 73 65 74 20 3d 20 6c 73 65 65 6b 28 69 64  ffset = lseek(id
16920 2d 3e 68 2c 20 6f 66 66 73 65 74 2c 20 53 45 45  ->h, offset, SEE
16930 4b 5f 53 45 54 29 3b 0a 20 20 69 66 28 20 6e 65  K_SET);.  if( ne
16940 77 4f 66 66 73 65 74 21 3d 6f 66 66 73 65 74 20  wOffset!=offset 
16950 29 7b 0a 20 20 20 20 69 66 28 20 6e 65 77 4f 66  ){.    if( newOf
16960 66 73 65 74 20 3d 3d 20 2d 31 20 29 7b 0a 20 20  fset == -1 ){.  
16970 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29      ((unixFile*)
16980 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  id)->lastErrno =
16990 20 65 72 72 6e 6f 3b 0a 20 20 20 20 7d 65 6c 73   errno;.    }els
169a0 65 7b 0a 20 20 20 20 20 20 28 28 75 6e 69 78 46  e{.      ((unixF
169b0 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72  ile*)id)->lastEr
169c0 72 6e 6f 20 3d 20 30 3b 09 09 09 0a 20 20 20 20  rno = 0;....    
169d0 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b  }.    return -1;
169e0 0a 20 20 7d 0a 20 20 67 6f 74 20 3d 20 77 72 69  .  }.  got = wri
169f0 74 65 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20  te(id->h, pBuf, 
16a00 63 6e 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20 54  cnt);.#endif.  T
16a10 49 4d 45 52 5f 45 4e 44 3b 0a 20 20 69 66 28 20  IMER_END;.  if( 
16a20 67 6f 74 3c 30 20 29 7b 0a 20 20 20 20 28 28 75  got<0 ){.    ((u
16a30 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61  nixFile*)id)->la
16a40 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b  stErrno = errno;
16a50 0a 20 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45 35  .  }..  OSTRACE5
16a60 28 22 57 52 49 54 45 20 20 20 25 2d 33 64 20 25  ("WRITE   %-3d %
16a70 35 64 20 25 37 6c 6c 64 20 25 6c 6c 75 5c 6e 22  5d %7lld %llu\n"
16a80 2c 20 69 64 2d 3e 68 2c 20 67 6f 74 2c 20 6f 66  , id->h, got, of
16a90 66 73 65 74 2c 20 54 49 4d 45 52 5f 45 4c 41 50  fset, TIMER_ELAP
16aa0 53 45 44 29 3b 0a 20 20 72 65 74 75 72 6e 20 67  SED);.  return g
16ab0 6f 74 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72  ot;.}.../*.** Wr
16ac0 69 74 65 20 64 61 74 61 20 66 72 6f 6d 20 61 20  ite data from a 
16ad0 62 75 66 66 65 72 20 69 6e 74 6f 20 61 20 66 69  buffer into a fi
16ae0 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  le.  Return SQLI
16af0 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
16b00 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65  .** or some othe
16b10 72 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 6e 20  r error code on 
16b20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74  failure..*/.stat
16b30 69 63 20 69 6e 74 20 75 6e 69 78 57 72 69 74 65  ic int unixWrite
16b40 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  (.  sqlite3_file
16b50 20 2a 69 64 2c 20 0a 20 20 63 6f 6e 73 74 20 76   *id, .  const v
16b60 6f 69 64 20 2a 70 42 75 66 2c 20 0a 20 20 69 6e  oid *pBuf, .  in
16b70 74 20 61 6d 74 2c 0a 20 20 73 71 6c 69 74 65 33  t amt,.  sqlite3
16b80 5f 69 6e 74 36 34 20 6f 66 66 73 65 74 20 0a 29  _int64 offset .)
16b90 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  {.  unixFile *pF
16ba0 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
16bb0 29 69 64 3b 0a 20 20 69 6e 74 20 77 72 6f 74 65  )id;.  int wrote
16bc0 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20   = 0;.  assert( 
16bd0 69 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  id );.  assert( 
16be0 61 6d 74 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 49  amt>0 );..  /* I
16bf0 66 20 74 68 69 73 20 69 73 20 61 20 64 61 74 61  f this is a data
16c00 62 61 73 65 20 66 69 6c 65 20 28 6e 6f 74 20 61  base file (not a
16c10 20 6a 6f 75 72 6e 61 6c 2c 20 6d 61 73 74 65 72   journal, master
16c20 2d 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 65 6d 70  -journal or temp
16c30 0a 20 20 2a 2a 20 66 69 6c 65 29 2c 20 74 68 65  .  ** file), the
16c40 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6c 6f   bytes in the lo
16c50 63 6b 69 6e 67 20 72 61 6e 67 65 20 73 68 6f 75  cking range shou
16c60 6c 64 20 6e 65 76 65 72 20 62 65 20 72 65 61 64  ld never be read
16c70 20 6f 72 20 77 72 69 74 74 65 6e 2e 20 2a 2f 0a   or written. */.
16c80 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d    assert( pFile-
16c90 3e 70 55 6e 75 73 65 64 3d 3d 30 0a 20 20 20 20  >pUnused==0.    
16ca0 20 20 20 7c 7c 20 6f 66 66 73 65 74 3e 3d 50 45     || offset>=PE
16cb0 4e 44 49 4e 47 5f 42 59 54 45 2b 35 31 32 0a 20  NDING_BYTE+512. 
16cc0 20 20 20 20 20 20 7c 7c 20 6f 66 66 73 65 74 2b        || offset+
16cd0 61 6d 74 3c 3d 50 45 4e 44 49 4e 47 5f 42 59 54  amt<=PENDING_BYT
16ce0 45 20 0a 20 20 29 3b 0a 0a 23 69 66 6e 64 65 66  E .  );..#ifndef
16cf0 20 4e 44 45 42 55 47 0a 20 20 2f 2a 20 49 66 20   NDEBUG.  /* If 
16d00 77 65 20 61 72 65 20 64 6f 69 6e 67 20 61 20 6e  we are doing a n
16d10 6f 72 6d 61 6c 20 77 72 69 74 65 20 74 6f 20 61  ormal write to a
16d20 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28   database file (
16d30 61 73 20 6f 70 70 6f 73 65 64 20 74 6f 0a 20 20  as opposed to.  
16d40 2a 2a 20 64 6f 69 6e 67 20 61 20 68 6f 74 2d 6a  ** doing a hot-j
16d50 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20  ournal rollback 
16d60 6f 72 20 61 20 77 72 69 74 65 20 74 6f 20 73 6f  or a write to so
16d70 6d 65 20 66 69 6c 65 20 6f 74 68 65 72 20 74 68  me file other th
16d80 61 6e 20 61 0a 20 20 2a 2a 20 6e 6f 72 6d 61 6c  an a.  ** normal
16d90 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 29 20   database file) 
16da0 74 68 65 6e 20 72 65 63 6f 72 64 20 74 68 65 20  then record the 
16db0 66 61 63 74 20 74 68 61 74 20 74 68 65 20 64 61  fact that the da
16dc0 74 61 62 61 73 65 0a 20 20 2a 2a 20 68 61 73 20  tabase.  ** has 
16dd0 63 68 61 6e 67 65 64 2e 20 20 49 66 20 74 68 65  changed.  If the
16de0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
16df0 6e 74 65 72 20 69 73 20 6d 6f 64 69 66 69 65 64  nter is modified
16e00 2c 20 72 65 63 6f 72 64 20 74 68 61 74 0a 20 20  , record that.  
16e10 2a 2a 20 66 61 63 74 20 74 6f 6f 2e 0a 20 20 2a  ** fact too..  *
16e20 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 69  /.  if( pFile->i
16e30 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 29 7b 0a  nNormalWrite ){.
16e40 20 20 20 20 70 46 69 6c 65 2d 3e 64 62 55 70 64      pFile->dbUpd
16e50 61 74 65 20 3d 20 31 3b 20 20 2f 2a 20 54 68 65  ate = 1;  /* The
16e60 20 64 61 74 61 62 61 73 65 20 68 61 73 20 62 65   database has be
16e70 65 6e 20 6d 6f 64 69 66 69 65 64 20 2a 2f 0a 20  en modified */. 
16e80 20 20 20 69 66 28 20 6f 66 66 73 65 74 3c 3d 32     if( offset<=2
16e90 34 20 26 26 20 6f 66 66 73 65 74 2b 61 6d 74 3e  4 && offset+amt>
16ea0 3d 32 37 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  =27 ){.      int
16eb0 20 72 63 3b 0a 20 20 20 20 20 20 63 68 61 72 20   rc;.      char 
16ec0 6f 6c 64 43 6e 74 72 5b 34 5d 3b 0a 20 20 20 20  oldCntr[4];.    
16ed0 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
16ee0 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20  rBenign(1);.    
16ef0 20 20 72 63 20 3d 20 73 65 65 6b 41 6e 64 52 65    rc = seekAndRe
16f00 61 64 28 70 46 69 6c 65 2c 20 32 34 2c 20 6f 6c  ad(pFile, 24, ol
16f10 64 43 6e 74 72 2c 20 34 29 3b 0a 20 20 20 20 20  dCntr, 4);.     
16f20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
16f30 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20  Benign(0);.     
16f40 20 69 66 28 20 72 63 21 3d 34 20 7c 7c 20 6d 65   if( rc!=4 || me
16f50 6d 63 6d 70 28 6f 6c 64 43 6e 74 72 2c 20 26 28  mcmp(oldCntr, &(
16f60 28 63 68 61 72 2a 29 70 42 75 66 29 5b 32 34 2d  (char*)pBuf)[24-
16f70 6f 66 66 73 65 74 5d 2c 20 34 29 21 3d 30 20 29  offset], 4)!=0 )
16f80 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d  {.        pFile-
16f90 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 20 3d  >transCntrChng =
16fa0 20 31 3b 20 20 2f 2a 20 54 68 65 20 74 72 61 6e   1;  /* The tran
16fb0 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20  saction counter 
16fc0 68 61 73 20 63 68 61 6e 67 65 64 20 2a 2f 0a 20  has changed */. 
16fd0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
16fe0 0a 23 65 6e 64 69 66 0a 0a 20 20 77 68 69 6c 65  .#endif..  while
16ff0 28 20 61 6d 74 3e 30 20 26 26 20 28 77 72 6f 74  ( amt>0 && (wrot
17000 65 20 3d 20 73 65 65 6b 41 6e 64 57 72 69 74 65  e = seekAndWrite
17010 28 70 46 69 6c 65 2c 20 6f 66 66 73 65 74 2c 20  (pFile, offset, 
17020 70 42 75 66 2c 20 61 6d 74 29 29 3e 30 20 29 7b  pBuf, amt))>0 ){
17030 0a 20 20 20 20 61 6d 74 20 2d 3d 20 77 72 6f 74  .    amt -= wrot
17040 65 3b 0a 20 20 20 20 6f 66 66 73 65 74 20 2b 3d  e;.    offset +=
17050 20 77 72 6f 74 65 3b 0a 20 20 20 20 70 42 75 66   wrote;.    pBuf
17060 20 3d 20 26 28 28 63 68 61 72 2a 29 70 42 75 66   = &((char*)pBuf
17070 29 5b 77 72 6f 74 65 5d 3b 0a 20 20 7d 0a 20 20  )[wrote];.  }.  
17080 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
17090 28 20 77 72 6f 74 65 3d 28 2d 31 29 2c 20 61 6d  ( wrote=(-1), am
170a0 74 3d 31 20 29 29 3b 0a 20 20 53 69 6d 75 6c 61  t=1 ));.  Simula
170b0 74 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28  teDiskfullError(
170c0 28 20 77 72 6f 74 65 3d 30 2c 20 61 6d 74 3d 31  ( wrote=0, amt=1
170d0 20 29 29 3b 0a 20 20 69 66 28 20 61 6d 74 3e 30   ));.  if( amt>0
170e0 20 29 7b 0a 20 20 20 20 69 66 28 20 77 72 6f 74   ){.    if( wrot
170f0 65 3c 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  e<0 ){.      /* 
17100 6c 61 73 74 45 72 72 6e 6f 20 73 65 74 20 62 79  lastErrno set by
17110 20 73 65 65 6b 41 6e 64 57 72 69 74 65 20 2a 2f   seekAndWrite */
17120 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
17130 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45  LITE_IOERR_WRITE
17140 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
17150 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
17160 72 6e 6f 20 3d 20 30 3b 20 2f 2a 20 6e 6f 74 20  rno = 0; /* not 
17170 61 20 73 79 73 74 65 6d 20 65 72 72 6f 72 20 2a  a system error *
17180 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  /.      return S
17190 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20  QLITE_FULL;.    
171a0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  }.  }.  return S
171b0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66  QLITE_OK;.}..#if
171c0 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
171d0 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20  /*.** Count the 
171e0 6e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 73 79  number of fullsy
171f0 6e 63 73 20 61 6e 64 20 6e 6f 72 6d 61 6c 20 73  ncs and normal s
17200 79 6e 63 73 2e 20 20 54 68 69 73 20 69 73 20 75  yncs.  This is u
17210 73 65 64 20 74 6f 20 74 65 73 74 0a 2a 2a 20 74  sed to test.** t
17220 68 61 74 20 73 79 6e 63 73 20 61 6e 64 20 66 75  hat syncs and fu
17230 6c 6c 73 79 6e 63 73 20 61 72 65 20 6f 63 63 75  llsyncs are occu
17240 72 72 69 6e 67 20 61 74 20 74 68 65 20 72 69 67  rring at the rig
17250 68 74 20 74 69 6d 65 73 2e 0a 2a 2f 0a 69 6e 74  ht times..*/.int
17260 20 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f   sqlite3_sync_co
17270 75 6e 74 20 3d 20 30 3b 0a 69 6e 74 20 73 71 6c  unt = 0;.int sql
17280 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f  ite3_fullsync_co
17290 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  unt = 0;.#endif.
172a0 0a 2f 2a 0a 2a 2a 20 57 65 20 64 6f 20 6e 6f 74  ./*.** We do not
172b0 20 74 72 75 73 74 20 73 79 73 74 65 6d 73 20 74   trust systems t
172c0 6f 20 70 72 6f 76 69 64 65 20 61 20 77 6f 72 6b  o provide a work
172d0 69 6e 67 20 66 64 61 74 61 73 79 6e 63 28 29 2e  ing fdatasync().
172e0 20 20 53 6f 6d 65 20 64 6f 2e 0a 2a 2a 20 4f 74    Some do..** Ot
172f0 68 65 72 73 20 64 6f 20 6e 6f 2e 20 20 54 6f 20  hers do no.  To 
17300 62 65 20 73 61 66 65 2c 20 77 65 20 77 69 6c 6c  be safe, we will
17310 20 73 74 69 63 6b 20 77 69 74 68 20 74 68 65 20   stick with the 
17320 28 73 6c 6f 77 65 72 29 20 66 73 79 6e 63 28 29  (slower) fsync()
17330 2e 0a 2a 2a 20 49 66 20 79 6f 75 20 6b 6e 6f 77  ..** If you know
17340 20 74 68 61 74 20 79 6f 75 72 20 73 79 73 74 65   that your syste
17350 6d 20 64 6f 65 73 20 73 75 70 70 6f 72 74 20 66  m does support f
17360 64 61 74 61 73 79 6e 63 28 29 20 63 6f 72 72 65  datasync() corre
17370 63 74 6c 79 2c 0a 2a 2a 20 74 68 65 6e 20 73 69  ctly,.** then si
17380 6d 70 6c 79 20 63 6f 6d 70 69 6c 65 20 77 69 74  mply compile wit
17390 68 20 2d 44 66 64 61 74 61 73 79 6e 63 3d 66 64  h -Dfdatasync=fd
173a0 61 74 61 73 79 6e 63 0a 2a 2f 0a 23 69 66 20 21  atasync.*/.#if !
173b0 64 65 66 69 6e 65 64 28 66 64 61 74 61 73 79 6e  defined(fdatasyn
173c0 63 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 5f  c) && !defined(_
173d0 5f 6c 69 6e 75 78 5f 5f 29 0a 23 20 64 65 66 69  _linux__).# defi
173e0 6e 65 20 66 64 61 74 61 73 79 6e 63 20 66 73 79  ne fdatasync fsy
173f0 6e 63 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  nc.#endif../*.**
17400 20 44 65 66 69 6e 65 20 48 41 56 45 5f 46 55 4c   Define HAVE_FUL
17410 4c 46 53 59 4e 43 20 74 6f 20 30 20 6f 72 20 31  LFSYNC to 0 or 1
17420 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68   depending on wh
17430 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20  ether or not.** 
17440 74 68 65 20 46 5f 46 55 4c 4c 46 53 59 4e 43 20  the F_FULLFSYNC 
17450 6d 61 63 72 6f 20 69 73 20 64 65 66 69 6e 65 64  macro is defined
17460 2e 20 20 46 5f 46 55 4c 4c 46 53 59 4e 43 20 69  .  F_FULLFSYNC i
17470 73 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 6f  s currently.** o
17480 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e  nly available on
17490 20 4d 61 63 20 4f 53 20 58 2e 20 20 42 75 74 20   Mac OS X.  But 
174a0 74 68 61 74 20 63 6f 75 6c 64 20 63 68 61 6e 67  that could chang
174b0 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 46 5f 46  e..*/.#ifdef F_F
174c0 55 4c 4c 46 53 59 4e 43 0a 23 20 64 65 66 69 6e  ULLFSYNC.# defin
174d0 65 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43  e HAVE_FULLFSYNC
174e0 20 31 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e   1.#else.# defin
174f0 65 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43  e HAVE_FULLFSYNC
17500 20 30 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a   0.#endif.../*.*
17510 2a 20 54 68 65 20 66 73 79 6e 63 28 29 20 73 79  * The fsync() sy
17520 73 74 65 6d 20 63 61 6c 6c 20 64 6f 65 73 20 6e  stem call does n
17530 6f 74 20 77 6f 72 6b 20 61 73 20 61 64 76 65 72  ot work as adver
17540 74 69 73 65 64 20 6f 6e 20 6d 61 6e 79 0a 2a 2a  tised on many.**
17550 20 75 6e 69 78 20 73 79 73 74 65 6d 73 2e 20 20   unix systems.  
17560 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 72  The following pr
17570 6f 63 65 64 75 72 65 20 69 73 20 61 6e 20 61 74  ocedure is an at
17580 74 65 6d 70 74 20 74 6f 20 6d 61 6b 65 0a 2a 2a  tempt to make.**
17590 20 69 74 20 77 6f 72 6b 20 62 65 74 74 65 72 2e   it work better.
175a0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54  .**.** The SQLIT
175b0 45 5f 4e 4f 5f 53 59 4e 43 20 6d 61 63 72 6f 20  E_NO_SYNC macro 
175c0 64 69 73 61 62 6c 65 73 20 61 6c 6c 20 66 73 79  disables all fsy
175d0 6e 63 28 29 73 2e 20 20 54 68 69 73 20 69 73 20  nc()s.  This is 
175e0 75 73 65 66 75 6c 0a 2a 2a 20 66 6f 72 20 74 65  useful.** for te
175f0 73 74 69 6e 67 20 77 68 65 6e 20 77 65 20 77 61  sting when we wa
17600 6e 74 20 74 6f 20 72 75 6e 20 74 68 72 6f 75 67  nt to run throug
17610 68 20 74 68 65 20 74 65 73 74 20 73 75 69 74 65  h the test suite
17620 20 71 75 69 63 6b 6c 79 2e 0a 2a 2a 20 59 6f 75   quickly..** You
17630 20 61 72 65 20 73 74 72 6f 6e 67 6c 79 20 61 64   are strongly ad
17640 76 69 73 65 64 20 2a 6e 6f 74 2a 20 74 6f 20 64  vised *not* to d
17650 65 70 6c 6f 79 20 77 69 74 68 20 53 51 4c 49 54  eploy with SQLIT
17660 45 5f 4e 4f 5f 53 59 4e 43 0a 2a 2a 20 65 6e 61  E_NO_SYNC.** ena
17670 62 6c 65 64 2c 20 68 6f 77 65 76 65 72 2c 20 73  bled, however, s
17680 69 6e 63 65 20 77 69 74 68 20 53 51 4c 49 54 45  ince with SQLITE
17690 5f 4e 4f 5f 53 59 4e 43 20 65 6e 61 62 6c 65 64  _NO_SYNC enabled
176a0 2c 20 61 6e 20 4f 53 20 63 72 61 73 68 0a 2a 2a  , an OS crash.**
176b0 20 6f 72 20 70 6f 77 65 72 20 66 61 69 6c 75 72   or power failur
176c0 65 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 63 6f  e will likely co
176d0 72 72 75 70 74 20 74 68 65 20 64 61 74 61 62 61  rrupt the databa
176e0 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53  se file..**.** S
176f0 51 4c 69 74 65 20 73 65 74 73 20 74 68 65 20 64  QLite sets the d
17700 61 74 61 4f 6e 6c 79 20 66 6c 61 67 20 69 66 20  ataOnly flag if 
17710 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
17720 66 69 6c 65 20 69 73 20 75 6e 63 68 61 6e 67 65  file is unchange
17730 64 2e 0a 2a 2a 20 54 68 65 20 69 64 65 61 20 62  d..** The idea b
17740 65 68 69 6e 64 20 64 61 74 61 4f 6e 6c 79 20 69  ehind dataOnly i
17750 73 20 74 68 61 74 20 69 74 20 73 68 6f 75 6c 64  s that it should
17760 20 6f 6e 6c 79 20 77 72 69 74 65 20 74 68 65 20   only write the 
17770 66 69 6c 65 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20  file content.** 
17780 74 6f 20 64 69 73 6b 2c 20 6e 6f 74 20 74 68 65  to disk, not the
17790 20 69 6e 6f 64 65 2e 20 20 57 65 20 6f 6e 6c 79   inode.  We only
177a0 20 73 65 74 20 64 61 74 61 4f 6e 6c 79 20 69 66   set dataOnly if
177b0 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20 69   the file size i
177c0 73 20 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20  s .** unchanged 
177d0 73 69 6e 63 65 20 74 68 65 20 66 69 6c 65 20 73  since the file s
177e0 69 7a 65 20 69 73 20 70 61 72 74 20 6f 66 20 74  ize is part of t
177f0 68 65 20 69 6e 6f 64 65 2e 20 20 48 6f 77 65 76  he inode.  Howev
17800 65 72 2c 20 0a 2a 2a 20 54 65 64 20 54 73 27 6f  er, .** Ted Ts'o
17810 20 74 65 6c 6c 73 20 75 73 20 74 68 61 74 20 66   tells us that f
17820 64 61 74 61 73 79 6e 63 28 29 20 77 69 6c 6c 20  datasync() will 
17830 61 6c 73 6f 20 77 72 69 74 65 20 74 68 65 20 69  also write the i
17840 6e 6f 64 65 20 69 66 20 74 68 65 0a 2a 2a 20 66  node if the.** f
17850 69 6c 65 20 73 69 7a 65 20 68 61 73 20 63 68 61  ile size has cha
17860 6e 67 65 64 2e 20 20 54 68 65 20 6f 6e 6c 79 20  nged.  The only 
17870 72 65 61 6c 20 64 69 66 66 65 72 65 6e 63 65 20  real difference 
17880 62 65 74 77 65 65 6e 20 66 64 61 74 61 73 79 6e  between fdatasyn
17890 63 28 29 0a 2a 2a 20 61 6e 64 20 66 73 79 6e 63  c().** and fsync
178a0 28 29 2c 20 54 65 64 20 74 65 6c 6c 73 20 75 73  (), Ted tells us
178b0 2c 20 69 73 20 74 68 61 74 20 66 64 61 74 61 73  , is that fdatas
178c0 79 6e 63 28 29 20 77 69 6c 6c 20 6e 6f 74 20 66  ync() will not f
178d0 6c 75 73 68 20 74 68 65 0a 2a 2a 20 69 6e 6f 64  lush the.** inod
178e0 65 20 69 66 20 74 68 65 20 6d 74 69 6d 65 20 6f  e if the mtime o
178f0 72 20 6f 77 6e 65 72 20 6f 72 20 6f 74 68 65 72  r owner or other
17900 20 69 6e 6f 64 65 20 61 74 74 72 69 62 75 74 65   inode attribute
17910 73 20 68 61 76 65 20 63 68 61 6e 67 65 64 2e 0a  s have changed..
17920 2a 2a 20 57 65 20 6f 6e 6c 79 20 63 61 72 65 20  ** We only care 
17930 61 62 6f 75 74 20 74 68 65 20 66 69 6c 65 20 73  about the file s
17940 69 7a 65 2c 20 6e 6f 74 20 74 68 65 20 6f 74 68  ize, not the oth
17950 65 72 20 66 69 6c 65 20 61 74 74 72 69 62 75 74  er file attribut
17960 65 73 2c 20 73 6f 0a 2a 2a 20 61 73 20 66 61 72  es, so.** as far
17970 20 61 73 20 53 51 4c 69 74 65 20 69 73 20 63 6f   as SQLite is co
17980 6e 63 65 72 6e 65 64 2c 20 61 6e 20 66 64 61 74  ncerned, an fdat
17990 61 73 79 6e 63 28 29 20 69 73 20 61 6c 77 61 79  async() is alway
179a0 73 20 61 64 65 71 75 61 74 65 2e 0a 2a 2a 20 53  s adequate..** S
179b0 6f 2c 20 77 65 20 61 6c 77 61 79 73 20 75 73 65  o, we always use
179c0 20 66 64 61 74 61 73 79 6e 63 28 29 20 69 66 20   fdatasync() if 
179d0 69 74 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c  it is available,
179e0 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 0a 2a   regardless of.*
179f0 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  * the value of t
17a00 68 65 20 64 61 74 61 4f 6e 6c 79 20 66 6c 61 67  he dataOnly flag
17a10 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
17a20 66 75 6c 6c 5f 66 73 79 6e 63 28 69 6e 74 20 66  full_fsync(int f
17a30 64 2c 20 69 6e 74 20 66 75 6c 6c 53 79 6e 63 2c  d, int fullSync,
17a40 20 69 6e 74 20 64 61 74 61 4f 6e 6c 79 29 7b 0a   int dataOnly){.
17a50 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20    int rc;..  /* 
17a60 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 22 69  The following "i
17a70 66 64 65 66 2f 65 6c 69 66 2f 65 6c 73 65 2f 22  fdef/elif/else/"
17a80 20 62 6c 6f 63 6b 20 68 61 73 20 74 68 65 20 73   block has the s
17a90 61 6d 65 20 73 74 72 75 63 74 75 72 65 20 61 73  ame structure as
17aa0 0a 20 20 2a 2a 20 74 68 65 20 6f 6e 65 20 62 65  .  ** the one be
17ab0 6c 6f 77 2e 20 49 74 20 69 73 20 72 65 70 6c 69  low. It is repli
17ac0 63 61 74 65 64 20 68 65 72 65 20 73 6f 6c 65 6c  cated here solel
17ad0 79 20 74 6f 20 61 76 6f 69 64 20 63 6c 75 74 74  y to avoid clutt
17ae0 65 72 69 6e 67 20 0a 20 20 2a 2a 20 75 70 20 74  ering .  ** up t
17af0 68 65 20 72 65 61 6c 20 63 6f 64 65 20 77 69 74  he real code wit
17b00 68 20 74 68 65 20 55 4e 55 53 45 44 5f 50 41 52  h the UNUSED_PAR
17b10 41 4d 45 54 45 52 28 29 20 6d 61 63 72 6f 73 2e  AMETER() macros.
17b20 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  .  */.#ifdef SQL
17b30 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20 55 4e  ITE_NO_SYNC.  UN
17b40 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66  USED_PARAMETER(f
17b50 64 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  d);.  UNUSED_PAR
17b60 41 4d 45 54 45 52 28 66 75 6c 6c 53 79 6e 63 29  AMETER(fullSync)
17b70 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
17b80 45 54 45 52 28 64 61 74 61 4f 6e 6c 79 29 3b 0a  ETER(dataOnly);.
17b90 23 65 6c 69 66 20 48 41 56 45 5f 46 55 4c 4c 46  #elif HAVE_FULLF
17ba0 53 59 4e 43 0a 20 20 55 4e 55 53 45 44 5f 50 41  SYNC.  UNUSED_PA
17bb0 52 41 4d 45 54 45 52 28 64 61 74 61 4f 6e 6c 79  RAMETER(dataOnly
17bc0 29 3b 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45  );.#else.  UNUSE
17bd0 44 5f 50 41 52 41 4d 45 54 45 52 28 66 75 6c 6c  D_PARAMETER(full
17be0 53 79 6e 63 29 3b 0a 20 20 55 4e 55 53 45 44 5f  Sync);.  UNUSED_
17bf0 50 41 52 41 4d 45 54 45 52 28 64 61 74 61 4f 6e  PARAMETER(dataOn
17c00 6c 79 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  ly);.#endif..  /
17c10 2a 20 52 65 63 6f 72 64 20 74 68 65 20 6e 75 6d  * Record the num
17c20 62 65 72 20 6f 66 20 74 69 6d 65 73 20 74 68 61  ber of times tha
17c30 74 20 77 65 20 64 6f 20 61 20 6e 6f 72 6d 61 6c  t we do a normal
17c40 20 66 73 79 6e 63 28 29 20 61 6e 64 20 0a 20 20   fsync() and .  
17c50 2a 2a 20 46 55 4c 4c 53 59 4e 43 2e 20 20 54 68  ** FULLSYNC.  Th
17c60 69 73 20 69 73 20 75 73 65 64 20 64 75 72 69 6e  is is used durin
17c70 67 20 74 65 73 74 69 6e 67 20 74 6f 20 76 65 72  g testing to ver
17c80 69 66 79 20 74 68 61 74 20 74 68 69 73 20 70 72  ify that this pr
17c90 6f 63 65 64 75 72 65 0a 20 20 2a 2a 20 67 65 74  ocedure.  ** get
17ca0 73 20 63 61 6c 6c 65 64 20 77 69 74 68 20 74 68  s called with th
17cb0 65 20 63 6f 72 72 65 63 74 20 61 72 67 75 6d 65  e correct argume
17cc0 6e 74 73 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66  nts..  */.#ifdef
17cd0 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69   SQLITE_TEST.  i
17ce0 66 28 20 66 75 6c 6c 53 79 6e 63 20 29 20 73 71  f( fullSync ) sq
17cf0 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63  lite3_fullsync_c
17d00 6f 75 6e 74 2b 2b 3b 0a 20 20 73 71 6c 69 74 65  ount++;.  sqlite
17d10 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a  3_sync_count++;.
17d20 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20  #endif..  /* If 
17d30 77 65 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68  we compiled with
17d40 20 74 68 65 20 53 51 4c 49 54 45 5f 4e 4f 5f 53   the SQLITE_NO_S
17d50 59 4e 43 20 66 6c 61 67 2c 20 74 68 65 6e 20 73  YNC flag, then s
17d60 79 6e 63 69 6e 67 20 69 73 20 61 0a 20 20 2a 2a  yncing is a.  **
17d70 20 6e 6f 2d 6f 70 0a 20 20 2a 2f 0a 23 69 66 64   no-op.  */.#ifd
17d80 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e  ef SQLITE_NO_SYN
17d90 43 0a 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  C.  rc = SQLITE_
17da0 4f 4b 3b 0a 23 65 6c 69 66 20 48 41 56 45 5f 46  OK;.#elif HAVE_F
17db0 55 4c 4c 46 53 59 4e 43 0a 20 20 69 66 28 20 66  ULLFSYNC.  if( f
17dc0 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 72  ullSync ){.    r
17dd0 63 20 3d 20 66 63 6e 74 6c 28 66 64 2c 20 46 5f  c = fcntl(fd, F_
17de0 46 55 4c 4c 46 53 59 4e 43 2c 20 30 29 3b 0a 20  FULLFSYNC, 0);. 
17df0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
17e00 20 31 3b 0a 20 20 7d 0a 20 20 2f 2a 20 49 66 20   1;.  }.  /* If 
17e10 74 68 65 20 46 55 4c 4c 46 53 59 4e 43 20 66 61  the FULLFSYNC fa
17e20 69 6c 65 64 2c 20 66 61 6c 6c 20 62 61 63 6b 20  iled, fall back 
17e30 74 6f 20 61 74 74 65 6d 70 74 69 6e 67 20 61 6e  to attempting an
17e40 20 66 73 79 6e 63 28 29 2e 0a 20 20 2a 2a 20 49   fsync()..  ** I
17e50 74 20 73 68 6f 75 6c 64 6e 27 74 20 62 65 20 70  t shouldn't be p
17e60 6f 73 73 69 62 6c 65 20 66 6f 72 20 66 75 6c 6c  ossible for full
17e70 66 73 79 6e 63 20 74 6f 20 66 61 69 6c 20 6f 6e  fsync to fail on
17e80 20 74 68 65 20 6c 6f 63 61 6c 20 0a 20 20 2a 2a   the local .  **
17e90 20 66 69 6c 65 20 73 79 73 74 65 6d 20 28 6f 6e   file system (on
17ea0 20 4f 53 58 29 2c 20 73 6f 20 66 61 69 6c 75 72   OSX), so failur
17eb0 65 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74  e indicates that
17ec0 20 46 55 4c 4c 46 53 59 4e 43 0a 20 20 2a 2a 20   FULLFSYNC.  ** 
17ed0 69 73 6e 27 74 20 73 75 70 70 6f 72 74 65 64 20  isn't supported 
17ee0 66 6f 72 20 74 68 69 73 20 66 69 6c 65 20 73 79  for this file sy
17ef0 73 74 65 6d 2e 20 53 6f 2c 20 61 74 74 65 6d 70  stem. So, attemp
17f00 74 20 61 6e 20 66 73 79 6e 63 20 0a 20 20 2a 2a  t an fsync .  **
17f10 20 61 6e 64 20 28 66 6f 72 20 6e 6f 77 29 20 69   and (for now) i
17f20 67 6e 6f 72 65 20 74 68 65 20 6f 76 65 72 68 65  gnore the overhe
17f30 61 64 20 6f 66 20 61 20 73 75 70 65 72 66 6c 75  ad of a superflu
17f40 6f 75 73 20 66 63 6e 74 6c 20 63 61 6c 6c 2e 20  ous fcntl call. 
17f50 20 0a 20 20 2a 2a 20 49 74 27 64 20 62 65 20 62   .  ** It'd be b
17f60 65 74 74 65 72 20 74 6f 20 64 65 74 65 63 74 20  etter to detect 
17f70 66 75 6c 6c 66 73 79 6e 63 20 73 75 70 70 6f 72  fullfsync suppor
17f80 74 20 6f 6e 63 65 20 61 6e 64 20 61 76 6f 69 64  t once and avoid
17f90 20 0a 20 20 2a 2a 20 74 68 65 20 66 63 6e 74 6c   .  ** the fcntl
17fa0 20 63 61 6c 6c 20 65 76 65 72 79 20 74 69 6d 65   call every time
17fb0 20 73 79 6e 63 20 69 73 20 63 61 6c 6c 65 64 2e   sync is called.
17fc0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 20 29  .  */.  if( rc )
17fd0 20 72 63 20 3d 20 66 73 79 6e 63 28 66 64 29 3b   rc = fsync(fd);
17fe0 0a 0a 23 65 6c 73 65 20 0a 20 20 72 63 20 3d 20  ..#else .  rc = 
17ff0 66 64 61 74 61 73 79 6e 63 28 66 64 29 3b 0a 23  fdatasync(fd);.#
18000 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  if OS_VXWORKS.  
18010 69 66 28 20 72 63 3d 3d 2d 31 20 26 26 20 65 72  if( rc==-1 && er
18020 72 6e 6f 3d 3d 45 4e 4f 54 53 55 50 20 29 7b 0a  rno==ENOTSUP ){.
18030 20 20 20 20 72 63 20 3d 20 66 73 79 6e 63 28 66      rc = fsync(f
18040 64 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f  d);.  }.#endif /
18050 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a  * OS_VXWORKS */.
18060 23 65 6e 64 69 66 20 2f 2a 20 69 66 64 65 66 20  #endif /* ifdef 
18070 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 65  SQLITE_NO_SYNC e
18080 6c 69 66 20 48 41 56 45 5f 46 55 4c 4c 46 53 59  lif HAVE_FULLFSY
18090 4e 43 20 2a 2f 0a 0a 20 20 69 66 28 20 4f 53 5f  NC */..  if( OS_
180a0 56 58 57 4f 52 4b 53 20 26 26 20 72 63 21 3d 20  VXWORKS && rc!= 
180b0 2d 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 30  -1 ){.    rc = 0
180c0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
180d0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65  c;.}../*.** Make
180e0 20 73 75 72 65 20 61 6c 6c 20 77 72 69 74 65 73   sure all writes
180f0 20 74 6f 20 61 20 70 61 72 74 69 63 75 6c 61 72   to a particular
18100 20 66 69 6c 65 20 61 72 65 20 63 6f 6d 6d 69 74   file are commit
18110 74 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a  ted to disk..**.
18120 2a 2a 20 49 66 20 64 61 74 61 4f 6e 6c 79 3d 3d  ** If dataOnly==
18130 30 20 74 68 65 6e 20 62 6f 74 68 20 74 68 65 20  0 then both the 
18140 66 69 6c 65 20 69 74 73 65 6c 66 20 61 6e 64 20  file itself and 
18150 69 74 73 20 6d 65 74 61 64 61 74 61 20 28 66 69  its metadata (fi
18160 6c 65 0a 2a 2a 20 73 69 7a 65 2c 20 61 63 63 65  le.** size, acce
18170 73 73 20 74 69 6d 65 2c 20 65 74 63 29 20 61 72  ss time, etc) ar
18180 65 20 73 79 6e 63 65 64 2e 20 20 49 66 20 64 61  e synced.  If da
18190 74 61 4f 6e 6c 79 21 3d 30 20 74 68 65 6e 20 6f  taOnly!=0 then o
181a0 6e 6c 79 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20  nly the.** file 
181b0 64 61 74 61 20 69 73 20 73 79 6e 63 65 64 2e 0a  data is synced..
181c0 2a 2a 0a 2a 2a 20 55 6e 64 65 72 20 55 6e 69 78  **.** Under Unix
181d0 2c 20 61 6c 73 6f 20 6d 61 6b 65 20 73 75 72 65  , also make sure
181e0 20 74 68 61 74 20 74 68 65 20 64 69 72 65 63 74   that the direct
181f0 6f 72 79 20 65 6e 74 72 79 20 66 6f 72 20 74 68  ory entry for th
18200 65 20 66 69 6c 65 0a 2a 2a 20 68 61 73 20 62 65  e file.** has be
18210 65 6e 20 63 72 65 61 74 65 64 20 62 79 20 66 73  en created by fs
18220 79 6e 63 2d 69 6e 67 20 74 68 65 20 64 69 72 65  ync-ing the dire
18230 63 74 6f 72 79 20 74 68 61 74 20 63 6f 6e 74 61  ctory that conta
18240 69 6e 73 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a  ins the file..**
18250 20 49 66 20 77 65 20 64 6f 20 6e 6f 74 20 64 6f   If we do not do
18260 20 74 68 69 73 20 61 6e 64 20 77 65 20 65 6e 63   this and we enc
18270 6f 75 6e 74 65 72 20 61 20 70 6f 77 65 72 20 66  ounter a power f
18280 61 69 6c 75 72 65 2c 20 74 68 65 20 64 69 72 65  ailure, the dire
18290 63 74 6f 72 79 0a 2a 2a 20 65 6e 74 72 79 20 66  ctory.** entry f
182a0 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d  or the journal m
182b0 69 67 68 74 20 6e 6f 74 20 65 78 69 73 74 20 61  ight not exist a
182c0 66 74 65 72 20 77 65 20 72 65 62 6f 6f 74 2e 20  fter we reboot. 
182d0 20 54 68 65 20 6e 65 78 74 0a 2a 2a 20 53 51 4c   The next.** SQL
182e0 69 74 65 20 74 6f 20 61 63 63 65 73 73 20 74 68  ite to access th
182f0 65 20 66 69 6c 65 20 77 69 6c 6c 20 6e 6f 74 20  e file will not 
18300 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20 6a 6f  know that the jo
18310 75 72 6e 61 6c 20 65 78 69 73 74 73 20 28 62 65  urnal exists (be
18320 63 61 75 73 65 0a 2a 2a 20 74 68 65 20 64 69 72  cause.** the dir
18330 65 63 74 6f 72 79 20 65 6e 74 72 79 20 66 6f 72  ectory entry for
18340 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73   the journal was
18350 20 6e 65 76 65 72 20 63 72 65 61 74 65 64 29 20   never created) 
18360 61 6e 64 20 74 68 65 20 74 72 61 6e 73 61 63 74  and the transact
18370 69 6f 6e 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20  ion.** will not 
18380 72 6f 6c 6c 20 62 61 63 6b 20 2d 20 70 6f 73 73  roll back - poss
18390 69 62 6c 79 20 6c 65 61 64 69 6e 67 20 74 6f 20  ibly leading to 
183a0 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  database corrupt
183b0 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
183c0 6e 74 20 75 6e 69 78 53 79 6e 63 28 73 71 6c 69  nt unixSync(sqli
183d0 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
183e0 74 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20  t flags){.  int 
183f0 72 63 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  rc;.  unixFile *
18400 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
18410 65 2a 29 69 64 3b 0a 0a 20 20 69 6e 74 20 69 73  e*)id;..  int is
18420 44 61 74 61 4f 6e 6c 79 20 3d 20 28 66 6c 61 67  DataOnly = (flag
18430 73 26 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41  s&SQLITE_SYNC_DA
18440 54 41 4f 4e 4c 59 29 3b 0a 20 20 69 6e 74 20 69  TAONLY);.  int i
18450 73 46 75 6c 6c 73 79 6e 63 20 3d 20 28 66 6c 61  sFullsync = (fla
18460 67 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45  gs&0x0F)==SQLITE
18470 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a 0a 20 20 2f  _SYNC_FULL;..  /
18480 2a 20 43 68 65 63 6b 20 74 68 61 74 20 6f 6e 65  * Check that one
18490 20 6f 66 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f   of SQLITE_SYNC_
184a0 4e 4f 52 4d 41 4c 20 6f 72 20 46 55 4c 4c 20 77  NORMAL or FULL w
184b0 61 73 20 70 61 73 73 65 64 20 2a 2f 0a 20 20 61  as passed */.  a
184c0 73 73 65 72 74 28 28 66 6c 61 67 73 26 30 78 30  ssert((flags&0x0
184d0 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f  F)==SQLITE_SYNC_
184e0 4e 4f 52 4d 41 4c 0a 20 20 20 20 20 20 7c 7c 20  NORMAL.      || 
184f0 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51  (flags&0x0F)==SQ
18500 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 0a 20  LITE_SYNC_FULL. 
18510 20 29 3b 0a 0a 20 20 2f 2a 20 55 6e 69 78 20 63   );..  /* Unix c
18520 61 6e 6e 6f 74 2c 20 62 75 74 20 73 6f 6d 65 20  annot, but some 
18530 73 79 73 74 65 6d 73 20 6d 61 79 20 72 65 74 75  systems may retu
18540 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 66  rn SQLITE_FULL f
18550 72 6f 6d 20 68 65 72 65 2e 20 54 68 69 73 0a 20  rom here. This. 
18560 20 2a 2a 20 6c 69 6e 65 20 69 73 20 74 6f 20 74   ** line is to t
18570 65 73 74 20 74 68 61 74 20 64 6f 69 6e 67 20 73  est that doing s
18580 6f 20 64 6f 65 73 20 6e 6f 74 20 63 61 75 73 65  o does not cause
18590 20 61 6e 79 20 70 72 6f 62 6c 65 6d 73 2e 0a 20   any problems.. 
185a0 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65 44 69   */.  SimulateDi
185b0 73 6b 66 75 6c 6c 45 72 72 6f 72 28 20 72 65 74  skfullError( ret
185c0 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20  urn SQLITE_FULL 
185d0 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46  );..  assert( pF
185e0 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45  ile );.  OSTRACE
185f0 32 28 22 53 59 4e 43 20 20 20 20 25 2d 33 64 5c  2("SYNC    %-3d\
18600 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 3b 0a 20  n", pFile->h);. 
18610 20 72 63 20 3d 20 66 75 6c 6c 5f 66 73 79 6e 63   rc = full_fsync
18620 28 70 46 69 6c 65 2d 3e 68 2c 20 69 73 46 75 6c  (pFile->h, isFul
18630 6c 73 79 6e 63 2c 20 69 73 44 61 74 61 4f 6e 6c  lsync, isDataOnl
18640 79 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  y);.  SimulateIO
18650 45 72 72 6f 72 28 20 72 63 3d 31 20 29 3b 0a 20  Error( rc=1 );. 
18660 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 70   if( rc ){.    p
18670 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
18680 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 72 65 74  = errno;.    ret
18690 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
186a0 5f 46 53 59 4e 43 3b 0a 20 20 7d 0a 20 20 69 66  _FSYNC;.  }.  if
186b0 28 20 70 46 69 6c 65 2d 3e 64 69 72 66 64 3e 3d  ( pFile->dirfd>=
186c0 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 65 72 72  0 ){.    int err
186d0 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 34 28 22  ;.    OSTRACE4("
186e0 44 49 52 53 59 4e 43 20 25 2d 33 64 20 28 68 61  DIRSYNC %-3d (ha
186f0 76 65 5f 66 75 6c 6c 66 73 79 6e 63 3d 25 64 20  ve_fullfsync=%d 
18700 66 75 6c 6c 73 79 6e 63 3d 25 64 29 5c 6e 22 2c  fullsync=%d)\n",
18710 20 70 46 69 6c 65 2d 3e 64 69 72 66 64 2c 0a 20   pFile->dirfd,. 
18720 20 20 20 20 20 20 20 20 20 20 20 48 41 56 45 5f             HAVE_
18730 46 55 4c 4c 46 53 59 4e 43 2c 20 69 73 46 75 6c  FULLFSYNC, isFul
18740 6c 73 79 6e 63 29 3b 0a 23 69 66 6e 64 65 66 20  lsync);.#ifndef 
18750 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 44  SQLITE_DISABLE_D
18760 49 52 53 59 4e 43 0a 20 20 20 20 2f 2a 20 54 68  IRSYNC.    /* Th
18770 65 20 64 69 72 65 63 74 6f 72 79 20 73 79 6e 63  e directory sync
18780 20 69 73 20 6f 6e 6c 79 20 61 74 74 65 6d 70 74   is only attempt
18790 65 64 20 69 66 20 66 75 6c 6c 5f 66 73 79 6e 63  ed if full_fsync
187a0 20 69 73 0a 20 20 20 20 2a 2a 20 74 75 72 6e 65   is.    ** turne
187b0 64 20 6f 66 66 20 6f 72 20 75 6e 61 76 61 69 6c  d off or unavail
187c0 61 62 6c 65 2e 20 20 49 66 20 61 20 66 75 6c 6c  able.  If a full
187d0 5f 66 73 79 6e 63 20 6f 63 63 75 72 72 65 64 20  _fsync occurred 
187e0 61 62 6f 76 65 2c 0a 20 20 20 20 2a 2a 20 74 68  above,.    ** th
187f0 65 6e 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  en the directory
18800 20 73 79 6e 63 20 69 73 20 73 75 70 65 72 66 6c   sync is superfl
18810 75 6f 75 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  uous..    */.   
18820 20 69 66 28 20 28 21 48 41 56 45 5f 46 55 4c 4c   if( (!HAVE_FULL
18830 46 53 59 4e 43 20 7c 7c 20 21 69 73 46 75 6c 6c  FSYNC || !isFull
18840 73 79 6e 63 29 20 26 26 20 66 75 6c 6c 5f 66 73  sync) && full_fs
18850 79 6e 63 28 70 46 69 6c 65 2d 3e 64 69 72 66 64  ync(pFile->dirfd
18860 2c 30 2c 30 29 20 29 7b 0a 20 20 20 20 20 20 20  ,0,0) ){.       
18870 2f 2a 0a 20 20 20 20 20 20 20 2a 2a 20 57 65 20  /*.       ** We 
18880 68 61 76 65 20 72 65 63 65 69 76 65 64 20 6d 75  have received mu
18890 6c 74 69 70 6c 65 20 72 65 70 6f 72 74 73 20 6f  ltiple reports o
188a0 66 20 66 73 79 6e 63 28 29 20 72 65 74 75 72 6e  f fsync() return
188b0 69 6e 67 0a 20 20 20 20 20 20 20 2a 2a 20 65 72  ing.       ** er
188c0 72 6f 72 73 20 77 68 65 6e 20 61 70 70 6c 69 65  rors when applie
188d0 64 20 74 6f 20 64 69 72 65 63 74 6f 72 69 65 73  d to directories
188e0 20 6f 6e 20 63 65 72 74 61 69 6e 20 66 69 6c 65   on certain file
188f0 20 73 79 73 74 65 6d 73 2e 0a 20 20 20 20 20 20   systems..      
18900 20 2a 2a 20 41 20 66 61 69 6c 65 64 20 64 69 72   ** A failed dir
18910 65 63 74 6f 72 79 20 73 79 6e 63 20 69 73 20 6e  ectory sync is n
18920 6f 74 20 61 20 62 69 67 20 64 65 61 6c 2e 20 20  ot a big deal.  
18930 53 6f 20 69 74 20 73 65 65 6d 73 0a 20 20 20 20  So it seems.    
18940 20 20 20 2a 2a 20 62 65 74 74 65 72 20 74 6f 20     ** better to 
18950 69 67 6e 6f 72 65 20 74 68 65 20 65 72 72 6f 72  ignore the error
18960 2e 20 20 54 69 63 6b 65 74 20 23 31 36 35 37 0a  .  Ticket #1657.
18970 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
18980 20 2f 2a 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45   /* pFile->lastE
18990 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 20 2a 2f  rrno = errno; */
189a0 0a 20 20 20 20 20 20 20 2f 2a 20 72 65 74 75 72  .       /* retur
189b0 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 20  n SQLITE_IOERR; 
189c0 2a 2f 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  */.    }.#endif.
189d0 20 20 20 20 65 72 72 20 3d 20 63 6c 6f 73 65 28      err = close(
189e0 70 46 69 6c 65 2d 3e 64 69 72 66 64 29 3b 20 2f  pFile->dirfd); /
189f0 2a 20 4f 6e 6c 79 20 6e 65 65 64 20 74 6f 20 73  * Only need to s
18a00 79 6e 63 20 6f 6e 63 65 2c 20 73 6f 20 63 6c 6f  ync once, so clo
18a10 73 65 20 74 68 65 20 2a 2f 0a 20 20 20 20 69 66  se the */.    if
18a20 28 20 65 72 72 3d 3d 30 20 29 7b 20 20 20 20 20  ( err==0 ){     
18a30 20 20 20 20 20 20 20 20 20 2f 2a 20 64 69 72 65           /* dire
18a40 63 74 6f 72 79 20 77 68 65 6e 20 77 65 20 61 72  ctory when we ar
18a50 65 20 64 6f 6e 65 20 2a 2f 0a 20 20 20 20 20 20  e done */.      
18a60 70 46 69 6c 65 2d 3e 64 69 72 66 64 20 3d 20 2d  pFile->dirfd = -
18a70 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
18a80 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
18a90 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
18aa0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
18ab0 49 4f 45 52 52 5f 44 49 52 5f 43 4c 4f 53 45 3b  IOERR_DIR_CLOSE;
18ac0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
18ad0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
18ae0 20 54 72 75 6e 63 61 74 65 20 61 6e 20 6f 70 65   Truncate an ope
18af0 6e 20 66 69 6c 65 20 74 6f 20 61 20 73 70 65 63  n file to a spec
18b00 69 66 69 65 64 20 73 69 7a 65 0a 2a 2f 0a 73 74  ified size.*/.st
18b10 61 74 69 63 20 69 6e 74 20 75 6e 69 78 54 72 75  atic int unixTru
18b20 6e 63 61 74 65 28 73 71 6c 69 74 65 33 5f 66 69  ncate(sqlite3_fi
18b30 6c 65 20 2a 69 64 2c 20 69 36 34 20 6e 42 79 74  le *id, i64 nByt
18b40 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  e){.  int rc;.  
18b50 61 73 73 65 72 74 28 20 69 64 20 29 3b 0a 20 20  assert( id );.  
18b60 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
18b70 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
18b80 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 20 29 3b  OERR_TRUNCATE );
18b90 0a 20 20 72 63 20 3d 20 66 74 72 75 6e 63 61 74  .  rc = ftruncat
18ba0 65 28 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64  e(((unixFile*)id
18bb0 29 2d 3e 68 2c 20 28 6f 66 66 5f 74 29 6e 42 79  )->h, (off_t)nBy
18bc0 74 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  te);.  if( rc ){
18bd0 0a 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a  .    ((unixFile*
18be0 29 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  )id)->lastErrno 
18bf0 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 72 65 74  = errno;.    ret
18c00 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
18c10 5f 54 52 55 4e 43 41 54 45 3b 0a 20 20 7d 65 6c  _TRUNCATE;.  }el
18c20 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  se{.    return S
18c30 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a  QLITE_OK;.  }.}.
18c40 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65  ./*.** Determine
18c50 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a   the current siz
18c60 65 20 6f 66 20 61 20 66 69 6c 65 20 69 6e 20 62  e of a file in b
18c70 79 74 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ytes.*/.static i
18c80 6e 74 20 75 6e 69 78 46 69 6c 65 53 69 7a 65 28  nt unixFileSize(
18c90 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
18ca0 2c 20 69 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20  , i64 *pSize){. 
18cb0 20 69 6e 74 20 72 63 3b 0a 20 20 73 74 72 75 63   int rc;.  struc
18cc0 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20 61 73  t stat buf;.  as
18cd0 73 65 72 74 28 20 69 64 20 29 3b 0a 20 20 72 63  sert( id );.  rc
18ce0 20 3d 20 66 73 74 61 74 28 28 28 75 6e 69 78 46   = fstat(((unixF
18cf0 69 6c 65 2a 29 69 64 29 2d 3e 68 2c 20 26 62 75  ile*)id)->h, &bu
18d00 66 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  f);.  SimulateIO
18d10 45 72 72 6f 72 28 20 72 63 3d 31 20 29 3b 0a 20  Error( rc=1 );. 
18d20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20   if( rc!=0 ){.  
18d30 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64    ((unixFile*)id
18d40 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65  )->lastErrno = e
18d50 72 72 6e 6f 3b 0a 20 20 20 20 72 65 74 75 72 6e  rrno;.    return
18d60 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53   SQLITE_IOERR_FS
18d70 54 41 54 3b 0a 20 20 7d 0a 20 20 2a 70 53 69 7a  TAT;.  }.  *pSiz
18d80 65 20 3d 20 62 75 66 2e 73 74 5f 73 69 7a 65 3b  e = buf.st_size;
18d90 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 6f 70 65 6e  ..  /* When open
18da0 69 6e 67 20 61 20 7a 65 72 6f 2d 73 69 7a 65 20  ing a zero-size 
18db0 64 61 74 61 62 61 73 65 2c 20 74 68 65 20 66 69  database, the fi
18dc0 6e 64 4c 6f 63 6b 49 6e 66 6f 28 29 20 70 72 6f  ndLockInfo() pro
18dd0 63 65 64 75 72 65 0a 20 20 2a 2a 20 77 72 69 74  cedure.  ** writ
18de0 65 73 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65  es a single byte
18df0 20 69 6e 74 6f 20 74 68 61 74 20 66 69 6c 65 20   into that file 
18e00 69 6e 20 6f 72 64 65 72 20 74 6f 20 77 6f 72 6b  in order to work
18e10 20 61 72 6f 75 6e 64 20 61 20 62 75 67 0a 20 20   around a bug.  
18e20 2a 2a 20 69 6e 20 74 68 65 20 4f 53 2d 58 20 6d  ** in the OS-X m
18e30 73 64 6f 73 20 66 69 6c 65 73 79 73 74 65 6d 2e  sdos filesystem.
18e40 20 20 49 6e 20 6f 72 64 65 72 20 74 6f 20 61 76    In order to av
18e50 6f 69 64 20 70 72 6f 62 6c 65 6d 73 20 77 69 74  oid problems wit
18e60 68 20 75 70 70 65 72 0a 20 20 2a 2a 20 6c 61 79  h upper.  ** lay
18e70 65 72 73 2c 20 77 65 20 6e 65 65 64 20 74 6f 20  ers, we need to 
18e80 72 65 70 6f 72 74 20 74 68 69 73 20 66 69 6c 65  report this file
18e90 20 73 69 7a 65 20 61 73 20 7a 65 72 6f 20 65 76   size as zero ev
18ea0 65 6e 20 74 68 6f 75 67 68 20 69 74 20 69 73 0a  en though it is.
18eb0 20 20 2a 2a 20 72 65 61 6c 6c 79 20 31 2e 20 20    ** really 1.  
18ec0 20 54 69 63 6b 65 74 20 23 33 32 36 30 2e 0a 20   Ticket #3260.. 
18ed0 20 2a 2f 0a 20 20 69 66 28 20 2a 70 53 69 7a 65   */.  if( *pSize
18ee0 3d 3d 31 20 29 20 2a 70 53 69 7a 65 20 3d 20 30  ==1 ) *pSize = 0
18ef0 3b 0a 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ;...  return SQL
18f00 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53  ITE_OK;.}..#if S
18f10 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
18f20 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65  KING_STYLE && de
18f30 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
18f40 0a 2f 2a 0a 2a 2a 20 48 61 6e 64 6c 65 72 20 66  ./*.** Handler f
18f50 6f 72 20 70 72 6f 78 79 2d 6c 6f 63 6b 69 6e 67  or proxy-locking
18f60 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 76 65   file-control ve
18f70 72 62 73 2e 20 20 44 65 66 69 6e 65 64 20 62 65  rbs.  Defined be
18f80 6c 6f 77 20 69 6e 20 74 68 65 0a 2a 2a 20 70 72  low in the.** pr
18f90 6f 78 79 69 6e 67 20 6c 6f 63 6b 69 6e 67 20 64  oxying locking d
18fa0 69 76 69 73 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  ivision..*/.stat
18fb0 69 63 20 69 6e 74 20 70 72 6f 78 79 46 69 6c 65  ic int proxyFile
18fc0 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f  Control(sqlite3_
18fd0 66 69 6c 65 2a 2c 69 6e 74 2c 76 6f 69 64 2a 29  file*,int,void*)
18fe0 3b 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  ;.#endif.../*.**
18ff0 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 6e 64   Information and
19000 20 63 6f 6e 74 72 6f 6c 20 6f 66 20 61 6e 20 6f   control of an o
19010 70 65 6e 20 66 69 6c 65 20 68 61 6e 64 6c 65 2e  pen file handle.
19020 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
19030 6e 69 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 73  nixFileControl(s
19040 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
19050 20 69 6e 74 20 6f 70 2c 20 76 6f 69 64 20 2a 70   int op, void *p
19060 41 72 67 29 7b 0a 20 20 73 77 69 74 63 68 28 20  Arg){.  switch( 
19070 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53  op ){.    case S
19080 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b  QLITE_FCNTL_LOCK
19090 53 54 41 54 45 3a 20 7b 0a 20 20 20 20 20 20 2a  STATE: {.      *
190a0 28 69 6e 74 2a 29 70 41 72 67 20 3d 20 28 28 75  (int*)pArg = ((u
190b0 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 6f  nixFile*)id)->lo
190c0 63 6b 74 79 70 65 3b 0a 20 20 20 20 20 20 72 65  cktype;.      re
190d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
190e0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
190f0 51 4c 49 54 45 5f 4c 41 53 54 5f 45 52 52 4e 4f  QLITE_LAST_ERRNO
19100 3a 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a  : {.      *(int*
19110 29 70 41 72 67 20 3d 20 28 28 75 6e 69 78 46 69  )pArg = ((unixFi
19120 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72 72  le*)id)->lastErr
19130 6e 6f 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  no;.      return
19140 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
19150 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  }.#ifndef NDEBUG
19160 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65  .    /* The page
19170 72 20 63 61 6c 6c 73 20 74 68 69 73 20 6d 65 74  r calls this met
19180 68 6f 64 20 74 6f 20 73 69 67 6e 61 6c 20 74 68  hod to signal th
19190 61 74 20 69 74 20 68 61 73 20 64 6f 6e 65 0a 20  at it has done. 
191a0 20 20 20 2a 2a 20 61 20 72 6f 6c 6c 62 61 63 6b     ** a rollback
191b0 20 61 6e 64 20 74 68 61 74 20 74 68 65 20 64 61   and that the da
191c0 74 61 62 61 73 65 20 69 73 20 74 68 65 72 65 66  tabase is theref
191d0 6f 72 65 20 75 6e 63 68 61 6e 67 65 64 20 61 6e  ore unchanged an
191e0 64 0a 20 20 20 20 2a 2a 20 69 74 20 68 65 6e 63  d.    ** it henc
191f0 65 20 69 74 20 69 73 20 4f 4b 20 66 6f 72 20 74  e it is OK for t
19200 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  he transaction c
19210 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 74 6f  hange counter to
19220 20 62 65 0a 20 20 20 20 2a 2a 20 75 6e 63 68 61   be.    ** uncha
19230 6e 67 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  nged..    */.   
19240 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
19250 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44 3a  TL_DB_UNCHANGED:
19260 20 7b 0a 20 20 20 20 20 20 28 28 75 6e 69 78 46   {.      ((unixF
19270 69 6c 65 2a 29 69 64 29 2d 3e 64 62 55 70 64 61  ile*)id)->dbUpda
19280 74 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65  te = 0;.      re
19290 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
192a0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66      }.#endif.#if
192b0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
192c0 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20  OCKING_STYLE && 
192d0 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
192e0 5f 29 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  _).    case SQLI
192f0 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59  TE_SET_LOCKPROXY
19300 46 49 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 53  FILE:.    case S
19310 51 4c 49 54 45 5f 47 45 54 5f 4c 4f 43 4b 50 52  QLITE_GET_LOCKPR
19320 4f 58 59 46 49 4c 45 3a 20 7b 0a 20 20 20 20 20  OXYFILE: {.     
19330 20 72 65 74 75 72 6e 20 70 72 6f 78 79 46 69 6c   return proxyFil
19340 65 43 6f 6e 74 72 6f 6c 28 69 64 2c 6f 70 2c 70  eControl(id,op,p
19350 41 72 67 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  Arg);.    }.#end
19360 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41  if /* SQLITE_ENA
19370 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
19380 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41  E && defined(__A
19390 50 50 4c 45 5f 5f 29 20 2a 2f 0a 20 20 7d 0a 20  PPLE__) */.  }. 
193a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
193b0 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  RROR;.}../*.** R
193c0 65 74 75 72 6e 20 74 68 65 20 73 65 63 74 6f 72  eturn the sector
193d0 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6f   size in bytes o
193e0 66 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  f the underlying
193f0 20 62 6c 6f 63 6b 20 64 65 76 69 63 65 20 66 6f   block device fo
19400 72 0a 2a 2a 20 74 68 65 20 73 70 65 63 69 66 69  r.** the specifi
19410 65 64 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73  ed file. This is
19420 20 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20 35   almost always 5
19430 31 32 20 62 79 74 65 73 2c 20 62 75 74 20 6d 61  12 bytes, but ma
19440 79 20 62 65 0a 2a 2a 20 6c 61 72 67 65 72 20 66  y be.** larger f
19450 6f 72 20 73 6f 6d 65 20 64 65 76 69 63 65 73 2e  or some devices.
19460 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 63 6f  .**.** SQLite co
19470 64 65 20 61 73 73 75 6d 65 73 20 74 68 69 73 20  de assumes this 
19480 66 75 6e 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20  function cannot 
19490 66 61 69 6c 2e 20 49 74 20 61 6c 73 6f 20 61 73  fail. It also as
194a0 73 75 6d 65 73 20 74 68 61 74 0a 2a 2a 20 69 66  sumes that.** if
194b0 20 74 77 6f 20 66 69 6c 65 73 20 61 72 65 20 63   two files are c
194c0 72 65 61 74 65 64 20 69 6e 20 74 68 65 20 73 61  reated in the sa
194d0 6d 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 64  me file-system d
194e0 69 72 65 63 74 6f 72 79 20 28 69 2e 65 2e 0a 2a  irectory (i.e..*
194f0 2a 20 61 20 64 61 74 61 62 61 73 65 20 61 6e 64  * a database and
19500 20 69 74 73 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   its journal fil
19510 65 29 20 74 68 61 74 20 74 68 65 20 73 65 63 74  e) that the sect
19520 6f 72 20 73 69 7a 65 20 77 69 6c 6c 20 62 65 20  or size will be 
19530 74 68 65 0a 2a 2a 20 73 61 6d 65 20 66 6f 72 20  the.** same for 
19540 62 6f 74 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  both..*/.static 
19550 69 6e 74 20 75 6e 69 78 53 65 63 74 6f 72 53 69  int unixSectorSi
19560 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ze(sqlite3_file 
19570 2a 4e 6f 74 55 73 65 64 29 7b 0a 20 20 55 4e 55  *NotUsed){.  UNU
19580 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
19590 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e  tUsed);.  return
195a0 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
195b0 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 7d 0a 0a  SECTOR_SIZE;.}..
195c0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
195d0 20 64 65 76 69 63 65 20 63 68 61 72 61 63 74 65   device characte
195e0 72 69 73 74 69 63 73 20 66 6f 72 20 74 68 65 20  ristics for the 
195f0 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20 61 6c  file. This is al
19600 77 61 79 73 20 30 20 66 6f 72 20 75 6e 69 78 2e  ways 0 for unix.
19610 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
19620 6e 69 78 44 65 76 69 63 65 43 68 61 72 61 63 74  nixDeviceCharact
19630 65 72 69 73 74 69 63 73 28 73 71 6c 69 74 65 33  eristics(sqlite3
19640 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64 29 7b  _file *NotUsed){
19650 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
19660 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
19670 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
19680 2a 2a 20 48 65 72 65 20 65 6e 64 73 20 74 68 65  ** Here ends the
19690 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
196a0 6f 66 20 61 6c 6c 20 73 71 6c 69 74 65 33 5f 66  of all sqlite3_f
196b0 69 6c 65 20 6d 65 74 68 6f 64 73 2e 0a 2a 2a 0a  ile methods..**.
196c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
196d0 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 73 71 6c 69 74  ****** End sqlit
196e0 65 33 5f 66 69 6c 65 20 4d 65 74 68 6f 64 73 20  e3_file Methods 
196f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19700 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
19710 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19720 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19730 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19740 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19750 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
19760 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 64 69 76 69  ./*.** This divi
19770 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 64 65  sion contains de
19780 66 69 6e 69 74 69 6f 6e 73 20 6f 66 20 73 71 6c  finitions of sql
19790 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
197a0 6f 62 6a 65 63 74 73 20 74 68 61 74 0a 2a 2a 20  objects that.** 
197b0 69 6d 70 6c 65 6d 65 6e 74 20 76 61 72 69 6f 75  implement variou
197c0 73 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 73  s file locking s
197d0 74 72 61 74 65 67 69 65 73 2e 20 20 49 74 20 61  trategies.  It a
197e0 6c 73 6f 20 63 6f 6e 74 61 69 6e 73 20 64 65 66  lso contains def
197f0 69 6e 69 74 69 6f 6e 73 0a 2a 2a 20 6f 66 20 22  initions.** of "
19800 66 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f 6e  finder" function
19810 73 2e 20 20 41 20 66 69 6e 64 65 72 2d 66 75 6e  s.  A finder-fun
19820 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
19830 20 6c 6f 63 61 74 65 20 74 68 65 20 61 70 70 72   locate the appr
19840 6f 70 72 69 61 74 65 0a 2a 2a 20 73 71 6c 69 74  opriate.** sqlit
19850 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62  e3_io_methods ob
19860 6a 65 63 74 20 66 6f 72 20 61 20 70 61 72 74 69  ject for a parti
19870 63 75 6c 61 72 20 64 61 74 61 62 61 73 65 20 66  cular database f
19880 69 6c 65 2e 20 20 54 68 65 20 70 41 70 70 44 61  ile.  The pAppDa
19890 74 61 0a 2a 2a 20 66 69 65 6c 64 20 6f 66 20 74  ta.** field of t
198a0 68 65 20 73 71 6c 69 74 65 33 5f 76 66 73 20 56  he sqlite3_vfs V
198b0 46 53 20 6f 62 6a 65 63 74 73 20 61 72 65 20 69  FS objects are i
198c0 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 62 65  nitialized to be
198d0 20 70 6f 69 6e 74 65 72 73 20 74 6f 0a 2a 2a 20   pointers to.** 
198e0 74 68 65 20 63 6f 72 72 65 63 74 20 66 69 6e 64  the correct find
198f0 65 72 2d 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20  er-function for 
19900 74 68 61 74 20 56 46 53 2e 0a 2a 2a 0a 2a 2a 20  that VFS..**.** 
19910 4d 6f 73 74 20 66 69 6e 64 65 72 20 66 75 6e 63  Most finder func
19920 74 69 6f 6e 73 20 72 65 74 75 72 6e 20 61 20 70  tions return a p
19930 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 69 78 65  ointer to a fixe
19940 64 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  d sqlite3_io_met
19950 68 6f 64 73 0a 2a 2a 20 6f 62 6a 65 63 74 2e 20  hods.** object. 
19960 20 54 68 65 20 6f 6e 6c 79 20 69 6e 74 65 72 65   The only intere
19970 73 74 69 6e 67 20 66 69 6e 64 65 72 2d 66 75 6e  sting finder-fun
19980 63 74 69 6f 6e 20 69 73 20 61 75 74 6f 6c 6f 63  ction is autoloc
19990 6b 49 6f 46 69 6e 64 65 72 2c 20 77 68 69 63 68  kIoFinder, which
199a0 0a 2a 2a 20 6c 6f 6f 6b 73 20 61 74 20 74 68 65  .** looks at the
199b0 20 66 69 6c 65 73 79 73 74 65 6d 20 74 79 70 65   filesystem type
199c0 20 61 6e 64 20 74 72 69 65 73 20 74 6f 20 67 75   and tries to gu
199d0 65 73 73 20 74 68 65 20 62 65 73 74 20 6c 6f 63  ess the best loc
199e0 6b 69 6e 67 0a 2a 2a 20 73 74 72 61 74 65 67 79  king.** strategy
199f0 20 66 72 6f 6d 20 74 68 61 74 2e 0a 2a 2a 0a 2a   from that..**.*
19a00 2a 20 46 6f 72 20 66 69 6e 64 65 72 2d 66 75 6e  * For finder-fun
19a10 74 69 6f 6e 20 46 2c 20 74 77 6f 20 6f 62 6a 65  tion F, two obje
19a20 63 74 73 20 61 72 65 20 63 72 65 61 74 65 64 3a  cts are created:
19a30 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 54 68  .**.**    (1) Th
19a40 65 20 72 65 61 6c 20 66 69 6e 64 65 72 2d 66 75  e real finder-fu
19a50 6e 63 74 69 6f 6e 20 6e 61 6d 65 64 20 22 46 49  nction named "FI
19a60 6d 70 74 28 29 22 2e 0a 2a 2a 0a 2a 2a 20 20 20  mpt()"..**.**   
19a70 20 28 32 29 20 41 20 63 6f 6e 73 74 61 6e 74 20   (2) A constant 
19a80 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 69 73 20  pointer to this 
19a90 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 64 20 6a  function named j
19aa0 75 73 74 20 22 46 22 2e 0a 2a 2a 0a 2a 2a 0a 2a  ust "F"..**.**.*
19ab0 2a 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  * A pointer to t
19ac0 68 65 20 46 20 70 6f 69 6e 74 65 72 20 69 73 20  he F pointer is 
19ad0 75 73 65 64 20 61 73 20 74 68 65 20 70 41 70 70  used as the pApp
19ae0 44 61 74 61 20 76 61 6c 75 65 20 66 6f 72 20 56  Data value for V
19af0 46 53 0a 2a 2a 20 6f 62 6a 65 63 74 73 2e 20 20  FS.** objects.  
19b00 57 65 20 68 61 76 65 20 74 6f 20 64 6f 20 74 68  We have to do th
19b10 69 73 20 69 6e 73 74 65 61 64 20 6f 66 20 6c 65  is instead of le
19b20 74 74 69 6e 67 20 70 41 70 70 44 61 74 61 20 70  tting pAppData p
19b30 6f 69 6e 74 0a 2a 2a 20 64 69 72 65 63 74 6c 79  oint.** directly
19b40 20 61 74 20 74 68 65 20 66 69 6e 64 65 72 2d 66   at the finder-f
19b50 75 6e 63 74 69 6f 6e 20 73 69 6e 63 65 20 43 39  unction since C9
19b60 30 20 72 75 6c 65 73 20 70 72 65 76 65 6e 74 20  0 rules prevent 
19b70 61 20 76 6f 69 64 2a 0a 2a 2a 20 66 72 6f 6d 20  a void*.** from 
19b80 62 65 20 63 61 73 74 20 69 6e 74 6f 20 61 20 66  be cast into a f
19b90 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 2e  unction pointer.
19ba0 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 45 61 63 68 20 69  .**.**.** Each i
19bb0 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20  nstance of this 
19bc0 6d 61 63 72 6f 20 67 65 6e 65 72 61 74 65 73 20  macro generates 
19bd0 74 77 6f 20 6f 62 6a 65 63 74 73 3a 0a 2a 2a 0a  two objects:.**.
19be0 2a 2a 20 20 20 2a 20 20 41 20 63 6f 6e 73 74 61  **   *  A consta
19bf0 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  nt sqlite3_io_me
19c00 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 63 61 6c  thods object cal
19c10 6c 20 4d 45 54 48 4f 44 20 74 68 61 74 20 68 61  l METHOD that ha
19c20 73 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20  s locking.**    
19c30 20 20 6d 65 74 68 6f 64 73 20 43 4c 4f 53 45 2c    methods CLOSE,
19c40 20 4c 4f 43 4b 2c 20 55 4e 4c 4f 43 4b 2c 20 43   LOCK, UNLOCK, C
19c50 4b 52 45 53 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20  KRESLOCK..**.** 
19c60 20 20 2a 20 20 41 6e 20 49 2f 4f 20 6d 65 74 68    *  An I/O meth
19c70 6f 64 20 66 69 6e 64 65 72 20 66 75 6e 63 74 69  od finder functi
19c80 6f 6e 20 63 61 6c 6c 65 64 20 46 49 4e 44 45 52  on called FINDER
19c90 20 74 68 61 74 20 72 65 74 75 72 6e 73 20 61 20   that returns a 
19ca0 70 6f 69 6e 74 65 72 0a 2a 2a 20 20 20 20 20 20  pointer.**      
19cb0 74 6f 20 74 68 65 20 4d 45 54 48 4f 44 20 6f 62  to the METHOD ob
19cc0 6a 65 63 74 20 69 6e 20 74 68 65 20 70 72 65 76  ject in the prev
19cd0 69 6f 75 73 20 62 75 6c 6c 65 74 2e 0a 2a 2f 0a  ious bullet..*/.
19ce0 23 64 65 66 69 6e 65 20 49 4f 4d 45 54 48 4f 44  #define IOMETHOD
19cf0 53 28 46 49 4e 44 45 52 2c 20 4d 45 54 48 4f 44  S(FINDER, METHOD
19d00 2c 20 43 4c 4f 53 45 2c 20 4c 4f 43 4b 2c 20 55  , CLOSE, LOCK, U
19d10 4e 4c 4f 43 4b 2c 20 43 4b 4c 4f 43 4b 29 20 20  NLOCK, CKLOCK)  
19d20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 73               \.s
19d30 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69  tatic const sqli
19d40 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 4d  te3_io_methods M
19d50 45 54 48 4f 44 20 3d 20 7b 20 20 20 20 20 20 20  ETHOD = {       
19d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19d70 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
19d80 20 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   1,             
19d90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19da0 69 56 65 72 73 69 6f 6e 20 2a 2f 20 20 20 20 20  iVersion */     
19db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19dc0 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
19dd0 43 4c 4f 53 45 2c 20 20 20 20 20 20 20 20 20 20  CLOSE,          
19de0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
19df0 43 6c 6f 73 65 20 2a 2f 20 20 20 20 20 20 20 20  Close */        
19e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19e10 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75            \.   u
19e20 6e 69 78 52 65 61 64 2c 20 20 20 20 20 20 20 20  nixRead,        
19e30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52             /* xR
19e40 65 61 64 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ead */          
19e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19e60 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e           \.   un
19e70 69 78 57 72 69 74 65 2c 20 20 20 20 20 20 20 20  ixWrite,        
19e80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 57 72            /* xWr
19e90 69 74 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ite */          
19ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19eb0 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69          \.   uni
19ec0 78 54 72 75 6e 63 61 74 65 2c 20 20 20 20 20 20  xTruncate,      
19ed0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 54 72 75           /* xTru
19ee0 6e 63 61 74 65 20 2a 2f 20 20 20 20 20 20 20 20  ncate */        
19ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19f00 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78         \.   unix
19f10 53 79 6e 63 2c 20 20 20 20 20 20 20 20 20 20 20  Sync,           
19f20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 79 6e 63          /* xSync
19f30 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
19f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19f50 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 46        \.   unixF
19f60 69 6c 65 53 69 7a 65 2c 20 20 20 20 20 20 20 20  ileSize,        
19f70 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 65 53         /* xFileS
19f80 69 7a 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ize */          
19f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19fa0 20 20 20 20 20 5c 0a 20 20 20 4c 4f 43 4b 2c 20       \.   LOCK, 
19fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19fc0 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 2a        /* xLock *
19fd0 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
19fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19ff0 20 20 20 20 5c 0a 20 20 20 55 4e 4c 4f 43 4b 2c      \.   UNLOCK,
1a000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a010 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20       /* xUnlock 
1a020 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
1a030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a040 20 20 20 5c 0a 20 20 20 43 4b 4c 4f 43 4b 2c 20     \.   CKLOCK, 
1a050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a060 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73      /* xCheckRes
1a070 65 72 76 65 64 4c 6f 63 6b 20 2a 2f 20 20 20 20  ervedLock */    
1a080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a090 20 20 5c 0a 20 20 20 75 6e 69 78 46 69 6c 65 43    \.   unixFileC
1a0a0 6f 6e 74 72 6f 6c 2c 20 20 20 20 20 20 20 20 20  ontrol,         
1a0b0 20 20 20 2f 2a 20 78 46 69 6c 65 43 6f 6e 74 72     /* xFileContr
1a0c0 6f 6c 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  ol */           
1a0d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a0e0 20 5c 0a 20 20 20 75 6e 69 78 53 65 63 74 6f 72   \.   unixSector
1a0f0 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20  Size,           
1a100 20 20 2f 2a 20 78 53 65 63 74 6f 72 53 69 7a 65    /* xSectorSize
1a110 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
1a120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a130 5c 0a 20 20 20 75 6e 69 78 44 65 76 69 63 65 43  \.   unixDeviceC
1a140 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20 20  haracteristics  
1a150 20 2f 2a 20 78 44 65 76 69 63 65 43 61 70 61 62   /* xDeviceCapab
1a160 69 6c 69 74 69 65 73 20 2a 2f 20 20 20 20 20 20  ilities */      
1a170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
1a180 0a 7d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  .};             
1a190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a1b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
1a1d0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c  static const sql
1a1e0 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
1a1f0 2a 46 49 4e 44 45 52 23 23 49 6d 70 6c 28 63 6f  *FINDER##Impl(co
1a200 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 75 6e 69  nst char *z, uni
1a210 78 46 69 6c 65 20 2a 70 29 7b 20 20 20 5c 0a 20  xFile *p){   \. 
1a220 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
1a230 52 28 7a 29 3b 20 55 4e 55 53 45 44 5f 50 41 52  R(z); UNUSED_PAR
1a240 41 4d 45 54 45 52 28 70 29 3b 20 20 20 20 20 20  AMETER(p);      
1a250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a260 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
1a270 72 65 74 75 72 6e 20 26 4d 45 54 48 4f 44 3b 20  return &METHOD; 
1a280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a2a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a2b0 20 20 20 20 20 20 20 20 20 20 20 5c 0a 7d 20 20             \.}  
1a2c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a2d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a2e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a2f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a300 20 20 20 20 20 20 20 20 20 20 5c 0a 73 74 61 74            \.stat
1a310 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ic const sqlite3
1a320 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 28 2a 63  _io_methods *(*c
1a330 6f 6e 73 74 20 46 49 4e 44 45 52 29 28 63 6f 6e  onst FINDER)(con
1a340 73 74 20 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c  st char*,unixFil
1a350 65 20 2a 70 29 20 20 20 20 5c 0a 20 20 20 20 3d  e *p)    \.    =
1a360 20 46 49 4e 44 45 52 23 23 49 6d 70 6c 3b 0a 0a   FINDER##Impl;..
1a370 2f 2a 0a 2a 2a 20 48 65 72 65 20 61 72 65 20 61  /*.** Here are a
1a380 6c 6c 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65  ll of the sqlite
1a390 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a  3_io_methods obj
1a3a0 65 63 74 73 20 66 6f 72 20 65 61 63 68 20 6f 66  ects for each of
1a3b0 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20   the.** locking 
1a3c0 73 74 72 61 74 65 67 69 65 73 2e 20 20 46 75 6e  strategies.  Fun
1a3d0 63 74 69 6f 6e 73 20 74 68 61 74 20 72 65 74 75  ctions that retu
1a3e0 72 6e 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 74  rn pointers to t
1a3f0 68 65 73 65 20 6d 65 74 68 6f 64 73 0a 2a 2a 20  hese methods.** 
1a400 61 72 65 20 61 6c 73 6f 20 63 72 65 61 74 65 64  are also created
1a410 2e 0a 2a 2f 0a 49 4f 4d 45 54 48 4f 44 53 28 0a  ..*/.IOMETHODS(.
1a420 20 20 70 6f 73 69 78 49 6f 46 69 6e 64 65 72 2c    posixIoFinder,
1a430 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1a440 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e  inder function n
1a450 61 6d 65 20 2a 2f 0a 20 20 70 6f 73 69 78 49 6f  ame */.  posixIo
1a460 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20  Methods,        
1a470 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f     /* sqlite3_io
1a480 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20  _methods object 
1a490 6e 61 6d 65 20 2a 2f 0a 20 20 75 6e 69 78 43 6c  name */.  unixCl
1a4a0 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ose,            
1a4b0 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65      /* xClose me
1a4c0 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 4c 6f  thod */.  unixLo
1a4d0 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
1a4e0 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74      /* xLock met
1a4f0 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 55 6e 6c  hod */.  unixUnl
1a500 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
1a510 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65     /* xUnlock me
1a520 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 43 68  thod */.  unixCh
1a530 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20  eckReservedLock 
1a540 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73      /* xCheckRes
1a550 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64  ervedLock method
1a560 20 2a 2f 0a 29 0a 49 4f 4d 45 54 48 4f 44 53 28   */.).IOMETHODS(
1a570 0a 20 20 6e 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65  .  nolockIoFinde
1a580 72 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  r,           /* 
1a590 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20  Finder function 
1a5a0 6e 61 6d 65 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b  name */.  nolock
1a5b0 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20  IoMethods,      
1a5c0 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69      /* sqlite3_i
1a5d0 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74  o_methods object
1a5e0 20 6e 61 6d 65 20 2a 2f 0a 20 20 6e 6f 6c 6f 63   name */.  noloc
1a5f0 6b 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20  kClose,         
1a600 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d       /* xClose m
1a610 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63  ethod */.  noloc
1a620 6b 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  kLock,          
1a630 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65       /* xLock me
1a640 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b  thod */.  nolock
1a650 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  Unlock,         
1a660 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d      /* xUnlock m
1a670 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63  ethod */.  noloc
1a680 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  kCheckReservedLo
1a690 63 6b 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65  ck   /* xCheckRe
1a6a0 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f  servedLock metho
1a6b0 64 20 2a 2f 0a 29 0a 49 4f 4d 45 54 48 4f 44 53  d */.).IOMETHODS
1a6c0 28 0a 20 20 64 6f 74 6c 6f 63 6b 49 6f 46 69 6e  (.  dotlockIoFin
1a6d0 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  der,          /*
1a6e0 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e   Finder function
1a6f0 20 6e 61 6d 65 20 2a 2f 0a 20 20 64 6f 74 6c 6f   name */.  dotlo
1a700 63 6b 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20  ckIoMethods,    
1a710 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f       /* sqlite3_
1a720 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63  io_methods objec
1a730 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 64 6f 74 6c  t name */.  dotl
1a740 6f 63 6b 43 6c 6f 73 65 2c 20 20 20 20 20 20 20  ockClose,       
1a750 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20        /* xClose 
1a760 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 64 6f 74 6c  method */.  dotl
1a770 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20  ockLock,        
1a780 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d        /* xLock m
1a790 65 74 68 6f 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f  ethod */.  dotlo
1a7a0 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20  ckUnlock,       
1a7b0 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20       /* xUnlock 
1a7c0 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 64 6f 74 6c  method */.  dotl
1a7d0 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64  ockCheckReserved
1a7e0 4c 6f 63 6b 20 20 2f 2a 20 78 43 68 65 63 6b 52  Lock  /* xCheckR
1a7f0 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68  eservedLock meth
1a800 6f 64 20 2a 2f 0a 29 0a 0a 23 69 66 20 53 51 4c  od */.)..#if SQL
1a810 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
1a820 4e 47 5f 53 54 59 4c 45 20 26 26 20 21 4f 53 5f  NG_STYLE && !OS_
1a830 56 58 57 4f 52 4b 53 0a 49 4f 4d 45 54 48 4f 44  VXWORKS.IOMETHOD
1a840 53 28 0a 20 20 66 6c 6f 63 6b 49 6f 46 69 6e 64  S(.  flockIoFind
1a850 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  er,            /
1a860 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f  * Finder functio
1a870 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 66 6c 6f 63  n name */.  floc
1a880 6b 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20  kIoMethods,     
1a890 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33        /* sqlite3
1a8a0 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65  _io_methods obje
1a8b0 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 66 6c 6f  ct name */.  flo
1a8c0 63 6b 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20  ckClose,        
1a8d0 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65         /* xClose
1a8e0 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f   method */.  flo
1a8f0 63 6b 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  ckLock,         
1a900 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20         /* xLock 
1a910 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f 63  method */.  floc
1a920 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20  kUnlock,        
1a930 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b        /* xUnlock
1a940 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f   method */.  flo
1a950 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  ckCheckReservedL
1a960 6f 63 6b 20 20 20 20 2f 2a 20 78 43 68 65 63 6b  ock    /* xCheck
1a970 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74  ReservedLock met
1a980 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a  hod */.).#endif.
1a990 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
1a9a0 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 73 65 6d  IOMETHODS(.  sem
1a9b0 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20  IoFinder,       
1a9c0 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72         /* Finder
1a9d0 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a   function name *
1a9e0 2f 0a 20 20 73 65 6d 49 6f 4d 65 74 68 6f 64 73  /.  semIoMethods
1a9f0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
1aa00 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
1aa10 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20  ods object name 
1aa20 2a 2f 0a 20 20 73 65 6d 43 6c 6f 73 65 2c 20 20  */.  semClose,  
1aa30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1aa40 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20  * xClose method 
1aa50 2a 2f 0a 20 20 73 65 6d 4c 6f 63 6b 2c 20 20 20  */.  semLock,   
1aa60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1aa70 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  * xLock method *
1aa80 2f 0a 20 20 73 65 6d 55 6e 6c 6f 63 6b 2c 20 20  /.  semUnlock,  
1aa90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1aaa0 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20   xUnlock method 
1aab0 2a 2f 0a 20 20 73 65 6d 43 68 65 63 6b 52 65 73  */.  semCheckRes
1aac0 65 72 76 65 64 4c 6f 63 6b 20 20 20 20 20 20 2f  ervedLock      /
1aad0 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  * xCheckReserved
1aae0 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29  Lock method */.)
1aaf0 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66  .#endif..#if def
1ab00 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
1ab10 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
1ab20 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 49  _LOCKING_STYLE.I
1ab30 4f 4d 45 54 48 4f 44 53 28 0a 20 20 61 66 70 49  OMETHODS(.  afpI
1ab40 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20  oFinder,        
1ab50 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20        /* Finder 
1ab60 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f  function name */
1ab70 0a 20 20 61 66 70 49 6f 4d 65 74 68 6f 64 73 2c  .  afpIoMethods,
1ab80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ab90 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
1aba0 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a  ds object name *
1abb0 2f 0a 20 20 61 66 70 43 6c 6f 73 65 2c 20 20 20  /.  afpClose,   
1abc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1abd0 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a   xClose method *
1abe0 2f 0a 20 20 61 66 70 4c 6f 63 6b 2c 20 20 20 20  /.  afpLock,    
1abf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ac00 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f   xLock method */
1ac10 0a 20 20 61 66 70 55 6e 6c 6f 63 6b 2c 20 20 20  .  afpUnlock,   
1ac20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ac30 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  xUnlock method *
1ac40 2f 0a 20 20 61 66 70 43 68 65 63 6b 52 65 73 65  /.  afpCheckRese
1ac50 72 76 65 64 4c 6f 63 6b 20 20 20 20 20 20 2f 2a  rvedLock      /*
1ac60 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
1ac70 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a  ock method */.).
1ac80 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
1ac90 65 20 22 57 68 6f 6c 65 20 46 69 6c 65 20 4c 6f  e "Whole File Lo
1aca0 63 6b 69 6e 67 22 20 66 69 6e 64 65 72 20 72 65  cking" finder re
1acb0 74 75 72 6e 73 20 74 68 65 20 73 61 6d 65 20 73  turns the same s
1acc0 65 74 20 6f 66 20 6d 65 74 68 6f 64 73 20 61 73  et of methods as
1acd0 0a 2a 2a 20 74 68 65 20 70 6f 73 69 78 20 6c 6f  .** the posix lo
1ace0 63 6b 69 6e 67 20 66 69 6e 64 65 72 2e 20 20 42  cking finder.  B
1acf0 75 74 20 69 74 20 61 6c 73 6f 20 73 65 74 73 20  ut it also sets 
1ad00 74 68 65 20 53 51 4c 49 54 45 5f 57 48 4f 4c 45  the SQLITE_WHOLE
1ad10 5f 46 49 4c 45 5f 4c 4f 43 4b 49 4e 47 0a 2a 2a  _FILE_LOCKING.**
1ad20 20 66 6c 61 67 20 74 6f 20 66 6f 72 63 65 20 74   flag to force t
1ad30 68 65 20 70 6f 73 69 78 20 61 64 76 69 73 6f 72  he posix advisor
1ad40 79 20 6c 6f 63 6b 73 20 74 6f 20 63 6f 76 65 72  y locks to cover
1ad50 20 74 68 65 20 77 68 6f 6c 65 20 66 69 6c 65 20   the whole file 
1ad60 69 6e 73 74 65 61 64 0a 2a 2a 20 6f 66 20 6a 75  instead.** of ju
1ad70 73 74 20 61 20 73 6d 61 6c 6c 20 73 70 61 6e 20  st a small span 
1ad80 6f 66 20 62 79 74 65 73 20 6e 65 61 72 20 74 68  of bytes near th
1ad90 65 20 31 47 69 42 20 62 6f 75 6e 64 61 72 79 2e  e 1GiB boundary.
1ada0 20 20 57 68 6f 6c 65 20 46 69 6c 65 20 4c 6f 63    Whole File Loc
1adb0 6b 69 6e 67 0a 2a 2a 20 69 73 20 75 73 65 66 75  king.** is usefu
1adc0 6c 20 6f 6e 20 4e 46 53 2d 6d 6f 75 6e 74 65 64  l on NFS-mounted
1add0 20 66 69 6c 65 73 20 73 69 6e 63 65 20 69 74 20   files since it 
1ade0 68 65 6c 70 73 20 4e 46 53 20 74 6f 20 6d 61 69  helps NFS to mai
1adf0 6e 74 61 69 6e 20 63 61 63 68 65 0a 2a 2a 20 63  ntain cache.** c
1ae00 6f 68 65 72 65 6e 63 79 2e 20 20 42 75 74 20 69  oherency.  But i
1ae10 74 20 69 73 20 61 20 64 65 74 72 69 6d 65 6e 74  t is a detriment
1ae20 20 74 6f 20 6f 74 68 65 72 20 66 69 6c 65 73 79   to other filesy
1ae30 73 74 65 6d 73 20 73 69 6e 63 65 20 69 74 20 72  stems since it r
1ae40 75 6e 73 0a 2a 2a 20 73 6c 6f 77 65 72 2e 0a 2a  uns.** slower..*
1ae50 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73  /.static const s
1ae60 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
1ae70 73 20 2a 70 6f 73 69 78 57 66 6c 49 6f 46 69 6e  s *posixWflIoFin
1ae80 64 65 72 49 6d 70 6c 28 63 6f 6e 73 74 20 63 68  derImpl(const ch
1ae90 61 72 2a 7a 2c 20 75 6e 69 78 46 69 6c 65 2a 70  ar*z, unixFile*p
1aea0 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
1aeb0 4d 45 54 45 52 28 7a 29 3b 0a 20 20 70 2d 3e 66  METER(z);.  p->f
1aec0 69 6c 65 46 6c 61 67 73 20 3d 20 53 51 4c 49 54  ileFlags = SQLIT
1aed0 45 5f 57 48 4f 4c 45 5f 46 49 4c 45 5f 4c 4f 43  E_WHOLE_FILE_LOC
1aee0 4b 49 4e 47 3b 0a 20 20 72 65 74 75 72 6e 20 26  KING;.  return &
1aef0 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 3b 0a  posixIoMethods;.
1af00 7d 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73  }.static const s
1af10 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
1af20 73 20 0a 20 20 2a 28 2a 63 6f 6e 73 74 20 70 6f  s .  *(*const po
1af30 73 69 78 57 66 6c 49 6f 46 69 6e 64 65 72 29 28  sixWflIoFinder)(
1af40 63 6f 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69 78  const char*,unix
1af50 46 69 6c 65 20 2a 70 29 20 3d 20 70 6f 73 69 78  File *p) = posix
1af60 57 66 6c 49 6f 46 69 6e 64 65 72 49 6d 70 6c 3b  WflIoFinderImpl;
1af70 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 78  ../*.** The prox
1af80 79 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64  y locking method
1af90 20 69 73 20 61 20 22 73 75 70 65 72 2d 6d 65 74   is a "super-met
1afa0 68 6f 64 22 20 69 6e 20 74 68 65 20 73 65 6e 73  hod" in the sens
1afb0 65 20 74 68 61 74 20 69 74 0a 2a 2a 20 6f 70 65  e that it.** ope
1afc0 6e 73 20 73 65 63 6f 6e 64 61 72 79 20 66 69 6c  ns secondary fil
1afd0 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 66 6f  e descriptors fo
1afe0 72 20 74 68 65 20 63 6f 6e 63 68 20 61 6e 64 20  r the conch and 
1aff0 6c 6f 63 6b 20 66 69 6c 65 73 20 61 6e 64 0a 2a  lock files and.*
1b000 2a 20 69 74 20 75 73 65 73 20 70 72 6f 78 79 2c  * it uses proxy,
1b010 20 64 6f 74 2d 66 69 6c 65 2c 20 41 46 50 2c 20   dot-file, AFP, 
1b020 61 6e 64 20 66 6c 6f 63 6b 28 29 20 6c 6f 63 6b  and flock() lock
1b030 69 6e 67 20 6d 65 74 68 6f 64 73 20 6f 6e 20 74  ing methods on t
1b040 68 6f 73 65 0a 2a 2a 20 73 65 63 6f 6e 64 61 72  hose.** secondar
1b050 79 20 66 69 6c 65 73 2e 20 20 46 6f 72 20 74 68  y files.  For th
1b060 69 73 20 72 65 61 73 6f 6e 2c 20 74 68 65 20 64  is reason, the d
1b070 69 76 69 73 69 6f 6e 20 74 68 61 74 20 69 6d 70  ivision that imp
1b080 6c 65 6d 65 6e 74 73 0a 2a 2a 20 70 72 6f 78 79  lements.** proxy
1b090 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6c 6f 63 61   locking is loca
1b0a0 74 65 64 20 6d 75 63 68 20 66 75 72 74 68 65 72  ted much further
1b0b0 20 64 6f 77 6e 20 69 6e 20 74 68 65 20 66 69 6c   down in the fil
1b0c0 65 2e 20 20 42 75 74 20 77 65 20 6e 65 65 64 0a  e.  But we need.
1b0d0 2a 2a 20 74 6f 20 67 6f 20 61 68 65 61 64 20 61  ** to go ahead a
1b0e0 6e 64 20 64 65 66 69 6e 65 20 74 68 65 20 73 71  nd define the sq
1b0f0 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
1b100 20 61 6e 64 20 66 69 6e 64 65 72 20 66 75 6e 63   and finder func
1b110 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 70 72 6f 78  tion.** for prox
1b120 79 20 6c 6f 63 6b 69 6e 67 20 68 65 72 65 2e 20  y locking here. 
1b130 20 53 6f 20 77 65 20 66 6f 72 77 61 72 64 20 64   So we forward d
1b140 65 63 6c 61 72 65 20 74 68 65 20 49 2f 4f 20 6d  eclare the I/O m
1b150 65 74 68 6f 64 73 2e 0a 2a 2f 0a 23 69 66 20 64  ethods..*/.#if d
1b160 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
1b170 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42  ) && SQLITE_ENAB
1b180 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
1b190 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
1b1a0 79 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66  yClose(sqlite3_f
1b1b0 69 6c 65 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e  ile*);.static in
1b1c0 74 20 70 72 6f 78 79 4c 6f 63 6b 28 73 71 6c 69  t proxyLock(sqli
1b1d0 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 29 3b  te3_file*, int);
1b1e0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
1b1f0 79 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  yUnlock(sqlite3_
1b200 66 69 6c 65 2a 2c 20 69 6e 74 29 3b 0a 73 74 61  file*, int);.sta
1b210 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43 68 65  tic int proxyChe
1b220 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73  ckReservedLock(s
1b230 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e  qlite3_file*, in
1b240 74 2a 29 3b 0a 49 4f 4d 45 54 48 4f 44 53 28 0a  t*);.IOMETHODS(.
1b250 20 20 70 72 6f 78 79 49 6f 46 69 6e 64 65 72 2c    proxyIoFinder,
1b260 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1b270 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e  inder function n
1b280 61 6d 65 20 2a 2f 0a 20 20 70 72 6f 78 79 49 6f  ame */.  proxyIo
1b290 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20  Methods,        
1b2a0 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f     /* sqlite3_io
1b2b0 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20  _methods object 
1b2c0 6e 61 6d 65 20 2a 2f 0a 20 20 70 72 6f 78 79 43  name */.  proxyC
1b2d0 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  lose,           
1b2e0 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65      /* xClose me
1b2f0 74 68 6f 64 20 2a 2f 0a 20 20 70 72 6f 78 79 4c  thod */.  proxyL
1b300 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
1b310 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74      /* xLock met
1b320 68 6f 64 20 2a 2f 0a 20 20 70 72 6f 78 79 55 6e  hod */.  proxyUn
1b330 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  lock,           
1b340 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65     /* xUnlock me
1b350 74 68 6f 64 20 2a 2f 0a 20 20 70 72 6f 78 79 43  thod */.  proxyC
1b360 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
1b370 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73      /* xCheckRes
1b380 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64  ervedLock method
1b390 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 0a 23   */.).#endif...#
1b3a0 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
1b3b0 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f  LE__) && SQLITE_
1b3c0 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
1b3d0 54 59 4c 45 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73  TYLE./* .** This
1b3e0 20 22 66 69 6e 64 65 72 22 20 66 75 6e 63 74 69   "finder" functi
1b3f0 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20 64  on attempts to d
1b400 65 74 65 72 6d 69 6e 65 20 74 68 65 20 62 65 73  etermine the bes
1b410 74 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74 65  t locking strate
1b420 67 79 20 0a 2a 2a 20 66 6f 72 20 74 68 65 20 64  gy .** for the d
1b430 61 74 61 62 61 73 65 20 66 69 6c 65 20 22 66 69  atabase file "fi
1b440 6c 65 50 61 74 68 22 2e 20 20 49 74 20 74 68 65  lePath".  It the
1b450 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 73 71  n returns the sq
1b460 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
1b470 0a 2a 2a 20 6f 62 6a 65 63 74 20 74 68 61 74 20  .** object that 
1b480 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 61 74 20  implements that 
1b490 73 74 72 61 74 65 67 79 2e 0a 2a 2a 0a 2a 2a 20  strategy..**.** 
1b4a0 54 68 69 73 20 69 73 20 66 6f 72 20 4d 61 63 4f  This is for MacO
1b4b0 53 58 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73 74 61 74  SX only..*/.stat
1b4c0 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ic const sqlite3
1b4d0 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 61 75 74  _io_methods *aut
1b4e0 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 49 6d 70  olockIoFinderImp
1b4f0 6c 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  l(.  const char 
1b500 2a 66 69 6c 65 50 61 74 68 2c 20 20 20 20 2f 2a  *filePath,    /*
1b510 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   name of the dat
1b520 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
1b530 75 6e 69 78 46 69 6c 65 20 2a 70 4e 65 77 20 20  unixFile *pNew  
1b540 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 70 65 6e           /* open
1b550 20 66 69 6c 65 20 6f 62 6a 65 63 74 20 66 6f 72   file object for
1b560 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1b570 6c 65 20 2a 2f 0a 29 7b 0a 20 20 73 74 61 74 69  le */.){.  stati
1b580 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 4d  c const struct M
1b590 61 70 70 69 6e 67 20 7b 0a 20 20 20 20 63 6f 6e  apping {.    con
1b5a0 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 73 79  st char *zFilesy
1b5b0 73 74 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20  stem;           
1b5c0 20 20 20 2f 2a 20 46 69 6c 65 73 79 73 74 65 6d     /* Filesystem
1b5d0 20 74 79 70 65 20 6e 61 6d 65 20 2a 2f 0a 20 20   type name */.  
1b5e0 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f    const sqlite3_
1b5f0 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 70 4d 65 74  io_methods *pMet
1b600 68 6f 64 73 3b 20 20 20 2f 2a 20 41 70 70 72 6f  hods;   /* Appro
1b610 70 72 69 61 74 65 20 6c 6f 63 6b 69 6e 67 20 6d  priate locking m
1b620 65 74 68 6f 64 20 2a 2f 0a 20 20 7d 20 61 4d 61  ethod */.  } aMa
1b630 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22 68  p[] = {.    { "h
1b640 66 73 22 2c 20 20 20 20 26 70 6f 73 69 78 49 6f  fs",    &posixIo
1b650 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b  Methods },.    {
1b660 20 22 75 66 73 22 2c 20 20 20 20 26 70 6f 73 69   "ufs",    &posi
1b670 78 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20  xIoMethods },.  
1b680 20 20 7b 20 22 61 66 70 66 73 22 2c 20 20 26 61    { "afpfs",  &a
1b690 66 70 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 23  fpIoMethods },.#
1b6a0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
1b6b0 42 4c 45 5f 41 46 50 5f 4c 4f 43 4b 49 4e 47 5f  BLE_AFP_LOCKING_
1b6c0 53 4d 42 0a 20 20 20 20 7b 20 22 73 6d 62 66 73  SMB.    { "smbfs
1b6d0 22 2c 20 20 26 61 66 70 49 6f 4d 65 74 68 6f 64  ",  &afpIoMethod
1b6e0 73 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 20 20 7b  s },.#else.    {
1b6f0 20 22 73 6d 62 66 73 22 2c 20 20 26 66 6c 6f 63   "smbfs",  &floc
1b700 6b 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 23 65  kIoMethods },.#e
1b710 6e 64 69 66 0a 20 20 20 20 7b 20 22 77 65 62 64  ndif.    { "webd
1b720 61 76 22 2c 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65  av", &nolockIoMe
1b730 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20 30  thods },.    { 0
1b740 2c 20 30 20 7d 0a 20 20 7d 3b 0a 20 20 69 6e 74  , 0 }.  };.  int
1b750 20 69 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61   i;.  struct sta
1b760 74 66 73 20 66 73 49 6e 66 6f 3b 0a 20 20 73 74  tfs fsInfo;.  st
1b770 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 49  ruct flock lockI
1b780 6e 66 6f 3b 0a 0a 20 20 69 66 28 20 21 66 69 6c  nfo;..  if( !fil
1b790 65 50 61 74 68 20 29 7b 0a 20 20 20 20 2f 2a 20  ePath ){.    /* 
1b7a0 49 66 20 66 69 6c 65 50 61 74 68 3d 3d 4e 55 4c  If filePath==NUL
1b7b0 4c 20 74 68 61 74 20 6d 65 61 6e 73 20 77 65 20  L that means we 
1b7c0 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68  are dealing with
1b7d0 20 61 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c   a transient fil
1b7e0 65 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 64 6f  e.    ** that do
1b7f0 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62  es not need to b
1b800 65 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20 20  e locked. */.   
1b810 20 72 65 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49   return &nolockI
1b820 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 20 20  oMethods;.  }.  
1b830 69 66 28 20 73 74 61 74 66 73 28 66 69 6c 65 50  if( statfs(fileP
1b840 61 74 68 2c 20 26 66 73 49 6e 66 6f 29 20 21 3d  ath, &fsInfo) !=
1b850 20 2d 31 20 29 7b 0a 20 20 20 20 69 66 28 20 66   -1 ){.    if( f
1b860 73 49 6e 66 6f 2e 66 5f 66 6c 61 67 73 20 26 20  sInfo.f_flags & 
1b870 4d 4e 54 5f 52 44 4f 4e 4c 59 20 29 7b 0a 20 20  MNT_RDONLY ){.  
1b880 20 20 20 20 72 65 74 75 72 6e 20 26 6e 6f 6c 6f      return &nolo
1b890 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 20  ckIoMethods;.   
1b8a0 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20   }.    for(i=0; 
1b8b0 61 4d 61 70 5b 69 5d 2e 7a 46 69 6c 65 73 79 73  aMap[i].zFilesys
1b8c0 74 65 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  tem; i++){.     
1b8d0 20 69 66 28 20 73 74 72 63 6d 70 28 66 73 49 6e   if( strcmp(fsIn
1b8e0 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c  fo.f_fstypename,
1b8f0 20 61 4d 61 70 5b 69 5d 2e 7a 46 69 6c 65 73 79   aMap[i].zFilesy
1b900 73 74 65 6d 29 3d 3d 30 20 29 7b 0a 20 20 20 20  stem)==0 ){.    
1b910 20 20 20 20 72 65 74 75 72 6e 20 61 4d 61 70 5b      return aMap[
1b920 69 5d 2e 70 4d 65 74 68 6f 64 73 3b 0a 20 20 20  i].pMethods;.   
1b930 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
1b940 20 20 2f 2a 20 44 65 66 61 75 6c 74 20 63 61 73    /* Default cas
1b950 65 2e 20 48 61 6e 64 6c 65 73 2c 20 61 6d 6f 6e  e. Handles, amon
1b960 67 73 74 20 6f 74 68 65 72 73 2c 20 22 6e 66 73  gst others, "nfs
1b970 22 2e 0a 20 20 2a 2a 20 54 65 73 74 20 62 79 74  "..  ** Test byt
1b980 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 20 75 73 69  e-range lock usi
1b990 6e 67 20 66 63 6e 74 6c 28 29 2e 20 49 66 20 74  ng fcntl(). If t
1b9a0 68 65 20 63 61 6c 6c 20 73 75 63 63 65 65 64 73  he call succeeds
1b9b0 2c 20 0a 20 20 2a 2a 20 61 73 73 75 6d 65 20 74  , .  ** assume t
1b9c0 68 61 74 20 74 68 65 20 66 69 6c 65 2d 73 79 73  hat the file-sys
1b9d0 74 65 6d 20 73 75 70 70 6f 72 74 73 20 50 4f 53  tem supports POS
1b9e0 49 58 20 73 74 79 6c 65 20 6c 6f 63 6b 73 2e 20  IX style locks. 
1b9f0 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b 49 6e 66 6f  .  */.  lockInfo
1ba00 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20 6c 6f  .l_len = 1;.  lo
1ba10 63 6b 49 6e 66 6f 2e 6c 5f 73 74 61 72 74 20 3d  ckInfo.l_start =
1ba20 20 30 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c   0;.  lockInfo.l
1ba30 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
1ba40 45 54 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c  ET;.  lockInfo.l
1ba50 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b  _type = F_RDLCK;
1ba60 0a 20 20 69 66 28 20 66 63 6e 74 6c 28 70 4e 65  .  if( fcntl(pNe
1ba70 77 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c 20 26  w->h, F_GETLK, &
1ba80 6c 6f 63 6b 49 6e 66 6f 29 21 3d 2d 31 20 29 20  lockInfo)!=-1 ) 
1ba90 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 66 69 6c 65  {.    pNew->file
1baa0 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 57  Flags = SQLITE_W
1bab0 48 4f 4c 45 5f 46 49 4c 45 5f 4c 4f 43 4b 49 4e  HOLE_FILE_LOCKIN
1bac0 47 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 26 70  G;.    return &p
1bad0 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 3b 0a 20  osixIoMethods;. 
1bae0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
1baf0 72 6e 20 26 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74  rn &dotlockIoMet
1bb00 68 6f 64 73 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74  hods;.  }.}.stat
1bb10 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ic const sqlite3
1bb20 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 0a 20 20 2a  _io_methods .  *
1bb30 28 2a 63 6f 6e 73 74 20 61 75 74 6f 6c 6f 63 6b  (*const autolock
1bb40 49 6f 46 69 6e 64 65 72 29 28 63 6f 6e 73 74 20  IoFinder)(const 
1bb50 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65 2a 29  char*,unixFile*)
1bb60 20 3d 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e   = autolockIoFin
1bb70 64 65 72 49 6d 70 6c 3b 0a 0a 23 65 6e 64 69 66  derImpl;..#endif
1bb80 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41 50   /* defined(__AP
1bb90 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45  PLE__) && SQLITE
1bba0 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
1bbb0 53 54 59 4c 45 20 2a 2f 0a 0a 23 69 66 20 4f 53  STYLE */..#if OS
1bbc0 5f 56 58 57 4f 52 4b 53 20 26 26 20 53 51 4c 49  _VXWORKS && SQLI
1bbd0 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
1bbe0 47 5f 53 54 59 4c 45 0a 2f 2a 20 0a 2a 2a 20 54  G_STYLE./* .** T
1bbf0 68 69 73 20 22 66 69 6e 64 65 72 22 20 66 75 6e  his "finder" fun
1bc00 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74  ction attempts t
1bc10 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20  o determine the 
1bc20 62 65 73 74 20 6c 6f 63 6b 69 6e 67 20 73 74 72  best locking str
1bc30 61 74 65 67 79 20 0a 2a 2a 20 66 6f 72 20 74 68  ategy .** for th
1bc40 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1bc50 22 66 69 6c 65 50 61 74 68 22 2e 20 20 49 74 20  "filePath".  It 
1bc60 74 68 65 6e 20 72 65 74 75 72 6e 73 20 74 68 65  then returns the
1bc70 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
1bc80 6f 64 73 0a 2a 2a 20 6f 62 6a 65 63 74 20 74 68  ods.** object th
1bc90 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68  at implements th
1bca0 61 74 20 73 74 72 61 74 65 67 79 2e 0a 2a 2a 0a  at strategy..**.
1bcb0 2a 2a 20 54 68 69 73 20 69 73 20 66 6f 72 20 56  ** This is for V
1bcc0 58 57 6f 72 6b 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a  XWorks only..*/.
1bcd0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c  static const sql
1bce0 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
1bcf0 2a 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65  *autolockIoFinde
1bd00 72 49 6d 70 6c 28 0a 20 20 63 6f 6e 73 74 20 63  rImpl(.  const c
1bd10 68 61 72 20 2a 66 69 6c 65 50 61 74 68 2c 20 20  har *filePath,  
1bd20 20 20 2f 2a 20 6e 61 6d 65 20 6f 66 20 74 68 65    /* name of the
1bd30 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
1bd40 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e  /.  unixFile *pN
1bd50 65 77 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ew           /* 
1bd60 74 68 65 20 6f 70 65 6e 20 66 69 6c 65 20 6f 62  the open file ob
1bd70 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 73 74 72  ject */.){.  str
1bd80 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 49 6e  uct flock lockIn
1bd90 66 6f 3b 0a 0a 20 20 69 66 28 20 21 66 69 6c 65  fo;..  if( !file
1bda0 50 61 74 68 20 29 7b 0a 20 20 20 20 2f 2a 20 49  Path ){.    /* I
1bdb0 66 20 66 69 6c 65 50 61 74 68 3d 3d 4e 55 4c 4c  f filePath==NULL
1bdc0 20 74 68 61 74 20 6d 65 61 6e 73 20 77 65 20 61   that means we a
1bdd0 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20  re dealing with 
1bde0 61 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65  a transient file
1bdf0 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 64 6f 65  .    ** that doe
1be00 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65  s not need to be
1be10 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20 20 20   locked. */.    
1be20 72 65 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49 6f  return &nolockIo
1be30 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 0a 20 20  Methods;.  }..  
1be40 2f 2a 20 54 65 73 74 20 69 66 20 66 63 6e 74 6c  /* Test if fcntl
1be50 28 29 20 69 73 20 73 75 70 70 6f 72 74 65 64 20  () is supported 
1be60 61 6e 64 20 75 73 65 20 50 4f 53 49 58 20 73 74  and use POSIX st
1be70 79 6c 65 20 6c 6f 63 6b 73 2e 0a 20 20 2a 2a 20  yle locks..  ** 
1be80 4f 74 68 65 72 77 69 73 65 20 66 61 6c 6c 20 62  Otherwise fall b
1be90 61 63 6b 20 74 6f 20 74 68 65 20 6e 61 6d 65 64  ack to the named
1bea0 20 73 65 6d 61 70 68 6f 72 65 20 6d 65 74 68 6f   semaphore metho
1beb0 64 2e 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b 49 6e  d..  */.  lockIn
1bec0 66 6f 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20  fo.l_len = 1;.  
1bed0 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 73 74 61 72 74  lockInfo.l_start
1bee0 20 3d 20 30 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f   = 0;.  lockInfo
1bef0 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b  .l_whence = SEEK
1bf00 5f 53 45 54 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f  _SET;.  lockInfo
1bf10 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43  .l_type = F_RDLC
1bf20 4b 3b 0a 20 20 69 66 28 20 66 63 6e 74 6c 28 70  K;.  if( fcntl(p
1bf30 4e 65 77 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c  New->h, F_GETLK,
1bf40 20 26 6c 6f 63 6b 49 6e 66 6f 29 21 3d 2d 31 20   &lockInfo)!=-1 
1bf50 29 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 26  ) {.    return &
1bf60 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 3b 0a  posixIoMethods;.
1bf70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
1bf80 75 72 6e 20 26 73 65 6d 49 6f 4d 65 74 68 6f 64  urn &semIoMethod
1bf90 73 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20  s;.  }.}.static 
1bfa0 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f  const sqlite3_io
1bfb0 5f 6d 65 74 68 6f 64 73 20 0a 20 20 2a 28 2a 63  _methods .  *(*c
1bfc0 6f 6e 73 74 20 61 75 74 6f 6c 6f 63 6b 49 6f 46  onst autolockIoF
1bfd0 69 6e 64 65 72 29 28 63 6f 6e 73 74 20 63 68 61  inder)(const cha
1bfe0 72 2a 2c 75 6e 69 78 46 69 6c 65 2a 29 20 3d 20  r*,unixFile*) = 
1bff0 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72  autolockIoFinder
1c000 49 6d 70 6c 3b 0a 0a 23 65 6e 64 69 66 20 2f 2a  Impl;..#endif /*
1c010 20 4f 53 5f 56 58 57 4f 52 4b 53 20 26 26 20 53   OS_VXWORKS && S
1c020 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
1c030 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a 2f  KING_STYLE */../
1c040 2a 0a 2a 2a 20 41 6e 20 61 62 73 74 72 61 63 74  *.** An abstract
1c050 20 74 79 70 65 20 66 6f 72 20 61 20 70 6f 69 6e   type for a poin
1c060 74 65 72 20 74 6f 20 61 20 49 4f 20 6d 65 74 68  ter to a IO meth
1c070 6f 64 20 66 69 6e 64 65 72 20 66 75 6e 63 74 69  od finder functi
1c080 6f 6e 3a 0a 2a 2f 0a 74 79 70 65 64 65 66 20 63  on:.*/.typedef c
1c090 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f  onst sqlite3_io_
1c0a0 6d 65 74 68 6f 64 73 20 2a 28 2a 66 69 6e 64 65  methods *(*finde
1c0b0 72 5f 74 79 70 65 29 28 63 6f 6e 73 74 20 63 68  r_type)(const ch
1c0c0 61 72 2a 2c 75 6e 69 78 46 69 6c 65 2a 29 3b 0a  ar*,unixFile*);.
1c0d0 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
1c0e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c0f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c100 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c110 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
1c120 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c130 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 73 71 6c  ************ sql
1c140 69 74 65 33 5f 76 66 73 20 6d 65 74 68 6f 64 73  ite3_vfs methods
1c150 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
1c160 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
1c170 0a 2a 2a 20 54 68 69 73 20 64 69 76 69 73 69 6f  .** This divisio
1c180 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 69  n contains the i
1c190 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
1c1a0 20 6d 65 74 68 6f 64 73 20 6f 6e 20 74 68 65 0a   methods on the.
1c1b0 2a 2a 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6f  ** sqlite3_vfs o
1c1c0 62 6a 65 63 74 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a  bject..*/../*.**
1c1d0 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
1c1e0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
1c1f0 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63 74 75  unixFile structu
1c200 72 65 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  re pointed to by
1c210 20 70 49 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   pId..*/.static 
1c220 69 6e 74 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69  int fillInUnixFi
1c230 6c 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  le(.  sqlite3_vf
1c240 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 2f 2a  s *pVfs,      /*
1c250 20 50 6f 69 6e 74 65 72 20 74 6f 20 76 66 73 20   Pointer to vfs 
1c260 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20  object */.  int 
1c270 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h,              
1c280 20 20 20 20 2f 2a 20 4f 70 65 6e 20 66 69 6c 65      /* Open file
1c290 20 64 65 73 63 72 69 70 74 6f 72 20 6f 66 20 66   descriptor of f
1c2a0 69 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64  ile being opened
1c2b0 20 2a 2f 0a 20 20 69 6e 74 20 64 69 72 66 64 2c   */.  int dirfd,
1c2c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c2d0 20 44 69 72 65 63 74 6f 72 79 20 66 69 6c 65 20   Directory file 
1c2e0 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20  descriptor */.  
1c2f0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 49  sqlite3_file *pI
1c300 64 2c 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65  d,      /* Write
1c310 20 74 6f 20 74 68 65 20 75 6e 69 78 46 69 6c 65   to the unixFile
1c320 20 73 74 72 75 63 74 75 72 65 20 68 65 72 65 20   structure here 
1c330 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
1c340 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20  *zFilename,  /* 
1c350 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65  Name of the file
1c360 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20 2a 2f   being opened */
1c370 0a 20 20 69 6e 74 20 6e 6f 4c 6f 63 6b 2c 20 20  .  int noLock,  
1c380 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6d             /* Om
1c390 69 74 20 6c 6f 63 6b 69 6e 67 20 69 66 20 74 72  it locking if tr
1c3a0 75 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 44 65  ue */.  int isDe
1c3b0 6c 65 74 65 20 20 20 20 20 20 20 20 20 20 20 20  lete            
1c3c0 2f 2a 20 44 65 6c 65 74 65 20 6f 6e 20 63 6c 6f  /* Delete on clo
1c3d0 73 65 20 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b  se if true */.){
1c3e0 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  .  const sqlite3
1c3f0 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 70 4c 6f  _io_methods *pLo
1c400 63 6b 69 6e 67 53 74 79 6c 65 3b 0a 20 20 75 6e  ckingStyle;.  un
1c410 69 78 46 69 6c 65 20 2a 70 4e 65 77 20 3d 20 28  ixFile *pNew = (
1c420 75 6e 69 78 46 69 6c 65 20 2a 29 70 49 64 3b 0a  unixFile *)pId;.
1c430 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1c440 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28  E_OK;..  assert(
1c450 20 70 4e 65 77 2d 3e 70 4c 6f 63 6b 3d 3d 4e 55   pNew->pLock==NU
1c460 4c 4c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  LL );.  assert( 
1c470 70 4e 65 77 2d 3e 70 4f 70 65 6e 3d 3d 4e 55 4c  pNew->pOpen==NUL
1c480 4c 20 29 3b 0a 0a 20 20 2f 2a 20 50 61 72 61 6d  L );..  /* Param
1c490 65 74 65 72 20 69 73 44 65 6c 65 74 65 20 69 73  eter isDelete is
1c4a0 20 6f 6e 6c 79 20 75 73 65 64 20 6f 6e 20 76 78   only used on vx
1c4b0 77 6f 72 6b 73 2e 20 45 78 70 72 65 73 73 20 74  works. Express t
1c4c0 68 69 73 20 65 78 70 6c 69 63 69 74 6c 79 20 0a  his explicitly .
1c4d0 20 20 2a 2a 20 68 65 72 65 20 74 6f 20 70 72 65    ** here to pre
1c4e0 76 65 6e 74 20 63 6f 6d 70 69 6c 65 72 20 77 61  vent compiler wa
1c4f0 72 6e 69 6e 67 73 20 61 62 6f 75 74 20 75 6e 75  rnings about unu
1c500 73 65 64 20 70 61 72 61 6d 65 74 65 72 73 2e 0a  sed parameters..
1c510 20 20 2a 2f 0a 20 20 55 4e 55 53 45 44 5f 50 41    */.  UNUSED_PA
1c520 52 41 4d 45 54 45 52 28 69 73 44 65 6c 65 74 65  RAMETER(isDelete
1c530 29 3b 0a 0a 20 20 4f 53 54 52 41 43 45 33 28 22  );..  OSTRACE3("
1c540 4f 50 45 4e 20 20 20 20 25 2d 33 64 20 25 73 5c  OPEN    %-3d %s\
1c550 6e 22 2c 20 68 2c 20 7a 46 69 6c 65 6e 61 6d 65  n", h, zFilename
1c560 29 3b 20 20 20 20 0a 20 20 70 4e 65 77 2d 3e 68  );    .  pNew->h
1c570 20 3d 20 68 3b 0a 20 20 70 4e 65 77 2d 3e 64 69   = h;.  pNew->di
1c580 72 66 64 20 3d 20 64 69 72 66 64 3b 0a 20 20 53  rfd = dirfd;.  S
1c590 45 54 5f 54 48 52 45 41 44 49 44 28 70 4e 65 77  ET_THREADID(pNew
1c5a0 29 3b 0a 20 20 70 4e 65 77 2d 3e 66 69 6c 65 46  );.  pNew->fileF
1c5b0 6c 61 67 73 20 3d 20 30 3b 0a 0a 23 69 66 20 4f  lags = 0;..#if O
1c5c0 53 5f 56 58 57 4f 52 4b 53 0a 20 20 70 4e 65 77  S_VXWORKS.  pNew
1c5d0 2d 3e 70 49 64 20 3d 20 76 78 77 6f 72 6b 73 46  ->pId = vxworksF
1c5e0 69 6e 64 46 69 6c 65 49 64 28 7a 46 69 6c 65 6e  indFileId(zFilen
1c5f0 61 6d 65 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  ame);.  if( pNew
1c600 2d 3e 70 49 64 3d 3d 30 20 29 7b 0a 20 20 20 20  ->pId==0 ){.    
1c610 6e 6f 4c 6f 63 6b 20 3d 20 31 3b 0a 20 20 20 20  noLock = 1;.    
1c620 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
1c630 4d 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  M;.  }.#endif.. 
1c640 20 69 66 28 20 6e 6f 4c 6f 63 6b 20 29 7b 0a 20   if( noLock ){. 
1c650 20 20 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65     pLockingStyle
1c660 20 3d 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68   = &nolockIoMeth
1c670 6f 64 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ods;.  }else{.  
1c680 20 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20    pLockingStyle 
1c690 3d 20 28 2a 2a 28 66 69 6e 64 65 72 5f 74 79 70  = (**(finder_typ
1c6a0 65 2a 29 70 56 66 73 2d 3e 70 41 70 70 44 61 74  e*)pVfs->pAppDat
1c6b0 61 29 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 4e  a)(zFilename, pN
1c6c0 65 77 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f  ew);.#if SQLITE_
1c6d0 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
1c6e0 54 59 4c 45 0a 20 20 20 20 2f 2a 20 43 61 63 68  TYLE.    /* Cach
1c6f0 65 20 7a 46 69 6c 65 6e 61 6d 65 20 69 6e 20 74  e zFilename in t
1c700 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65  he locking conte
1c710 78 74 20 28 41 46 50 20 61 6e 64 20 64 6f 74 6c  xt (AFP and dotl
1c720 6f 63 6b 20 6f 76 65 72 72 69 64 65 29 20 66 6f  ock override) fo
1c730 72 0a 20 20 20 20 2a 2a 20 70 72 6f 78 79 4c 6f  r.    ** proxyLo
1c740 63 6b 20 61 63 74 69 76 61 74 69 6f 6e 20 69 73  ck activation is
1c750 20 70 6f 73 73 69 62 6c 65 20 28 72 65 6d 6f 74   possible (remot
1c760 65 20 70 72 6f 78 79 20 69 73 20 62 61 73 65 64  e proxy is based
1c770 20 6f 6e 20 64 62 20 6e 61 6d 65 29 0a 20 20 20   on db name).   
1c780 20 2a 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 72 65   ** zFilename re
1c790 6d 61 69 6e 73 20 76 61 6c 69 64 20 75 6e 74 69  mains valid unti
1c7a0 6c 20 66 69 6c 65 20 69 73 20 63 6c 6f 73 65 64  l file is closed
1c7b0 2c 20 74 6f 20 73 75 70 70 6f 72 74 20 2a 2f 0a  , to support */.
1c7c0 20 20 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e      pNew->lockin
1c7d0 67 43 6f 6e 74 65 78 74 20 3d 20 28 76 6f 69 64  gContext = (void
1c7e0 2a 29 7a 46 69 6c 65 6e 61 6d 65 3b 0a 23 65 6e  *)zFilename;.#en
1c7f0 64 69 66 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  dif.  }..  if( p
1c800 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20  LockingStyle == 
1c810 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 20  &posixIoMethods 
1c820 29 7b 0a 20 20 20 20 75 6e 69 78 45 6e 74 65 72  ){.    unixEnter
1c830 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 72 63 20  Mutex();.    rc 
1c840 3d 20 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28 70  = findLockInfo(p
1c850 4e 65 77 2c 20 26 70 4e 65 77 2d 3e 70 4c 6f 63  New, &pNew->pLoc
1c860 6b 2c 20 26 70 4e 65 77 2d 3e 70 4f 70 65 6e 29  k, &pNew->pOpen)
1c870 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
1c880 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1c890 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20   /* If an error 
1c8a0 6f 63 63 75 72 65 64 20 69 6e 20 66 69 6e 64 4c  occured in findL
1c8b0 6f 63 6b 49 6e 66 6f 28 29 2c 20 63 6c 6f 73 65  ockInfo(), close
1c8c0 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
1c8d0 70 74 6f 72 0a 20 20 20 20 20 20 2a 2a 20 69 6d  ptor.      ** im
1c8e0 6d 65 64 69 61 74 65 6c 79 2c 20 62 65 66 6f 72  mediately, befor
1c8f0 65 20 72 65 6c 65 61 73 69 6e 67 20 74 68 65 20  e releasing the 
1c900 6d 75 74 65 78 2e 20 66 69 6e 64 4c 6f 63 6b 49  mutex. findLockI
1c910 6e 66 6f 28 29 20 6d 61 79 20 66 61 69 6c 0a 20  nfo() may fail. 
1c920 20 20 20 20 20 2a 2a 20 69 6e 20 74 77 6f 20 73       ** in two s
1c930 63 65 6e 61 72 69 6f 73 3a 0a 20 20 20 20 20 20  cenarios:.      
1c940 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 28 61  **.      **   (a
1c950 29 20 41 20 63 61 6c 6c 20 74 6f 20 66 73 74 61  ) A call to fsta
1c960 74 28 29 20 66 61 69 6c 65 64 2e 0a 20 20 20 20  t() failed..    
1c970 20 20 2a 2a 20 20 20 28 62 29 20 41 20 6d 61 6c    **   (b) A mal
1c980 6c 6f 63 20 66 61 69 6c 65 64 2e 0a 20 20 20 20  loc failed..    
1c990 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 53 63    **.      ** Sc
1c9a0 65 6e 61 72 69 6f 20 28 62 29 20 6d 61 79 20 6f  enario (b) may o
1c9b0 6e 6c 79 20 6f 63 63 75 72 20 69 66 20 74 68 65  nly occur if the
1c9c0 20 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64   process is hold
1c9d0 69 6e 67 20 6e 6f 20 6f 74 68 65 72 0a 20 20 20  ing no other.   
1c9e0 20 20 20 2a 2a 20 66 69 6c 65 20 64 65 73 63 72     ** file descr
1c9f0 69 70 74 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74  iptors open on t
1ca00 68 65 20 73 61 6d 65 20 66 69 6c 65 2e 20 49 66  he same file. If
1ca10 20 74 68 65 72 65 20 77 65 72 65 20 6f 74 68 65   there were othe
1ca20 72 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20  r file.      ** 
1ca30 64 65 73 63 72 69 70 74 6f 72 73 20 6f 6e 20 74  descriptors on t
1ca40 68 69 73 20 66 69 6c 65 2c 20 74 68 65 6e 20 6e  his file, then n
1ca50 6f 20 6d 61 6c 6c 6f 63 20 77 6f 75 6c 64 20 62  o malloc would b
1ca60 65 20 72 65 71 75 69 72 65 64 20 62 79 0a 20 20  e required by.  
1ca70 20 20 20 20 2a 2a 20 66 69 6e 64 4c 6f 63 6b 49      ** findLockI
1ca80 6e 66 6f 28 29 2e 20 49 66 20 74 68 69 73 20 69  nfo(). If this i
1ca90 73 20 74 68 65 20 63 61 73 65 2c 20 69 74 20 69  s the case, it i
1caa0 73 20 71 75 69 74 65 20 73 61 66 65 20 74 6f 20  s quite safe to 
1cab0 63 6c 6f 73 65 0a 20 20 20 20 20 20 2a 2a 20 68  close.      ** h
1cac0 61 6e 64 6c 65 20 68 20 2d 20 61 73 20 69 74 20  andle h - as it 
1cad0 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 68  is guaranteed th
1cae0 61 74 20 6e 6f 20 70 6f 73 69 78 20 6c 6f 63 6b  at no posix lock
1caf0 73 20 77 69 6c 6c 20 62 65 20 72 65 6c 65 61 73  s will be releas
1cb00 65 64 0a 20 20 20 20 20 20 2a 2a 20 62 79 20 64  ed.      ** by d
1cb10 6f 69 6e 67 20 73 6f 2e 0a 20 20 20 20 20 20 2a  oing so..      *
1cb20 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 73 63  *.      ** If sc
1cb30 65 6e 61 72 69 6f 20 28 61 29 20 63 61 75 73 65  enario (a) cause
1cb40 64 20 74 68 65 20 65 72 72 6f 72 20 74 68 65 6e  d the error then
1cb50 20 74 68 69 6e 67 73 20 61 72 65 20 6e 6f 74 20   things are not 
1cb60 73 6f 20 73 61 66 65 2e 20 54 68 65 0a 20 20 20  so safe. The.   
1cb70 20 20 20 2a 2a 20 69 6d 70 6c 69 63 69 74 20 61     ** implicit a
1cb80 73 73 75 6d 70 74 69 6f 6e 20 68 65 72 65 20 69  ssumption here i
1cb90 73 20 74 68 61 74 20 69 66 20 66 73 74 61 74 28  s that if fstat(
1cba0 29 20 66 61 69 6c 73 2c 20 74 68 69 6e 67 73 20  ) fails, things 
1cbb0 61 72 65 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20  are in.      ** 
1cbc0 73 75 63 68 20 62 61 64 20 73 68 61 70 65 20 74  such bad shape t
1cbd0 68 61 74 20 64 72 6f 70 70 69 6e 67 20 61 20 6c  hat dropping a l
1cbe0 6f 63 6b 20 6f 72 20 74 77 6f 20 64 6f 65 73 6e  ock or two doesn
1cbf0 27 74 20 6d 61 74 74 65 72 20 6d 75 63 68 2e 0a  't matter much..
1cc00 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63        */.      c
1cc10 6c 6f 73 65 28 68 29 3b 0a 20 20 20 20 20 20 68  lose(h);.      h
1cc20 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20   = -1;.    }.   
1cc30 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
1cc40 29 3b 0a 20 20 7d 0a 0a 23 69 66 20 53 51 4c 49  );.  }..#if SQLI
1cc50 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
1cc60 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e  G_STYLE && defin
1cc70 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20  ed(__APPLE__).  
1cc80 65 6c 73 65 20 69 66 28 20 70 4c 6f 63 6b 69 6e  else if( pLockin
1cc90 67 53 74 79 6c 65 20 3d 3d 20 26 61 66 70 49 6f  gStyle == &afpIo
1cca0 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f  Methods ){.    /
1ccb0 2a 20 41 46 50 20 6c 6f 63 6b 69 6e 67 20 75 73  * AFP locking us
1ccc0 65 73 20 74 68 65 20 66 69 6c 65 20 70 61 74 68  es the file path
1ccd0 20 73 6f 20 69 74 20 6e 65 65 64 73 20 74 6f 20   so it needs to 
1cce0 62 65 20 69 6e 63 6c 75 64 65 64 20 69 6e 0a 20  be included in. 
1ccf0 20 20 20 2a 2a 20 74 68 65 20 61 66 70 4c 6f 63     ** the afpLoc
1cd00 6b 69 6e 67 43 6f 6e 74 65 78 74 2e 0a 20 20 20  kingContext..   
1cd10 20 2a 2f 0a 20 20 20 20 61 66 70 4c 6f 63 6b 69   */.    afpLocki
1cd20 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 3b  ngContext *pCtx;
1cd30 0a 20 20 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69  .    pNew->locki
1cd40 6e 67 43 6f 6e 74 65 78 74 20 3d 20 70 43 74 78  ngContext = pCtx
1cd50 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
1cd60 63 28 20 73 69 7a 65 6f 66 28 2a 70 43 74 78 29  c( sizeof(*pCtx)
1cd70 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43 74 78   );.    if( pCtx
1cd80 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
1cd90 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
1cda0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1cdb0 20 2f 2a 20 4e 42 3a 20 7a 46 69 6c 65 6e 61 6d   /* NB: zFilenam
1cdc0 65 20 65 78 69 73 74 73 20 61 6e 64 20 72 65 6d  e exists and rem
1cdd0 61 69 6e 73 20 76 61 6c 69 64 20 75 6e 74 69 6c  ains valid until
1cde0 20 74 68 65 20 66 69 6c 65 20 69 73 20 63 6c 6f   the file is clo
1cdf0 73 65 64 0a 20 20 20 20 20 20 2a 2a 20 61 63 63  sed.      ** acc
1ce00 6f 72 64 69 6e 67 20 74 6f 20 72 65 71 75 69 72  ording to requir
1ce10 65 6d 65 6e 74 20 46 31 31 31 34 31 2e 20 20 53  ement F11141.  S
1ce20 6f 20 77 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64  o we do not need
1ce30 20 74 6f 20 6d 61 6b 65 20 61 0a 20 20 20 20 20   to make a.     
1ce40 20 2a 2a 20 63 6f 70 79 20 6f 66 20 74 68 65 20   ** copy of the 
1ce50 66 69 6c 65 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20  filename. */.   
1ce60 20 20 20 70 43 74 78 2d 3e 64 62 50 61 74 68 20     pCtx->dbPath 
1ce70 3d 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 20  = zFilename;.   
1ce80 20 20 20 73 72 61 6e 64 6f 6d 64 65 76 28 29 3b     srandomdev();
1ce90 0a 20 20 20 20 20 20 75 6e 69 78 45 6e 74 65 72  .      unixEnter
1cea0 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 20 20 72  Mutex();.      r
1ceb0 63 20 3d 20 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f  c = findLockInfo
1cec0 28 70 4e 65 77 2c 20 4e 55 4c 4c 2c 20 26 70 4e  (pNew, NULL, &pN
1ced0 65 77 2d 3e 70 4f 70 65 6e 29 3b 0a 20 20 20 20  ew->pOpen);.    
1cee0 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
1cef0 28 29 3b 20 20 20 20 20 20 20 20 0a 20 20 20 20  ();        .    
1cf00 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
1cf10 65 6c 73 65 20 69 66 28 20 70 4c 6f 63 6b 69 6e  else if( pLockin
1cf20 67 53 74 79 6c 65 20 3d 3d 20 26 64 6f 74 6c 6f  gStyle == &dotlo
1cf30 63 6b 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20  ckIoMethods ){. 
1cf40 20 20 20 2f 2a 20 44 6f 74 66 69 6c 65 20 6c 6f     /* Dotfile lo
1cf50 63 6b 69 6e 67 20 75 73 65 73 20 74 68 65 20 66  cking uses the f
1cf60 69 6c 65 20 70 61 74 68 20 73 6f 20 69 74 20 6e  ile path so it n
1cf70 65 65 64 73 20 74 6f 20 62 65 20 69 6e 63 6c 75  eeds to be inclu
1cf80 64 65 64 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68  ded in.    ** th
1cf90 65 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67  e dotlockLocking
1cfa0 43 6f 6e 74 65 78 74 20 0a 20 20 20 20 2a 2f 0a  Context .    */.
1cfb0 20 20 20 20 63 68 61 72 20 2a 7a 4c 6f 63 6b 46      char *zLockF
1cfc0 69 6c 65 3b 0a 20 20 20 20 69 6e 74 20 6e 46 69  ile;.    int nFi
1cfd0 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 6e 46 69 6c  lename;.    nFil
1cfe0 65 6e 61 6d 65 20 3d 20 28 69 6e 74 29 73 74 72  ename = (int)str
1cff0 6c 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 29 20 2b  len(zFilename) +
1d000 20 36 3b 0a 20 20 20 20 7a 4c 6f 63 6b 46 69 6c   6;.    zLockFil
1d010 65 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69  e = (char *)sqli
1d020 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 46 69 6c 65  te3_malloc(nFile
1d030 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 7a  name);.    if( z
1d040 4c 6f 63 6b 46 69 6c 65 3d 3d 30 20 29 7b 0a 20  LockFile==0 ){. 
1d050 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1d060 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73  _NOMEM;.    }els
1d070 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
1d080 5f 73 6e 70 72 69 6e 74 66 28 6e 46 69 6c 65 6e  _snprintf(nFilen
1d090 61 6d 65 2c 20 7a 4c 6f 63 6b 46 69 6c 65 2c 20  ame, zLockFile, 
1d0a0 22 25 73 22 20 44 4f 54 4c 4f 43 4b 5f 53 55 46  "%s" DOTLOCK_SUF
1d0b0 46 49 58 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b  FIX, zFilename);
1d0c0 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 77 2d  .    }.    pNew-
1d0d0 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  >lockingContext 
1d0e0 3d 20 7a 4c 6f 63 6b 46 69 6c 65 3b 0a 20 20 7d  = zLockFile;.  }
1d0f0 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  ..#if OS_VXWORKS
1d100 0a 20 20 65 6c 73 65 20 69 66 28 20 70 4c 6f 63  .  else if( pLoc
1d110 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26 73 65  kingStyle == &se
1d120 6d 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20  mIoMethods ){.  
1d130 20 20 2f 2a 20 4e 61 6d 65 64 20 73 65 6d 61 70    /* Named semap
1d140 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 75 73 65  hore locking use
1d150 73 20 74 68 65 20 66 69 6c 65 20 70 61 74 68 20  s the file path 
1d160 73 6f 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62  so it needs to b
1d170 65 0a 20 20 20 20 2a 2a 20 69 6e 63 6c 75 64 65  e.    ** include
1d180 64 20 69 6e 20 74 68 65 20 73 65 6d 4c 6f 63 6b  d in the semLock
1d190 69 6e 67 43 6f 6e 74 65 78 74 0a 20 20 20 20 2a  ingContext.    *
1d1a0 2f 0a 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d  /.    unixEnterM
1d1b0 75 74 65 78 28 29 3b 0a 20 20 20 20 72 63 20 3d  utex();.    rc =
1d1c0 20 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28 70 4e   findLockInfo(pN
1d1d0 65 77 2c 20 26 70 4e 65 77 2d 3e 70 4c 6f 63 6b  ew, &pNew->pLock
1d1e0 2c 20 26 70 4e 65 77 2d 3e 70 4f 70 65 6e 29 3b  , &pNew->pOpen);
1d1f0 0a 20 20 20 20 69 66 28 20 28 72 63 3d 3d 53 51  .    if( (rc==SQ
1d200 4c 49 54 45 5f 4f 4b 29 20 26 26 20 28 70 4e 65  LITE_OK) && (pNe
1d210 77 2d 3e 70 4f 70 65 6e 2d 3e 70 53 65 6d 3d 3d  w->pOpen->pSem==
1d220 4e 55 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20 63  NULL) ){.      c
1d230 68 61 72 20 2a 7a 53 65 6d 4e 61 6d 65 20 3d 20  har *zSemName = 
1d240 70 4e 65 77 2d 3e 70 4f 70 65 6e 2d 3e 61 53 65  pNew->pOpen->aSe
1d250 6d 4e 61 6d 65 3b 0a 20 20 20 20 20 20 69 6e 74  mName;.      int
1d260 20 6e 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   n;.      sqlite
1d270 33 5f 73 6e 70 72 69 6e 74 66 28 4d 41 58 5f 50  3_snprintf(MAX_P
1d280 41 54 48 4e 41 4d 45 2c 20 7a 53 65 6d 4e 61 6d  ATHNAME, zSemNam
1d290 65 2c 20 22 2f 25 73 2e 73 65 6d 22 2c 0a 20 20  e, "/%s.sem",.  
1d2a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d2b0 20 20 20 20 20 70 4e 65 77 2d 3e 70 49 64 2d 3e       pNew->pId->
1d2c0 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 29 3b  zCanonicalName);
1d2d0 0a 20 20 20 20 20 20 66 6f 72 28 20 6e 3d 31 3b  .      for( n=1;
1d2e0 20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d 3b 20 6e 2b   zSemName[n]; n+
1d2f0 2b 20 29 0a 20 20 20 20 20 20 20 20 69 66 28 20  + ).        if( 
1d300 7a 53 65 6d 4e 61 6d 65 5b 6e 5d 3d 3d 27 2f 27  zSemName[n]=='/'
1d310 20 29 20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d 20 3d   ) zSemName[n] =
1d320 20 27 5f 27 3b 0a 20 20 20 20 20 20 70 4e 65 77   '_';.      pNew
1d330 2d 3e 70 4f 70 65 6e 2d 3e 70 53 65 6d 20 3d 20  ->pOpen->pSem = 
1d340 73 65 6d 5f 6f 70 65 6e 28 7a 53 65 6d 4e 61 6d  sem_open(zSemNam
1d350 65 2c 20 4f 5f 43 52 45 41 54 2c 20 30 36 36 36  e, O_CREAT, 0666
1d360 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 1);.      if( 
1d370 70 4e 65 77 2d 3e 70 4f 70 65 6e 2d 3e 70 53 65  pNew->pOpen->pSe
1d380 6d 20 3d 3d 20 53 45 4d 5f 46 41 49 4c 45 44 20  m == SEM_FAILED 
1d390 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1d3a0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
1d3b0 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4f 70 65        pNew->pOpe
1d3c0 6e 2d 3e 61 53 65 6d 4e 61 6d 65 5b 30 5d 20 3d  n->aSemName[0] =
1d3d0 20 27 5c 30 27 3b 0a 20 20 20 20 20 20 7d 0a 20   '\0';.      }. 
1d3e0 20 20 20 7d 0a 20 20 20 20 75 6e 69 78 4c 65 61     }.    unixLea
1d3f0 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a 23  veMutex();.  }.#
1d400 65 6e 64 69 66 0a 20 20 0a 20 20 70 4e 65 77 2d  endif.  .  pNew-
1d410 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b 0a  >lastErrno = 0;.
1d420 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20  #if OS_VXWORKS. 
1d430 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1d440 4f 4b 20 29 7b 0a 20 20 20 20 75 6e 6c 69 6e 6b  OK ){.    unlink
1d450 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20  (zFilename);.   
1d460 20 69 73 44 65 6c 65 74 65 20 3d 20 30 3b 0a 20   isDelete = 0;. 
1d470 20 7d 0a 20 20 70 4e 65 77 2d 3e 69 73 44 65 6c   }.  pNew->isDel
1d480 65 74 65 20 3d 20 69 73 44 65 6c 65 74 65 3b 0a  ete = isDelete;.
1d490 23 65 6e 64 69 66 0a 20 20 69 66 28 20 72 63 21  #endif.  if( rc!
1d4a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1d4b0 20 20 69 66 28 20 64 69 72 66 64 3e 3d 30 20 29    if( dirfd>=0 )
1d4c0 20 63 6c 6f 73 65 28 64 69 72 66 64 29 3b 20 2f   close(dirfd); /
1d4d0 2a 20 73 69 6c 65 6e 74 20 6c 65 61 6b 20 69 66  * silent leak if
1d4e0 20 66 61 69 6c 2c 20 61 6c 72 65 61 64 79 20 69   fail, already i
1d4f0 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 69  n error */.    i
1d500 66 28 20 68 3e 3d 30 20 29 20 63 6c 6f 73 65 28  f( h>=0 ) close(
1d510 68 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  h);.  }else{.   
1d520 20 70 4e 65 77 2d 3e 70 4d 65 74 68 6f 64 20 3d   pNew->pMethod =
1d530 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3b 0a   pLockingStyle;.
1d540 20 20 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28      OpenCounter(
1d550 2b 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  +1);.  }.  retur
1d560 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f  n rc;.}../*.** O
1d570 70 65 6e 20 61 20 66 69 6c 65 20 64 65 73 63 72  pen a file descr
1d580 69 70 74 6f 72 20 74 6f 20 74 68 65 20 64 69 72  iptor to the dir
1d590 65 63 74 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e  ectory containin
1d5a0 67 20 66 69 6c 65 20 7a 46 69 6c 65 6e 61 6d 65  g file zFilename
1d5b0 2e 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66  ..** If successf
1d5c0 75 6c 2c 20 2a 70 46 64 20 69 73 20 73 65 74 20  ul, *pFd is set 
1d5d0 74 6f 20 74 68 65 20 6f 70 65 6e 65 64 20 66 69  to the opened fi
1d5e0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 61 6e  le descriptor an
1d5f0 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  d.** SQLITE_OK i
1d600 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61  s returned. If a
1d610 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
1d620 65 69 74 68 65 72 20 53 51 4c 49 54 45 5f 4e 4f  either SQLITE_NO
1d630 4d 45 4d 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45  MEM.** or SQLITE
1d640 5f 43 41 4e 54 4f 50 45 4e 20 69 73 20 72 65 74  _CANTOPEN is ret
1d650 75 72 6e 65 64 20 61 6e 64 20 2a 70 46 64 20 69  urned and *pFd i
1d660 73 20 73 65 74 20 74 6f 20 61 6e 20 75 6e 64 65  s set to an unde
1d670 66 69 6e 65 64 0a 2a 2a 20 76 61 6c 75 65 2e 0a  fined.** value..
1d680 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f  **.** If SQLITE_
1d690 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20  OK is returned, 
1d6a0 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20 72 65  the caller is re
1d6b0 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 63 6c  sponsible for cl
1d6c0 6f 73 69 6e 67 0a 2a 2a 20 74 68 65 20 66 69 6c  osing.** the fil
1d6d0 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a 70 46  e descriptor *pF
1d6e0 64 20 75 73 69 6e 67 20 63 6c 6f 73 65 28 29 2e  d using close().
1d6f0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f  .*/.static int o
1d700 70 65 6e 44 69 72 65 63 74 6f 72 79 28 63 6f 6e  penDirectory(con
1d710 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
1d720 6d 65 2c 20 69 6e 74 20 2a 70 46 64 29 7b 0a 20  me, int *pFd){. 
1d730 20 69 6e 74 20 69 69 3b 0a 20 20 69 6e 74 20 66   int ii;.  int f
1d740 64 20 3d 20 2d 31 3b 0a 20 20 63 68 61 72 20 7a  d = -1;.  char z
1d750 44 69 72 6e 61 6d 65 5b 4d 41 58 5f 50 41 54 48  Dirname[MAX_PATH
1d760 4e 41 4d 45 2b 31 5d 3b 0a 0a 20 20 73 71 6c 69  NAME+1];..  sqli
1d770 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 41 58  te3_snprintf(MAX
1d780 5f 50 41 54 48 4e 41 4d 45 2c 20 7a 44 69 72 6e  _PATHNAME, zDirn
1d790 61 6d 65 2c 20 22 25 73 22 2c 20 7a 46 69 6c 65  ame, "%s", zFile
1d7a0 6e 61 6d 65 29 3b 0a 20 20 66 6f 72 28 69 69 3d  name);.  for(ii=
1d7b0 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 44 69 72  (int)strlen(zDir
1d7c0 6e 61 6d 65 29 3b 20 69 69 3e 31 20 26 26 20 7a  name); ii>1 && z
1d7d0 44 69 72 6e 61 6d 65 5b 69 69 5d 21 3d 27 2f 27  Dirname[ii]!='/'
1d7e0 3b 20 69 69 2d 2d 29 3b 0a 20 20 69 66 28 20 69  ; ii--);.  if( i
1d7f0 69 3e 30 20 29 7b 0a 20 20 20 20 7a 44 69 72 6e  i>0 ){.    zDirn
1d800 61 6d 65 5b 69 69 5d 20 3d 20 27 5c 30 27 3b 0a  ame[ii] = '\0';.
1d810 20 20 20 20 66 64 20 3d 20 6f 70 65 6e 28 7a 44      fd = open(zD
1d820 69 72 6e 61 6d 65 2c 20 4f 5f 52 44 4f 4e 4c 59  irname, O_RDONLY
1d830 7c 4f 5f 42 49 4e 41 52 59 2c 20 30 29 3b 0a 20  |O_BINARY, 0);. 
1d840 20 20 20 69 66 28 20 66 64 3e 3d 30 20 29 7b 0a     if( fd>=0 ){.
1d850 23 69 66 64 65 66 20 46 44 5f 43 4c 4f 45 58 45  #ifdef FD_CLOEXE
1d860 43 0a 20 20 20 20 20 20 66 63 6e 74 6c 28 66 64  C.      fcntl(fd
1d870 2c 20 46 5f 53 45 54 46 44 2c 20 66 63 6e 74 6c  , F_SETFD, fcntl
1d880 28 66 64 2c 20 46 5f 47 45 54 46 44 2c 20 30 29  (fd, F_GETFD, 0)
1d890 20 7c 20 46 44 5f 43 4c 4f 45 58 45 43 29 3b 0a   | FD_CLOEXEC);.
1d8a0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 4f 53 54  #endif.      OST
1d8b0 52 41 43 45 33 28 22 4f 50 45 4e 44 49 52 20 25  RACE3("OPENDIR %
1d8c0 2d 33 64 20 25 73 5c 6e 22 2c 20 66 64 2c 20 7a  -3d %s\n", fd, z
1d8d0 44 69 72 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  Dirname);.    }.
1d8e0 20 20 7d 0a 20 20 2a 70 46 64 20 3d 20 66 64 3b    }.  *pFd = fd;
1d8f0 0a 20 20 72 65 74 75 72 6e 20 28 66 64 3e 3d 30  .  return (fd>=0
1d900 3f 53 51 4c 49 54 45 5f 4f 4b 3a 53 51 4c 49 54  ?SQLITE_OK:SQLIT
1d910 45 5f 43 41 4e 54 4f 50 45 4e 29 3b 0a 7d 0a 0a  E_CANTOPEN);.}..
1d920 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 74  /*.** Create a t
1d930 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 6e 61  emporary file na
1d940 6d 65 20 69 6e 20 7a 42 75 66 2e 20 20 7a 42 75  me in zBuf.  zBu
1d950 66 20 6d 75 73 74 20 62 65 20 61 6c 6c 6f 63 61  f must be alloca
1d960 74 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 63 61  ted.** by the ca
1d970 6c 6c 69 6e 67 20 70 72 6f 63 65 73 73 20 61 6e  lling process an
1d980 64 20 6d 75 73 74 20 62 65 20 62 69 67 20 65 6e  d must be big en
1d990 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 61 74 20  ough to hold at 
1d9a0 6c 65 61 73 74 0a 2a 2a 20 70 56 66 73 2d 3e 6d  least.** pVfs->m
1d9b0 78 50 61 74 68 6e 61 6d 65 20 62 79 74 65 73 2e  xPathname bytes.
1d9c0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67  .*/.static int g
1d9d0 65 74 54 65 6d 70 6e 61 6d 65 28 69 6e 74 20 6e  etTempname(int n
1d9e0 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29  Buf, char *zBuf)
1d9f0 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  {.  static const
1da00 20 63 68 61 72 20 2a 61 7a 44 69 72 73 5b 5d 20   char *azDirs[] 
1da10 3d 20 7b 0a 20 20 20 20 20 30 2c 0a 20 20 20 20  = {.     0,.    
1da20 20 30 2c 0a 20 20 20 20 20 22 2f 76 61 72 2f 74   0,.     "/var/t
1da30 6d 70 22 2c 0a 20 20 20 20 20 22 2f 75 73 72 2f  mp",.     "/usr/
1da40 74 6d 70 22 2c 0a 20 20 20 20 20 22 2f 74 6d 70  tmp",.     "/tmp
1da50 22 2c 0a 20 20 20 20 20 22 2e 22 2c 0a 20 20 7d  ",.     ".",.  }
1da60 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  ;.  static const
1da70 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 7a   unsigned char z
1da80 43 68 61 72 73 5b 5d 20 3d 0a 20 20 20 20 22 61  Chars[] =.    "a
1da90 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71  bcdefghijklmnopq
1daa0 72 73 74 75 76 77 78 79 7a 22 0a 20 20 20 20 22  rstuvwxyz".    "
1dab0 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50  ABCDEFGHIJKLMNOP
1dac0 51 52 53 54 55 56 57 58 59 5a 22 0a 20 20 20 20  QRSTUVWXYZ".    
1dad0 22 30 31 32 33 34 35 36 37 38 39 22 3b 0a 20 20  "0123456789";.  
1dae0 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 2c 20  unsigned int i, 
1daf0 6a 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74  j;.  struct stat
1db00 20 62 75 66 3b 0a 20 20 63 6f 6e 73 74 20 63 68   buf;.  const ch
1db10 61 72 20 2a 7a 44 69 72 20 3d 20 22 2e 22 3b 0a  ar *zDir = ".";.
1db20 0a 20 20 2f 2a 20 49 74 27 73 20 6f 64 64 20 74  .  /* It's odd t
1db30 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e 20 69 6f  o simulate an io
1db40 2d 65 72 72 6f 72 20 68 65 72 65 2c 20 62 75 74  -error here, but
1db50 20 72 65 61 6c 6c 79 20 74 68 69 73 20 69 73 20   really this is 
1db60 6a 75 73 74 0a 20 20 2a 2a 20 75 73 69 6e 67 20  just.  ** using 
1db70 74 68 65 20 69 6f 2d 65 72 72 6f 72 20 69 6e 66  the io-error inf
1db80 72 61 73 74 72 75 63 74 75 72 65 20 74 6f 20 74  rastructure to t
1db90 65 73 74 20 74 68 61 74 20 53 51 4c 69 74 65 20  est that SQLite 
1dba0 68 61 6e 64 6c 65 73 20 74 68 69 73 0a 20 20 2a  handles this.  *
1dbb0 2a 20 66 75 6e 63 74 69 6f 6e 20 66 61 69 6c 69  * function faili
1dbc0 6e 67 2e 20 0a 20 20 2a 2f 0a 20 20 53 69 6d 75  ng. .  */.  Simu
1dbd0 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74  lateIOError( ret
1dbe0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
1dbf0 20 29 3b 0a 0a 20 20 61 7a 44 69 72 73 5b 30 5d   );..  azDirs[0]
1dc00 20 3d 20 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f   = sqlite3_temp_
1dc10 64 69 72 65 63 74 6f 72 79 3b 0a 20 20 69 66 20  directory;.  if 
1dc20 28 4e 55 4c 4c 20 3d 3d 20 61 7a 44 69 72 73 5b  (NULL == azDirs[
1dc30 31 5d 29 20 7b 0a 20 20 20 20 61 7a 44 69 72 73  1]) {.    azDirs
1dc40 5b 31 5d 20 3d 20 67 65 74 65 6e 76 28 22 54 4d  [1] = getenv("TM
1dc50 50 44 49 52 22 29 3b 0a 20 20 7d 0a 20 20 0a 20  PDIR");.  }.  . 
1dc60 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65   for(i=0; i<size
1dc70 6f 66 28 61 7a 44 69 72 73 29 2f 73 69 7a 65 6f  of(azDirs)/sizeo
1dc80 66 28 61 7a 44 69 72 73 5b 30 5d 29 3b 20 69 2b  f(azDirs[0]); i+
1dc90 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 7a 44 69  +){.    if( azDi
1dca0 72 73 5b 69 5d 3d 3d 30 20 29 20 63 6f 6e 74 69  rs[i]==0 ) conti
1dcb0 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 73 74 61  nue;.    if( sta
1dcc0 74 28 61 7a 44 69 72 73 5b 69 5d 2c 20 26 62 75  t(azDirs[i], &bu
1dcd0 66 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  f) ) continue;. 
1dce0 20 20 20 69 66 28 20 21 53 5f 49 53 44 49 52 28     if( !S_ISDIR(
1dcf0 62 75 66 2e 73 74 5f 6d 6f 64 65 29 20 29 20 63  buf.st_mode) ) c
1dd00 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
1dd10 20 61 63 63 65 73 73 28 61 7a 44 69 72 73 5b 69   access(azDirs[i
1dd20 5d 2c 20 30 37 29 20 29 20 63 6f 6e 74 69 6e 75  ], 07) ) continu
1dd30 65 3b 0a 20 20 20 20 7a 44 69 72 20 3d 20 61 7a  e;.    zDir = az
1dd40 44 69 72 73 5b 69 5d 3b 0a 20 20 20 20 62 72 65  Dirs[i];.    bre
1dd50 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68  ak;.  }..  /* Ch
1dd60 65 63 6b 20 74 68 61 74 20 74 68 65 20 6f 75 74  eck that the out
1dd70 70 75 74 20 62 75 66 66 65 72 20 69 73 20 6c 61  put buffer is la
1dd80 72 67 65 20 65 6e 6f 75 67 68 20 66 6f 72 20 74  rge enough for t
1dd90 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  he temporary fil
1dda0 65 20 0a 20 20 2a 2a 20 6e 61 6d 65 2e 20 49 66  e .  ** name. If
1ddb0 20 69 74 20 69 73 20 6e 6f 74 2c 20 72 65 74 75   it is not, retu
1ddc0 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e  rn SQLITE_ERROR.
1ddd0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 73 74 72  .  */.  if( (str
1dde0 6c 65 6e 28 7a 44 69 72 29 20 2b 20 73 74 72 6c  len(zDir) + strl
1ddf0 65 6e 28 53 51 4c 49 54 45 5f 54 45 4d 50 5f 46  en(SQLITE_TEMP_F
1de00 49 4c 45 5f 50 52 45 46 49 58 29 20 2b 20 31 37  ILE_PREFIX) + 17
1de10 29 20 3e 3d 20 28 73 69 7a 65 5f 74 29 6e 42 75  ) >= (size_t)nBu
1de20 66 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  f ){.    return 
1de30 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
1de40 7d 0a 0a 20 20 64 6f 7b 0a 20 20 20 20 73 71 6c  }..  do{.    sql
1de50 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42  ite3_snprintf(nB
1de60 75 66 2d 31 37 2c 20 7a 42 75 66 2c 20 22 25 73  uf-17, zBuf, "%s
1de70 2f 22 53 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49  /"SQLITE_TEMP_FI
1de80 4c 45 5f 50 52 45 46 49 58 2c 20 7a 44 69 72 29  LE_PREFIX, zDir)
1de90 3b 0a 20 20 20 20 6a 20 3d 20 28 69 6e 74 29 73  ;.    j = (int)s
1dea0 74 72 6c 65 6e 28 7a 42 75 66 29 3b 0a 20 20 20  trlen(zBuf);.   
1deb0 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e   sqlite3_randomn
1dec0 65 73 73 28 31 35 2c 20 26 7a 42 75 66 5b 6a 5d  ess(15, &zBuf[j]
1ded0 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
1dee0 69 3c 31 35 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b  i<15; i++, j++){
1def0 0a 20 20 20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d  .      zBuf[j] =
1df00 20 28 63 68 61 72 29 7a 43 68 61 72 73 5b 20 28   (char)zChars[ (
1df10 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 7a  (unsigned char)z
1df20 42 75 66 5b 6a 5d 29 25 28 73 69 7a 65 6f 66 28  Buf[j])%(sizeof(
1df30 7a 43 68 61 72 73 29 2d 31 29 20 5d 3b 0a 20 20  zChars)-1) ];.  
1df40 20 20 7d 0a 20 20 20 20 7a 42 75 66 5b 6a 5d 20    }.    zBuf[j] 
1df50 3d 20 30 3b 0a 20 20 7d 77 68 69 6c 65 28 20 61  = 0;.  }while( a
1df60 63 63 65 73 73 28 7a 42 75 66 2c 30 29 3d 3d 30  ccess(zBuf,0)==0
1df70 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   );.  return SQL
1df80 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53  ITE_OK;.}..#if S
1df90 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
1dfa0 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65  KING_STYLE && de
1dfb0 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
1dfc0 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65 20 74  ./*.** Routine t
1dfd0 6f 20 74 72 61 6e 73 66 6f 72 6d 20 61 20 75 6e  o transform a un
1dfe0 69 78 46 69 6c 65 20 69 6e 74 6f 20 61 20 70 72  ixFile into a pr
1dff0 6f 78 79 2d 6c 6f 63 6b 69 6e 67 20 75 6e 69 78  oxy-locking unix
1e000 46 69 6c 65 2e 0a 2a 2a 20 49 6d 70 6c 65 6d 65  File..** Impleme
1e010 6e 74 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 70  ntation in the p
1e020 72 6f 78 79 2d 6c 6f 63 6b 20 64 69 76 69 73 69  roxy-lock divisi
1e030 6f 6e 2c 20 62 75 74 20 75 73 65 64 20 62 79 20  on, but used by 
1e040 75 6e 69 78 4f 70 65 6e 28 29 0a 2a 2a 20 69 66  unixOpen().** if
1e050 20 53 51 4c 49 54 45 5f 50 52 45 46 45 52 5f 50   SQLITE_PREFER_P
1e060 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 20 69 73 20  ROXY_LOCKING is 
1e070 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  defined..*/.stat
1e080 69 63 20 69 6e 74 20 70 72 6f 78 79 54 72 61 6e  ic int proxyTran
1e090 73 66 6f 72 6d 55 6e 69 78 46 69 6c 65 28 75 6e  sformUnixFile(un
1e0a0 69 78 46 69 6c 65 2a 2c 20 63 6f 6e 73 74 20 63  ixFile*, const c
1e0b0 68 61 72 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f  har*);.#endif../
1e0c0 2a 0a 2a 2a 20 53 65 61 72 63 68 20 66 6f 72 20  *.** Search for 
1e0d0 61 6e 20 75 6e 75 73 65 64 20 66 69 6c 65 20 64  an unused file d
1e0e0 65 73 63 72 69 70 74 6f 72 20 74 68 61 74 20 77  escriptor that w
1e0f0 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68 65  as opened on the
1e100 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 66 69   database .** fi
1e110 6c 65 20 28 6e 6f 74 20 61 20 6a 6f 75 72 6e 61  le (not a journa
1e120 6c 20 6f 72 20 6d 61 73 74 65 72 2d 6a 6f 75 72  l or master-jour
1e130 6e 61 6c 20 66 69 6c 65 29 20 69 64 65 6e 74 69  nal file) identi
1e140 66 69 65 64 20 62 79 20 70 61 74 68 6e 61 6d 65  fied by pathname
1e150 0a 2a 2a 20 7a 50 61 74 68 20 77 69 74 68 20 53  .** zPath with S
1e160 51 4c 49 54 45 5f 4f 50 45 4e 5f 58 58 58 20 66  QLITE_OPEN_XXX f
1e170 6c 61 67 73 20 6d 61 74 63 68 69 6e 67 20 74 68  lags matching th
1e180 6f 73 65 20 70 61 73 73 65 64 20 61 73 20 74 68  ose passed as th
1e190 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 61 72 67 75  e second.** argu
1e1a0 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e  ment to this fun
1e1b0 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 53 75 63  ction..**.** Suc
1e1c0 68 20 61 20 66 69 6c 65 20 64 65 73 63 72 69 70  h a file descrip
1e1d0 74 6f 72 20 6d 61 79 20 65 78 69 73 74 20 69 66  tor may exist if
1e1e0 20 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e   a database conn
1e1f0 65 63 74 69 6f 6e 20 77 61 73 20 63 6c 6f 73 65  ection was close
1e200 64 0a 2a 2a 20 62 75 74 20 74 68 65 20 61 73 73  d.** but the ass
1e210 6f 63 69 61 74 65 64 20 66 69 6c 65 20 64 65 73  ociated file des
1e220 63 72 69 70 74 6f 72 20 63 6f 75 6c 64 20 6e 6f  criptor could no
1e230 74 20 62 65 20 63 6c 6f 73 65 64 20 62 65 63 61  t be closed beca
1e240 75 73 65 20 73 6f 6d 65 0a 2a 2a 20 6f 74 68 65  use some.** othe
1e250 72 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  r file descripto
1e260 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73 61  r open on the sa
1e270 6d 65 20 66 69 6c 65 20 69 73 20 68 6f 6c 64 69  me file is holdi
1e280 6e 67 20 61 20 66 69 6c 65 2d 6c 6f 63 6b 2e 0a  ng a file-lock..
1e290 2a 2a 20 52 65 66 65 72 20 74 6f 20 63 6f 6d 6d  ** Refer to comm
1e2a0 65 6e 74 73 20 69 6e 20 74 68 65 20 75 6e 69 78  ents in the unix
1e2b0 43 6c 6f 73 65 28 29 20 66 75 6e 63 74 69 6f 6e  Close() function
1e2c0 20 61 6e 64 20 74 68 65 20 6c 65 6e 67 74 68 79   and the lengthy
1e2d0 20 63 6f 6d 6d 65 6e 74 0a 2a 2a 20 64 65 73 63   comment.** desc
1e2e0 72 69 62 69 6e 67 20 22 50 6f 73 69 78 20 41 64  ribing "Posix Ad
1e2f0 76 69 73 6f 72 79 20 4c 6f 63 6b 69 6e 67 22 20  visory Locking" 
1e300 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
1e310 74 68 69 73 20 66 69 6c 65 20 66 6f 72 20 0a 2a  this file for .*
1e320 2a 20 66 75 72 74 68 65 72 20 64 65 74 61 69 6c  * further detail
1e330 73 2e 20 41 6c 73 6f 2c 20 74 69 63 6b 65 74 20  s. Also, ticket 
1e340 23 34 30 31 38 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  #4018..**.** If 
1e350 61 20 73 75 69 74 61 62 6c 65 20 66 69 6c 65 20  a suitable file 
1e360 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 66 6f  descriptor is fo
1e370 75 6e 64 2c 20 74 68 65 6e 20 69 74 20 69 73 20  und, then it is 
1e380 72 65 74 75 72 6e 65 64 2e 20 49 66 20 6e 6f 0a  returned. If no.
1e390 2a 2a 20 73 75 63 68 20 66 69 6c 65 20 64 65 73  ** such file des
1e3a0 63 72 69 70 74 6f 72 20 69 73 20 6c 6f 63 61 74  criptor is locat
1e3b0 65 64 2c 20 2d 31 20 69 73 20 72 65 74 75 72 6e  ed, -1 is return
1e3c0 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 55 6e  ed..*/.static Un
1e3d0 69 78 55 6e 75 73 65 64 46 64 20 2a 66 69 6e 64  ixUnusedFd *find
1e3e0 52 65 75 73 61 62 6c 65 46 64 28 63 6f 6e 73 74  ReusableFd(const
1e3f0 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 69 6e   char *zPath, in
1e400 74 20 66 6c 61 67 73 29 7b 0a 20 20 55 6e 69 78  t flags){.  Unix
1e410 55 6e 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65  UnusedFd *pUnuse
1e420 64 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 44 6f 20  d = 0;..  /* Do 
1e430 6e 6f 74 20 73 65 61 72 63 68 20 66 6f 72 20 61  not search for a
1e440 6e 20 75 6e 75 73 65 64 20 66 69 6c 65 20 64 65  n unused file de
1e450 73 63 72 69 70 74 6f 72 20 6f 6e 20 76 78 77 6f  scriptor on vxwo
1e460 72 6b 73 2e 20 4e 6f 74 20 62 65 63 61 75 73 65  rks. Not because
1e470 0a 20 20 2a 2a 20 76 78 77 6f 72 6b 73 20 77 6f  .  ** vxworks wo
1e480 75 6c 64 20 6e 6f 74 20 62 65 6e 65 66 69 74 20  uld not benefit 
1e490 66 72 6f 6d 20 74 68 65 20 63 68 61 6e 67 65 20  from the change 
1e4a0 28 69 74 20 6d 69 67 68 74 2c 20 77 65 27 72 65  (it might, we're
1e4b0 20 6e 6f 74 20 73 75 72 65 29 2c 0a 20 20 2a 2a   not sure),.  **
1e4c0 20 62 75 74 20 62 65 63 61 75 73 65 20 6e 6f 20   but because no 
1e4d0 77 61 79 20 74 6f 20 74 65 73 74 20 69 74 20 69  way to test it i
1e4e0 73 20 63 75 72 72 65 6e 74 6c 79 20 61 76 61 69  s currently avai
1e4f0 6c 61 62 6c 65 2e 20 49 74 20 69 73 20 62 65 74  lable. It is bet
1e500 74 65 72 20 0a 20 20 2a 2a 20 6e 6f 74 20 74 6f  ter .  ** not to
1e510 20 72 69 73 6b 20 62 72 65 61 6b 69 6e 67 20 76   risk breaking v
1e520 78 77 6f 72 6b 73 20 73 75 70 70 6f 72 74 20 66  xworks support f
1e530 6f 72 20 74 68 65 20 73 61 6b 65 20 6f 66 20 73  or the sake of s
1e540 75 63 68 20 61 6e 20 6f 62 73 63 75 72 65 20 0a  uch an obscure .
1e550 20 20 2a 2a 20 66 65 61 74 75 72 65 2e 20 20 2a    ** feature.  *
1e560 2f 0a 23 69 66 20 21 4f 53 5f 56 58 57 4f 52 4b  /.#if !OS_VXWORK
1e570 53 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 20  S.  struct stat 
1e580 73 53 74 61 74 3b 20 20 20 20 20 20 20 20 20 20  sStat;          
1e590 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
1e5a0 6c 74 73 20 6f 66 20 73 74 61 74 28 29 20 63 61  lts of stat() ca
1e5b0 6c 6c 20 2a 2f 0a 0a 20 20 2f 2a 20 41 20 73 74  ll */..  /* A st
1e5c0 61 74 28 29 20 63 61 6c 6c 20 6d 61 79 20 66 61  at() call may fa
1e5d0 69 6c 20 66 6f 72 20 76 61 72 69 6f 75 73 20 72  il for various r
1e5e0 65 61 73 6f 6e 73 2e 20 49 66 20 74 68 69 73 20  easons. If this 
1e5f0 68 61 70 70 65 6e 73 2c 20 69 74 20 69 73 0a 20  happens, it is. 
1e600 20 2a 2a 20 61 6c 6d 6f 73 74 20 63 65 72 74 61   ** almost certa
1e610 69 6e 20 74 68 61 74 20 61 6e 20 6f 70 65 6e 28  in that an open(
1e620 29 20 63 61 6c 6c 20 6f 6e 20 74 68 65 20 73 61  ) call on the sa
1e630 6d 65 20 70 61 74 68 20 77 69 6c 6c 20 61 6c 73  me path will als
1e640 6f 20 66 61 69 6c 2e 0a 20 20 2a 2a 20 46 6f 72  o fail..  ** For
1e650 20 74 68 69 73 20 72 65 61 73 6f 6e 2c 20 69 66   this reason, if
1e660 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
1e670 20 69 6e 20 74 68 65 20 73 74 61 74 28 29 20 63   in the stat() c
1e680 61 6c 6c 20 68 65 72 65 2c 20 69 74 20 69 73 0a  all here, it is.
1e690 20 20 2a 2a 20 69 67 6e 6f 72 65 64 20 61 6e 64    ** ignored and
1e6a0 20 2d 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e   -1 is returned.
1e6b0 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c   The caller will
1e6c0 20 74 72 79 20 74 6f 20 6f 70 65 6e 20 61 20 6e   try to open a n
1e6d0 65 77 20 66 69 6c 65 0a 20 20 2a 2a 20 64 65 73  ew file.  ** des
1e6e0 63 72 69 70 74 6f 72 20 6f 6e 20 74 68 65 20 73  criptor on the s
1e6f0 61 6d 65 20 70 61 74 68 2c 20 66 61 69 6c 2c 20  ame path, fail, 
1e700 61 6e 64 20 72 65 74 75 72 6e 20 61 6e 20 65 72  and return an er
1e710 72 6f 72 20 74 6f 20 53 51 4c 69 74 65 2e 0a 20  ror to SQLite.. 
1e720 20 2a 2a 0a 20 20 2a 2a 20 45 76 65 6e 20 69 66   **.  ** Even if
1e730 20 61 20 73 75 62 73 65 71 75 65 6e 74 20 6f 70   a subsequent op
1e740 65 6e 28 29 20 63 61 6c 6c 20 64 6f 65 73 20 73  en() call does s
1e750 75 63 63 65 65 64 2c 20 74 68 65 20 63 6f 6e 73  ucceed, the cons
1e760 65 71 75 65 6e 63 65 73 20 6f 66 0a 20 20 2a 2a  equences of.  **
1e770 20 6e 6f 74 20 73 65 61 72 63 68 69 6e 67 20 66   not searching f
1e780 6f 72 20 61 20 72 65 73 75 73 61 62 6c 65 20 66  or a resusable f
1e790 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 61  ile descriptor a
1e7a0 72 65 20 6e 6f 74 20 64 69 72 65 2e 20 20 2a 2f  re not dire.  */
1e7b0 0a 20 20 69 66 28 20 30 3d 3d 73 74 61 74 28 7a  .  if( 0==stat(z
1e7c0 50 61 74 68 2c 20 26 73 53 74 61 74 29 20 29 7b  Path, &sStat) ){
1e7d0 0a 20 20 20 20 73 74 72 75 63 74 20 75 6e 69 78  .    struct unix
1e7e0 4f 70 65 6e 43 6e 74 20 2a 70 4f 3b 0a 20 20 20  OpenCnt *pO;.   
1e7f0 20 73 74 72 75 63 74 20 75 6e 69 78 46 69 6c 65   struct unixFile
1e800 49 64 20 69 64 3b 0a 20 20 20 20 69 64 2e 64 65  Id id;.    id.de
1e810 76 20 3d 20 73 53 74 61 74 2e 73 74 5f 64 65 76  v = sStat.st_dev
1e820 3b 0a 20 20 20 20 69 64 2e 69 6e 6f 20 3d 20 73  ;.    id.ino = s
1e830 53 74 61 74 2e 73 74 5f 69 6e 6f 3b 0a 0a 20 20  Stat.st_ino;..  
1e840 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
1e850 28 29 3b 0a 20 20 20 20 66 6f 72 28 70 4f 3d 6f  ();.    for(pO=o
1e860 70 65 6e 4c 69 73 74 3b 20 70 4f 20 26 26 20 6d  penList; pO && m
1e870 65 6d 63 6d 70 28 26 69 64 2c 20 26 70 4f 2d 3e  emcmp(&id, &pO->
1e880 66 69 6c 65 49 64 2c 20 73 69 7a 65 6f 66 28 69  fileId, sizeof(i
1e890 64 29 29 3b 20 70 4f 3d 70 4f 2d 3e 70 4e 65 78  d)); pO=pO->pNex
1e8a0 74 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 20 29  t);.    if( pO )
1e8b0 7b 0a 20 20 20 20 20 20 55 6e 69 78 55 6e 75 73  {.      UnixUnus
1e8c0 65 64 46 64 20 2a 2a 70 70 3b 0a 20 20 20 20 20  edFd **pp;.     
1e8d0 20 66 6f 72 28 70 70 3d 26 70 4f 2d 3e 70 55 6e   for(pp=&pO->pUn
1e8e0 75 73 65 64 3b 20 2a 70 70 20 26 26 20 28 2a 70  used; *pp && (*p
1e8f0 70 29 2d 3e 66 6c 61 67 73 21 3d 66 6c 61 67 73  p)->flags!=flags
1e900 3b 20 70 70 3d 26 28 28 2a 70 70 29 2d 3e 70 4e  ; pp=&((*pp)->pN
1e910 65 78 74 29 29 3b 0a 20 20 20 20 20 20 70 55 6e  ext));.      pUn
1e920 75 73 65 64 20 3d 20 2a 70 70 3b 0a 20 20 20 20  used = *pp;.    
1e930 20 20 69 66 28 20 70 55 6e 75 73 65 64 20 29 7b    if( pUnused ){
1e940 0a 20 20 20 20 20 20 20 20 2a 70 70 20 3d 20 70  .        *pp = p
1e950 55 6e 75 73 65 64 2d 3e 70 4e 65 78 74 3b 0a 20  Unused->pNext;. 
1e960 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1e970 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
1e980 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 20 20  );.  }.#endif   
1e990 20 2f 2a 20 69 66 20 21 4f 53 5f 56 58 57 4f 52   /* if !OS_VXWOR
1e9a0 4b 53 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 70  KS */.  return p
1e9b0 55 6e 75 73 65 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Unused;.}../*.**
1e9c0 20 4f 70 65 6e 20 74 68 65 20 66 69 6c 65 20 7a   Open the file z
1e9d0 50 61 74 68 2e 0a 2a 2a 20 0a 2a 2a 20 50 72 65  Path..** .** Pre
1e9e0 76 69 6f 75 73 6c 79 2c 20 74 68 65 20 53 51 4c  viously, the SQL
1e9f0 69 74 65 20 4f 53 20 6c 61 79 65 72 20 75 73 65  ite OS layer use
1ea00 64 20 74 68 72 65 65 20 66 75 6e 63 74 69 6f 6e  d three function
1ea10 73 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 74 68  s in place of th
1ea20 69 73 0a 2a 2a 20 6f 6e 65 3a 0a 2a 2a 0a 2a 2a  is.** one:.**.**
1ea30 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 4f 70       sqlite3OsOp
1ea40 65 6e 52 65 61 64 57 72 69 74 65 28 29 3b 0a 2a  enReadWrite();.*
1ea50 2a 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 4f  *     sqlite3OsO
1ea60 70 65 6e 52 65 61 64 4f 6e 6c 79 28 29 3b 0a 2a  penReadOnly();.*
1ea70 2a 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 4f  *     sqlite3OsO
1ea80 70 65 6e 45 78 63 6c 75 73 69 76 65 28 29 3b 0a  penExclusive();.
1ea90 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 63 61 6c 6c  **.** These call
1eaa0 73 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20  s correspond to 
1eab0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f  the following co
1eac0 6d 62 69 6e 61 74 69 6f 6e 73 20 6f 66 20 66 6c  mbinations of fl
1ead0 61 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 52  ags:.**.**     R
1eae0 65 61 64 57 72 69 74 65 28 29 20 2d 3e 20 20 20  eadWrite() ->   
1eaf0 20 20 28 52 45 41 44 57 52 49 54 45 20 7c 20 43    (READWRITE | C
1eb00 52 45 41 54 45 29 0a 2a 2a 20 20 20 20 20 52 65  REATE).**     Re
1eb10 61 64 4f 6e 6c 79 28 29 20 20 2d 3e 20 20 20 20  adOnly()  ->    
1eb20 20 28 52 45 41 44 4f 4e 4c 59 29 20 0a 2a 2a 20   (READONLY) .** 
1eb30 20 20 20 20 4f 70 65 6e 45 78 63 6c 75 73 69 76      OpenExclusiv
1eb40 65 28 29 20 2d 3e 20 28 52 45 41 44 57 52 49 54  e() -> (READWRIT
1eb50 45 20 7c 20 43 52 45 41 54 45 20 7c 20 45 58 43  E | CREATE | EXC
1eb60 4c 55 53 49 56 45 29 0a 2a 2a 0a 2a 2a 20 54 68  LUSIVE).**.** Th
1eb70 65 20 6f 6c 64 20 4f 70 65 6e 45 78 63 6c 75 73  e old OpenExclus
1eb80 69 76 65 28 29 20 61 63 63 65 70 74 65 64 20 61  ive() accepted a
1eb90 20 62 6f 6f 6c 65 61 6e 20 61 72 67 75 6d 65 6e   boolean argumen
1eba0 74 20 2d 20 22 64 65 6c 46 6c 61 67 22 2e 20 49  t - "delFlag". I
1ebb0 66 0a 2a 2a 20 74 72 75 65 2c 20 74 68 65 20 66  f.** true, the f
1ebc0 69 6c 65 20 77 61 73 20 63 6f 6e 66 69 67 75 72  ile was configur
1ebd0 65 64 20 74 6f 20 62 65 20 61 75 74 6f 6d 61 74  ed to be automat
1ebe0 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 20 77  ically deleted w
1ebf0 68 65 6e 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20  hen the.** file 
1ec00 68 61 6e 64 6c 65 20 63 6c 6f 73 65 64 2e 20 54  handle closed. T
1ec10 6f 20 61 63 68 69 65 76 65 20 74 68 65 20 73 61  o achieve the sa
1ec20 6d 65 20 65 66 66 65 63 74 20 75 73 69 6e 67 20  me effect using 
1ec30 74 68 69 73 20 6e 65 77 20 0a 2a 2a 20 69 6e 74  this new .** int
1ec40 65 72 66 61 63 65 2c 20 61 64 64 20 74 68 65 20  erface, add the 
1ec50 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 66 6c  DELETEONCLOSE fl
1ec60 61 67 20 74 6f 20 74 68 6f 73 65 20 73 70 65 63  ag to those spec
1ec70 69 66 69 65 64 20 61 62 6f 76 65 20 66 6f 72 20  ified above for 
1ec80 0a 2a 2a 20 4f 70 65 6e 45 78 63 6c 75 73 69 76  .** OpenExclusiv
1ec90 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  e()..*/.static i
1eca0 6e 74 20 75 6e 69 78 4f 70 65 6e 28 0a 20 20 73  nt unixOpen(.  s
1ecb0 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
1ecc0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ,           /* T
1ecd0 68 65 20 56 46 53 20 66 6f 72 20 77 68 69 63 68  he VFS for which
1ece0 20 74 68 69 73 20 69 73 20 74 68 65 20 78 4f 70   this is the xOp
1ecf0 65 6e 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 63  en method */.  c
1ed00 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68  onst char *zPath
1ed10 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ,           /* P
1ed20 61 74 68 6e 61 6d 65 20 6f 66 20 66 69 6c 65 20  athname of file 
1ed30 74 6f 20 62 65 20 6f 70 65 6e 65 64 20 2a 2f 0a  to be opened */.
1ed40 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
1ed50 70 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 2f  pFile,         /
1ed60 2a 20 54 68 65 20 66 69 6c 65 20 64 65 73 63 72  * The file descr
1ed70 69 70 74 6f 72 20 74 6f 20 62 65 20 66 69 6c 6c  iptor to be fill
1ed80 65 64 20 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 66  ed in */.  int f
1ed90 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20  lags,           
1eda0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 70 75 74          /* Input
1edb0 20 66 6c 61 67 73 20 74 6f 20 63 6f 6e 74 72 6f   flags to contro
1edc0 6c 20 74 68 65 20 6f 70 65 6e 69 6e 67 20 2a 2f  l the opening */
1edd0 0a 20 20 69 6e 74 20 2a 70 4f 75 74 46 6c 61 67  .  int *pOutFlag
1ede0 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s               
1edf0 2f 2a 20 4f 75 74 70 75 74 20 66 6c 61 67 73 20  /* Output flags 
1ee00 72 65 74 75 72 6e 65 64 20 74 6f 20 53 51 4c 69  returned to SQLi
1ee10 74 65 20 63 6f 72 65 20 2a 2f 0a 29 7b 0a 20 20  te core */.){.  
1ee20 75 6e 69 78 46 69 6c 65 20 2a 70 20 3d 20 28 75  unixFile *p = (u
1ee30 6e 69 78 46 69 6c 65 20 2a 29 70 46 69 6c 65 3b  nixFile *)pFile;
1ee40 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d 31 3b 20  .  int fd = -1; 
1ee50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ee60 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69    /* File descri
1ee70 70 74 6f 72 20 72 65 74 75 72 6e 65 64 20 62 79  ptor returned by
1ee80 20 6f 70 65 6e 28 29 20 2a 2f 0a 20 20 69 6e 74   open() */.  int
1ee90 20 64 69 72 66 64 20 3d 20 2d 31 3b 20 20 20 20   dirfd = -1;    
1eea0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
1eeb0 69 72 65 63 74 6f 72 79 20 66 69 6c 65 20 64 65  irectory file de
1eec0 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 69 6e  scriptor */.  in
1eed0 74 20 6f 70 65 6e 46 6c 61 67 73 20 3d 20 30 3b  t openFlags = 0;
1eee0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1eef0 46 6c 61 67 73 20 74 6f 20 70 61 73 73 20 74 6f  Flags to pass to
1ef00 20 6f 70 65 6e 28 29 20 2a 2f 0a 20 20 69 6e 74   open() */.  int
1ef10 20 65 54 79 70 65 20 3d 20 66 6c 61 67 73 26 30   eType = flags&0
1ef20 78 46 46 46 46 46 46 30 30 3b 20 20 2f 2a 20 54  xFFFFFF00;  /* T
1ef30 79 70 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 6f  ype of file to o
1ef40 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 4c  pen */.  int noL
1ef50 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ock;            
1ef60 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1ef70 74 6f 20 6f 6d 69 74 20 6c 6f 63 6b 69 6e 67 20  to omit locking 
1ef80 70 72 69 6d 69 74 69 76 65 73 20 2a 2f 0a 20 20  primitives */.  
1ef90 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1efa0 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  OK;            /
1efb0 2a 20 46 75 6e 63 74 69 6f 6e 20 52 65 74 75 72  * Function Retur
1efc0 6e 20 43 6f 64 65 20 2a 2f 0a 0a 20 20 69 6e 74  n Code */..  int
1efd0 20 69 73 45 78 63 6c 75 73 69 76 65 20 20 3d 20   isExclusive  = 
1efe0 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
1eff0 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 29 3b  OPEN_EXCLUSIVE);
1f000 0a 20 20 69 6e 74 20 69 73 44 65 6c 65 74 65 20  .  int isDelete 
1f010 20 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53      = (flags & S
1f020 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54  QLITE_OPEN_DELET
1f030 45 4f 4e 43 4c 4f 53 45 29 3b 0a 20 20 69 6e 74  EONCLOSE);.  int
1f040 20 69 73 43 72 65 61 74 65 20 20 20 20 20 3d 20   isCreate     = 
1f050 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
1f060 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a 20 20  OPEN_CREATE);.  
1f070 69 6e 74 20 69 73 52 65 61 64 6f 6e 6c 79 20 20  int isReadonly  
1f080 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49   = (flags & SQLI
1f090 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
1f0a0 29 3b 0a 20 20 69 6e 74 20 69 73 52 65 61 64 57  );.  int isReadW
1f0b0 72 69 74 65 20 20 3d 20 28 66 6c 61 67 73 20 26  rite  = (flags &
1f0c0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
1f0d0 44 57 52 49 54 45 29 3b 0a 0a 20 20 2f 2a 20 49  DWRITE);..  /* I
1f0e0 66 20 63 72 65 61 74 69 6e 67 20 61 20 6d 61 73  f creating a mas
1f0f0 74 65 72 20 6f 72 20 6d 61 69 6e 2d 66 69 6c 65  ter or main-file
1f100 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 69 73 20 66   journal, this f
1f110 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 6f 70 65  unction will ope
1f120 6e 0a 20 20 2a 2a 20 61 20 66 69 6c 65 2d 64 65  n.  ** a file-de
1f130 73 63 72 69 70 74 6f 72 20 6f 6e 20 74 68 65 20  scriptor on the 
1f140 64 69 72 65 63 74 6f 72 79 20 74 6f 6f 2e 20 54  directory too. T
1f150 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 75 6e  he first time un
1f160 69 78 53 79 6e 63 28 29 0a 20 20 2a 2a 20 69 73  ixSync().  ** is
1f170 20 63 61 6c 6c 65 64 20 74 68 65 20 64 69 72 65   called the dire
1f180 63 74 6f 72 79 20 66 69 6c 65 20 64 65 73 63 72  ctory file descr
1f190 69 70 74 6f 72 20 77 69 6c 6c 20 62 65 20 66 73  iptor will be fs
1f1a0 79 6e 63 28 29 65 64 20 61 6e 64 20 63 6c 6f 73  ync()ed and clos
1f1b0 65 28 29 64 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74  e()d..  */.  int
1f1c0 20 69 73 4f 70 65 6e 44 69 72 65 63 74 6f 72 79   isOpenDirectory
1f1d0 20 3d 20 28 69 73 43 72 65 61 74 65 20 26 26 20   = (isCreate && 
1f1e0 0a 20 20 20 20 20 20 28 65 54 79 70 65 3d 3d 53  .      (eType==S
1f1f0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45  QLITE_OPEN_MASTE
1f200 52 5f 4a 4f 55 52 4e 41 4c 20 7c 7c 20 65 54 79  R_JOURNAL || eTy
1f210 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
1f220 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 0a 20 20  MAIN_JOURNAL).  
1f230 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 72 67 75  );..  /* If argu
1f240 6d 65 6e 74 20 7a 50 61 74 68 20 69 73 20 61 20  ment zPath is a 
1f250 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2c 20 74 68  NULL pointer, th
1f260 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72  is function is r
1f270 65 71 75 69 72 65 64 20 74 6f 20 6f 70 65 6e 0a  equired to open.
1f280 20 20 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72 79    ** a temporary
1f290 20 66 69 6c 65 2e 20 55 73 65 20 74 68 69 73 20   file. Use this 
1f2a0 62 75 66 66 65 72 20 74 6f 20 73 74 6f 72 65 20  buffer to store 
1f2b0 74 68 65 20 66 69 6c 65 20 6e 61 6d 65 20 69 6e  the file name in
1f2c0 2e 0a 20 20 2a 2f 0a 20 20 63 68 61 72 20 7a 54  ..  */.  char zT
1f2d0 6d 70 6e 61 6d 65 5b 4d 41 58 5f 50 41 54 48 4e  mpname[MAX_PATHN
1f2e0 41 4d 45 2b 31 5d 3b 0a 20 20 63 6f 6e 73 74 20  AME+1];.  const 
1f2f0 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 7a 50  char *zName = zP
1f300 61 74 68 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  ath;..  /* Check
1f310 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
1f320 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20 74 72  tatements are tr
1f330 75 65 3a 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ue: .  **.  **  
1f340 20 28 61 29 20 45 78 61 63 74 6c 79 20 6f 6e 65   (a) Exactly one
1f350 20 6f 66 20 74 68 65 20 52 45 41 44 57 52 49 54   of the READWRIT
1f360 45 20 61 6e 64 20 52 45 41 44 4f 4e 4c 59 20 66  E and READONLY f
1f370 6c 61 67 73 20 6d 75 73 74 20 62 65 20 73 65 74  lags must be set
1f380 2c 20 61 6e 64 20 0a 20 20 2a 2a 20 20 20 28 62  , and .  **   (b
1f390 29 20 69 66 20 43 52 45 41 54 45 20 69 73 20 73  ) if CREATE is s
1f3a0 65 74 2c 20 74 68 65 6e 20 52 45 41 44 57 52 49  et, then READWRI
1f3b0 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20  TE must also be 
1f3c0 73 65 74 2c 20 61 6e 64 0a 20 20 2a 2a 20 20 20  set, and.  **   
1f3d0 28 63 29 20 69 66 20 45 58 43 4c 55 53 49 56 45  (c) if EXCLUSIVE
1f3e0 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 43 52   is set, then CR
1f3f0 45 41 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 62  EATE must also b
1f400 65 20 73 65 74 2e 0a 20 20 2a 2a 20 20 20 28 64  e set..  **   (d
1f410 29 20 69 66 20 44 45 4c 45 54 45 4f 4e 43 4c 4f  ) if DELETEONCLO
1f420 53 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20  SE is set, then 
1f430 43 52 45 41 54 45 20 6d 75 73 74 20 61 6c 73 6f  CREATE must also
1f440 20 62 65 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20   be set..  */.  
1f450 61 73 73 65 72 74 28 28 69 73 52 65 61 64 6f 6e  assert((isReadon
1f460 6c 79 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64 57  ly==0 || isReadW
1f470 72 69 74 65 3d 3d 30 29 20 26 26 20 28 69 73 52  rite==0) && (isR
1f480 65 61 64 57 72 69 74 65 20 7c 7c 20 69 73 52 65  eadWrite || isRe
1f490 61 64 6f 6e 6c 79 29 29 3b 0a 20 20 61 73 73 65  adonly));.  asse
1f4a0 72 74 28 69 73 43 72 65 61 74 65 3d 3d 30 20 7c  rt(isCreate==0 |
1f4b0 7c 20 69 73 52 65 61 64 57 72 69 74 65 29 3b 0a  | isReadWrite);.
1f4c0 20 20 61 73 73 65 72 74 28 69 73 45 78 63 6c 75    assert(isExclu
1f4d0 73 69 76 65 3d 3d 30 20 7c 7c 20 69 73 43 72 65  sive==0 || isCre
1f4e0 61 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28 69  ate);.  assert(i
1f4f0 73 44 65 6c 65 74 65 3d 3d 30 20 7c 7c 20 69 73  sDelete==0 || is
1f500 43 72 65 61 74 65 29 3b 0a 0a 20 20 2f 2a 20 54  Create);..  /* T
1f510 68 65 20 6d 61 69 6e 20 44 42 2c 20 6d 61 69 6e  he main DB, main
1f520 20 6a 6f 75 72 6e 61 6c 2c 20 61 6e 64 20 6d 61   journal, and ma
1f530 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 72 65  ster journal are
1f540 20 6e 65 76 65 72 20 61 75 74 6f 6d 61 74 69 63   never automatic
1f550 61 6c 6c 79 0a 20 20 2a 2a 20 64 65 6c 65 74 65  ally.  ** delete
1f560 64 2e 20 4e 6f 72 20 61 72 65 20 74 68 65 79 20  d. Nor are they 
1f570 65 76 65 72 20 74 65 6d 70 6f 72 61 72 79 20 66  ever temporary f
1f580 69 6c 65 73 2e 20 20 2a 2f 0a 20 20 61 73 73 65  iles.  */.  asse
1f590 72 74 28 20 28 21 69 73 44 65 6c 65 74 65 20 26  rt( (!isDelete &
1f5a0 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70  & zName) || eTyp
1f5b0 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e!=SQLITE_OPEN_M
1f5c0 41 49 4e 5f 44 42 20 29 3b 0a 20 20 61 73 73 65  AIN_DB );.  asse
1f5d0 72 74 28 20 28 21 69 73 44 65 6c 65 74 65 20 26  rt( (!isDelete &
1f5e0 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70  & zName) || eTyp
1f5f0 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e!=SQLITE_OPEN_M
1f600 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20  AIN_JOURNAL );. 
1f610 20 61 73 73 65 72 74 28 20 28 21 69 73 44 65 6c   assert( (!isDel
1f620 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c  ete && zName) ||
1f630 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f   eType!=SQLITE_O
1f640 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e  PEN_MASTER_JOURN
1f650 41 4c 20 29 3b 0a 0a 20 20 2f 2a 20 41 73 73 65  AL );..  /* Asse
1f660 72 74 20 74 68 61 74 20 74 68 65 20 75 70 70 65  rt that the uppe
1f670 72 20 6c 61 79 65 72 20 68 61 73 20 73 65 74 20  r layer has set 
1f680 6f 6e 65 20 6f 66 20 74 68 65 20 22 66 69 6c 65  one of the "file
1f690 2d 74 79 70 65 22 20 66 6c 61 67 73 2e 20 2a 2f  -type" flags. */
1f6a0 0a 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65  .  assert( eType
1f6b0 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  ==SQLITE_OPEN_MA
1f6c0 49 4e 5f 44 42 20 20 20 20 20 20 7c 7c 20 65 54  IN_DB      || eT
1f6d0 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
1f6e0 5f 54 45 4d 50 5f 44 42 20 0a 20 20 20 20 20 20  _TEMP_DB .      
1f6f0 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
1f700 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
1f710 4e 41 4c 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51  NAL || eType==SQ
1f720 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a  LITE_OPEN_TEMP_J
1f730 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20 20 20 7c  OURNAL .       |
1f740 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
1f750 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 20  OPEN_SUBJOURNAL 
1f760 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49    || eType==SQLI
1f770 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a  TE_OPEN_MASTER_J
1f780 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20 20 20 7c  OURNAL .       |
1f790 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
1f7a0 4f 50 45 4e 5f 54 52 41 4e 53 49 45 4e 54 5f 44  OPEN_TRANSIENT_D
1f7b0 42 0a 20 20 29 3b 0a 0a 20 20 6d 65 6d 73 65 74  B.  );..  memset
1f7c0 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 75 6e  (p, 0, sizeof(un
1f7d0 69 78 46 69 6c 65 29 29 3b 0a 0a 20 20 69 66 28  ixFile));..  if(
1f7e0 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
1f7f0 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 29 7b 0a 20  PEN_MAIN_DB ){. 
1f800 20 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20     UnixUnusedFd 
1f810 2a 70 55 6e 75 73 65 64 3b 0a 20 20 20 20 70 55  *pUnused;.    pU
1f820 6e 75 73 65 64 20 3d 20 66 69 6e 64 52 65 75 73  nused = findReus
1f830 61 62 6c 65 46 64 28 7a 4e 61 6d 65 2c 20 66 6c  ableFd(zName, fl
1f840 61 67 73 29 3b 0a 20 20 20 20 69 66 28 20 70 55  ags);.    if( pU
1f850 6e 75 73 65 64 20 29 7b 0a 20 20 20 20 20 20 66  nused ){.      f
1f860 64 20 3d 20 70 55 6e 75 73 65 64 2d 3e 66 64 3b  d = pUnused->fd;
1f870 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1f880 20 20 70 55 6e 75 73 65 64 20 3d 20 73 71 6c 69    pUnused = sqli
1f890 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f  te3_malloc(sizeo
1f8a0 66 28 2a 70 55 6e 75 73 65 64 29 29 3b 0a 20 20  f(*pUnused));.  
1f8b0 20 20 20 20 69 66 28 20 21 70 55 6e 75 73 65 64      if( !pUnused
1f8c0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
1f8d0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
1f8e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1f8f0 20 20 20 70 2d 3e 70 55 6e 75 73 65 64 20 3d 20     p->pUnused = 
1f900 70 55 6e 75 73 65 64 3b 0a 20 20 7d 65 6c 73 65  pUnused;.  }else
1f910 20 69 66 28 20 21 7a 4e 61 6d 65 20 29 7b 0a 20   if( !zName ){. 
1f920 20 20 20 2f 2a 20 49 66 20 7a 4e 61 6d 65 20 69     /* If zName i
1f930 73 20 4e 55 4c 4c 2c 20 74 68 65 20 75 70 70 65  s NULL, the uppe
1f940 72 20 6c 61 79 65 72 20 69 73 20 72 65 71 75 65  r layer is reque
1f950 73 74 69 6e 67 20 61 20 74 65 6d 70 20 66 69 6c  sting a temp fil
1f960 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  e. */.    assert
1f970 28 69 73 44 65 6c 65 74 65 20 26 26 20 21 69 73  (isDelete && !is
1f980 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 29 3b 0a  OpenDirectory);.
1f990 20 20 20 20 72 63 20 3d 20 67 65 74 54 65 6d 70      rc = getTemp
1f9a0 6e 61 6d 65 28 4d 41 58 5f 50 41 54 48 4e 41 4d  name(MAX_PATHNAM
1f9b0 45 2b 31 2c 20 7a 54 6d 70 6e 61 6d 65 29 3b 0a  E+1, zTmpname);.
1f9c0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1f9d0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
1f9e0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
1f9f0 20 20 20 20 7a 4e 61 6d 65 20 3d 20 7a 54 6d 70      zName = zTmp
1fa00 6e 61 6d 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  name;.  }..  /* 
1fa10 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20 76 61  Determine the va
1fa20 6c 75 65 20 6f 66 20 74 68 65 20 66 6c 61 67 73  lue of the flags
1fa30 20 70 61 72 61 6d 65 74 65 72 20 70 61 73 73 65   parameter passe
1fa40 64 20 74 6f 20 50 4f 53 49 58 20 66 75 6e 63 74  d to POSIX funct
1fa50 69 6f 6e 0a 20 20 2a 2a 20 6f 70 65 6e 28 29 2e  ion.  ** open().
1fa60 20 54 68 65 73 65 20 6d 75 73 74 20 62 65 20 63   These must be c
1fa70 61 6c 63 75 6c 61 74 65 64 20 65 76 65 6e 20 69  alculated even i
1fa80 66 20 6f 70 65 6e 28 29 20 69 73 20 6e 6f 74 20  f open() is not 
1fa90 63 61 6c 6c 65 64 2c 20 61 73 0a 20 20 2a 2a 20  called, as.  ** 
1faa0 74 68 65 79 20 6d 61 79 20 62 65 20 73 74 6f 72  they may be stor
1fab0 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 74 68  ed as part of th
1fac0 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 61 6e  e file handle an
1fad0 64 20 75 73 65 64 20 62 79 20 74 68 65 20 0a 20  d used by the . 
1fae0 20 2a 2a 20 27 63 6f 6e 63 68 20 66 69 6c 65 27   ** 'conch file'
1faf0 20 6c 6f 63 6b 69 6e 67 20 66 75 6e 63 74 69 6f   locking functio
1fb00 6e 73 20 6c 61 74 65 72 20 6f 6e 2e 20 20 2a 2f  ns later on.  */
1fb10 0a 20 20 69 66 28 20 69 73 52 65 61 64 6f 6e 6c  .  if( isReadonl
1fb20 79 20 29 20 20 6f 70 65 6e 46 6c 61 67 73 20 7c  y )  openFlags |
1fb30 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20 20 69 66  = O_RDONLY;.  if
1fb40 28 20 69 73 52 65 61 64 57 72 69 74 65 20 29 20  ( isReadWrite ) 
1fb50 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f 52  openFlags |= O_R
1fb60 44 57 52 3b 0a 20 20 69 66 28 20 69 73 43 72 65  DWR;.  if( isCre
1fb70 61 74 65 20 29 20 20 20 20 6f 70 65 6e 46 6c 61  ate )    openFla
1fb80 67 73 20 7c 3d 20 4f 5f 43 52 45 41 54 3b 0a 20  gs |= O_CREAT;. 
1fb90 20 69 66 28 20 69 73 45 78 63 6c 75 73 69 76 65   if( isExclusive
1fba0 20 29 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20   ) openFlags |= 
1fbb0 28 4f 5f 45 58 43 4c 7c 4f 5f 4e 4f 46 4f 4c 4c  (O_EXCL|O_NOFOLL
1fbc0 4f 57 29 3b 0a 20 20 6f 70 65 6e 46 6c 61 67 73  OW);.  openFlags
1fbd0 20 7c 3d 20 28 4f 5f 4c 41 52 47 45 46 49 4c 45   |= (O_LARGEFILE
1fbe0 7c 4f 5f 42 49 4e 41 52 59 29 3b 0a 0a 20 20 69  |O_BINARY);..  i
1fbf0 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 6d  f( fd<0 ){.    m
1fc00 6f 64 65 5f 74 20 6f 70 65 6e 4d 6f 64 65 20 3d  ode_t openMode =
1fc10 20 28 69 73 44 65 6c 65 74 65 3f 30 36 30 30 3a   (isDelete?0600:
1fc20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46  SQLITE_DEFAULT_F
1fc30 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 29  ILE_PERMISSIONS)
1fc40 3b 0a 20 20 20 20 66 64 20 3d 20 6f 70 65 6e 28  ;.    fd = open(
1fc50 7a 4e 61 6d 65 2c 20 6f 70 65 6e 46 6c 61 67 73  zName, openFlags
1fc60 2c 20 6f 70 65 6e 4d 6f 64 65 29 3b 0a 20 20 20  , openMode);.   
1fc70 20 4f 53 54 52 41 43 45 34 28 22 4f 50 45 4e 58   OSTRACE4("OPENX
1fc80 20 20 20 25 2d 33 64 20 25 73 20 30 25 6f 5c 6e     %-3d %s 0%o\n
1fc90 22 2c 20 66 64 2c 20 7a 4e 61 6d 65 2c 20 6f 70  ", fd, zName, op
1fca0 65 6e 46 6c 61 67 73 29 3b 0a 20 20 20 20 69 66  enFlags);.    if
1fcb0 28 20 66 64 3c 30 20 26 26 20 65 72 72 6e 6f 21  ( fd<0 && errno!
1fcc0 3d 45 49 53 44 49 52 20 26 26 20 69 73 52 65 61  =EISDIR && isRea
1fcd0 64 57 72 69 74 65 20 26 26 20 21 69 73 45 78 63  dWrite && !isExc
1fce0 6c 75 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20  lusive ){.      
1fcf0 2f 2a 20 46 61 69 6c 65 64 20 74 6f 20 6f 70 65  /* Failed to ope
1fd00 6e 20 74 68 65 20 66 69 6c 65 20 66 6f 72 20 72  n the file for r
1fd10 65 61 64 2f 77 72 69 74 65 20 61 63 63 65 73 73  ead/write access
1fd20 2e 20 54 72 79 20 72 65 61 64 2d 6f 6e 6c 79 2e  . Try read-only.
1fd30 20 2a 2f 0a 20 20 20 20 20 20 66 6c 61 67 73 20   */.      flags 
1fd40 26 3d 20 7e 28 53 51 4c 49 54 45 5f 4f 50 45 4e  &= ~(SQLITE_OPEN
1fd50 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54  _READWRITE|SQLIT
1fd60 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a  E_OPEN_CREATE);.
1fd70 20 20 20 20 20 20 6f 70 65 6e 46 6c 61 67 73 20        openFlags 
1fd80 26 3d 20 7e 28 4f 5f 52 44 57 52 7c 4f 5f 43 52  &= ~(O_RDWR|O_CR
1fd90 45 41 54 29 3b 0a 20 20 20 20 20 20 66 6c 61 67  EAT);.      flag
1fda0 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e  s |= SQLITE_OPEN
1fdb0 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20  _READONLY;.     
1fdc0 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f   openFlags |= O_
1fdd0 52 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 66 64  RDONLY;.      fd
1fde0 20 3d 20 6f 70 65 6e 28 7a 4e 61 6d 65 2c 20 6f   = open(zName, o
1fdf0 70 65 6e 46 6c 61 67 73 2c 20 6f 70 65 6e 4d 6f  penFlags, openMo
1fe00 64 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  de);.    }.    i
1fe10 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 20  f( fd<0 ){.     
1fe20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e   rc = SQLITE_CAN
1fe30 54 4f 50 45 4e 3b 0a 20 20 20 20 20 20 67 6f 74  TOPEN;.      got
1fe40 6f 20 6f 70 65 6e 5f 66 69 6e 69 73 68 65 64 3b  o open_finished;
1fe50 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73  .    }.  }.  ass
1fe60 65 72 74 28 20 66 64 3e 3d 30 20 29 3b 0a 20 20  ert( fd>=0 );.  
1fe70 69 66 28 20 70 4f 75 74 46 6c 61 67 73 20 29 7b  if( pOutFlags ){
1fe80 0a 20 20 20 20 2a 70 4f 75 74 46 6c 61 67 73 20  .    *pOutFlags 
1fe90 3d 20 66 6c 61 67 73 3b 0a 20 20 7d 0a 0a 20 20  = flags;.  }..  
1fea0 69 66 28 20 70 2d 3e 70 55 6e 75 73 65 64 20 29  if( p->pUnused )
1feb0 7b 0a 20 20 20 20 70 2d 3e 70 55 6e 75 73 65 64  {.    p->pUnused
1fec0 2d 3e 66 64 20 3d 20 66 64 3b 0a 20 20 20 20 70  ->fd = fd;.    p
1fed0 2d 3e 70 55 6e 75 73 65 64 2d 3e 66 6c 61 67 73  ->pUnused->flags
1fee0 20 3d 20 66 6c 61 67 73 3b 0a 20 20 7d 0a 0a 20   = flags;.  }.. 
1fef0 20 69 66 28 20 69 73 44 65 6c 65 74 65 20 29 7b   if( isDelete ){
1ff00 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
1ff10 20 20 20 20 7a 50 61 74 68 20 3d 20 7a 4e 61 6d      zPath = zNam
1ff20 65 3b 0a 23 65 6c 73 65 0a 20 20 20 20 75 6e 6c  e;.#else.    unl
1ff30 69 6e 6b 28 7a 4e 61 6d 65 29 3b 0a 23 65 6e 64  ink(zName);.#end
1ff40 69 66 0a 20 20 7d 0a 23 69 66 20 53 51 4c 49 54  if.  }.#if SQLIT
1ff50 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
1ff60 5f 53 54 59 4c 45 0a 20 20 65 6c 73 65 7b 0a 20  _STYLE.  else{. 
1ff70 20 20 20 70 2d 3e 6f 70 65 6e 46 6c 61 67 73 20     p->openFlags 
1ff80 3d 20 6f 70 65 6e 46 6c 61 67 73 3b 0a 20 20 7d  = openFlags;.  }
1ff90 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 69  .#endif..  if( i
1ffa0 73 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 20 29  sOpenDirectory )
1ffb0 7b 0a 20 20 20 20 72 63 20 3d 20 6f 70 65 6e 44  {.    rc = openD
1ffc0 69 72 65 63 74 6f 72 79 28 7a 50 61 74 68 2c 20  irectory(zPath, 
1ffd0 26 64 69 72 66 64 29 3b 0a 20 20 20 20 69 66 28  &dirfd);.    if(
1ffe0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1fff0 7b 0a 20 20 20 20 20 20 2f 2a 20 49 74 20 69 73  {.      /* It is
20000 20 73 61 66 65 20 74 6f 20 63 6c 6f 73 65 20 66   safe to close f
20010 64 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2c  d at this point,
20020 20 62 65 63 61 75 73 65 20 69 74 20 69 73 20 67   because it is g
20030 75 61 72 61 6e 74 65 65 64 20 6e 6f 74 0a 20 20  uaranteed not.  
20040 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 6f 70 65      ** to be ope
20050 6e 20 6f 6e 20 61 20 64 61 74 61 62 61 73 65 20  n on a database 
20060 66 69 6c 65 2e 20 49 66 20 69 74 20 77 65 72 65  file. If it were
20070 20 6f 70 65 6e 20 6f 6e 20 61 20 64 61 74 61 62   open on a datab
20080 61 73 65 20 66 69 6c 65 2c 0a 20 20 20 20 20 20  ase file,.      
20090 2a 2a 20 69 74 20 77 6f 75 6c 64 20 6e 6f 74 20  ** it would not 
200a0 62 65 20 73 61 66 65 20 74 6f 20 63 6c 6f 73 65  be safe to close
200b0 20 61 73 20 74 68 69 73 20 77 6f 75 6c 64 20 72   as this would r
200c0 65 6c 65 61 73 65 20 61 6e 79 20 6c 6f 63 6b 73  elease any locks
200d0 20 68 65 6c 64 0a 20 20 20 20 20 20 2a 2a 20 6f   held.      ** o
200e0 6e 20 74 68 65 20 66 69 6c 65 20 62 79 20 74 68  n the file by th
200f0 69 73 20 70 72 6f 63 65 73 73 2e 20 20 2a 2f 0a  is process.  */.
20100 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65 54        assert( eT
20110 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype!=SQLITE_OPEN
20120 5f 4d 41 49 4e 5f 44 42 20 29 3b 0a 20 20 20 20  _MAIN_DB );.    
20130 20 20 63 6c 6f 73 65 28 66 64 29 3b 20 20 20 20    close(fd);    
20140 20 20 20 20 20 20 20 20 20 2f 2a 20 73 69 6c 65           /* sile
20150 6e 74 6c 79 20 6c 65 61 6b 20 69 66 20 66 61 69  ntly leak if fai
20160 6c 2c 20 61 6c 72 65 61 64 79 20 69 6e 20 65 72  l, already in er
20170 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20 67 6f 74  ror */.      got
20180 6f 20 6f 70 65 6e 5f 66 69 6e 69 73 68 65 64 3b  o open_finished;
20190 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 64  .    }.  }..#ifd
201a0 65 66 20 46 44 5f 43 4c 4f 45 58 45 43 0a 20 20  ef FD_CLOEXEC.  
201b0 66 63 6e 74 6c 28 66 64 2c 20 46 5f 53 45 54 46  fcntl(fd, F_SETF
201c0 44 2c 20 66 63 6e 74 6c 28 66 64 2c 20 46 5f 47  D, fcntl(fd, F_G
201d0 45 54 46 44 2c 20 30 29 20 7c 20 46 44 5f 43 4c  ETFD, 0) | FD_CL
201e0 4f 45 58 45 43 29 3b 0a 23 65 6e 64 69 66 0a 0a  OEXEC);.#endif..
201f0 20 20 6e 6f 4c 6f 63 6b 20 3d 20 65 54 79 70 65    noLock = eType
20200 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  !=SQLITE_OPEN_MA
20210 49 4e 5f 44 42 3b 0a 0a 23 69 66 20 53 51 4c 49  IN_DB;..#if SQLI
20220 54 45 5f 50 52 45 46 45 52 5f 50 52 4f 58 59 5f  TE_PREFER_PROXY_
20230 4c 4f 43 4b 49 4e 47 0a 20 20 69 66 28 20 7a 50  LOCKING.  if( zP
20240 61 74 68 21 3d 4e 55 4c 4c 20 26 26 20 21 6e 6f  ath!=NULL && !no
20250 4c 6f 63 6b 20 26 26 20 70 56 66 73 2d 3e 78 4f  Lock && pVfs->xO
20260 70 65 6e 20 29 7b 0a 20 20 20 20 63 68 61 72 20  pen ){.    char 
20270 2a 65 6e 76 66 6f 72 63 65 20 3d 20 67 65 74 65  *envforce = gete
20280 6e 76 28 22 53 51 4c 49 54 45 5f 46 4f 52 43 45  nv("SQLITE_FORCE
20290 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 22 29  _PROXY_LOCKING")
202a0 3b 0a 20 20 20 20 69 6e 74 20 75 73 65 50 72 6f  ;.    int usePro
202b0 78 79 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20  xy = 0;..    /* 
202c0 53 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52 4f  SQLITE_FORCE_PRO
202d0 58 59 5f 4c 4f 43 4b 49 4e 47 3d 3d 31 20 6d 65  XY_LOCKING==1 me
202e0 61 6e 73 20 66 6f 72 63 65 20 61 6c 77 61 79 73  ans force always
202f0 20 75 73 65 20 70 72 6f 78 79 2c 20 30 20 6d 65   use proxy, 0 me
20300 61 6e 73 20 0a 20 20 20 20 2a 2a 20 6e 65 76 65  ans .    ** neve
20310 72 20 75 73 65 20 70 72 6f 78 79 2c 20 4e 55 4c  r use proxy, NUL
20320 4c 20 6d 65 61 6e 73 20 75 73 65 20 70 72 6f 78  L means use prox
20330 79 20 66 6f 72 20 6e 6f 6e 2d 6c 6f 63 61 6c 20  y for non-local 
20340 66 69 6c 65 73 20 6f 6e 6c 79 2e 20 20 2a 2f 0a  files only.  */.
20350 20 20 20 20 69 66 28 20 65 6e 76 66 6f 72 63 65      if( envforce
20360 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20  !=NULL ){.      
20370 75 73 65 50 72 6f 78 79 20 3d 20 61 74 6f 69 28  useProxy = atoi(
20380 65 6e 76 66 6f 72 63 65 29 3e 30 3b 0a 20 20 20  envforce)>0;.   
20390 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 74   }else{.      st
203a0 72 75 63 74 20 73 74 61 74 66 73 20 66 73 49 6e  ruct statfs fsIn
203b0 66 6f 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74  fo;.      if( st
203c0 61 74 66 73 28 7a 50 61 74 68 2c 20 26 66 73 49  atfs(zPath, &fsI
203d0 6e 66 6f 29 20 3d 3d 20 2d 31 20 29 7b 0a 20 20  nfo) == -1 ){.  
203e0 20 20 20 20 20 20 2f 2a 20 49 6e 20 74 68 65 6f        /* In theo
203f0 72 79 2c 20 74 68 65 20 63 6c 6f 73 65 28 66 64  ry, the close(fd
20400 29 20 63 61 6c 6c 20 69 73 20 73 75 62 2d 6f 70  ) call is sub-op
20410 74 69 6d 61 6c 2e 20 49 66 20 74 68 65 20 66 69  timal. If the fi
20420 6c 65 20 6f 70 65 6e 65 64 0a 20 20 20 20 20 20  le opened.      
20430 20 20 2a 2a 20 77 69 74 68 20 66 64 20 69 73 20    ** with fd is 
20440 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  a database file,
20450 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 6f   and there are o
20460 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  ther connections
20470 20 6f 70 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a   open.        **
20480 20 6f 6e 20 74 68 61 74 20 66 69 6c 65 20 74 68   on that file th
20490 61 74 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79  at are currently
204a0 20 68 6f 6c 64 69 6e 67 20 61 64 76 69 73 6f 72   holding advisor
204b0 79 20 6c 6f 63 6b 73 20 6f 6e 20 69 74 2c 0a 20  y locks on it,. 
204c0 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74         ** then t
204d0 68 65 20 63 61 6c 6c 20 74 6f 20 63 6c 6f 73 65  he call to close
204e0 28 29 20 77 69 6c 6c 20 63 61 6e 63 65 6c 20 74  () will cancel t
204f0 68 6f 73 65 20 6c 6f 63 6b 73 2e 20 49 6e 20 70  hose locks. In p
20500 72 61 63 74 69 63 65 2c 0a 20 20 20 20 20 20 20  ractice,.       
20510 20 2a 2a 20 77 65 27 72 65 20 61 73 73 75 6d 69   ** we're assumi
20520 6e 67 20 74 68 61 74 20 73 74 61 74 66 73 28 29  ng that statfs()
20530 20 64 6f 65 73 6e 27 74 20 66 61 69 6c 20 76 65   doesn't fail ve
20540 72 79 20 6f 66 74 65 6e 2e 20 41 74 20 6c 65 61  ry often. At lea
20550 73 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f  st.        ** no
20560 74 20 77 68 69 6c 65 20 6f 74 68 65 72 20 66 69  t while other fi
20570 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 6f  le descriptors o
20580 70 65 6e 65 64 20 62 79 20 74 68 65 20 73 61 6d  pened by the sam
20590 65 20 70 72 6f 63 65 73 73 20 6f 6e 0a 20 20 20  e process on.   
205a0 20 20 20 20 20 2a 2a 20 74 68 65 20 73 61 6d 65       ** the same
205b0 20 66 69 6c 65 20 61 72 65 20 77 6f 72 6b 69 6e   file are workin
205c0 67 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  g.  */.        p
205d0 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72  ->lastErrno = er
205e0 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 69 66 28  rno;.        if(
205f0 20 64 69 72 66 64 3e 3d 30 20 29 7b 0a 20 20 20   dirfd>=0 ){.   
20600 20 20 20 20 20 20 20 63 6c 6f 73 65 28 64 69 72         close(dir
20610 66 64 29 3b 20 2f 2a 20 73 69 6c 65 6e 74 6c 79  fd); /* silently
20620 20 6c 65 61 6b 20 69 66 20 66 61 69 6c 2c 20 69   leak if fail, i
20630 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20  n error */.     
20640 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63 6c 6f     }.        clo
20650 73 65 28 66 64 29 3b 20 2f 2a 20 73 69 6c 65 6e  se(fd); /* silen
20660 74 6c 79 20 6c 65 61 6b 20 69 66 20 66 61 69 6c  tly leak if fail
20670 2c 20 69 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20  , in error */.  
20680 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
20690 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 3b 0a  E_IOERR_ACCESS;.
206a0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6f 70 65          goto ope
206b0 6e 5f 66 69 6e 69 73 68 65 64 3b 0a 20 20 20 20  n_finished;.    
206c0 20 20 7d 0a 20 20 20 20 20 20 75 73 65 50 72 6f    }.      usePro
206d0 78 79 20 3d 20 21 28 66 73 49 6e 66 6f 2e 66 5f  xy = !(fsInfo.f_
206e0 66 6c 61 67 73 26 4d 4e 54 5f 4c 4f 43 41 4c 29  flags&MNT_LOCAL)
206f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
20700 75 73 65 50 72 6f 78 79 20 29 7b 0a 20 20 20 20  useProxy ){.    
20710 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e 55 6e 69    rc = fillInUni
20720 78 46 69 6c 65 28 70 56 66 73 2c 20 66 64 2c 20  xFile(pVfs, fd, 
20730 64 69 72 66 64 2c 20 70 46 69 6c 65 2c 20 7a 50  dirfd, pFile, zP
20740 61 74 68 2c 20 6e 6f 4c 6f 63 6b 2c 20 69 73 44  ath, noLock, isD
20750 65 6c 65 74 65 29 3b 0a 20 20 20 20 20 20 69 66  elete);.      if
20760 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
20770 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
20780 70 72 6f 78 79 54 72 61 6e 73 66 6f 72 6d 55 6e  proxyTransformUn
20790 69 78 46 69 6c 65 28 28 75 6e 69 78 46 69 6c 65  ixFile((unixFile
207a0 2a 29 70 46 69 6c 65 2c 20 22 3a 61 75 74 6f 3a  *)pFile, ":auto:
207b0 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ");.      }.    
207c0 20 20 67 6f 74 6f 20 6f 70 65 6e 5f 66 69 6e 69    goto open_fini
207d0 73 68 65 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  shed;.    }.  }.
207e0 23 65 6e 64 69 66 0a 20 20 0a 20 20 72 63 20 3d  #endif.  .  rc =
207f0 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 28   fillInUnixFile(
20800 70 56 66 73 2c 20 66 64 2c 20 64 69 72 66 64 2c  pVfs, fd, dirfd,
20810 20 70 46 69 6c 65 2c 20 7a 50 61 74 68 2c 20 6e   pFile, zPath, n
20820 6f 4c 6f 63 6b 2c 20 69 73 44 65 6c 65 74 65 29  oLock, isDelete)
20830 3b 0a 6f 70 65 6e 5f 66 69 6e 69 73 68 65 64 3a  ;.open_finished:
20840 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
20850 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
20860 74 65 33 5f 66 72 65 65 28 70 2d 3e 70 55 6e 75  te3_free(p->pUnu
20870 73 65 64 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  sed);.  }.  retu
20880 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
20890 20 44 65 6c 65 74 65 20 74 68 65 20 66 69 6c 65   Delete the file
208a0 20 61 74 20 7a 50 61 74 68 2e 20 49 66 20 74 68   at zPath. If th
208b0 65 20 64 69 72 53 79 6e 63 20 61 72 67 75 6d 65  e dirSync argume
208c0 6e 74 20 69 73 20 74 72 75 65 2c 20 66 73 79 6e  nt is true, fsyn
208d0 63 28 29 0a 2a 2a 20 74 68 65 20 64 69 72 65 63  c().** the direc
208e0 74 6f 72 79 20 61 66 74 65 72 20 64 65 6c 65 74  tory after delet
208f0 69 6e 67 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2f  ing the file..*/
20900 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
20910 44 65 6c 65 74 65 28 0a 20 20 73 71 6c 69 74 65  Delete(.  sqlite
20920 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20  3_vfs *NotUsed, 
20930 20 20 20 20 2f 2a 20 56 46 53 20 63 6f 6e 74 61      /* VFS conta
20940 69 6e 69 6e 67 20 74 68 69 73 20 61 73 20 74 68  ining this as th
20950 65 20 78 44 65 6c 65 74 65 20 6d 65 74 68 6f 64  e xDelete method
20960 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
20970 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20   *zPath,        
20980 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69 6c 65 20  /* Name of file 
20990 74 6f 20 62 65 20 64 65 6c 65 74 65 64 20 2a 2f  to be deleted */
209a0 0a 20 20 69 6e 74 20 64 69 72 53 79 6e 63 20 20  .  int dirSync  
209b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
209c0 49 66 20 74 72 75 65 2c 20 66 73 79 6e 63 28 29  If true, fsync()
209d0 20 64 69 72 65 63 74 6f 72 79 20 61 66 74 65 72   directory after
209e0 20 64 65 6c 65 74 69 6e 67 20 66 69 6c 65 20 2a   deleting file *
209f0 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
20a00 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 55 4e 55  SQLITE_OK;.  UNU
20a10 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
20a20 74 55 73 65 64 29 3b 0a 20 20 53 69 6d 75 6c 61  tUsed);.  Simula
20a30 74 65 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e  teIOError(return
20a40 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45   SQLITE_IOERR_DE
20a50 4c 45 54 45 29 3b 0a 20 20 75 6e 6c 69 6e 6b 28  LETE);.  unlink(
20a60 7a 50 61 74 68 29 3b 0a 23 69 66 6e 64 65 66 20  zPath);.#ifndef 
20a70 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 44  SQLITE_DISABLE_D
20a80 49 52 53 59 4e 43 0a 20 20 69 66 28 20 64 69 72  IRSYNC.  if( dir
20a90 53 79 6e 63 20 29 7b 0a 20 20 20 20 69 6e 74 20  Sync ){.    int 
20aa0 66 64 3b 0a 20 20 20 20 72 63 20 3d 20 6f 70 65  fd;.    rc = ope
20ab0 6e 44 69 72 65 63 74 6f 72 79 28 7a 50 61 74 68  nDirectory(zPath
20ac0 2c 20 26 66 64 29 3b 0a 20 20 20 20 69 66 28 20  , &fd);.    if( 
20ad0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
20ae0 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
20af0 20 20 20 20 20 20 69 66 28 20 66 73 79 6e 63 28        if( fsync(
20b00 66 64 29 3d 3d 2d 31 20 29 0a 23 65 6c 73 65 0a  fd)==-1 ).#else.
20b10 20 20 20 20 20 20 69 66 28 20 66 73 79 6e 63 28        if( fsync(
20b20 66 64 29 20 29 0a 23 65 6e 64 69 66 0a 20 20 20  fd) ).#endif.   
20b30 20 20 20 7b 0a 20 20 20 20 20 20 20 20 72 63 20     {.        rc 
20b40 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44  = SQLITE_IOERR_D
20b50 49 52 5f 46 53 59 4e 43 3b 0a 20 20 20 20 20 20  IR_FSYNC;.      
20b60 7d 0a 20 20 20 20 20 20 69 66 28 20 63 6c 6f 73  }.      if( clos
20b70 65 28 66 64 29 26 26 21 72 63 20 29 7b 0a 20 20  e(fd)&&!rc ){.  
20b80 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
20b90 45 5f 49 4f 45 52 52 5f 44 49 52 5f 43 4c 4f 53  E_IOERR_DIR_CLOS
20ba0 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  E;.      }.    }
20bb0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65  .  }.#endif.  re
20bc0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
20bd0 2a 20 54 65 73 74 20 74 68 65 20 65 78 69 73 74  * Test the exist
20be0 61 6e 63 65 20 6f 66 20 6f 72 20 61 63 63 65 73  ance of or acces
20bf0 73 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 6f 66  s permissions of
20c00 20 66 69 6c 65 20 7a 50 61 74 68 2e 20 54 68 65   file zPath. The
20c10 0a 2a 2a 20 74 65 73 74 20 70 65 72 66 6f 72 6d  .** test perform
20c20 65 64 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 68  ed depends on th
20c30 65 20 76 61 6c 75 65 20 6f 66 20 66 6c 61 67 73  e value of flags
20c40 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 51 4c 49  :.**.**     SQLI
20c50 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53  TE_ACCESS_EXISTS
20c60 3a 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68  : Return 1 if th
20c70 65 20 66 69 6c 65 20 65 78 69 73 74 73 0a 2a 2a  e file exists.**
20c80 20 20 20 20 20 53 51 4c 49 54 45 5f 41 43 43 45       SQLITE_ACCE
20c90 53 53 5f 52 45 41 44 57 52 49 54 45 3a 20 52 65  SS_READWRITE: Re
20ca0 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 66 69  turn 1 if the fi
20cb0 6c 65 20 69 73 20 72 65 61 64 20 61 6e 64 20 77  le is read and w
20cc0 72 69 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 20  ritable..**     
20cd0 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45  SQLITE_ACCESS_RE
20ce0 41 44 4f 4e 4c 59 3a 20 52 65 74 75 72 6e 20 31  ADONLY: Return 1
20cf0 20 69 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   if the file is 
20d00 72 65 61 64 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  readable..**.** 
20d10 4f 74 68 65 72 77 69 73 65 20 72 65 74 75 72 6e  Otherwise return
20d20 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e   0..*/.static in
20d30 74 20 75 6e 69 78 41 63 63 65 73 73 28 0a 20 20  t unixAccess(.  
20d40 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74  sqlite3_vfs *Not
20d50 55 73 65 64 2c 20 20 20 2f 2a 20 54 68 65 20 56  Used,   /* The V
20d60 46 53 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  FS containing th
20d70 69 73 20 78 41 63 63 65 73 73 20 6d 65 74 68 6f  is xAccess metho
20d80 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  d */.  const cha
20d90 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 2f  r *zPath,      /
20da0 2a 20 50 61 74 68 20 6f 66 20 74 68 65 20 66 69  * Path of the fi
20db0 6c 65 20 74 6f 20 65 78 61 6d 69 6e 65 20 2a 2f  le to examine */
20dc0 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20  .  int flags,   
20dd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68             /* Wh
20de0 61 74 20 64 6f 20 77 65 20 77 61 6e 74 20 74 6f  at do we want to
20df0 20 6c 65 61 72 6e 20 61 62 6f 75 74 20 74 68 65   learn about the
20e00 20 7a 50 61 74 68 20 66 69 6c 65 3f 20 2a 2f 0a   zPath file? */.
20e10 20 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 20 20    int *pResOut  
20e20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
20e30 74 65 20 72 65 73 75 6c 74 20 62 6f 6f 6c 65 61  te result boolea
20e40 6e 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  n here */.){.  i
20e50 6e 74 20 61 6d 6f 64 65 20 3d 20 30 3b 0a 20 20  nt amode = 0;.  
20e60 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
20e70 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 53 69 6d  (NotUsed);.  Sim
20e80 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65  ulateIOError( re
20e90 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
20ea0 52 5f 41 43 43 45 53 53 3b 20 29 3b 0a 20 20 73  R_ACCESS; );.  s
20eb0 77 69 74 63 68 28 20 66 6c 61 67 73 20 29 7b 0a  witch( flags ){.
20ec0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
20ed0 41 43 43 45 53 53 5f 45 58 49 53 54 53 3a 0a 20  ACCESS_EXISTS:. 
20ee0 20 20 20 20 20 61 6d 6f 64 65 20 3d 20 46 5f 4f       amode = F_O
20ef0 4b 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  K;.      break;.
20f00 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
20f10 41 43 43 45 53 53 5f 52 45 41 44 57 52 49 54 45  ACCESS_READWRITE
20f20 3a 0a 20 20 20 20 20 20 61 6d 6f 64 65 20 3d 20  :.      amode = 
20f30 57 5f 4f 4b 7c 52 5f 4f 4b 3b 0a 20 20 20 20 20  W_OK|R_OK;.     
20f40 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
20f50 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52   SQLITE_ACCESS_R
20f60 45 41 44 3a 0a 20 20 20 20 20 20 61 6d 6f 64 65  EAD:.      amode
20f70 20 3d 20 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 62   = R_OK;.      b
20f80 72 65 61 6b 3b 0a 0a 20 20 20 20 64 65 66 61 75  reak;..    defau
20f90 6c 74 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74  lt:.      assert
20fa0 28 21 22 49 6e 76 61 6c 69 64 20 66 6c 61 67 73  (!"Invalid flags
20fb0 20 61 72 67 75 6d 65 6e 74 22 29 3b 0a 20 20 7d   argument");.  }
20fc0 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 28 61  .  *pResOut = (a
20fd0 63 63 65 73 73 28 7a 50 61 74 68 2c 20 61 6d 6f  ccess(zPath, amo
20fe0 64 65 29 3d 3d 30 29 3b 0a 20 20 72 65 74 75 72  de)==0);.  retur
20ff0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
21000 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20 61 20 72 65  ./*.** Turn a re
21010 6c 61 74 69 76 65 20 70 61 74 68 6e 61 6d 65 20  lative pathname 
21020 69 6e 74 6f 20 61 20 66 75 6c 6c 20 70 61 74 68  into a full path
21030 6e 61 6d 65 2e 20 54 68 65 20 72 65 6c 61 74 69  name. The relati
21040 76 65 20 70 61 74 68 0a 2a 2a 20 69 73 20 73 74  ve path.** is st
21050 6f 72 65 64 20 61 73 20 61 20 6e 75 6c 2d 74 65  ored as a nul-te
21060 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67 20  rminated string 
21070 69 6e 20 74 68 65 20 62 75 66 66 65 72 20 70 6f  in the buffer po
21080 69 6e 74 65 64 20 74 6f 20 62 79 0a 2a 2a 20 7a  inted to by.** z
21090 50 61 74 68 2e 20 0a 2a 2a 0a 2a 2a 20 7a 4f 75  Path. .**.** zOu
210a0 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 62 75  t points to a bu
210b0 66 66 65 72 20 6f 66 20 61 74 20 6c 65 61 73 74  ffer of at least
210c0 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 6d 78 50   sqlite3_vfs.mxP
210d0 61 74 68 6e 61 6d 65 20 62 79 74 65 73 20 0a 2a  athname bytes .*
210e0 2a 20 28 69 6e 20 74 68 69 73 20 63 61 73 65 2c  * (in this case,
210f0 20 4d 41 58 5f 50 41 54 48 4e 41 4d 45 20 62 79   MAX_PATHNAME by
21100 74 65 73 29 2e 20 54 68 65 20 66 75 6c 6c 2d 70  tes). The full-p
21110 61 74 68 20 69 73 20 77 72 69 74 74 65 6e 20 74  ath is written t
21120 6f 0a 2a 2a 20 74 68 69 73 20 62 75 66 66 65 72  o.** this buffer
21130 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
21140 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
21150 20 75 6e 69 78 46 75 6c 6c 50 61 74 68 6e 61 6d   unixFullPathnam
21160 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  e(.  sqlite3_vfs
21170 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20 20   *pVfs,         
21180 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
21190 20 76 66 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20   vfs object */. 
211a0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
211b0 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  th,            /
211c0 2a 20 50 6f 73 73 69 62 6c 79 20 72 65 6c 61 74  * Possibly relat
211d0 69 76 65 20 69 6e 70 75 74 20 70 61 74 68 20 2a  ive input path *
211e0 2f 0a 20 20 69 6e 74 20 6e 4f 75 74 2c 20 20 20  /.  int nOut,   
211f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21200 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6f 75 74    /* Size of out
21210 70 75 74 20 62 75 66 66 65 72 20 69 6e 20 62 79  put buffer in by
21220 74 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  tes */.  char *z
21230 4f 75 74 20 20 20 20 20 20 20 20 20 20 20 20 20  Out             
21240 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74         /* Output
21250 20 62 75 66 66 65 72 20 2a 2f 0a 29 7b 0a 0a 20   buffer */.){.. 
21260 20 2f 2a 20 49 74 27 73 20 6f 64 64 20 74 6f 20   /* It's odd to 
21270 73 69 6d 75 6c 61 74 65 20 61 6e 20 69 6f 2d 65  simulate an io-e
21280 72 72 6f 72 20 68 65 72 65 2c 20 62 75 74 20 72  rror here, but r
21290 65 61 6c 6c 79 20 74 68 69 73 20 69 73 20 6a 75  eally this is ju
212a0 73 74 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74 68  st.  ** using th
212b0 65 20 69 6f 2d 65 72 72 6f 72 20 69 6e 66 72 61  e io-error infra
212c0 73 74 72 75 63 74 75 72 65 20 74 6f 20 74 65 73  structure to tes
212d0 74 20 74 68 61 74 20 53 51 4c 69 74 65 20 68 61  t that SQLite ha
212e0 6e 64 6c 65 73 20 74 68 69 73 0a 20 20 2a 2a 20  ndles this.  ** 
212f0 66 75 6e 63 74 69 6f 6e 20 66 61 69 6c 69 6e 67  function failing
21300 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
21310 63 6f 75 6c 64 20 66 61 69 6c 20 69 66 2c 20 66  could fail if, f
21320 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 0a  or example, the.
21330 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 77 6f 72    ** current wor
21340 6b 69 6e 67 20 64 69 72 65 63 74 6f 72 79 20 68  king directory h
21350 61 73 20 62 65 65 6e 20 75 6e 6c 69 6e 6b 65 64  as been unlinked
21360 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74  ..  */.  Simulat
21370 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
21380 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b   SQLITE_ERROR );
21390 0a 0a 20 20 61 73 73 65 72 74 28 20 70 56 66 73  ..  assert( pVfs
213a0 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 3d 3d 4d 41  ->mxPathname==MA
213b0 58 5f 50 41 54 48 4e 41 4d 45 20 29 3b 0a 20 20  X_PATHNAME );.  
213c0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
213d0 28 70 56 66 73 29 3b 0a 0a 20 20 7a 4f 75 74 5b  (pVfs);..  zOut[
213e0 6e 4f 75 74 2d 31 5d 20 3d 20 27 5c 30 27 3b 0a  nOut-1] = '\0';.
213f0 20 20 69 66 28 20 7a 50 61 74 68 5b 30 5d 3d 3d    if( zPath[0]==
21400 27 2f 27 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  '/' ){.    sqlit
21410 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4f 75 74  e3_snprintf(nOut
21420 2c 20 7a 4f 75 74 2c 20 22 25 73 22 2c 20 7a 50  , zOut, "%s", zP
21430 61 74 68 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ath);.  }else{. 
21440 20 20 20 69 6e 74 20 6e 43 77 64 3b 0a 20 20 20     int nCwd;.   
21450 20 69 66 28 20 67 65 74 63 77 64 28 7a 4f 75 74   if( getcwd(zOut
21460 2c 20 6e 4f 75 74 2d 31 29 3d 3d 30 20 29 7b 0a  , nOut-1)==0 ){.
21470 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
21480 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20  ITE_CANTOPEN;.  
21490 20 20 7d 0a 20 20 20 20 6e 43 77 64 20 3d 20 28    }.    nCwd = (
214a0 69 6e 74 29 73 74 72 6c 65 6e 28 7a 4f 75 74 29  int)strlen(zOut)
214b0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  ;.    sqlite3_sn
214c0 70 72 69 6e 74 66 28 6e 4f 75 74 2d 6e 43 77 64  printf(nOut-nCwd
214d0 2c 20 26 7a 4f 75 74 5b 6e 43 77 64 5d 2c 20 22  , &zOut[nCwd], "
214e0 2f 25 73 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20  /%s", zPath);.  
214f0 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
21500 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65  E_OK;.}...#ifnde
21510 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f  f SQLITE_OMIT_LO
21520 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 2f 2a 0a  AD_EXTENSION./*.
21530 2a 2a 20 49 6e 74 65 72 66 61 63 65 73 20 66 6f  ** Interfaces fo
21540 72 20 6f 70 65 6e 69 6e 67 20 61 20 73 68 61 72  r opening a shar
21550 65 64 20 6c 69 62 72 61 72 79 2c 20 66 69 6e 64  ed library, find
21560 69 6e 67 20 65 6e 74 72 79 20 70 6f 69 6e 74 73  ing entry points
21570 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20 73  .** within the s
21580 68 61 72 65 64 20 6c 69 62 72 61 72 79 2c 20 61  hared library, a
21590 6e 64 20 63 6c 6f 73 69 6e 67 20 74 68 65 20 73  nd closing the s
215a0 68 61 72 65 64 20 6c 69 62 72 61 72 79 2e 0a 2a  hared library..*
215b0 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 64 6c 66 63  /.#include <dlfc
215c0 6e 2e 68 3e 0a 73 74 61 74 69 63 20 76 6f 69 64  n.h>.static void
215d0 20 2a 75 6e 69 78 44 6c 4f 70 65 6e 28 73 71 6c   *unixDlOpen(sql
215e0 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65  ite3_vfs *NotUse
215f0 64 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  d, const char *z
21600 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 55 4e 55  Filename){.  UNU
21610 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
21620 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e  tUsed);.  return
21630 20 64 6c 6f 70 65 6e 28 7a 46 69 6c 65 6e 61 6d   dlopen(zFilenam
21640 65 2c 20 52 54 4c 44 5f 4e 4f 57 20 7c 20 52 54  e, RTLD_NOW | RT
21650 4c 44 5f 47 4c 4f 42 41 4c 29 3b 0a 7d 0a 0a 2f  LD_GLOBAL);.}../
21660 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 63 61 6c 6c  *.** SQLite call
21670 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  s this function 
21680 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65  immediately afte
21690 72 20 61 20 63 61 6c 6c 20 74 6f 20 75 6e 69 78  r a call to unix
216a0 44 6c 53 79 6d 28 29 20 6f 72 0a 2a 2a 20 75 6e  DlSym() or.** un
216b0 69 78 44 6c 4f 70 65 6e 28 29 20 66 61 69 6c 73  ixDlOpen() fails
216c0 20 28 72 65 74 75 72 6e 73 20 61 20 6e 75 6c 6c   (returns a null
216d0 20 70 6f 69 6e 74 65 72 29 2e 20 49 66 20 61 20   pointer). If a 
216e0 6d 6f 72 65 20 64 65 74 61 69 6c 65 64 20 65 72  more detailed er
216f0 72 6f 72 0a 2a 2a 20 6d 65 73 73 61 67 65 20 69  ror.** message i
21700 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 69 74 20  s available, it 
21710 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 7a 42  is written to zB
21720 75 66 4f 75 74 2e 20 49 66 20 6e 6f 20 65 72 72  ufOut. If no err
21730 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20 69 73  or message.** is
21740 20 61 76 61 69 6c 61 62 6c 65 2c 20 7a 42 75 66   available, zBuf
21750 4f 75 74 20 69 73 20 6c 65 66 74 20 75 6e 6d 6f  Out is left unmo
21760 64 69 66 69 65 64 20 61 6e 64 20 53 51 4c 69 74  dified and SQLit
21770 65 20 75 73 65 73 20 61 20 64 65 66 61 75 6c 74  e uses a default
21780 0a 2a 2a 20 65 72 72 6f 72 20 6d 65 73 73 61 67  .** error messag
21790 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
217a0 64 20 75 6e 69 78 44 6c 45 72 72 6f 72 28 73 71  d unixDlError(sq
217b0 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73  lite3_vfs *NotUs
217c0 65 64 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68  ed, int nBuf, ch
217d0 61 72 20 2a 7a 42 75 66 4f 75 74 29 7b 0a 20 20  ar *zBufOut){.  
217e0 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20 20 55 4e  char *zErr;.  UN
217f0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
21800 6f 74 55 73 65 64 29 3b 0a 20 20 75 6e 69 78 45  otUsed);.  unixE
21810 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 7a  nterMutex();.  z
21820 45 72 72 20 3d 20 64 6c 65 72 72 6f 72 28 29 3b  Err = dlerror();
21830 0a 20 20 69 66 28 20 7a 45 72 72 20 29 7b 0a 20  .  if( zErr ){. 
21840 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
21850 6e 74 66 28 6e 42 75 66 2c 20 7a 42 75 66 4f 75  ntf(nBuf, zBufOu
21860 74 2c 20 22 25 73 22 2c 20 7a 45 72 72 29 3b 0a  t, "%s", zErr);.
21870 20 20 7d 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d    }.  unixLeaveM
21880 75 74 65 78 28 29 3b 0a 7d 0a 73 74 61 74 69 63  utex();.}.static
21890 20 76 6f 69 64 20 28 2a 75 6e 69 78 44 6c 53 79   void (*unixDlSy
218a0 6d 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e  m(sqlite3_vfs *N
218b0 6f 74 55 73 65 64 2c 20 76 6f 69 64 20 2a 70 2c  otUsed, void *p,
218c0 20 63 6f 6e 73 74 20 63 68 61 72 2a 7a 53 79 6d   const char*zSym
218d0 29 29 28 76 6f 69 64 29 7b 0a 20 20 2f 2a 20 0a  ))(void){.  /* .
218e0 20 20 2a 2a 20 47 43 43 20 77 69 74 68 20 2d 70    ** GCC with -p
218f0 65 64 61 6e 74 69 63 2d 65 72 72 6f 72 73 20 73  edantic-errors s
21900 61 79 73 20 74 68 61 74 20 43 39 30 20 64 6f 65  ays that C90 doe
21910 73 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 20 76 6f  s not allow a vo
21920 69 64 2a 20 74 6f 20 62 65 0a 20 20 2a 2a 20 63  id* to be.  ** c
21930 61 73 74 20 69 6e 74 6f 20 61 20 70 6f 69 6e 74  ast into a point
21940 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e  er to a function
21950 2e 20 20 41 6e 64 20 79 65 74 20 74 68 65 20 6c  .  And yet the l
21960 69 62 72 61 72 79 20 64 6c 73 79 6d 28 29 20 72  ibrary dlsym() r
21970 6f 75 74 69 6e 65 0a 20 20 2a 2a 20 72 65 74 75  outine.  ** retu
21980 72 6e 73 20 61 20 76 6f 69 64 2a 20 77 68 69 63  rns a void* whic
21990 68 20 69 73 20 72 65 61 6c 6c 79 20 61 20 70 6f  h is really a po
219a0 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74  inter to a funct
219b0 69 6f 6e 2e 20 20 53 6f 20 68 6f 77 20 64 6f 20  ion.  So how do 
219c0 77 65 0a 20 20 2a 2a 20 75 73 65 20 64 6c 73 79  we.  ** use dlsy
219d0 6d 28 29 20 77 69 74 68 20 2d 70 65 64 61 6e 74  m() with -pedant
219e0 69 63 2d 65 72 72 6f 72 73 3f 0a 20 20 2a 2a 0a  ic-errors?.  **.
219f0 20 20 2a 2a 20 56 61 72 69 61 62 6c 65 20 78 20    ** Variable x 
21a00 62 65 6c 6f 77 20 69 73 20 64 65 66 69 6e 65 64  below is defined
21a10 20 74 6f 20 62 65 20 61 20 70 6f 69 6e 74 65 72   to be a pointer
21a20 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 74   to a function t
21a30 61 6b 69 6e 67 0a 20 20 2a 2a 20 70 61 72 61 6d  aking.  ** param
21a40 65 74 65 72 73 20 76 6f 69 64 2a 20 61 6e 64 20  eters void* and 
21a50 63 6f 6e 73 74 20 63 68 61 72 2a 20 61 6e 64 20  const char* and 
21a60 72 65 74 75 72 6e 69 6e 67 20 61 20 70 6f 69 6e  returning a poin
21a70 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f  ter to a functio
21a80 6e 2e 0a 20 20 2a 2a 20 57 65 20 69 6e 69 74 69  n..  ** We initi
21a90 61 6c 69 7a 65 20 78 20 62 79 20 61 73 73 69 67  alize x by assig
21aa0 6e 69 6e 67 20 69 74 20 61 20 70 6f 69 6e 74 65  ning it a pointe
21ab0 72 20 74 6f 20 74 68 65 20 64 6c 73 79 6d 28 29  r to the dlsym()
21ac0 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20   function..  ** 
21ad0 28 54 68 61 74 20 61 73 73 69 67 6e 6d 65 6e 74  (That assignment
21ae0 20 72 65 71 75 69 72 65 73 20 61 20 63 61 73 74   requires a cast
21af0 2e 29 20 20 54 68 65 6e 20 77 65 20 63 61 6c 6c  .)  Then we call
21b00 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 74 68   the function th
21b10 61 74 0a 20 20 2a 2a 20 78 20 70 6f 69 6e 74 73  at.  ** x points
21b20 20 74 6f 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a   to.  .  **.  **
21b30 20 54 68 69 73 20 77 6f 72 6b 2d 61 72 6f 75 6e   This work-aroun
21b40 64 20 69 73 20 75 6e 6c 69 6b 65 6c 79 20 74 6f  d is unlikely to
21b50 20 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79 20   work correctly 
21b60 6f 6e 20 61 6e 79 20 73 79 73 74 65 6d 20 77 68  on any system wh
21b70 65 72 65 0a 20 20 2a 2a 20 79 6f 75 20 72 65 61  ere.  ** you rea
21b80 6c 6c 79 20 63 61 6e 6e 6f 74 20 63 61 73 74 20  lly cannot cast 
21b90 61 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74  a function point
21ba0 65 72 20 69 6e 74 6f 20 76 6f 69 64 2a 2e 20 20  er into void*.  
21bb0 42 75 74 20 74 68 65 6e 2c 20 6f 6e 20 74 68 65  But then, on the
21bc0 0a 20 20 2a 2a 20 6f 74 68 65 72 20 68 61 6e 64  .  ** other hand
21bd0 2c 20 64 6c 73 79 6d 28 29 20 77 69 6c 6c 20 6e  , dlsym() will n
21be0 6f 74 20 77 6f 72 6b 20 6f 6e 20 73 75 63 68 20  ot work on such 
21bf0 61 20 73 79 73 74 65 6d 20 65 69 74 68 65 72 2c  a system either,
21c00 20 73 6f 20 77 65 20 68 61 76 65 0a 20 20 2a 2a   so we have.  **
21c10 20 6e 6f 74 20 72 65 61 6c 6c 79 20 6c 6f 73 74   not really lost
21c20 20 61 6e 79 74 68 69 6e 67 2e 0a 20 20 2a 2f 0a   anything..  */.
21c30 20 20 76 6f 69 64 20 28 2a 28 2a 78 29 28 76 6f    void (*(*x)(vo
21c40 69 64 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29  id*,const char*)
21c50 29 28 76 6f 69 64 29 3b 0a 20 20 55 4e 55 53 45  )(void);.  UNUSE
21c60 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
21c70 73 65 64 29 3b 0a 20 20 78 20 3d 20 28 76 6f 69  sed);.  x = (voi
21c80 64 28 2a 28 2a 29 28 76 6f 69 64 2a 2c 63 6f 6e  d(*(*)(void*,con
21c90 73 74 20 63 68 61 72 2a 29 29 28 76 6f 69 64 29  st char*))(void)
21ca0 29 64 6c 73 79 6d 3b 0a 20 20 72 65 74 75 72 6e  )dlsym;.  return
21cb0 20 28 2a 78 29 28 70 2c 20 7a 53 79 6d 29 3b 0a   (*x)(p, zSym);.
21cc0 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e  }.static void un
21cd0 69 78 44 6c 43 6c 6f 73 65 28 73 71 6c 69 74 65  ixDlClose(sqlite
21ce0 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20  3_vfs *NotUsed, 
21cf0 76 6f 69 64 20 2a 70 48 61 6e 64 6c 65 29 7b 0a  void *pHandle){.
21d00 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
21d10 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 64  ER(NotUsed);.  d
21d20 6c 63 6c 6f 73 65 28 70 48 61 6e 64 6c 65 29 3b  lclose(pHandle);
21d30 0a 7d 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 53  .}.#else /* if S
21d40 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f  QLITE_OMIT_LOAD_
21d50 45 58 54 45 4e 53 49 4f 4e 20 69 73 20 64 65 66  EXTENSION is def
21d60 69 6e 65 64 3a 20 2a 2f 0a 20 20 23 64 65 66 69  ined: */.  #defi
21d70 6e 65 20 75 6e 69 78 44 6c 4f 70 65 6e 20 20 30  ne unixDlOpen  0
21d80 0a 20 20 23 64 65 66 69 6e 65 20 75 6e 69 78 44  .  #define unixD
21d90 6c 45 72 72 6f 72 20 30 0a 20 20 23 64 65 66 69  lError 0.  #defi
21da0 6e 65 20 75 6e 69 78 44 6c 53 79 6d 20 20 20 30  ne unixDlSym   0
21db0 0a 20 20 23 64 65 66 69 6e 65 20 75 6e 69 78 44  .  #define unixD
21dc0 6c 43 6c 6f 73 65 20 30 0a 23 65 6e 64 69 66 0a  lClose 0.#endif.
21dd0 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 6e 42 75  ./*.** Write nBu
21de0 66 20 62 79 74 65 73 20 6f 66 20 72 61 6e 64 6f  f bytes of rando
21df0 6d 20 64 61 74 61 20 74 6f 20 74 68 65 20 73 75  m data to the su
21e00 70 70 6c 69 65 64 20 62 75 66 66 65 72 20 7a 42  pplied buffer zB
21e10 75 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  uf..*/.static in
21e20 74 20 75 6e 69 78 52 61 6e 64 6f 6d 6e 65 73 73  t unixRandomness
21e30 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f  (sqlite3_vfs *No
21e40 74 55 73 65 64 2c 20 69 6e 74 20 6e 42 75 66 2c  tUsed, int nBuf,
21e50 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20   char *zBuf){.  
21e60 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
21e70 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 61 73 73  (NotUsed);.  ass
21e80 65 72 74 28 28 73 69 7a 65 5f 74 29 6e 42 75 66  ert((size_t)nBuf
21e90 3e 3d 28 73 69 7a 65 6f 66 28 74 69 6d 65 5f 74  >=(sizeof(time_t
21ea0 29 2b 73 69 7a 65 6f 66 28 69 6e 74 29 29 29 3b  )+sizeof(int)));
21eb0 0a 0a 20 20 2f 2a 20 57 65 20 68 61 76 65 20 74  ..  /* We have t
21ec0 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 7a 42 75  o initialize zBu
21ed0 66 20 74 6f 20 70 72 65 76 65 6e 74 20 76 61 6c  f to prevent val
21ee0 67 72 69 6e 64 20 66 72 6f 6d 20 72 65 70 6f 72  grind from repor
21ef0 74 69 6e 67 0a 20 20 2a 2a 20 65 72 72 6f 72 73  ting.  ** errors
21f00 2e 20 20 54 68 65 20 72 65 70 6f 72 74 73 20 69  .  The reports i
21f10 73 73 75 65 64 20 62 79 20 76 61 6c 67 72 69 6e  ssued by valgrin
21f20 64 20 61 72 65 20 69 6e 63 6f 72 72 65 63 74 20  d are incorrect 
21f30 2d 20 77 65 20 77 6f 75 6c 64 0a 20 20 2a 2a 20  - we would.  ** 
21f40 70 72 65 66 65 72 20 74 68 61 74 20 74 68 65 20  prefer that the 
21f50 72 61 6e 64 6f 6d 6e 65 73 73 20 62 65 20 69 6e  randomness be in
21f60 63 72 65 61 73 65 64 20 62 79 20 6d 61 6b 69 6e  creased by makin
21f70 67 20 75 73 65 20 6f 66 20 74 68 65 0a 20 20 2a  g use of the.  *
21f80 2a 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20  * uninitialized 
21f90 73 70 61 63 65 20 69 6e 20 7a 42 75 66 20 2d 20  space in zBuf - 
21fa0 62 75 74 20 76 61 6c 67 72 69 6e 64 20 65 72 72  but valgrind err
21fb0 6f 72 73 20 74 65 6e 64 20 74 6f 20 77 6f 72 72  ors tend to worr
21fc0 79 0a 20 20 2a 2a 20 73 6f 6d 65 20 75 73 65 72  y.  ** some user
21fd0 73 2e 20 20 52 61 74 68 65 72 20 74 68 61 6e 20  s.  Rather than 
21fe0 61 72 67 75 65 2c 20 69 74 20 73 65 65 6d 73 20  argue, it seems 
21ff0 65 61 73 69 65 72 20 6a 75 73 74 20 74 6f 20 69  easier just to i
22000 6e 69 74 69 61 6c 69 7a 65 0a 20 20 2a 2a 20 74  nitialize.  ** t
22010 68 65 20 77 68 6f 6c 65 20 61 72 72 61 79 20 61  he whole array a
22020 6e 64 20 73 69 6c 65 6e 63 65 20 76 61 6c 67 72  nd silence valgr
22030 69 6e 64 2c 20 65 76 65 6e 20 69 66 20 74 68 61  ind, even if tha
22040 74 20 6d 65 61 6e 73 20 6c 65 73 73 20 72 61 6e  t means less ran
22050 64 6f 6d 6e 65 73 73 0a 20 20 2a 2a 20 69 6e 20  domness.  ** in 
22060 74 68 65 20 72 61 6e 64 6f 6d 20 73 65 65 64 2e  the random seed.
22070 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20  .  **.  ** When 
22080 74 65 73 74 69 6e 67 2c 20 69 6e 69 74 69 61 6c  testing, initial
22090 69 7a 69 6e 67 20 7a 42 75 66 5b 5d 20 74 6f 20  izing zBuf[] to 
220a0 7a 65 72 6f 20 69 73 20 61 6c 6c 20 77 65 20 64  zero is all we d
220b0 6f 2e 20 20 54 68 61 74 20 6d 65 61 6e 73 0a 20  o.  That means. 
220c0 20 2a 2a 20 74 68 61 74 20 77 65 20 61 6c 77 61   ** that we alwa
220d0 79 73 20 75 73 65 20 74 68 65 20 73 61 6d 65 20  ys use the same 
220e0 72 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 73 65  random number se
220f0 71 75 65 6e 63 65 2e 20 20 54 68 69 73 20 6d 61  quence.  This ma
22100 6b 65 73 20 74 68 65 0a 20 20 2a 2a 20 74 65 73  kes the.  ** tes
22110 74 73 20 72 65 70 65 61 74 61 62 6c 65 2e 0a 20  ts repeatable.. 
22120 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 7a 42 75   */.  memset(zBu
22130 66 2c 20 30 2c 20 6e 42 75 66 29 3b 0a 23 69 66  f, 0, nBuf);.#if
22140 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
22150 5f 54 45 53 54 29 0a 20 20 7b 0a 20 20 20 20 69  _TEST).  {.    i
22160 6e 74 20 70 69 64 2c 20 66 64 3b 0a 20 20 20 20  nt pid, fd;.    
22170 66 64 20 3d 20 6f 70 65 6e 28 22 2f 64 65 76 2f  fd = open("/dev/
22180 75 72 61 6e 64 6f 6d 22 2c 20 4f 5f 52 44 4f 4e  urandom", O_RDON
22190 4c 59 29 3b 0a 20 20 20 20 69 66 28 20 66 64 3c  LY);.    if( fd<
221a0 30 20 29 7b 0a 20 20 20 20 20 20 74 69 6d 65 5f  0 ){.      time_
221b0 74 20 74 3b 0a 20 20 20 20 20 20 74 69 6d 65 28  t t;.      time(
221c0 26 74 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  &t);.      memcp
221d0 79 28 7a 42 75 66 2c 20 26 74 2c 20 73 69 7a 65  y(zBuf, &t, size
221e0 6f 66 28 74 29 29 3b 0a 20 20 20 20 20 20 70 69  of(t));.      pi
221f0 64 20 3d 20 67 65 74 70 69 64 28 29 3b 0a 20 20  d = getpid();.  
22200 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66      memcpy(&zBuf
22210 5b 73 69 7a 65 6f 66 28 74 29 5d 2c 20 26 70 69  [sizeof(t)], &pi
22220 64 2c 20 73 69 7a 65 6f 66 28 70 69 64 29 29 3b  d, sizeof(pid));
22230 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
22240 69 7a 65 6f 66 28 74 29 2b 73 69 7a 65 6f 66 28  izeof(t)+sizeof(
22250 70 69 64 29 3c 3d 28 73 69 7a 65 5f 74 29 6e 42  pid)<=(size_t)nB
22260 75 66 20 29 3b 0a 20 20 20 20 20 20 6e 42 75 66  uf );.      nBuf
22270 20 3d 20 73 69 7a 65 6f 66 28 74 29 20 2b 20 73   = sizeof(t) + s
22280 69 7a 65 6f 66 28 70 69 64 29 3b 0a 20 20 20 20  izeof(pid);.    
22290 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 42 75  }else{.      nBu
222a0 66 20 3d 20 72 65 61 64 28 66 64 2c 20 7a 42 75  f = read(fd, zBu
222b0 66 2c 20 6e 42 75 66 29 3b 0a 20 20 20 20 20 20  f, nBuf);.      
222c0 63 6c 6f 73 65 28 66 64 29 3b 0a 20 20 20 20 7d  close(fd);.    }
222d0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65  .  }.#endif.  re
222e0 74 75 72 6e 20 6e 42 75 66 3b 0a 7d 0a 0a 0a 2f  turn nBuf;.}.../
222f0 2a 0a 2a 2a 20 53 6c 65 65 70 20 66 6f 72 20 61  *.** Sleep for a
22300 20 6c 69 74 74 6c 65 20 77 68 69 6c 65 2e 20 20   little while.  
22310 52 65 74 75 72 6e 20 74 68 65 20 61 6d 6f 75 6e  Return the amoun
22320 74 20 6f 66 20 74 69 6d 65 20 73 6c 65 70 74 2e  t of time slept.
22330 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74  .** The argument
22340 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
22350 66 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20 77  f microseconds w
22360 65 20 77 61 6e 74 20 74 6f 20 73 6c 65 65 70 2e  e want to sleep.
22370 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76  .** The return v
22380 61 6c 75 65 20 69 73 20 74 68 65 20 6e 75 6d 62  alue is the numb
22390 65 72 20 6f 66 20 6d 69 63 72 6f 73 65 63 6f 6e  er of microsecon
223a0 64 73 20 6f 66 20 73 6c 65 65 70 20 61 63 74 75  ds of sleep actu
223b0 61 6c 6c 79 0a 2a 2a 20 72 65 71 75 65 73 74 65  ally.** requeste
223c0 64 20 66 72 6f 6d 20 74 68 65 20 75 6e 64 65 72  d from the under
223d0 6c 79 69 6e 67 20 6f 70 65 72 61 74 69 6e 67 20  lying operating 
223e0 73 79 73 74 65 6d 2c 20 61 20 6e 75 6d 62 65 72  system, a number
223f0 20 77 68 69 63 68 0a 2a 2a 20 6d 69 67 68 74 20   which.** might 
22400 62 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  be greater than 
22410 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20  or equal to the 
22420 61 72 67 75 6d 65 6e 74 2c 20 62 75 74 20 6e 6f  argument, but no
22430 74 20 6c 65 73 73 0a 2a 2a 20 74 68 61 6e 20 74  t less.** than t
22440 68 65 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  he argument..*/.
22450 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53  static int unixS
22460 6c 65 65 70 28 73 71 6c 69 74 65 33 5f 76 66 73  leep(sqlite3_vfs
22470 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 6d   *NotUsed, int m
22480 69 63 72 6f 73 65 63 6f 6e 64 73 29 7b 0a 23 69  icroseconds){.#i
22490 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73  f OS_VXWORKS.  s
224a0 74 72 75 63 74 20 74 69 6d 65 73 70 65 63 20 73  truct timespec s
224b0 70 3b 0a 0a 20 20 73 70 2e 74 76 5f 73 65 63 20  p;..  sp.tv_sec 
224c0 3d 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20 2f  = microseconds /
224d0 20 31 30 30 30 30 30 30 3b 0a 20 20 73 70 2e 74   1000000;.  sp.t
224e0 76 5f 6e 73 65 63 20 3d 20 28 6d 69 63 72 6f 73  v_nsec = (micros
224f0 65 63 6f 6e 64 73 20 25 20 31 30 30 30 30 30 30  econds % 1000000
22500 29 20 2a 20 31 30 30 30 3b 0a 20 20 6e 61 6e 6f  ) * 1000;.  nano
22510 73 6c 65 65 70 28 26 73 70 2c 20 4e 55 4c 4c 29  sleep(&sp, NULL)
22520 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
22530 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
22540 20 72 65 74 75 72 6e 20 6d 69 63 72 6f 73 65 63   return microsec
22550 6f 6e 64 73 3b 0a 23 65 6c 69 66 20 64 65 66 69  onds;.#elif defi
22560 6e 65 64 28 48 41 56 45 5f 55 53 4c 45 45 50 29  ned(HAVE_USLEEP)
22570 20 26 26 20 48 41 56 45 5f 55 53 4c 45 45 50 0a   && HAVE_USLEEP.
22580 20 20 75 73 6c 65 65 70 28 6d 69 63 72 6f 73 65    usleep(microse
22590 63 6f 6e 64 73 29 3b 0a 20 20 55 4e 55 53 45 44  conds);.  UNUSED
225a0 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
225b0 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 6d 69  ed);.  return mi
225c0 63 72 6f 73 65 63 6f 6e 64 73 3b 0a 23 65 6c 73  croseconds;.#els
225d0 65 0a 20 20 69 6e 74 20 73 65 63 6f 6e 64 73 20  e.  int seconds 
225e0 3d 20 28 6d 69 63 72 6f 73 65 63 6f 6e 64 73 2b  = (microseconds+
225f0 39 39 39 39 39 39 29 2f 31 30 30 30 30 30 30 3b  999999)/1000000;
22600 0a 20 20 73 6c 65 65 70 28 73 65 63 6f 6e 64 73  .  sleep(seconds
22610 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
22620 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
22630 20 20 72 65 74 75 72 6e 20 73 65 63 6f 6e 64 73    return seconds
22640 2a 31 30 30 30 30 30 30 3b 0a 23 65 6e 64 69 66  *1000000;.#endif
22650 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  .}../*.** The fo
22660 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65  llowing variable
22670 2c 20 69 66 20 73 65 74 20 74 6f 20 61 20 6e 6f  , if set to a no
22680 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2c 20 69 73  n-zero value, is
22690 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 0a   interpreted as.
226a0 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ** the number of
226b0 20 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 31   seconds since 1
226c0 39 37 30 20 61 6e 64 20 69 73 20 75 73 65 64 20  970 and is used 
226d0 74 6f 20 73 65 74 20 74 68 65 20 72 65 73 75 6c  to set the resul
226e0 74 20 6f 66 0a 2a 2a 20 73 71 6c 69 74 65 33 4f  t of.** sqlite3O
226f0 73 43 75 72 72 65 6e 74 54 69 6d 65 28 29 20 64  sCurrentTime() d
22700 75 72 69 6e 67 20 74 65 73 74 69 6e 67 2e 0a 2a  uring testing..*
22710 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
22720 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33  TEST.int sqlite3
22730 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 3d 20  _current_time = 
22740 30 3b 20 20 2f 2a 20 46 61 6b 65 20 73 79 73 74  0;  /* Fake syst
22750 65 6d 20 74 69 6d 65 20 69 6e 20 73 65 63 6f 6e  em time in secon
22760 64 73 20 73 69 6e 63 65 20 31 39 37 30 2e 20 2a  ds since 1970. *
22770 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  /.#endif../*.** 
22780 46 69 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74  Find the current
22790 20 74 69 6d 65 20 28 69 6e 20 55 6e 69 76 65 72   time (in Univer
227a0 73 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65 64 20  sal Coordinated 
227b0 54 69 6d 65 29 2e 20 20 57 72 69 74 65 20 74 68  Time).  Write th
227c0 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 74 69 6d  e.** current tim
227d0 65 20 61 6e 64 20 64 61 74 65 20 61 73 20 61 20  e and date as a 
227e0 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62 65  Julian Day numbe
227f0 72 20 69 6e 74 6f 20 2a 70 72 4e 6f 77 20 61 6e  r into *prNow an
22800 64 0a 2a 2a 20 72 65 74 75 72 6e 20 30 2e 20 20  d.** return 0.  
22810 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20  Return 1 if the 
22820 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 63 61  time and date ca
22830 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a  nnot be found..*
22840 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
22850 78 43 75 72 72 65 6e 74 54 69 6d 65 28 73 71 6c  xCurrentTime(sql
22860 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65  ite3_vfs *NotUse
22870 64 2c 20 64 6f 75 62 6c 65 20 2a 70 72 4e 6f 77  d, double *prNow
22880 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  ){.#if defined(S
22890 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54  QLITE_OMIT_FLOAT
228a0 49 4e 47 5f 50 4f 49 4e 54 29 0a 20 20 74 69 6d  ING_POINT).  tim
228b0 65 5f 74 20 74 3b 0a 20 20 74 69 6d 65 28 26 74  e_t t;.  time(&t
228c0 29 3b 0a 20 20 2a 70 72 4e 6f 77 20 3d 20 28 28  );.  *prNow = ((
228d0 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 74  (sqlite3_int64)t
228e0 29 2f 38 36 34 30 20 2b 20 32 34 34 30 35 38 37  )/8640 + 2440587
228f0 35 29 2f 31 30 3b 0a 23 65 6c 69 66 20 64 65 66  5)/10;.#elif def
22900 69 6e 65 64 28 4e 4f 5f 47 45 54 54 4f 44 29 0a  ined(NO_GETTOD).
22910 20 20 74 69 6d 65 5f 74 20 74 3b 0a 20 20 74 69    time_t t;.  ti
22920 6d 65 28 26 74 29 3b 0a 20 20 2a 70 72 4e 6f 77  me(&t);.  *prNow
22930 20 3d 20 74 2f 38 36 34 30 30 2e 30 20 2b 20 32   = t/86400.0 + 2
22940 34 34 30 35 38 37 2e 35 3b 0a 23 65 6c 69 66 20  440587.5;.#elif 
22950 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74 72  OS_VXWORKS.  str
22960 75 63 74 20 74 69 6d 65 73 70 65 63 20 73 4e 6f  uct timespec sNo
22970 77 3b 0a 20 20 63 6c 6f 63 6b 5f 67 65 74 74 69  w;.  clock_getti
22980 6d 65 28 43 4c 4f 43 4b 5f 52 45 41 4c 54 49 4d  me(CLOCK_REALTIM
22990 45 2c 20 26 73 4e 6f 77 29 3b 0a 20 20 2a 70 72  E, &sNow);.  *pr
229a0 4e 6f 77 20 3d 20 32 34 34 30 35 38 37 2e 35 20  Now = 2440587.5 
229b0 2b 20 73 4e 6f 77 2e 74 76 5f 73 65 63 2f 38 36  + sNow.tv_sec/86
229c0 34 30 30 2e 30 20 2b 20 73 4e 6f 77 2e 74 76 5f  400.0 + sNow.tv_
229d0 6e 73 65 63 2f 38 36 34 30 30 30 30 30 30 30 30  nsec/86400000000
229e0 30 30 30 2e 30 3b 0a 23 65 6c 73 65 0a 20 20 73  000.0;.#else.  s
229f0 74 72 75 63 74 20 74 69 6d 65 76 61 6c 20 73 4e  truct timeval sN
22a00 6f 77 3b 0a 20 20 67 65 74 74 69 6d 65 6f 66 64  ow;.  gettimeofd
22a10 61 79 28 26 73 4e 6f 77 2c 20 30 29 3b 0a 20 20  ay(&sNow, 0);.  
22a20 2a 70 72 4e 6f 77 20 3d 20 32 34 34 30 35 38 37  *prNow = 2440587
22a30 2e 35 20 2b 20 73 4e 6f 77 2e 74 76 5f 73 65 63  .5 + sNow.tv_sec
22a40 2f 38 36 34 30 30 2e 30 20 2b 20 73 4e 6f 77 2e  /86400.0 + sNow.
22a50 74 76 5f 75 73 65 63 2f 38 36 34 30 30 30 30 30  tv_usec/86400000
22a60 30 30 30 2e 30 3b 0a 23 65 6e 64 69 66 0a 0a 23  000.0;.#endif..#
22a70 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
22a80 54 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  T.  if( sqlite3_
22a90 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 29 7b 0a  current_time ){.
22aa0 20 20 20 20 2a 70 72 4e 6f 77 20 3d 20 73 71 6c      *prNow = sql
22ab0 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d  ite3_current_tim
22ac0 65 2f 38 36 34 30 30 2e 30 20 2b 20 32 34 34 30  e/86400.0 + 2440
22ad0 35 38 37 2e 35 3b 0a 20 20 7d 0a 23 65 6e 64 69  587.5;.  }.#endi
22ae0 66 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  f.  UNUSED_PARAM
22af0 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
22b00 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
22b10 0a 2a 2a 20 57 65 20 61 64 64 65 64 20 74 68 65  .** We added the
22b20 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29   xGetLastError()
22b30 20 6d 65 74 68 6f 64 20 77 69 74 68 20 74 68 65   method with the
22b40 20 69 6e 74 65 6e 74 69 6f 6e 20 6f 66 20 70 72   intention of pr
22b50 6f 76 69 64 69 6e 67 0a 2a 2a 20 62 65 74 74 65  oviding.** bette
22b60 72 20 6c 6f 77 2d 6c 65 76 65 6c 20 65 72 72 6f  r low-level erro
22b70 72 20 6d 65 73 73 61 67 65 73 20 77 68 65 6e 20  r messages when 
22b80 6f 70 65 72 61 74 69 6e 67 2d 73 79 73 74 65 6d  operating-system
22b90 20 70 72 6f 62 6c 65 6d 73 20 63 6f 6d 65 20 75   problems come u
22ba0 70 0a 2a 2a 20 64 75 72 69 6e 67 20 53 51 4c 69  p.** during SQLi
22bb0 74 65 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 42  te operation.  B
22bc0 75 74 20 73 6f 20 66 61 72 2c 20 6e 6f 6e 65 20  ut so far, none 
22bd0 6f 66 20 74 68 61 74 20 68 61 73 20 62 65 65 6e  of that has been
22be0 20 69 6d 70 6c 65 6d 65 6e 74 65 64 0a 2a 2a 20   implemented.** 
22bf0 69 6e 20 74 68 65 20 63 6f 72 65 2e 20 20 53 6f  in the core.  So
22c00 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
22c10 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 2e 20 20   never called.  
22c20 46 6f 72 20 6e 6f 77 2c 20 69 74 20 69 73 20 6d  For now, it is m
22c30 65 72 65 6c 79 0a 2a 2a 20 61 20 70 6c 61 63 65  erely.** a place
22c40 2d 68 6f 6c 64 65 72 2e 0a 2a 2f 0a 73 74 61 74  -holder..*/.stat
22c50 69 63 20 69 6e 74 20 75 6e 69 78 47 65 74 4c 61  ic int unixGetLa
22c60 73 74 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f  stError(sqlite3_
22c70 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e  vfs *NotUsed, in
22c80 74 20 4e 6f 74 55 73 65 64 32 2c 20 63 68 61 72  t NotUsed2, char
22c90 20 2a 4e 6f 74 55 73 65 64 33 29 7b 0a 20 20 55   *NotUsed3){.  U
22ca0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
22cb0 4e 6f 74 55 73 65 64 29 3b 0a 20 20 55 4e 55 53  NotUsed);.  UNUS
22cc0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
22cd0 55 73 65 64 32 29 3b 0a 20 20 55 4e 55 53 45 44  Used2);.  UNUSED
22ce0 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
22cf0 65 64 33 29 3b 0a 20 20 72 65 74 75 72 6e 20 30  ed3);.  return 0
22d00 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ;.}../*.********
22d10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22d20 20 45 6e 64 20 6f 66 20 73 71 6c 69 74 65 33 5f   End of sqlite3_
22d30 76 66 73 20 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a  vfs methods ****
22d40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22d50 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
22d60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22d70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22d80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22d90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22da0 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a  ******/../******
22db0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22dc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22dd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22de0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22df0 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
22e00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22e10 2a 2a 2a 20 42 65 67 69 6e 20 50 72 6f 78 79 20  *** Begin Proxy 
22e20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a  Locking ********
22e30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22e40 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 50  ********.**.** P
22e50 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20  roxy locking is 
22e60 61 20 22 75 62 65 72 2d 6c 6f 63 6b 69 6e 67 2d  a "uber-locking-
22e70 6d 65 74 68 6f 64 22 20 69 6e 20 74 68 69 73 20  method" in this 
22e80 73 65 6e 73 65 3a 20 20 49 74 20 75 73 65 73 20  sense:  It uses 
22e90 74 68 65 0a 2a 2a 20 6f 74 68 65 72 20 6c 6f 63  the.** other loc
22ea0 6b 69 6e 67 20 6d 65 74 68 6f 64 73 20 6f 6e 20  king methods on 
22eb0 73 65 63 6f 6e 64 61 72 79 20 6c 6f 63 6b 20 66  secondary lock f
22ec0 69 6c 65 73 2e 20 20 50 72 6f 78 79 20 6c 6f 63  iles.  Proxy loc
22ed0 6b 69 6e 67 20 69 73 20 61 0a 2a 2a 20 6d 65 74  king is a.** met
22ee0 61 2d 6c 61 79 65 72 20 6f 76 65 72 20 74 6f 70  a-layer over top
22ef0 20 6f 66 20 74 68 65 20 70 72 69 6d 69 74 69 76   of the primitiv
22f00 65 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c 65 6d  e locking implem
22f10 65 6e 74 65 64 20 61 62 6f 76 65 2e 20 20 46 6f  ented above.  Fo
22f20 72 0a 2a 2a 20 74 68 69 73 20 72 65 61 73 6f 6e  r.** this reason
22f30 2c 20 74 68 65 20 64 69 76 69 73 69 6f 6e 20 74  , the division t
22f40 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 6f  hat implements o
22f50 66 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20  f proxy locking 
22f60 69 73 20 64 65 66 65 72 72 65 64 0a 2a 2a 20 75  is deferred.** u
22f70 6e 74 69 6c 20 6c 61 74 65 20 69 6e 20 74 68 65  ntil late in the
22f80 20 66 69 6c 65 20 28 68 65 72 65 29 20 61 66 74   file (here) aft
22f90 65 72 20 61 6c 6c 20 6f 66 20 74 68 65 20 6f 74  er all of the ot
22fa0 68 65 72 20 49 2f 4f 20 6d 65 74 68 6f 64 73 20  her I/O methods 
22fb0 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20 64 65 66  have.** been def
22fc0 69 6e 65 64 20 2d 20 73 6f 20 74 68 61 74 20 74  ined - so that t
22fd0 68 65 20 70 72 69 6d 69 74 69 76 65 20 6c 6f 63  he primitive loc
22fe0 6b 69 6e 67 20 6d 65 74 68 6f 64 73 20 61 72 65  king methods are
22ff0 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 61 73   available.** as
23000 20 73 65 72 76 69 63 65 73 20 74 6f 20 68 65 6c   services to hel
23010 70 20 77 69 74 68 20 74 68 65 20 69 6d 70 6c 65  p with the imple
23020 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 70 72 6f  mentation of pro
23030 78 79 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a  xy locking..**.*
23040 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65  ***.**.** The de
23050 66 61 75 6c 74 20 6c 6f 63 6b 69 6e 67 20 73 63  fault locking sc
23060 68 65 6d 65 73 20 69 6e 20 53 51 4c 69 74 65 20  hemes in SQLite 
23070 75 73 65 20 62 79 74 65 2d 72 61 6e 67 65 20 6c  use byte-range l
23080 6f 63 6b 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 64  ocks on the.** d
23090 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
230a0 63 6f 6f 72 64 69 6e 61 74 65 20 73 61 66 65 2c  coordinate safe,
230b0 20 63 6f 6e 63 75 72 72 65 6e 74 20 61 63 63 65   concurrent acce
230c0 73 73 20 62 79 20 6d 75 6c 74 69 70 6c 65 20 72  ss by multiple r
230d0 65 61 64 65 72 73 0a 2a 2a 20 61 6e 64 20 77 72  eaders.** and wr
230e0 69 74 65 72 73 20 5b 68 74 74 70 3a 2f 2f 73 71  iters [http://sq
230f0 6c 69 74 65 2e 6f 72 67 2f 6c 6f 63 6b 69 6e 67  lite.org/locking
23100 76 33 2e 68 74 6d 6c 5d 2e 20 20 54 68 65 20 66  v3.html].  The f
23110 69 76 65 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67  ive file locking
23120 0a 2a 2a 20 73 74 61 74 65 73 20 28 55 4e 4c 4f  .** states (UNLO
23130 43 4b 45 44 2c 20 50 45 4e 44 49 4e 47 2c 20 53  CKED, PENDING, S
23140 48 41 52 45 44 2c 20 52 45 53 45 52 56 45 44 2c  HARED, RESERVED,
23150 20 45 58 43 4c 55 53 49 56 45 29 20 61 72 65 20   EXCLUSIVE) are 
23160 69 6d 70 6c 65 6d 65 6e 74 65 64 0a 2a 2a 20 61  implemented.** a
23170 73 20 50 4f 53 49 58 20 72 65 61 64 20 26 20 77  s POSIX read & w
23180 72 69 74 65 20 6c 6f 63 6b 73 20 6f 76 65 72 20  rite locks over 
23190 66 69 78 65 64 20 73 65 74 20 6f 66 20 6c 6f 63  fixed set of loc
231a0 61 74 69 6f 6e 73 20 28 76 69 61 20 66 73 63 74  ations (via fsct
231b0 6c 29 2c 0a 2a 2a 20 6f 6e 20 41 46 50 20 61 6e  l),.** on AFP an
231c0 64 20 53 4d 42 20 6f 6e 6c 79 20 65 78 63 6c 75  d SMB only exclu
231d0 73 69 76 65 20 62 79 74 65 2d 72 61 6e 67 65 20  sive byte-range 
231e0 6c 6f 63 6b 73 20 61 72 65 20 61 76 61 69 6c 61  locks are availa
231f0 62 6c 65 20 76 69 61 20 66 73 63 74 6c 0a 2a 2a  ble via fsctl.**
23200 20 77 69 74 68 20 5f 49 4f 57 52 28 27 7a 27 2c   with _IOWR('z',
23210 20 32 33 2c 20 73 74 72 75 63 74 20 42 79 74 65   23, struct Byte
23220 52 61 6e 67 65 4c 6f 63 6b 50 42 32 29 20 74 6f  RangeLockPB2) to
23230 20 74 72 61 63 6b 20 74 68 65 20 73 61 6d 65 20   track the same 
23240 35 20 73 74 61 74 65 73 2e 0a 2a 2a 20 54 6f 20  5 states..** To 
23250 73 69 6d 75 6c 61 74 65 20 61 20 46 5f 52 44 4c  simulate a F_RDL
23260 43 4b 20 6f 6e 20 74 68 65 20 73 68 61 72 65 64  CK on the shared
23270 20 72 61 6e 67 65 2c 20 6f 6e 20 41 46 50 20 61   range, on AFP a
23280 20 72 61 6e 64 6f 6d 6c 79 20 73 65 6c 65 63 74   randomly select
23290 65 64 0a 2a 2a 20 61 64 64 72 65 73 73 20 69 6e  ed.** address in
232a0 20 74 68 65 20 73 68 61 72 65 64 20 72 61 6e 67   the shared rang
232b0 65 20 69 73 20 74 61 6b 65 6e 20 66 6f 72 20 61  e is taken for a
232c0 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68   SHARED lock, th
232d0 65 20 65 6e 74 69 72 65 0a 2a 2a 20 73 68 61 72  e entire.** shar
232e0 65 64 20 72 61 6e 67 65 20 69 73 20 74 61 6b 65  ed range is take
232f0 6e 20 66 6f 72 20 61 6e 20 45 58 43 4c 55 53 49  n for an EXCLUSI
23300 56 45 20 6c 6f 63 6b 29 3a 0a 2a 2a 0a 2a 2a 20  VE lock):.**.** 
23310 20 20 20 20 20 50 45 4e 44 49 4e 47 5f 42 59 54       PENDING_BYT
23320 45 20 20 20 20 20 20 20 20 30 78 34 30 30 30 30  E        0x40000
23330 30 30 30 09 09 20 20 20 09 0a 2a 2a 20 20 20 20  000..   ..**    
23340 20 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 20    RESERVED_BYTE 
23350 20 20 20 20 20 20 30 78 34 30 30 30 30 30 30 31        0x40000001
23360 0a 2a 2a 20 20 20 20 20 20 53 48 41 52 45 44 5f  .**      SHARED_
23370 52 41 4e 47 45 20 20 20 20 20 20 20 20 30 78 34  RANGE        0x4
23380 30 30 30 30 30 30 32 20 2d 3e 20 30 78 34 30 30  0000002 -> 0x400
23390 30 30 32 30 30 0a 2a 2a 0a 2a 2a 20 54 68 69 73  00200.**.** This
233a0 20 77 6f 72 6b 73 20 77 65 6c 6c 20 6f 6e 20 74   works well on t
233b0 68 65 20 6c 6f 63 61 6c 20 66 69 6c 65 20 73 79  he local file sy
233c0 73 74 65 6d 2c 20 62 75 74 20 73 68 6f 77 73 20  stem, but shows 
233d0 61 20 6e 65 61 72 6c 79 20 31 30 30 78 0a 2a 2a  a nearly 100x.**
233e0 20 73 6c 6f 77 64 6f 77 6e 20 69 6e 20 72 65 61   slowdown in rea
233f0 64 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f 6e  d performance on
23400 20 41 46 50 20 62 65 63 61 75 73 65 20 74 68 65   AFP because the
23410 20 41 46 50 20 63 6c 69 65 6e 74 20 64 69 73 61   AFP client disa
23420 62 6c 65 73 0a 2a 2a 20 74 68 65 20 72 65 61 64  bles.** the read
23430 20 63 61 63 68 65 20 77 68 65 6e 20 62 79 74 65   cache when byte
23440 2d 72 61 6e 67 65 20 6c 6f 63 6b 73 20 61 72 65  -range locks are
23450 20 70 72 65 73 65 6e 74 2e 20 20 45 6e 61 62 6c   present.  Enabl
23460 69 6e 67 20 74 68 65 20 72 65 61 64 0a 2a 2a 20  ing the read.** 
23470 63 61 63 68 65 20 65 78 70 6f 73 65 73 20 61 20  cache exposes a 
23480 63 61 63 68 65 20 63 6f 68 65 72 65 6e 63 79 20  cache coherency 
23490 70 72 6f 62 6c 65 6d 20 74 68 61 74 20 69 73 20  problem that is 
234a0 70 72 65 73 65 6e 74 20 6f 6e 20 61 6c 6c 20 4f  present on all O
234b0 53 20 58 0a 2a 2a 20 73 75 70 70 6f 72 74 65 64  S X.** supported
234c0 20 6e 65 74 77 6f 72 6b 20 66 69 6c 65 20 73 79   network file sy
234d0 73 74 65 6d 73 2e 20 20 4e 46 53 20 61 6e 64 20  stems.  NFS and 
234e0 41 46 50 20 62 6f 74 68 20 6f 62 73 65 72 76 65  AFP both observe
234f0 20 74 68 65 0a 2a 2a 20 63 6c 6f 73 65 2d 74 6f   the.** close-to
23500 2d 6f 70 65 6e 20 73 65 6d 61 6e 74 69 63 73 20  -open semantics 
23510 66 6f 72 20 65 6e 73 75 72 69 6e 67 20 63 61 63  for ensuring cac
23520 68 65 20 63 6f 68 65 72 65 6e 63 79 0a 2a 2a 20  he coherency.** 
23530 5b 68 74 74 70 3a 2f 2f 6e 66 73 2e 73 6f 75 72  [http://nfs.sour
23540 63 65 66 6f 72 67 65 2e 6e 65 74 2f 23 66 61 71  ceforge.net/#faq
23550 5f 61 38 5d 2c 20 77 68 69 63 68 20 64 6f 65 73  _a8], which does
23560 20 6e 6f 74 20 65 66 66 65 63 74 69 76 65 6c 79   not effectively
23570 0a 2a 2a 20 61 64 64 72 65 73 73 20 74 68 65 20  .** address the 
23580 72 65 71 75 69 72 65 6d 65 6e 74 73 20 66 6f 72  requirements for
23590 20 63 6f 6e 63 75 72 72 65 6e 74 20 64 61 74 61   concurrent data
235a0 62 61 73 65 20 61 63 63 65 73 73 20 62 79 20 6d  base access by m
235b0 75 6c 74 69 70 6c 65 0a 2a 2a 20 72 65 61 64 65  ultiple.** reade
235c0 72 73 20 61 6e 64 20 77 72 69 74 65 72 73 0a 2a  rs and writers.*
235d0 2a 20 5b 68 74 74 70 3a 2f 2f 77 77 77 2e 6e 61  * [http://www.na
235e0 62 62 6c 65 2e 63 6f 6d 2f 53 51 4c 69 74 65 2d  bble.com/SQLite-
235f0 6f 6e 2d 4e 46 53 2d 63 61 63 68 65 2d 63 6f 68  on-NFS-cache-coh
23600 65 72 65 6e 63 79 2d 74 64 31 35 36 35 35 37 30  erency-td1565570
23610 31 2e 68 74 6d 6c 5d 2e 0a 2a 2a 0a 2a 2a 20 54  1.html]..**.** T
23620 6f 20 61 64 64 72 65 73 73 20 74 68 65 20 70 65  o address the pe
23630 72 66 6f 72 6d 61 6e 63 65 20 61 6e 64 20 63 61  rformance and ca
23640 63 68 65 20 63 6f 68 65 72 65 6e 63 79 20 69 73  che coherency is
23650 73 75 65 73 2c 20 70 72 6f 78 79 20 66 69 6c 65  sues, proxy file
23660 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 63 68 61 6e   locking.** chan
23670 67 65 73 20 74 68 65 20 77 61 79 20 64 61 74 61  ges the way data
23680 62 61 73 65 20 61 63 63 65 73 73 20 69 73 20 63  base access is c
23690 6f 6e 74 72 6f 6c 6c 65 64 20 62 79 20 6c 69 6d  ontrolled by lim
236a0 69 74 69 6e 67 20 61 63 63 65 73 73 20 74 6f 20  iting access to 
236b0 61 0a 2a 2a 20 73 69 6e 67 6c 65 20 68 6f 73 74  a.** single host
236c0 20 61 74 20 61 20 74 69 6d 65 20 61 6e 64 20 6d   at a time and m
236d0 6f 76 69 6e 67 20 66 69 6c 65 20 6c 6f 63 6b 73  oving file locks
236e0 20 6f 66 66 20 6f 66 20 74 68 65 20 64 61 74 61   off of the data
236f0 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20 61 6e 64  base file.** and
23700 20 6f 6e 74 6f 20 61 20 70 72 6f 78 79 20 66 69   onto a proxy fi
23710 6c 65 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20  le on the local 
23720 66 69 6c 65 20 73 79 73 74 65 6d 2e 20 20 0a 2a  file system.  .*
23730 2a 0a 2a 2a 0a 2a 2a 20 55 73 69 6e 67 20 70 72  *.**.** Using pr
23740 6f 78 79 20 6c 6f 63 6b 73 0a 2a 2a 20 2d 2d 2d  oxy locks.** ---
23750 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a  --------------.*
23760 2a 0a 2a 2a 20 43 20 41 50 49 73 0a 2a 2a 0a 2a  *.** C APIs.**.*
23770 2a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f  *  sqlite3_file_
23780 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 64 62 6e 61  control(db, dbna
23790 6d 65 2c 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c  me, SQLITE_SET_L
237a0 4f 43 4b 50 52 4f 58 59 46 49 4c 45 2c 0a 2a 2a  OCKPROXYFILE,.**
237b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
237c0 20 20 20 20 20 20 20 3c 70 72 6f 78 79 5f 70 61         <proxy_pa
237d0 74 68 3e 20 7c 20 22 3a 61 75 74 6f 3a 22 29 3b  th> | ":auto:");
237e0 0a 2a 2a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  .**  sqlite3_fil
237f0 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 64 62  e_control(db, db
23800 6e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 47 45 54  name, SQLITE_GET
23810 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 2c 20  _LOCKPROXYFILE, 
23820 26 3c 70 72 6f 78 79 5f 70 61 74 68 3e 29 3b 0a  &<proxy_path>);.
23830 2a 2a 0a 2a 2a 0a 2a 2a 20 53 51 4c 20 70 72 61  **.**.** SQL pra
23840 67 6d 61 73 0a 2a 2a 0a 2a 2a 20 20 50 52 41 47  gmas.**.**  PRAG
23850 4d 41 20 5b 64 61 74 61 62 61 73 65 2e 5d 6c 6f  MA [database.]lo
23860 63 6b 5f 70 72 6f 78 79 5f 66 69 6c 65 3d 3c 70  ck_proxy_file=<p
23870 72 6f 78 79 5f 70 61 74 68 3e 20 7c 20 3a 61 75  roxy_path> | :au
23880 74 6f 3a 0a 2a 2a 20 20 50 52 41 47 4d 41 20 5b  to:.**  PRAGMA [
23890 64 61 74 61 62 61 73 65 2e 5d 6c 6f 63 6b 5f 70  database.]lock_p
238a0 72 6f 78 79 5f 66 69 6c 65 0a 2a 2a 0a 2a 2a 20  roxy_file.**.** 
238b0 53 70 65 63 69 66 79 69 6e 67 20 22 3a 61 75 74  Specifying ":aut
238c0 6f 3a 22 20 6d 65 61 6e 73 20 74 68 61 74 20 69  o:" means that i
238d0 66 20 74 68 65 72 65 20 69 73 20 61 20 63 6f 6e  f there is a con
238e0 63 68 20 66 69 6c 65 20 77 69 74 68 20 61 20 6d  ch file with a m
238f0 61 74 63 68 69 6e 67 0a 2a 2a 20 68 6f 73 74 20  atching.** host 
23900 49 44 20 69 6e 20 69 74 2c 20 74 68 65 20 70 72  ID in it, the pr
23910 6f 78 79 20 70 61 74 68 20 69 6e 20 74 68 65 20  oxy path in the 
23920 63 6f 6e 63 68 20 66 69 6c 65 20 77 69 6c 6c 20  conch file will 
23930 62 65 20 75 73 65 64 2c 20 6f 74 68 65 72 77 69  be used, otherwi
23940 73 65 0a 2a 2a 20 61 20 70 72 6f 78 79 20 70 61  se.** a proxy pa
23950 74 68 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20  th based on the 
23960 75 73 65 72 27 73 20 74 65 6d 70 20 64 69 72 0a  user's temp dir.
23970 2a 2a 20 28 76 69 61 20 63 6f 6e 66 73 74 72 28  ** (via confstr(
23980 5f 43 53 5f 44 41 52 57 49 4e 5f 55 53 45 52 5f  _CS_DARWIN_USER_
23990 54 45 4d 50 5f 44 49 52 2c 2e 2e 2e 29 29 20 77  TEMP_DIR,...)) w
239a0 69 6c 6c 20 62 65 20 75 73 65 64 20 61 6e 64 20  ill be used and 
239b0 74 68 65 0a 2a 2a 20 61 63 74 75 61 6c 20 70 72  the.** actual pr
239c0 6f 78 79 20 66 69 6c 65 20 6e 61 6d 65 20 69 73  oxy file name is
239d0 20 67 65 6e 65 72 61 74 65 64 20 66 72 6f 6d 20   generated from 
239e0 74 68 65 20 6e 61 6d 65 20 61 6e 64 20 70 61 74  the name and pat
239f0 68 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61  h of the.** data
23a00 62 61 73 65 20 66 69 6c 65 2e 20 20 46 6f 72 20  base file.  For 
23a10 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20  example:.**.**  
23a20 20 20 20 20 20 46 6f 72 20 64 61 74 61 62 61 73       For databas
23a30 65 20 70 61 74 68 20 22 2f 55 73 65 72 73 2f 6d  e path "/Users/m
23a40 65 2f 66 6f 6f 2e 64 62 22 20 0a 2a 2a 20 20 20  e/foo.db" .**   
23a50 20 20 20 20 54 68 65 20 6c 6f 63 6b 20 70 61 74      The lock pat
23a60 68 20 77 69 6c 6c 20 62 65 20 22 3c 74 6d 70 64  h will be "<tmpd
23a70 69 72 3e 2f 73 71 6c 69 74 65 70 6c 6f 63 6b 73  ir>/sqliteplocks
23a80 2f 5f 55 73 65 72 73 5f 6d 65 5f 66 6f 6f 2e 64  /_Users_me_foo.d
23a90 62 3a 61 75 74 6f 3a 22 29 0a 2a 2a 0a 2a 2a 20  b:auto:").**.** 
23aa0 4f 6e 63 65 20 61 20 6c 6f 63 6b 20 70 72 6f 78  Once a lock prox
23ab0 79 20 69 73 20 63 6f 6e 66 69 67 75 72 65 64 20  y is configured 
23ac0 66 6f 72 20 61 20 64 61 74 61 62 61 73 65 20 63  for a database c
23ad0 6f 6e 6e 65 63 74 69 6f 6e 2c 20 69 74 20 63 61  onnection, it ca
23ae0 6e 20 6e 6f 74 0a 2a 2a 20 62 65 20 72 65 6d 6f  n not.** be remo
23af0 76 65 64 2c 20 68 6f 77 65 76 65 72 20 69 74 20  ved, however it 
23b00 6d 61 79 20 62 65 20 73 77 69 74 63 68 65 64 20  may be switched 
23b10 74 6f 20 61 20 64 69 66 66 65 72 65 6e 74 20 70  to a different p
23b20 72 6f 78 79 20 70 61 74 68 20 76 69 61 0a 2a 2a  roxy path via.**
23b30 20 74 68 65 20 61 62 6f 76 65 20 41 50 49 73 20   the above APIs 
23b40 28 61 73 73 75 6d 69 6e 67 20 74 68 65 20 63 6f  (assuming the co
23b50 6e 63 68 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  nch file is not 
23b60 62 65 69 6e 67 20 68 65 6c 64 20 62 79 20 61 6e  being held by an
23b70 6f 74 68 65 72 0a 2a 2a 20 63 6f 6e 6e 65 63 74  other.** connect
23b80 69 6f 6e 20 6f 72 20 70 72 6f 63 65 73 73 29 2e  ion or process).
23b90 20 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 48 6f 77 20 70   .**.**.** How p
23ba0 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 77 6f 72  roxy locking wor
23bb0 6b 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ks.** ----------
23bc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a  -------------.**
23bd0 0a 2a 2a 20 50 72 6f 78 79 20 66 69 6c 65 20 6c  .** Proxy file l
23be0 6f 63 6b 69 6e 67 20 72 65 6c 69 65 73 20 70 72  ocking relies pr
23bf0 69 6d 61 72 69 6c 79 20 6f 6e 20 74 77 6f 20 6e  imarily on two n
23c00 65 77 20 73 75 70 70 6f 72 74 69 6e 67 20 66 69  ew supporting fi
23c10 6c 65 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  les: .**.**   * 
23c20 20 63 6f 6e 63 68 20 66 69 6c 65 20 74 6f 20 6c   conch file to l
23c30 69 6d 69 74 20 61 63 63 65 73 73 20 74 6f 20 74  imit access to t
23c40 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
23c50 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 68 6f 73   to a single hos
23c60 74 0a 2a 2a 20 20 20 20 20 20 61 74 20 61 20 74  t.**      at a t
23c70 69 6d 65 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 70  ime.**.**   *  p
23c80 72 6f 78 79 20 66 69 6c 65 20 74 6f 20 61 63 74  roxy file to act
23c90 20 61 73 20 61 20 70 72 6f 78 79 20 66 6f 72 20   as a proxy for 
23ca0 74 68 65 20 61 64 76 69 73 6f 72 79 20 6c 6f 63  the advisory loc
23cb0 6b 73 20 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a 20 20  ks normally.**  
23cc0 20 20 20 20 74 61 6b 65 6e 20 6f 6e 20 74 68 65      taken on the
23cd0 20 64 61 74 61 62 61 73 65 0a 2a 2a 0a 2a 2a 20   database.**.** 
23ce0 54 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 2d  The conch file -
23cf0 20 74 6f 20 75 73 65 20 61 20 70 72 6f 78 79 20   to use a proxy 
23d00 66 69 6c 65 2c 20 73 71 6c 69 74 65 20 6d 75 73  file, sqlite mus
23d10 74 20 66 69 72 73 74 20 22 68 6f 6c 64 20 74 68  t first "hold th
23d20 65 20 63 6f 6e 63 68 22 0a 2a 2a 20 62 79 20 74  e conch".** by t
23d30 61 6b 69 6e 67 20 61 6e 20 73 71 6c 69 74 65 2d  aking an sqlite-
23d40 73 74 79 6c 65 20 73 68 61 72 65 64 20 6c 6f 63  style shared loc
23d50 6b 20 6f 6e 20 74 68 65 20 63 6f 6e 63 68 20 66  k on the conch f
23d60 69 6c 65 2c 20 72 65 61 64 69 6e 67 20 74 68 65  ile, reading the
23d70 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 61 6e 64  .** contents and
23d80 20 63 6f 6d 70 61 72 69 6e 67 20 74 68 65 20 68   comparing the h
23d90 6f 73 74 27 73 20 75 6e 69 71 75 65 20 68 6f 73  ost's unique hos
23da0 74 20 49 44 20 28 73 65 65 20 62 65 6c 6f 77 29  t ID (see below)
23db0 20 61 6e 64 20 6c 6f 63 6b 0a 2a 2a 20 70 72 6f   and lock.** pro
23dc0 78 79 20 70 61 74 68 20 61 67 61 69 6e 73 74 20  xy path against 
23dd0 74 68 65 20 76 61 6c 75 65 73 20 73 74 6f 72 65  the values store
23de0 64 20 69 6e 20 74 68 65 20 63 6f 6e 63 68 2e 20  d in the conch. 
23df0 20 54 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20   The conch file 
23e00 69 73 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20  is.** stored in 
23e10 74 68 65 20 73 61 6d 65 20 64 69 72 65 63 74 6f  the same directo
23e20 72 79 20 61 73 20 74 68 65 20 64 61 74 61 62 61  ry as the databa
23e30 73 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20  se file and the 
23e40 66 69 6c 65 20 6e 61 6d 65 0a 2a 2a 20 69 73 20  file name.** is 
23e50 70 61 74 74 65 72 6e 65 64 20 61 66 74 65 72 20  patterned after 
23e60 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
23e70 65 20 6e 61 6d 65 20 61 73 20 22 2e 3c 64 61 74  e name as ".<dat
23e80 61 62 61 73 65 6e 61 6d 65 3e 2d 63 6f 6e 63 68  abasename>-conch
23e90 22 2e 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6e  "..** If the con
23ea0 63 68 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74  ch file does not
23eb0 20 65 78 69 73 74 2c 20 6f 72 20 69 74 27 73 20   exist, or it's 
23ec0 63 6f 6e 74 65 6e 74 73 20 64 6f 20 6e 6f 74 20  contents do not 
23ed0 6d 61 74 63 68 20 74 68 65 0a 2a 2a 20 68 6f 73  match the.** hos
23ee0 74 20 49 44 20 61 6e 64 2f 6f 72 20 70 72 6f 78  t ID and/or prox
23ef0 79 20 70 61 74 68 2c 20 74 68 65 6e 20 74 68 65  y path, then the
23f00 20 6c 6f 63 6b 20 69 73 20 65 73 63 61 6c 61 74   lock is escalat
23f10 65 64 20 74 6f 20 61 6e 20 65 78 63 6c 75 73 69  ed to an exclusi
23f20 76 65 0a 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20 74  ve.** lock and t
23f30 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 63 6f  he conch file co
23f40 6e 74 65 6e 74 73 20 69 73 20 75 70 64 61 74 65  ntents is update
23f50 64 20 77 69 74 68 20 74 68 65 20 68 6f 73 74 20  d with the host 
23f60 49 44 20 61 6e 64 20 70 72 6f 78 79 0a 2a 2a 20  ID and proxy.** 
23f70 70 61 74 68 20 61 6e 64 20 74 68 65 20 6c 6f 63  path and the loc
23f80 6b 20 69 73 20 64 6f 77 6e 67 72 61 64 65 64 20  k is downgraded 
23f90 74 6f 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b  to a shared lock
23fa0 20 61 67 61 69 6e 2e 20 20 49 66 20 74 68 65 20   again.  If the 
23fb0 63 6f 6e 63 68 0a 2a 2a 20 69 73 20 68 65 6c 64  conch.** is held
23fc0 20 62 79 20 61 6e 6f 74 68 65 72 20 70 72 6f 63   by another proc
23fd0 65 73 73 20 28 77 69 74 68 20 61 20 73 68 61 72  ess (with a shar
23fe0 65 64 20 6c 6f 63 6b 29 2c 20 74 68 65 20 65 78  ed lock), the ex
23ff0 63 6c 75 73 69 76 65 20 6c 6f 63 6b 0a 2a 2a 20  clusive lock.** 
24000 77 69 6c 6c 20 66 61 69 6c 20 61 6e 64 20 53 51  will fail and SQ
24010 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74  LITE_BUSY is ret
24020 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  urned..**.** The
24030 20 70 72 6f 78 79 20 66 69 6c 65 20 2d 20 61 20   proxy file - a 
24040 73 69 6e 67 6c 65 2d 62 79 74 65 20 66 69 6c 65  single-byte file
24050 20 75 73 65 64 20 66 6f 72 20 61 6c 6c 20 61 64   used for all ad
24060 76 69 73 6f 72 79 20 66 69 6c 65 20 6c 6f 63 6b  visory file lock
24070 73 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20 74 61  s.** normally ta
24080 6b 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ken on the datab
24090 61 73 65 20 66 69 6c 65 2e 20 20 20 54 68 69 73  ase file.   This
240a0 20 61 6c 6c 6f 77 73 20 66 6f 72 20 73 61 66 65   allows for safe
240b0 20 73 68 61 72 69 6e 67 0a 2a 2a 20 6f 66 20 74   sharing.** of t
240c0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
240d0 20 66 6f 72 20 6d 75 6c 74 69 70 6c 65 20 72 65   for multiple re
240e0 61 64 65 72 73 20 61 6e 64 20 77 72 69 74 65 72  aders and writer
240f0 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 0a 2a 2a  s on the same.**
24100 20 68 6f 73 74 20 28 74 68 65 20 63 6f 6e 63 68   host (the conch
24110 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 74 68   ensures that th
24120 65 79 20 61 6c 6c 20 75 73 65 20 74 68 65 20 73  ey all use the s
24130 61 6d 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 20 66  ame local lock f
24140 69 6c 65 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72  ile)..**.** Ther
24150 65 20 69 73 20 61 20 74 68 69 72 64 20 66 69 6c  e is a third fil
24160 65 20 2d 20 74 68 65 20 68 6f 73 74 20 49 44 20  e - the host ID 
24170 66 69 6c 65 20 2d 20 75 73 65 64 20 61 73 20 61  file - used as a
24180 20 70 65 72 73 69 73 74 65 6e 74 20 72 65 63 6f   persistent reco
24190 72 64 0a 2a 2a 20 6f 66 20 61 20 75 6e 69 71 75  rd.** of a uniqu
241a0 65 20 69 64 65 6e 74 69 66 69 65 72 20 66 6f 72  e identifier for
241b0 20 74 68 65 20 68 6f 73 74 2c 20 61 20 31 32 38   the host, a 128
241c0 2d 62 79 74 65 20 75 6e 69 71 75 65 20 68 6f 73  -byte unique hos
241d0 74 20 69 64 20 66 69 6c 65 0a 2a 2a 20 69 6e 20  t id file.** in 
241e0 74 68 65 20 70 61 74 68 20 64 65 66 69 6e 65 64  the path defined
241f0 20 62 79 20 74 68 65 20 48 4f 53 54 49 44 50 41   by the HOSTIDPA
24200 54 48 20 6d 61 63 72 6f 20 28 64 65 66 61 75 6c  TH macro (defaul
24210 74 20 76 61 6c 75 65 20 69 73 0a 2a 2a 20 2f 4c  t value is.** /L
24220 69 62 72 61 72 79 2f 43 61 63 68 65 73 2f 2e 63  ibrary/Caches/.c
24230 6f 6d 2e 61 70 70 6c 65 2e 73 71 6c 69 74 65 43  om.apple.sqliteC
24240 6f 6e 63 68 48 6f 73 74 49 64 29 2e 0a 2a 2a 0a  onchHostId)..**.
24250 2a 2a 20 52 65 71 75 65 73 74 69 6e 67 20 74 68  ** Requesting th
24260 65 20 6c 6f 63 6b 20 70 72 6f 78 79 20 64 6f 65  e lock proxy doe
24270 73 20 6e 6f 74 20 69 6d 6d 65 64 69 61 74 65 6c  s not immediatel
24280 79 20 74 61 6b 65 20 74 68 65 20 63 6f 6e 63 68  y take the conch
24290 2c 20 69 74 20 69 73 0a 2a 2a 20 6f 6e 6c 79 20  , it is.** only 
242a0 74 61 6b 65 6e 20 77 68 65 6e 20 74 68 65 20 66  taken when the f
242b0 69 72 73 74 20 72 65 71 75 65 73 74 20 74 6f 20  irst request to 
242c0 6c 6f 63 6b 20 64 61 74 61 62 61 73 65 20 66 69  lock database fi
242d0 6c 65 20 69 73 20 6d 61 64 65 2e 20 20 0a 2a 2a  le is made.  .**
242e0 20 54 68 69 73 20 6d 61 74 63 68 65 73 20 74 68   This matches th
242f0 65 20 73 65 6d 61 6e 74 69 63 73 20 6f 66 20 74  e semantics of t
24300 68 65 20 74 72 61 64 69 74 69 6f 6e 61 6c 20 6c  he traditional l
24310 6f 63 6b 69 6e 67 20 62 65 68 61 76 69 6f 72 2c  ocking behavior,
24320 20 77 68 65 72 65 0a 2a 2a 20 6f 70 65 6e 69 6e   where.** openin
24330 67 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74  g a connection t
24340 6f 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  o a database fil
24350 65 20 64 6f 65 73 20 6e 6f 74 20 74 61 6b 65 20  e does not take 
24360 61 20 6c 6f 63 6b 20 6f 6e 20 69 74 2e 0a 2a 2a  a lock on it..**
24370 20 54 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b   The shared lock
24380 20 61 6e 64 20 61 6e 20 6f 70 65 6e 20 66 69 6c   and an open fil
24390 65 20 64 65 73 63 72 69 70 74 6f 72 20 61 72 65  e descriptor are
243a0 20 6d 61 69 6e 74 61 69 6e 65 64 20 75 6e 74 69   maintained unti
243b0 6c 20 0a 2a 2a 20 74 68 65 20 63 6f 6e 6e 65 63  l .** the connec
243c0 74 69 6f 6e 20 74 6f 20 74 68 65 20 64 61 74 61  tion to the data
243d0 62 61 73 65 20 69 73 20 63 6c 6f 73 65 64 2e 20  base is closed. 
243e0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79  .**.** The proxy
243f0 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 6c 6f   file and the lo
24400 63 6b 20 66 69 6c 65 20 61 72 65 20 6e 65 76 65  ck file are neve
24410 72 20 64 65 6c 65 74 65 64 20 73 6f 20 74 68 65  r deleted so the
24420 79 20 6f 6e 6c 79 20 6e 65 65 64 0a 2a 2a 20 74  y only need.** t
24430 6f 20 62 65 20 63 72 65 61 74 65 64 20 74 68 65  o be created the
24440 20 66 69 72 73 74 20 74 69 6d 65 20 74 68 65 79   first time they
24450 20 61 72 65 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a   are used..**.**
24460 20 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f   Configuration o
24470 70 74 69 6f 6e 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d  ptions.** ------
24480 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
24490 2a 2a 0a 2a 2a 20 20 53 51 4c 49 54 45 5f 50 52  **.**  SQLITE_PR
244a0 45 46 45 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49  EFER_PROXY_LOCKI
244b0 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 44  NG.**.**       D
244c0 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 61 63  atabase files ac
244d0 63 65 73 73 65 64 20 6f 6e 20 6e 6f 6e 2d 6c 6f  cessed on non-lo
244e0 63 61 6c 20 66 69 6c 65 20 73 79 73 74 65 6d 73  cal file systems
244f0 20 61 72 65 0a 2a 2a 20 20 20 20 20 20 20 61 75   are.**       au
24500 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6f 6e 66  tomatically conf
24510 69 67 75 72 65 64 20 66 6f 72 20 70 72 6f 78 79  igured for proxy
24520 20 6c 6f 63 6b 69 6e 67 2c 20 6c 6f 63 6b 20 66   locking, lock f
24530 69 6c 65 73 20 61 72 65 0a 2a 2a 20 20 20 20 20  iles are.**     
24540 20 20 6e 61 6d 65 64 20 61 75 74 6f 6d 61 74 69    named automati
24550 63 61 6c 6c 79 20 75 73 69 6e 67 20 74 68 65 20  cally using the 
24560 73 61 6d 65 20 6c 6f 67 69 63 20 61 73 0a 2a 2a  same logic as.**
24570 20 20 20 20 20 20 20 50 52 41 47 4d 41 20 6c 6f         PRAGMA lo
24580 63 6b 5f 70 72 6f 78 79 5f 66 69 6c 65 3d 22 3a  ck_proxy_file=":
24590 61 75 74 6f 3a 22 0a 2a 2a 20 20 20 20 0a 2a 2a  auto:".**    .**
245a0 20 20 53 51 4c 49 54 45 5f 50 52 4f 58 59 5f 44    SQLITE_PROXY_D
245b0 45 42 55 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  EBUG.**.**      
245c0 20 45 6e 61 62 6c 65 73 20 74 68 65 20 6c 6f 67   Enables the log
245d0 67 69 6e 67 20 6f 66 20 65 72 72 6f 72 20 6d 65  ging of error me
245e0 73 73 61 67 65 73 20 64 75 72 69 6e 67 20 68 6f  ssages during ho
245f0 73 74 20 69 64 20 66 69 6c 65 0a 2a 2a 20 20 20  st id file.**   
24600 20 20 20 20 72 65 74 72 69 65 76 61 6c 20 61 6e      retrieval an
24610 64 20 63 72 65 61 74 69 6f 6e 0a 2a 2a 0a 2a 2a  d creation.**.**
24620 20 20 48 4f 53 54 49 44 50 41 54 48 0a 2a 2a 0a    HOSTIDPATH.**.
24630 2a 2a 20 20 20 20 20 20 20 4f 76 65 72 72 69 64  **       Overrid
24640 65 73 20 74 68 65 20 64 65 66 61 75 6c 74 20 68  es the default h
24650 6f 73 74 20 49 44 20 66 69 6c 65 20 70 61 74 68  ost ID file path
24660 20 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 0a 2a 2a 20   location.**.** 
24670 20 4c 4f 43 4b 50 52 4f 58 59 44 49 52 0a 2a 2a   LOCKPROXYDIR.**
24680 0a 2a 2a 20 20 20 20 20 20 20 4f 76 65 72 72 69  .**       Overri
24690 64 65 73 20 74 68 65 20 64 65 66 61 75 6c 74 20  des the default 
246a0 64 69 72 65 63 74 6f 72 79 20 75 73 65 64 20 66  directory used f
246b0 6f 72 20 6c 6f 63 6b 20 70 72 6f 78 79 20 66 69  or lock proxy fi
246c0 6c 65 73 20 74 68 61 74 0a 2a 2a 20 20 20 20 20  les that.**     
246d0 20 20 61 72 65 20 6e 61 6d 65 64 20 61 75 74 6f    are named auto
246e0 6d 61 74 69 63 61 6c 6c 79 20 76 69 61 20 74 68  matically via th
246f0 65 20 22 3a 61 75 74 6f 3a 22 20 73 65 74 74 69  e ":auto:" setti
24700 6e 67 0a 2a 2a 0a 2a 2a 20 20 53 51 4c 49 54 45  ng.**.**  SQLITE
24710 5f 44 45 46 41 55 4c 54 5f 50 52 4f 58 59 44 49  _DEFAULT_PROXYDI
24720 52 5f 50 45 52 4d 49 53 53 49 4f 4e 53 0a 2a 2a  R_PERMISSIONS.**
24730 0a 2a 2a 20 20 20 20 20 20 20 50 65 72 6d 69 73  .**       Permis
24740 73 69 6f 6e 73 20 74 6f 20 75 73 65 20 77 68 65  sions to use whe
24750 6e 20 63 72 65 61 74 69 6e 67 20 61 20 64 69 72  n creating a dir
24760 65 63 74 6f 72 79 20 66 6f 72 20 73 74 6f 72 69  ectory for stori
24770 6e 67 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  ng the.**       
24780 6c 6f 63 6b 20 70 72 6f 78 79 20 66 69 6c 65 73  lock proxy files
24790 2c 20 6f 6e 6c 79 20 75 73 65 64 20 77 68 65 6e  , only used when
247a0 20 4c 4f 43 4b 50 52 4f 58 59 44 49 52 20 69 73   LOCKPROXYDIR is
247b0 20 6e 6f 74 20 73 65 74 2e 0a 2a 2a 20 20 20 20   not set..**    
247c0 0a 2a 2a 20 20 20 20 0a 2a 2a 20 41 73 20 6d 65  .**    .** As me
247d0 6e 74 69 6f 6e 65 64 20 61 62 6f 76 65 2c 20 77  ntioned above, w
247e0 68 65 6e 20 63 6f 6d 70 69 6c 65 64 20 77 69 74  hen compiled wit
247f0 68 20 53 51 4c 49 54 45 5f 50 52 45 46 45 52 5f  h SQLITE_PREFER_
24800 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 2c 0a 2a  PROXY_LOCKING,.*
24810 2a 20 73 65 74 74 69 6e 67 20 74 68 65 20 65 6e  * setting the en
24820 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62  vironment variab
24830 6c 65 20 53 51 4c 49 54 45 5f 46 4f 52 43 45 5f  le SQLITE_FORCE_
24840 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 20 74 6f  PROXY_LOCKING to
24850 20 31 20 77 69 6c 6c 0a 2a 2a 20 66 6f 72 63 65   1 will.** force
24860 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 74   proxy locking t
24870 6f 20 62 65 20 75 73 65 64 20 66 6f 72 20 65 76  o be used for ev
24880 65 72 79 20 64 61 74 61 62 61 73 65 20 66 69 6c  ery database fil
24890 65 20 6f 70 65 6e 65 64 2c 20 61 6e 64 20 30 0a  e opened, and 0.
248a0 2a 2a 20 77 69 6c 6c 20 66 6f 72 63 65 20 61 75  ** will force au
248b0 74 6f 6d 61 74 69 63 20 70 72 6f 78 79 20 6c 6f  tomatic proxy lo
248c0 63 6b 69 6e 67 20 74 6f 20 62 65 20 64 69 73 61  cking to be disa
248d0 62 6c 65 64 20 66 6f 72 20 61 6c 6c 20 64 61 74  bled for all dat
248e0 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 73 20 28  abase.** files (
248f0 65 78 70 6c 69 63 69 74 79 20 63 61 6c 6c 69 6e  explicity callin
24900 67 20 74 68 65 20 53 51 4c 49 54 45 5f 53 45 54  g the SQLITE_SET
24910 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 20 70  _LOCKPROXYFILE p
24920 72 61 67 6d 61 20 6f 72 0a 2a 2a 20 73 71 6c 69  ragma or.** sqli
24930 74 65 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20  te_file_control 
24940 41 50 49 20 69 73 20 6e 6f 74 20 61 66 66 65 63  API is not affec
24950 74 65 64 20 62 79 20 53 51 4c 49 54 45 5f 46 4f  ted by SQLITE_FO
24960 52 43 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e  RCE_PROXY_LOCKIN
24970 47 29 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 50 72  G)..*/../*.** Pr
24980 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6f  oxy locking is o
24990 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e  nly available on
249a0 20 4d 61 63 4f 53 58 20 0a 2a 2f 0a 23 69 66 20   MacOSX .*/.#if 
249b0 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
249c0 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  _) && SQLITE_ENA
249d0 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
249e0 45 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  E..#ifdef SQLITE
249f0 5f 54 45 53 54 0a 2f 2a 20 73 69 6d 75 6c 61 74  _TEST./* simulat
24a00 65 20 6d 75 6c 74 69 70 6c 65 20 68 6f 73 74 73  e multiple hosts
24a10 20 62 79 20 63 72 65 61 74 69 6e 67 20 75 6e 69   by creating uni
24a20 71 75 65 20 68 6f 73 74 69 64 20 66 69 6c 65 20  que hostid file 
24a30 70 61 74 68 73 20 2a 2f 0a 69 6e 74 20 73 71 6c  paths */.int sql
24a40 69 74 65 33 5f 68 6f 73 74 69 64 5f 6e 75 6d 20  ite3_hostid_num 
24a50 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  = 0;.#endif../*.
24a60 2a 2a 20 54 68 65 20 70 72 6f 78 79 4c 6f 63 6b  ** The proxyLock
24a70 69 6e 67 43 6f 6e 74 65 78 74 20 68 61 73 20 74  ingContext has t
24a80 68 65 20 70 61 74 68 20 61 6e 64 20 66 69 6c 65  he path and file
24a90 20 73 74 72 75 63 74 75 72 65 73 20 66 6f 72 20   structures for 
24aa0 74 68 65 20 72 65 6d 6f 74 65 20 0a 2a 2a 20 61  the remote .** a
24ab0 6e 64 20 6c 6f 63 61 6c 20 70 72 6f 78 79 20 66  nd local proxy f
24ac0 69 6c 65 73 20 69 6e 20 69 74 0a 2a 2f 0a 74 79  iles in it.*/.ty
24ad0 70 65 64 65 66 20 73 74 72 75 63 74 20 70 72 6f  pedef struct pro
24ae0 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  xyLockingContext
24af0 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e   proxyLockingCon
24b00 74 65 78 74 3b 0a 73 74 72 75 63 74 20 70 72 6f  text;.struct pro
24b10 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  xyLockingContext
24b20 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 63   {.  unixFile *c
24b30 6f 6e 63 68 46 69 6c 65 3b 20 20 20 20 20 20 20  onchFile;       
24b40 20 20 2f 2a 20 4f 70 65 6e 20 63 6f 6e 63 68 20    /* Open conch 
24b50 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  file */.  char *
24b60 63 6f 6e 63 68 46 69 6c 65 50 61 74 68 3b 20 20  conchFilePath;  
24b70 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
24b80 66 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65  f the conch file
24b90 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a   */.  unixFile *
24ba0 6c 6f 63 6b 50 72 6f 78 79 3b 20 20 20 20 20 20  lockProxy;      
24bb0 20 20 20 2f 2a 20 4f 70 65 6e 20 70 72 6f 78 79     /* Open proxy
24bc0 20 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a 20 20   lock file */.  
24bd0 63 68 61 72 20 2a 6c 6f 63 6b 50 72 6f 78 79 50  char *lockProxyP
24be0 61 74 68 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ath;         /* 
24bf0 4e 61 6d 65 20 6f 66 20 74 68 65 20 70 72 6f 78  Name of the prox
24c00 79 20 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a 20  y lock file */. 
24c10 20 63 68 61 72 20 2a 64 62 50 61 74 68 3b 20 20   char *dbPath;  
24c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24c30 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f 70 65   Name of the ope
24c40 6e 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  n file */.  int 
24c50 63 6f 6e 63 68 48 65 6c 64 3b 20 20 20 20 20 20  conchHeld;      
24c60 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
24c70 20 69 66 20 74 68 65 20 63 6f 6e 63 68 20 69 73   if the conch is
24c80 20 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 20   currently held 
24c90 2a 2f 0a 20 20 76 6f 69 64 20 2a 6f 6c 64 4c 6f  */.  void *oldLo
24ca0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20 20 20  ckingContext;   
24cb0 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 6c 6f    /* Original lo
24cc0 63 6b 69 6e 67 63 6f 6e 74 65 78 74 20 74 6f 20  ckingcontext to 
24cd0 72 65 73 74 6f 72 65 20 6f 6e 20 63 6c 6f 73 65  restore on close
24ce0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f   */.  sqlite3_io
24cf0 5f 6d 65 74 68 6f 64 73 20 63 6f 6e 73 74 20 2a  _methods const *
24d00 70 4f 6c 64 4d 65 74 68 6f 64 3b 20 20 20 20 20  pOldMethod;     
24d10 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 49 2f 4f 20  /* Original I/O 
24d20 6d 65 74 68 6f 64 73 20 66 6f 72 20 63 6c 6f 73  methods for clos
24d30 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 48 4f 53 54  e */.};../* HOST
24d40 49 44 4c 45 4e 20 61 6e 64 20 43 4f 4e 43 48 4c  IDLEN and CONCHL
24d50 45 4e 20 62 6f 74 68 20 69 6e 63 6c 75 64 65 20  EN both include 
24d60 73 70 61 63 65 20 66 6f 72 20 74 68 65 20 73 74  space for the st
24d70 72 69 6e 67 20 0a 2a 2a 20 74 65 72 6d 69 6e 61  ring .** termina
24d80 74 69 6e 67 20 6e 75 6c 20 0a 2a 2f 0a 23 64 65  ting nul .*/.#de
24d90 66 69 6e 65 20 48 4f 53 54 49 44 4c 45 4e 20 20  fine HOSTIDLEN  
24da0 20 20 20 20 20 20 20 31 32 38 0a 23 64 65 66 69         128.#defi
24db0 6e 65 20 43 4f 4e 43 48 4c 45 4e 20 20 20 20 20  ne CONCHLEN     
24dc0 20 20 20 20 20 28 4d 41 58 50 41 54 48 4c 45 4e       (MAXPATHLEN
24dd0 2b 48 4f 53 54 49 44 4c 45 4e 2b 31 29 0a 23 69  +HOSTIDLEN+1).#i
24de0 66 6e 64 65 66 20 48 4f 53 54 49 44 50 41 54 48  fndef HOSTIDPATH
24df0 0a 23 20 64 65 66 69 6e 65 20 48 4f 53 54 49 44  .# define HOSTID
24e00 50 41 54 48 20 20 20 20 20 20 20 22 2f 4c 69 62  PATH       "/Lib
24e10 72 61 72 79 2f 43 61 63 68 65 73 2f 2e 63 6f 6d  rary/Caches/.com
24e20 2e 61 70 70 6c 65 2e 73 71 6c 69 74 65 43 6f 6e  .apple.sqliteCon
24e30 63 68 48 6f 73 74 49 64 22 0a 23 65 6e 64 69 66  chHostId".#endif
24e40 0a 0a 2f 2a 20 62 61 73 69 63 61 6c 6c 79 20 61  ../* basically a
24e50 20 63 6f 70 79 20 6f 66 20 75 6e 69 78 52 61 6e   copy of unixRan
24e60 64 6f 6d 6e 65 73 73 20 77 69 74 68 20 64 69 66  domness with dif
24e70 66 65 72 65 6e 74 0a 2a 2a 20 74 65 73 74 20 62  ferent.** test b
24e80 65 68 61 76 69 6f 72 20 62 75 69 6c 74 20 69 6e  ehavior built in
24e90 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70   */.static int p
24ea0 72 6f 78 79 47 65 6e 65 72 61 74 65 48 6f 73 74  roxyGenerateHost
24eb0 49 44 28 63 68 61 72 20 2a 70 48 6f 73 74 49 44  ID(char *pHostID
24ec0 29 7b 0a 20 20 69 6e 74 20 70 69 64 2c 20 66 64  ){.  int pid, fd
24ed0 2c 20 6c 65 6e 3b 0a 20 20 75 6e 73 69 67 6e 65  , len;.  unsigne
24ee0 64 20 63 68 61 72 20 2a 6b 65 79 20 3d 20 28 75  d char *key = (u
24ef0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70  nsigned char *)p
24f00 48 6f 73 74 49 44 3b 0a 20 20 0a 20 20 6d 65 6d  HostID;.  .  mem
24f10 73 65 74 28 6b 65 79 2c 20 30 2c 20 48 4f 53 54  set(key, 0, HOST
24f20 49 44 4c 45 4e 29 3b 0a 20 20 6c 65 6e 20 3d 20  IDLEN);.  len = 
24f30 30 3b 0a 20 20 66 64 20 3d 20 6f 70 65 6e 28 22  0;.  fd = open("
24f40 2f 64 65 76 2f 75 72 61 6e 64 6f 6d 22 2c 20 4f  /dev/urandom", O
24f50 5f 52 44 4f 4e 4c 59 29 3b 0a 20 20 69 66 28 20  _RDONLY);.  if( 
24f60 66 64 3e 3d 30 20 29 7b 0a 20 20 20 20 6c 65 6e  fd>=0 ){.    len
24f70 20 3d 20 72 65 61 64 28 66 64 2c 20 6b 65 79 2c   = read(fd, key,
24f80 20 48 4f 53 54 49 44 4c 45 4e 29 3b 0a 20 20 20   HOSTIDLEN);.   
24f90 20 63 6c 6f 73 65 28 66 64 29 3b 20 2f 2a 20 73   close(fd); /* s
24fa0 69 6c 65 6e 74 6c 79 20 6c 65 61 6b 20 74 68 65  ilently leak the
24fb0 20 66 64 20 69 66 20 69 74 20 66 61 69 6c 73 20   fd if it fails 
24fc0 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 6c 65 6e  */.  }.  if( len
24fd0 20 3c 20 48 4f 53 54 49 44 4c 45 4e 20 29 7b 0a   < HOSTIDLEN ){.
24fe0 20 20 20 20 74 69 6d 65 5f 74 20 74 3b 0a 20 20      time_t t;.  
24ff0 20 20 74 69 6d 65 28 26 74 29 3b 0a 20 20 20 20    time(&t);.    
25000 6d 65 6d 63 70 79 28 6b 65 79 2c 20 26 74 2c 20  memcpy(key, &t, 
25010 73 69 7a 65 6f 66 28 74 29 29 3b 0a 20 20 20 20  sizeof(t));.    
25020 70 69 64 20 3d 20 67 65 74 70 69 64 28 29 3b 0a  pid = getpid();.
25030 20 20 20 20 6d 65 6d 63 70 79 28 26 6b 65 79 5b      memcpy(&key[
25040 73 69 7a 65 6f 66 28 74 29 5d 2c 20 26 70 69 64  sizeof(t)], &pid
25050 2c 20 73 69 7a 65 6f 66 28 70 69 64 29 29 3b 0a  , sizeof(pid));.
25060 20 20 7d 0a 20 20 0a 23 69 66 64 65 66 20 4d 41    }.  .#ifdef MA
25070 4b 45 5f 50 52 45 54 54 59 5f 48 4f 53 54 49 44  KE_PRETTY_HOSTID
25080 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  .  {.    int i;.
25090 20 20 20 20 2f 2a 20 66 69 6c 74 65 72 20 74 68      /* filter th
250a0 65 20 62 79 74 65 73 20 69 6e 74 6f 20 70 72 69  e bytes into pri
250b0 6e 74 61 62 6c 65 20 61 73 63 69 69 20 63 68 61  ntable ascii cha
250c0 72 61 63 74 65 72 73 20 61 6e 64 20 4e 55 4c 20  racters and NUL 
250d0 74 65 72 6d 69 6e 61 74 65 20 2a 2f 0a 20 20 20  terminate */.   
250e0 20 6b 65 79 5b 28 48 4f 53 54 49 44 4c 45 4e 2d   key[(HOSTIDLEN-
250f0 31 29 5d 20 3d 20 30 78 30 30 3b 0a 20 20 20 20  1)] = 0x00;.    
25100 66 6f 72 28 20 69 3d 30 3b 20 69 3c 28 48 4f 53  for( i=0; i<(HOS
25110 54 49 44 4c 45 4e 2d 31 29 3b 20 69 2b 2b 20 29  TIDLEN-1); i++ )
25120 7b 0a 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64  {.      unsigned
25130 20 63 68 61 72 20 70 61 20 3d 20 6b 65 79 5b 69   char pa = key[i
25140 5d 26 30 78 37 46 3b 0a 20 20 20 20 20 20 69 66  ]&0x7F;.      if
25150 28 20 70 61 3c 30 78 32 30 20 29 7b 0a 20 20 20  ( pa<0x20 ){.   
25160 20 20 20 20 20 6b 65 79 5b 69 5d 20 3d 20 28 6b       key[i] = (k
25170 65 79 5b 69 5d 26 30 78 38 30 20 3d 3d 20 30 78  ey[i]&0x80 == 0x
25180 38 30 29 20 3f 20 70 61 2b 30 78 34 30 20 3a 20  80) ? pa+0x40 : 
25190 70 61 2b 30 78 32 30 3b 0a 20 20 20 20 20 20 7d  pa+0x20;.      }
251a0 65 6c 73 65 20 69 66 28 20 70 61 3d 3d 30 78 37  else if( pa==0x7
251b0 46 20 29 7b 0a 20 20 20 20 20 20 20 20 6b 65 79  F ){.        key
251c0 5b 69 5d 20 3d 20 28 6b 65 79 5b 69 5d 26 30 78  [i] = (key[i]&0x
251d0 38 30 20 3d 3d 20 30 78 38 30 29 20 3f 20 70 61  80 == 0x80) ? pa
251e0 3d 30 78 32 30 20 3a 20 70 61 2b 30 78 37 45 3b  =0x20 : pa+0x7E;
251f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
25200 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75   }.#endif.  retu
25210 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
25220 0a 2f 2a 20 77 72 69 74 65 73 20 74 68 65 20 68  ./* writes the h
25230 6f 73 74 20 69 64 20 70 61 74 68 20 74 6f 20 70  ost id path to p
25240 61 74 68 2c 20 70 61 74 68 20 73 68 6f 75 6c 64  ath, path should
25250 20 62 65 20 61 6e 20 70 72 65 2d 61 6c 6c 6f 63   be an pre-alloc
25260 61 74 65 64 20 62 75 66 66 65 72 0a 2a 2a 20 77  ated buffer.** w
25270 69 74 68 20 65 6e 6f 75 67 68 20 73 70 61 63 65  ith enough space
25280 20 66 6f 72 20 61 20 70 61 74 68 20 0a 2a 2f 0a   for a path .*/.
25290 73 74 61 74 69 63 20 76 6f 69 64 20 70 72 6f 78  static void prox
252a0 79 47 65 74 48 6f 73 74 49 44 50 61 74 68 28 63  yGetHostIDPath(c
252b0 68 61 72 20 2a 70 61 74 68 2c 20 73 69 7a 65 5f  har *path, size_
252c0 74 20 6c 65 6e 29 7b 0a 20 20 73 74 72 6c 63 70  t len){.  strlcp
252d0 79 28 70 61 74 68 2c 20 48 4f 53 54 49 44 50 41  y(path, HOSTIDPA
252e0 54 48 2c 20 6c 65 6e 29 3b 0a 23 69 66 64 65 66  TH, len);.#ifdef
252f0 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69   SQLITE_TEST.  i
25300 66 28 20 73 71 6c 69 74 65 33 5f 68 6f 73 74 69  f( sqlite3_hosti
25310 64 5f 6e 75 6d 3e 30 20 29 7b 0a 20 20 20 20 63  d_num>0 ){.    c
25320 68 61 72 20 73 75 66 66 69 78 5b 32 5d 20 3d 20  har suffix[2] = 
25330 22 31 22 3b 0a 20 20 20 20 73 75 66 66 69 78 5b  "1";.    suffix[
25340 30 5d 20 3d 20 73 75 66 66 69 78 5b 30 5d 20 2b  0] = suffix[0] +
25350 20 73 71 6c 69 74 65 33 5f 68 6f 73 74 69 64 5f   sqlite3_hostid_
25360 6e 75 6d 3b 0a 20 20 20 20 73 74 72 6c 63 61 74  num;.    strlcat
25370 28 70 61 74 68 2c 20 73 75 66 66 69 78 2c 20 6c  (path, suffix, l
25380 65 6e 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  en);.  }.#endif.
25390 20 20 4f 53 54 52 41 43 45 33 28 22 47 45 54 48    OSTRACE3("GETH
253a0 4f 53 54 49 44 50 41 54 48 20 20 25 73 20 70 69  OSTIDPATH  %s pi
253b0 64 3d 25 64 5c 6e 22 2c 20 70 61 74 68 2c 20 67  d=%d\n", path, g
253c0 65 74 70 69 64 28 29 29 3b 0a 7d 0a 0a 2f 2a 20  etpid());.}../* 
253d0 67 65 74 20 74 68 65 20 68 6f 73 74 20 49 44 20  get the host ID 
253e0 66 72 6f 6d 20 61 20 73 71 6c 69 74 65 20 68 6f  from a sqlite ho
253f0 73 74 69 64 20 66 69 6c 65 20 73 74 6f 72 65 64  stid file stored
25400 20 69 6e 20 74 68 65 20 0a 2a 2a 20 75 73 65 72   in the .** user
25410 2d 73 70 65 63 69 66 69 63 20 74 6d 70 20 64 69  -specific tmp di
25420 72 65 63 74 6f 72 79 2c 20 63 72 65 61 74 65 20  rectory, create 
25430 74 68 65 20 49 44 20 69 66 20 69 74 27 73 20 6e  the ID if it's n
25440 6f 74 20 74 68 65 72 65 20 61 6c 72 65 61 64 79  ot there already
25450 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20   .*/.static int 
25460 70 72 6f 78 79 47 65 74 48 6f 73 74 49 44 28 63  proxyGetHostID(c
25470 68 61 72 20 2a 70 48 6f 73 74 49 44 2c 20 69 6e  har *pHostID, in
25480 74 20 2a 70 45 72 72 6f 72 29 7b 0a 20 20 69 6e  t *pError){.  in
25490 74 20 66 64 3b 0a 20 20 63 68 61 72 20 70 61 74  t fd;.  char pat
254a0 68 5b 4d 41 58 50 41 54 48 4c 45 4e 5d 3b 20 0a  h[MAXPATHLEN]; .
254b0 20 20 73 69 7a 65 5f 74 20 6c 65 6e 3b 0a 20 20    size_t len;.  
254c0 69 6e 74 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b  int rc=SQLITE_OK
254d0 3b 0a 0a 20 20 70 72 6f 78 79 47 65 74 48 6f 73  ;..  proxyGetHos
254e0 74 49 44 50 61 74 68 28 70 61 74 68 2c 20 4d 41  tIDPath(path, MA
254f0 58 50 41 54 48 4c 45 4e 29 3b 0a 20 20 2f 2a 20  XPATHLEN);.  /* 
25500 74 72 79 20 74 6f 20 63 72 65 61 74 65 20 74 68  try to create th
25510 65 20 68 6f 73 74 20 49 44 20 66 69 6c 65 2c 20  e host ID file, 
25520 69 66 20 69 74 20 61 6c 72 65 61 64 79 20 65 78  if it already ex
25530 69 73 74 73 20 72 65 61 64 20 74 68 65 20 63 6f  ists read the co
25540 6e 74 65 6e 74 73 20 2a 2f 0a 20 20 66 64 20 3d  ntents */.  fd =
25550 20 6f 70 65 6e 28 70 61 74 68 2c 20 4f 5f 43 52   open(path, O_CR
25560 45 41 54 7c 4f 5f 57 52 4f 4e 4c 59 7c 4f 5f 45  EAT|O_WRONLY|O_E
25570 58 43 4c 2c 20 30 36 34 34 29 3b 0a 20 20 69 66  XCL, 0644);.  if
25580 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 69 6e  ( fd<0 ){.    in
25590 74 20 65 72 72 3d 65 72 72 6e 6f 3b 0a 09 09 0a  t err=errno;....
255a0 20 20 20 20 69 66 28 20 65 72 72 21 3d 45 45 58      if( err!=EEX
255b0 49 53 54 20 29 7b 0a 23 69 66 64 65 66 20 53 51  IST ){.#ifdef SQ
255c0 4c 49 54 45 5f 50 52 4f 58 59 5f 44 45 42 55 47  LITE_PROXY_DEBUG
255d0 20 2f 2a 20 73 65 74 20 74 68 65 20 73 71 6c 69   /* set the sqli
255e0 74 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  te error message
255f0 20 69 6e 73 74 65 61 64 20 2a 2f 0a 20 20 20 20   instead */.    
25600 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
25610 2c 20 22 73 71 6c 69 74 65 20 65 72 72 6f 72 20  , "sqlite error 
25620 63 72 65 61 74 69 6e 67 20 68 6f 73 74 20 49 44  creating host ID
25630 20 66 69 6c 65 20 25 73 3a 20 25 73 5c 6e 22 2c   file %s: %s\n",
25640 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
25650 61 74 68 2c 20 73 74 72 65 72 72 6f 72 28 65 72  ath, strerror(er
25660 72 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  r));.#endif.    
25670 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
25680 50 45 52 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  PERM;.    }.    
25690 2f 2a 20 63 6f 75 6c 64 6e 27 74 20 63 72 65 61  /* couldn't crea
256a0 74 65 20 74 68 65 20 66 69 6c 65 2c 20 72 65 61  te the file, rea
256b0 64 20 69 74 20 69 6e 73 74 65 61 64 20 2a 2f 0a  d it instead */.
256c0 20 20 20 20 66 64 20 3d 20 6f 70 65 6e 28 70 61      fd = open(pa
256d0 74 68 2c 20 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f 45  th, O_RDONLY|O_E
256e0 58 43 4c 29 3b 0a 20 20 20 20 69 66 28 20 66 64  XCL);.    if( fd
256f0 3c 30 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  <0 ){.#ifdef SQL
25700 49 54 45 5f 50 52 4f 58 59 5f 44 45 42 55 47 20  ITE_PROXY_DEBUG 
25710 2f 2a 20 73 65 74 20 74 68 65 20 73 71 6c 69 74  /* set the sqlit
25720 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  e error message 
25730 69 6e 73 74 65 61 64 20 2a 2f 0a 20 20 20 20 20  instead */.     
25740 20 69 6e 74 20 65 72 72 20 3d 20 65 72 72 6e 6f   int err = errno
25750 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  ;.      fprintf(
25760 73 74 64 65 72 72 2c 20 22 73 71 6c 69 74 65 20  stderr, "sqlite 
25770 65 72 72 6f 72 20 6f 70 65 6e 69 6e 67 20 68 6f  error opening ho
25780 73 74 20 49 44 20 66 69 6c 65 20 25 73 3a 20 25  st ID file %s: %
25790 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\n",.          
257a0 20 20 20 20 70 61 74 68 2c 20 73 74 72 65 72 72      path, strerr
257b0 6f 72 28 65 72 72 29 29 3b 0a 23 65 6e 64 69 66  or(err));.#endif
257c0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
257d0 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20 20 20 7d  LITE_PERM;.    }
257e0 0a 20 20 20 20 6c 65 6e 20 3d 20 70 72 65 61 64  .    len = pread
257f0 28 66 64 2c 20 70 48 6f 73 74 49 44 2c 20 48 4f  (fd, pHostID, HO
25800 53 54 49 44 4c 45 4e 2c 20 30 29 3b 0a 20 20 20  STIDLEN, 0);.   
25810 20 69 66 28 20 6c 65 6e 3c 30 20 29 7b 0a 20 20   if( len<0 ){.  
25820 20 20 20 20 2a 70 45 72 72 6f 72 20 3d 20 65 72      *pError = er
25830 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  rno;.      rc = 
25840 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45 41  SQLITE_IOERR_REA
25850 44 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  D;.    }else if(
25860 20 6c 65 6e 3c 48 4f 53 54 49 44 4c 45 4e 20 29   len<HOSTIDLEN )
25870 7b 0a 20 20 20 20 20 20 2a 70 45 72 72 6f 72 20  {.      *pError 
25880 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = 0;.      rc = 
25890 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f  SQLITE_IOERR_SHO
258a0 52 54 5f 52 45 41 44 3b 0a 20 20 20 20 7d 0a 20  RT_READ;.    }. 
258b0 20 20 20 63 6c 6f 73 65 28 66 64 29 3b 20 2f 2a     close(fd); /*
258c0 20 73 69 6c 65 6e 74 6c 79 20 6c 65 61 6b 20 74   silently leak t
258d0 68 65 20 66 64 20 69 66 20 69 74 20 66 61 69 6c  he fd if it fail
258e0 73 20 2a 2f 0a 20 20 20 20 4f 53 54 52 41 43 45  s */.    OSTRACE
258f0 33 28 22 47 45 54 48 4f 53 54 49 44 20 20 72 65  3("GETHOSTID  re
25900 61 64 20 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c  ad %s pid=%d\n",
25910 20 70 48 6f 73 74 49 44 2c 20 67 65 74 70 69 64   pHostID, getpid
25920 28 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ());.    return 
25930 72 63 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  rc;.  }else{.   
25940 20 2f 2a 20 77 65 27 72 65 20 63 72 65 61 74 69   /* we're creati
25950 6e 67 20 74 68 65 20 68 6f 73 74 20 49 44 20 66  ng the host ID f
25960 69 6c 65 20 28 75 73 65 20 61 20 72 61 6e 64 6f  ile (use a rando
25970 6d 20 73 74 72 69 6e 67 20 6f 66 20 62 79 74 65  m string of byte
25980 73 29 20 2a 2f 0a 20 20 20 20 70 72 6f 78 79 47  s) */.    proxyG
25990 65 6e 65 72 61 74 65 48 6f 73 74 49 44 28 70 48  enerateHostID(pH
259a0 6f 73 74 49 44 29 3b 0a 20 20 20 20 6c 65 6e 20  ostID);.    len 
259b0 3d 20 70 77 72 69 74 65 28 66 64 2c 20 70 48 6f  = pwrite(fd, pHo
259c0 73 74 49 44 2c 20 48 4f 53 54 49 44 4c 45 4e 2c  stID, HOSTIDLEN,
259d0 20 30 29 3b 0a 20 20 20 20 69 66 28 20 6c 65 6e   0);.    if( len
259e0 3c 30 20 29 7b 0a 20 20 20 20 20 20 2a 70 45 72  <0 ){.      *pEr
259f0 72 6f 72 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  ror = errno;.   
25a00 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
25a10 4f 45 52 52 5f 57 52 49 54 45 3b 0a 20 20 20 20  OERR_WRITE;.    
25a20 7d 65 6c 73 65 20 69 66 28 20 6c 65 6e 3c 48 4f  }else if( len<HO
25a30 53 54 49 44 4c 45 4e 20 29 7b 0a 20 20 20 20 20  STIDLEN ){.     
25a40 20 2a 70 45 72 72 6f 72 20 3d 20 30 3b 0a 20 20   *pError = 0;.  
25a50 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
25a60 49 4f 45 52 52 5f 57 52 49 54 45 3b 0a 20 20 20  IOERR_WRITE;.   
25a70 20 7d 0a 20 20 20 20 63 6c 6f 73 65 28 66 64 29   }.    close(fd)
25a80 3b 20 2f 2a 20 73 69 6c 65 6e 74 6c 79 20 6c 65  ; /* silently le
25a90 61 6b 20 74 68 65 20 66 64 20 69 66 20 69 74 20  ak the fd if it 
25aa0 66 61 69 6c 73 20 2a 2f 0a 20 20 20 20 4f 53 54  fails */.    OST
25ab0 52 41 43 45 33 28 22 47 45 54 48 4f 53 54 49 44  RACE3("GETHOSTID
25ac0 20 20 77 72 6f 74 65 20 25 73 20 70 69 64 3d 25    wrote %s pid=%
25ad0 64 5c 6e 22 2c 20 70 48 6f 73 74 49 44 2c 20 67  d\n", pHostID, g
25ae0 65 74 70 69 64 28 29 29 3b 0a 20 20 20 20 72 65  etpid());.    re
25af0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 7d 0a 0a  turn rc;.  }.}..
25b00 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
25b10 47 65 74 4c 6f 63 6b 50 61 74 68 28 63 6f 6e 73  GetLockPath(cons
25b20 74 20 63 68 61 72 20 2a 64 62 50 61 74 68 2c 20  t char *dbPath, 
25b30 63 68 61 72 20 2a 6c 50 61 74 68 2c 20 73 69 7a  char *lPath, siz
25b40 65 5f 74 20 6d 61 78 4c 65 6e 29 7b 0a 20 20 69  e_t maxLen){.  i
25b50 6e 74 20 6c 65 6e 3b 0a 20 20 69 6e 74 20 64 62  nt len;.  int db
25b60 4c 65 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 23  Len;.  int i;..#
25b70 69 66 64 65 66 20 4c 4f 43 4b 50 52 4f 58 59 44  ifdef LOCKPROXYD
25b80 49 52 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c 63  IR.  len = strlc
25b90 70 79 28 6c 50 61 74 68 2c 20 4c 4f 43 4b 50 52  py(lPath, LOCKPR
25ba0 4f 58 59 44 49 52 2c 20 6d 61 78 4c 65 6e 29 3b  OXYDIR, maxLen);
25bb0 0a 23 65 6c 73 65 0a 23 20 69 66 64 65 66 20 5f  .#else.# ifdef _
25bc0 43 53 5f 44 41 52 57 49 4e 5f 55 53 45 52 5f 54  CS_DARWIN_USER_T
25bd0 45 4d 50 5f 44 49 52 0a 20 20 7b 0a 20 20 20 20  EMP_DIR.  {.    
25be0 63 6f 6e 66 73 74 72 28 5f 43 53 5f 44 41 52 57  confstr(_CS_DARW
25bf0 49 4e 5f 55 53 45 52 5f 54 45 4d 50 5f 44 49 52  IN_USER_TEMP_DIR
25c00 2c 20 6c 50 61 74 68 2c 20 6d 61 78 4c 65 6e 29  , lPath, maxLen)
25c10 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 73 74 72 6c  ;.    len = strl
25c20 63 61 74 28 6c 50 61 74 68 2c 20 22 73 71 6c 69  cat(lPath, "sqli
25c30 74 65 70 6c 6f 63 6b 73 22 2c 20 6d 61 78 4c 65  teplocks", maxLe
25c40 6e 29 3b 0a 20 20 20 20 69 66 28 20 6d 6b 64 69  n);.    if( mkdi
25c50 72 28 6c 50 61 74 68 2c 20 53 51 4c 49 54 45 5f  r(lPath, SQLITE_
25c60 44 45 46 41 55 4c 54 5f 50 52 4f 58 59 44 49 52  DEFAULT_PROXYDIR
25c70 5f 50 45 52 4d 49 53 53 49 4f 4e 53 29 20 29 7b  _PERMISSIONS) ){
25c80 0a 20 20 20 20 20 20 2f 2a 20 69 66 20 6d 6b 64  .      /* if mkd
25c90 69 72 20 66 61 69 6c 73 2c 20 68 61 6e 64 6c 65  ir fails, handle
25ca0 20 61 73 20 6c 6f 63 6b 20 66 69 6c 65 20 63 72   as lock file cr
25cb0 65 61 74 69 6f 6e 20 66 61 69 6c 75 72 65 20 2a  eation failure *
25cc0 2f 0a 23 20 20 69 66 64 65 66 20 53 51 4c 49 54  /.#  ifdef SQLIT
25cd0 45 5f 44 45 42 55 47 0a 20 20 20 20 20 20 69 6e  E_DEBUG.      in
25ce0 74 20 65 72 72 20 3d 20 65 72 72 6e 6f 3b 0a 20  t err = errno;. 
25cf0 20 20 20 20 20 69 66 28 20 65 72 72 21 3d 45 45       if( err!=EE
25d00 58 49 53 54 20 29 7b 0a 20 20 20 20 20 20 20 20  XIST ){.        
25d10 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  fprintf(stderr, 
25d20 22 70 72 6f 78 79 47 65 74 4c 6f 63 6b 50 61 74  "proxyGetLockPat
25d30 68 3a 20 6d 6b 64 69 72 28 25 73 2c 30 25 6f 29  h: mkdir(%s,0%o)
25d40 20 65 72 72 6f 72 20 25 64 20 25 73 5c 6e 22 2c   error %d %s\n",
25d50 20 6c 50 61 74 68 2c 0a 20 20 20 20 20 20 20 20   lPath,.        
25d60 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 44          SQLITE_D
25d70 45 46 41 55 4c 54 5f 50 52 4f 58 59 44 49 52 5f  EFAULT_PROXYDIR_
25d80 50 45 52 4d 49 53 53 49 4f 4e 53 2c 20 65 72 72  PERMISSIONS, err
25d90 2c 20 73 74 72 65 72 72 6f 72 28 65 72 72 29 29  , strerror(err))
25da0 3b 0a 20 20 20 20 20 20 7d 0a 23 20 20 65 6e 64  ;.      }.#  end
25db0 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  if.    }else{.  
25dc0 20 20 20 20 4f 53 54 52 41 43 45 33 28 22 47 45      OSTRACE3("GE
25dd0 54 4c 4f 43 4b 50 41 54 48 20 20 6d 6b 64 69 72  TLOCKPATH  mkdir
25de0 20 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c 20 6c   %s pid=%d\n", l
25df0 50 61 74 68 2c 20 67 65 74 70 69 64 28 29 29 3b  Path, getpid());
25e00 0a 20 20 20 20 7d 0a 20 20 20 20 0a 20 20 7d 0a  .    }.    .  }.
25e10 23 20 65 6c 73 65 0a 20 20 6c 65 6e 20 3d 20 73  # else.  len = s
25e20 74 72 6c 63 70 79 28 6c 50 61 74 68 2c 20 22 2f  trlcpy(lPath, "/
25e30 74 6d 70 2f 22 2c 20 6d 61 78 4c 65 6e 29 3b 0a  tmp/", maxLen);.
25e40 23 20 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a  # endif.#endif..
25e50 20 20 69 66 28 20 6c 50 61 74 68 5b 6c 65 6e 2d    if( lPath[len-
25e60 31 5d 21 3d 27 2f 27 20 29 7b 0a 20 20 20 20 6c  1]!='/' ){.    l
25e70 65 6e 20 3d 20 73 74 72 6c 63 61 74 28 6c 50 61  en = strlcat(lPa
25e80 74 68 2c 20 22 2f 22 2c 20 6d 61 78 4c 65 6e 29  th, "/", maxLen)
25e90 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 74 72  ;.  }.  .  /* tr
25ea0 61 6e 73 66 6f 72 6d 20 74 68 65 20 64 62 20 70  ansform the db p
25eb0 61 74 68 20 74 6f 20 61 20 75 6e 69 71 75 65 20  ath to a unique 
25ec0 63 61 63 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20  cache name */.  
25ed0 64 62 4c 65 6e 20 3d 20 28 69 6e 74 29 73 74 72  dbLen = (int)str
25ee0 6c 65 6e 28 64 62 50 61 74 68 29 3b 0a 20 20 66  len(dbPath);.  f
25ef0 6f 72 28 20 69 3d 30 3b 20 69 3c 64 62 4c 65 6e  or( i=0; i<dbLen
25f00 20 26 26 20 28 69 2b 6c 65 6e 2b 37 29 3c 6d 61   && (i+len+7)<ma
25f10 78 4c 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  xLen; i++){.    
25f20 63 68 61 72 20 63 20 3d 20 64 62 50 61 74 68 5b  char c = dbPath[
25f30 69 5d 3b 0a 20 20 20 20 6c 50 61 74 68 5b 69 2b  i];.    lPath[i+
25f40 6c 65 6e 5d 20 3d 20 28 63 3d 3d 27 2f 27 29 3f  len] = (c=='/')?
25f50 27 5f 27 3a 63 3b 0a 20 20 7d 0a 20 20 6c 50 61  '_':c;.  }.  lPa
25f60 74 68 5b 69 2b 6c 65 6e 5d 3d 27 5c 30 27 3b 0a  th[i+len]='\0';.
25f70 20 20 73 74 72 6c 63 61 74 28 6c 50 61 74 68 2c    strlcat(lPath,
25f80 20 22 3a 61 75 74 6f 3a 22 2c 20 6d 61 78 4c 65   ":auto:", maxLe
25f90 6e 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  n);.  return SQL
25fa0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
25fb0 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 56 46   Create a new VF
25fc0 53 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  S file descripto
25fd0 72 20 28 73 74 6f 72 65 64 20 69 6e 20 6d 65 6d  r (stored in mem
25fe0 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ory obtained fro
25ff0 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c  m.** sqlite3_mal
26000 6c 6f 63 29 20 61 6e 64 20 6f 70 65 6e 20 74 68  loc) and open th
26010 65 20 66 69 6c 65 20 6e 61 6d 65 64 20 22 70 61  e file named "pa
26020 74 68 22 20 69 6e 20 74 68 65 20 66 69 6c 65 20  th" in the file 
26030 64 65 73 63 72 69 70 74 6f 72 2e 0a 2a 2a 0a 2a  descriptor..**.*
26040 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 69 73 20  * The caller is 
26050 72 65 73 70 6f 6e 73 69 62 6c 65 20 6e 6f 74 20  responsible not 
26060 6f 6e 6c 79 20 66 6f 72 20 63 6c 6f 73 69 6e 67  only for closing
26070 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
26080 70 74 6f 72 0a 2a 2a 20 62 75 74 20 61 6c 73 6f  ptor.** but also
26090 20 66 6f 72 20 66 72 65 65 69 6e 67 20 74 68 65   for freeing the
260a0 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74   memory associat
260b0 65 64 20 77 69 74 68 20 74 68 65 20 66 69 6c 65  ed with the file
260c0 20 64 65 73 63 72 69 70 74 6f 72 2e 0a 2a 2f 0a   descriptor..*/.
260d0 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
260e0 43 72 65 61 74 65 55 6e 69 78 46 69 6c 65 28 63  CreateUnixFile(c
260f0 6f 6e 73 74 20 63 68 61 72 20 2a 70 61 74 68 2c  onst char *path,
26100 20 75 6e 69 78 46 69 6c 65 20 2a 2a 70 70 46 69   unixFile **ppFi
26110 6c 65 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65  le) {.  unixFile
26120 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 66 6c   *pNew;.  int fl
26130 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45  ags = SQLITE_OPE
26140 4e 5f 4d 41 49 4e 5f 44 42 7c 53 51 4c 49 54 45  N_MAIN_DB|SQLITE
26150 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c 53 51 4c  _OPEN_CREATE|SQL
26160 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
26170 54 45 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  TE;.  int rc = S
26180 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73 71 6c 69  QLITE_OK;.  sqli
26190 74 65 33 5f 76 66 73 20 64 75 6d 6d 79 56 66 73  te3_vfs dummyVfs
261a0 3b 0a 0a 20 20 70 4e 65 77 20 3d 20 28 75 6e 69  ;..  pNew = (uni
261b0 78 46 69 6c 65 20 2a 29 73 71 6c 69 74 65 33 5f  xFile *)sqlite3_
261c0 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 75 6e  malloc(sizeof(un
261d0 69 78 46 69 6c 65 29 29 3b 0a 20 20 69 66 28 20  ixFile));.  if( 
261e0 21 70 4e 65 77 20 29 7b 0a 20 20 20 20 72 65 74  !pNew ){.    ret
261f0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
26200 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70  ;.  }.  memset(p
26210 4e 65 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 75  New, 0, sizeof(u
26220 6e 69 78 46 69 6c 65 29 29 3b 0a 0a 20 20 2f 2a  nixFile));..  /*
26230 20 43 61 6c 6c 20 75 6e 69 78 4f 70 65 6e 28 29   Call unixOpen()
26240 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 70 72 6f   to open the pro
26250 78 79 20 66 69 6c 65 2e 20 54 68 65 20 66 6c 61  xy file. The fla
26260 67 73 20 70 61 73 73 65 64 20 74 6f 20 75 6e 69  gs passed to uni
26270 78 4f 70 65 6e 28 29 0a 20 20 2a 2a 20 73 75 67  xOpen().  ** sug
26280 67 65 73 74 20 74 68 61 74 20 74 68 65 20 66 69  gest that the fi
26290 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20  le being opened 
262a0 69 73 20 61 20 22 6d 61 69 6e 20 64 61 74 61 62  is a "main datab
262b0 61 73 65 22 2e 20 54 68 69 73 20 69 73 0a 20 20  ase". This is.  
262c0 2a 2a 20 6e 65 63 65 73 73 61 72 79 20 61 73 20  ** necessary as 
262d0 6f 74 68 65 72 20 66 69 6c 65 20 74 79 70 65 73  other file types
262e0 20 64 6f 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   do not necessar
262f0 69 6c 79 20 73 75 70 70 6f 72 74 20 6c 6f 63 6b  ily support lock
26300 69 6e 67 2e 20 49 74 0a 20 20 2a 2a 20 69 73 20  ing. It.  ** is 
26310 62 65 74 74 65 72 20 74 6f 20 75 73 65 20 75 6e  better to use un
26320 69 78 4f 70 65 6e 28 29 20 69 6e 73 74 65 61 64  ixOpen() instead
26330 20 6f 66 20 6f 70 65 6e 69 6e 67 20 74 68 65 20   of opening the 
26340 66 69 6c 65 20 64 69 72 65 63 74 6c 79 20 77 69  file directly wi
26350 74 68 0a 20 20 2a 2a 20 6f 70 65 6e 28 29 2c 20  th.  ** open(), 
26360 61 73 20 75 6e 69 78 4f 70 65 6e 28 29 20 73 65  as unixOpen() se
26370 74 73 20 75 70 20 74 68 65 20 76 61 72 69 6f 75  ts up the variou
26380 73 20 6d 65 63 68 61 6e 69 73 6d 73 20 72 65 71  s mechanisms req
26390 75 69 72 65 64 20 74 6f 0a 20 20 2a 2a 20 6d 61  uired to.  ** ma
263a0 6b 65 20 73 75 72 65 20 61 20 63 61 6c 6c 20 74  ke sure a call t
263b0 6f 20 63 6c 6f 73 65 28 29 20 64 6f 65 73 20 6e  o close() does n
263c0 6f 74 20 63 61 75 73 65 20 74 68 65 20 73 79 73  ot cause the sys
263d0 74 65 6d 20 74 6f 20 64 69 73 63 61 72 64 0a 20  tem to discard. 
263e0 20 2a 2a 20 50 4f 53 49 58 20 6c 6f 63 6b 73 20   ** POSIX locks 
263f0 70 72 65 6d 61 74 75 72 65 6c 79 2e 0a 20 20 2a  prematurely..  *
26400 2a 0a 20 20 2a 2a 20 49 74 20 69 73 20 69 6d 70  *.  ** It is imp
26410 6f 72 74 61 6e 74 20 74 68 61 74 20 74 68 65 20  ortant that the 
26420 78 4f 70 65 6e 20 6d 65 6d 62 65 72 20 6f 66 20  xOpen member of 
26430 74 68 65 20 56 46 53 20 6f 62 6a 65 63 74 20 70  the VFS object p
26440 61 73 73 65 64 20 74 6f 20 0a 20 20 2a 2a 20 75  assed to .  ** u
26450 6e 69 78 4f 70 65 6e 28 29 20 69 73 20 4e 55 4c  nixOpen() is NUL
26460 4c 2e 20 54 68 69 73 20 74 65 6c 6c 73 20 75 6e  L. This tells un
26470 69 78 4f 70 65 6e 28 29 20 6d 61 79 20 74 72 79  ixOpen() may try
26480 20 74 6f 20 6f 70 65 6e 20 61 20 70 72 6f 78 79   to open a proxy
26490 2d 66 69 6c 65 20 0a 20 20 2a 2a 20 66 6f 72 20  -file .  ** for 
264a0 74 68 65 20 70 72 6f 78 79 2d 66 69 6c 65 20 28  the proxy-file (
264b0 63 72 65 61 74 69 6e 67 20 61 20 70 6f 74 65 6e  creating a poten
264c0 74 69 61 6c 20 69 6e 66 69 6e 69 74 65 20 6c 6f  tial infinite lo
264d0 6f 70 29 2e 0a 20 20 2a 2f 0a 20 20 64 75 6d 6d  op)..  */.  dumm
264e0 79 56 66 73 2e 70 41 70 70 44 61 74 61 20 3d 20  yVfs.pAppData = 
264f0 28 76 6f 69 64 2a 29 26 61 75 74 6f 6c 6f 63 6b  (void*)&autolock
26500 49 6f 46 69 6e 64 65 72 3b 0a 20 20 64 75 6d 6d  IoFinder;.  dumm
26510 79 56 66 73 2e 78 4f 70 65 6e 20 3d 20 30 3b 0a  yVfs.xOpen = 0;.
26520 20 20 72 63 20 3d 20 75 6e 69 78 4f 70 65 6e 28    rc = unixOpen(
26530 26 64 75 6d 6d 79 56 66 73 2c 20 70 61 74 68 2c  &dummyVfs, path,
26540 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a   (sqlite3_file *
26550 29 70 4e 65 77 2c 20 66 6c 61 67 73 2c 20 26 66  )pNew, flags, &f
26560 6c 61 67 73 29 3b 0a 20 20 69 66 28 20 72 63 3d  lags);.  if( rc=
26570 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 66  =SQLITE_OK && (f
26580 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f 50 45 4e  lags&SQLITE_OPEN
26590 5f 52 45 41 44 4f 4e 4c 59 29 20 29 7b 0a 20 20  _READONLY) ){.  
265a0 20 20 70 4e 65 77 2d 3e 70 4d 65 74 68 6f 64 2d    pNew->pMethod-
265b0 3e 78 43 6c 6f 73 65 28 28 73 71 6c 69 74 65 33  >xClose((sqlite3
265c0 5f 66 69 6c 65 20 2a 29 70 4e 65 77 29 3b 0a 20  _file *)pNew);. 
265d0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
265e0 41 4e 54 4f 50 45 4e 3b 0a 20 20 7d 0a 0a 20 20  ANTOPEN;.  }..  
265f0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
26600 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
26610 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 20  _free(pNew);.   
26620 20 70 4e 65 77 20 3d 20 30 3b 0a 20 20 7d 0a 0a   pNew = 0;.  }..
26630 20 20 2a 70 70 46 69 6c 65 20 3d 20 70 4e 65 77    *ppFile = pNew
26640 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
26650 0a 0a 2f 2a 20 74 61 6b 65 73 20 74 68 65 20 63  ../* takes the c
26660 6f 6e 63 68 20 62 79 20 74 61 6b 69 6e 67 20 61  onch by taking a
26670 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 61 6e 64   shared lock and
26680 20 72 65 61 64 20 74 68 65 20 63 6f 6e 74 65 6e   read the conten
26690 74 73 20 63 6f 6e 63 68 2c 20 69 66 20 0a 2a 2a  ts conch, if .**
266a0 20 6c 6f 63 6b 50 61 74 68 20 69 73 20 6e 6f 6e   lockPath is non
266b0 2d 4e 55 4c 4c 2c 20 74 68 65 20 68 6f 73 74 20  -NULL, the host 
266c0 49 44 20 61 6e 64 20 6c 6f 63 6b 20 66 69 6c 65  ID and lock file
266d0 20 70 61 74 68 20 6d 75 73 74 20 6d 61 74 63 68   path must match
266e0 2e 20 20 41 20 4e 55 4c 4c 20 0a 2a 2a 20 6c 6f  .  A NULL .** lo
266f0 63 6b 50 61 74 68 20 6d 65 61 6e 73 20 74 68 61  ckPath means tha
26700 74 20 74 68 65 20 6c 6f 63 6b 50 61 74 68 20 69  t the lockPath i
26710 6e 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65  n the conch file
26720 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 69 66   will be used if
26730 20 74 68 65 20 0a 2a 2a 20 68 6f 73 74 20 49 44   the .** host ID
26740 73 20 6d 61 74 63 68 2c 20 6f 72 20 61 20 6e 65  s match, or a ne
26750 77 20 6c 6f 63 6b 20 70 61 74 68 20 77 69 6c 6c  w lock path will
26760 20 62 65 20 67 65 6e 65 72 61 74 65 64 20 61 75   be generated au
26770 74 6f 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a 20  tomatically .** 
26780 61 6e 64 20 77 72 69 74 74 65 6e 20 74 6f 20 74  and written to t
26790 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 2e 0a 2a  he conch file..*
267a0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  /.static int pro
267b0 78 79 54 61 6b 65 43 6f 6e 63 68 28 75 6e 69 78  xyTakeConch(unix
267c0 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20  File *pFile){.  
267d0 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
267e0 65 78 74 20 2a 70 43 74 78 20 3d 20 28 70 72 6f  ext *pCtx = (pro
267f0 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  xyLockingContext
26800 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e   *)pFile->lockin
26810 67 43 6f 6e 74 65 78 74 3b 20 0a 20 20 0a 20 20  gContext; .  .  
26820 69 66 28 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48  if( pCtx->conchH
26830 65 6c 64 3e 30 20 29 7b 0a 20 20 20 20 72 65 74  eld>0 ){.    ret
26840 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
26850 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 6e 69 78   }else{.    unix
26860 46 69 6c 65 20 2a 63 6f 6e 63 68 46 69 6c 65 20  File *conchFile 
26870 3d 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c  = pCtx->conchFil
26880 65 3b 0a 20 20 20 20 63 68 61 72 20 74 65 73 74  e;.    char test
26890 56 61 6c 75 65 5b 43 4f 4e 43 48 4c 45 4e 5d 3b  Value[CONCHLEN];
268a0 0a 20 20 20 20 63 68 61 72 20 63 6f 6e 63 68 56  .    char conchV
268b0 61 6c 75 65 5b 43 4f 4e 43 48 4c 45 4e 5d 3b 0a  alue[CONCHLEN];.
268c0 20 20 20 20 63 68 61 72 20 6c 6f 63 6b 50 61 74      char lockPat
268d0 68 5b 4d 41 58 50 41 54 48 4c 45 4e 5d 3b 0a 20  h[MAXPATHLEN];. 
268e0 20 20 20 63 68 61 72 20 2a 74 4c 6f 63 6b 50 61     char *tLockPa
268f0 74 68 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69  th = NULL;.    i
26900 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
26910 4b 3b 0a 20 20 20 20 69 6e 74 20 72 65 61 64 52  K;.    int readR
26920 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
26930 20 20 20 69 6e 74 20 73 79 6e 63 50 65 72 6d 73     int syncPerms
26940 20 3d 20 30 3b 0a 0a 20 20 20 20 4f 53 54 52 41   = 0;..    OSTRA
26950 43 45 34 28 22 54 41 4b 45 43 4f 4e 43 48 20 20  CE4("TAKECONCH  
26960 25 64 20 66 6f 72 20 25 73 20 70 69 64 3d 25 64  %d for %s pid=%d
26970 5c 6e 22 2c 20 63 6f 6e 63 68 46 69 6c 65 2d 3e  \n", conchFile->
26980 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  h,.             
26990 28 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79  (pCtx->lockProxy
269a0 50 61 74 68 20 3f 20 70 43 74 78 2d 3e 6c 6f 63  Path ? pCtx->loc
269b0 6b 50 72 6f 78 79 50 61 74 68 20 3a 20 22 3a 61  kProxyPath : ":a
269c0 75 74 6f 3a 22 29 2c 20 67 65 74 70 69 64 28 29  uto:"), getpid()
269d0 29 3b 0a 0a 20 20 20 20 72 63 20 3d 20 63 6f 6e  );..    rc = con
269e0 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d  chFile->pMethod-
269f0 3e 78 4c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f  >xLock((sqlite3_
26a00 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c  file*)conchFile,
26a10 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20   SHARED_LOCK);. 
26a20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
26a30 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e  E_OK ){.      in
26a40 74 20 70 45 72 72 6f 72 20 3d 20 30 3b 0a 20 20  t pError = 0;.  
26a50 20 20 20 20 6d 65 6d 73 65 74 28 74 65 73 74 56      memset(testV
26a60 61 6c 75 65 2c 20 30 2c 20 43 4f 4e 43 48 4c 45  alue, 0, CONCHLE
26a70 4e 29 3b 20 2f 2a 20 63 6f 6e 63 68 20 69 73 20  N); /* conch is 
26a80 66 69 78 65 64 20 73 69 7a 65 20 2a 2f 0a 20 20  fixed size */.  
26a90 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79 47 65      rc = proxyGe
26aa0 74 48 6f 73 74 49 44 28 74 65 73 74 56 61 6c 75  tHostID(testValu
26ab0 65 2c 20 26 70 45 72 72 6f 72 29 3b 0a 20 20 20  e, &pError);.   
26ac0 20 20 20 69 66 28 20 28 72 63 26 30 78 66 66 29     if( (rc&0xff)
26ad0 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29  ==SQLITE_IOERR )
26ae0 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d  {.        pFile-
26af0 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 70 45 72  >lastErrno = pEr
26b00 72 6f 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ror;.      }.   
26b10 20 20 20 69 66 28 20 70 43 74 78 2d 3e 6c 6f 63     if( pCtx->loc
26b20 6b 50 72 6f 78 79 50 61 74 68 20 29 7b 0a 20 20  kProxyPath ){.  
26b30 20 20 20 20 20 20 73 74 72 6c 63 70 79 28 26 74        strlcpy(&t
26b40 65 73 74 56 61 6c 75 65 5b 48 4f 53 54 49 44 4c  estValue[HOSTIDL
26b50 45 4e 5d 2c 20 70 43 74 78 2d 3e 6c 6f 63 6b 50  EN], pCtx->lockP
26b60 72 6f 78 79 50 61 74 68 2c 20 4d 41 58 50 41 54  roxyPath, MAXPAT
26b70 48 4c 45 4e 29 3b 0a 20 20 20 20 20 20 7d 0a 20  HLEN);.      }. 
26b80 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21     }.    if( rc!
26b90 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
26ba0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b      goto end_tak
26bb0 65 63 6f 6e 63 68 3b 0a 20 20 20 20 7d 0a 20 20  econch;.    }.  
26bc0 20 20 0a 20 20 20 20 72 65 61 64 52 63 20 3d 20    .    readRc = 
26bd0 75 6e 69 78 52 65 61 64 28 28 73 71 6c 69 74 65  unixRead((sqlite
26be0 33 5f 66 69 6c 65 20 2a 29 63 6f 6e 63 68 46 69  3_file *)conchFi
26bf0 6c 65 2c 20 63 6f 6e 63 68 56 61 6c 75 65 2c 20  le, conchValue, 
26c00 43 4f 4e 43 48 4c 45 4e 2c 20 30 29 3b 0a 20 20  CONCHLEN, 0);.  
26c10 20 20 69 66 28 20 72 65 61 64 52 63 21 3d 53 51    if( readRc!=SQ
26c20 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
26c30 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 69  _READ ){.      i
26c40 66 28 20 72 65 61 64 52 63 21 3d 53 51 4c 49 54  f( readRc!=SQLIT
26c50 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
26c60 69 66 28 20 28 72 63 26 30 78 66 66 29 3d 3d 53  if( (rc&0xff)==S
26c70 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20  QLITE_IOERR ){. 
26c80 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e           pFile->
26c90 6c 61 73 74 45 72 72 6e 6f 20 3d 20 63 6f 6e 63  lastErrno = conc
26ca0 68 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  hFile->lastErrno
26cb0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
26cc0 20 20 20 20 72 63 20 3d 20 72 65 61 64 52 63 3b      rc = readRc;
26cd0 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e  .        goto en
26ce0 64 5f 74 61 6b 65 63 6f 6e 63 68 3b 0a 20 20 20  d_takeconch;.   
26cf0 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 69 66     }.      /* if
26d00 20 74 68 65 20 63 6f 6e 63 68 20 68 61 73 20 64   the conch has d
26d10 61 74 61 20 63 6f 6d 70 61 72 65 20 74 68 65 20  ata compare the 
26d20 63 6f 6e 74 65 6e 74 73 20 2a 2f 0a 20 20 20 20  contents */.    
26d30 20 20 69 66 28 20 21 70 43 74 78 2d 3e 6c 6f 63    if( !pCtx->loc
26d40 6b 50 72 6f 78 79 50 61 74 68 20 29 7b 0a 20 20  kProxyPath ){.  
26d50 20 20 20 20 20 20 2f 2a 20 66 6f 72 20 61 75 74        /* for aut
26d60 6f 2d 6e 61 6d 65 64 20 6c 6f 63 61 6c 20 6c 6f  o-named local lo
26d70 63 6b 20 66 69 6c 65 2c 20 6a 75 73 74 20 63 68  ck file, just ch
26d80 65 63 6b 20 74 68 65 20 68 6f 73 74 20 49 44 20  eck the host ID 
26d90 61 6e 64 20 77 65 27 6c 6c 0a 20 20 20 20 20 20  and we'll.      
26da0 20 20 20 2a 2a 20 75 73 65 20 74 68 65 20 6c 6f     ** use the lo
26db0 63 61 6c 20 6c 6f 63 6b 20 66 69 6c 65 20 70 61  cal lock file pa
26dc0 74 68 20 74 68 61 74 27 73 20 61 6c 72 65 61 64  th that's alread
26dd0 79 20 69 6e 20 74 68 65 72 65 20 2a 2f 0a 20 20  y in there */.  
26de0 20 20 20 20 20 20 69 66 28 20 21 6d 65 6d 63 6d        if( !memcm
26df0 70 28 74 65 73 74 56 61 6c 75 65 2c 20 63 6f 6e  p(testValue, con
26e00 63 68 56 61 6c 75 65 2c 20 48 4f 53 54 49 44 4c  chValue, HOSTIDL
26e10 45 4e 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  EN) ){.         
26e20 20 74 4c 6f 63 6b 50 61 74 68 20 3d 20 28 63 68   tLockPath = (ch
26e30 61 72 20 2a 29 26 63 6f 6e 63 68 56 61 6c 75 65  ar *)&conchValue
26e40 5b 48 4f 53 54 49 44 4c 45 4e 5d 3b 0a 20 20 20  [HOSTIDLEN];.   
26e50 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
26e60 74 61 6b 65 63 6f 6e 63 68 3b 0a 20 20 20 20 20  takeconch;.     
26e70 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
26e80 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 77 65 27  {.        /* we'
26e90 76 65 20 67 6f 74 20 74 68 65 20 63 6f 6e 63 68  ve got the conch
26ea0 20 69 66 20 63 6f 6e 63 68 56 61 6c 75 65 20 6d   if conchValue m
26eb0 61 74 63 68 65 73 20 6f 75 72 20 70 61 74 68 20  atches our path 
26ec0 61 6e 64 20 68 6f 73 74 20 49 44 20 2a 2f 0a 20  and host ID */. 
26ed0 20 20 20 20 20 20 20 69 66 28 20 21 6d 65 6d 63         if( !memc
26ee0 6d 70 28 74 65 73 74 56 61 6c 75 65 2c 20 63 6f  mp(testValue, co
26ef0 6e 63 68 56 61 6c 75 65 2c 20 43 4f 4e 43 48 4c  nchValue, CONCHL
26f00 45 4e 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  EN) ){.         
26f10 20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b 65 63 6f   goto end_takeco
26f20 6e 63 68 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  nch;.        }. 
26f30 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
26f40 7b 0a 20 20 20 20 20 20 2f 2a 20 61 20 73 68 6f  {.      /* a sho
26f50 72 74 20 72 65 61 64 20 6d 65 61 6e 73 20 77 65  rt read means we
26f60 27 72 65 20 22 63 72 65 61 74 69 6e 67 22 20 74  're "creating" t
26f70 68 65 20 63 6f 6e 63 68 20 28 65 76 65 6e 20 74  he conch (even t
26f80 68 6f 75 67 68 20 69 74 20 63 6f 75 6c 64 20 0a  hough it could .
26f90 20 20 20 20 20 20 2a 2a 20 68 61 76 65 20 62 65        ** have be
26fa0 65 6e 20 75 73 65 72 2d 69 6e 74 65 72 76 65 6e  en user-interven
26fb0 74 69 6f 6e 29 2c 20 69 66 20 77 65 20 61 63 71  tion), if we acq
26fc0 75 69 72 65 20 74 68 65 20 65 78 63 6c 75 73 69  uire the exclusi
26fd0 76 65 20 6c 6f 63 6b 2c 0a 20 20 20 20 20 20 2a  ve lock,.      *
26fe0 2a 20 77 65 27 6c 6c 20 74 72 79 20 74 6f 20 6d  * we'll try to m
26ff0 61 74 63 68 20 74 68 65 20 63 75 72 72 65 6e 74  atch the current
27000 20 6f 6e 2d 64 69 73 6b 20 70 65 72 6d 69 73 73   on-disk permiss
27010 69 6f 6e 73 20 6f 66 20 74 68 65 20 64 61 74 61  ions of the data
27020 62 61 73 65 0a 20 20 20 20 20 20 2a 2f 0a 20 20  base.      */.  
27030 20 20 20 20 73 79 6e 63 50 65 72 6d 73 20 3d 20      syncPerms = 
27040 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 0a 20 20  1;.    }.    .  
27050 20 20 2f 2a 20 65 69 74 68 65 72 20 63 6f 6e 63    /* either conc
27060 68 20 77 61 73 20 65 6d 74 70 79 20 6f 72 20 64  h was emtpy or d
27070 69 64 6e 27 74 20 6d 61 74 63 68 20 2a 2f 0a 20  idn't match */. 
27080 20 20 20 69 66 28 20 21 70 43 74 78 2d 3e 6c 6f     if( !pCtx->lo
27090 63 6b 50 72 6f 78 79 50 61 74 68 20 29 7b 0a 20  ckProxyPath ){. 
270a0 20 20 20 20 20 70 72 6f 78 79 47 65 74 4c 6f 63       proxyGetLoc
270b0 6b 50 61 74 68 28 70 43 74 78 2d 3e 64 62 50 61  kPath(pCtx->dbPa
270c0 74 68 2c 20 6c 6f 63 6b 50 61 74 68 2c 20 4d 41  th, lockPath, MA
270d0 58 50 41 54 48 4c 45 4e 29 3b 0a 20 20 20 20 20  XPATHLEN);.     
270e0 20 74 4c 6f 63 6b 50 61 74 68 20 3d 20 6c 6f 63   tLockPath = loc
270f0 6b 50 61 74 68 3b 0a 20 20 20 20 20 20 73 74 72  kPath;.      str
27100 6c 63 70 79 28 26 74 65 73 74 56 61 6c 75 65 5b  lcpy(&testValue[
27110 48 4f 53 54 49 44 4c 45 4e 5d 2c 20 6c 6f 63 6b  HOSTIDLEN], lock
27120 50 61 74 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e  Path, MAXPATHLEN
27130 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 0a 20 20  );.    }.    .  
27140 20 20 2f 2a 20 75 70 64 61 74 65 20 63 6f 6e 63    /* update conc
27150 68 20 77 69 74 68 20 68 6f 73 74 20 61 6e 64 20  h with host and 
27160 70 61 74 68 20 28 74 68 69 73 20 77 69 6c 6c 20  path (this will 
27170 66 61 69 6c 20 69 66 20 6f 74 68 65 72 20 70 72  fail if other pr
27180 6f 63 65 73 73 0a 20 20 20 20 20 2a 2a 20 68 61  ocess.     ** ha
27190 73 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  s a shared lock 
271a0 61 6c 72 65 61 64 79 29 20 2a 2f 0a 20 20 20 20  already) */.    
271b0 72 63 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e  rc = conchFile->
271c0 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28  pMethod->xLock((
271d0 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f  sqlite3_file*)co
271e0 6e 63 68 46 69 6c 65 2c 20 45 58 43 4c 55 53 49  nchFile, EXCLUSI
271f0 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66  VE_LOCK);.    if
27200 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
27210 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 75 6e  ){.      rc = un
27220 69 78 57 72 69 74 65 28 28 73 71 6c 69 74 65 33  ixWrite((sqlite3
27230 5f 66 69 6c 65 20 2a 29 63 6f 6e 63 68 46 69 6c  _file *)conchFil
27240 65 2c 20 74 65 73 74 56 61 6c 75 65 2c 20 43 4f  e, testValue, CO
27250 4e 43 48 4c 45 4e 2c 20 30 29 3b 0a 20 20 20 20  NCHLEN, 0);.    
27260 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
27270 5f 4f 4b 20 26 26 20 73 79 6e 63 50 65 72 6d 73  _OK && syncPerms
27280 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75   ){.        stru
27290 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20 20  ct stat buf;.   
272a0 20 20 20 20 20 69 6e 74 20 65 72 72 20 3d 20 66       int err = f
272b0 73 74 61 74 28 70 46 69 6c 65 2d 3e 68 2c 20 26  stat(pFile->h, &
272c0 62 75 66 29 3b 0a 20 20 20 20 20 20 20 20 69 66  buf);.        if
272d0 28 20 65 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20  ( err==0 ){.    
272e0 20 20 20 20 20 20 2f 2a 20 74 72 79 20 74 6f 20        /* try to 
272f0 6d 61 74 63 68 20 74 68 65 20 64 61 74 61 62 61  match the databa
27300 73 65 20 66 69 6c 65 20 70 65 72 6d 69 73 73 69  se file permissi
27310 6f 6e 73 2c 20 69 67 6e 6f 72 65 20 66 61 69 6c  ons, ignore fail
27320 75 72 65 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ure */.#ifndef S
27330 51 4c 49 54 45 5f 50 52 4f 58 59 5f 44 45 42 55  QLITE_PROXY_DEBU
27340 47 0a 20 20 20 20 20 20 20 20 20 20 66 63 68 6d  G.          fchm
27350 6f 64 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c  od(conchFile->h,
27360 20 62 75 66 2e 73 74 5f 6d 6f 64 65 29 3b 0a 23   buf.st_mode);.#
27370 65 6c 73 65 0a 20 20 20 20 20 20 20 20 20 20 69  else.          i
27380 66 28 20 66 63 68 6d 6f 64 28 63 6f 6e 63 68 46  f( fchmod(conchF
27390 69 6c 65 2d 3e 68 2c 20 62 75 66 2e 73 74 5f 6d  ile->h, buf.st_m
273a0 6f 64 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ode)!=0 ){.     
273b0 20 20 20 20 20 20 20 69 6e 74 20 63 6f 64 65 20         int code 
273c0 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20  = errno;.       
273d0 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64       fprintf(std
273e0 65 72 72 2c 20 22 66 63 68 6d 6f 64 20 25 6f 20  err, "fchmod %o 
273f0 46 41 49 4c 45 44 20 77 69 74 68 20 25 64 20 25  FAILED with %d %
27400 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\n",.          
27410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27420 20 20 20 62 75 66 2e 73 74 5f 6d 6f 64 65 2c 20     buf.st_mode, 
27430 63 6f 64 65 2c 20 73 74 72 65 72 72 6f 72 28 63  code, strerror(c
27440 6f 64 65 29 29 3b 0a 20 20 20 20 20 20 20 20 20  ode));.         
27450 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
27460 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74        fprintf(st
27470 64 65 72 72 2c 20 22 66 63 68 6d 6f 64 20 25 6f  derr, "fchmod %o
27480 20 53 55 43 43 45 44 45 44 5c 6e 22 2c 62 75 66   SUCCEDED\n",buf
27490 2e 73 74 5f 6d 6f 64 65 29 3b 0a 20 20 20 20 20  .st_mode);.     
274a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
274b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
274c0 69 6e 74 20 63 6f 64 65 20 3d 20 65 72 72 6e 6f  int code = errno
274d0 3b 0a 20 20 20 20 20 20 20 20 20 20 66 70 72 69  ;.          fpri
274e0 6e 74 66 28 73 74 64 65 72 72 2c 20 22 53 54 41  ntf(stderr, "STA
274f0 54 20 46 41 49 4c 45 44 5b 25 64 5d 20 77 69 74  T FAILED[%d] wit
27500 68 20 25 64 20 25 73 5c 6e 22 2c 20 0a 20 20 20  h %d %s\n", .   
27510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27520 20 20 20 20 20 20 20 65 72 72 2c 20 63 6f 64 65         err, code
27530 2c 20 73 74 72 65 72 72 6f 72 28 63 6f 64 65 29  , strerror(code)
27540 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
27550 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
27560 7d 0a 20 20 20 20 63 6f 6e 63 68 46 69 6c 65 2d  }.    conchFile-
27570 3e 70 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f 63  >pMethod->xUnloc
27580 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  k((sqlite3_file*
27590 29 63 6f 6e 63 68 46 69 6c 65 2c 20 53 48 41 52  )conchFile, SHAR
275a0 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 0a 65 6e 64  ED_LOCK);.  .end
275b0 5f 74 61 6b 65 63 6f 6e 63 68 3a 0a 20 20 20 20  _takeconch:.    
275c0 4f 53 54 52 41 43 45 32 28 22 54 52 41 4e 53 50  OSTRACE2("TRANSP
275d0 52 4f 58 59 3a 20 43 4c 4f 53 45 20 20 25 64 5c  ROXY: CLOSE  %d\
275e0 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 3b 0a 20  n", pFile->h);. 
275f0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
27600 45 5f 4f 4b 20 26 26 20 70 46 69 6c 65 2d 3e 6f  E_OK && pFile->o
27610 70 65 6e 46 6c 61 67 73 20 29 7b 0a 20 20 20 20  penFlags ){.    
27620 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 68 3e 3d    if( pFile->h>=
27630 30 20 29 7b 0a 23 69 66 64 65 66 20 53 54 52 49  0 ){.#ifdef STRI
27640 43 54 5f 43 4c 4f 53 45 5f 45 52 52 4f 52 0a 20  CT_CLOSE_ERROR. 
27650 20 20 20 20 20 20 20 69 66 28 20 63 6c 6f 73 65         if( close
27660 28 70 46 69 6c 65 2d 3e 68 29 20 29 7b 0a 20 20  (pFile->h) ){.  
27670 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c          pFile->l
27680 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  astErrno = errno
27690 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
276a0 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
276b0 43 4c 4f 53 45 3b 0a 20 20 20 20 20 20 20 20 7d  CLOSE;.        }
276c0 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 20 20 63  .#else.        c
276d0 6c 6f 73 65 28 70 46 69 6c 65 2d 3e 68 29 3b 20  lose(pFile->h); 
276e0 2f 2a 20 73 69 6c 65 6e 74 6c 79 20 6c 65 61 6b  /* silently leak
276f0 20 66 64 20 69 66 20 66 61 69 6c 20 2a 2f 0a 23   fd if fail */.#
27700 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 0a 20 20  endif.      }.  
27710 20 20 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 2d      pFile->h = -
27720 31 3b 0a 20 20 20 20 20 20 69 6e 74 20 66 64 20  1;.      int fd 
27730 3d 20 6f 70 65 6e 28 70 43 74 78 2d 3e 64 62 50  = open(pCtx->dbP
27740 61 74 68 2c 20 70 46 69 6c 65 2d 3e 6f 70 65 6e  ath, pFile->open
27750 46 6c 61 67 73 2c 0a 20 20 20 20 20 20 20 20 20  Flags,.         
27760 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
27770 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50  E_DEFAULT_FILE_P
27780 45 52 4d 49 53 53 49 4f 4e 53 29 3b 0a 20 20 20  ERMISSIONS);.   
27790 20 20 20 4f 53 54 52 41 43 45 32 28 22 54 52 41     OSTRACE2("TRA
277a0 4e 53 50 52 4f 58 59 3a 20 4f 50 45 4e 20 20 25  NSPROXY: OPEN  %
277b0 64 5c 6e 22 2c 20 66 64 29 3b 0a 20 20 20 20 20  d\n", fd);.     
277c0 20 69 66 28 20 66 64 3e 3d 30 20 29 7b 0a 20 20   if( fd>=0 ){.  
277d0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 20 3d        pFile->h =
277e0 20 66 64 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   fd;.      }else
277f0 7b 0a 20 20 20 20 20 20 20 20 72 63 3d 53 51 4c  {.        rc=SQL
27800 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 20 2f 2a  ITE_CANTOPEN; /*
27810 20 53 51 4c 49 54 45 5f 42 55 53 59 3f 20 70 72   SQLITE_BUSY? pr
27820 6f 78 79 54 61 6b 65 43 6f 6e 63 68 20 63 61 6c  oxyTakeConch cal
27830 6c 65 64 0a 20 20 20 20 20 20 20 20 20 20 20 20  led.            
27840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27850 20 20 20 64 75 72 69 6e 67 20 6c 6f 63 6b 69 6e     during lockin
27860 67 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20  g */.      }.   
27870 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
27880 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 70 43 74  QLITE_OK && !pCt
27890 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 20 29 7b 0a  x->lockProxy ){.
278a0 20 20 20 20 20 20 63 68 61 72 20 2a 70 61 74 68        char *path
278b0 20 3d 20 74 4c 6f 63 6b 50 61 74 68 20 3f 20 74   = tLockPath ? t
278c0 4c 6f 63 6b 50 61 74 68 20 3a 20 70 43 74 78 2d  LockPath : pCtx-
278d0 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 3b 0a  >lockProxyPath;.
278e0 20 20 20 20 20 20 2f 2a 20 41 43 53 3a 20 4e 65        /* ACS: Ne
278f0 65 64 20 74 6f 20 6d 61 6b 65 20 61 20 63 6f 70  ed to make a cop
27900 79 20 6f 66 20 70 61 74 68 20 73 6f 6d 65 74 69  y of path someti
27910 6d 65 73 20 2a 2f 0a 20 20 20 20 20 20 72 63 20  mes */.      rc 
27920 3d 20 70 72 6f 78 79 43 72 65 61 74 65 55 6e 69  = proxyCreateUni
27930 78 46 69 6c 65 28 70 61 74 68 2c 20 26 70 43 74  xFile(path, &pCt
27940 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 29 3b 0a 20  x->lockProxy);. 
27950 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
27960 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
27970 20 20 20 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48      pCtx->conchH
27980 65 6c 64 20 3d 20 31 3b 0a 0a 20 20 20 20 20 20  eld = 1;..      
27990 69 66 28 20 74 4c 6f 63 6b 50 61 74 68 20 29 7b  if( tLockPath ){
279a0 0a 20 20 20 20 20 20 20 20 70 43 74 78 2d 3e 6c  .        pCtx->l
279b0 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 3d 20 73  ockProxyPath = s
279c0 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 30  qlite3DbStrDup(0
279d0 2c 20 74 4c 6f 63 6b 50 61 74 68 29 3b 0a 20 20  , tLockPath);.  
279e0 20 20 20 20 20 20 69 66 28 20 70 43 74 78 2d 3e        if( pCtx->
279f0 6c 6f 63 6b 50 72 6f 78 79 2d 3e 70 4d 65 74 68  lockProxy->pMeth
27a00 6f 64 20 3d 3d 20 26 61 66 70 49 6f 4d 65 74 68  od == &afpIoMeth
27a10 6f 64 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ods ){.         
27a20 20 28 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e   ((afpLockingCon
27a30 74 65 78 74 20 2a 29 70 43 74 78 2d 3e 6c 6f 63  text *)pCtx->loc
27a40 6b 50 72 6f 78 79 2d 3e 6c 6f 63 6b 69 6e 67 43  kProxy->lockingC
27a50 6f 6e 74 65 78 74 29 2d 3e 64 62 50 61 74 68 20  ontext)->dbPath 
27a60 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  =.              
27a70 20 20 20 20 20 20 20 70 43 74 78 2d 3e 6c 6f 63         pCtx->loc
27a80 6b 50 72 6f 78 79 50 61 74 68 3b 0a 20 20 20 20  kProxyPath;.    
27a90 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
27aa0 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
27ab0 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74   conchFile->pMet
27ac0 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28 28 73 71  hod->xUnlock((sq
27ad0 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63  lite3_file*)conc
27ae0 68 46 69 6c 65 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b  hFile, NO_LOCK);
27af0 0a 20 20 20 20 7d 0a 20 20 20 20 4f 53 54 52 41  .    }.    OSTRA
27b00 43 45 33 28 22 54 41 4b 45 43 4f 4e 43 48 20 20  CE3("TAKECONCH  
27b10 25 64 20 25 73 5c 6e 22 2c 20 63 6f 6e 63 68 46  %d %s\n", conchF
27b20 69 6c 65 2d 3e 68 2c 20 72 63 3d 3d 53 51 4c 49  ile->h, rc==SQLI
27b30 54 45 5f 4f 4b 3f 22 6f 6b 22 3a 22 66 61 69 6c  TE_OK?"ok":"fail
27b40 65 64 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ed");.    return
27b50 20 72 63 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   rc;.  }.}../*.*
27b60 2a 20 49 66 20 70 46 69 6c 65 20 68 6f 6c 64 73  * If pFile holds
27b70 20 61 20 6c 6f 63 6b 20 6f 6e 20 61 20 63 6f 6e   a lock on a con
27b80 63 68 20 66 69 6c 65 2c 20 74 68 65 6e 20 72 65  ch file, then re
27b90 6c 65 61 73 65 20 74 68 61 74 20 6c 6f 63 6b 2e  lease that lock.
27ba0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
27bb0 72 6f 78 79 52 65 6c 65 61 73 65 43 6f 6e 63 68  roxyReleaseConch
27bc0 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65  (unixFile *pFile
27bd0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
27be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27bf0 20 2f 2a 20 53 75 62 72 6f 75 74 69 6e 65 20 72   /* Subroutine r
27c00 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
27c10 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
27c20 65 78 74 20 2a 70 43 74 78 3b 20 20 2f 2a 20 54  ext *pCtx;  /* T
27c30 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65  he locking conte
27c40 78 74 20 66 6f 72 20 74 68 65 20 70 72 6f 78 79  xt for the proxy
27c50 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 69 78 46   lock */.  unixF
27c60 69 6c 65 20 2a 63 6f 6e 63 68 46 69 6c 65 3b 20  ile *conchFile; 
27c70 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
27c80 66 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65  f the conch file
27c90 20 2a 2f 0a 0a 20 20 70 43 74 78 20 3d 20 28 70   */..  pCtx = (p
27ca0 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
27cb0 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b  xt *)pFile->lock
27cc0 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 63 6f  ingContext;.  co
27cd0 6e 63 68 46 69 6c 65 20 3d 20 70 43 74 78 2d 3e  nchFile = pCtx->
27ce0 63 6f 6e 63 68 46 69 6c 65 3b 0a 20 20 4f 53 54  conchFile;.  OST
27cf0 52 41 43 45 34 28 22 52 45 4c 45 41 53 45 43 4f  RACE4("RELEASECO
27d00 4e 43 48 20 20 25 64 20 66 6f 72 20 25 73 20 70  NCH  %d for %s p
27d10 69 64 3d 25 64 5c 6e 22 2c 20 63 6f 6e 63 68 46  id=%d\n", conchF
27d20 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20  ile->h,.        
27d30 20 20 20 28 70 43 74 78 2d 3e 6c 6f 63 6b 50 72     (pCtx->lockPr
27d40 6f 78 79 50 61 74 68 20 3f 20 70 43 74 78 2d 3e  oxyPath ? pCtx->
27d50 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 3a 20  lockProxyPath : 
27d60 22 3a 61 75 74 6f 3a 22 29 2c 20 0a 20 20 20 20  ":auto:"), .    
27d70 20 20 20 20 20 20 20 67 65 74 70 69 64 28 29 29         getpid())
27d80 3b 0a 20 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48  ;.  pCtx->conchH
27d90 65 6c 64 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20  eld = 0;.  rc = 
27da0 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68  conchFile->pMeth
27db0 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28 28 73 71 6c  od->xUnlock((sql
27dc0 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68  ite3_file*)conch
27dd0 46 69 6c 65 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a  File, NO_LOCK);.
27de0 20 20 4f 53 54 52 41 43 45 33 28 22 52 45 4c 45    OSTRACE3("RELE
27df0 41 53 45 43 4f 4e 43 48 20 20 25 64 20 25 73 5c  ASECONCH  %d %s\
27e00 6e 22 2c 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 68  n", conchFile->h
27e10 2c 0a 20 20 20 20 20 20 20 20 20 20 20 28 72 63  ,.           (rc
27e20 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f  ==SQLITE_OK ? "o
27e30 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b  k" : "failed"));
27e40 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
27e50 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65  ./*.** Given the
27e60 20 6e 61 6d 65 20 6f 66 20 61 20 64 61 74 61 62   name of a datab
27e70 61 73 65 20 66 69 6c 65 2c 20 63 6f 6d 70 75 74  ase file, comput
27e80 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 69 74  e the name of it
27e90 73 20 63 6f 6e 63 68 20 66 69 6c 65 2e 0a 2a 2a  s conch file..**
27ea0 20 53 74 6f 72 65 20 74 68 65 20 63 6f 6e 63 68   Store the conch
27eb0 20 66 69 6c 65 6e 61 6d 65 20 69 6e 20 6d 65 6d   filename in mem
27ec0 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ory obtained fro
27ed0 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  m sqlite3_malloc
27ee0 28 29 2e 0a 2a 2a 20 4d 61 6b 65 20 2a 70 43 6f  ()..** Make *pCo
27ef0 6e 63 68 50 61 74 68 20 70 6f 69 6e 74 20 74 6f  nchPath point to
27f00 20 74 68 65 20 6e 65 77 20 6e 61 6d 65 2e 20 20   the new name.  
27f10 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
27f20 20 6f 6e 20 73 75 63 63 65 73 73 0a 2a 2a 20 6f   on success.** o
27f30 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69  r SQLITE_NOMEM i
27f40 66 20 75 6e 61 62 6c 65 20 74 6f 20 6f 62 74 61  f unable to obta
27f50 69 6e 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a  in memory..**.**
27f60 20 54 68 65 20 63 61 6c 6c 65 72 20 69 73 20 72   The caller is r
27f70 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 65  esponsible for e
27f80 6e 73 75 72 69 6e 67 20 74 68 61 74 20 74 68 65  nsuring that the
27f90 20 61 6c 6c 6f 63 61 74 65 64 20 6d 65 6d 6f 72   allocated memor
27fa0 79 0a 2a 2a 20 73 70 61 63 65 20 69 73 20 65 76  y.** space is ev
27fb0 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 64 2e 0a  entually freed..
27fc0 2a 2a 0a 2a 2a 20 2a 70 43 6f 6e 63 68 50 61 74  **.** *pConchPat
27fd0 68 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c  h is set to NULL
27fe0 20 69 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c   if a memory all
27ff0 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 6f 63  ocation error oc
28000 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  curs..*/.static 
28010 69 6e 74 20 70 72 6f 78 79 43 72 65 61 74 65 43  int proxyCreateC
28020 6f 6e 63 68 50 61 74 68 6e 61 6d 65 28 63 68 61  onchPathname(cha
28030 72 20 2a 64 62 50 61 74 68 2c 20 63 68 61 72 20  r *dbPath, char 
28040 2a 2a 70 43 6f 6e 63 68 50 61 74 68 29 7b 0a 20  **pConchPath){. 
28050 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
28060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28070 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
28080 2f 0a 20 20 69 6e 74 20 6c 65 6e 20 3d 20 28 69  /.  int len = (i
28090 6e 74 29 73 74 72 6c 65 6e 28 64 62 50 61 74 68  nt)strlen(dbPath
280a0 29 3b 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20  ); /* Length of 
280b0 64 61 74 61 62 61 73 65 20 66 69 6c 65 6e 61 6d  database filenam
280c0 65 20 2d 20 64 62 50 61 74 68 20 2a 2f 0a 20 20  e - dbPath */.  
280d0 63 68 61 72 20 2a 63 6f 6e 63 68 50 61 74 68 3b  char *conchPath;
280e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
280f0 20 62 75 66 66 65 72 20 69 6e 20 77 68 69 63 68   buffer in which
28100 20 74 6f 20 63 6f 6e 73 74 72 75 63 74 20 63 6f   to construct co
28110 6e 63 68 20 6e 61 6d 65 20 2a 2f 0a 0a 20 20 2f  nch name */..  /
28120 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  * Allocate space
28130 20 66 6f 72 20 74 68 65 20 63 6f 6e 63 68 20 66   for the conch f
28140 69 6c 65 6e 61 6d 65 20 61 6e 64 20 69 6e 69 74  ilename and init
28150 69 61 6c 69 7a 65 20 74 68 65 20 6e 61 6d 65 20  ialize the name 
28160 74 6f 0a 20 20 2a 2a 20 74 68 65 20 6e 61 6d 65  to.  ** the name
28170 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   of the original
28180 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
28190 2a 2f 20 20 0a 20 20 2a 70 43 6f 6e 63 68 50 61  */  .  *pConchPa
281a0 74 68 20 3d 20 63 6f 6e 63 68 50 61 74 68 20 3d  th = conchPath =
281b0 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33   (char *)sqlite3
281c0 5f 6d 61 6c 6c 6f 63 28 6c 65 6e 20 2b 20 38 29  _malloc(len + 8)
281d0 3b 0a 20 20 69 66 28 20 63 6f 6e 63 68 50 61 74  ;.  if( conchPat
281e0 68 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  h==0 ){.    retu
281f0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
28200 0a 20 20 7d 0a 20 20 6d 65 6d 63 70 79 28 63 6f  .  }.  memcpy(co
28210 6e 63 68 50 61 74 68 2c 20 64 62 50 61 74 68 2c  nchPath, dbPath,
28220 20 6c 65 6e 2b 31 29 3b 0a 20 20 0a 20 20 2f 2a   len+1);.  .  /*
28230 20 6e 6f 77 20 69 6e 73 65 72 74 20 61 20 22 2e   now insert a ".
28240 22 20 62 65 66 6f 72 65 20 74 68 65 20 6c 61 73  " before the las
28250 74 20 2f 20 63 68 61 72 61 63 74 65 72 20 2a 2f  t / character */
28260 0a 20 20 66 6f 72 28 20 69 3d 28 6c 65 6e 2d 31  .  for( i=(len-1
28270 29 3b 20 69 3e 3d 30 3b 20 69 2d 2d 20 29 7b 0a  ); i>=0; i-- ){.
28280 20 20 20 20 69 66 28 20 63 6f 6e 63 68 50 61 74      if( conchPat
28290 68 5b 69 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20  h[i]=='/' ){.   
282a0 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 62 72     i++;.      br
282b0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
282c0 20 63 6f 6e 63 68 50 61 74 68 5b 69 5d 3d 27 2e   conchPath[i]='.
282d0 27 3b 0a 20 20 77 68 69 6c 65 20 28 20 69 3c 6c  ';.  while ( i<l
282e0 65 6e 20 29 7b 0a 20 20 20 20 63 6f 6e 63 68 50  en ){.    conchP
282f0 61 74 68 5b 69 2b 31 5d 3d 64 62 50 61 74 68 5b  ath[i+1]=dbPath[
28300 69 5d 3b 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d  i];.    i++;.  }
28310 0a 0a 20 20 2f 2a 20 61 70 70 65 6e 64 20 74 68  ..  /* append th
28320 65 20 22 2d 63 6f 6e 63 68 22 20 73 75 66 66 69  e "-conch" suffi
28330 78 20 74 6f 20 74 68 65 20 66 69 6c 65 20 2a 2f  x to the file */
28340 0a 20 20 6d 65 6d 63 70 79 28 26 63 6f 6e 63 68  .  memcpy(&conch
28350 50 61 74 68 5b 69 2b 31 5d 2c 20 22 2d 63 6f 6e  Path[i+1], "-con
28360 63 68 22 2c 20 37 29 3b 0a 20 20 61 73 73 65 72  ch", 7);.  asser
28370 74 28 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 63  t( (int)strlen(c
28380 6f 6e 63 68 50 61 74 68 29 20 3d 3d 20 6c 65 6e  onchPath) == len
28390 2b 37 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  +7 );..  return 
283a0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f  SQLITE_OK;.}.../
283b0 2a 20 54 61 6b 65 73 20 61 20 66 75 6c 6c 79 20  * Takes a fully 
283c0 63 6f 6e 66 69 67 75 72 65 64 20 70 72 6f 78 79  configured proxy
283d0 20 6c 6f 63 6b 69 6e 67 2d 73 74 79 6c 65 20 75   locking-style u
283e0 6e 69 78 20 66 69 6c 65 20 61 6e 64 20 73 77 69  nix file and swi
283f0 74 63 68 65 73 0a 2a 2a 20 74 68 65 20 6c 6f 63  tches.** the loc
28400 61 6c 20 6c 6f 63 6b 20 66 69 6c 65 20 70 61 74  al lock file pat
28410 68 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  h .*/.static int
28420 20 73 77 69 74 63 68 4c 6f 63 6b 50 72 6f 78 79   switchLockProxy
28430 50 61 74 68 28 75 6e 69 78 46 69 6c 65 20 2a 70  Path(unixFile *p
28440 46 69 6c 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  File, const char
28450 20 2a 70 61 74 68 29 20 7b 0a 20 20 70 72 6f 78   *path) {.  prox
28460 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  yLockingContext 
28470 2a 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f  *pCtx = (proxyLo
28480 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2a 29 70 46  ckingContext*)pF
28490 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
284a0 65 78 74 3b 0a 20 20 63 68 61 72 20 2a 6f 6c 64  ext;.  char *old
284b0 50 61 74 68 20 3d 20 70 43 74 78 2d 3e 6c 6f 63  Path = pCtx->loc
284c0 6b 50 72 6f 78 79 50 61 74 68 3b 0a 20 20 69 6e  kProxyPath;.  in
284d0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
284e0 3b 0a 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  ;..  if( pFile->
284f0 6c 6f 63 6b 74 79 70 65 21 3d 4e 4f 5f 4c 4f 43  locktype!=NO_LOC
28500 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
28510 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d  SQLITE_BUSY;.  }
28520 20 20 0a 0a 20 20 2f 2a 20 6e 6f 74 68 69 6e 67    ..  /* nothing
28530 20 74 6f 20 64 6f 20 69 66 20 74 68 65 20 70 61   to do if the pa
28540 74 68 20 69 73 20 4e 55 4c 4c 2c 20 3a 61 75 74  th is NULL, :aut
28550 6f 3a 20 6f 72 20 6d 61 74 63 68 65 73 20 74 68  o: or matches th
28560 65 20 65 78 69 73 74 69 6e 67 20 70 61 74 68 20  e existing path 
28570 2a 2f 0a 20 20 69 66 28 20 21 70 61 74 68 20 7c  */.  if( !path |
28580 7c 20 70 61 74 68 5b 30 5d 3d 3d 27 5c 30 27 20  | path[0]=='\0' 
28590 7c 7c 20 21 73 74 72 63 6d 70 28 70 61 74 68 2c  || !strcmp(path,
285a0 20 22 3a 61 75 74 6f 3a 22 29 20 7c 7c 0a 20 20   ":auto:") ||.  
285b0 20 20 28 6f 6c 64 50 61 74 68 20 26 26 20 21 73    (oldPath && !s
285c0 74 72 6e 63 6d 70 28 6f 6c 64 50 61 74 68 2c 20  trncmp(oldPath, 
285d0 70 61 74 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e  path, MAXPATHLEN
285e0 29 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  )) ){.    return
285f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65   SQLITE_OK;.  }e
28600 6c 73 65 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c  lse{.    unixFil
28610 65 20 2a 6c 6f 63 6b 50 72 6f 78 79 20 3d 20 70  e *lockProxy = p
28620 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 3b 0a  Ctx->lockProxy;.
28630 20 20 20 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72      pCtx->lockPr
28640 6f 78 79 3d 4e 55 4c 4c 3b 0a 20 20 20 20 70 43  oxy=NULL;.    pC
28650 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 20 3d 20  tx->conchHeld = 
28660 30 3b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 50  0;.    if( lockP
28670 72 6f 78 79 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20  roxy!=NULL ){.  
28680 20 20 20 20 72 63 3d 6c 6f 63 6b 50 72 6f 78 79      rc=lockProxy
28690 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 43 6c 6f 73  ->pMethod->xClos
286a0 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  e((sqlite3_file 
286b0 2a 29 6c 6f 63 6b 50 72 6f 78 79 29 3b 0a 20 20  *)lockProxy);.  
286c0 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
286d0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 73 71  urn rc;.      sq
286e0 6c 69 74 65 33 5f 66 72 65 65 28 6c 6f 63 6b 50  lite3_free(lockP
286f0 72 6f 78 79 29 3b 0a 20 20 20 20 7d 0a 20 20 20  roxy);.    }.   
28700 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 6f 6c   sqlite3_free(ol
28710 64 50 61 74 68 29 3b 0a 20 20 20 20 70 43 74 78  dPath);.    pCtx
28720 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20  ->lockProxyPath 
28730 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
28740 70 28 30 2c 20 70 61 74 68 29 3b 0a 20 20 7d 0a  p(0, path);.  }.
28750 20 20 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a    .  return rc;.
28760 7d 0a 0a 2f 2a 0a 2a 2a 20 70 46 69 6c 65 20 69  }../*.** pFile i
28770 73 20 61 20 66 69 6c 65 20 74 68 61 74 20 68 61  s a file that ha
28780 73 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 62 79  s been opened by
28790 20 61 20 70 72 69 6f 72 20 78 4f 70 65 6e 20 63   a prior xOpen c
287a0 61 6c 6c 2e 20 20 64 62 50 61 74 68 0a 2a 2a 20  all.  dbPath.** 
287b0 69 73 20 61 20 73 74 72 69 6e 67 20 62 75 66 66  is a string buff
287c0 65 72 20 61 74 20 6c 65 61 73 74 20 4d 41 58 50  er at least MAXP
287d0 41 54 48 4c 45 4e 2b 31 20 63 68 61 72 61 63 74  ATHLEN+1 charact
287e0 65 72 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a  ers in size..**.
287f0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
28800 66 69 6e 64 20 74 68 65 20 66 69 6c 65 6e 61 6d  find the filenam
28810 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  e associated wit
28820 68 20 70 46 69 6c 65 20 61 6e 64 20 77 72 69 74  h pFile and writ
28830 65 73 20 69 74 0a 2a 2a 20 69 6e 74 20 64 62 50  es it.** int dbP
28840 61 74 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ath..*/.static i
28850 6e 74 20 70 72 6f 78 79 47 65 74 44 62 50 61 74  nt proxyGetDbPat
28860 68 46 6f 72 55 6e 69 78 46 69 6c 65 28 75 6e 69  hForUnixFile(uni
28870 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 63 68  xFile *pFile, ch
28880 61 72 20 2a 64 62 50 61 74 68 29 7b 0a 23 69 66  ar *dbPath){.#if
28890 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
288a0 5f 5f 29 0a 20 20 69 66 28 20 70 46 69 6c 65 2d  __).  if( pFile-
288b0 3e 70 4d 65 74 68 6f 64 20 3d 3d 20 26 61 66 70  >pMethod == &afp
288c0 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20  IoMethods ){.   
288d0 20 2f 2a 20 61 66 70 20 73 74 79 6c 65 20 6b 65   /* afp style ke
288e0 65 70 73 20 61 20 72 65 66 65 72 65 6e 63 65 20  eps a reference 
288f0 74 6f 20 74 68 65 20 64 62 20 70 61 74 68 20 69  to the db path i
28900 6e 20 74 68 65 20 66 69 6c 65 50 61 74 68 20 66  n the filePath f
28910 69 65 6c 64 20 0a 20 20 20 20 2a 2a 20 6f 66 20  ield .    ** of 
28920 74 68 65 20 73 74 72 75 63 74 20 2a 2f 0a 20 20  the struct */.  
28930 20 20 61 73 73 65 72 74 28 20 28 69 6e 74 29 73    assert( (int)s
28940 74 72 6c 65 6e 28 28 63 68 61 72 2a 29 70 46 69  trlen((char*)pFi
28950 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
28960 78 74 29 3c 3d 4d 41 58 50 41 54 48 4c 45 4e 20  xt)<=MAXPATHLEN 
28970 29 3b 0a 20 20 20 20 73 74 72 63 70 79 28 64 62  );.    strcpy(db
28980 50 61 74 68 2c 20 28 28 61 66 70 4c 6f 63 6b 69  Path, ((afpLocki
28990 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c  ngContext *)pFil
289a0 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
289b0 74 29 2d 3e 64 62 50 61 74 68 29 3b 0a 20 20 7d  t)->dbPath);.  }
289c0 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 69 66  else.#endif.  if
289d0 28 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64  ( pFile->pMethod
289e0 20 3d 3d 20 26 64 6f 74 6c 6f 63 6b 49 6f 4d 65   == &dotlockIoMe
289f0 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f 2a 20  thods ){.    /* 
28a00 64 6f 74 20 6c 6f 63 6b 20 73 74 79 6c 65 20 75  dot lock style u
28a10 73 65 73 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  ses the locking 
28a20 63 6f 6e 74 65 78 74 20 74 6f 20 73 74 6f 72 65  context to store
28a30 20 74 68 65 20 64 6f 74 20 6c 6f 63 6b 0a 20 20   the dot lock.  
28a40 20 20 2a 2a 20 66 69 6c 65 20 70 61 74 68 20 2a    ** file path *
28a50 2f 0a 20 20 20 20 69 6e 74 20 6c 65 6e 20 3d 20  /.    int len = 
28a60 73 74 72 6c 65 6e 28 28 63 68 61 72 20 2a 29 70  strlen((char *)p
28a70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
28a80 74 65 78 74 29 20 2d 20 73 74 72 6c 65 6e 28 44  text) - strlen(D
28a90 4f 54 4c 4f 43 4b 5f 53 55 46 46 49 58 29 3b 0a  OTLOCK_SUFFIX);.
28aa0 20 20 20 20 6d 65 6d 63 70 79 28 64 62 50 61 74      memcpy(dbPat
28ab0 68 2c 20 28 63 68 61 72 20 2a 29 70 46 69 6c 65  h, (char *)pFile
28ac0 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
28ad0 2c 20 6c 65 6e 20 2b 20 31 29 3b 0a 20 20 7d 65  , len + 1);.  }e
28ae0 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 61 6c 6c 20  lse{.    /* all 
28af0 6f 74 68 65 72 20 73 74 79 6c 65 73 20 75 73 65  other styles use
28b00 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e   the locking con
28b10 74 65 78 74 20 74 6f 20 73 74 6f 72 65 20 74 68  text to store th
28b20 65 20 64 62 20 66 69 6c 65 20 70 61 74 68 20 2a  e db file path *
28b30 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 74  /.    assert( st
28b40 72 6c 65 6e 28 28 63 68 61 72 2a 29 70 46 69 6c  rlen((char*)pFil
28b50 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
28b60 74 29 3c 3d 4d 41 58 50 41 54 48 4c 45 4e 20 29  t)<=MAXPATHLEN )
28b70 3b 0a 20 20 20 20 73 74 72 63 70 79 28 64 62 50  ;.    strcpy(dbP
28b80 61 74 68 2c 20 28 63 68 61 72 20 2a 29 70 46 69  ath, (char *)pFi
28b90 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
28ba0 78 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  xt);.  }.  retur
28bb0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
28bc0 2f 2a 0a 2a 2a 20 54 61 6b 65 73 20 61 6e 20 61  /*.** Takes an a
28bd0 6c 72 65 61 64 79 20 66 69 6c 6c 65 64 20 69 6e  lready filled in
28be0 20 75 6e 69 78 20 66 69 6c 65 20 61 6e 64 20 61   unix file and a
28bf0 6c 74 65 72 73 20 69 74 20 73 6f 20 61 6c 6c 20  lters it so all 
28c00 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 0a 2a 2a  file locking .**
28c10 20 77 69 6c 6c 20 62 65 20 70 65 72 66 6f 72 6d   will be perform
28c20 65 64 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20  ed on the local 
28c30 70 72 6f 78 79 20 6c 6f 63 6b 20 66 69 6c 65 2e  proxy lock file.
28c40 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
28c50 66 69 65 6c 64 73 0a 2a 2a 20 61 72 65 20 70 72  fields.** are pr
28c60 65 73 65 72 76 65 64 20 69 6e 20 74 68 65 20 6c  eserved in the l
28c70 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 73  ocking context s
28c80 6f 20 74 68 61 74 20 74 68 65 79 20 63 61 6e 20  o that they can 
28c90 62 65 20 72 65 73 74 6f 72 65 64 20 61 6e 64 20  be restored and 
28ca0 0a 2a 2a 20 74 68 65 20 75 6e 69 78 20 73 74 72  .** the unix str
28cb0 75 63 74 75 72 65 20 70 72 6f 70 65 72 6c 79 20  ucture properly 
28cc0 63 6c 65 61 6e 65 64 20 75 70 20 61 74 20 63 6c  cleaned up at cl
28cd0 6f 73 65 20 74 69 6d 65 3a 0a 2a 2a 20 20 2d 3e  ose time:.**  ->
28ce0 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 0a 2a  lockingContext.*
28cf0 2a 20 20 2d 3e 70 4d 65 74 68 6f 64 0a 2a 2f 0a  *  ->pMethod.*/.
28d00 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
28d10 54 72 61 6e 73 66 6f 72 6d 55 6e 69 78 46 69 6c  TransformUnixFil
28d20 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c  e(unixFile *pFil
28d30 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70  e, const char *p
28d40 61 74 68 29 20 7b 0a 20 20 70 72 6f 78 79 4c 6f  ath) {.  proxyLo
28d50 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43  ckingContext *pC
28d60 74 78 3b 0a 20 20 63 68 61 72 20 64 62 50 61 74  tx;.  char dbPat
28d70 68 5b 4d 41 58 50 41 54 48 4c 45 4e 2b 31 5d 3b  h[MAXPATHLEN+1];
28d80 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
28d90 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
28da0 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 6c  ile */.  char *l
28db0 6f 63 6b 50 61 74 68 3d 4e 55 4c 4c 3b 0a 20 20  ockPath=NULL;.  
28dc0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
28dd0 4f 4b 3b 0a 20 20 0a 20 20 69 66 28 20 70 46 69  OK;.  .  if( pFi
28de0 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 21 3d 4e 4f  le->locktype!=NO
28df0 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 74  _LOCK ){.    ret
28e00 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  urn SQLITE_BUSY;
28e10 0a 20 20 7d 0a 20 20 70 72 6f 78 79 47 65 74 44  .  }.  proxyGetD
28e20 62 50 61 74 68 46 6f 72 55 6e 69 78 46 69 6c 65  bPathForUnixFile
28e30 28 70 46 69 6c 65 2c 20 64 62 50 61 74 68 29 3b  (pFile, dbPath);
28e40 0a 20 20 69 66 28 20 21 70 61 74 68 20 7c 7c 20  .  if( !path || 
28e50 70 61 74 68 5b 30 5d 3d 3d 27 5c 30 27 20 7c 7c  path[0]=='\0' ||
28e60 20 21 73 74 72 63 6d 70 28 70 61 74 68 2c 20 22   !strcmp(path, "
28e70 3a 61 75 74 6f 3a 22 29 20 29 7b 0a 20 20 20 20  :auto:") ){.    
28e80 6c 6f 63 6b 50 61 74 68 3d 4e 55 4c 4c 3b 0a 20  lockPath=NULL;. 
28e90 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6c 6f 63 6b   }else{.    lock
28ea0 50 61 74 68 3d 28 63 68 61 72 20 2a 29 70 61 74  Path=(char *)pat
28eb0 68 3b 0a 20 20 7d 0a 20 20 0a 20 20 4f 53 54 52  h;.  }.  .  OSTR
28ec0 41 43 45 34 28 22 54 52 41 4e 53 50 52 4f 58 59  ACE4("TRANSPROXY
28ed0 20 20 25 64 20 66 6f 72 20 25 73 20 70 69 64 3d    %d for %s pid=
28ee0 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  %d\n", pFile->h,
28ef0 0a 20 20 20 20 20 20 20 20 20 20 20 28 6c 6f 63  .           (loc
28f00 6b 50 61 74 68 20 3f 20 6c 6f 63 6b 50 61 74 68  kPath ? lockPath
28f10 20 3a 20 22 3a 61 75 74 6f 3a 22 29 2c 20 67 65   : ":auto:"), ge
28f20 74 70 69 64 28 29 29 3b 0a 0a 20 20 70 43 74 78  tpid());..  pCtx
28f30 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
28f40 63 28 20 73 69 7a 65 6f 66 28 2a 70 43 74 78 29  c( sizeof(*pCtx)
28f50 20 29 3b 0a 20 20 69 66 28 20 70 43 74 78 3d 3d   );.  if( pCtx==
28f60 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
28f70 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
28f80 7d 0a 20 20 6d 65 6d 73 65 74 28 70 43 74 78 2c  }.  memset(pCtx,
28f90 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 43 74 78   0, sizeof(*pCtx
28fa0 29 29 3b 0a 0a 20 20 72 63 20 3d 20 70 72 6f 78  ));..  rc = prox
28fb0 79 43 72 65 61 74 65 43 6f 6e 63 68 50 61 74 68  yCreateConchPath
28fc0 6e 61 6d 65 28 64 62 50 61 74 68 2c 20 26 70 43  name(dbPath, &pC
28fd0 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 50 61 74  tx->conchFilePat
28fe0 68 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  h);.  if( rc==SQ
28ff0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
29000 63 20 3d 20 70 72 6f 78 79 43 72 65 61 74 65 55  c = proxyCreateU
29010 6e 69 78 46 69 6c 65 28 70 43 74 78 2d 3e 63 6f  nixFile(pCtx->co
29020 6e 63 68 46 69 6c 65 50 61 74 68 2c 20 26 70 43  nchFilePath, &pC
29030 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 29 3b 0a  tx->conchFile);.
29040 20 20 7d 20 20 0a 20 20 69 66 28 20 72 63 3d 3d    }  .  if( rc==
29050 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6c 6f 63  SQLITE_OK && loc
29060 6b 50 61 74 68 20 29 7b 0a 20 20 20 20 70 43 74  kPath ){.    pCt
29070 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68  x->lockProxyPath
29080 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
29090 75 70 28 30 2c 20 6c 6f 63 6b 50 61 74 68 29 3b  up(0, lockPath);
290a0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d  .  }..  if( rc==
290b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
290c0 20 2f 2a 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 69   /* all memory i
290d0 73 20 61 6c 6c 6f 63 61 74 65 64 2c 20 70 72 6f  s allocated, pro
290e0 78 79 73 20 61 72 65 20 63 72 65 61 74 65 64 20  xys are created 
290f0 61 6e 64 20 61 73 73 69 67 6e 65 64 2c 20 0a 20  and assigned, . 
29100 20 20 20 2a 2a 20 73 77 69 74 63 68 20 74 68 65     ** switch the
29110 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74   locking context
29120 20 61 6e 64 20 70 4d 65 74 68 6f 64 20 74 68 65   and pMethod the
29130 6e 20 72 65 74 75 72 6e 2e 0a 20 20 20 20 2a 2f  n return..    */
29140 0a 20 20 20 20 70 43 74 78 2d 3e 64 62 50 61 74  .    pCtx->dbPat
29150 68 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  h = sqlite3DbStr
29160 44 75 70 28 30 2c 20 64 62 50 61 74 68 29 3b 0a  Dup(0, dbPath);.
29170 20 20 20 20 70 43 74 78 2d 3e 6f 6c 64 4c 6f 63      pCtx->oldLoc
29180 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20 70 46  kingContext = pF
29190 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
291a0 65 78 74 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  ext;.    pFile->
291b0 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d  lockingContext =
291c0 20 70 43 74 78 3b 0a 20 20 20 20 70 43 74 78 2d   pCtx;.    pCtx-
291d0 3e 70 4f 6c 64 4d 65 74 68 6f 64 20 3d 20 70 46  >pOldMethod = pF
291e0 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 3b 0a 20 20  ile->pMethod;.  
291f0 20 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64    pFile->pMethod
29200 20 3d 20 26 70 72 6f 78 79 49 6f 4d 65 74 68 6f   = &proxyIoMetho
29210 64 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ds;.  }else{.   
29220 20 69 66 28 20 70 43 74 78 2d 3e 63 6f 6e 63 68   if( pCtx->conch
29230 46 69 6c 65 20 29 7b 20 0a 20 20 20 20 20 20 72  File ){ .      r
29240 63 20 3d 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46  c = pCtx->conchF
29250 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 43  ile->pMethod->xC
29260 6c 6f 73 65 28 28 73 71 6c 69 74 65 33 5f 66 69  lose((sqlite3_fi
29270 6c 65 20 2a 29 70 43 74 78 2d 3e 63 6f 6e 63 68  le *)pCtx->conch
29280 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 69 66 28  File);.      if(
29290 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
292a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
292b0 72 65 65 28 70 43 74 78 2d 3e 63 6f 6e 63 68 46  ree(pCtx->conchF
292c0 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ile);.    }.    
292d0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 74  sqlite3_free(pCt
292e0 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 50 61 74 68  x->conchFilePath
292f0 29 3b 20 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  ); .    sqlite3_
29300 66 72 65 65 28 70 43 74 78 29 3b 0a 20 20 7d 0a  free(pCtx);.  }.
29310 20 20 4f 53 54 52 41 43 45 33 28 22 54 52 41 4e    OSTRACE3("TRAN
29320 53 50 52 4f 58 59 20 20 25 64 20 25 73 5c 6e 22  SPROXY  %d %s\n"
29330 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20  , pFile->h,.    
29340 20 20 20 20 20 20 20 28 72 63 3d 3d 53 51 4c 49         (rc==SQLI
29350 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22  TE_OK ? "ok" : "
29360 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 72 65 74  failed"));.  ret
29370 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
29380 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 68  * This routine h
29390 61 6e 64 6c 65 73 20 73 71 6c 69 74 65 33 5f 66  andles sqlite3_f
293a0 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 29 20 63 61  ile_control() ca
293b0 6c 6c 73 20 74 68 61 74 20 61 72 65 20 73 70 65  lls that are spe
293c0 63 69 66 69 63 0a 2a 2a 20 74 6f 20 70 72 6f 78  cific.** to prox
293d0 79 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74  y locking..*/.st
293e0 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 46 69  atic int proxyFi
293f0 6c 65 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65  leControl(sqlite
29400 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
29410 6f 70 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b  op, void *pArg){
29420 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b  .  switch( op ){
29430 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
29440 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49  _GET_LOCKPROXYFI
29450 4c 45 3a 20 7b 0a 20 20 20 20 20 20 75 6e 69 78  LE: {.      unix
29460 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
29470 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20  nixFile*)id;.   
29480 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 4d     if( pFile->pM
29490 65 74 68 6f 64 20 3d 3d 20 26 70 72 6f 78 79 49  ethod == &proxyI
294a0 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20  oMethods ){.    
294b0 20 20 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67      proxyLocking
294c0 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20  Context *pCtx = 
294d0 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e  (proxyLockingCon
294e0 74 65 78 74 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63  text*)pFile->loc
294f0 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20  kingContext;.   
29500 20 20 20 20 20 70 72 6f 78 79 54 61 6b 65 43 6f       proxyTakeCo
29510 6e 63 68 28 70 46 69 6c 65 29 3b 0a 20 20 20 20  nch(pFile);.    
29520 20 20 20 20 69 66 28 20 70 43 74 78 2d 3e 6c 6f      if( pCtx->lo
29530 63 6b 50 72 6f 78 79 50 61 74 68 20 29 7b 0a 20  ckProxyPath ){. 
29540 20 20 20 20 20 20 20 20 20 2a 28 63 6f 6e 73 74           *(const
29550 20 63 68 61 72 20 2a 2a 29 70 41 72 67 20 3d 20   char **)pArg = 
29560 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50  pCtx->lockProxyP
29570 61 74 68 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ath;.        }el
29580 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 28  se{.          *(
29590 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 29 70 41  const char **)pA
295a0 72 67 20 3d 20 22 3a 61 75 74 6f 3a 20 28 6e 6f  rg = ":auto: (no
295b0 74 20 68 65 6c 64 29 22 3b 0a 20 20 20 20 20 20  t held)";.      
295c0 20 20 7d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65    }.      } else
295d0 20 7b 0a 20 20 20 20 20 20 20 20 2a 28 63 6f 6e   {.        *(con
295e0 73 74 20 63 68 61 72 20 2a 2a 29 70 41 72 67 20  st char **)pArg 
295f0 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 7d 0a  = NULL;.      }.
29600 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
29610 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
29620 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 53 45    case SQLITE_SE
29630 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 3a  T_LOCKPROXYFILE:
29640 20 7b 0a 20 20 20 20 20 20 75 6e 69 78 46 69 6c   {.      unixFil
29650 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
29660 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20 20 20  File*)id;.      
29670 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
29680 4f 4b 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 73  OK;.      int is
29690 50 72 6f 78 79 53 74 79 6c 65 20 3d 20 28 70 46  ProxyStyle = (pF
296a0 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 20 3d 3d 20  ile->pMethod == 
296b0 26 70 72 6f 78 79 49 6f 4d 65 74 68 6f 64 73 29  &proxyIoMethods)
296c0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 41 72 67  ;.      if( pArg
296d0 3d 3d 4e 55 4c 4c 20 7c 7c 20 28 63 6f 6e 73 74  ==NULL || (const
296e0 20 63 68 61 72 20 2a 29 70 41 72 67 3d 3d 30 20   char *)pArg==0 
296f0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  ){.        if( i
29700 73 50 72 6f 78 79 53 74 79 6c 65 20 29 7b 0a 20  sProxyStyle ){. 
29710 20 20 20 20 20 20 20 20 20 2f 2a 20 74 75 72 6e           /* turn
29720 20 6f 66 66 20 70 72 6f 78 79 20 6c 6f 63 6b 69   off proxy locki
29730 6e 67 20 2d 20 6e 6f 74 20 73 75 70 70 6f 72 74  ng - not support
29740 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ed */.          
29750 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
29760 52 20 2f 2a 53 51 4c 49 54 45 5f 50 52 4f 54 4f  R /*SQLITE_PROTO
29770 43 4f 4c 3f 20 53 51 4c 49 54 45 5f 4d 49 53 55  COL? SQLITE_MISU
29780 53 45 3f 2a 2f 3b 0a 20 20 20 20 20 20 20 20 7d  SE?*/;.        }
29790 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
297a0 2f 2a 20 74 75 72 6e 20 6f 66 66 20 70 72 6f 78  /* turn off prox
297b0 79 20 6c 6f 63 6b 69 6e 67 20 2d 20 61 6c 72 65  y locking - alre
297c0 61 64 79 20 6f 66 66 20 2d 20 4e 4f 4f 50 20 2a  ady off - NOOP *
297d0 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  /.          rc =
297e0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
297f0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
29800 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  e{.        const
29810 20 63 68 61 72 20 2a 70 72 6f 78 79 50 61 74 68   char *proxyPath
29820 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a   = (const char *
29830 29 70 41 72 67 3b 0a 20 20 20 20 20 20 20 20 69  )pArg;.        i
29840 66 28 20 69 73 50 72 6f 78 79 53 74 79 6c 65 20  f( isProxyStyle 
29850 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 72 6f  ){.          pro
29860 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  xyLockingContext
29870 20 2a 70 43 74 78 20 3d 20 0a 20 20 20 20 20 20   *pCtx = .      
29880 20 20 20 20 20 20 28 70 72 6f 78 79 4c 6f 63 6b        (proxyLock
29890 69 6e 67 43 6f 6e 74 65 78 74 2a 29 70 46 69 6c  ingContext*)pFil
298a0 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
298b0 74 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  t;.          if(
298c0 20 21 73 74 72 63 6d 70 28 70 41 72 67 2c 20 22   !strcmp(pArg, "
298d0 3a 61 75 74 6f 3a 22 29 20 0a 20 20 20 20 20 20  :auto:") .      
298e0 20 20 20 20 20 7c 7c 20 28 70 43 74 78 2d 3e 6c       || (pCtx->l
298f0 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 26 26 0a  ockProxyPath &&.
29900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 21                 !
29910 73 74 72 6e 63 6d 70 28 70 43 74 78 2d 3e 6c 6f  strncmp(pCtx->lo
29920 63 6b 50 72 6f 78 79 50 61 74 68 2c 20 70 72 6f  ckProxyPath, pro
29930 78 79 50 61 74 68 2c 20 4d 41 58 50 41 54 48 4c  xyPath, MAXPATHL
29940 45 4e 29 29 0a 20 20 20 20 20 20 20 20 20 20 29  EN)).          )
29950 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
29960 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
29970 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
29980 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
29990 73 77 69 74 63 68 4c 6f 63 6b 50 72 6f 78 79 50  switchLockProxyP
299a0 61 74 68 28 70 46 69 6c 65 2c 20 70 72 6f 78 79  ath(pFile, proxy
299b0 50 61 74 68 29 3b 0a 20 20 20 20 20 20 20 20 20  Path);.         
299c0 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65   }.        }else
299d0 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74  {.          /* t
299e0 75 72 6e 20 6f 6e 20 70 72 6f 78 79 20 66 69 6c  urn on proxy fil
299f0 65 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 20 20 20  e locking */.   
29a00 20 20 20 20 20 20 20 72 63 20 3d 20 70 72 6f 78         rc = prox
29a10 79 54 72 61 6e 73 66 6f 72 6d 55 6e 69 78 46 69  yTransformUnixFi
29a20 6c 65 28 70 46 69 6c 65 2c 20 70 72 6f 78 79 50  le(pFile, proxyP
29a30 61 74 68 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ath);.        }.
29a40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
29a50 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
29a60 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
29a70 20 20 20 20 61 73 73 65 72 74 28 20 30 20 29 3b      assert( 0 );
29a80 20 20 2f 2a 20 54 68 65 20 63 61 6c 6c 20 61 73    /* The call as
29a90 73 75 72 65 73 20 74 68 61 74 20 6f 6e 6c 79 20  sures that only 
29aa0 76 61 6c 69 64 20 6f 70 63 6f 64 65 73 20 61 72  valid opcodes ar
29ab0 65 20 73 65 6e 74 20 2a 2f 0a 20 20 20 20 7d 0a  e sent */.    }.
29ac0 20 20 7d 0a 20 20 2f 2a 4e 4f 54 52 45 41 43 48    }.  /*NOTREACH
29ad0 45 44 2a 2f 0a 20 20 72 65 74 75 72 6e 20 53 51  ED*/.  return SQ
29ae0 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f  LITE_ERROR;.}../
29af0 2a 0a 2a 2a 20 57 69 74 68 69 6e 20 74 68 69 73  *.** Within this
29b00 20 64 69 76 69 73 69 6f 6e 20 28 74 68 65 20 70   division (the p
29b10 72 6f 78 79 69 6e 67 20 6c 6f 63 6b 69 6e 67 20  roxying locking 
29b20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 29 20  implementation) 
29b30 74 68 65 20 70 72 6f 63 65 64 75 72 65 73 0a 2a  the procedures.*
29b40 2a 20 61 62 6f 76 65 20 74 68 69 73 20 70 6f 69  * above this poi
29b50 6e 74 20 61 72 65 20 61 6c 6c 20 75 74 69 6c 69  nt are all utili
29b60 74 69 65 73 2e 20 20 54 68 65 20 6c 6f 63 6b 2d  ties.  The lock-
29b70 72 65 6c 61 74 65 64 20 6d 65 74 68 6f 64 73 20  related methods 
29b80 6f 66 20 74 68 65 0a 2a 2a 20 70 72 6f 78 79 2d  of the.** proxy-
29b90 6c 6f 63 6b 69 6e 67 20 73 71 6c 69 74 65 33 5f  locking sqlite3_
29ba0 69 6f 5f 6d 65 74 68 6f 64 20 6f 62 6a 65 63 74  io_method object
29bb0 20 66 6f 6c 6c 6f 77 2e 0a 2a 2f 0a 0a 0a 2f 2a   follow..*/.../*
29bc0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
29bd0 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 72 65   checks if there
29be0 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20 6c   is a RESERVED l
29bf0 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20  ock held on the 
29c00 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c  specified.** fil
29c10 65 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79  e by this or any
29c20 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20   other process. 
29c30 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69  If such a lock i
29c40 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65  s held, set *pRe
29c50 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e  sOut.** to a non
29c60 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65  -zero value othe
29c70 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69  rwise *pResOut i
29c80 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20  s set to zero.  
29c90 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  The return value
29ca0 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51  .** is set to SQ
29cb0 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61  LITE_OK unless a
29cc0 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75  n I/O error occu
29cd0 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63  rs during lock c
29ce0 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  hecking..*/.stat
29cf0 69 63 20 69 6e 74 20 70 72 6f 78 79 43 68 65 63  ic int proxyChec
29d00 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71  kReservedLock(sq
29d10 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
29d20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 20 7b 0a  int *pResOut) {.
29d30 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
29d40 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
29d50 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 70 72  d;.  int rc = pr
29d60 6f 78 79 54 61 6b 65 43 6f 6e 63 68 28 70 46 69  oxyTakeConch(pFi
29d70 6c 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  le);.  if( rc==S
29d80 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
29d90 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
29da0 65 78 74 20 2a 70 43 74 78 20 3d 20 28 70 72 6f  ext *pCtx = (pro
29db0 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  xyLockingContext
29dc0 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e   *)pFile->lockin
29dd0 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 75 6e  gContext;.    un
29de0 69 78 46 69 6c 65 20 2a 70 72 6f 78 79 20 3d 20  ixFile *proxy = 
29df0 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 3b  pCtx->lockProxy;
29e00 0a 20 20 20 20 72 65 74 75 72 6e 20 70 72 6f 78  .    return prox
29e10 79 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 43 68 65  y->pMethod->xChe
29e20 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 28  ckReservedLock((
29e30 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 70 72  sqlite3_file*)pr
29e40 6f 78 79 2c 20 70 52 65 73 4f 75 74 29 3b 0a 20  oxy, pResOut);. 
29e50 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
29e60 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68  }../*.** Lock th
29e70 65 20 66 69 6c 65 20 77 69 74 68 20 74 68 65 20  e file with the 
29e80 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20 62  lock specified b
29e90 79 20 70 61 72 61 6d 65 74 65 72 20 6c 6f 63 6b  y parameter lock
29ea0 74 79 70 65 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66  type - one.** of
29eb0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
29ec0 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48  **.**     (1) SH
29ed0 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  ARED_LOCK.**    
29ee0 20 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f   (2) RESERVED_LO
29ef0 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45  CK.**     (3) PE
29f00 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  NDING_LOCK.**   
29f10 20 20 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f    (4) EXCLUSIVE_
29f20 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74  LOCK.**.** Somet
29f30 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65 73  imes when reques
29f40 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74  ting one lock st
29f50 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20  ate, additional 
29f60 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61  lock states.** a
29f70 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62  re inserted in b
29f80 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63  etween.  The loc
29f90 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20  king might fail 
29fa0 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61  on one of the la
29fb0 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  ter.** transitio
29fc0 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c  ns leaving the l
29fd0 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66 65 72  ock state differ
29fe0 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74  ent from what it
29ff0 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20   started but.** 
2a000 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69  still short of i
2a010 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f  ts goal.  The fo
2a020 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68  llowing chart sh
2a030 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a  ows the allowed.
2a040 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61  ** transitions a
2a050 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65 64 20  nd the inserted 
2a060 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61  intermediate sta
2a070 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e  tes:.**.**    UN
2a080 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44  LOCKED -> SHARED
2a090 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e  .**    SHARED ->
2a0a0 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20   RESERVED.**    
2a0b0 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49  SHARED -> (PENDI
2a0c0 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  NG) -> EXCLUSIVE
2a0d0 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44 20  .**    RESERVED 
2a0e0 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20  -> (PENDING) -> 
2a0f0 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20  EXCLUSIVE.**    
2a100 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55  PENDING -> EXCLU
2a110 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  SIVE.**.** This 
2a120 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c  routine will onl
2a130 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63  y increase a loc
2a140 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c 69  k.  Use the sqli
2a150 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a  te3OsUnlock().**
2a160 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65   routine to lowe
2a170 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  r a locking leve
2a180 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  l..*/.static int
2a190 20 70 72 6f 78 79 4c 6f 63 6b 28 73 71 6c 69 74   proxyLock(sqlit
2a1a0 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
2a1b0 20 6c 6f 63 6b 74 79 70 65 29 20 7b 0a 20 20 75   locktype) {.  u
2a1c0 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
2a1d0 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
2a1e0 20 20 69 6e 74 20 72 63 20 3d 20 70 72 6f 78 79    int rc = proxy
2a1f0 54 61 6b 65 43 6f 6e 63 68 28 70 46 69 6c 65 29  TakeConch(pFile)
2a200 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
2a210 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 72 6f  TE_OK ){.    pro
2a220 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  xyLockingContext
2a230 20 2a 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c   *pCtx = (proxyL
2a240 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29  ockingContext *)
2a250 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
2a260 6e 74 65 78 74 3b 0a 20 20 20 20 75 6e 69 78 46  ntext;.    unixF
2a270 69 6c 65 20 2a 70 72 6f 78 79 20 3d 20 70 43 74  ile *proxy = pCt
2a280 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 3b 0a 20 20  x->lockProxy;.  
2a290 20 20 72 63 20 3d 20 70 72 6f 78 79 2d 3e 70 4d    rc = proxy->pM
2a2a0 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28 73 71  ethod->xLock((sq
2a2b0 6c 69 74 65 33 5f 66 69 6c 65 2a 29 70 72 6f 78  lite3_file*)prox
2a2c0 79 2c 20 6c 6f 63 6b 74 79 70 65 29 3b 0a 20 20  y, locktype);.  
2a2d0 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70    pFile->locktyp
2a2e0 65 20 3d 20 70 72 6f 78 79 2d 3e 6c 6f 63 6b 74  e = proxy->lockt
2a2f0 79 70 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ype;.  }.  retur
2a300 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
2a310 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e  Lower the lockin
2a320 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20  g level on file 
2a330 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65  descriptor pFile
2a340 20 74 6f 20 6c 6f 63 6b 74 79 70 65 2e 20 20 6c   to locktype.  l
2a350 6f 63 6b 74 79 70 65 0a 2a 2a 20 6d 75 73 74 20  ocktype.** must 
2a360 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43  be either NO_LOC
2a370 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b  K or SHARED_LOCK
2a380 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c  ..**.** If the l
2a390 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20  ocking level of 
2a3a0 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
2a3b0 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61  tor is already a
2a3c0 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68  t or below.** th
2a3d0 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
2a3e0 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20  ing level, this 
2a3f0 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
2a400 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  op..*/.static in
2a410 74 20 70 72 6f 78 79 55 6e 6c 6f 63 6b 28 73 71  t proxyUnlock(sq
2a420 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
2a430 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 20 7b 0a  int locktype) {.
2a440 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
2a450 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
2a460 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 70 72  d;.  int rc = pr
2a470 6f 78 79 54 61 6b 65 43 6f 6e 63 68 28 70 46 69  oxyTakeConch(pFi
2a480 6c 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  le);.  if( rc==S
2a490 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2a4a0 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
2a4b0 65 78 74 20 2a 70 43 74 78 20 3d 20 28 70 72 6f  ext *pCtx = (pro
2a4c0 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  xyLockingContext
2a4d0 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e   *)pFile->lockin
2a4e0 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 75 6e  gContext;.    un
2a4f0 69 78 46 69 6c 65 20 2a 70 72 6f 78 79 20 3d 20  ixFile *proxy = 
2a500 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 3b  pCtx->lockProxy;
2a510 0a 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79 2d  .    rc = proxy-
2a520 3e 70 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f 63  >pMethod->xUnloc
2a530 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  k((sqlite3_file*
2a540 29 70 72 6f 78 79 2c 20 6c 6f 63 6b 74 79 70 65  )proxy, locktype
2a550 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f  );.    pFile->lo
2a560 63 6b 74 79 70 65 20 3d 20 70 72 6f 78 79 2d 3e  cktype = proxy->
2a570 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 7d 0a 20 20  locktype;.  }.  
2a580 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2a590 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65  .** Close a file
2a5a0 20 74 68 61 74 20 75 73 65 73 20 70 72 6f 78 79   that uses proxy
2a5b0 20 6c 6f 63 6b 73 2e 0a 2a 2f 0a 73 74 61 74 69   locks..*/.stati
2a5c0 63 20 69 6e 74 20 70 72 6f 78 79 43 6c 6f 73 65  c int proxyClose
2a5d0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
2a5e0 64 29 20 7b 0a 20 20 69 66 28 20 69 64 20 29 7b  d) {.  if( id ){
2a5f0 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  .    unixFile *p
2a600 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
2a610 2a 29 69 64 3b 0a 20 20 20 20 70 72 6f 78 79 4c  *)id;.    proxyL
2a620 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70  ockingContext *p
2a630 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b  Ctx = (proxyLock
2a640 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 46 69  ingContext *)pFi
2a650 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
2a660 78 74 3b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65  xt;.    unixFile
2a670 20 2a 6c 6f 63 6b 50 72 6f 78 79 20 3d 20 70 43   *lockProxy = pC
2a680 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 3b 0a 20  tx->lockProxy;. 
2a690 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e     unixFile *con
2a6a0 63 68 46 69 6c 65 20 3d 20 70 43 74 78 2d 3e 63  chFile = pCtx->c
2a6b0 6f 6e 63 68 46 69 6c 65 3b 0a 20 20 20 20 69 6e  onchFile;.    in
2a6c0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2a6d0 3b 0a 20 20 20 20 0a 20 20 20 20 69 66 28 20 6c  ;.    .    if( l
2a6e0 6f 63 6b 50 72 6f 78 79 20 29 7b 0a 20 20 20 20  ockProxy ){.    
2a6f0 20 20 72 63 20 3d 20 6c 6f 63 6b 50 72 6f 78 79    rc = lockProxy
2a700 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f  ->pMethod->xUnlo
2a710 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ck((sqlite3_file
2a720 2a 29 6c 6f 63 6b 50 72 6f 78 79 2c 20 4e 4f 5f  *)lockProxy, NO_
2a730 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28  LOCK);.      if(
2a740 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
2a750 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 6f 63 6b  .      rc = lock
2a760 50 72 6f 78 79 2d 3e 70 4d 65 74 68 6f 64 2d 3e  Proxy->pMethod->
2a770 78 43 6c 6f 73 65 28 28 73 71 6c 69 74 65 33 5f  xClose((sqlite3_
2a780 66 69 6c 65 2a 29 6c 6f 63 6b 50 72 6f 78 79 29  file*)lockProxy)
2a790 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
2a7a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2a7b0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 6c    sqlite3_free(l
2a7c0 6f 63 6b 50 72 6f 78 79 29 3b 0a 20 20 20 20 20  ockProxy);.     
2a7d0 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79   pCtx->lockProxy
2a7e0 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
2a7f0 69 66 28 20 63 6f 6e 63 68 46 69 6c 65 20 29 7b  if( conchFile ){
2a800 0a 20 20 20 20 20 20 69 66 28 20 70 43 74 78 2d  .      if( pCtx-
2a810 3e 63 6f 6e 63 68 48 65 6c 64 20 29 7b 0a 20 20  >conchHeld ){.  
2a820 20 20 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79        rc = proxy
2a830 52 65 6c 65 61 73 65 43 6f 6e 63 68 28 70 46 69  ReleaseConch(pFi
2a840 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  le);.        if(
2a850 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
2a860 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
2a870 63 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70  c = conchFile->p
2a880 4d 65 74 68 6f 64 2d 3e 78 43 6c 6f 73 65 28 28  Method->xClose((
2a890 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f  sqlite3_file*)co
2a8a0 6e 63 68 46 69 6c 65 29 3b 0a 20 20 20 20 20 20  nchFile);.      
2a8b0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
2a8c0 72 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  rc;.      sqlite
2a8d0 33 5f 66 72 65 65 28 63 6f 6e 63 68 46 69 6c 65  3_free(conchFile
2a8e0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
2a8f0 69 74 65 33 5f 66 72 65 65 28 70 43 74 78 2d 3e  ite3_free(pCtx->
2a900 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 29 3b 0a  lockProxyPath);.
2a910 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
2a920 28 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65  (pCtx->conchFile
2a930 50 61 74 68 29 3b 0a 20 20 20 20 73 71 6c 69 74  Path);.    sqlit
2a940 65 33 5f 66 72 65 65 28 70 43 74 78 2d 3e 64 62  e3_free(pCtx->db
2a950 50 61 74 68 29 3b 0a 20 20 20 20 2f 2a 20 72 65  Path);.    /* re
2a960 73 74 6f 72 65 20 74 68 65 20 6f 72 69 67 69 6e  store the origin
2a970 61 6c 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65  al locking conte
2a980 78 74 20 61 6e 64 20 70 4d 65 74 68 6f 64 20 74  xt and pMethod t
2a990 68 65 6e 20 63 6c 6f 73 65 20 69 74 20 2a 2f 0a  hen close it */.
2a9a0 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69      pFile->locki
2a9b0 6e 67 43 6f 6e 74 65 78 74 20 3d 20 70 43 74 78  ngContext = pCtx
2a9c0 2d 3e 6f 6c 64 4c 6f 63 6b 69 6e 67 43 6f 6e 74  ->oldLockingCont
2a9d0 65 78 74 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  ext;.    pFile->
2a9e0 70 4d 65 74 68 6f 64 20 3d 20 70 43 74 78 2d 3e  pMethod = pCtx->
2a9f0 70 4f 6c 64 4d 65 74 68 6f 64 3b 0a 20 20 20 20  pOldMethod;.    
2aa00 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 74  sqlite3_free(pCt
2aa10 78 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 70  x);.    return p
2aa20 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78  File->pMethod->x
2aa30 43 6c 6f 73 65 28 69 64 29 3b 0a 20 20 7d 0a 20  Close(id);.  }. 
2aa40 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2aa50 4b 3b 0a 7d 0a 0a 0a 0a 23 65 6e 64 69 66 20 2f  K;.}....#endif /
2aa60 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  * defined(__APPL
2aa70 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45  E__) && SQLITE_E
2aa80 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
2aa90 59 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68 65  YLE */./*.** The
2aaa0 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 73   proxy locking s
2aab0 74 79 6c 65 20 69 73 20 69 6e 74 65 6e 64 65 64  tyle is intended
2aac0 20 66 6f 72 20 75 73 65 20 77 69 74 68 20 41 46   for use with AF
2aad0 50 20 66 69 6c 65 73 79 73 74 65 6d 73 2e 0a 2a  P filesystems..*
2aae0 2a 20 41 6e 64 20 73 69 6e 63 65 20 41 46 50 20  * And since AFP 
2aaf0 69 73 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 65  is only supporte
2ab00 64 20 6f 6e 20 4d 61 63 4f 53 58 2c 20 74 68 65  d on MacOSX, the
2ab10 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69   proxy locking i
2ab20 73 20 61 6c 73 6f 0a 2a 2a 20 72 65 73 74 72 69  s also.** restri
2ab30 63 74 65 64 20 74 6f 20 4d 61 63 4f 53 58 2e 0a  cted to MacOSX..
2ab40 2a 2a 20 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ** .**.*********
2ab50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f  ********** End o
2ab60 66 20 74 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b  f the proxy lock
2ab70 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
2ab80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ab90 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
2aba0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2abb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2abc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2abd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2abe0 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e  *****/../*.** In
2abf0 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6f 70 65  itialize the ope
2ac00 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69 6e  rating system in
2ac10 74 65 72 66 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 54  terface..**.** T
2ac20 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 67 69  his routine regi
2ac30 73 74 65 72 73 20 61 6c 6c 20 56 46 53 20 69 6d  sters all VFS im
2ac40 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 66 6f  plementations fo
2ac50 72 20 75 6e 69 78 2d 6c 69 6b 65 20 6f 70 65 72  r unix-like oper
2ac60 61 74 69 6e 67 0a 2a 2a 20 73 79 73 74 65 6d 73  ating.** systems
2ac70 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 2c  .  This routine,
2ac80 20 61 6e 64 20 74 68 65 20 73 71 6c 69 74 65 33   and the sqlite3
2ac90 5f 6f 73 5f 65 6e 64 28 29 20 72 6f 75 74 69 6e  _os_end() routin
2aca0 65 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 2c 0a  e that follows,.
2acb0 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20 74 68 65  ** should be the
2acc0 20 6f 6e 6c 79 20 72 6f 75 74 69 6e 65 73 20 69   only routines i
2acd0 6e 20 74 68 69 73 20 66 69 6c 65 20 74 68 61 74  n this file that
2ace0 20 61 72 65 20 76 69 73 69 62 6c 65 20 66 72 6f   are visible fro
2acf0 6d 20 6f 74 68 65 72 0a 2a 2a 20 66 69 6c 65 73  m other.** files
2ad00 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
2ad10 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 6f  tine is called o
2ad20 6e 63 65 20 64 75 72 69 6e 67 20 53 51 4c 69 74  nce during SQLit
2ad30 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  e initialization
2ad40 20 61 6e 64 20 62 79 20 61 0a 2a 2a 20 73 69 6e   and by a.** sin
2ad50 67 6c 65 20 74 68 72 65 61 64 2e 20 20 54 68 65  gle thread.  The
2ad60 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
2ad70 6f 6e 20 61 6e 64 20 6d 75 74 65 78 20 73 75 62  on and mutex sub
2ad80 73 79 73 74 65 6d 73 20 68 61 76 65 20 6e 6f 74  systems have not
2ad90 0a 2a 2a 20 6e 65 63 65 73 73 61 72 69 6c 79 20  .** necessarily 
2ada0 62 65 65 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64  been initialized
2adb0 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
2adc0 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 61 6e  ne is called, an
2add0 64 20 73 6f 20 74 68 65 79 0a 2a 2a 20 73 68 6f  d so they.** sho
2ade0 75 6c 64 20 6e 6f 74 20 62 65 20 75 73 65 64 2e  uld not be used.
2adf0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
2ae00 6f 73 5f 69 6e 69 74 28 76 6f 69 64 29 7b 20 0a  os_init(void){ .
2ae10 20 20 2f 2a 20 0a 20 20 2a 2a 20 54 68 65 20 66    /* .  ** The f
2ae20 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 20 64  ollowing macro d
2ae30 65 66 69 6e 65 73 20 61 6e 20 69 6e 69 74 69 61  efines an initia
2ae40 6c 69 7a 65 72 20 66 6f 72 20 61 6e 20 73 71 6c  lizer for an sql
2ae50 69 74 65 33 5f 76 66 73 20 6f 62 6a 65 63 74 2e  ite3_vfs object.
2ae60 0a 20 20 2a 2a 20 54 68 65 20 6e 61 6d 65 20 6f  .  ** The name o
2ae70 66 20 74 68 65 20 56 46 53 20 69 73 20 4e 41 4d  f the VFS is NAM
2ae80 45 2e 20 20 54 68 65 20 70 41 70 70 44 61 74 61  E.  The pAppData
2ae90 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
2aea0 20 61 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20   a pointer.  ** 
2aeb0 74 6f 20 74 68 65 20 22 66 69 6e 64 65 72 22 20  to the "finder" 
2aec0 66 75 6e 63 74 69 6f 6e 2e 20 20 28 70 41 70 70  function.  (pApp
2aed0 44 61 74 61 20 69 73 20 61 20 70 6f 69 6e 74 65  Data is a pointe
2aee0 72 20 74 6f 20 61 20 70 6f 69 6e 74 65 72 20 62  r to a pointer b
2aef0 65 63 61 75 73 65 0a 20 20 2a 2a 20 73 69 6c 6c  ecause.  ** sill
2af00 79 20 43 39 30 20 72 75 6c 65 73 20 70 72 6f 68  y C90 rules proh
2af10 69 62 69 74 20 61 20 76 6f 69 64 2a 20 66 72 6f  ibit a void* fro
2af20 6d 20 62 65 69 6e 67 20 63 61 73 74 20 74 6f 20  m being cast to 
2af30 61 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74  a function point
2af40 65 72 0a 20 20 2a 2a 20 61 6e 64 20 73 6f 20 77  er.  ** and so w
2af50 65 20 68 61 76 65 20 74 6f 20 67 6f 20 74 68 72  e have to go thr
2af60 6f 75 67 68 20 74 68 65 20 69 6e 74 65 72 6d 65  ough the interme
2af70 64 69 61 74 65 20 70 6f 69 6e 74 65 72 20 74 6f  diate pointer to
2af80 20 61 76 6f 69 64 20 70 72 6f 62 6c 65 6d 73 0a   avoid problems.
2af90 20 20 2a 2a 20 77 68 65 6e 20 63 6f 6d 70 69 6c    ** when compil
2afa0 69 6e 67 20 77 69 74 68 20 2d 70 65 64 61 6e 74  ing with -pedant
2afb0 69 63 2d 65 72 72 6f 72 73 20 6f 6e 20 47 43 43  ic-errors on GCC
2afc0 2e 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  .).  **.  ** The
2afd0 20 46 49 4e 44 45 52 20 70 61 72 61 6d 65 74 65   FINDER paramete
2afe0 72 20 74 6f 20 74 68 69 73 20 6d 61 63 72 6f 20  r to this macro 
2aff0 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  is the name of t
2b000 68 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68  he pointer to th
2b010 65 0a 20 20 2a 2a 20 66 69 6e 64 65 72 2d 66 75  e.  ** finder-fu
2b020 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 66 69 6e  nction.  The fin
2b030 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 72 65 74  der-function ret
2b040 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74  urns a pointer t
2b050 6f 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74  o the.  ** sqlit
2b060 65 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a  e_io_methods obj
2b070 65 63 74 20 74 68 61 74 20 69 6d 70 6c 65 6d 65  ect that impleme
2b080 6e 74 73 20 74 68 65 20 64 65 73 69 72 65 64 20  nts the desired 
2b090 6c 6f 63 6b 69 6e 67 0a 20 20 2a 2a 20 62 65 68  locking.  ** beh
2b0a0 61 76 69 6f 72 73 2e 20 20 53 65 65 20 74 68 65  aviors.  See the
2b0b0 20 64 69 76 69 73 69 6f 6e 20 61 62 6f 76 65 20   division above 
2b0c0 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
2b0d0 65 20 49 4f 4d 45 54 48 4f 44 53 0a 20 20 2a 2a  e IOMETHODS.  **
2b0e0 20 6d 61 63 72 6f 20 66 6f 72 20 61 64 64 69 74   macro for addit
2b0f0 69 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ion information 
2b100 6f 6e 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69  on finder-functi
2b110 6f 6e 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d  ons..  **.  ** M
2b120 6f 73 74 20 66 69 6e 64 65 72 73 20 73 69 6d 70  ost finders simp
2b130 6c 79 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  ly return a poin
2b140 74 65 72 20 74 6f 20 61 20 66 69 78 65 64 20 73  ter to a fixed s
2b150 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
2b160 73 0a 20 20 2a 2a 20 6f 62 6a 65 63 74 2e 20 20  s.  ** object.  
2b170 42 75 74 20 74 68 65 20 22 61 75 74 6f 6c 6f 63  But the "autoloc
2b180 6b 49 6f 46 69 6e 64 65 72 22 20 61 76 61 69 6c  kIoFinder" avail
2b190 61 62 6c 65 20 6f 6e 20 4d 61 63 4f 53 58 20 64  able on MacOSX d
2b1a0 6f 65 73 20 61 20 6c 69 74 74 6c 65 0a 20 20 2a  oes a little.  *
2b1b0 2a 20 6d 6f 72 65 20 74 68 61 6e 20 74 68 61 74  * more than that
2b1c0 3b 20 69 74 20 6c 6f 6f 6b 73 20 61 74 20 74 68  ; it looks at th
2b1d0 65 20 66 69 6c 65 73 79 73 74 65 6d 20 74 79 70  e filesystem typ
2b1e0 65 20 74 68 61 74 20 68 6f 73 74 73 20 74 68 65  e that hosts the
2b1f0 20 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20   .  ** database 
2b200 66 69 6c 65 20 61 6e 64 20 74 72 69 65 73 20 74  file and tries t
2b210 6f 20 63 68 6f 6f 73 65 20 61 6e 20 6c 6f 63 6b  o choose an lock
2b220 69 6e 67 20 6d 65 74 68 6f 64 20 61 70 70 72 6f  ing method appro
2b230 70 72 69 61 74 65 20 66 6f 72 0a 20 20 2a 2a 20  priate for.  ** 
2b240 74 68 61 74 20 66 69 6c 65 73 79 73 74 65 6d 20  that filesystem 
2b250 74 69 6d 65 2e 0a 20 20 2a 2f 0a 20 20 23 64 65  time..  */.  #de
2b260 66 69 6e 65 20 55 4e 49 58 56 46 53 28 56 46 53  fine UNIXVFS(VFS
2b270 4e 41 4d 45 2c 20 46 49 4e 44 45 52 29 20 7b 20  NAME, FINDER) { 
2b280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b290 20 20 20 20 20 20 20 5c 0a 20 20 20 20 31 2c 20         \.    1, 
2b2a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b2b0 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a     /* iVersion *
2b2c0 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
2b2d0 20 20 20 20 20 5c 0a 20 20 20 20 73 69 7a 65 6f       \.    sizeo
2b2e0 66 28 75 6e 69 78 46 69 6c 65 29 2c 20 20 20 20  f(unixFile),    
2b2f0 20 2f 2a 20 73 7a 4f 73 46 69 6c 65 20 2a 2f 20   /* szOsFile */ 
2b300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b310 20 20 20 5c 0a 20 20 20 20 4d 41 58 5f 50 41 54     \.    MAX_PAT
2b320 48 4e 41 4d 45 2c 20 20 20 20 20 20 20 20 20 2f  HNAME,         /
2b330 2a 20 6d 78 50 61 74 68 6e 61 6d 65 20 2a 2f 20  * mxPathname */ 
2b340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b350 20 5c 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20   \.    0,       
2b360 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2b370 70 4e 65 78 74 20 2a 2f 20 20 20 20 20 20 20 20  pNext */        
2b380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
2b390 0a 20 20 20 20 56 46 53 4e 41 4d 45 2c 20 20 20  .    VFSNAME,   
2b3a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 4e             /* zN
2b3b0 61 6d 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ame */          
2b3c0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
2b3d0 20 20 20 28 76 6f 69 64 2a 29 26 46 49 4e 44 45     (void*)&FINDE
2b3e0 52 2c 20 20 20 20 20 20 20 2f 2a 20 70 41 70 70  R,       /* pApp
2b3f0 44 61 74 61 20 2a 2f 20 20 20 20 20 20 20 20 20  Data */         
2b400 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
2b410 20 75 6e 69 78 4f 70 65 6e 2c 20 20 20 20 20 20   unixOpen,      
2b420 20 20 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e 20         /* xOpen 
2b430 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
2b440 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75           \.    u
2b450 6e 69 78 44 65 6c 65 74 65 2c 20 20 20 20 20 20  nixDelete,      
2b460 20 20 20 20 20 2f 2a 20 78 44 65 6c 65 74 65 20       /* xDelete 
2b470 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
2b480 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69         \.    uni
2b490 78 41 63 63 65 73 73 2c 20 20 20 20 20 20 20 20  xAccess,        
2b4a0 20 20 20 2f 2a 20 78 41 63 63 65 73 73 20 2a 2f     /* xAccess */
2b4b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b4c0 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 46       \.    unixF
2b4d0 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 20 20 20  ullPathname,    
2b4e0 20 2f 2a 20 78 46 75 6c 6c 50 61 74 68 6e 61 6d   /* xFullPathnam
2b4f0 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  e */            
2b500 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 44 6c 4f     \.    unixDlO
2b510 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20 2f  pen,           /
2b520 2a 20 78 44 6c 4f 70 65 6e 20 2a 2f 20 20 20 20  * xDlOpen */    
2b530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b540 20 5c 0a 20 20 20 20 75 6e 69 78 44 6c 45 72 72   \.    unixDlErr
2b550 6f 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  or,          /* 
2b560 78 44 6c 45 72 72 6f 72 20 2a 2f 20 20 20 20 20  xDlError */     
2b570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
2b580 0a 20 20 20 20 75 6e 69 78 44 6c 53 79 6d 2c 20  .    unixDlSym, 
2b590 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44             /* xD
2b5a0 6c 53 79 6d 20 2a 2f 20 20 20 20 20 20 20 20 20  lSym */         
2b5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
2b5c0 20 20 20 75 6e 69 78 44 6c 43 6c 6f 73 65 2c 20     unixDlClose, 
2b5d0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 43           /* xDlC
2b5e0 6c 6f 73 65 20 2a 2f 20 20 20 20 20 20 20 20 20  lose */         
2b5f0 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
2b600 20 75 6e 69 78 52 61 6e 64 6f 6d 6e 65 73 73 2c   unixRandomness,
2b610 20 20 20 20 20 20 20 2f 2a 20 78 52 61 6e 64 6f         /* xRando
2b620 6d 6e 65 73 73 20 2a 2f 20 20 20 20 20 20 20 20  mness */        
2b630 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75           \.    u
2b640 6e 69 78 53 6c 65 65 70 2c 20 20 20 20 20 20 20  nixSleep,       
2b650 20 20 20 20 20 2f 2a 20 78 53 6c 65 65 70 20 2a       /* xSleep *
2b660 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
2b670 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69         \.    uni
2b680 78 43 75 72 72 65 6e 74 54 69 6d 65 2c 20 20 20  xCurrentTime,   
2b690 20 20 20 2f 2a 20 78 43 75 72 72 65 6e 74 54 69     /* xCurrentTi
2b6a0 6d 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  me */           
2b6b0 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 47       \.    unixG
2b6c0 65 74 4c 61 73 74 45 72 72 6f 72 20 20 20 20 20  etLastError     
2b6d0 20 2f 2a 20 78 47 65 74 4c 61 73 74 45 72 72 6f   /* xGetLastErro
2b6e0 72 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  r */            
2b6f0 20 20 20 5c 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20     \.  }..  /*. 
2b700 20 2a 2a 20 41 6c 6c 20 64 65 66 61 75 6c 74 20   ** All default 
2b710 56 46 53 65 73 20 66 6f 72 20 75 6e 69 78 20 61  VFSes for unix a
2b720 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  re contained in 
2b730 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72  the following ar
2b740 72 61 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e  ray..  **.  ** N
2b750 6f 74 65 20 74 68 61 74 20 74 68 65 20 73 71 6c  ote that the sql
2b760 69 74 65 33 5f 76 66 73 2e 70 4e 65 78 74 20 66  ite3_vfs.pNext f
2b770 69 65 6c 64 20 6f 66 20 74 68 65 20 56 46 53 20  ield of the VFS 
2b780 6f 62 6a 65 63 74 20 69 73 20 6d 6f 64 69 66 69  object is modifi
2b790 65 64 0a 20 20 2a 2a 20 62 79 20 74 68 65 20 53  ed.  ** by the S
2b7a0 51 4c 69 74 65 20 63 6f 72 65 20 77 68 65 6e 20  QLite core when 
2b7b0 74 68 65 20 56 46 53 20 69 73 20 72 65 67 69 73  the VFS is regis
2b7c0 74 65 72 65 64 2e 20 20 53 6f 20 74 68 65 20 66  tered.  So the f
2b7d0 6f 6c 6c 6f 77 69 6e 67 0a 20 20 2a 2a 20 61 72  ollowing.  ** ar
2b7e0 72 61 79 20 63 61 6e 6e 6f 74 20 62 65 20 63 6f  ray cannot be co
2b7f0 6e 73 74 2e 0a 20 20 2a 2f 0a 20 20 73 74 61 74  nst..  */.  stat
2b800 69 63 20 73 71 6c 69 74 65 33 5f 76 66 73 20 61  ic sqlite3_vfs a
2b810 56 66 73 5b 5d 20 3d 20 7b 0a 23 69 66 20 53 51  Vfs[] = {.#if SQ
2b820 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
2b830 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 28 4f 53  ING_STYLE && (OS
2b840 5f 56 58 57 4f 52 4b 53 20 7c 7c 20 64 65 66 69  _VXWORKS || defi
2b850 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 29 0a  ned(__APPLE__)).
2b860 20 20 20 20 55 4e 49 58 56 46 53 28 22 75 6e 69      UNIXVFS("uni
2b870 78 22 2c 20 20 20 20 20 20 20 20 20 20 61 75 74  x",          aut
2b880 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 20 29 2c  olockIoFinder ),
2b890 0a 23 65 6c 73 65 0a 20 20 20 20 55 4e 49 58 56  .#else.    UNIXV
2b8a0 46 53 28 22 75 6e 69 78 22 2c 20 20 20 20 20 20  FS("unix",      
2b8b0 20 20 20 20 70 6f 73 69 78 49 6f 46 69 6e 64 65      posixIoFinde
2b8c0 72 20 29 2c 0a 23 65 6e 64 69 66 0a 20 20 20 20  r ),.#endif.    
2b8d0 55 4e 49 58 56 46 53 28 22 75 6e 69 78 2d 6e 6f  UNIXVFS("unix-no
2b8e0 6e 65 22 2c 20 20 20 20 20 6e 6f 6c 6f 63 6b 49  ne",     nolockI
2b8f0 6f 46 69 6e 64 65 72 20 29 2c 0a 20 20 20 20 55  oFinder ),.    U
2b900 4e 49 58 56 46 53 28 22 75 6e 69 78 2d 64 6f 74  NIXVFS("unix-dot
2b910 66 69 6c 65 22 2c 20 20 64 6f 74 6c 6f 63 6b 49  file",  dotlockI
2b920 6f 46 69 6e 64 65 72 20 29 2c 0a 20 20 20 20 55  oFinder ),.    U
2b930 4e 49 58 56 46 53 28 22 75 6e 69 78 2d 77 66 6c  NIXVFS("unix-wfl
2b940 22 2c 20 20 20 20 20 20 70 6f 73 69 78 57 66 6c  ",      posixWfl
2b950 49 6f 46 69 6e 64 65 72 20 29 2c 0a 23 69 66 20  IoFinder ),.#if 
2b960 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 20 20 55  OS_VXWORKS.    U
2b970 4e 49 58 56 46 53 28 22 75 6e 69 78 2d 6e 61 6d  NIXVFS("unix-nam
2b980 65 64 73 65 6d 22 2c 20 73 65 6d 49 6f 46 69 6e  edsem", semIoFin
2b990 64 65 72 20 29 2c 0a 23 65 6e 64 69 66 0a 23 69  der ),.#endif.#i
2b9a0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
2b9b0 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20  LOCKING_STYLE.  
2b9c0 20 20 55 4e 49 58 56 46 53 28 22 75 6e 69 78 2d    UNIXVFS("unix-
2b9d0 70 6f 73 69 78 22 2c 20 20 20 20 70 6f 73 69 78  posix",    posix
2b9e0 49 6f 46 69 6e 64 65 72 20 29 2c 0a 23 69 66 20  IoFinder ),.#if 
2b9f0 21 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 20 20  !OS_VXWORKS.    
2ba00 55 4e 49 58 56 46 53 28 22 75 6e 69 78 2d 66 6c  UNIXVFS("unix-fl
2ba10 6f 63 6b 22 2c 20 20 20 20 66 6c 6f 63 6b 49 6f  ock",    flockIo
2ba20 46 69 6e 64 65 72 20 29 2c 0a 23 65 6e 64 69 66  Finder ),.#endif
2ba30 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
2ba40 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
2ba50 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e  G_STYLE && defin
2ba60 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20  ed(__APPLE__).  
2ba70 20 20 55 4e 49 58 56 46 53 28 22 75 6e 69 78 2d    UNIXVFS("unix-
2ba80 61 66 70 22 2c 20 20 20 20 20 20 61 66 70 49 6f  afp",      afpIo
2ba90 46 69 6e 64 65 72 20 29 2c 0a 20 20 20 20 55 4e  Finder ),.    UN
2baa0 49 58 56 46 53 28 22 75 6e 69 78 2d 70 72 6f 78  IXVFS("unix-prox
2bab0 79 22 2c 20 20 20 20 70 72 6f 78 79 49 6f 46 69  y",    proxyIoFi
2bac0 6e 64 65 72 20 29 2c 0a 23 65 6e 64 69 66 0a 20  nder ),.#endif. 
2bad0 20 7d 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69   };.  unsigned i
2bae0 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 2f  nt i;          /
2baf0 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
2bb00 2f 0a 0a 20 20 2f 2a 20 52 65 67 69 73 74 65 72  /..  /* Register
2bb10 20 61 6c 6c 20 56 46 53 65 73 20 64 65 66 69 6e   all VFSes defin
2bb20 65 64 20 69 6e 20 74 68 65 20 61 56 66 73 5b 5d  ed in the aVfs[]
2bb30 20 61 72 72 61 79 20 2a 2f 0a 20 20 66 6f 72 28   array */.  for(
2bb40 69 3d 30 3b 20 69 3c 28 73 69 7a 65 6f 66 28 61  i=0; i<(sizeof(a
2bb50 56 66 73 29 2f 73 69 7a 65 6f 66 28 73 71 6c 69  Vfs)/sizeof(sqli
2bb60 74 65 33 5f 76 66 73 29 29 3b 20 69 2b 2b 29 7b  te3_vfs)); i++){
2bb70 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73  .    sqlite3_vfs
2bb80 5f 72 65 67 69 73 74 65 72 28 26 61 56 66 73 5b  _register(&aVfs[
2bb90 69 5d 2c 20 69 3d 3d 30 29 3b 0a 20 20 7d 0a 20  i], i==0);.  }. 
2bba0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2bbb0 4b 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68 75  K; .}../*.** Shu
2bbc0 74 64 6f 77 6e 20 74 68 65 20 6f 70 65 72 61 74  tdown the operat
2bbd0 69 6e 67 20 73 79 73 74 65 6d 20 69 6e 74 65 72  ing system inter
2bbe0 66 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65  face..**.** Some
2bbf0 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
2bc00 6d 73 20 6d 69 67 68 74 20 6e 65 65 64 20 74 6f  ms might need to
2bc10 20 64 6f 20 73 6f 6d 65 20 63 6c 65 61 6e 75 70   do some cleanup
2bc20 20 69 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65   in this routine
2bc30 2c 0a 2a 2a 20 74 6f 20 72 65 6c 65 61 73 65 20  ,.** to release 
2bc40 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f  dynamically allo
2bc50 63 61 74 65 64 20 6f 62 6a 65 63 74 73 2e 20 20  cated objects.  
2bc60 42 75 74 20 6e 6f 74 20 6f 6e 20 75 6e 69 78 2e  But not on unix.
2bc70 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2bc80 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20   is a no-op for 
2bc90 75 6e 69 78 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  unix..*/.int sql
2bca0 69 74 65 33 5f 6f 73 5f 65 6e 64 28 76 6f 69 64  ite3_os_end(void
2bcb0 29 7b 20 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ){ .  return SQL
2bcc0 49 54 45 5f 4f 4b 3b 20 0a 7d 0a 20 0a 23 65 6e  ITE_OK; .}. .#en
2bcd0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 53  dif /* SQLITE_OS
2bce0 5f 55 4e 49 58 20 2a 2f 0a                       _UNIX */.