/ Hex Artifact Content
Login

Artifact b0f41dcee44f93886f8df7ce80649925f1d1d5c2:


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 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  .#define SQLITE_
1240: 46 53 46 4c 41 47 53 5f 49 53 5f 52 45 41 44 4f  FSFLAGS_IS_READO
1250: 4e 4c 59 20 20 30 78 31 0a 23 64 65 66 69 6e 65  NLY  0x1.#define
1260: 20 53 51 4c 49 54 45 5f 46 53 46 4c 41 47 53 5f   SQLITE_FSFLAGS_
1270: 49 53 5f 4c 4f 43 41 4c 20 20 20 20 20 30 78 32  IS_LOCAL     0x2
1280: 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  .#define SQLITE_
1290: 46 53 46 4c 41 47 53 5f 49 53 5f 48 46 53 50 4c  FSFLAGS_IS_HFSPL
12a0: 55 53 20 20 20 30 78 34 0a 23 64 65 66 69 6e 65  US   0x4.#define
12b0: 20 53 51 4c 49 54 45 5f 46 53 46 4c 41 47 53 5f   SQLITE_FSFLAGS_
12c0: 49 53 5f 4d 53 44 4f 53 20 20 20 20 20 30 78 38  IS_MSDOS     0x8
12d0: 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  .#define SQLITE_
12e0: 46 53 46 4c 41 47 53 5f 49 4e 49 54 49 41 4c 49  FSFLAGS_INITIALI
12f0: 5a 45 44 20 20 20 20 20 30 78 31 30 30 30 30 0a  ZED     0x10000.
1300: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65 20 61 72  ../*.** If we ar
1310: 65 20 74 6f 20 62 65 20 74 68 72 65 61 64 2d 73  e to be thread-s
1320: 61 66 65 2c 20 69 6e 63 6c 75 64 65 20 74 68 65  afe, include the
1330: 20 70 74 68 72 65 61 64 73 20 68 65 61 64 65 72   pthreads header
1340: 20 61 6e 64 20 64 65 66 69 6e 65 0a 2a 2a 20 74   and define.** t
1350: 68 65 20 53 51 4c 49 54 45 5f 55 4e 49 58 5f 54  he SQLITE_UNIX_T
1360: 48 52 45 41 44 53 20 6d 61 63 72 6f 2e 0a 2a 2f  HREADS macro..*/
1370: 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45  .#if SQLITE_THRE
1380: 41 44 53 41 46 45 0a 23 20 69 6e 63 6c 75 64 65  ADSAFE.# include
1390: 20 3c 70 74 68 72 65 61 64 2e 68 3e 0a 23 20 64   <pthread.h>.# d
13a0: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 55 4e 49  efine SQLITE_UNI
13b0: 58 5f 54 48 52 45 41 44 53 20 31 0a 23 65 6e 64  X_THREADS 1.#end
13c0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 61 75 6c  if../*.** Defaul
13d0: 74 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 77 68  t permissions wh
13e0: 65 6e 20 63 72 65 61 74 69 6e 67 20 61 20 6e 65  en creating a ne
13f0: 77 20 66 69 6c 65 0a 2a 2f 0a 23 69 66 6e 64 65  w file.*/.#ifnde
1400: 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  f SQLITE_DEFAULT
1410: 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e  _FILE_PERMISSION
1420: 53 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54  S.# define SQLIT
1430: 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50  E_DEFAULT_FILE_P
1440: 45 52 4d 49 53 53 49 4f 4e 53 20 30 36 34 34 0a  ERMISSIONS 0644.
1450: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 2a 20 44  #endif../*. ** D
1460: 65 66 61 75 6c 74 20 70 65 72 6d 69 73 73 69 6f  efault permissio
1470: 6e 73 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67  ns when creating
1480: 20 61 75 74 6f 20 70 72 6f 78 79 20 64 69 72 0a   auto proxy dir.
1490: 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
14a0: 54 45 5f 44 45 46 41 55 4c 54 5f 50 52 4f 58 59  TE_DEFAULT_PROXY
14b0: 44 49 52 5f 50 45 52 4d 49 53 53 49 4f 4e 53 0a  DIR_PERMISSIONS.
14c0: 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  # define SQLITE_
14d0: 44 45 46 41 55 4c 54 5f 50 52 4f 58 59 44 49 52  DEFAULT_PROXYDIR
14e0: 5f 50 45 52 4d 49 53 53 49 4f 4e 53 20 30 37 35  _PERMISSIONS 075
14f0: 35 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  5.#endif../*.** 
1500: 4d 61 78 69 6d 75 6d 20 73 75 70 70 6f 72 74 65  Maximum supporte
1510: 64 20 70 61 74 68 2d 6c 65 6e 67 74 68 2e 0a 2a  d path-length..*
1520: 2f 0a 23 64 65 66 69 6e 65 20 4d 41 58 5f 50 41  /.#define MAX_PA
1530: 54 48 4e 41 4d 45 20 35 31 32 0a 0a 2f 2a 0a 2a  THNAME 512../*.*
1540: 2a 20 4f 6e 6c 79 20 73 65 74 20 74 68 65 20 6c  * Only set the l
1550: 61 73 74 45 72 72 6e 6f 20 69 66 20 74 68 65 20  astErrno if the 
1560: 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 61 20  error code is a 
1570: 72 65 61 6c 20 65 72 72 6f 72 20 61 6e 64 20 6e  real error and n
1580: 6f 74 20 0a 2a 2a 20 61 20 6e 6f 72 6d 61 6c 20  ot .** a normal 
1590: 65 78 70 65 63 74 65 64 20 72 65 74 75 72 6e 20  expected return 
15a0: 63 6f 64 65 20 6f 66 20 53 51 4c 49 54 45 5f 42  code of SQLITE_B
15b0: 55 53 59 20 6f 72 20 53 51 4c 49 54 45 5f 4f 4b  USY or SQLITE_OK
15c0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 49 53 5f 4c  .*/.#define IS_L
15d0: 4f 43 4b 5f 45 52 52 4f 52 28 78 29 20 20 28 28  OCK_ERROR(x)  ((
15e0: 78 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 29 20  x != SQLITE_OK) 
15f0: 26 26 20 28 78 20 21 3d 20 53 51 4c 49 54 45 5f  && (x != SQLITE_
1600: 42 55 53 59 29 29 0a 0a 0a 2f 2a 0a 2a 2a 20 53  BUSY)).../*.** S
1610: 6f 6d 65 74 69 6d 65 73 2c 20 61 66 74 65 72 20  ometimes, after 
1620: 61 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 69 73  a file handle is
1630: 20 63 6c 6f 73 65 64 20 62 79 20 53 51 4c 69 74   closed by SQLit
1640: 65 2c 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  e, the file desc
1650: 72 69 70 74 6f 72 0a 2a 2a 20 63 61 6e 6e 6f 74  riptor.** cannot
1660: 20 62 65 20 63 6c 6f 73 65 64 20 69 6d 6d 65 64   be closed immed
1670: 69 61 74 65 6c 79 2e 20 49 6e 20 74 68 65 73 65  iately. In these
1680: 20 63 61 73 65 73 2c 20 69 6e 73 74 61 6e 63 65   cases, instance
1690: 73 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  s of the followi
16a0: 6e 67 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20  ng.** structure 
16b0: 61 72 65 20 75 73 65 64 20 74 6f 20 73 74 6f 72  are used to stor
16c0: 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  e the file descr
16d0: 69 70 74 6f 72 20 77 68 69 6c 65 20 77 61 69 74  iptor while wait
16e0: 69 6e 67 20 66 6f 72 20 61 6e 0a 2a 2a 20 6f 70  ing for an.** op
16f0: 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 65 69 74  portunity to eit
1700: 68 65 72 20 63 6c 6f 73 65 20 6f 72 20 72 65 75  her close or reu
1710: 73 65 20 69 74 2e 0a 2a 2f 0a 74 79 70 65 64 65  se it..*/.typede
1720: 66 20 73 74 72 75 63 74 20 55 6e 69 78 55 6e 75  f struct UnixUnu
1730: 73 65 64 46 64 20 55 6e 69 78 55 6e 75 73 65 64  sedFd UnixUnused
1740: 46 64 3b 0a 73 74 72 75 63 74 20 55 6e 69 78 55  Fd;.struct UnixU
1750: 6e 75 73 65 64 46 64 20 7b 0a 20 20 69 6e 74 20  nusedFd {.  int 
1760: 66 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  fd;             
1770: 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65        /* File de
1780: 73 63 72 69 70 74 6f 72 20 74 6f 20 63 6c 6f 73  scriptor to clos
1790: 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  e */.  int flags
17a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
17b0: 20 2f 2a 20 46 6c 61 67 73 20 74 68 69 73 20 66   /* Flags this f
17c0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 77  ile descriptor w
17d0: 61 73 20 6f 70 65 6e 65 64 20 77 69 74 68 20 2a  as opened with *
17e0: 2f 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64  /.  UnixUnusedFd
17f0: 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 2f 2a   *pNext;      /*
1800: 20 4e 65 78 74 20 75 6e 75 73 65 64 20 66 69 6c   Next unused fil
1810: 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f 6e 20  e descriptor on 
1820: 73 61 6d 65 20 66 69 6c 65 20 2a 2f 0a 7d 3b 0a  same file */.};.
1830: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 75 6e 69 78 46  ./*.** The unixF
1840: 69 6c 65 20 73 74 72 75 63 74 75 72 65 20 69 73  ile structure is
1850: 20 73 75 62 63 6c 61 73 73 20 6f 66 20 73 71 6c   subclass of sql
1860: 69 74 65 33 5f 66 69 6c 65 20 73 70 65 63 69 66  ite3_file specif
1870: 69 63 20 74 6f 20 74 68 65 20 75 6e 69 78 0a 2a  ic to the unix.*
1880: 2a 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74 61  * VFS implementa
1890: 74 69 6f 6e 73 2e 0a 2a 2f 0a 74 79 70 65 64 65  tions..*/.typede
18a0: 66 20 73 74 72 75 63 74 20 75 6e 69 78 46 69 6c  f struct unixFil
18b0: 65 20 75 6e 69 78 46 69 6c 65 3b 0a 73 74 72 75  e unixFile;.stru
18c0: 63 74 20 75 6e 69 78 46 69 6c 65 20 7b 0a 20 20  ct unixFile {.  
18d0: 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
18e0: 64 73 20 63 6f 6e 73 74 20 2a 70 4d 65 74 68 6f  ds const *pMetho
18f0: 64 3b 20 20 2f 2a 20 41 6c 77 61 79 73 20 74 68  d;  /* Always th
1900: 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 2a 2f  e first entry */
1910: 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78 4f 70  .  struct unixOp
1920: 65 6e 43 6e 74 20 2a 70 4f 70 65 6e 3b 20 20 20  enCnt *pOpen;   
1930: 20 20 20 20 2f 2a 20 49 6e 66 6f 20 61 62 6f 75      /* Info abou
1940: 74 20 61 6c 6c 20 6f 70 65 6e 20 66 64 27 73 20  t all open fd's 
1950: 6f 6e 20 74 68 69 73 20 69 6e 6f 64 65 20 2a 2f  on this inode */
1960: 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78 4c 6f  .  struct unixLo
1970: 63 6b 49 6e 66 6f 20 2a 70 4c 6f 63 6b 3b 20 20  ckInfo *pLock;  
1980: 20 20 20 20 2f 2a 20 49 6e 66 6f 20 61 62 6f 75      /* Info abou
1990: 74 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 69 73 20  t locks on this 
19a0: 69 6e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 68  inode */.  int h
19b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
19c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
19d0: 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
19e0: 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 64 69 72 66  or */.  int dirf
19f0: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
1a00: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
1a10: 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20   descriptor for 
1a20: 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 2a 2f  the directory */
1a30: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
1a40: 20 6c 6f 63 6b 74 79 70 65 3b 20 20 20 20 20 20   locktype;      
1a50: 20 20 20 20 2f 2a 20 54 68 65 20 74 79 70 65 20      /* The type 
1a60: 6f 66 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20  of lock held on 
1a70: 74 68 69 73 20 66 64 20 2a 2f 0a 20 20 69 6e 74  this fd */.  int
1a80: 20 6c 61 73 74 45 72 72 6e 6f 3b 20 20 20 20 20   lastErrno;     
1a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1aa0: 20 54 68 65 20 75 6e 69 78 20 65 72 72 6e 6f 20   The unix errno 
1ab0: 66 72 6f 6d 20 74 68 65 20 6c 61 73 74 20 49 2f  from the last I/
1ac0: 4f 20 65 72 72 6f 72 20 2a 2f 0a 20 20 76 6f 69  O error */.  voi
1ad0: 64 20 2a 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  d *lockingContex
1ae0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t;            /*
1af0: 20 4c 6f 63 6b 69 6e 67 20 73 74 79 6c 65 20 73   Locking style s
1b00: 70 65 63 69 66 69 63 20 73 74 61 74 65 20 2a 2f  pecific state */
1b10: 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20  .  UnixUnusedFd 
1b20: 2a 70 55 6e 75 73 65 64 3b 20 20 20 20 20 20 20  *pUnused;       
1b30: 20 20 20 20 2f 2a 20 50 72 65 2d 61 6c 6c 6f 63      /* Pre-alloc
1b40: 61 74 65 64 20 55 6e 69 78 55 6e 75 73 65 64 46  ated UnixUnusedF
1b50: 64 20 2a 2f 0a 20 20 69 6e 74 20 66 69 6c 65 46  d */.  int fileF
1b60: 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
1b70: 20 20 20 20 20 20 20 20 2f 2a 20 4d 69 73 63 65          /* Misce
1b80: 6c 6c 61 6e 6f 75 73 20 66 6c 61 67 73 20 2a 2f  llanous flags */
1b90: 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
1ba0: 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
1bb0: 0a 20 20 69 6e 74 20 6f 70 65 6e 46 6c 61 67 73  .  int openFlags
1bc0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1bd0: 20 20 20 20 2f 2a 20 54 68 65 20 66 6c 61 67 73      /* The flags
1be0: 20 73 70 65 63 69 66 69 65 64 20 61 74 20 6f 70   specified at op
1bf0: 65 6e 28 29 20 2a 2f 0a 23 65 6e 64 69 66 0a 23  en() */.#endif.#
1c00: 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
1c10: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 7c  _LOCKING_STYLE |
1c20: 7c 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  | defined(__APPL
1c30: 45 5f 5f 29 0a 20 20 75 6e 73 69 67 6e 65 64 20  E__).  unsigned 
1c40: 66 73 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20  fsFlags;        
1c50: 20 20 20 20 20 20 20 20 20 2f 2a 20 63 61 63 68           /* cach
1c60: 65 64 20 64 65 74 61 69 6c 73 20 66 72 6f 6d 20  ed details from 
1c70: 73 74 61 74 66 73 28 29 20 2a 2f 0a 23 65 6e 64  statfs() */.#end
1c80: 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48  if.#if SQLITE_TH
1c90: 52 45 41 44 53 41 46 45 20 26 26 20 64 65 66 69  READSAFE && defi
1ca0: 6e 65 64 28 5f 5f 6c 69 6e 75 78 5f 5f 29 0a 20  ned(__linux__). 
1cb0: 20 70 74 68 72 65 61 64 5f 74 20 74 69 64 3b 20   pthread_t tid; 
1cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cd0: 20 20 2f 2a 20 54 68 65 20 74 68 72 65 61 64 20    /* The thread 
1ce0: 74 68 61 74 20 22 6f 77 6e 73 22 20 74 68 69 73  that "owns" this
1cf0: 20 75 6e 69 78 46 69 6c 65 20 2a 2f 0a 23 65 6e   unixFile */.#en
1d00: 64 69 66 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52  dif.#if OS_VXWOR
1d10: 4b 53 0a 20 20 69 6e 74 20 69 73 44 65 6c 65 74  KS.  int isDelet
1d20: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
1d30: 20 20 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20        /* Delete 
1d40: 6f 6e 20 63 6c 6f 73 65 20 69 66 20 74 72 75 65  on close if true
1d50: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 76 78 77   */.  struct vxw
1d60: 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 49 64 3b  orksFileId *pId;
1d70: 20 20 20 20 20 20 20 2f 2a 20 55 6e 69 71 75 65         /* Unique
1d80: 20 66 69 6c 65 20 49 44 20 2a 2f 0a 23 65 6e 64   file ID */.#end
1d90: 69 66 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  if.#ifndef NDEBU
1da0: 47 0a 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20  G.  /* The next 
1db0: 67 72 6f 75 70 20 6f 66 20 76 61 72 69 61 62 6c  group of variabl
1dc0: 65 73 20 61 72 65 20 75 73 65 64 20 74 6f 20 74  es are used to t
1dd0: 72 61 63 6b 20 77 68 65 74 68 65 72 20 6f 72 20  rack whether or 
1de0: 6e 6f 74 20 74 68 65 0a 20 20 2a 2a 20 74 72 61  not the.  ** tra
1df0: 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72  nsaction counter
1e00: 20 69 6e 20 62 79 74 65 73 20 32 34 2d 32 37 20   in bytes 24-27 
1e10: 6f 66 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  of database file
1e20: 73 20 61 72 65 20 75 70 64 61 74 65 64 0a 20 20  s are updated.  
1e30: 2a 2a 20 77 68 65 6e 65 76 65 72 20 61 6e 79 20  ** whenever any 
1e40: 70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61  part of the data
1e50: 62 61 73 65 20 63 68 61 6e 67 65 73 2e 20 20 41  base changes.  A
1e60: 6e 20 61 73 73 65 72 74 69 6f 6e 20 66 61 75 6c  n assertion faul
1e70: 74 20 77 69 6c 6c 0a 20 20 2a 2a 20 6f 63 63 75  t will.  ** occu
1e80: 72 20 69 66 20 61 20 66 69 6c 65 20 69 73 20 75  r if a file is u
1e90: 70 64 61 74 65 64 20 77 69 74 68 6f 75 74 20 61  pdated without a
1ea0: 6c 73 6f 20 75 70 64 61 74 69 6e 67 20 74 68 65  lso updating the
1eb0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a   transaction.  *
1ec0: 2a 20 63 6f 75 6e 74 65 72 2e 20 20 54 68 69 73  * counter.  This
1ed0: 20 74 65 73 74 20 69 73 20 6d 61 64 65 20 74 6f   test is made to
1ee0: 20 61 76 6f 69 64 20 6e 65 77 20 70 72 6f 62 6c   avoid new probl
1ef0: 65 6d 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 74  ems similar to t
1f00: 68 65 0a 20 20 2a 2a 20 6f 6e 65 20 64 65 73 63  he.  ** one desc
1f10: 72 69 62 65 64 20 62 79 20 74 69 63 6b 65 74 20  ribed by ticket 
1f20: 23 33 35 38 34 2e 20 0a 20 20 2a 2f 0a 20 20 75  #3584. .  */.  u
1f30: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 74 72 61  nsigned char tra
1f40: 6e 73 43 6e 74 72 43 68 6e 67 3b 20 20 20 2f 2a  nsCntrChng;   /*
1f50: 20 54 72 75 65 20 69 66 20 74 68 65 20 74 72 61   True if the tra
1f60: 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72  nsaction counter
1f70: 20 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20 75 6e   changed */.  un
1f80: 73 69 67 6e 65 64 20 63 68 61 72 20 64 62 55 70  signed char dbUp
1f90: 64 61 74 65 3b 20 20 20 20 20 20 20 20 2f 2a 20  date;        /* 
1fa0: 54 72 75 65 20 69 66 20 61 6e 79 20 70 61 72 74  True if any part
1fb0: 20 6f 66 20 64 61 74 61 62 61 73 65 20 66 69 6c   of database fil
1fc0: 65 20 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20 75  e changed */.  u
1fd0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 69 6e 4e  nsigned char inN
1fe0: 6f 72 6d 61 6c 57 72 69 74 65 3b 20 20 20 2f 2a  ormalWrite;   /*
1ff0: 20 54 72 75 65 20 69 66 20 69 6e 20 61 20 6e 6f   True if in a no
2000: 72 6d 61 6c 20 77 72 69 74 65 20 6f 70 65 72 61  rmal write opera
2010: 74 69 6f 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a 23  tion */.#endif.#
2020: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
2030: 54 0a 20 20 2f 2a 20 49 6e 20 74 65 73 74 20 6d  T.  /* In test m
2040: 6f 64 65 2c 20 69 6e 63 72 65 61 73 65 20 74 68  ode, increase th
2050: 65 20 73 69 7a 65 20 6f 66 20 74 68 69 73 20 73  e size of this s
2060: 74 72 75 63 74 75 72 65 20 61 20 62 69 74 20 73  tructure a bit s
2070: 6f 20 74 68 61 74 20 0a 20 20 2a 2a 20 69 74 20  o that .  ** it 
2080: 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  is larger than t
2090: 68 65 20 73 74 72 75 63 74 20 43 72 61 73 68 46  he struct CrashF
20a0: 69 6c 65 20 64 65 66 69 6e 65 64 20 69 6e 20 74  ile defined in t
20b0: 65 73 74 36 2e 63 2e 0a 20 20 2a 2f 0a 20 20 63  est6.c..  */.  c
20c0: 68 61 72 20 61 50 61 64 64 69 6e 67 5b 33 32 5d  har aPadding[32]
20d0: 3b 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a  ;.#endif.};../*.
20e0: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
20f0: 20 6d 61 63 72 6f 73 20 64 65 66 69 6e 65 20 62   macros define b
2100: 69 74 73 20 69 6e 20 75 6e 69 78 46 69 6c 65 2e  its in unixFile.
2110: 66 69 6c 65 46 6c 61 67 73 0a 2a 2f 0a 23 64 65  fileFlags.*/.#de
2120: 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 48 4f 4c  fine SQLITE_WHOL
2130: 45 5f 46 49 4c 45 5f 4c 4f 43 4b 49 4e 47 20 20  E_FILE_LOCKING  
2140: 30 78 30 30 30 31 20 20 20 2f 2a 20 55 73 65 20  0x0001   /* Use 
2150: 77 68 6f 6c 65 2d 66 69 6c 65 20 6c 6f 63 6b 69  whole-file locki
2160: 6e 67 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63  ng */../*.** Inc
2170: 6c 75 64 65 20 63 6f 64 65 20 74 68 61 74 20 69  lude code that i
2180: 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20  s common to all 
2190: 6f 73 5f 2a 2e 63 20 66 69 6c 65 73 0a 2a 2f 0a  os_*.c files.*/.
21a0: 23 69 6e 63 6c 75 64 65 20 22 6f 73 5f 63 6f 6d  #include "os_com
21b0: 6d 6f 6e 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 44 65  mon.h"../*.** De
21c0: 66 69 6e 65 20 76 61 72 69 6f 75 73 20 6d 61 63  fine various mac
21d0: 72 6f 73 20 74 68 61 74 20 61 72 65 20 6d 69 73  ros that are mis
21e0: 73 69 6e 67 20 66 72 6f 6d 20 73 6f 6d 65 20 73  sing from some s
21f0: 79 73 74 65 6d 73 2e 0a 2a 2f 0a 23 69 66 6e 64  ystems..*/.#ifnd
2200: 65 66 20 4f 5f 4c 41 52 47 45 46 49 4c 45 0a 23  ef O_LARGEFILE.#
2210: 20 64 65 66 69 6e 65 20 4f 5f 4c 41 52 47 45 46   define O_LARGEF
2220: 49 4c 45 20 30 0a 23 65 6e 64 69 66 0a 23 69 66  ILE 0.#endif.#if
2230: 64 65 66 20 53 51 4c 49 54 45 5f 44 49 53 41 42  def SQLITE_DISAB
2240: 4c 45 5f 4c 46 53 0a 23 20 75 6e 64 65 66 20 4f  LE_LFS.# undef O
2250: 5f 4c 41 52 47 45 46 49 4c 45 0a 23 20 64 65 66  _LARGEFILE.# def
2260: 69 6e 65 20 4f 5f 4c 41 52 47 45 46 49 4c 45 20  ine O_LARGEFILE 
2270: 30 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66  0.#endif.#ifndef
2280: 20 4f 5f 4e 4f 46 4f 4c 4c 4f 57 0a 23 20 64 65   O_NOFOLLOW.# de
2290: 66 69 6e 65 20 4f 5f 4e 4f 46 4f 4c 4c 4f 57 20  fine O_NOFOLLOW 
22a0: 30 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66  0.#endif.#ifndef
22b0: 20 4f 5f 42 49 4e 41 52 59 0a 23 20 64 65 66 69   O_BINARY.# defi
22c0: 6e 65 20 4f 5f 42 49 4e 41 52 59 20 30 0a 23 65  ne O_BINARY 0.#e
22d0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ndif../*.** The 
22e0: 44 4a 47 50 50 20 63 6f 6d 70 69 6c 65 72 20 65  DJGPP compiler e
22f0: 6e 76 69 72 6f 6e 6d 65 6e 74 20 6c 6f 6f 6b 73  nvironment looks
2300: 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 20 55 6e 69   mostly like Uni
2310: 78 2c 20 62 75 74 20 69 74 0a 2a 2a 20 6c 61 63  x, but it.** lac
2320: 6b 73 20 74 68 65 20 66 63 6e 74 6c 28 29 20 73  ks the fcntl() s
2330: 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20 53 6f 20  ystem call.  So 
2340: 72 65 64 65 66 69 6e 65 20 66 63 6e 74 6c 28 29  redefine fcntl()
2350: 20 74 6f 20 62 65 20 73 6f 6d 65 74 68 69 6e 67   to be something
2360: 0a 2a 2a 20 74 68 61 74 20 61 6c 77 61 79 73 20  .** that always 
2370: 73 75 63 63 65 65 64 73 2e 20 20 54 68 69 73 20  succeeds.  This 
2380: 6d 65 61 6e 73 20 74 68 61 74 20 6c 6f 63 6b 69  means that locki
2390: 6e 67 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75  ng does not occu
23a0: 72 20 75 6e 64 65 72 0a 2a 2a 20 44 4a 47 50 50  r under.** DJGPP
23b0: 2e 20 20 42 75 74 20 69 74 20 69 73 20 44 4f 53  .  But it is DOS
23c0: 20 2d 20 77 68 61 74 20 64 69 64 20 79 6f 75 20   - what did you 
23d0: 65 78 70 65 63 74 3f 0a 2a 2f 0a 23 69 66 64 65  expect?.*/.#ifde
23e0: 66 20 5f 5f 44 4a 47 50 50 5f 5f 0a 23 20 64 65  f __DJGPP__.# de
23f0: 66 69 6e 65 20 66 63 6e 74 6c 28 41 2c 42 2c 43  fine fcntl(A,B,C
2400: 29 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ) 0.#endif../*.*
2410: 2a 20 54 68 65 20 74 68 72 65 61 64 69 64 20 6d  * The threadid m
2420: 61 63 72 6f 20 72 65 73 6f 6c 76 65 73 20 74 6f  acro resolves to
2430: 20 74 68 65 20 74 68 72 65 61 64 2d 69 64 20 6f   the thread-id o
2440: 72 20 74 6f 20 30 2e 20 20 55 73 65 64 20 66 6f  r to 0.  Used fo
2450: 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64  r.** testing and
2460: 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e   debugging only.
2470: 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 54  .*/.#if SQLITE_T
2480: 48 52 45 41 44 53 41 46 45 0a 23 64 65 66 69 6e  HREADSAFE.#defin
2490: 65 20 74 68 72 65 61 64 69 64 20 70 74 68 72 65  e threadid pthre
24a0: 61 64 5f 73 65 6c 66 28 29 0a 23 65 6c 73 65 0a  ad_self().#else.
24b0: 23 64 65 66 69 6e 65 20 74 68 72 65 61 64 69 64  #define threadid
24c0: 20 30 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a   0.#endif.../*.*
24d0: 2a 20 48 65 6c 70 65 72 20 66 75 6e 63 74 69 6f  * Helper functio
24e0: 6e 73 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e 64  ns to obtain and
24f0: 20 72 65 6c 69 6e 71 75 69 73 68 20 74 68 65 20   relinquish the 
2500: 67 6c 6f 62 61 6c 20 6d 75 74 65 78 2e 20 54 68  global mutex. Th
2510: 65 0a 2a 2a 20 67 6c 6f 62 61 6c 20 6d 75 74 65  e.** global mute
2520: 78 20 69 73 20 75 73 65 64 20 74 6f 20 70 72 6f  x is used to pro
2530: 74 65 63 74 20 74 68 65 20 75 6e 69 78 4f 70 65  tect the unixOpe
2540: 6e 43 6e 74 2c 20 75 6e 69 78 4c 6f 63 6b 49 6e  nCnt, unixLockIn
2550: 66 6f 20 61 6e 64 0a 2a 2a 20 76 78 77 6f 72 6b  fo and.** vxwork
2560: 73 46 69 6c 65 49 64 20 6f 62 6a 65 63 74 73 20  sFileId objects 
2570: 75 73 65 64 20 62 79 20 74 68 69 73 20 66 69 6c  used by this fil
2580: 65 2c 20 61 6c 6c 20 6f 66 20 77 68 69 63 68 20  e, all of which 
2590: 6d 61 79 20 62 65 20 0a 2a 2a 20 73 68 61 72 65  may be .** share
25a0: 64 20 62 79 20 6d 75 6c 74 69 70 6c 65 20 74 68  d by multiple th
25b0: 72 65 61 64 73 2e 0a 2a 2a 0a 2a 2a 20 46 75 6e  reads..**.** Fun
25c0: 63 74 69 6f 6e 20 75 6e 69 78 4d 75 74 65 78 48  ction unixMutexH
25d0: 65 6c 64 28 29 20 69 73 20 75 73 65 64 20 74 6f  eld() is used to
25e0: 20 61 73 73 65 72 74 28 29 20 74 68 61 74 20 74   assert() that t
25f0: 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 20  he global mutex 
2600: 0a 2a 2a 20 69 73 20 68 65 6c 64 20 77 68 65 6e  .** is held when
2610: 20 72 65 71 75 69 72 65 64 2e 20 54 68 69 73 20   required. This 
2620: 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79  function is only
2630: 20 75 73 65 64 20 61 73 20 70 61 72 74 20 6f 66   used as part of
2640: 20 61 73 73 65 72 74 28 29 20 0a 2a 2a 20 73 74   assert() .** st
2650: 61 74 65 6d 65 6e 74 73 2e 20 65 2e 67 2e 0a 2a  atements. e.g..*
2660: 2a 0a 2a 2a 20 20 20 75 6e 69 78 45 6e 74 65 72  *.**   unixEnter
2670: 4d 75 74 65 78 28 29 0a 2a 2a 20 20 20 20 20 61  Mutex().**     a
2680: 73 73 65 72 74 28 20 75 6e 69 78 4d 75 74 65 78  ssert( unixMutex
2690: 48 65 6c 64 28 29 20 29 3b 0a 2a 2a 20 20 20 75  Held() );.**   u
26a0: 6e 69 78 45 6e 74 65 72 4c 65 61 76 65 28 29 0a  nixEnterLeave().
26b0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  */.static void u
26c0: 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 76 6f  nixEnterMutex(vo
26d0: 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  id){.  sqlite3_m
26e0: 75 74 65 78 5f 65 6e 74 65 72 28 73 71 6c 69 74  utex_enter(sqlit
26f0: 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c  e3MutexAlloc(SQL
2700: 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
2710: 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 73 74 61  _MASTER));.}.sta
2720: 74 69 63 20 76 6f 69 64 20 75 6e 69 78 4c 65 61  tic void unixLea
2730: 76 65 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a 20  veMutex(void){. 
2740: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
2750: 65 61 76 65 28 73 71 6c 69 74 65 33 4d 75 74 65  eave(sqlite3Mute
2760: 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
2770: 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45  TEX_STATIC_MASTE
2780: 52 29 29 3b 0a 7d 0a 23 69 66 64 65 66 20 53 51  R));.}.#ifdef SQ
2790: 4c 49 54 45 5f 44 45 42 55 47 0a 73 74 61 74 69  LITE_DEBUG.stati
27a0: 63 20 69 6e 74 20 75 6e 69 78 4d 75 74 65 78 48  c int unixMutexH
27b0: 65 6c 64 28 76 6f 69 64 29 20 7b 0a 20 20 72 65  eld(void) {.  re
27c0: 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d 75 74  turn sqlite3_mut
27d0: 65 78 5f 68 65 6c 64 28 73 71 6c 69 74 65 33 4d  ex_held(sqlite3M
27e0: 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45  utexAlloc(SQLITE
27f0: 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41  _MUTEX_STATIC_MA
2800: 53 54 45 52 29 29 3b 0a 7d 0a 23 65 6e 64 69 66  STER));.}.#endif
2810: 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ...#ifdef SQLITE
2820: 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 48 65 6c  _DEBUG./*.** Hel
2830: 70 65 72 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72  per function for
2840: 20 70 72 69 6e 74 69 6e 67 20 6f 75 74 20 74 72   printing out tr
2850: 61 63 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ace information 
2860: 66 72 6f 6d 20 64 65 62 75 67 67 69 6e 67 0a 2a  from debugging.*
2870: 2a 20 62 69 6e 61 72 69 65 73 2e 20 54 68 69 73  * binaries. This
2880: 20 72 65 74 75 72 6e 73 20 74 68 65 20 73 74 72   returns the str
2890: 69 6e 67 20 72 65 70 72 65 73 65 74 61 74 69 6f  ing represetatio
28a0: 6e 20 6f 66 20 74 68 65 20 73 75 70 70 6c 69 65  n of the supplie
28b0: 64 0a 2a 2a 20 69 6e 74 65 67 65 72 20 6c 6f 63  d.** integer loc
28c0: 6b 2d 74 79 70 65 2e 0a 2a 2f 0a 73 74 61 74 69  k-type..*/.stati
28d0: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6c 6f  c const char *lo
28e0: 63 6b 74 79 70 65 4e 61 6d 65 28 69 6e 74 20 6c  cktypeName(int l
28f0: 6f 63 6b 74 79 70 65 29 7b 0a 20 20 73 77 69 74  ocktype){.  swit
2900: 63 68 28 20 6c 6f 63 6b 74 79 70 65 20 29 7b 0a  ch( locktype ){.
2910: 20 20 20 20 63 61 73 65 20 4e 4f 5f 4c 4f 43 4b      case NO_LOCK
2920: 3a 20 72 65 74 75 72 6e 20 22 4e 4f 4e 45 22 3b  : return "NONE";
2930: 0a 20 20 20 20 63 61 73 65 20 53 48 41 52 45 44  .    case SHARED
2940: 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 53  _LOCK: return "S
2950: 48 41 52 45 44 22 3b 0a 20 20 20 20 63 61 73 65  HARED";.    case
2960: 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 3a 20   RESERVED_LOCK: 
2970: 72 65 74 75 72 6e 20 22 52 45 53 45 52 56 45 44  return "RESERVED
2980: 22 3b 0a 20 20 20 20 63 61 73 65 20 50 45 4e 44  ";.    case PEND
2990: 49 4e 47 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e  ING_LOCK: return
29a0: 20 22 50 45 4e 44 49 4e 47 22 3b 0a 20 20 20 20   "PENDING";.    
29b0: 63 61 73 65 20 45 58 43 4c 55 53 49 56 45 5f 4c  case EXCLUSIVE_L
29c0: 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 45 58 43  OCK: return "EXC
29d0: 4c 55 53 49 56 45 22 3b 0a 20 20 7d 0a 20 20 72  LUSIVE";.  }.  r
29e0: 65 74 75 72 6e 20 22 45 52 52 4f 52 22 3b 0a 7d  eturn "ERROR";.}
29f0: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
2a00: 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52 41 43  SQLITE_LOCK_TRAC
2a10: 45 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 6f 75  E./*.** Print ou
2a20: 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  t information ab
2a30: 6f 75 74 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20  out all locking 
2a40: 6f 70 65 72 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a  operations..**.*
2a50: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
2a60: 73 20 75 73 65 64 20 66 6f 72 20 74 72 6f 75 62  s used for troub
2a70: 6c 65 73 68 6f 6f 74 69 6e 67 20 6c 6f 63 6b 73  leshooting locks
2a80: 20 6f 6e 20 6d 75 6c 74 69 74 68 72 65 61 64 65   on multithreade
2a90: 64 0a 2a 2a 20 70 6c 61 74 66 6f 72 6d 73 2e 20  d.** platforms. 
2aa0: 20 45 6e 61 62 6c 65 20 62 79 20 63 6f 6d 70 69   Enable by compi
2ab0: 6c 69 6e 67 20 77 69 74 68 20 74 68 65 20 2d 44  ling with the -D
2ac0: 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52 41 43  SQLITE_LOCK_TRAC
2ad0: 45 0a 2a 2a 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e  E.** command-lin
2ae0: 65 20 6f 70 74 69 6f 6e 20 6f 6e 20 74 68 65 20  e option on the 
2af0: 63 6f 6d 70 69 6c 65 72 2e 20 20 54 68 69 73 20  compiler.  This 
2b00: 63 6f 64 65 20 69 73 20 6e 6f 72 6d 61 6c 6c 79  code is normally
2b10: 0a 2a 2a 20 74 75 72 6e 65 64 20 6f 66 66 2e 0a  .** turned off..
2b20: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f  */.static int lo
2b30: 63 6b 54 72 61 63 65 28 69 6e 74 20 66 64 2c 20  ckTrace(int fd, 
2b40: 69 6e 74 20 6f 70 2c 20 73 74 72 75 63 74 20 66  int op, struct f
2b50: 6c 6f 63 6b 20 2a 70 29 7b 0a 20 20 63 68 61 72  lock *p){.  char
2b60: 20 2a 7a 4f 70 4e 61 6d 65 2c 20 2a 7a 54 79 70   *zOpName, *zTyp
2b70: 65 3b 0a 20 20 69 6e 74 20 73 3b 0a 20 20 69 6e  e;.  int s;.  in
2b80: 74 20 73 61 76 65 64 45 72 72 6e 6f 3b 0a 20 20  t savedErrno;.  
2b90: 69 66 28 20 6f 70 3d 3d 46 5f 47 45 54 4c 4b 20  if( op==F_GETLK 
2ba0: 29 7b 0a 20 20 20 20 7a 4f 70 4e 61 6d 65 20 3d  ){.    zOpName =
2bb0: 20 22 47 45 54 4c 4b 22 3b 0a 20 20 7d 65 6c 73   "GETLK";.  }els
2bc0: 65 20 69 66 28 20 6f 70 3d 3d 46 5f 53 45 54 4c  e if( op==F_SETL
2bd0: 4b 20 29 7b 0a 20 20 20 20 7a 4f 70 4e 61 6d 65  K ){.    zOpName
2be0: 20 3d 20 22 53 45 54 4c 4b 22 3b 0a 20 20 7d 65   = "SETLK";.  }e
2bf0: 6c 73 65 7b 0a 20 20 20 20 73 20 3d 20 66 63 6e  lse{.    s = fcn
2c00: 74 6c 28 66 64 2c 20 6f 70 2c 20 70 29 3b 0a 20  tl(fd, op, p);. 
2c10: 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
2c20: 72 69 6e 74 66 28 22 66 63 6e 74 6c 20 75 6e 6b  rintf("fcntl unk
2c30: 6e 6f 77 6e 20 25 64 20 25 64 20 25 64 5c 6e 22  nown %d %d %d\n"
2c40: 2c 20 66 64 2c 20 6f 70 2c 20 73 29 3b 0a 20 20  , fd, op, s);.  
2c50: 20 20 72 65 74 75 72 6e 20 73 3b 0a 20 20 7d 0a    return s;.  }.
2c60: 20 20 69 66 28 20 70 2d 3e 6c 5f 74 79 70 65 3d    if( p->l_type=
2c70: 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20  =F_RDLCK ){.    
2c80: 7a 54 79 70 65 20 3d 20 22 52 44 4c 43 4b 22 3b  zType = "RDLCK";
2c90: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e  .  }else if( p->
2ca0: 6c 5f 74 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20  l_type==F_WRLCK 
2cb0: 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 22  ){.    zType = "
2cc0: 57 52 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73 65 20  WRLCK";.  }else 
2cd0: 69 66 28 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46  if( p->l_type==F
2ce0: 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 7a 54  _UNLCK ){.    zT
2cf0: 79 70 65 20 3d 20 22 55 4e 4c 43 4b 22 3b 0a 20  ype = "UNLCK";. 
2d00: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
2d10: 72 74 28 20 30 20 29 3b 0a 20 20 7d 0a 20 20 61  rt( 0 );.  }.  a
2d20: 73 73 65 72 74 28 20 70 2d 3e 6c 5f 77 68 65 6e  ssert( p->l_when
2d30: 63 65 3d 3d 53 45 45 4b 5f 53 45 54 20 29 3b 0a  ce==SEEK_SET );.
2d40: 20 20 73 20 3d 20 66 63 6e 74 6c 28 66 64 2c 20    s = fcntl(fd, 
2d50: 6f 70 2c 20 70 29 3b 0a 20 20 73 61 76 65 64 45  op, p);.  savedE
2d60: 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
2d70: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
2d80: 74 66 28 22 66 63 6e 74 6c 20 25 64 20 25 64 20  tf("fcntl %d %d 
2d90: 25 73 20 25 73 20 25 64 20 25 64 20 25 64 20 25  %s %s %d %d %d %
2da0: 64 5c 6e 22 2c 0a 20 20 20 20 20 74 68 72 65 61  d\n",.     threa
2db0: 64 69 64 2c 20 66 64 2c 20 7a 4f 70 4e 61 6d 65  did, fd, zOpName
2dc0: 2c 20 7a 54 79 70 65 2c 20 28 69 6e 74 29 70 2d  , zType, (int)p-
2dd0: 3e 6c 5f 73 74 61 72 74 2c 20 28 69 6e 74 29 70  >l_start, (int)p
2de0: 2d 3e 6c 5f 6c 65 6e 2c 0a 20 20 20 20 20 28 69  ->l_len,.     (i
2df0: 6e 74 29 70 2d 3e 6c 5f 70 69 64 2c 20 73 29 3b  nt)p->l_pid, s);
2e00: 0a 20 20 69 66 28 20 73 3d 3d 28 2d 31 29 20 26  .  if( s==(-1) &
2e10: 26 20 6f 70 3d 3d 46 5f 53 45 54 4c 4b 20 26 26  & op==F_SETLK &&
2e20: 20 28 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 52   (p->l_type==F_R
2e30: 44 4c 43 4b 20 7c 7c 20 70 2d 3e 6c 5f 74 79 70  DLCK || p->l_typ
2e40: 65 3d 3d 46 5f 57 52 4c 43 4b 29 20 29 7b 0a 20  e==F_WRLCK) ){. 
2e50: 20 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20     struct flock 
2e60: 6c 32 3b 0a 20 20 20 20 6c 32 20 3d 20 2a 70 3b  l2;.    l2 = *p;
2e70: 0a 20 20 20 20 66 63 6e 74 6c 28 66 64 2c 20 46  .    fcntl(fd, F
2e80: 5f 47 45 54 4c 4b 2c 20 26 6c 32 29 3b 0a 20 20  _GETLK, &l2);.  
2e90: 20 20 69 66 28 20 6c 32 2e 6c 5f 74 79 70 65 3d    if( l2.l_type=
2ea0: 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20  =F_RDLCK ){.    
2eb0: 20 20 7a 54 79 70 65 20 3d 20 22 52 44 4c 43 4b    zType = "RDLCK
2ec0: 22 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  ";.    }else if(
2ed0: 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f 57 52   l2.l_type==F_WR
2ee0: 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 7a 54 79  LCK ){.      zTy
2ef0: 70 65 20 3d 20 22 57 52 4c 43 4b 22 3b 0a 20 20  pe = "WRLCK";.  
2f00: 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 32 2e 6c    }else if( l2.l
2f10: 5f 74 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29  _type==F_UNLCK )
2f20: 7b 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20  {.      zType = 
2f30: 22 55 4e 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c  "UNLCK";.    }el
2f40: 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
2f50: 28 20 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ( 0 );.    }.   
2f60: 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
2f70: 6e 74 66 28 22 66 63 6e 74 6c 2d 66 61 69 6c 75  ntf("fcntl-failu
2f80: 72 65 2d 72 65 61 73 6f 6e 3a 20 25 73 20 25 64  re-reason: %s %d
2f90: 20 25 64 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20   %d %d\n",.     
2fa0: 20 20 7a 54 79 70 65 2c 20 28 69 6e 74 29 6c 32    zType, (int)l2
2fb0: 2e 6c 5f 73 74 61 72 74 2c 20 28 69 6e 74 29 6c  .l_start, (int)l
2fc0: 32 2e 6c 5f 6c 65 6e 2c 20 28 69 6e 74 29 6c 32  2.l_len, (int)l2
2fd0: 2e 6c 5f 70 69 64 29 3b 0a 20 20 7d 0a 20 20 65  .l_pid);.  }.  e
2fe0: 72 72 6e 6f 20 3d 20 73 61 76 65 64 45 72 72 6e  rrno = savedErrn
2ff0: 6f 3b 0a 20 20 72 65 74 75 72 6e 20 73 3b 0a 7d  o;.  return s;.}
3000: 0a 23 64 65 66 69 6e 65 20 66 63 6e 74 6c 20 6c  .#define fcntl l
3010: 6f 63 6b 54 72 61 63 65 0a 23 65 6e 64 69 66 20  ockTrace.#endif 
3020: 2f 2a 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54  /* SQLITE_LOCK_T
3030: 52 41 43 45 20 2a 2f 0a 0a 0a 0a 2f 2a 0a 2a 2a  RACE */..../*.**
3040: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 74 72   This routine tr
3050: 61 6e 73 6c 61 74 65 73 20 61 20 73 74 61 6e 64  anslates a stand
3060: 61 72 64 20 50 4f 53 49 58 20 65 72 72 6e 6f 20  ard POSIX errno 
3070: 63 6f 64 65 20 69 6e 74 6f 20 73 6f 6d 65 74 68  code into someth
3080: 69 6e 67 0a 2a 2a 20 75 73 65 66 75 6c 20 74 6f  ing.** useful to
3090: 20 74 68 65 20 63 6c 69 65 6e 74 73 20 6f 66 20   the clients of 
30a0: 74 68 65 20 73 71 6c 69 74 65 33 20 66 75 6e 63  the sqlite3 func
30b0: 74 69 6f 6e 73 2e 20 20 53 70 65 63 69 66 69 63  tions.  Specific
30c0: 61 6c 6c 79 2c 20 69 74 20 69 73 0a 2a 2a 20 69  ally, it is.** i
30d0: 6e 74 65 6e 64 65 64 20 74 6f 20 74 72 61 6e 73  ntended to trans
30e0: 6c 61 74 65 20 61 20 76 61 72 69 65 74 79 20 6f  late a variety o
30f0: 66 20 22 74 72 79 20 61 67 61 69 6e 22 20 65 72  f "try again" er
3100: 72 6f 72 73 20 69 6e 74 6f 20 53 51 4c 49 54 45  rors into SQLITE
3110: 5f 42 55 53 59 0a 2a 2a 20 61 6e 64 20 61 20 76  _BUSY.** and a v
3120: 61 72 69 65 74 79 20 6f 66 20 22 70 6c 65 61 73  ariety of "pleas
3130: 65 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65  e close the file
3140: 20 64 65 73 63 72 69 70 74 6f 72 20 4e 4f 57 22   descriptor NOW"
3150: 20 65 72 72 6f 72 73 20 69 6e 74 6f 20 0a 2a 2a   errors into .**
3160: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 2a 2a   SQLITE_IOERR.**
3170: 20 0a 2a 2a 20 45 72 72 6f 72 73 20 64 75 72 69   .** Errors duri
3180: 6e 67 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  ng initializatio
3190: 6e 20 6f 66 20 6c 6f 63 6b 73 2c 20 6f 72 20 66  n of locks, or f
31a0: 69 6c 65 20 73 79 73 74 65 6d 20 73 75 70 70 6f  ile system suppo
31b0: 72 74 20 66 6f 72 20 6c 6f 63 6b 73 2c 0a 2a 2a  rt for locks,.**
31c0: 20 73 68 6f 75 6c 64 20 68 61 6e 64 6c 65 20 45   should handle E
31d0: 4e 4f 4c 43 4b 2c 20 45 4e 4f 54 53 55 50 2c 20  NOLCK, ENOTSUP, 
31e0: 45 4f 50 4e 4f 54 53 55 50 50 20 73 65 70 61 72  EOPNOTSUPP separ
31f0: 61 74 65 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  ately..*/.static
3200: 20 69 6e 74 20 73 71 6c 69 74 65 45 72 72 6f 72   int sqliteError
3210: 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 69  FromPosixError(i
3220: 6e 74 20 70 6f 73 69 78 45 72 72 6f 72 2c 20 69  nt posixError, i
3230: 6e 74 20 73 71 6c 69 74 65 49 4f 45 72 72 29 20  nt sqliteIOErr) 
3240: 7b 0a 20 20 73 77 69 74 63 68 20 28 70 6f 73 69  {.  switch (posi
3250: 78 45 72 72 6f 72 29 20 7b 0a 20 20 63 61 73 65  xError) {.  case
3260: 20 30 3a 20 0a 20 20 20 20 72 65 74 75 72 6e 20   0: .    return 
3270: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 0a  SQLITE_OK;.    .
3280: 20 20 63 61 73 65 20 45 41 47 41 49 4e 3a 0a 20    case EAGAIN:. 
3290: 20 63 61 73 65 20 45 54 49 4d 45 44 4f 55 54 3a   case ETIMEDOUT:
32a0: 0a 20 20 63 61 73 65 20 45 42 55 53 59 3a 0a 20  .  case EBUSY:. 
32b0: 20 63 61 73 65 20 45 49 4e 54 52 3a 0a 20 20 63   case EINTR:.  c
32c0: 61 73 65 20 45 4e 4f 4c 43 4b 3a 20 20 0a 20 20  ase ENOLCK:  .  
32d0: 20 20 2f 2a 20 72 61 6e 64 6f 6d 20 4e 46 53 20    /* random NFS 
32e0: 72 65 74 72 79 20 65 72 72 6f 72 2c 20 75 6e 6c  retry error, unl
32f0: 65 73 73 20 64 75 72 69 6e 67 20 66 69 6c 65 20  ess during file 
3300: 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20 0a  system support .
3310: 20 20 20 20 20 2a 20 69 6e 74 72 6f 73 70 65 63       * introspec
3320: 74 69 6f 6e 2c 20 69 6e 20 77 68 69 63 68 20 69  tion, in which i
3330: 74 20 61 63 74 75 61 6c 6c 79 20 6d 65 61 6e 73  t actually means
3340: 20 77 68 61 74 20 69 74 20 73 61 79 73 20 2a 2f   what it says */
3350: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
3360: 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 0a 20 20  TE_BUSY;.    .  
3370: 63 61 73 65 20 45 41 43 43 45 53 3a 20 0a 20 20  case EACCES: .  
3380: 20 20 2f 2a 20 45 41 43 43 45 53 20 69 73 20 6c    /* EACCES is l
3390: 69 6b 65 20 45 41 47 41 49 4e 20 64 75 72 69 6e  ike EAGAIN durin
33a0: 67 20 6c 6f 63 6b 69 6e 67 20 6f 70 65 72 61 74  g locking operat
33b0: 69 6f 6e 73 2c 20 62 75 74 20 6e 6f 74 20 61 6e  ions, but not an
33c0: 79 20 6f 74 68 65 72 20 74 69 6d 65 2a 2f 0a 20  y other time*/. 
33d0: 20 20 20 69 66 28 20 28 73 71 6c 69 74 65 49 4f     if( (sqliteIO
33e0: 45 72 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f  Err == SQLITE_IO
33f0: 45 52 52 5f 4c 4f 43 4b 29 20 7c 7c 20 0a 09 28  ERR_LOCK) || ..(
3400: 73 71 6c 69 74 65 49 4f 45 72 72 20 3d 3d 20 53  sqliteIOErr == S
3410: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
3420: 43 4b 29 20 7c 7c 20 0a 09 28 73 71 6c 69 74 65  CK) || ..(sqlite
3430: 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49 54 45 5f  IOErr == SQLITE_
3440: 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 29 20 7c 7c  IOERR_RDLOCK) ||
3450: 0a 09 28 73 71 6c 69 74 65 49 4f 45 72 72 20 3d  ..(sqliteIOErr =
3460: 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43  = SQLITE_IOERR_C
3470: 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b  HECKRESERVEDLOCK
3480: 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
3490: 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  n SQLITE_BUSY;. 
34a0: 20 20 20 7d 0a 20 20 20 20 2f 2a 20 65 6c 73 65     }.    /* else
34b0: 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 2a 2f   fall through */
34c0: 0a 20 20 63 61 73 65 20 45 50 45 52 4d 3a 20 0a  .  case EPERM: .
34d0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
34e0: 45 5f 50 45 52 4d 3b 0a 20 20 20 20 0a 20 20 63  E_PERM;.    .  c
34f0: 61 73 65 20 45 44 45 41 44 4c 4b 3a 0a 20 20 20  ase EDEADLK:.   
3500: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
3510: 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 3b 0a 20 20  OERR_BLOCKED;.  
3520: 20 20 0a 23 69 66 20 45 4f 50 4e 4f 54 53 55 50    .#if EOPNOTSUP
3530: 50 21 3d 45 4e 4f 54 53 55 50 0a 20 20 63 61 73  P!=ENOTSUP.  cas
3540: 65 20 45 4f 50 4e 4f 54 53 55 50 50 3a 20 0a 20  e EOPNOTSUPP: . 
3550: 20 20 20 2f 2a 20 73 6f 6d 65 74 68 69 6e 67 20     /* something 
3560: 77 65 6e 74 20 74 65 72 72 69 62 6c 79 20 61 77  went terribly aw
3570: 72 79 2c 20 75 6e 6c 65 73 73 20 64 75 72 69 6e  ry, unless durin
3580: 67 20 66 69 6c 65 20 73 79 73 74 65 6d 20 73 75  g file system su
3590: 70 70 6f 72 74 20 0a 20 20 20 20 20 2a 20 69 6e  pport .     * in
35a0: 74 72 6f 73 70 65 63 74 69 6f 6e 2c 20 69 6e 20  trospection, in 
35b0: 77 68 69 63 68 20 69 74 20 61 63 74 75 61 6c 6c  which it actuall
35c0: 79 20 6d 65 61 6e 73 20 77 68 61 74 20 69 74 20  y means what it 
35d0: 73 61 79 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 23  says */.#endif.#
35e0: 69 66 64 65 66 20 45 4e 4f 54 53 55 50 0a 20 20  ifdef ENOTSUP.  
35f0: 63 61 73 65 20 45 4e 4f 54 53 55 50 3a 20 0a 20  case ENOTSUP: . 
3600: 20 20 20 2f 2a 20 69 6e 76 61 6c 69 64 20 66 64     /* invalid fd
3610: 2c 20 75 6e 6c 65 73 73 20 64 75 72 69 6e 67 20  , unless during 
3620: 66 69 6c 65 20 73 79 73 74 65 6d 20 73 75 70 70  file system supp
3630: 6f 72 74 20 69 6e 74 72 6f 73 70 65 63 74 69 6f  ort introspectio
3640: 6e 2c 20 69 6e 20 77 68 69 63 68 20 0a 20 20 20  n, in which .   
3650: 20 20 2a 20 69 74 20 61 63 74 75 61 6c 6c 79 20    * it actually 
3660: 6d 65 61 6e 73 20 77 68 61 74 20 69 74 20 73 61  means what it sa
3670: 79 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 63  ys */.#endif.  c
3680: 61 73 65 20 45 49 4f 3a 0a 20 20 63 61 73 65 20  ase EIO:.  case 
3690: 45 42 41 44 46 3a 0a 20 20 63 61 73 65 20 45 49  EBADF:.  case EI
36a0: 4e 56 41 4c 3a 0a 20 20 63 61 73 65 20 45 4e 4f  NVAL:.  case ENO
36b0: 54 43 4f 4e 4e 3a 0a 20 20 63 61 73 65 20 45 4e  TCONN:.  case EN
36c0: 4f 44 45 56 3a 0a 20 20 63 61 73 65 20 45 4e 58  ODEV:.  case ENX
36d0: 49 4f 3a 0a 20 20 63 61 73 65 20 45 4e 4f 45 4e  IO:.  case ENOEN
36e0: 54 3a 0a 20 20 63 61 73 65 20 45 53 54 41 4c 45  T:.  case ESTALE
36f0: 3a 0a 20 20 63 61 73 65 20 45 4e 4f 53 59 53 3a  :.  case ENOSYS:
3700: 0a 20 20 20 20 2f 2a 20 74 68 65 73 65 20 73 68  .    /* these sh
3710: 6f 75 6c 64 20 66 6f 72 63 65 20 74 68 65 20 63  ould force the c
3720: 6c 69 65 6e 74 20 74 6f 20 63 6c 6f 73 65 20 74  lient to close t
3730: 68 65 20 66 69 6c 65 20 61 6e 64 20 72 65 63 6f  he file and reco
3740: 6e 6e 65 63 74 20 2a 2f 0a 20 20 20 20 0a 20 20  nnect */.    .  
3750: 64 65 66 61 75 6c 74 3a 20 0a 20 20 20 20 72 65  default: .    re
3760: 74 75 72 6e 20 73 71 6c 69 74 65 49 4f 45 72 72  turn sqliteIOErr
3770: 3b 0a 20 20 7d 0a 7d 0a 0a 0a 0a 2f 2a 2a 2a 2a  ;.  }.}..../****
3780: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3790: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
37a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
37b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
37c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
37d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65  ************* Be
37e0: 67 69 6e 20 55 6e 69 71 75 65 20 46 69 6c 65 20  gin Unique File 
37f0: 49 44 20 55 74 69 6c 69 74 79 20 55 73 65 64 20  ID Utility Used 
3800: 42 79 20 56 78 57 6f 72 6b 73 20 2a 2a 2a 2a 2a  By VxWorks *****
3810: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a  **********.**.**
3820: 20 4f 6e 20 6d 6f 73 74 20 76 65 72 73 69 6f 6e   On most version
3830: 73 20 6f 66 20 75 6e 69 78 2c 20 77 65 20 63 61  s of unix, we ca
3840: 6e 20 67 65 74 20 61 20 75 6e 69 71 75 65 20 49  n get a unique I
3850: 44 20 66 6f 72 20 61 20 66 69 6c 65 20 62 79 20  D for a file by 
3860: 63 6f 6e 63 61 74 65 6e 61 74 69 6e 67 0a 2a 2a  concatenating.**
3870: 20 74 68 65 20 64 65 76 69 63 65 20 6e 75 6d 62   the device numb
3880: 65 72 20 61 6e 64 20 74 68 65 20 69 6e 6f 64 65  er and the inode
3890: 20 6e 75 6d 62 65 72 2e 20 20 42 75 74 20 74 68   number.  But th
38a0: 69 73 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b  is does not work
38b0: 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a 20   on VxWorks..** 
38c0: 4f 6e 20 56 78 57 6f 72 6b 73 2c 20 61 20 75 6e  On VxWorks, a un
38d0: 69 71 75 65 20 66 69 6c 65 20 69 64 20 6d 75 73  ique file id mus
38e0: 74 20 62 65 20 62 61 73 65 64 20 6f 6e 20 74 68  t be based on th
38f0: 65 20 63 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65  e canonical file
3900: 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 70 6f  name..**.** A po
3910: 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e 73 74  inter to an inst
3920: 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ance of the foll
3930: 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20  owing structure 
3940: 63 61 6e 20 62 65 20 75 73 65 64 20 61 73 20 61  can be used as a
3950: 0a 2a 2a 20 75 6e 69 71 75 65 20 66 69 6c 65 20  .** unique file 
3960: 49 44 20 69 6e 20 56 78 57 6f 72 6b 73 2e 20 20  ID in VxWorks.  
3970: 45 61 63 68 20 69 6e 73 74 61 6e 63 65 20 6f 66  Each instance of
3980: 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20   this structure 
3990: 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 61 20 63 6f  contains.** a co
39a0: 70 79 20 6f 66 20 74 68 65 20 63 61 6e 6f 6e 69  py of the canoni
39b0: 63 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 20 20 54  cal filename.  T
39c0: 68 65 72 65 20 69 73 20 61 6c 73 6f 20 61 20 72  here is also a r
39d0: 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 2e 20  eference count. 
39e0: 20 0a 2a 2a 20 54 68 65 20 73 74 72 75 63 74 75   .** The structu
39f0: 72 65 20 69 73 20 72 65 63 6c 61 69 6d 65 64 20  re is reclaimed 
3a00: 77 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  when the number 
3a10: 6f 66 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 69  of pointers to i
3a20: 74 20 64 72 6f 70 73 20 74 6f 0a 2a 2a 20 7a 65  t drops to.** ze
3a30: 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20  ro..**.** There 
3a40: 61 72 65 20 6e 65 76 65 72 20 76 65 72 79 20 6d  are never very m
3a50: 61 6e 79 20 66 69 6c 65 73 20 6f 70 65 6e 20 61  any files open a
3a60: 74 20 6f 6e 65 20 74 69 6d 65 20 61 6e 64 20 6c  t one time and l
3a70: 6f 6f 6b 75 70 73 20 61 72 65 20 6e 6f 74 0a 2a  ookups are not.*
3a80: 2a 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 2d  * a performance-
3a90: 63 72 69 74 69 63 61 6c 20 70 61 74 68 2c 20 73  critical path, s
3aa0: 6f 20 69 74 20 69 73 20 73 75 66 66 69 63 69 65  o it is sufficie
3ab0: 6e 74 20 74 6f 20 70 75 74 20 74 68 65 73 65 0a  nt to put these.
3ac0: 2a 2a 20 73 74 72 75 63 74 75 72 65 73 20 6f 6e  ** structures on
3ad0: 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74 2e 0a   a linked list..
3ae0: 2a 2f 0a 73 74 72 75 63 74 20 76 78 77 6f 72 6b  */.struct vxwork
3af0: 73 46 69 6c 65 49 64 20 7b 0a 20 20 73 74 72 75  sFileId {.  stru
3b00: 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64  ct vxworksFileId
3b10: 20 2a 70 4e 65 78 74 3b 20 20 2f 2a 20 4e 65 78   *pNext;  /* Nex
3b20: 74 20 69 6e 20 61 20 6c 69 73 74 20 6f 66 20 74  t in a list of t
3b30: 68 65 6d 20 61 6c 6c 20 2a 2f 0a 20 20 69 6e 74  hem all */.  int
3b40: 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20 20   nRef;          
3b50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
3b60: 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63  mber of referenc
3b70: 65 73 20 74 6f 20 74 68 69 73 20 6f 6e 65 20 2a  es to this one *
3b80: 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 20 20  /.  int nName;  
3b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ba0: 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 74    /* Length of t
3bb0: 68 65 20 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d  he zCanonicalNam
3bc0: 65 5b 5d 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20  e[] string */.  
3bd0: 63 68 61 72 20 2a 7a 43 61 6e 6f 6e 69 63 61 6c  char *zCanonical
3be0: 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 2f 2a  Name;         /*
3bf0: 20 43 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65 6e   Canonical filen
3c00: 61 6d 65 20 2a 2f 0a 7d 3b 0a 0a 23 69 66 20 4f  ame */.};..#if O
3c10: 53 5f 56 58 57 4f 52 4b 53 0a 2f 2a 20 0a 2a 2a  S_VXWORKS./* .**
3c20: 20 41 6c 6c 20 75 6e 69 71 75 65 20 66 69 6c 65   All unique file
3c30: 6e 61 6d 65 73 20 61 72 65 20 68 65 6c 64 20 6f  names are held o
3c40: 6e 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  n a linked list 
3c50: 68 65 61 64 65 64 20 62 79 20 74 68 69 73 0a 2a  headed by this.*
3c60: 2a 20 76 61 72 69 61 62 6c 65 3a 0a 2a 2f 0a 73  * variable:.*/.s
3c70: 74 61 74 69 63 20 73 74 72 75 63 74 20 76 78 77  tatic struct vxw
3c80: 6f 72 6b 73 46 69 6c 65 49 64 20 2a 76 78 77 6f  orksFileId *vxwo
3c90: 72 6b 73 46 69 6c 65 4c 69 73 74 20 3d 20 30 3b  rksFileList = 0;
3ca0: 0a 0a 2f 2a 0a 2a 2a 20 53 69 6d 70 6c 69 66 79  ../*.** Simplify
3cb0: 20 61 20 66 69 6c 65 6e 61 6d 65 20 69 6e 74 6f   a filename into
3cc0: 20 69 74 73 20 63 61 6e 6f 6e 69 63 61 6c 20 66   its canonical f
3cd0: 6f 72 6d 0a 2a 2a 20 62 79 20 6d 61 6b 69 6e 67  orm.** by making
3ce0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   the following c
3cf0: 68 61 6e 67 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 2a  hanges:.**.**  *
3d00: 20 72 65 6d 6f 76 69 6e 67 20 61 6e 79 20 74 72   removing any tr
3d10: 61 69 6c 69 6e 67 20 61 6e 64 20 64 75 70 6c 69  ailing and dupli
3d20: 63 61 74 65 20 2f 0a 2a 2a 20 20 2a 20 63 6f 6e  cate /.**  * con
3d30: 76 65 72 74 20 2f 2e 2f 20 69 6e 74 6f 20 6a 75  vert /./ into ju
3d40: 73 74 20 2f 0a 2a 2a 20 20 2a 20 63 6f 6e 76 65  st /.**  * conve
3d50: 72 74 20 2f 41 2f 2e 2e 2f 20 77 68 65 72 65 20  rt /A/../ where 
3d60: 41 20 69 73 20 61 6e 79 20 73 69 6d 70 6c 65 20  A is any simple 
3d70: 6e 61 6d 65 20 69 6e 74 6f 20 6a 75 73 74 20 2f  name into just /
3d80: 0a 2a 2a 0a 2a 2a 20 43 68 61 6e 67 65 73 20 61  .**.** Changes a
3d90: 72 65 20 6d 61 64 65 20 69 6e 2d 70 6c 61 63 65  re made in-place
3da0: 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 65  .  Return the ne
3db0: 77 20 6e 61 6d 65 20 6c 65 6e 67 74 68 2e 0a 2a  w name length..*
3dc0: 2a 0a 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e 61  *.** The origina
3dd0: 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 69 6e  l filename is in
3de0: 20 7a 5b 30 2e 2e 6e 2d 31 5d 2e 20 20 52 65 74   z[0..n-1].  Ret
3df0: 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
3e00: 66 0a 2a 2a 20 63 68 61 72 61 63 74 65 72 73 20  f.** characters 
3e10: 69 6e 20 74 68 65 20 73 69 6d 70 6c 69 66 69 65  in the simplifie
3e20: 64 20 6e 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69  d name..*/.stati
3e30: 63 20 69 6e 74 20 76 78 77 6f 72 6b 73 53 69 6d  c int vxworksSim
3e40: 70 6c 69 66 79 4e 61 6d 65 28 63 68 61 72 20 2a  plifyName(char *
3e50: 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 69 6e 74  z, int n){.  int
3e60: 20 69 2c 20 6a 3b 0a 20 20 77 68 69 6c 65 28 20   i, j;.  while( 
3e70: 6e 3e 31 20 26 26 20 7a 5b 6e 2d 31 5d 3d 3d 27  n>1 && z[n-1]=='
3e80: 2f 27 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 66  /' ){ n--; }.  f
3e90: 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b 20 69  or(i=j=0; i<n; i
3ea0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a 5b 69  ++){.    if( z[i
3eb0: 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20  ]=='/' ){.      
3ec0: 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27 2f 27 20  if( z[i+1]=='/' 
3ed0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
3ee0: 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27 2e    if( z[i+1]=='.
3ef0: 27 20 26 26 20 69 2b 32 3c 6e 20 26 26 20 7a 5b  ' && i+2<n && z[
3f00: 69 2b 32 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20  i+2]=='/' ){.   
3f10: 20 20 20 20 20 69 20 2b 3d 20 31 3b 0a 20 20 20       i += 1;.   
3f20: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
3f30: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
3f40: 20 7a 5b 69 2b 31 5d 3d 3d 27 2e 27 20 26 26 20   z[i+1]=='.' && 
3f50: 69 2b 33 3c 6e 20 26 26 20 7a 5b 69 2b 32 5d 3d  i+3<n && z[i+2]=
3f60: 3d 27 2e 27 20 26 26 20 7a 5b 69 2b 33 5d 3d 3d  ='.' && z[i+3]==
3f70: 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 20 20 77  '/' ){.        w
3f80: 68 69 6c 65 28 20 6a 3e 30 20 26 26 20 7a 5b 6a  hile( j>0 && z[j
3f90: 2d 31 5d 21 3d 27 2f 27 20 29 7b 20 6a 2d 2d 3b  -1]!='/' ){ j--;
3fa0: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a   }.        if( j
3fb0: 3e 30 20 29 7b 20 6a 2d 2d 3b 20 7d 0a 20 20 20  >0 ){ j--; }.   
3fc0: 20 20 20 20 20 69 20 2b 3d 20 32 3b 0a 20 20 20       i += 2;.   
3fd0: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
3fe0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
3ff0: 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a   z[j++] = z[i];.
4000: 20 20 7d 0a 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a    }.  z[j] = 0;.
4010: 20 20 72 65 74 75 72 6e 20 6a 3b 0a 7d 0a 0a 2f    return j;.}../
4020: 2a 0a 2a 2a 20 46 69 6e 64 20 61 20 75 6e 69 71  *.** Find a uniq
4030: 75 65 20 66 69 6c 65 20 49 44 20 66 6f 72 20 74  ue file ID for t
4040: 68 65 20 67 69 76 65 6e 20 61 62 73 6f 6c 75 74  he given absolut
4050: 65 20 70 61 74 68 6e 61 6d 65 2e 20 20 52 65 74  e pathname.  Ret
4060: 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72  urn.** a pointer
4070: 20 74 6f 20 74 68 65 20 76 78 77 6f 72 6b 73 46   to the vxworksF
4080: 69 6c 65 49 64 20 6f 62 6a 65 63 74 2e 20 20 54  ileId object.  T
4090: 68 69 73 20 70 6f 69 6e 74 65 72 20 69 73 20 74  his pointer is t
40a0: 68 65 20 75 6e 69 71 75 65 0a 2a 2a 20 66 69 6c  he unique.** fil
40b0: 65 20 49 44 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  e ID..**.** The 
40c0: 6e 52 65 66 20 66 69 65 6c 64 20 6f 66 20 74 68  nRef field of th
40d0: 65 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  e vxworksFileId 
40e0: 6f 62 6a 65 63 74 20 69 73 20 69 6e 63 72 65 6d  object is increm
40f0: 65 6e 74 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20  ented before.** 
4100: 74 68 65 20 6f 62 6a 65 63 74 20 69 73 20 72 65  the object is re
4110: 74 75 72 6e 65 64 2e 20 20 41 20 6e 65 77 20 76  turned.  A new v
4120: 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a  xworksFileId obj
4130: 65 63 74 20 69 73 20 63 72 65 61 74 65 64 0a 2a  ect is created.*
4140: 2a 20 61 6e 64 20 61 64 64 65 64 20 74 6f 20 74  * and added to t
4150: 68 65 20 67 6c 6f 62 61 6c 20 6c 69 73 74 20 69  he global list i
4160: 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 0a  f necessary..**.
4170: 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61  ** If a memory a
4180: 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20  llocation error 
4190: 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 4e  occurs, return N
41a0: 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73  ULL..*/.static s
41b0: 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c  truct vxworksFil
41c0: 65 49 64 20 2a 76 78 77 6f 72 6b 73 46 69 6e 64  eId *vxworksFind
41d0: 46 69 6c 65 49 64 28 63 6f 6e 73 74 20 63 68 61  FileId(const cha
41e0: 72 20 2a 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65  r *zAbsoluteName
41f0: 29 7b 0a 20 20 73 74 72 75 63 74 20 76 78 77 6f  ){.  struct vxwo
4200: 72 6b 73 46 69 6c 65 49 64 20 2a 70 4e 65 77 3b  rksFileId *pNew;
4210: 20 20 20 20 20 20 20 20 20 2f 2a 20 73 65 61 72           /* sear
4220: 63 68 20 6b 65 79 20 61 6e 64 20 6e 65 77 20 66  ch key and new f
4230: 69 6c 65 20 49 44 20 2a 2f 0a 20 20 73 74 72 75  ile ID */.  stru
4240: 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64  ct vxworksFileId
4250: 20 2a 70 43 61 6e 64 69 64 61 74 65 3b 20 20 20   *pCandidate;   
4260: 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f  /* For looping o
4270: 76 65 72 20 65 78 69 73 74 69 6e 67 20 66 69 6c  ver existing fil
4280: 65 20 49 44 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  e IDs */.  int n
4290: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
42a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
42b0: 2a 20 4c 65 6e 67 74 68 20 6f 66 20 7a 41 62 73  * Length of zAbs
42c0: 6f 6c 75 74 65 4e 61 6d 65 20 73 74 72 69 6e 67  oluteName string
42d0: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 7a   */..  assert( z
42e0: 41 62 73 6f 6c 75 74 65 4e 61 6d 65 5b 30 5d 3d  AbsoluteName[0]=
42f0: 3d 27 2f 27 20 29 3b 0a 20 20 6e 20 3d 20 28 69  ='/' );.  n = (i
4300: 6e 74 29 73 74 72 6c 65 6e 28 7a 41 62 73 6f 6c  nt)strlen(zAbsol
4310: 75 74 65 4e 61 6d 65 29 3b 0a 20 20 70 4e 65 77  uteName);.  pNew
4320: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
4330: 63 28 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29  c( sizeof(*pNew)
4340: 20 2b 20 28 6e 2b 31 29 20 29 3b 0a 20 20 69 66   + (n+1) );.  if
4350: 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75  ( pNew==0 ) retu
4360: 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 7a 43  rn 0;.  pNew->zC
4370: 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 20 3d 20 28  anonicalName = (
4380: 63 68 61 72 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a  char*)&pNew[1];.
4390: 20 20 6d 65 6d 63 70 79 28 70 4e 65 77 2d 3e 7a    memcpy(pNew->z
43a0: 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20 7a  CanonicalName, z
43b0: 41 62 73 6f 6c 75 74 65 4e 61 6d 65 2c 20 6e 2b  AbsoluteName, n+
43c0: 31 29 3b 0a 20 20 6e 20 3d 20 76 78 77 6f 72 6b  1);.  n = vxwork
43d0: 73 53 69 6d 70 6c 69 66 79 4e 61 6d 65 28 70 4e  sSimplifyName(pN
43e0: 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61  ew->zCanonicalNa
43f0: 6d 65 2c 20 6e 29 3b 0a 0a 20 20 2f 2a 20 53 65  me, n);..  /* Se
4400: 61 72 63 68 20 66 6f 72 20 61 6e 20 65 78 69 73  arch for an exis
4410: 74 69 6e 67 20 65 6e 74 72 79 20 74 68 61 74 20  ting entry that 
4420: 6d 61 74 63 68 69 6e 67 20 74 68 65 20 63 61 6e  matching the can
4430: 6f 6e 69 63 61 6c 20 6e 61 6d 65 2e 0a 20 20 2a  onical name..  *
4440: 2a 20 49 66 20 66 6f 75 6e 64 2c 20 69 6e 63 72  * If found, incr
4450: 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72 65  ement the refere
4460: 6e 63 65 20 63 6f 75 6e 74 20 61 6e 64 20 72 65  nce count and re
4470: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
4480: 6f 0a 20 20 2a 2a 20 74 68 65 20 65 78 69 73 74  o.  ** the exist
4490: 69 6e 67 20 66 69 6c 65 20 49 44 2e 0a 20 20 2a  ing file ID..  *
44a0: 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74  /.  unixEnterMut
44b0: 65 78 28 29 3b 0a 20 20 66 6f 72 28 70 43 61 6e  ex();.  for(pCan
44c0: 64 69 64 61 74 65 3d 76 78 77 6f 72 6b 73 46 69  didate=vxworksFi
44d0: 6c 65 4c 69 73 74 3b 20 70 43 61 6e 64 69 64 61  leList; pCandida
44e0: 74 65 3b 20 70 43 61 6e 64 69 64 61 74 65 3d 70  te; pCandidate=p
44f0: 43 61 6e 64 69 64 61 74 65 2d 3e 70 4e 65 78 74  Candidate->pNext
4500: 29 7b 0a 20 20 20 20 69 66 28 20 70 43 61 6e 64  ){.    if( pCand
4510: 69 64 61 74 65 2d 3e 6e 4e 61 6d 65 3d 3d 6e 20  idate->nName==n 
4520: 0a 20 20 20 20 20 26 26 20 6d 65 6d 63 6d 70 28  .     && memcmp(
4530: 70 43 61 6e 64 69 64 61 74 65 2d 3e 7a 43 61 6e  pCandidate->zCan
4540: 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20 70 4e 65 77  onicalName, pNew
4550: 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65  ->zCanonicalName
4560: 2c 20 6e 29 3d 3d 30 0a 20 20 20 20 29 7b 0a 20  , n)==0.    ){. 
4570: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
4580: 65 65 28 70 4e 65 77 29 3b 0a 20 20 20 20 20 20  ee(pNew);.      
4590: 20 70 43 61 6e 64 69 64 61 74 65 2d 3e 6e 52 65   pCandidate->nRe
45a0: 66 2b 2b 3b 0a 20 20 20 20 20 20 20 75 6e 69 78  f++;.       unix
45b0: 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
45c0: 20 20 20 20 20 72 65 74 75 72 6e 20 70 43 61 6e       return pCan
45d0: 64 69 64 61 74 65 3b 0a 20 20 20 20 7d 0a 20 20  didate;.    }.  
45e0: 7d 0a 0a 20 20 2f 2a 20 4e 6f 20 6d 61 74 63 68  }..  /* No match
45f0: 20 77 61 73 20 66 6f 75 6e 64 2e 20 20 57 65 20   was found.  We 
4600: 77 69 6c 6c 20 6d 61 6b 65 20 61 20 6e 65 77 20  will make a new 
4610: 66 69 6c 65 20 49 44 20 2a 2f 0a 20 20 70 4e 65  file ID */.  pNe
4620: 77 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 70  w->nRef = 1;.  p
4630: 4e 65 77 2d 3e 6e 4e 61 6d 65 20 3d 20 6e 3b 0a  New->nName = n;.
4640: 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20    pNew->pNext = 
4650: 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74 3b  vxworksFileList;
4660: 0a 20 20 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69  .  vxworksFileLi
4670: 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20 75 6e 69  st = pNew;.  uni
4680: 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  xLeaveMutex();. 
4690: 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a   return pNew;.}.
46a0: 0a 2f 2a 0a 2a 2a 20 44 65 63 72 65 6d 65 6e 74  ./*.** Decrement
46b0: 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63   the reference c
46c0: 6f 75 6e 74 20 6f 6e 20 61 20 76 78 77 6f 72 6b  ount on a vxwork
46d0: 73 46 69 6c 65 49 64 20 6f 62 6a 65 63 74 2e 20  sFileId object. 
46e0: 20 46 72 65 65 0a 2a 2a 20 74 68 65 20 6f 62 6a   Free.** the obj
46f0: 65 63 74 20 77 68 65 6e 20 74 68 65 20 72 65 66  ect when the ref
4700: 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 72 65 61  erence count rea
4710: 63 68 65 73 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74  ches zero..*/.st
4720: 61 74 69 63 20 76 6f 69 64 20 76 78 77 6f 72 6b  atic void vxwork
4730: 73 52 65 6c 65 61 73 65 46 69 6c 65 49 64 28 73  sReleaseFileId(s
4740: 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c  truct vxworksFil
4750: 65 49 64 20 2a 70 49 64 29 7b 0a 20 20 75 6e 69  eId *pId){.  uni
4760: 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  xEnterMutex();. 
4770: 20 61 73 73 65 72 74 28 20 70 49 64 2d 3e 6e 52   assert( pId->nR
4780: 65 66 3e 30 20 29 3b 0a 20 20 70 49 64 2d 3e 6e  ef>0 );.  pId->n
4790: 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 49 64  Ref--;.  if( pId
47a0: 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ->nRef==0 ){.   
47b0: 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46   struct vxworksF
47c0: 69 6c 65 49 64 20 2a 2a 70 70 3b 0a 20 20 20 20  ileId **pp;.    
47d0: 66 6f 72 28 70 70 3d 26 76 78 77 6f 72 6b 73 46  for(pp=&vxworksF
47e0: 69 6c 65 4c 69 73 74 3b 20 2a 70 70 20 26 26 20  ileList; *pp && 
47f0: 2a 70 70 21 3d 70 49 64 3b 20 70 70 20 3d 20 26  *pp!=pId; pp = &
4800: 28 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29 29 7b  ((*pp)->pNext)){
4810: 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a 70  }.    assert( *p
4820: 70 3d 3d 70 49 64 20 29 3b 0a 20 20 20 20 2a 70  p==pId );.    *p
4830: 70 20 3d 20 70 49 64 2d 3e 70 4e 65 78 74 3b 0a  p = pId->pNext;.
4840: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
4850: 28 70 49 64 29 3b 0a 20 20 7d 0a 20 20 75 6e 69  (pId);.  }.  uni
4860: 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 7d  xLeaveMutex();.}
4870: 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58  .#endif /* OS_VX
4880: 57 4f 52 4b 53 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a  WORKS */./******
4890: 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66  ********* End of
48a0: 20 55 6e 69 71 75 65 20 46 69 6c 65 20 49 44 20   Unique File ID 
48b0: 55 74 69 6c 69 74 79 20 55 73 65 64 20 42 79 20  Utility Used By 
48c0: 56 78 57 6f 72 6b 73 20 2a 2a 2a 2a 2a 2a 2a 2a  VxWorks ********
48d0: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
48e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
48f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4900: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4910: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4920: 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a 2a 2a 2a  *******/.../****
4930: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4940: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4950: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4960: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4970: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
4980: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4990: 2a 2a 2a 2a 2a 2a 20 50 6f 73 69 78 20 41 64 76  ****** Posix Adv
49a0: 69 73 6f 72 79 20 4c 6f 63 6b 69 6e 67 20 2a 2a  isory Locking **
49b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
49c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a  **********.**.**
49d0: 20 50 4f 53 49 58 20 61 64 76 69 73 6f 72 79 20   POSIX advisory 
49e0: 6c 6f 63 6b 73 20 61 72 65 20 62 72 6f 6b 65 6e  locks are broken
49f0: 20 62 79 20 64 65 73 69 67 6e 2e 20 20 41 4e 53   by design.  ANS
4a00: 49 20 53 54 44 20 31 30 30 33 2e 31 20 28 31 39  I STD 1003.1 (19
4a10: 39 36 29 0a 2a 2a 20 73 65 63 74 69 6f 6e 20 36  96).** section 6
4a20: 2e 35 2e 32 2e 32 20 6c 69 6e 65 73 20 34 38 33  .5.2.2 lines 483
4a30: 20 74 68 72 6f 75 67 68 20 34 39 30 20 73 70 65   through 490 spe
4a40: 63 69 66 79 20 74 68 61 74 20 77 68 65 6e 20 61  cify that when a
4a50: 20 70 72 6f 63 65 73 73 0a 2a 2a 20 73 65 74 73   process.** sets
4a60: 20 6f 72 20 63 6c 65 61 72 73 20 61 20 6c 6f 63   or clears a loc
4a70: 6b 2c 20 74 68 61 74 20 6f 70 65 72 61 74 69 6f  k, that operatio
4a80: 6e 20 6f 76 65 72 72 69 64 65 73 20 61 6e 79 20  n overrides any 
4a90: 70 72 69 6f 72 20 6c 6f 63 6b 73 20 73 65 74 0a  prior locks set.
4aa0: 2a 2a 20 62 79 20 74 68 65 20 73 61 6d 65 20 70  ** by the same p
4ab0: 72 6f 63 65 73 73 2e 20 20 49 74 20 64 6f 65 73  rocess.  It does
4ac0: 20 6e 6f 74 20 65 78 70 6c 69 63 69 74 6c 79 20   not explicitly 
4ad0: 73 61 79 20 73 6f 2c 20 62 75 74 20 74 68 69 73  say so, but this
4ae0: 20 69 6d 70 6c 69 65 73 0a 2a 2a 20 74 68 61 74   implies.** that
4af0: 20 69 74 20 6f 76 65 72 72 69 64 65 73 20 6c 6f   it overrides lo
4b00: 63 6b 73 20 73 65 74 20 62 79 20 74 68 65 20 73  cks set by the s
4b10: 61 6d 65 20 70 72 6f 63 65 73 73 20 75 73 69 6e  ame process usin
4b20: 67 20 61 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a  g a different.**
4b30: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
4b40: 2e 20 20 43 6f 6e 73 69 64 65 72 20 74 68 69 73  .  Consider this
4b50: 20 74 65 73 74 20 63 61 73 65 3a 0a 2a 2a 0a 2a   test case:.**.*
4b60: 2a 20 20 20 20 20 20 20 69 6e 74 20 66 64 31 20  *       int fd1 
4b70: 3d 20 6f 70 65 6e 28 22 2e 2f 66 69 6c 65 31 22  = open("./file1"
4b80: 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54  , O_RDWR|O_CREAT
4b90: 2c 20 30 36 34 34 29 3b 0a 2a 2a 20 20 20 20 20  , 0644);.**     
4ba0: 20 20 69 6e 74 20 66 64 32 20 3d 20 6f 70 65 6e    int fd2 = open
4bb0: 28 22 2e 2f 66 69 6c 65 32 22 2c 20 4f 5f 52 44  ("./file2", O_RD
4bc0: 57 52 7c 4f 5f 43 52 45 41 54 2c 20 30 36 34 34  WR|O_CREAT, 0644
4bd0: 29 3b 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73 65  );.**.** Suppose
4be0: 20 2e 2f 66 69 6c 65 31 20 61 6e 64 20 2e 2f 66   ./file1 and ./f
4bf0: 69 6c 65 32 20 61 72 65 20 72 65 61 6c 6c 79 20  ile2 are really 
4c00: 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20 28 62  the same file (b
4c10: 65 63 61 75 73 65 0a 2a 2a 20 6f 6e 65 20 69 73  ecause.** one is
4c20: 20 61 20 68 61 72 64 20 6f 72 20 73 79 6d 62 6f   a hard or symbo
4c30: 6c 69 63 20 6c 69 6e 6b 20 74 6f 20 74 68 65 20  lic link to the 
4c40: 6f 74 68 65 72 29 20 74 68 65 6e 20 69 66 20 79  other) then if y
4c50: 6f 75 20 73 65 74 0a 2a 2a 20 61 6e 20 65 78 63  ou set.** an exc
4c60: 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 66  lusive lock on f
4c70: 64 31 2c 20 74 68 65 6e 20 74 72 79 20 74 6f 20  d1, then try to 
4c80: 67 65 74 20 61 6e 20 65 78 63 6c 75 73 69 76 65  get an exclusive
4c90: 20 6c 6f 63 6b 0a 2a 2a 20 6f 6e 20 66 64 32 2c   lock.** on fd2,
4ca0: 20 69 74 20 77 6f 72 6b 73 2e 20 20 49 20 77 6f   it works.  I wo
4cb0: 75 6c 64 20 68 61 76 65 20 65 78 70 65 63 74 65  uld have expecte
4cc0: 64 20 74 68 65 20 73 65 63 6f 6e 64 20 6c 6f 63  d the second loc
4cd0: 6b 20 74 6f 0a 2a 2a 20 66 61 69 6c 20 73 69 6e  k to.** fail sin
4ce0: 63 65 20 74 68 65 72 65 20 77 61 73 20 61 6c 72  ce there was alr
4cf0: 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 6e 20 74  eady a lock on t
4d00: 68 65 20 66 69 6c 65 20 64 75 65 20 74 6f 20 66  he file due to f
4d10: 64 31 2e 0a 2a 2a 20 42 75 74 20 6e 6f 74 20 73  d1..** But not s
4d20: 6f 2e 20 20 53 69 6e 63 65 20 62 6f 74 68 20 6c  o.  Since both l
4d30: 6f 63 6b 73 20 63 61 6d 65 20 66 72 6f 6d 20 74  ocks came from t
4d40: 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 2c  he same process,
4d50: 20 74 68 65 0a 2a 2a 20 73 65 63 6f 6e 64 20 6f   the.** second o
4d60: 76 65 72 72 69 64 65 73 20 74 68 65 20 66 69 72  verrides the fir
4d70: 73 74 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 20  st, even though 
4d80: 74 68 65 79 20 77 65 72 65 20 6f 6e 20 64 69 66  they were on dif
4d90: 66 65 72 65 6e 74 0a 2a 2a 20 66 69 6c 65 20 64  ferent.** file d
4da0: 65 73 63 72 69 70 74 6f 72 73 20 6f 70 65 6e 65  escriptors opene
4db0: 64 20 6f 6e 20 64 69 66 66 65 72 65 6e 74 20 66  d on different f
4dc0: 69 6c 65 20 6e 61 6d 65 73 2e 0a 2a 2a 0a 2a 2a  ile names..**.**
4dd0: 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74   This means that
4de0: 20 77 65 20 63 61 6e 6e 6f 74 20 75 73 65 20 50   we cannot use P
4df0: 4f 53 49 58 20 6c 6f 63 6b 73 20 74 6f 20 73 79  OSIX locks to sy
4e00: 6e 63 68 72 6f 6e 69 7a 65 20 66 69 6c 65 20 61  nchronize file a
4e10: 63 63 65 73 73 0a 2a 2a 20 61 6d 6f 6e 67 20 63  ccess.** among c
4e20: 6f 6d 70 65 74 69 6e 67 20 74 68 72 65 61 64 73  ompeting threads
4e30: 20 6f 66 20 74 68 65 20 73 61 6d 65 20 70 72 6f   of the same pro
4e40: 63 65 73 73 2e 20 20 50 4f 53 49 58 20 6c 6f 63  cess.  POSIX loc
4e50: 6b 73 20 77 69 6c 6c 20 77 6f 72 6b 20 66 69 6e  ks will work fin
4e60: 65 0a 2a 2a 20 74 6f 20 73 79 6e 63 68 72 6f 6e  e.** to synchron
4e70: 69 7a 65 20 61 63 63 65 73 73 20 66 6f 72 20 74  ize access for t
4e80: 68 72 65 61 64 73 20 69 6e 20 73 65 70 61 72 61  hreads in separa
4e90: 74 65 20 70 72 6f 63 65 73 73 65 73 2c 20 62 75  te processes, bu
4ea0: 74 20 6e 6f 74 0a 2a 2a 20 74 68 72 65 61 64 73  t not.** threads
4eb0: 20 77 69 74 68 69 6e 20 74 68 65 20 73 61 6d 65   within the same
4ec0: 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20   process..**.** 
4ed0: 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74  To work around t
4ee0: 68 65 20 70 72 6f 62 6c 65 6d 2c 20 53 51 4c 69  he problem, SQLi
4ef0: 74 65 20 68 61 73 20 74 6f 20 6d 61 6e 61 67 65  te has to manage
4f00: 20 66 69 6c 65 20 6c 6f 63 6b 73 20 69 6e 74 65   file locks inte
4f10: 72 6e 61 6c 6c 79 0a 2a 2a 20 6f 6e 20 69 74 73  rnally.** on its
4f20: 20 6f 77 6e 2e 20 20 57 68 65 6e 65 76 65 72 20   own.  Whenever 
4f30: 61 20 6e 65 77 20 64 61 74 61 62 61 73 65 20 69  a new database i
4f40: 73 20 6f 70 65 6e 65 64 2c 20 77 65 20 68 61 76  s opened, we hav
4f50: 65 20 74 6f 20 66 69 6e 64 20 74 68 65 0a 2a 2a  e to find the.**
4f60: 20 73 70 65 63 69 66 69 63 20 69 6e 6f 64 65 20   specific inode 
4f70: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
4f80: 66 69 6c 65 20 28 74 68 65 20 69 6e 6f 64 65 20  file (the inode 
4f90: 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  is determined by
4fa0: 20 74 68 65 0a 2a 2a 20 73 74 5f 64 65 76 20 61   the.** st_dev a
4fb0: 6e 64 20 73 74 5f 69 6e 6f 20 66 69 65 6c 64 73  nd st_ino fields
4fc0: 20 6f 66 20 74 68 65 20 73 74 61 74 20 73 74 72   of the stat str
4fd0: 75 63 74 75 72 65 20 74 68 61 74 20 66 73 74 61  ucture that fsta
4fe0: 74 28 29 20 66 69 6c 6c 73 20 69 6e 29 0a 2a 2a  t() fills in).**
4ff0: 20 61 6e 64 20 63 68 65 63 6b 20 66 6f 72 20 6c   and check for l
5000: 6f 63 6b 73 20 61 6c 72 65 61 64 79 20 65 78 69  ocks already exi
5010: 73 74 69 6e 67 20 6f 6e 20 74 68 61 74 20 69 6e  sting on that in
5020: 6f 64 65 2e 20 20 57 68 65 6e 20 6c 6f 63 6b 73  ode.  When locks
5030: 20 61 72 65 0a 2a 2a 20 63 72 65 61 74 65 64 20   are.** created 
5040: 6f 72 20 72 65 6d 6f 76 65 64 2c 20 77 65 20 68  or removed, we h
5050: 61 76 65 20 74 6f 20 6c 6f 6f 6b 20 61 74 20 6f  ave to look at o
5060: 75 72 20 6f 77 6e 20 69 6e 74 65 72 6e 61 6c 20  ur own internal 
5070: 72 65 63 6f 72 64 20 6f 66 20 74 68 65 0a 2a 2a  record of the.**
5080: 20 6c 6f 63 6b 73 20 74 6f 20 73 65 65 20 69 66   locks to see if
5090: 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64 20   another thread 
50a0: 68 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 73  has previously s
50b0: 65 74 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 61  et a lock on tha
50c0: 74 20 73 61 6d 65 0a 2a 2a 20 69 6e 6f 64 65 2e  t same.** inode.
50d0: 0a 2a 2a 0a 2a 2a 20 28 41 73 69 64 65 3a 20 54  .**.** (Aside: T
50e0: 68 65 20 75 73 65 20 6f 66 20 69 6e 6f 64 65 20  he use of inode 
50f0: 6e 75 6d 62 65 72 73 20 61 73 20 75 6e 69 71 75  numbers as uniqu
5100: 65 20 49 44 73 20 64 6f 65 73 20 6e 6f 74 20 77  e IDs does not w
5110: 6f 72 6b 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a  ork on VxWorks..
5120: 2a 2a 20 46 6f 72 20 56 78 57 6f 72 6b 73 2c 20  ** For VxWorks, 
5130: 77 65 20 68 61 76 65 20 74 6f 20 75 73 65 20 74  we have to use t
5140: 68 65 20 61 6c 74 65 72 6e 61 74 69 76 65 20 75  he alternative u
5150: 6e 69 71 75 65 20 49 44 20 73 79 73 74 65 6d 20  nique ID system 
5160: 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 63 61 6e 6f  based on.** cano
5170: 6e 69 63 61 6c 20 66 69 6c 65 6e 61 6d 65 20 61  nical filename a
5180: 6e 64 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 69  nd implemented i
5190: 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 64  n the previous d
51a0: 69 76 69 73 69 6f 6e 2e 29 0a 2a 2a 0a 2a 2a 20  ivision.).**.** 
51b0: 54 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  The sqlite3_file
51c0: 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 50   structure for P
51d0: 4f 53 49 58 20 69 73 20 6e 6f 20 6c 6f 6e 67 65  OSIX is no longe
51e0: 72 20 6a 75 73 74 20 61 6e 20 69 6e 74 65 67 65  r just an intege
51f0: 72 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63 72 69  r file.** descri
5200: 70 74 6f 72 2e 20 20 49 74 20 69 73 20 6e 6f 77  ptor.  It is now
5210: 20 61 20 73 74 72 75 63 74 75 72 65 20 74 68 61   a structure tha
5220: 74 20 68 6f 6c 64 73 20 74 68 65 20 69 6e 74 65  t holds the inte
5230: 67 65 72 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63  ger file.** desc
5240: 72 69 70 74 6f 72 20 61 6e 64 20 61 20 70 6f 69  riptor and a poi
5250: 6e 74 65 72 20 74 6f 20 61 20 73 74 72 75 63 74  nter to a struct
5260: 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69 62  ure that describ
5270: 65 73 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 0a  es the internal.
5280: 2a 2a 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 20  ** locks on the 
5290: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 69 6e  corresponding in
52a0: 6f 64 65 2e 20 20 54 68 65 72 65 20 69 73 20 6f  ode.  There is o
52b0: 6e 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63  ne locking struc
52c0: 74 75 72 65 0a 2a 2a 20 70 65 72 20 69 6e 6f 64  ture.** per inod
52d0: 65 2c 20 73 6f 20 69 66 20 74 68 65 20 73 61 6d  e, so if the sam
52e0: 65 20 69 6e 6f 64 65 20 69 73 20 6f 70 65 6e 65  e inode is opene
52f0: 64 20 74 77 69 63 65 2c 20 62 6f 74 68 20 75 6e  d twice, both un
5300: 69 78 46 69 6c 65 20 73 74 72 75 63 74 75 72 65  ixFile structure
5310: 73 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 74 68  s.** point to th
5320: 65 20 73 61 6d 65 20 6c 6f 63 6b 69 6e 67 20 73  e same locking s
5330: 74 72 75 63 74 75 72 65 2e 20 20 54 68 65 20 6c  tructure.  The l
5340: 6f 63 6b 69 6e 67 20 73 74 72 75 63 74 75 72 65  ocking structure
5350: 20 6b 65 65 70 73 0a 2a 2a 20 61 20 72 65 66 65   keeps.** a refe
5360: 72 65 6e 63 65 20 63 6f 75 6e 74 20 28 73 6f 20  rence count (so 
5370: 77 65 20 77 69 6c 6c 20 6b 6e 6f 77 20 77 68 65  we will know whe
5380: 6e 20 74 6f 20 64 65 6c 65 74 65 20 69 74 29 20  n to delete it) 
5390: 61 6e 64 20 61 20 22 63 6e 74 22 0a 2a 2a 20 66  and a "cnt".** f
53a0: 69 65 6c 64 20 74 68 61 74 20 74 65 6c 6c 73 20  ield that tells 
53b0: 75 73 20 69 74 73 20 69 6e 74 65 72 6e 61 6c 20  us its internal 
53c0: 6c 6f 63 6b 20 73 74 61 74 75 73 2e 20 20 63 6e  lock status.  cn
53d0: 74 3d 3d 30 20 6d 65 61 6e 73 20 74 68 65 0a 2a  t==0 means the.*
53e0: 2a 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b  * file is unlock
53f0: 65 64 2e 20 20 63 6e 74 3d 3d 2d 31 20 6d 65 61  ed.  cnt==-1 mea
5400: 6e 73 20 74 68 65 20 66 69 6c 65 20 68 61 73 20  ns the file has 
5410: 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
5420: 6b 2e 0a 2a 2a 20 63 6e 74 3e 30 20 6d 65 61 6e  k..** cnt>0 mean
5430: 73 20 74 68 65 72 65 20 61 72 65 20 63 6e 74 20  s there are cnt 
5440: 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 6f 6e 20  shared locks on 
5450: 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  the file..**.** 
5460: 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20 6c  Any attempt to l
5470: 6f 63 6b 20 6f 72 20 75 6e 6c 6f 63 6b 20 61 20  ock or unlock a 
5480: 66 69 6c 65 20 66 69 72 73 74 20 63 68 65 63 6b  file first check
5490: 73 20 74 68 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a  s the locking.**
54a0: 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65   structure.  The
54b0: 20 66 63 6e 74 6c 28 29 20 73 79 73 74 65 6d 20   fcntl() system 
54c0: 63 61 6c 6c 20 69 73 20 6f 6e 6c 79 20 69 6e 76  call is only inv
54d0: 6f 6b 65 64 20 74 6f 20 73 65 74 20 61 20 0a 2a  oked to set a .*
54e0: 2a 20 50 4f 53 49 58 20 6c 6f 63 6b 20 69 66 20  * POSIX lock if 
54f0: 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 6c 6f 63  the internal loc
5500: 6b 20 73 74 72 75 63 74 75 72 65 20 74 72 61 6e  k structure tran
5510: 73 69 74 69 6f 6e 73 20 62 65 74 77 65 65 6e 0a  sitions between.
5520: 2a 2a 20 61 20 6c 6f 63 6b 65 64 20 61 6e 64 20  ** a locked and 
5530: 61 6e 20 75 6e 6c 6f 63 6b 65 64 20 73 74 61 74  an unlocked stat
5540: 65 2e 0a 2a 2a 0a 2a 2a 20 42 75 74 20 77 61 69  e..**.** But wai
5550: 74 3a 20 20 74 68 65 72 65 20 61 72 65 20 79 65  t:  there are ye
5560: 74 20 6d 6f 72 65 20 70 72 6f 62 6c 65 6d 73 20  t more problems 
5570: 77 69 74 68 20 50 4f 53 49 58 20 61 64 76 69 73  with POSIX advis
5580: 6f 72 79 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a  ory locks..**.**
5590: 20 49 66 20 79 6f 75 20 63 6c 6f 73 65 20 61 20   If you close a 
55a0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
55b0: 74 68 61 74 20 70 6f 69 6e 74 73 20 74 6f 20 61  that points to a
55c0: 20 66 69 6c 65 20 74 68 61 74 20 68 61 73 20 6c   file that has l
55d0: 6f 63 6b 73 2c 0a 2a 2a 20 61 6c 6c 20 6c 6f 63  ocks,.** all loc
55e0: 6b 73 20 6f 6e 20 74 68 61 74 20 66 69 6c 65 20  ks on that file 
55f0: 74 68 61 74 20 61 72 65 20 6f 77 6e 65 64 20 62  that are owned b
5600: 79 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 72  y the current pr
5610: 6f 63 65 73 73 20 61 72 65 0a 2a 2a 20 72 65 6c  ocess are.** rel
5620: 65 61 73 65 64 2e 20 20 54 6f 20 77 6f 72 6b 20  eased.  To work 
5630: 61 72 6f 75 6e 64 20 74 68 69 73 20 70 72 6f 62  around this prob
5640: 6c 65 6d 2c 20 65 61 63 68 20 75 6e 69 78 46 69  lem, each unixFi
5650: 6c 65 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e  le structure con
5660: 74 61 69 6e 73 0a 2a 2a 20 61 20 70 6f 69 6e 74  tains.** a point
5670: 65 72 20 74 6f 20 61 6e 20 75 6e 69 78 4f 70 65  er to an unixOpe
5680: 6e 43 6e 74 20 73 74 72 75 63 74 75 72 65 2e 20  nCnt structure. 
5690: 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 75 6e   There is one un
56a0: 69 78 4f 70 65 6e 43 6e 74 20 73 74 72 75 63 74  ixOpenCnt struct
56b0: 75 72 65 0a 2a 2a 20 70 65 72 20 6f 70 65 6e 20  ure.** per open 
56c0: 69 6e 6f 64 65 2c 20 77 68 69 63 68 20 6d 65 61  inode, which mea
56d0: 6e 73 20 74 68 61 74 20 6d 75 6c 74 69 70 6c 65  ns that multiple
56e0: 20 75 6e 69 78 46 69 6c 65 20 63 61 6e 20 70 6f   unixFile can po
56f0: 69 6e 74 20 74 6f 20 61 20 73 69 6e 67 6c 65 0a  int to a single.
5700: 2a 2a 20 75 6e 69 78 4f 70 65 6e 43 6e 74 2e 20  ** unixOpenCnt. 
5710: 20 57 68 65 6e 20 61 6e 20 61 74 74 65 6d 70 74   When an attempt
5720: 20 69 73 20 6d 61 64 65 20 74 6f 20 63 6c 6f 73   is made to clos
5730: 65 20 61 6e 20 75 6e 69 78 46 69 6c 65 2c 20 69  e an unixFile, i
5740: 66 20 74 68 65 72 65 20 61 72 65 0a 2a 2a 20 6f  f there are.** o
5750: 74 68 65 72 20 75 6e 69 78 46 69 6c 65 20 6f 70  ther unixFile op
5760: 65 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 69  en on the same i
5770: 6e 6f 64 65 20 74 68 61 74 20 61 72 65 20 68 6f  node that are ho
5780: 6c 64 69 6e 67 20 6c 6f 63 6b 73 2c 20 74 68 65  lding locks, the
5790: 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 63 6c 6f 73   call.** to clos
57a0: 65 28 29 20 74 68 65 20 66 69 6c 65 20 64 65 73  e() the file des
57b0: 63 72 69 70 74 6f 72 20 69 73 20 64 65 66 65 72  criptor is defer
57c0: 72 65 64 20 75 6e 74 69 6c 20 61 6c 6c 20 6f 66  red until all of
57d0: 20 74 68 65 20 6c 6f 63 6b 73 20 63 6c 65 61 72   the locks clear
57e0: 2e 0a 2a 2a 20 54 68 65 20 75 6e 69 78 4f 70 65  ..** The unixOpe
57f0: 6e 43 6e 74 20 73 74 72 75 63 74 75 72 65 20 6b  nCnt structure k
5800: 65 65 70 73 20 61 20 6c 69 73 74 20 6f 66 20 66  eeps a list of f
5810: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20  ile descriptors 
5820: 74 68 61 74 20 6e 65 65 64 20 74 6f 0a 2a 2a 20  that need to.** 
5830: 62 65 20 63 6c 6f 73 65 64 20 61 6e 64 20 74 68  be closed and th
5840: 61 74 20 6c 69 73 74 20 69 73 20 77 61 6c 6b 65  at list is walke
5850: 64 20 28 61 6e 64 20 63 6c 65 61 72 65 64 29 20  d (and cleared) 
5860: 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20 6c 6f  when the last lo
5870: 63 6b 0a 2a 2a 20 63 6c 65 61 72 73 2e 0a 2a 2a  ck.** clears..**
5880: 0a 2a 2a 20 59 65 74 20 61 6e 6f 74 68 65 72 20  .** Yet another 
5890: 70 72 6f 62 6c 65 6d 3a 20 20 4c 69 6e 75 78 54  problem:  LinuxT
58a0: 68 72 65 61 64 73 20 64 6f 20 6e 6f 74 20 70 6c  hreads do not pl
58b0: 61 79 20 77 65 6c 6c 20 77 69 74 68 20 70 6f 73  ay well with pos
58c0: 69 78 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20  ix locks..**.** 
58d0: 4d 61 6e 79 20 6f 6c 64 65 72 20 76 65 72 73 69  Many older versi
58e0: 6f 6e 73 20 6f 66 20 6c 69 6e 75 78 20 75 73 65  ons of linux use
58f0: 20 74 68 65 20 4c 69 6e 75 78 54 68 72 65 61 64   the LinuxThread
5900: 73 20 6c 69 62 72 61 72 79 20 77 68 69 63 68 20  s library which 
5910: 69 73 0a 2a 2a 20 6e 6f 74 20 70 6f 73 69 78 20  is.** not posix 
5920: 63 6f 6d 70 6c 69 61 6e 74 2e 20 20 55 6e 64 65  compliant.  Unde
5930: 72 20 4c 69 6e 75 78 54 68 72 65 61 64 73 2c 20  r LinuxThreads, 
5940: 61 20 6c 6f 63 6b 20 63 72 65 61 74 65 64 20 62  a lock created b
5950: 79 20 74 68 72 65 61 64 0a 2a 2a 20 41 20 63 61  y thread.** A ca
5960: 6e 6e 6f 74 20 62 65 20 6d 6f 64 69 66 69 65 64  nnot be modified
5970: 20 6f 72 20 6f 76 65 72 72 69 64 64 65 6e 20 62   or overridden b
5980: 79 20 61 20 64 69 66 66 65 72 65 6e 74 20 74 68  y a different th
5990: 72 65 61 64 20 42 2e 0a 2a 2a 20 4f 6e 6c 79 20  read B..** Only 
59a0: 74 68 72 65 61 64 20 41 20 63 61 6e 20 6d 6f 64  thread A can mod
59b0: 69 66 79 20 74 68 65 20 6c 6f 63 6b 2e 20 20 4c  ify the lock.  L
59c0: 6f 63 6b 69 6e 67 20 62 65 68 61 76 69 6f 72 20  ocking behavior 
59d0: 69 73 20 63 6f 72 72 65 63 74 0a 2a 2a 20 69 66  is correct.** if
59e0: 20 74 68 65 20 61 70 70 6c 69 61 74 69 6f 6e 20   the appliation 
59f0: 75 73 65 73 20 74 68 65 20 6e 65 77 65 72 20 4e  uses the newer N
5a00: 61 74 69 76 65 20 50 6f 73 69 78 20 54 68 72 65  ative Posix Thre
5a10: 61 64 20 4c 69 62 72 61 72 79 20 28 4e 50 54 4c  ad Library (NPTL
5a20: 29 0a 2a 2a 20 6f 6e 20 6c 69 6e 75 78 20 2d 20  ).** on linux - 
5a30: 77 69 74 68 20 4e 50 54 4c 20 61 20 6c 6f 63 6b  with NPTL a lock
5a40: 20 63 72 65 61 74 65 64 20 62 79 20 74 68 72 65   created by thre
5a50: 61 64 20 41 20 63 61 6e 20 6f 76 65 72 72 69 64  ad A can overrid
5a60: 65 20 6c 6f 63 6b 73 0a 2a 2a 20 69 6e 20 74 68  e locks.** in th
5a70: 72 65 61 64 20 42 2e 20 20 42 75 74 20 74 68 65  read B.  But the
5a80: 72 65 20 69 73 20 6e 6f 20 77 61 79 20 74 6f 20  re is no way to 
5a90: 6b 6e 6f 77 20 61 74 20 63 6f 6d 70 69 6c 65 2d  know at compile-
5aa0: 74 69 6d 65 20 77 68 69 63 68 0a 2a 2a 20 74 68  time which.** th
5ab0: 72 65 61 64 69 6e 67 20 6c 69 62 72 61 72 79 20  reading library 
5ac0: 69 73 20 62 65 69 6e 67 20 75 73 65 64 2e 20 20  is being used.  
5ad0: 53 6f 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77  So there is no w
5ae0: 61 79 20 74 6f 20 6b 6e 6f 77 20 61 74 0a 2a 2a  ay to know at.**
5af0: 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 77 68   compile-time wh
5b00: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 72  ether or not thr
5b10: 65 61 64 20 41 20 63 61 6e 20 6f 76 65 72 72 69  ead A can overri
5b20: 64 65 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 72 65  de locks on thre
5b30: 61 64 20 42 2e 0a 2a 2a 20 57 65 20 68 61 76 65  ad B..** We have
5b40: 20 74 6f 20 64 6f 20 61 20 72 75 6e 2d 74 69 6d   to do a run-tim
5b50: 65 20 63 68 65 63 6b 20 74 6f 20 64 69 73 63 6f  e check to disco
5b60: 76 65 72 20 74 68 65 20 62 65 68 61 76 69 6f 72  ver the behavior
5b70: 20 6f 66 20 74 68 65 0a 2a 2a 20 63 75 72 72 65   of the.** curre
5b80: 6e 74 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a  nt process..**.*
5b90: 2a 20 4f 6e 20 73 79 73 74 65 6d 73 20 77 68 65  * On systems whe
5ba0: 72 65 20 74 68 72 65 61 64 20 41 20 69 73 20 75  re thread A is u
5bb0: 6e 61 62 6c 65 20 74 6f 20 6d 6f 64 69 66 79 20  nable to modify 
5bc0: 6c 6f 63 6b 73 20 63 72 65 61 74 65 64 20 62 79  locks created by
5bd0: 0a 2a 2a 20 74 68 72 65 61 64 20 42 2c 20 77 65  .** thread B, we
5be0: 20 68 61 76 65 20 74 6f 20 6b 65 65 70 20 74 72   have to keep tr
5bf0: 61 63 6b 20 6f 66 20 77 68 69 63 68 20 74 68 72  ack of which thr
5c00: 65 61 64 20 63 72 65 61 74 65 64 20 65 61 63 68  ead created each
5c10: 0a 2a 2a 20 6c 6f 63 6b 2e 20 20 48 65 6e 63 65  .** lock.  Hence
5c20: 20 74 68 65 72 65 20 69 73 20 61 6e 20 65 78 74   there is an ext
5c30: 72 61 20 66 69 65 6c 64 20 69 6e 20 74 68 65 20  ra field in the 
5c40: 6b 65 79 20 74 6f 20 74 68 65 20 75 6e 69 78 4c  key to the unixL
5c50: 6f 63 6b 49 6e 66 6f 0a 2a 2a 20 73 74 72 75 63  ockInfo.** struc
5c60: 74 75 72 65 20 74 6f 20 72 65 63 6f 72 64 20 74  ture to record t
5c70: 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  his information.
5c80: 20 20 41 6e 64 20 6f 6e 20 74 68 6f 73 65 20 73    And on those s
5c90: 79 73 74 65 6d 73 20 69 74 0a 2a 2a 20 69 73 20  ystems it.** is 
5ca0: 69 6c 6c 65 67 61 6c 20 74 6f 20 62 65 67 69 6e  illegal to begin
5cb0: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
5cc0: 6e 20 6f 6e 65 20 74 68 72 65 61 64 20 61 6e 64  n one thread and
5cd0: 20 66 69 6e 69 73 68 20 69 74 0a 2a 2a 20 69 6e   finish it.** in
5ce0: 20 61 6e 6f 74 68 65 72 2e 20 20 46 6f 72 20 74   another.  For t
5cf0: 68 69 73 20 6c 61 74 74 65 72 20 72 65 73 74 72  his latter restr
5d00: 69 63 74 69 6f 6e 2c 20 74 68 65 72 65 20 69 73  iction, there is
5d10: 20 6e 6f 20 77 6f 72 6b 2d 61 72 6f 75 6e 64 2e   no work-around.
5d20: 0a 2a 2a 20 49 74 20 69 73 20 61 20 6c 69 6d 69  .** It is a limi
5d30: 74 61 74 69 6f 6e 20 6f 66 20 4c 69 6e 75 78 54  tation of LinuxT
5d40: 68 72 65 61 64 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a  hreads..*/../*.*
5d50: 2a 20 53 65 74 20 6f 72 20 63 68 65 63 6b 20 74  * Set or check t
5d60: 68 65 20 75 6e 69 78 46 69 6c 65 2e 74 69 64 20  he unixFile.tid 
5d70: 66 69 65 6c 64 2e 20 20 54 68 69 73 20 66 69 65  field.  This fie
5d80: 6c 64 20 69 73 20 73 65 74 20 77 68 65 6e 20 61  ld is set when a
5d90: 6e 20 75 6e 69 78 46 69 6c 65 0a 2a 2a 20 69 73  n unixFile.** is
5da0: 20 66 69 72 73 74 20 6f 70 65 6e 65 64 2e 20 20   first opened.  
5db0: 41 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 20 75  All subsequent u
5dc0: 73 65 73 20 6f 66 20 74 68 65 20 75 6e 69 78 46  ses of the unixF
5dd0: 69 6c 65 20 76 65 72 69 66 79 20 74 68 61 74 20  ile verify that 
5de0: 74 68 65 0a 2a 2a 20 73 61 6d 65 20 74 68 72 65  the.** same thre
5df0: 61 64 20 69 73 20 6f 70 65 72 61 74 69 6e 67 20  ad is operating 
5e00: 6f 6e 20 74 68 65 20 75 6e 69 78 46 69 6c 65 2e  on the unixFile.
5e10: 20 20 53 6f 6d 65 20 6f 70 65 72 61 74 69 6e 67    Some operating
5e20: 20 73 79 73 74 65 6d 73 20 64 6f 0a 2a 2a 20 6e   systems do.** n
5e30: 6f 74 20 61 6c 6c 6f 77 20 6c 6f 63 6b 73 20 74  ot allow locks t
5e40: 6f 20 62 65 20 6f 76 65 72 72 69 64 64 65 6e 20  o be overridden 
5e50: 62 79 20 6f 74 68 65 72 20 74 68 72 65 61 64 73  by other threads
5e60: 20 61 6e 64 20 74 68 61 74 20 72 65 73 74 72 69   and that restri
5e70: 63 74 69 6f 6e 0a 2a 2a 20 6d 65 61 6e 73 20 74  ction.** means t
5e80: 68 61 74 20 73 71 6c 69 74 65 33 2a 20 64 61 74  hat sqlite3* dat
5e90: 61 62 61 73 65 20 68 61 6e 64 6c 65 73 20 63 61  abase handles ca
5ea0: 6e 6e 6f 74 20 62 65 20 6d 6f 76 65 64 20 66 72  nnot be moved fr
5eb0: 6f 6d 20 6f 6e 65 20 74 68 72 65 61 64 0a 2a 2a  om one thread.**
5ec0: 20 74 6f 20 61 6e 6f 74 68 65 72 20 77 68 69 6c   to another whil
5ed0: 65 20 6c 6f 63 6b 73 20 61 72 65 20 68 65 6c 64  e locks are held
5ee0: 2e 0a 2a 2a 0a 2a 2a 20 56 65 72 73 69 6f 6e 20  ..**.** Version 
5ef0: 33 2e 33 2e 31 20 28 32 30 30 36 2d 30 31 2d 31  3.3.1 (2006-01-1
5f00: 35 29 3a 20 20 75 6e 69 78 46 69 6c 65 20 63 61  5):  unixFile ca
5f10: 6e 20 62 65 20 6d 6f 76 65 64 20 66 72 6f 6d 20  n be moved from 
5f20: 6f 6e 65 20 74 68 72 65 61 64 20 74 6f 0a 2a 2a  one thread to.**
5f30: 20 61 6e 6f 74 68 65 72 20 61 73 20 6c 6f 6e 67   another as long
5f40: 20 61 73 20 77 65 20 61 72 65 20 72 75 6e 6e 69   as we are runni
5f50: 6e 67 20 6f 6e 20 61 20 73 79 73 74 65 6d 20 74  ng on a system t
5f60: 68 61 74 20 73 75 70 70 6f 72 74 73 20 74 68 72  hat supports thr
5f70: 65 61 64 73 0a 2a 2a 20 6f 76 65 72 72 69 64 69  eads.** overridi
5f80: 6e 67 20 65 61 63 68 20 6f 74 68 65 72 73 20 6c  ng each others l
5f90: 6f 63 6b 73 20 28 77 68 69 63 68 20 69 73 20 6e  ocks (which is n
5fa0: 6f 77 20 74 68 65 20 6d 6f 73 74 20 63 6f 6d 6d  ow the most comm
5fb0: 6f 6e 20 62 65 68 61 76 69 6f 72 29 0a 2a 2a 20  on behavior).** 
5fc0: 6f 72 20 69 66 20 6e 6f 20 6c 6f 63 6b 73 20 61  or if no locks a
5fd0: 72 65 20 68 65 6c 64 2e 20 20 42 75 74 20 74 68  re held.  But th
5fe0: 65 20 75 6e 69 78 46 69 6c 65 2e 70 4c 6f 63 6b  e unixFile.pLock
5ff0: 20 66 69 65 6c 64 20 6e 65 65 64 73 20 74 6f 20   field needs to 
6000: 62 65 0a 2a 2a 20 72 65 63 6f 6d 70 75 74 65 64  be.** recomputed
6010: 20 62 65 63 61 75 73 65 20 69 74 73 20 6b 65 79   because its key
6020: 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20 74 68   includes the th
6030: 72 65 61 64 2d 69 64 2e 20 20 53 65 65 20 74 68  read-id.  See th
6040: 65 20 0a 2a 2a 20 74 72 61 6e 73 66 65 72 4f 77  e .** transferOw
6050: 6e 65 72 73 68 69 70 28 29 20 66 75 6e 63 74 69  nership() functi
6060: 6f 6e 20 62 65 6c 6f 77 20 66 6f 72 20 61 64 64  on below for add
6070: 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
6080: 69 6f 6e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54  ion.*/.#if SQLIT
6090: 45 5f 54 48 52 45 41 44 53 41 46 45 20 26 26 20  E_THREADSAFE && 
60a0: 64 65 66 69 6e 65 64 28 5f 5f 6c 69 6e 75 78 5f  defined(__linux_
60b0: 5f 29 0a 23 20 64 65 66 69 6e 65 20 53 45 54 5f  _).# define SET_
60c0: 54 48 52 45 41 44 49 44 28 58 29 20 20 20 28 58  THREADID(X)   (X
60d0: 29 2d 3e 74 69 64 20 3d 20 70 74 68 72 65 61 64  )->tid = pthread
60e0: 5f 73 65 6c 66 28 29 0a 23 20 64 65 66 69 6e 65  _self().# define
60f0: 20 43 48 45 43 4b 5f 54 48 52 45 41 44 49 44 28   CHECK_THREADID(
6100: 58 29 20 28 74 68 72 65 61 64 73 4f 76 65 72 72  X) (threadsOverr
6110: 69 64 65 45 61 63 68 4f 74 68 65 72 73 4c 6f 63  ideEachOthersLoc
6120: 6b 73 3d 3d 30 20 26 26 20 5c 0a 20 20 20 20 20  ks==0 && \.     
6130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6140: 20 20 20 20 20 20 20 21 70 74 68 72 65 61 64 5f         !pthread_
6150: 65 71 75 61 6c 28 28 58 29 2d 3e 74 69 64 2c 20  equal((X)->tid, 
6160: 70 74 68 72 65 61 64 5f 73 65 6c 66 28 29 29 29  pthread_self()))
6170: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
6180: 53 45 54 5f 54 48 52 45 41 44 49 44 28 58 29 0a  SET_THREADID(X).
6190: 23 20 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 54  # define CHECK_T
61a0: 48 52 45 41 44 49 44 28 58 29 20 30 0a 23 65 6e  HREADID(X) 0.#en
61b0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e  dif../*.** An in
61c0: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f  stance of the fo
61d0: 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72  llowing structur
61e0: 65 20 73 65 72 76 65 73 20 61 73 20 74 68 65 20  e serves as the 
61f0: 6b 65 79 20 75 73 65 64 0a 2a 2a 20 74 6f 20 6c  key used.** to l
6200: 6f 63 61 74 65 20 61 20 70 61 72 74 69 63 75 6c  ocate a particul
6210: 61 72 20 75 6e 69 78 4f 70 65 6e 43 6e 74 20 73  ar unixOpenCnt s
6220: 74 72 75 63 74 75 72 65 20 67 69 76 65 6e 20 69  tructure given i
6230: 74 73 20 69 6e 6f 64 65 2e 20 20 54 68 69 73 0a  ts inode.  This.
6240: 2a 2a 20 69 73 20 74 68 65 20 73 61 6d 65 20 61  ** is the same a
6250: 73 20 74 68 65 20 75 6e 69 78 4c 6f 63 6b 4b 65  s the unixLockKe
6260: 79 20 65 78 63 65 70 74 20 74 68 61 74 20 74 68  y except that th
6270: 65 20 74 68 72 65 61 64 20 49 44 20 69 73 20 6f  e thread ID is o
6280: 6d 69 74 74 65 64 2e 0a 2a 2f 0a 73 74 72 75 63  mitted..*/.struc
6290: 74 20 75 6e 69 78 46 69 6c 65 49 64 20 7b 0a 20  t unixFileId {. 
62a0: 20 64 65 76 5f 74 20 64 65 76 3b 20 20 20 20 20   dev_t dev;     
62b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
62c0: 44 65 76 69 63 65 20 6e 75 6d 62 65 72 20 2a 2f  Device number */
62d0: 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
62e0: 20 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73    struct vxworks
62f0: 46 69 6c 65 49 64 20 2a 70 49 64 3b 20 20 2f 2a  FileId *pId;  /*
6300: 20 55 6e 69 71 75 65 20 66 69 6c 65 20 49 44 20   Unique file ID 
6310: 66 6f 72 20 76 78 77 6f 72 6b 73 2e 20 2a 2f 0a  for vxworks. */.
6320: 23 65 6c 73 65 0a 20 20 69 6e 6f 5f 74 20 69 6e  #else.  ino_t in
6330: 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o;              
6340: 20 20 20 20 2f 2a 20 49 6e 6f 64 65 20 6e 75 6d      /* Inode num
6350: 62 65 72 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b  ber */.#endif.};
6360: 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61  ../*.** An insta
6370: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
6380: 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 73  wing structure s
6390: 65 72 76 65 73 20 61 73 20 74 68 65 20 6b 65 79  erves as the key
63a0: 20 75 73 65 64 0a 2a 2a 20 74 6f 20 6c 6f 63 61   used.** to loca
63b0: 74 65 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  te a particular 
63c0: 75 6e 69 78 4c 6f 63 6b 49 6e 66 6f 20 73 74 72  unixLockInfo str
63d0: 75 63 74 75 72 65 20 67 69 76 65 6e 20 69 74 73  ucture given its
63e0: 20 69 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66   inode..**.** If
63f0: 20 74 68 72 65 61 64 73 20 63 61 6e 6e 6f 74 20   threads cannot 
6400: 6f 76 65 72 72 69 64 65 20 65 61 63 68 20 6f 74  override each ot
6410: 68 65 72 73 20 6c 6f 63 6b 73 20 28 4c 69 6e 75  hers locks (Linu
6420: 78 54 68 72 65 61 64 73 29 2c 20 74 68 65 6e 20  xThreads), then 
6430: 77 65 0a 2a 2a 20 73 65 74 20 74 68 65 20 75 6e  we.** set the un
6440: 69 78 4c 6f 63 6b 4b 65 79 2e 74 69 64 20 66 69  ixLockKey.tid fi
6450: 65 6c 64 20 74 6f 20 74 68 65 20 74 68 72 65 61  eld to the threa
6460: 64 20 49 44 2e 20 20 49 66 20 74 68 72 65 61 64  d ID.  If thread
6470: 73 20 63 61 6e 20 6f 76 65 72 72 69 64 65 0a 2a  s can override.*
6480: 2a 20 65 61 63 68 20 6f 74 68 65 72 73 20 6c 6f  * each others lo
6490: 63 6b 73 20 28 50 6f 73 69 78 20 61 6e 64 20 4e  cks (Posix and N
64a0: 50 54 4c 29 20 74 68 65 6e 20 74 69 64 20 69 73  PTL) then tid is
64b0: 20 61 6c 77 61 79 73 20 73 65 74 20 74 6f 20 7a   always set to z
64c0: 65 72 6f 2e 0a 2a 2a 20 74 69 64 20 69 73 20 6f  ero..** tid is o
64d0: 6d 69 74 74 65 64 20 69 66 20 77 65 20 63 6f 6d  mitted if we com
64e0: 70 69 6c 65 20 77 69 74 68 6f 75 74 20 74 68 72  pile without thr
64f0: 65 61 64 69 6e 67 20 73 75 70 70 6f 72 74 20 6f  eading support o
6500: 72 20 6f 6e 20 61 6e 20 4f 53 0a 2a 2a 20 6f 74  r on an OS.** ot
6510: 68 65 72 20 74 68 61 6e 20 6c 69 6e 75 78 2e 0a  her than linux..
6520: 2a 2f 0a 73 74 72 75 63 74 20 75 6e 69 78 4c 6f  */.struct unixLo
6530: 63 6b 4b 65 79 20 7b 0a 20 20 73 74 72 75 63 74  ckKey {.  struct
6540: 20 75 6e 69 78 46 69 6c 65 49 64 20 66 69 64 3b   unixFileId fid;
6550: 20 20 2f 2a 20 55 6e 69 71 75 65 20 69 64 65 6e    /* Unique iden
6560: 74 69 66 69 65 72 20 66 6f 72 20 74 68 65 20 66  tifier for the f
6570: 69 6c 65 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54  ile */.#if SQLIT
6580: 45 5f 54 48 52 45 41 44 53 41 46 45 20 26 26 20  E_THREADSAFE && 
6590: 64 65 66 69 6e 65 64 28 5f 5f 6c 69 6e 75 78 5f  defined(__linux_
65a0: 5f 29 0a 20 20 70 74 68 72 65 61 64 5f 74 20 74  _).  pthread_t t
65b0: 69 64 3b 20 20 2f 2a 20 54 68 72 65 61 64 20 49  id;  /* Thread I
65c0: 44 20 6f 66 20 6c 6f 63 6b 20 6f 77 6e 65 72 2e  D of lock owner.
65d0: 20 5a 65 72 6f 20 69 66 20 6e 6f 74 20 75 73 69   Zero if not usi
65e0: 6e 67 20 4c 69 6e 75 78 54 68 72 65 61 64 73 20  ng LinuxThreads 
65f0: 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a  */.#endif.};../*
6600: 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20  .** An instance 
6610: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
6620: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61 6c   structure is al
6630: 6c 6f 63 61 74 65 64 20 66 6f 72 20 65 61 63 68  located for each
6640: 20 6f 70 65 6e 0a 2a 2a 20 69 6e 6f 64 65 2e 20   open.** inode. 
6650: 20 4f 72 2c 20 6f 6e 20 4c 69 6e 75 78 54 68 72   Or, on LinuxThr
6660: 65 61 64 73 2c 20 74 68 65 72 65 20 69 73 20 6f  eads, there is o
6670: 6e 65 20 6f 66 20 74 68 65 73 65 20 73 74 72 75  ne of these stru
6680: 63 74 75 72 65 73 20 66 6f 72 0a 2a 2a 20 65 61  ctures for.** ea
6690: 63 68 20 69 6e 6f 64 65 20 6f 70 65 6e 65 64 20  ch inode opened 
66a0: 62 79 20 65 61 63 68 20 74 68 72 65 61 64 2e 0a  by each thread..
66b0: 2a 2a 0a 2a 2a 20 41 20 73 69 6e 67 6c 65 20 69  **.** A single i
66c0: 6e 6f 64 65 20 63 61 6e 20 68 61 76 65 20 6d 75  node can have mu
66d0: 6c 74 69 70 6c 65 20 66 69 6c 65 20 64 65 73 63  ltiple file desc
66e0: 72 69 70 74 6f 72 73 2c 20 73 6f 20 65 61 63 68  riptors, so each
66f0: 20 75 6e 69 78 46 69 6c 65 0a 2a 2a 20 73 74 72   unixFile.** str
6700: 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 20  ucture contains 
6710: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20  a pointer to an 
6720: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73  instance of this
6730: 20 6f 62 6a 65 63 74 20 61 6e 64 20 74 68 69 73   object and this
6740: 0a 2a 2a 20 6f 62 6a 65 63 74 20 6b 65 65 70 73  .** object keeps
6750: 20 61 20 63 6f 75 6e 74 20 6f 66 20 74 68 65 20   a count of the 
6760: 6e 75 6d 62 65 72 20 6f 66 20 75 6e 69 78 46 69  number of unixFi
6770: 6c 65 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 69  le pointing to i
6780: 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 75 6e 69  t..*/.struct uni
6790: 78 4c 6f 63 6b 49 6e 66 6f 20 7b 0a 20 20 73 74  xLockInfo {.  st
67a0: 72 75 63 74 20 75 6e 69 78 4c 6f 63 6b 4b 65 79  ruct unixLockKey
67b0: 20 6c 6f 63 6b 4b 65 79 3b 20 20 20 20 20 2f 2a   lockKey;     /*
67c0: 20 54 68 65 20 6c 6f 6f 6b 75 70 20 6b 65 79 20   The lookup key 
67d0: 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 3b 20 20 20  */.  int cnt;   
67e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
67f0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
6800: 66 20 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 68  f SHARED locks h
6810: 65 6c 64 20 2a 2f 0a 20 20 69 6e 74 20 6c 6f 63  eld */.  int loc
6820: 6b 74 79 70 65 3b 20 20 20 20 20 20 20 20 20 20  ktype;          
6830: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20           /* One 
6840: 6f 66 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20  of SHARED_LOCK, 
6850: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 65 74  RESERVED_LOCK et
6860: 63 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66  c. */.  int nRef
6870: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
6880: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
6890: 72 20 6f 66 20 70 6f 69 6e 74 65 72 73 20 74 6f  r of pointers to
68a0: 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20   this structure 
68b0: 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  */.#if defined(S
68c0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
68d0: 4b 49 4e 47 5f 53 54 59 4c 45 29 0a 20 20 75 6e  KING_STYLE).  un
68e0: 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67  signed long long
68f0: 20 73 68 61 72 65 64 42 79 74 65 3b 20 20 2f 2a   sharedByte;  /*
6900: 20 66 6f 72 20 41 46 50 20 73 69 6d 75 6c 61 74   for AFP simulat
6910: 65 64 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 2a  ed shared lock *
6920: 2f 0a 23 65 6e 64 69 66 0a 20 20 73 74 72 75 63  /.#endif.  struc
6930: 74 20 75 6e 69 78 4c 6f 63 6b 49 6e 66 6f 20 2a  t unixLockInfo *
6940: 70 4e 65 78 74 3b 20 20 20 20 20 2f 2a 20 4c 69  pNext;     /* Li
6950: 73 74 20 6f 66 20 61 6c 6c 20 75 6e 69 78 4c 6f  st of all unixLo
6960: 63 6b 49 6e 66 6f 20 6f 62 6a 65 63 74 73 20 2a  ckInfo objects *
6970: 2f 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78 4c  /.  struct unixL
6980: 6f 63 6b 49 6e 66 6f 20 2a 70 50 72 65 76 3b 20  ockInfo *pPrev; 
6990: 20 20 20 20 2f 2a 20 20 20 20 2e 2e 2e 2e 20 64      /*    .... d
69a0: 6f 75 62 6c 79 20 6c 69 6e 6b 65 64 20 2a 2f 0a  oubly linked */.
69b0: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73  };../*.** An ins
69c0: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
69d0: 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
69e0: 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f   is allocated fo
69f0: 72 20 65 61 63 68 20 6f 70 65 6e 0a 2a 2a 20 69  r each open.** i
6a00: 6e 6f 64 65 2e 20 20 54 68 69 73 20 73 74 72 75  node.  This stru
6a10: 63 74 75 72 65 20 6b 65 65 70 73 20 74 72 61 63  cture keeps trac
6a20: 6b 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20  k of the number 
6a30: 6f 66 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 61 74  of locks on that
6a40: 0a 2a 2a 20 69 6e 6f 64 65 2e 20 20 49 66 20 61  .** inode.  If a
6a50: 20 63 6c 6f 73 65 20 69 73 20 61 74 74 65 6d 70   close is attemp
6a60: 74 65 64 20 61 67 61 69 6e 73 74 20 61 6e 20 69  ted against an i
6a70: 6e 6f 64 65 20 74 68 61 74 20 69 73 20 68 6f 6c  node that is hol
6a80: 64 69 6e 67 0a 2a 2a 20 6c 6f 63 6b 73 2c 20 74  ding.** locks, t
6a90: 68 65 20 63 6c 6f 73 65 20 69 73 20 64 65 66 65  he close is defe
6aa0: 72 72 65 64 20 75 6e 74 69 6c 20 61 6c 6c 20 6c  rred until all l
6ab0: 6f 63 6b 73 20 63 6c 65 61 72 20 62 79 20 61 64  ocks clear by ad
6ac0: 64 69 6e 67 20 74 68 65 0a 2a 2a 20 66 69 6c 65  ding the.** file
6ad0: 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 62   descriptor to b
6ae0: 65 20 63 6c 6f 73 65 64 20 74 6f 20 74 68 65 20  e closed to the 
6af0: 70 65 6e 64 69 6e 67 20 6c 69 73 74 2e 0a 2a 2a  pending list..**
6b00: 0a 2a 2a 20 54 4f 44 4f 3a 20 20 43 6f 6e 73 69  .** TODO:  Consi
6b10: 64 65 72 20 63 68 61 6e 67 69 6e 67 20 74 68 69  der changing thi
6b20: 73 20 73 6f 20 74 68 61 74 20 74 68 65 72 65 20  s so that there 
6b30: 69 73 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65  is only a single
6b40: 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63 72 69 70   file.** descrip
6b50: 74 6f 72 20 66 6f 72 20 65 61 63 68 20 6f 70 65  tor for each ope
6b60: 6e 20 66 69 6c 65 2c 20 65 76 65 6e 20 77 68 65  n file, even whe
6b70: 6e 20 69 74 20 69 73 20 6f 70 65 6e 65 64 20 6d  n it is opened m
6b80: 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 2e 0a 2a  ultiple times..*
6b90: 2a 20 54 68 65 20 63 6c 6f 73 65 28 29 20 73 79  * The close() sy
6ba0: 73 74 65 6d 20 63 61 6c 6c 20 77 6f 75 6c 64 20  stem call would 
6bb0: 6f 6e 6c 79 20 6f 63 63 75 72 20 77 68 65 6e 20  only occur when 
6bc0: 74 68 65 20 6c 61 73 74 20 64 61 74 61 62 61 73  the last databas
6bd0: 65 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 66  e.** using the f
6be0: 69 6c 65 20 63 6c 6f 73 65 73 2e 0a 2a 2f 0a 73  ile closes..*/.s
6bf0: 74 72 75 63 74 20 75 6e 69 78 4f 70 65 6e 43 6e  truct unixOpenCn
6c00: 74 20 7b 0a 20 20 73 74 72 75 63 74 20 75 6e 69  t {.  struct uni
6c10: 78 46 69 6c 65 49 64 20 66 69 6c 65 49 64 3b 20  xFileId fileId; 
6c20: 20 20 2f 2a 20 54 68 65 20 6c 6f 6f 6b 75 70 20    /* The lookup 
6c30: 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65  key */.  int nRe
6c40: 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
6c50: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
6c60: 66 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 74 68  f pointers to th
6c70: 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  is structure */.
6c80: 20 20 69 6e 74 20 6e 4c 6f 63 6b 3b 20 20 20 20    int nLock;    
6c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6ca0: 20 4e 75 6d 62 65 72 20 6f 66 20 6f 75 74 73 74   Number of outst
6cb0: 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 20 2a 2f 0a  anding locks */.
6cc0: 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a    UnixUnusedFd *
6cd0: 70 55 6e 75 73 65 64 3b 20 20 20 20 20 20 2f 2a  pUnused;      /*
6ce0: 20 55 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73   Unused file des
6cf0: 63 72 69 70 74 6f 72 73 20 74 6f 20 63 6c 6f 73  criptors to clos
6d00: 65 20 2a 2f 0a 23 69 66 20 4f 53 5f 56 58 57 4f  e */.#if OS_VXWO
6d10: 52 4b 53 0a 20 20 73 65 6d 5f 74 20 2a 70 53 65  RKS.  sem_t *pSe
6d20: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
6d30: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 64 20         /* Named 
6d40: 50 4f 53 49 58 20 73 65 6d 61 70 68 6f 72 65 20  POSIX semaphore 
6d50: 2a 2f 0a 20 20 63 68 61 72 20 61 53 65 6d 4e 61  */.  char aSemNa
6d60: 6d 65 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b  me[MAX_PATHNAME+
6d70: 32 5d 3b 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  2];   /* Name of
6d80: 20 74 68 61 74 20 73 65 6d 61 70 68 6f 72 65 20   that semaphore 
6d90: 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 73 74 72 75  */.#endif.  stru
6da0: 63 74 20 75 6e 69 78 4f 70 65 6e 43 6e 74 20 2a  ct unixOpenCnt *
6db0: 70 4e 65 78 74 2c 20 2a 70 50 72 65 76 3b 20 20  pNext, *pPrev;  
6dc0: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61 6c 6c 20   /* List of all 
6dd0: 75 6e 69 78 4f 70 65 6e 43 6e 74 20 6f 62 6a 65  unixOpenCnt obje
6de0: 63 74 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  cts */.};../*.**
6df0: 20 4c 69 73 74 73 20 6f 66 20 61 6c 6c 20 75 6e   Lists of all un
6e00: 69 78 4c 6f 63 6b 49 6e 66 6f 20 61 6e 64 20 75  ixLockInfo and u
6e10: 6e 69 78 4f 70 65 6e 43 6e 74 20 6f 62 6a 65 63  nixOpenCnt objec
6e20: 74 73 2e 20 20 54 68 65 73 65 20 75 73 65 64 20  ts.  These used 
6e30: 74 6f 20 62 65 20 68 61 73 68 0a 2a 2a 20 74 61  to be hash.** ta
6e40: 62 6c 65 73 2e 20 20 42 75 74 20 74 68 65 20 6e  bles.  But the n
6e50: 75 6d 62 65 72 20 6f 66 20 6f 62 6a 65 63 74 73  umber of objects
6e60: 20 69 73 20 72 61 72 65 6c 79 20 6d 6f 72 65 20   is rarely more 
6e70: 74 68 61 6e 20 61 20 64 6f 7a 65 6e 20 61 6e 64  than a dozen and
6e80: 0a 2a 2a 20 6e 65 76 65 72 20 65 78 63 65 65 64  .** never exceed
6e90: 73 20 61 20 66 65 77 20 74 68 6f 75 73 61 6e 64  s a few thousand
6ea0: 2e 20 20 41 6e 64 20 6c 6f 6f 6b 75 70 20 69 73  .  And lookup is
6eb0: 20 6e 6f 74 20 6f 6e 20 61 20 63 72 69 74 69 63   not on a critic
6ec0: 61 6c 0a 2a 2a 20 70 61 74 68 20 73 6f 20 61 20  al.** path so a 
6ed0: 73 69 6d 70 6c 65 20 6c 69 6e 6b 65 64 20 6c 69  simple linked li
6ee0: 73 74 20 77 69 6c 6c 20 73 75 66 66 69 63 65 2e  st will suffice.
6ef0: 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63  .*/.static struc
6f00: 74 20 75 6e 69 78 4c 6f 63 6b 49 6e 66 6f 20 2a  t unixLockInfo *
6f10: 6c 6f 63 6b 4c 69 73 74 20 3d 20 30 3b 0a 73 74  lockList = 0;.st
6f20: 61 74 69 63 20 73 74 72 75 63 74 20 75 6e 69 78  atic struct unix
6f30: 4f 70 65 6e 43 6e 74 20 2a 6f 70 65 6e 4c 69 73  OpenCnt *openLis
6f40: 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68  t = 0;../*.** Th
6f50: 69 73 20 76 61 72 69 61 62 6c 65 20 72 65 6d 65  is variable reme
6f60: 6d 62 65 72 73 20 77 68 65 74 68 65 72 20 6f 72  mbers whether or
6f70: 20 6e 6f 74 20 74 68 72 65 61 64 73 20 63 61 6e   not threads can
6f80: 20 6f 76 65 72 72 69 64 65 20 65 61 63 68 20 6f   override each o
6f90: 74 68 65 72 73 0a 2a 2a 20 6c 6f 63 6b 73 2e 0a  thers.** locks..
6fa0: 2a 2a 0a 2a 2a 20 20 20 20 30 3a 20 20 4e 6f 2e  **.**    0:  No.
6fb0: 20 20 54 68 72 65 61 64 73 20 63 61 6e 6e 6f 74    Threads cannot
6fc0: 20 6f 76 65 72 72 69 64 65 20 65 61 63 68 20 6f   override each o
6fd0: 74 68 65 72 73 20 6c 6f 63 6b 73 2e 20 20 28 4c  thers locks.  (L
6fe0: 69 6e 75 78 54 68 72 65 61 64 73 29 0a 2a 2a 20  inuxThreads).** 
6ff0: 20 20 20 31 3a 20 20 59 65 73 2e 20 20 54 68 72     1:  Yes.  Thr
7000: 65 61 64 73 20 63 61 6e 20 6f 76 65 72 72 69 64  eads can overrid
7010: 65 20 65 61 63 68 20 6f 74 68 65 72 73 20 6c 6f  e each others lo
7020: 63 6b 73 2e 20 20 28 50 6f 73 69 78 20 26 20 4e  cks.  (Posix & N
7030: 4c 50 54 29 0a 2a 2a 20 20 20 2d 31 3a 20 20 57  LPT).**   -1:  W
7040: 65 20 64 6f 6e 27 74 20 6b 6e 6f 77 20 79 65 74  e don't know yet
7050: 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 6f 6d 65 20  ..**.** On some 
7060: 73 79 73 74 65 6d 73 2c 20 77 65 20 6b 6e 6f 77  systems, we know
7070: 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65   at compile-time
7080: 20 69 66 20 74 68 72 65 61 64 73 20 63 61 6e 20   if threads can 
7090: 6f 76 65 72 72 69 64 65 20 65 61 63 68 0a 2a 2a  override each.**
70a0: 20 6f 74 68 65 72 73 20 6c 6f 63 6b 73 2e 20 20   others locks.  
70b0: 4f 6e 20 74 68 6f 73 65 20 73 79 73 74 65 6d 73  On those systems
70c0: 2c 20 74 68 65 20 53 51 4c 49 54 45 5f 54 48 52  , the SQLITE_THR
70d0: 45 41 44 5f 4f 56 45 52 52 49 44 45 5f 4c 4f 43  EAD_OVERRIDE_LOC
70e0: 4b 20 6d 61 63 72 6f 0a 2a 2a 20 77 69 6c 6c 20  K macro.** will 
70f0: 62 65 20 73 65 74 20 61 70 70 72 6f 70 72 69 61  be set appropria
7100: 74 65 6c 79 2e 20 20 4f 6e 20 6f 74 68 65 72 20  tely.  On other 
7110: 73 79 73 74 65 6d 73 2c 20 77 65 20 68 61 76 65  systems, we have
7120: 20 74 6f 20 63 68 65 63 6b 20 61 74 0a 2a 2a 20   to check at.** 
7130: 72 75 6e 74 69 6d 65 2e 20 20 4f 6e 20 74 68 65  runtime.  On the
7140: 73 65 20 6c 61 74 74 65 72 20 73 79 73 74 65 6d  se latter system
7150: 73 2c 20 53 51 4c 54 49 45 5f 54 48 52 45 41 44  s, SQLTIE_THREAD
7160: 5f 4f 56 45 52 52 49 44 45 5f 4c 4f 43 4b 20 69  _OVERRIDE_LOCK i
7170: 73 0a 2a 2a 20 75 6e 64 65 66 69 6e 65 64 2e 0a  s.** undefined..
7180: 2a 2a 0a 2a 2a 20 54 68 69 73 20 76 61 72 69 61  **.** This varia
7190: 62 6c 65 20 6e 6f 72 6d 61 6c 6c 79 20 68 61 73  ble normally has
71a0: 20 66 69 6c 65 20 73 63 6f 70 65 20 6f 6e 6c 79   file scope only
71b0: 2e 20 20 42 75 74 20 64 75 72 69 6e 67 20 74 65  .  But during te
71c0: 73 74 69 6e 67 2c 20 77 65 20 6d 61 6b 65 0a 2a  sting, we make.*
71d0: 2a 20 69 74 20 61 20 67 6c 6f 62 61 6c 20 73 6f  * it a global so
71e0: 20 74 68 61 74 20 74 68 65 20 74 65 73 74 20 63   that the test c
71f0: 6f 64 65 20 63 61 6e 20 63 68 61 6e 67 65 20 69  ode can change i
7200: 74 73 20 76 61 6c 75 65 20 69 6e 20 6f 72 64 65  ts value in orde
7210: 72 20 74 6f 20 76 65 72 69 66 79 0a 2a 2a 20 74  r to verify.** t
7220: 68 61 74 20 74 68 65 20 72 69 67 68 74 20 73 74  hat the right st
7230: 75 66 66 20 68 61 70 70 65 6e 73 20 69 6e 20 65  uff happens in e
7240: 69 74 68 65 72 20 63 61 73 65 2e 0a 2a 2f 0a 23  ither case..*/.#
7250: 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44  if SQLITE_THREAD
7260: 53 41 46 45 20 26 26 20 64 65 66 69 6e 65 64 28  SAFE && defined(
7270: 5f 5f 6c 69 6e 75 78 5f 5f 29 0a 23 20 20 69 66  __linux__).#  if
7280: 6e 64 65 66 20 53 51 4c 49 54 45 5f 54 48 52 45  ndef SQLITE_THRE
7290: 41 44 5f 4f 56 45 52 52 49 44 45 5f 4c 4f 43 4b  AD_OVERRIDE_LOCK
72a0: 0a 23 20 20 20 20 64 65 66 69 6e 65 20 53 51 4c  .#    define SQL
72b0: 49 54 45 5f 54 48 52 45 41 44 5f 4f 56 45 52 52  ITE_THREAD_OVERR
72c0: 49 44 45 5f 4c 4f 43 4b 20 2d 31 0a 23 20 20 65  IDE_LOCK -1.#  e
72d0: 6e 64 69 66 0a 23 20 20 69 66 64 65 66 20 53 51  ndif.#  ifdef SQ
72e0: 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 74 68  LITE_TEST.int th
72f0: 72 65 61 64 73 4f 76 65 72 72 69 64 65 45 61 63  readsOverrideEac
7300: 68 4f 74 68 65 72 73 4c 6f 63 6b 73 20 3d 20 53  hOthersLocks = S
7310: 51 4c 49 54 45 5f 54 48 52 45 41 44 5f 4f 56 45  QLITE_THREAD_OVE
7320: 52 52 49 44 45 5f 4c 4f 43 4b 3b 0a 23 20 20 65  RRIDE_LOCK;.#  e
7330: 6c 73 65 0a 73 74 61 74 69 63 20 69 6e 74 20 74  lse.static int t
7340: 68 72 65 61 64 73 4f 76 65 72 72 69 64 65 45 61  hreadsOverrideEa
7350: 63 68 4f 74 68 65 72 73 4c 6f 63 6b 73 20 3d 20  chOthersLocks = 
7360: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 5f 4f 56  SQLITE_THREAD_OV
7370: 45 52 52 49 44 45 5f 4c 4f 43 4b 3b 0a 23 20 20  ERRIDE_LOCK;.#  
7380: 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 2f 2a  endif.#endif../*
7390: 0a 2a 2a 20 54 68 69 73 20 73 74 72 75 63 74 75  .** This structu
73a0: 72 65 20 68 6f 6c 64 73 20 69 6e 66 6f 72 6d 61  re holds informa
73b0: 74 69 6f 6e 20 70 61 73 73 65 64 20 69 6e 74 6f  tion passed into
73c0: 20 69 6e 64 69 76 69 64 75 61 6c 20 74 65 73 74   individual test
73d0: 0a 2a 2a 20 74 68 72 65 61 64 73 20 62 79 20 74  .** threads by t
73e0: 68 65 20 74 65 73 74 54 68 72 65 61 64 4c 6f 63  he testThreadLoc
73f0: 6b 69 6e 67 42 65 68 61 76 69 6f 72 28 29 20 72  kingBehavior() r
7400: 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 72 75 63  outine..*/.struc
7410: 74 20 74 68 72 65 61 64 54 65 73 74 44 61 74 61  t threadTestData
7420: 20 7b 0a 20 20 69 6e 74 20 66 64 3b 20 20 20 20   {.  int fd;    
7430: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
7440: 69 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64  ile to be locked
7450: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 66 6c 6f   */.  struct flo
7460: 63 6b 20 6c 6f 63 6b 3b 20 20 20 20 20 2f 2a 20  ck lock;     /* 
7470: 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6f 70 65 72  The locking oper
7480: 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72  ation */.  int r
7490: 65 73 75 6c 74 3b 20 20 20 20 20 20 20 20 20 20  esult;          
74a0: 20 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66 20 74    /* Result of t
74b0: 68 65 20 6c 6f 63 6b 69 6e 67 20 6f 70 65 72 61  he locking opera
74c0: 74 69 6f 6e 20 2a 2f 0a 7d 3b 0a 0a 23 69 66 20  tion */.};..#if 
74d0: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
74e0: 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 6c  E && defined(__l
74f0: 69 6e 75 78 5f 5f 29 0a 2f 2a 0a 2a 2a 20 54 68  inux__)./*.** Th
7500: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
7510: 73 65 64 20 61 73 20 74 68 65 20 6d 61 69 6e 20  sed as the main 
7520: 72 6f 75 74 69 6e 65 20 66 6f 72 20 61 20 74 68  routine for a th
7530: 72 65 61 64 20 6c 61 75 6e 63 68 65 64 20 62 79  read launched by
7540: 0a 2a 2a 20 74 65 73 74 54 68 72 65 61 64 4c 6f  .** testThreadLo
7550: 63 6b 69 6e 67 42 65 68 61 76 69 6f 72 28 29 2e  ckingBehavior().
7560: 20 49 74 20 74 65 73 74 73 20 77 68 65 74 68 65   It tests whethe
7570: 72 20 74 68 65 20 73 68 61 72 65 64 2d 6c 6f 63  r the shared-loc
7580: 6b 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 62 79  k obtained.** by
7590: 20 74 68 65 20 6d 61 69 6e 20 74 68 72 65 61 64   the main thread
75a0: 20 69 6e 20 74 65 73 74 54 68 72 65 61 64 4c 6f   in testThreadLo
75b0: 63 6b 69 6e 67 42 65 68 61 76 69 6f 72 28 29 20  ckingBehavior() 
75c0: 63 6f 6e 66 6c 69 63 74 73 20 77 69 74 68 20 61  conflicts with a
75d0: 0a 2a 2a 20 68 79 70 6f 74 68 65 74 69 63 61 6c  .** hypothetical
75e0: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 62 74 61   write-lock obta
75f0: 69 6e 65 64 20 62 79 20 74 68 69 73 20 74 68 72  ined by this thr
7600: 65 61 64 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  ead on the same 
7610: 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  file..**.** The 
7620: 77 72 69 74 65 2d 6c 6f 63 6b 20 69 73 20 6e 6f  write-lock is no
7630: 74 20 61 63 74 75 61 6c 6c 79 20 61 63 71 75 69  t actually acqui
7640: 72 65 64 2c 20 61 73 20 74 68 69 73 20 69 73 20  red, as this is 
7650: 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 69 66 20  not possible if 
7660: 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20 69 73 20  .** the file is 
7670: 6f 70 65 6e 20 69 6e 20 72 65 61 64 2d 6f 6e 6c  open in read-onl
7680: 79 20 6d 6f 64 65 20 28 73 65 65 20 74 69 63 6b  y mode (see tick
7690: 65 74 20 23 33 34 37 32 29 2e 0a 2a 2f 20 0a 73  et #3472)..*/ .s
76a0: 74 61 74 69 63 20 76 6f 69 64 20 2a 74 68 72 65  tatic void *thre
76b0: 61 64 4c 6f 63 6b 69 6e 67 54 65 73 74 28 76 6f  adLockingTest(vo
76c0: 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 73 74 72  id *pArg){.  str
76d0: 75 63 74 20 74 68 72 65 61 64 54 65 73 74 44 61  uct threadTestDa
76e0: 74 61 20 2a 70 44 61 74 61 20 3d 20 28 73 74 72  ta *pData = (str
76f0: 75 63 74 20 74 68 72 65 61 64 54 65 73 74 44 61  uct threadTestDa
7700: 74 61 2a 29 70 41 72 67 3b 0a 20 20 70 44 61 74  ta*)pArg;.  pDat
7710: 61 2d 3e 72 65 73 75 6c 74 20 3d 20 66 63 6e 74  a->result = fcnt
7720: 6c 28 70 44 61 74 61 2d 3e 66 64 2c 20 46 5f 47  l(pData->fd, F_G
7730: 45 54 4c 4b 2c 20 26 70 44 61 74 61 2d 3e 6c 6f  ETLK, &pData->lo
7740: 63 6b 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 41  ck);.  return pA
7750: 72 67 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  rg;.}.#endif /* 
7760: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
7770: 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 6c  E && defined(__l
7780: 69 6e 75 78 5f 5f 29 20 2a 2f 0a 0a 0a 23 69 66  inux__) */...#if
7790: 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
77a0: 46 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f  FE && defined(__
77b0: 6c 69 6e 75 78 5f 5f 29 0a 2f 2a 0a 2a 2a 20 54  linux__)./*.** T
77c0: 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 61 74  his procedure at
77d0: 74 65 6d 70 74 73 20 74 6f 20 64 65 74 65 72 6d  tempts to determ
77e0: 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e  ine whether or n
77f0: 6f 74 20 74 68 72 65 61 64 73 0a 2a 2a 20 63 61  ot threads.** ca
7800: 6e 20 6f 76 65 72 72 69 64 65 20 65 61 63 68 20  n override each 
7810: 6f 74 68 65 72 73 20 6c 6f 63 6b 73 20 74 68 65  others locks the
7820: 6e 20 73 65 74 73 20 74 68 65 20 0a 2a 2a 20 74  n sets the .** t
7830: 68 72 65 61 64 73 4f 76 65 72 72 69 64 65 45 61  hreadsOverrideEa
7840: 63 68 4f 74 68 65 72 73 4c 6f 63 6b 73 20 76 61  chOthersLocks va
7850: 72 69 61 62 6c 65 20 61 70 70 72 6f 70 72 69 61  riable appropria
7860: 74 65 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tely..*/.static 
7870: 76 6f 69 64 20 74 65 73 74 54 68 72 65 61 64 4c  void testThreadL
7880: 6f 63 6b 69 6e 67 42 65 68 61 76 69 6f 72 28 69  ockingBehavior(i
7890: 6e 74 20 66 64 5f 6f 72 69 67 29 7b 0a 20 20 69  nt fd_orig){.  i
78a0: 6e 74 20 66 64 3b 0a 20 20 69 6e 74 20 72 63 3b  nt fd;.  int rc;
78b0: 0a 20 20 73 74 72 75 63 74 20 74 68 72 65 61 64  .  struct thread
78c0: 54 65 73 74 44 61 74 61 20 64 3b 0a 20 20 73 74  TestData d;.  st
78d0: 72 75 63 74 20 66 6c 6f 63 6b 20 6c 3b 0a 20 20  ruct flock l;.  
78e0: 70 74 68 72 65 61 64 5f 74 20 74 3b 0a 0a 20 20  pthread_t t;..  
78f0: 66 64 20 3d 20 64 75 70 28 66 64 5f 6f 72 69 67  fd = dup(fd_orig
7900: 29 3b 0a 20 20 69 66 28 20 66 64 3c 30 20 29 20  );.  if( fd<0 ) 
7910: 72 65 74 75 72 6e 3b 0a 20 20 6d 65 6d 73 65 74  return;.  memset
7920: 28 26 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6c  (&l, 0, sizeof(l
7930: 29 29 3b 0a 20 20 6c 2e 6c 5f 74 79 70 65 20 3d  ));.  l.l_type =
7940: 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 6c 2e 6c 5f   F_RDLCK;.  l.l_
7950: 6c 65 6e 20 3d 20 31 3b 0a 20 20 6c 2e 6c 5f 73  len = 1;.  l.l_s
7960: 74 61 72 74 20 3d 20 30 3b 0a 20 20 6c 2e 6c 5f  tart = 0;.  l.l_
7970: 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45  whence = SEEK_SE
7980: 54 3b 0a 20 20 72 63 20 3d 20 66 63 6e 74 6c 28  T;.  rc = fcntl(
7990: 66 64 5f 6f 72 69 67 2c 20 46 5f 53 45 54 4c 4b  fd_orig, F_SETLK
79a0: 2c 20 26 6c 29 3b 0a 20 20 69 66 28 20 72 63 21  , &l);.  if( rc!
79b0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 6d  =0 ) return;.  m
79c0: 65 6d 73 65 74 28 26 64 2c 20 30 2c 20 73 69 7a  emset(&d, 0, siz
79d0: 65 6f 66 28 64 29 29 3b 0a 20 20 64 2e 66 64 20  eof(d));.  d.fd 
79e0: 3d 20 66 64 3b 0a 20 20 64 2e 6c 6f 63 6b 20 3d  = fd;.  d.lock =
79f0: 20 6c 3b 0a 20 20 64 2e 6c 6f 63 6b 2e 6c 5f 74   l;.  d.lock.l_t
7a00: 79 70 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20  ype = F_WRLCK;. 
7a10: 20 69 66 28 20 70 74 68 72 65 61 64 5f 63 72 65   if( pthread_cre
7a20: 61 74 65 28 26 74 2c 20 30 2c 20 74 68 72 65 61  ate(&t, 0, threa
7a30: 64 4c 6f 63 6b 69 6e 67 54 65 73 74 2c 20 26 64  dLockingTest, &d
7a40: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 74 68 72  )==0 ){.    pthr
7a50: 65 61 64 5f 6a 6f 69 6e 28 74 2c 20 30 29 3b 0a  ead_join(t, 0);.
7a60: 20 20 7d 0a 20 20 63 6c 6f 73 65 28 66 64 29 3b    }.  close(fd);
7a70: 0a 20 20 69 66 28 20 64 2e 72 65 73 75 6c 74 21  .  if( d.result!
7a80: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 74  =0 ) return;.  t
7a90: 68 72 65 61 64 73 4f 76 65 72 72 69 64 65 45 61  hreadsOverrideEa
7aa0: 63 68 4f 74 68 65 72 73 4c 6f 63 6b 73 20 3d 20  chOthersLocks = 
7ab0: 28 64 2e 6c 6f 63 6b 2e 6c 5f 74 79 70 65 3d 3d  (d.lock.l_type==
7ac0: 46 5f 55 4e 4c 43 4b 29 3b 0a 7d 0a 23 65 6e 64  F_UNLCK);.}.#end
7ad0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 54 48 52  if /* SQLITE_THR
7ae0: 45 41 44 53 41 46 45 20 26 26 20 64 65 66 69 6e  EADSAFE && defin
7af0: 65 64 28 5f 5f 6c 69 6e 75 78 5f 5f 29 20 2a 2f  ed(__linux__) */
7b00: 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20  ../*.** Release 
7b10: 61 20 75 6e 69 78 4c 6f 63 6b 49 6e 66 6f 20 73  a unixLockInfo s
7b20: 74 72 75 63 74 75 72 65 20 70 72 65 76 69 6f 75  tructure previou
7b30: 73 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 62 79  sly allocated by
7b40: 20 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28 29 2e   findLockInfo().
7b50: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 75 74 65 78  .**.** The mutex
7b60: 20 65 6e 74 65 72 65 64 20 75 73 69 6e 67 20 74   entered using t
7b70: 68 65 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  he unixEnterMute
7b80: 78 28 29 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73  x() function mus
7b90: 74 20 62 65 20 68 65 6c 64 0a 2a 2a 20 77 68 65  t be held.** whe
7ba0: 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
7bb0: 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74  is called..*/.st
7bc0: 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73  atic void releas
7bd0: 65 4c 6f 63 6b 49 6e 66 6f 28 73 74 72 75 63 74  eLockInfo(struct
7be0: 20 75 6e 69 78 4c 6f 63 6b 49 6e 66 6f 20 2a 70   unixLockInfo *p
7bf0: 4c 6f 63 6b 29 7b 0a 20 20 61 73 73 65 72 74 28  Lock){.  assert(
7c00: 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29   unixMutexHeld()
7c10: 20 29 3b 0a 20 20 69 66 28 20 70 4c 6f 63 6b 20   );.  if( pLock 
7c20: 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 6e 52  ){.    pLock->nR
7c30: 65 66 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 4c  ef--;.    if( pL
7c40: 6f 63 6b 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a  ock->nRef==0 ){.
7c50: 20 20 20 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d        if( pLock-
7c60: 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20 20 20  >pPrev ){.      
7c70: 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d    assert( pLock-
7c80: 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 3d 3d 70  >pPrev->pNext==p
7c90: 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 20 20 20 20  Lock );.        
7ca0: 70 4c 6f 63 6b 2d 3e 70 50 72 65 76 2d 3e 70 4e  pLock->pPrev->pN
7cb0: 65 78 74 20 3d 20 70 4c 6f 63 6b 2d 3e 70 4e 65  ext = pLock->pNe
7cc0: 78 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  xt;.      }else{
7cd0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
7ce0: 20 6c 6f 63 6b 4c 69 73 74 3d 3d 70 4c 6f 63 6b   lockList==pLock
7cf0: 20 29 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b   );.        lock
7d00: 4c 69 73 74 20 3d 20 70 4c 6f 63 6b 2d 3e 70 4e  List = pLock->pN
7d10: 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ext;.      }.   
7d20: 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 70 4e     if( pLock->pN
7d30: 65 78 74 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ext ){.        a
7d40: 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 70 4e  ssert( pLock->pN
7d50: 65 78 74 2d 3e 70 50 72 65 76 3d 3d 70 4c 6f 63  ext->pPrev==pLoc
7d60: 6b 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 6f  k );.        pLo
7d70: 63 6b 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76  ck->pNext->pPrev
7d80: 20 3d 20 70 4c 6f 63 6b 2d 3e 70 50 72 65 76 3b   = pLock->pPrev;
7d90: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
7da0: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4c 6f 63  qlite3_free(pLoc
7db0: 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  k);.    }.  }.}.
7dc0: 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61  ./*.** Release a
7dd0: 20 75 6e 69 78 4f 70 65 6e 43 6e 74 20 73 74 72   unixOpenCnt str
7de0: 75 63 74 75 72 65 20 70 72 65 76 69 6f 75 73 6c  ucture previousl
7df0: 79 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 66  y allocated by f
7e00: 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28 29 2e 0a 2a  indLockInfo()..*
7e10: 2a 0a 2a 2a 20 54 68 65 20 6d 75 74 65 78 20 65  *.** The mutex e
7e20: 6e 74 65 72 65 64 20 75 73 69 6e 67 20 74 68 65  ntered using the
7e30: 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
7e40: 29 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20  ) function must 
7e50: 62 65 20 68 65 6c 64 0a 2a 2a 20 77 68 65 6e 20  be held.** when 
7e60: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
7e70: 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74   called..*/.stat
7e80: 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 4f  ic void releaseO
7e90: 70 65 6e 43 6e 74 28 73 74 72 75 63 74 20 75 6e  penCnt(struct un
7ea0: 69 78 4f 70 65 6e 43 6e 74 20 2a 70 4f 70 65 6e  ixOpenCnt *pOpen
7eb0: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 75 6e 69  ){.  assert( uni
7ec0: 78 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a  xMutexHeld() );.
7ed0: 20 20 69 66 28 20 70 4f 70 65 6e 20 29 7b 0a 20    if( pOpen ){. 
7ee0: 20 20 20 70 4f 70 65 6e 2d 3e 6e 52 65 66 2d 2d     pOpen->nRef--
7ef0: 3b 0a 20 20 20 20 69 66 28 20 70 4f 70 65 6e 2d  ;.    if( pOpen-
7f00: 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20  >nRef==0 ){.    
7f10: 20 20 69 66 28 20 70 4f 70 65 6e 2d 3e 70 50 72    if( pOpen->pPr
7f20: 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  ev ){.        as
7f30: 73 65 72 74 28 20 70 4f 70 65 6e 2d 3e 70 50 72  sert( pOpen->pPr
7f40: 65 76 2d 3e 70 4e 65 78 74 3d 3d 70 4f 70 65 6e  ev->pNext==pOpen
7f50: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 65   );.        pOpe
7f60: 6e 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20  n->pPrev->pNext 
7f70: 3d 20 70 4f 70 65 6e 2d 3e 70 4e 65 78 74 3b 0a  = pOpen->pNext;.
7f80: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
7f90: 20 20 20 20 20 61 73 73 65 72 74 28 20 6f 70 65       assert( ope
7fa0: 6e 4c 69 73 74 3d 3d 70 4f 70 65 6e 20 29 3b 0a  nList==pOpen );.
7fb0: 20 20 20 20 20 20 20 20 6f 70 65 6e 4c 69 73 74          openList
7fc0: 20 3d 20 70 4f 70 65 6e 2d 3e 70 4e 65 78 74 3b   = pOpen->pNext;
7fd0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
7fe0: 66 28 20 70 4f 70 65 6e 2d 3e 70 4e 65 78 74 20  f( pOpen->pNext 
7ff0: 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
8000: 74 28 20 70 4f 70 65 6e 2d 3e 70 4e 65 78 74 2d  t( pOpen->pNext-
8010: 3e 70 50 72 65 76 3d 3d 70 4f 70 65 6e 20 29 3b  >pPrev==pOpen );
8020: 0a 20 20 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e  .        pOpen->
8030: 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70  pNext->pPrev = p
8040: 4f 70 65 6e 2d 3e 70 50 72 65 76 3b 0a 20 20 20  Open->pPrev;.   
8050: 20 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f     }.#if SQLITE_
8060: 54 48 52 45 41 44 53 41 46 45 20 26 26 20 64 65  THREADSAFE && de
8070: 66 69 6e 65 64 28 5f 5f 6c 69 6e 75 78 5f 5f 29  fined(__linux__)
8080: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
8090: 70 4f 70 65 6e 2d 3e 70 55 6e 75 73 65 64 20 7c  pOpen->pUnused |
80a0: 7c 20 74 68 72 65 61 64 73 4f 76 65 72 72 69 64  | threadsOverrid
80b0: 65 45 61 63 68 4f 74 68 65 72 73 4c 6f 63 6b 73  eEachOthersLocks
80c0: 3d 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  ==0 );.#endif.. 
80d0: 20 20 20 20 20 2f 2a 20 49 66 20 70 4f 70 65 6e       /* If pOpen
80e0: 2d 3e 70 55 6e 75 73 65 64 20 69 73 20 6e 6f 74  ->pUnused is not
80f0: 20 6e 75 6c 6c 2c 20 74 68 65 6e 20 6d 65 6d 6f   null, then memo
8100: 72 79 20 61 6e 64 20 66 69 6c 65 2d 64 65 73 63  ry and file-desc
8110: 72 69 70 74 6f 72 73 0a 20 20 20 20 20 20 2a 2a  riptors.      **
8120: 20 61 72 65 20 6c 65 61 6b 65 64 2e 0a 20 20 20   are leaked..   
8130: 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54     **.      ** T
8140: 68 69 73 20 77 69 6c 6c 20 6f 6e 6c 79 20 68 61  his will only ha
8150: 70 70 65 6e 20 69 66 2c 20 75 6e 64 65 72 20 4c  ppen if, under L
8160: 69 6e 75 78 74 68 72 65 61 64 73 2c 20 74 68 65  inuxthreads, the
8170: 20 75 73 65 72 20 68 61 73 20 6f 70 65 6e 65 64   user has opened
8180: 0a 20 20 20 20 20 20 2a 2a 20 61 20 74 72 61 6e  .      ** a tran
8190: 73 61 63 74 69 6f 6e 20 69 6e 20 6f 6e 65 20 74  saction in one t
81a0: 68 72 65 61 64 2c 20 74 68 65 6e 20 61 74 74 65  hread, then atte
81b0: 6d 70 74 73 20 74 6f 20 63 6c 6f 73 65 20 74 68  mpts to close th
81c0: 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 20  e database.     
81d0: 20 2a 2a 20 68 61 6e 64 6c 65 20 66 72 6f 6d 20   ** handle from 
81e0: 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64 20 28  another thread (
81f0: 77 69 74 68 6f 75 74 20 66 69 72 73 74 20 75 6e  without first un
8200: 6c 6f 63 6b 69 6e 67 20 74 68 65 20 64 62 20 66  locking the db f
8210: 69 6c 65 29 2e 0a 20 20 20 20 20 20 2a 2a 20 54  ile)..      ** T
8220: 68 69 73 20 69 73 20 61 20 6d 69 73 75 73 65 2e  his is a misuse.
8230: 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
8240: 65 33 5f 66 72 65 65 28 70 4f 70 65 6e 29 3b 0a  e3_free(pOpen);.
8250: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
8260: 2a 2a 20 47 69 76 65 6e 20 61 20 66 69 6c 65 20  ** Given a file 
8270: 64 65 73 63 72 69 70 74 6f 72 2c 20 6c 6f 63 61  descriptor, loca
8280: 74 65 20 75 6e 69 78 4c 6f 63 6b 49 6e 66 6f 20  te unixLockInfo 
8290: 61 6e 64 20 75 6e 69 78 4f 70 65 6e 43 6e 74 20  and unixOpenCnt 
82a0: 73 74 72 75 63 74 75 72 65 73 20 74 68 61 74 0a  structures that.
82b0: 2a 2a 20 64 65 73 63 72 69 62 65 73 20 74 68 61  ** describes tha
82c0: 74 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  t file descripto
82d0: 72 2e 20 20 43 72 65 61 74 65 20 6e 65 77 20 6f  r.  Create new o
82e0: 6e 65 73 20 69 66 20 6e 65 63 65 73 73 61 72 79  nes if necessary
82f0: 2e 20 20 54 68 65 0a 2a 2a 20 72 65 74 75 72 6e  .  The.** return
8300: 20 76 61 6c 75 65 73 20 6d 69 67 68 74 20 62 65   values might be
8310: 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 69   uninitialized i
8320: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
8330: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 75 74  s..**.** The mut
8340: 65 78 20 65 6e 74 65 72 65 64 20 75 73 69 6e 67  ex entered using
8350: 20 74 68 65 20 75 6e 69 78 45 6e 74 65 72 4d 75   the unixEnterMu
8360: 74 65 78 28 29 20 66 75 6e 63 74 69 6f 6e 20 6d  tex() function m
8370: 75 73 74 20 62 65 20 68 65 6c 64 0a 2a 2a 20 77  ust be held.** w
8380: 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
8390: 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a  n is called..**.
83a0: 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 61 70 70  ** Return an app
83b0: 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 63  ropriate error c
83c0: 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ode..*/.static i
83d0: 6e 74 20 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28  nt findLockInfo(
83e0: 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
83f0: 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  le,             
8400: 20 20 2f 2a 20 55 6e 69 78 20 66 69 6c 65 20 77    /* Unix file w
8410: 69 74 68 20 66 69 6c 65 20 64 65 73 63 20 75 73  ith file desc us
8420: 65 64 20 69 6e 20 74 68 65 20 6b 65 79 20 2a 2f  ed in the key */
8430: 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78 4c 6f  .  struct unixLo
8440: 63 6b 49 6e 66 6f 20 2a 2a 70 70 4c 6f 63 6b 2c  ckInfo **ppLock,
8450: 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20    /* Return the 
8460: 75 6e 69 78 4c 6f 63 6b 49 6e 66 6f 20 73 74 72  unixLockInfo str
8470: 75 63 74 75 72 65 20 68 65 72 65 20 2a 2f 0a 20  ucture here */. 
8480: 20 73 74 72 75 63 74 20 75 6e 69 78 4f 70 65 6e   struct unixOpen
8490: 43 6e 74 20 2a 2a 70 70 4f 70 65 6e 20 20 20 20  Cnt **ppOpen    
84a0: 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 75 6e  /* Return the un
84b0: 69 78 4f 70 65 6e 43 6e 74 20 73 74 72 75 63 74  ixOpenCnt struct
84c0: 75 72 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  ure here */.){. 
84d0: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
84e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
84f0: 2f 2a 20 53 79 73 74 65 6d 20 63 61 6c 6c 20 72  /* System call r
8500: 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
8510: 69 6e 74 20 66 64 3b 20 20 20 20 20 20 20 20 20  int fd;         
8520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8530: 2a 20 54 68 65 20 66 69 6c 65 20 64 65 73 63 72  * The file descr
8540: 69 70 74 6f 72 20 66 6f 72 20 70 46 69 6c 65 20  iptor for pFile 
8550: 2a 2f 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78  */.  struct unix
8560: 4c 6f 63 6b 4b 65 79 20 6c 6f 63 6b 4b 65 79 3b  LockKey lockKey;
8570: 20 20 20 20 2f 2a 20 4c 6f 6f 6b 75 70 20 6b 65      /* Lookup ke
8580: 79 20 66 6f 72 20 74 68 65 20 75 6e 69 78 4c 6f  y for the unixLo
8590: 63 6b 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  ckInfo structure
85a0: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 75 6e 69   */.  struct uni
85b0: 78 46 69 6c 65 49 64 20 66 69 6c 65 49 64 3b 20  xFileId fileId; 
85c0: 20 20 20 20 20 2f 2a 20 4c 6f 6f 6b 75 70 20 6b       /* Lookup k
85d0: 65 79 20 66 6f 72 20 74 68 65 20 75 6e 69 78 4f  ey for the unixO
85e0: 70 65 6e 43 6e 74 20 73 74 72 75 63 74 20 2a 2f  penCnt struct */
85f0: 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73  .  struct stat s
8600: 74 61 74 62 75 66 3b 20 20 20 20 20 20 20 20 20  tatbuf;         
8610: 20 20 2f 2a 20 4c 6f 77 2d 6c 65 76 65 6c 20 66    /* Low-level f
8620: 69 6c 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ile information 
8630: 2a 2f 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78  */.  struct unix
8640: 4c 6f 63 6b 49 6e 66 6f 20 2a 70 4c 6f 63 6b 20  LockInfo *pLock 
8650: 3d 20 30 3b 2f 2a 20 43 61 6e 64 69 64 61 74 65  = 0;/* Candidate
8660: 20 75 6e 69 78 4c 6f 63 6b 49 6e 66 6f 20 6f 62   unixLockInfo ob
8670: 6a 65 63 74 20 2a 2f 0a 20 20 73 74 72 75 63 74  ject */.  struct
8680: 20 75 6e 69 78 4f 70 65 6e 43 6e 74 20 2a 70 4f   unixOpenCnt *pO
8690: 70 65 6e 3b 20 20 20 20 20 2f 2a 20 43 61 6e 64  pen;     /* Cand
86a0: 69 64 61 74 65 20 75 6e 69 78 4f 70 65 6e 43 6e  idate unixOpenCn
86b0: 74 20 6f 62 6a 65 63 74 20 2a 2f 0a 0a 20 20 61  t object */..  a
86c0: 73 73 65 72 74 28 20 75 6e 69 78 4d 75 74 65 78  ssert( unixMutex
86d0: 48 65 6c 64 28 29 20 29 3b 0a 0a 20 20 2f 2a 20  Held() );..  /* 
86e0: 47 65 74 20 6c 6f 77 2d 6c 65 76 65 6c 20 69 6e  Get low-level in
86f0: 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
8700: 74 68 65 20 66 69 6c 65 20 74 68 61 74 20 77 65  the file that we
8710: 20 63 61 6e 20 75 73 65 64 20 74 6f 0a 20 20 2a   can used to.  *
8720: 2a 20 63 72 65 61 74 65 20 61 20 75 6e 69 71 75  * create a uniqu
8730: 65 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 66  e name for the f
8740: 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 66 64 20 3d  ile..  */.  fd =
8750: 20 70 46 69 6c 65 2d 3e 68 3b 0a 20 20 72 63 20   pFile->h;.  rc 
8760: 3d 20 66 73 74 61 74 28 66 64 2c 20 26 73 74 61  = fstat(fd, &sta
8770: 74 62 75 66 29 3b 0a 20 20 69 66 28 20 72 63 21  tbuf);.  if( rc!
8780: 3d 30 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  =0 ){.    pFile-
8790: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72  >lastErrno = err
87a0: 6e 6f 3b 0a 23 69 66 64 65 66 20 45 4f 56 45 52  no;.#ifdef EOVER
87b0: 46 4c 4f 57 0a 20 20 20 20 69 66 28 20 70 46 69  FLOW.    if( pFi
87c0: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3d 3d 45  le->lastErrno==E
87d0: 4f 56 45 52 46 4c 4f 57 20 29 20 72 65 74 75 72  OVERFLOW ) retur
87e0: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 3b 0a  n SQLITE_NOLFS;.
87f0: 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72  #endif.    retur
8800: 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a  n SQLITE_IOERR;.
8810: 20 20 7d 0a 0a 23 69 66 64 65 66 20 5f 5f 41 50    }..#ifdef __AP
8820: 50 4c 45 5f 5f 0a 20 20 2f 2a 20 4f 6e 20 4f 53  PLE__.  /* On OS
8830: 20 58 20 6f 6e 20 61 6e 20 6d 73 64 6f 73 20 66   X on an msdos f
8840: 69 6c 65 73 79 73 74 65 6d 2c 20 74 68 65 20 69  ilesystem, the i
8850: 6e 6f 64 65 20 6e 75 6d 62 65 72 20 69 73 20 72  node number is r
8860: 65 70 6f 72 74 65 64 0a 20 20 2a 2a 20 69 6e 63  eported.  ** inc
8870: 6f 72 72 65 63 74 6c 79 20 66 6f 72 20 7a 65 72  orrectly for zer
8880: 6f 2d 73 69 7a 65 20 66 69 6c 65 73 2e 20 20 53  o-size files.  S
8890: 65 65 20 74 69 63 6b 65 74 20 23 33 32 36 30 2e  ee ticket #3260.
88a0: 20 20 54 6f 20 77 6f 72 6b 0a 20 20 2a 2a 20 61    To work.  ** a
88b0: 72 6f 75 6e 64 20 74 68 69 73 20 70 72 6f 62 6c  round this probl
88c0: 65 6d 20 28 77 65 20 63 6f 6e 73 69 64 65 72 20  em (we consider 
88d0: 69 74 20 61 20 62 75 67 20 69 6e 20 4f 53 20 58  it a bug in OS X
88e0: 2c 20 6e 6f 74 20 53 51 4c 69 74 65 29 0a 20 20  , not SQLite).  
88f0: 2a 2a 20 77 65 20 61 6c 77 61 79 73 20 69 6e 63  ** we always inc
8900: 72 65 61 73 65 20 74 68 65 20 66 69 6c 65 20 73  rease the file s
8910: 69 7a 65 20 74 6f 20 31 20 62 79 20 77 72 69 74  ize to 1 by writ
8920: 69 6e 67 20 61 20 73 69 6e 67 6c 65 20 62 79 74  ing a single byt
8930: 65 0a 20 20 2a 2a 20 70 72 69 6f 72 20 74 6f 20  e.  ** prior to 
8940: 61 63 63 65 73 73 69 6e 67 20 74 68 65 20 69 6e  accessing the in
8950: 6f 64 65 20 6e 75 6d 62 65 72 2e 20 20 54 68 65  ode number.  The
8960: 20 6f 6e 65 20 62 79 74 65 20 77 72 69 74 74 65   one byte writte
8970: 6e 20 69 73 0a 20 20 2a 2a 20 61 6e 20 41 53 43  n is.  ** an ASC
8980: 49 49 20 27 53 27 20 63 68 61 72 61 63 74 65 72  II 'S' character
8990: 20 77 68 69 63 68 20 61 6c 73 6f 20 68 61 70 70   which also happ
89a0: 65 6e 73 20 74 6f 20 62 65 20 74 68 65 20 66 69  ens to be the fi
89b0: 72 73 74 20 62 79 74 65 0a 20 20 2a 2a 20 69 6e  rst byte.  ** in
89c0: 20 74 68 65 20 68 65 61 64 65 72 20 6f 66 20 65   the header of e
89d0: 76 65 72 79 20 53 51 4c 69 74 65 20 64 61 74 61  very SQLite data
89e0: 62 61 73 65 2e 20 20 49 6e 20 74 68 69 73 20 77  base.  In this w
89f0: 61 79 2c 20 69 66 20 74 68 65 72 65 0a 20 20 2a  ay, if there.  *
8a00: 2a 20 69 73 20 61 20 72 61 63 65 20 63 6f 6e 64  * is a race cond
8a10: 69 74 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20  ition such that 
8a20: 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64 20 68  another thread h
8a30: 61 73 20 61 6c 72 65 61 64 79 20 70 6f 70 75 6c  as already popul
8a40: 61 74 65 64 0a 20 20 2a 2a 20 74 68 65 20 66 69  ated.  ** the fi
8a50: 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  rst page of the 
8a60: 64 61 74 61 62 61 73 65 2c 20 6e 6f 20 64 61 6d  database, no dam
8a70: 61 67 65 20 69 73 20 64 6f 6e 65 2e 0a 20 20 2a  age is done..  *
8a80: 2f 0a 20 20 69 66 20 28 28 20 73 74 61 74 62 75  /.  if (( statbu
8a90: 66 2e 73 74 5f 73 69 7a 65 3d 3d 30 20 29 20 26  f.st_size==0 ) &
8aa0: 26 20 28 30 20 21 3d 20 28 70 46 69 6c 65 2d 3e  & (0 != (pFile->
8ab0: 66 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  fsFlags & SQLITE
8ac0: 5f 46 53 46 4c 41 47 53 5f 49 53 5f 4d 53 44 4f  _FSFLAGS_IS_MSDO
8ad0: 53 29 29 29 20 7b 0a 20 20 20 20 20 20 72 63 20  S))) {.      rc 
8ae0: 3d 20 77 72 69 74 65 28 66 64 2c 20 22 53 22 2c  = write(fd, "S",
8af0: 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   1);.      if( r
8b00: 63 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  c!=1 ){.        
8b10: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
8b20: 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
8b30: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
8b40: 49 4f 45 52 52 3b 0a 20 20 20 20 20 20 7d 0a 20  IOERR;.      }. 
8b50: 20 20 20 20 20 72 63 20 3d 20 66 73 74 61 74 28       rc = fstat(
8b60: 66 64 2c 20 26 73 74 61 74 62 75 66 29 3b 0a 20  fd, &statbuf);. 
8b70: 20 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29       if( rc!=0 )
8b80: 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d  {.        pFile-
8b90: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72  >lastErrno = err
8ba0: 6e 6f 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  no;.        retu
8bb0: 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b  rn SQLITE_IOERR;
8bc0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
8bd0: 65 6e 64 69 66 0a 0a 20 20 6d 65 6d 73 65 74 28  endif..  memset(
8be0: 26 6c 6f 63 6b 4b 65 79 2c 20 30 2c 20 73 69 7a  &lockKey, 0, siz
8bf0: 65 6f 66 28 6c 6f 63 6b 4b 65 79 29 29 3b 0a 20  eof(lockKey));. 
8c00: 20 6c 6f 63 6b 4b 65 79 2e 66 69 64 2e 64 65 76   lockKey.fid.dev
8c10: 20 3d 20 73 74 61 74 62 75 66 2e 73 74 5f 64 65   = statbuf.st_de
8c20: 76 3b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b  v;.#if OS_VXWORK
8c30: 53 0a 20 20 6c 6f 63 6b 4b 65 79 2e 66 69 64 2e  S.  lockKey.fid.
8c40: 70 49 64 20 3d 20 70 46 69 6c 65 2d 3e 70 49 64  pId = pFile->pId
8c50: 3b 0a 23 65 6c 73 65 0a 20 20 6c 6f 63 6b 4b 65  ;.#else.  lockKe
8c60: 79 2e 66 69 64 2e 69 6e 6f 20 3d 20 73 74 61 74  y.fid.ino = stat
8c70: 62 75 66 2e 73 74 5f 69 6e 6f 3b 0a 23 65 6e 64  buf.st_ino;.#end
8c80: 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48  if.#if SQLITE_TH
8c90: 52 45 41 44 53 41 46 45 20 26 26 20 64 65 66 69  READSAFE && defi
8ca0: 6e 65 64 28 5f 5f 6c 69 6e 75 78 5f 5f 29 0a 20  ned(__linux__). 
8cb0: 20 69 66 28 20 74 68 72 65 61 64 73 4f 76 65 72   if( threadsOver
8cc0: 72 69 64 65 45 61 63 68 4f 74 68 65 72 73 4c 6f  rideEachOthersLo
8cd0: 63 6b 73 3c 30 20 29 7b 0a 20 20 20 20 74 65 73  cks<0 ){.    tes
8ce0: 74 54 68 72 65 61 64 4c 6f 63 6b 69 6e 67 42 65  tThreadLockingBe
8cf0: 68 61 76 69 6f 72 28 66 64 29 3b 0a 20 20 7d 0a  havior(fd);.  }.
8d00: 20 20 6c 6f 63 6b 4b 65 79 2e 74 69 64 20 3d 20    lockKey.tid = 
8d10: 74 68 72 65 61 64 73 4f 76 65 72 72 69 64 65 45  threadsOverrideE
8d20: 61 63 68 4f 74 68 65 72 73 4c 6f 63 6b 73 20 3f  achOthersLocks ?
8d30: 20 30 20 3a 20 70 74 68 72 65 61 64 5f 73 65 6c   0 : pthread_sel
8d40: 66 28 29 3b 0a 23 65 6e 64 69 66 0a 20 20 66 69  f();.#endif.  fi
8d50: 6c 65 49 64 20 3d 20 6c 6f 63 6b 4b 65 79 2e 66  leId = lockKey.f
8d60: 69 64 3b 0a 20 20 69 66 28 20 70 70 4c 6f 63 6b  id;.  if( ppLock
8d70: 21 3d 30 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b  !=0 ){.    pLock
8d80: 20 3d 20 6c 6f 63 6b 4c 69 73 74 3b 0a 20 20 20   = lockList;.   
8d90: 20 77 68 69 6c 65 28 20 70 4c 6f 63 6b 20 26 26   while( pLock &&
8da0: 20 6d 65 6d 63 6d 70 28 26 6c 6f 63 6b 4b 65 79   memcmp(&lockKey
8db0: 2c 20 26 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 4b 65  , &pLock->lockKe
8dc0: 79 2c 20 73 69 7a 65 6f 66 28 6c 6f 63 6b 4b 65  y, sizeof(lockKe
8dd0: 79 29 29 20 29 7b 0a 20 20 20 20 20 20 70 4c 6f  y)) ){.      pLo
8de0: 63 6b 20 3d 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78  ck = pLock->pNex
8df0: 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  t;.    }.    if(
8e00: 20 70 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20   pLock==0 ){.   
8e10: 20 20 20 70 4c 6f 63 6b 20 3d 20 73 71 6c 69 74     pLock = sqlit
8e20: 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  e3_malloc( sizeo
8e30: 66 28 2a 70 4c 6f 63 6b 29 20 29 3b 0a 20 20 20  f(*pLock) );.   
8e40: 20 20 20 69 66 28 20 70 4c 6f 63 6b 3d 3d 30 20     if( pLock==0 
8e50: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
8e60: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
8e70: 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
8e80: 66 69 6e 64 6c 6f 63 6b 69 6e 66 6f 3b 0a 20 20  findlockinfo;.  
8e90: 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 63      }.      memc
8ea0: 70 79 28 26 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 4b  py(&pLock->lockK
8eb0: 65 79 2c 26 6c 6f 63 6b 4b 65 79 2c 73 69 7a 65  ey,&lockKey,size
8ec0: 6f 66 28 6c 6f 63 6b 4b 65 79 29 29 3b 0a 20 20  of(lockKey));.  
8ed0: 20 20 20 20 70 4c 6f 63 6b 2d 3e 6e 52 65 66 20      pLock->nRef 
8ee0: 3d 20 31 3b 0a 20 20 20 20 20 20 70 4c 6f 63 6b  = 1;.      pLock
8ef0: 2d 3e 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20  ->cnt = 0;.     
8f00: 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65   pLock->locktype
8f10: 20 3d 20 30 3b 0a 23 69 66 20 64 65 66 69 6e 65   = 0;.#if define
8f20: 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
8f30: 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 29 0a 20  LOCKING_STYLE). 
8f40: 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 73 68 61 72       pLock->shar
8f50: 65 64 42 79 74 65 20 3d 20 30 3b 0a 23 65 6e 64  edByte = 0;.#end
8f60: 69 66 0a 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e  if.      pLock->
8f70: 70 4e 65 78 74 20 3d 20 6c 6f 63 6b 4c 69 73 74  pNext = lockList
8f80: 3b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 70  ;.      pLock->p
8f90: 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 20 20  Prev = 0;.      
8fa0: 69 66 28 20 6c 6f 63 6b 4c 69 73 74 20 29 20 6c  if( lockList ) l
8fb0: 6f 63 6b 4c 69 73 74 2d 3e 70 50 72 65 76 20 3d  ockList->pPrev =
8fc0: 20 70 4c 6f 63 6b 3b 0a 20 20 20 20 20 20 6c 6f   pLock;.      lo
8fd0: 63 6b 4c 69 73 74 20 3d 20 70 4c 6f 63 6b 3b 0a  ckList = pLock;.
8fe0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
8ff0: 20 70 4c 6f 63 6b 2d 3e 6e 52 65 66 2b 2b 3b 0a   pLock->nRef++;.
9000: 20 20 20 20 7d 0a 20 20 20 20 2a 70 70 4c 6f 63      }.    *ppLoc
9010: 6b 20 3d 20 70 4c 6f 63 6b 3b 0a 20 20 7d 0a 20  k = pLock;.  }. 
9020: 20 69 66 28 20 70 70 4f 70 65 6e 21 3d 30 20 29   if( ppOpen!=0 )
9030: 7b 0a 20 20 20 20 70 4f 70 65 6e 20 3d 20 6f 70  {.    pOpen = op
9040: 65 6e 4c 69 73 74 3b 0a 20 20 20 20 77 68 69 6c  enList;.    whil
9050: 65 28 20 70 4f 70 65 6e 20 26 26 20 6d 65 6d 63  e( pOpen && memc
9060: 6d 70 28 26 66 69 6c 65 49 64 2c 20 26 70 4f 70  mp(&fileId, &pOp
9070: 65 6e 2d 3e 66 69 6c 65 49 64 2c 20 73 69 7a 65  en->fileId, size
9080: 6f 66 28 66 69 6c 65 49 64 29 29 20 29 7b 0a 20  of(fileId)) ){. 
9090: 20 20 20 20 20 70 4f 70 65 6e 20 3d 20 70 4f 70       pOpen = pOp
90a0: 65 6e 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d  en->pNext;.    }
90b0: 0a 20 20 20 20 69 66 28 20 70 4f 70 65 6e 3d 3d  .    if( pOpen==
90c0: 30 20 29 7b 0a 20 20 20 20 20 20 70 4f 70 65 6e  0 ){.      pOpen
90d0: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
90e0: 63 28 20 73 69 7a 65 6f 66 28 2a 70 4f 70 65 6e  c( sizeof(*pOpen
90f0: 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ) );.      if( p
9100: 4f 70 65 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Open==0 ){.     
9110: 20 20 20 72 65 6c 65 61 73 65 4c 6f 63 6b 49 6e     releaseLockIn
9120: 66 6f 28 70 4c 6f 63 6b 29 3b 0a 20 20 20 20 20  fo(pLock);.     
9130: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
9140: 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 67 6f  OMEM;.        go
9150: 74 6f 20 65 78 69 74 5f 66 69 6e 64 6c 6f 63 6b  to exit_findlock
9160: 69 6e 66 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20  info;.      }.  
9170: 20 20 20 20 6d 65 6d 73 65 74 28 70 4f 70 65 6e      memset(pOpen
9180: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 4f 70  , 0, sizeof(*pOp
9190: 65 6e 29 29 3b 0a 20 20 20 20 20 20 70 4f 70 65  en));.      pOpe
91a0: 6e 2d 3e 66 69 6c 65 49 64 20 3d 20 66 69 6c 65  n->fileId = file
91b0: 49 64 3b 0a 20 20 20 20 20 20 70 4f 70 65 6e 2d  Id;.      pOpen-
91c0: 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 20  >nRef = 1;.     
91d0: 20 70 4f 70 65 6e 2d 3e 70 4e 65 78 74 20 3d 20   pOpen->pNext = 
91e0: 6f 70 65 6e 4c 69 73 74 3b 0a 20 20 20 20 20 20  openList;.      
91f0: 69 66 28 20 6f 70 65 6e 4c 69 73 74 20 29 20 6f  if( openList ) o
9200: 70 65 6e 4c 69 73 74 2d 3e 70 50 72 65 76 20 3d  penList->pPrev =
9210: 20 70 4f 70 65 6e 3b 0a 20 20 20 20 20 20 6f 70   pOpen;.      op
9220: 65 6e 4c 69 73 74 20 3d 20 70 4f 70 65 6e 3b 0a  enList = pOpen;.
9230: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
9240: 20 70 4f 70 65 6e 2d 3e 6e 52 65 66 2b 2b 3b 0a   pOpen->nRef++;.
9250: 20 20 20 20 7d 0a 20 20 20 20 2a 70 70 4f 70 65      }.    *ppOpe
9260: 6e 20 3d 20 70 4f 70 65 6e 3b 0a 20 20 7d 0a 0a  n = pOpen;.  }..
9270: 65 78 69 74 5f 66 69 6e 64 6c 6f 63 6b 69 6e 66  exit_findlockinf
9280: 6f 3a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  o:.  return rc;.
9290: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65 20 61  }../*.** If we a
92a0: 72 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20  re currently in 
92b0: 61 20 64 69 66 66 65 72 65 6e 74 20 74 68 72 65  a different thre
92c0: 61 64 20 74 68 61 6e 20 74 68 65 20 74 68 72 65  ad than the thre
92d0: 61 64 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 75  ad that the.** u
92e0: 6e 69 78 46 69 6c 65 20 61 72 67 75 6d 65 6e 74  nixFile argument
92f0: 20 62 65 6c 6f 6e 67 73 20 74 6f 2c 20 74 68 65   belongs to, the
9300: 6e 20 74 72 61 6e 73 66 65 72 20 6f 77 6e 65 72  n transfer owner
9310: 73 68 69 70 20 6f 66 20 74 68 65 20 75 6e 69 78  ship of the unix
9320: 46 69 6c 65 0a 2a 2a 20 6f 76 65 72 20 74 6f 20  File.** over to 
9330: 74 68 65 20 63 75 72 72 65 6e 74 20 74 68 72 65  the current thre
9340: 61 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 75 6e 69 78  ad..**.** A unix
9350: 46 69 6c 65 20 69 73 20 6f 6e 6c 79 20 6f 77 6e  File is only own
9360: 65 64 20 62 79 20 61 20 74 68 72 65 61 64 20 6f  ed by a thread o
9370: 6e 20 73 79 73 74 65 6d 73 20 74 68 61 74 20 75  n systems that u
9380: 73 65 20 4c 69 6e 75 78 54 68 72 65 61 64 73 2e  se LinuxThreads.
9390: 0a 2a 2a 0a 2a 2a 20 4f 77 6e 65 72 73 68 69 70  .**.** Ownership
93a0: 20 74 72 61 6e 73 66 65 72 20 69 73 20 6f 6e 6c   transfer is onl
93b0: 79 20 61 6c 6c 6f 77 65 64 20 69 66 20 74 68 65  y allowed if the
93c0: 20 75 6e 69 78 46 69 6c 65 20 69 73 20 63 75 72   unixFile is cur
93d0: 72 65 6e 74 6c 79 20 75 6e 6c 6f 63 6b 65 64 2e  rently unlocked.
93e0: 0a 2a 2a 20 49 66 20 74 68 65 20 75 6e 69 78 46  .** If the unixF
93f0: 69 6c 65 20 69 73 20 6c 6f 63 6b 65 64 20 61 6e  ile is locked an
9400: 64 20 61 6e 20 6f 77 6e 65 72 73 68 69 70 20 69  d an ownership i
9410: 73 20 77 72 6f 6e 67 2c 20 74 68 65 6e 20 72 65  s wrong, then re
9420: 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 4d  turn.** SQLITE_M
9430: 49 53 55 53 45 2e 20 20 53 51 4c 49 54 45 5f 4f  ISUSE.  SQLITE_O
9440: 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  K is returned if
9450: 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b   everything work
9460: 73 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45  s..*/.#if SQLITE
9470: 5f 54 48 52 45 41 44 53 41 46 45 20 26 26 20 64  _THREADSAFE && d
9480: 65 66 69 6e 65 64 28 5f 5f 6c 69 6e 75 78 5f 5f  efined(__linux__
9490: 29 0a 73 74 61 74 69 63 20 69 6e 74 20 74 72 61  ).static int tra
94a0: 6e 73 66 65 72 4f 77 6e 65 72 73 68 69 70 28 75  nsferOwnership(u
94b0: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b  nixFile *pFile){
94c0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 70 74 68  .  int rc;.  pth
94d0: 72 65 61 64 5f 74 20 68 53 65 6c 66 3b 0a 20 20  read_t hSelf;.  
94e0: 69 66 28 20 74 68 72 65 61 64 73 4f 76 65 72 72  if( threadsOverr
94f0: 69 64 65 45 61 63 68 4f 74 68 65 72 73 4c 6f 63  ideEachOthersLoc
9500: 6b 73 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 77 6e  ks ){.    /* Own
9510: 65 72 73 68 69 70 20 74 72 61 6e 73 66 65 72 73  ership transfers
9520: 20 6e 6f 74 20 6e 65 65 64 65 64 20 6f 6e 20 74   not needed on t
9530: 68 69 73 20 73 79 73 74 65 6d 20 2a 2f 0a 20 20  his system */.  
9540: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
9550: 4f 4b 3b 0a 20 20 7d 0a 20 20 68 53 65 6c 66 20  OK;.  }.  hSelf 
9560: 3d 20 70 74 68 72 65 61 64 5f 73 65 6c 66 28 29  = pthread_self()
9570: 3b 0a 20 20 69 66 28 20 70 74 68 72 65 61 64 5f  ;.  if( pthread_
9580: 65 71 75 61 6c 28 70 46 69 6c 65 2d 3e 74 69 64  equal(pFile->tid
9590: 2c 20 68 53 65 6c 66 29 20 29 7b 0a 20 20 20 20  , hSelf) ){.    
95a0: 2f 2a 20 57 65 20 61 72 65 20 73 74 69 6c 6c 20  /* We are still 
95b0: 69 6e 20 74 68 65 20 73 61 6d 65 20 74 68 72 65  in the same thre
95c0: 61 64 20 2a 2f 0a 20 20 20 20 4f 53 54 52 41 43  ad */.    OSTRAC
95d0: 45 31 28 22 4e 6f 2d 74 72 61 6e 73 66 65 72 2c  E1("No-transfer,
95e0: 20 73 61 6d 65 20 74 68 72 65 61 64 5c 6e 22 29   same thread\n")
95f0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
9600: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66  ITE_OK;.  }.  if
9610: 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  ( pFile->locktyp
9620: 65 21 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20  e!=NO_LOCK ){.  
9630: 20 20 2f 2a 20 57 65 20 63 61 6e 6e 6f 74 20 63    /* We cannot c
9640: 68 61 6e 67 65 20 6f 77 6e 65 72 73 68 69 70 20  hange ownership 
9650: 77 68 69 6c 65 20 77 65 20 61 72 65 20 68 6f 6c  while we are hol
9660: 64 69 6e 67 20 61 20 6c 6f 63 6b 21 20 2a 2f 0a  ding a lock! */.
9670: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
9680: 45 5f 4d 49 53 55 53 45 3b 0a 20 20 7d 0a 20 20  E_MISUSE;.  }.  
9690: 4f 53 54 52 41 43 45 34 28 22 54 72 61 6e 73 66  OSTRACE4("Transf
96a0: 65 72 20 6f 77 6e 65 72 73 68 69 70 20 6f 66 20  er ownership of 
96b0: 25 64 20 66 72 6f 6d 20 25 64 20 74 6f 20 25 64  %d from %d to %d
96c0: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
96d0: 20 70 46 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65   pFile->h, pFile
96e0: 2d 3e 74 69 64 2c 20 68 53 65 6c 66 29 3b 0a 20  ->tid, hSelf);. 
96f0: 20 70 46 69 6c 65 2d 3e 74 69 64 20 3d 20 68 53   pFile->tid = hS
9700: 65 6c 66 3b 0a 20 20 69 66 20 28 70 46 69 6c 65  elf;.  if (pFile
9710: 2d 3e 70 4c 6f 63 6b 20 21 3d 20 4e 55 4c 4c 29  ->pLock != NULL)
9720: 20 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 4c 6f   {.    releaseLo
9730: 63 6b 49 6e 66 6f 28 70 46 69 6c 65 2d 3e 70 4c  ckInfo(pFile->pL
9740: 6f 63 6b 29 3b 0a 20 20 20 20 72 63 20 3d 20 66  ock);.    rc = f
9750: 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28 70 46 69 6c  indLockInfo(pFil
9760: 65 2c 20 26 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b  e, &pFile->pLock
9770: 2c 20 30 29 3b 0a 20 20 20 20 4f 53 54 52 41 43  , 0);.    OSTRAC
9780: 45 35 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 69  E5("LOCK    %d i
9790: 73 20 6e 6f 77 20 25 73 28 25 73 2c 25 64 29 5c  s now %s(%s,%d)\
97a0: 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20  n", pFile->h,.  
97b0: 20 20 20 20 20 20 20 20 20 6c 6f 63 6b 74 79 70           locktyp
97c0: 65 4e 61 6d 65 28 70 46 69 6c 65 2d 3e 6c 6f 63  eName(pFile->loc
97d0: 6b 74 79 70 65 29 2c 0a 20 20 20 20 20 20 20 20  ktype),.        
97e0: 20 20 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28     locktypeName(
97f0: 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 2d 3e 6c 6f  pFile->pLock->lo
9800: 63 6b 74 79 70 65 29 2c 20 70 46 69 6c 65 2d 3e  cktype), pFile->
9810: 70 4c 6f 63 6b 2d 3e 63 6e 74 29 3b 0a 20 20 20  pLock->cnt);.   
9820: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 20   return rc;.  } 
9830: 65 6c 73 65 20 7b 0a 20 20 20 20 72 65 74 75 72  else {.    retur
9840: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
9850: 0a 7d 0a 23 65 6c 73 65 20 20 2f 2a 20 69 66 20  .}.#else  /* if 
9860: 6e 6f 74 20 53 51 4c 49 54 45 5f 54 48 52 45 41  not SQLITE_THREA
9870: 44 53 41 46 45 20 2a 2f 0a 20 20 2f 2a 20 4f 6e  DSAFE */.  /* On
9880: 20 73 69 6e 67 6c 65 2d 74 68 72 65 61 64 65 64   single-threaded
9890: 20 62 75 69 6c 64 73 2c 20 6f 77 6e 65 72 73 68   builds, ownersh
98a0: 69 70 20 74 72 61 6e 73 66 65 72 20 69 73 20 61  ip transfer is a
98b0: 20 6e 6f 2d 6f 70 20 2a 2f 0a 23 20 64 65 66 69   no-op */.# defi
98c0: 6e 65 20 74 72 61 6e 73 66 65 72 4f 77 6e 65 72  ne transferOwner
98d0: 73 68 69 70 28 58 29 20 53 51 4c 49 54 45 5f 4f  ship(X) SQLITE_O
98e0: 4b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  K.#endif /* SQLI
98f0: 54 45 5f 54 48 52 45 41 44 53 41 46 45 20 2a 2f  TE_THREADSAFE */
9900: 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  .../*.** This ro
9910: 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20  utine checks if 
9920: 74 68 65 72 65 20 69 73 20 61 20 52 45 53 45 52  there is a RESER
9930: 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e  VED lock held on
9940: 20 74 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a   the specified.*
9950: 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f  * file by this o
9960: 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63  r any other proc
9970: 65 73 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c  ess. If such a l
9980: 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74  ock is held, set
9990: 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20   *pResOut.** to 
99a0: 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65  a non-zero value
99b0: 20 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65 73   otherwise *pRes
99c0: 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65  Out is set to ze
99d0: 72 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20  ro.  The return 
99e0: 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20  value.** is set 
99f0: 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c  to SQLITE_OK unl
9a00: 65 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72  ess an I/O error
9a10: 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c   occurs during l
9a20: 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f  ock checking..*/
9a30: 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
9a40: 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
9a50: 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
9a60: 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74  id, int *pResOut
9a70: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
9a80: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72  LITE_OK;.  int r
9a90: 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 75  eserved = 0;.  u
9aa0: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
9ab0: 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
9ac0: 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
9ad0: 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54  or( return SQLIT
9ae0: 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53  E_IOERR_CHECKRES
9af0: 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 0a 20  ERVEDLOCK; );.. 
9b00: 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
9b10: 3b 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74  ;.  unixEnterMut
9b20: 65 78 28 29 3b 20 2f 2a 20 42 65 63 61 75 73 65  ex(); /* Because
9b30: 20 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 20 69 73   pFile->pLock is
9b40: 20 73 68 61 72 65 64 20 61 63 72 6f 73 73 20 74   shared across t
9b50: 68 72 65 61 64 73 20 2a 2f 0a 0a 20 20 2f 2a 20  hreads */..  /* 
9b60: 43 68 65 63 6b 20 69 66 20 61 20 74 68 72 65 61  Check if a threa
9b70: 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73  d in this proces
9b80: 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c  s holds such a l
9b90: 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ock */.  if( pFi
9ba0: 6c 65 2d 3e 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74  le->pLock->lockt
9bb0: 79 70 65 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ype>SHARED_LOCK 
9bc0: 29 7b 0a 20 20 20 20 72 65 73 65 72 76 65 64 20  ){.    reserved 
9bd0: 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f  = 1;.  }..  /* O
9be0: 74 68 65 72 77 69 73 65 20 73 65 65 20 69 66 20  therwise see if 
9bf0: 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65  some other proce
9c00: 73 73 20 68 6f 6c 64 73 20 69 74 2e 0a 20 20 2a  ss holds it..  *
9c10: 2f 0a 23 69 66 6e 64 65 66 20 5f 5f 44 4a 47 50  /.#ifndef __DJGP
9c20: 50 5f 5f 0a 20 20 69 66 28 20 21 72 65 73 65 72  P__.  if( !reser
9c30: 76 65 64 20 29 7b 0a 20 20 20 20 73 74 72 75 63  ved ){.    struc
9c40: 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20  t flock lock;.  
9c50: 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20    lock.l_whence 
9c60: 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20  = SEEK_SET;.    
9c70: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 52  lock.l_start = R
9c80: 45 53 45 52 56 45 44 5f 42 59 54 45 3b 0a 20 20  ESERVED_BYTE;.  
9c90: 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31    lock.l_len = 1
9ca0: 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70  ;.    lock.l_typ
9cb0: 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20 20 20  e = F_WRLCK;.   
9cc0: 20 69 66 20 28 2d 31 20 3d 3d 20 66 63 6e 74 6c   if (-1 == fcntl
9cd0: 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 47 45 54  (pFile->h, F_GET
9ce0: 4c 4b 2c 20 26 6c 6f 63 6b 29 29 20 7b 0a 20 20  LK, &lock)) {.  
9cf0: 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d      int tErrno =
9d00: 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63   errno;.      rc
9d10: 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
9d20: 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
9d30: 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
9d40: 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c  R_CHECKRESERVEDL
9d50: 4f 43 4b 29 3b 0a 20 20 20 20 20 20 70 46 69 6c  OCK);.      pFil
9d60: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74  e->lastErrno = t
9d70: 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 20 65 6c 73  Errno;.    } els
9d80: 65 20 69 66 28 20 6c 6f 63 6b 2e 6c 5f 74 79 70  e if( lock.l_typ
9d90: 65 21 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20  e!=F_UNLCK ){.  
9da0: 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31      reserved = 1
9db0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
9dc0: 69 66 0a 20 20 0a 20 20 75 6e 69 78 4c 65 61 76  if.  .  unixLeav
9dd0: 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53 54 52  eMutex();.  OSTR
9de0: 41 43 45 34 28 22 54 45 53 54 20 57 52 2d 4c 4f  ACE4("TEST WR-LO
9df0: 43 4b 20 25 64 20 25 64 20 25 64 20 28 75 6e 69  CK %d %d %d (uni
9e00: 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  x)\n", pFile->h,
9e10: 20 72 63 2c 20 72 65 73 65 72 76 65 64 29 3b 0a   rc, reserved);.
9e20: 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65  .  *pResOut = re
9e30: 73 65 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e  served;.  return
9e40: 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53   rc;.}..#ifdef S
9e50: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4e 46 53  QLITE_ENABLE_NFS
9e60: 5f 52 41 4e 47 45 4c 4f 43 4b 0a 2f 2a 0a 2a 2a  _RANGELOCK./*.**
9e70: 20 50 65 72 66 6f 72 6d 20 61 20 66 69 6c 65 20   Perform a file 
9e80: 6c 6f 63 6b 69 6e 67 20 6f 70 65 72 61 74 69 6f  locking operatio
9e90: 6e 20 6f 6e 20 61 20 72 61 6e 67 65 20 6f 66 20  n on a range of 
9ea0: 62 79 74 65 73 20 69 6e 20 61 20 66 69 6c 65 2e  bytes in a file.
9eb0: 0a 2a 2a 20 54 68 65 20 22 6f 70 22 20 70 61 72  .** The "op" par
9ec0: 61 6d 65 74 65 72 20 73 68 6f 75 6c 64 20 62 65  ameter should be
9ed0: 20 6f 6e 65 20 6f 66 20 46 5f 52 44 4c 43 4b 2c   one of F_RDLCK,
9ee0: 20 46 5f 57 52 4c 43 4b 2c 20 6f 72 20 46 5f 55   F_WRLCK, or F_U
9ef0: 4e 4c 43 4b 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  NLCK..** Return 
9f00: 30 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20  0 on success or 
9f10: 2d 31 20 66 6f 72 20 66 61 69 6c 75 72 65 2e 20  -1 for failure. 
9f20: 20 4f 6e 20 66 61 69 6c 75 72 65 2c 20 77 72 69   On failure, wri
9f30: 74 65 20 74 68 65 20 65 72 72 6f 72 0a 2a 2a 20  te the error.** 
9f40: 63 6f 64 65 20 69 6e 74 6f 20 2a 70 45 72 72 63  code into *pErrc
9f50: 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ode..**.** If th
9f60: 65 20 53 51 4c 49 54 45 5f 57 48 4f 4c 45 5f 46  e SQLITE_WHOLE_F
9f70: 49 4c 45 5f 4c 4f 43 4b 49 4e 47 20 62 69 74 20  ILE_LOCKING bit 
9f80: 69 73 20 63 6c 65 61 72 2c 20 74 68 65 6e 20 6f  is clear, then o
9f90: 6e 6c 79 20 6c 6f 63 6b 0a 2a 2a 20 74 68 65 20  nly lock.** the 
9fa0: 72 61 6e 67 65 20 6f 66 20 62 79 74 65 73 20 6f  range of bytes o
9fb0: 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 70 61  n the locking pa
9fc0: 67 65 20 62 65 74 77 65 65 6e 20 53 48 41 52 45  ge between SHARE
9fd0: 44 5f 46 49 52 53 54 20 61 6e 64 0a 2a 2a 20 53  D_FIRST and.** S
9fe0: 48 41 52 45 44 5f 53 49 5a 45 2e 20 20 49 66 20  HARED_SIZE.  If 
9ff0: 53 51 4c 49 54 45 5f 57 48 4f 4c 45 5f 46 49 4c  SQLITE_WHOLE_FIL
a000: 45 5f 4c 4f 43 4b 49 4e 47 20 69 73 20 73 65 74  E_LOCKING is set
a010: 2c 20 74 68 65 6e 20 6c 6f 63 6b 20 61 6c 6c 0a  , then lock all.
a020: 2a 2a 20 62 79 74 65 73 20 66 72 6f 6d 20 30 20  ** bytes from 0 
a030: 75 70 20 74 6f 20 62 75 74 20 6e 6f 74 20 69 6e  up to but not in
a040: 63 6c 75 64 69 6e 67 20 50 45 4e 44 49 4e 47 5f  cluding PENDING_
a050: 42 59 54 45 2c 20 61 6e 64 20 61 6c 6c 20 62 79  BYTE, and all by
a060: 74 65 73 0a 2a 2a 20 74 68 61 74 20 66 6f 6c 6c  tes.** that foll
a070: 6f 77 20 53 48 41 52 45 44 5f 46 49 52 53 54 2e  ow SHARED_FIRST.
a080: 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 74 68 65 72 20  .**.** In other 
a090: 77 6f 72 64 73 2c 20 6f 66 20 53 51 4c 49 54 45  words, of SQLITE
a0a0: 5f 57 48 4f 4c 45 5f 46 49 4c 45 5f 4c 4f 43 4b  _WHOLE_FILE_LOCK
a0b0: 49 4e 47 20 69 66 20 66 61 6c 73 65 20 28 74 68  ING if false (th
a0c0: 65 20 68 69 73 74 6f 72 69 63 61 6c 0a 2a 2a 20  e historical.** 
a0d0: 64 65 66 61 75 6c 74 20 63 61 73 65 29 20 74 68  default case) th
a0e0: 65 6e 20 6f 6e 6c 79 20 6c 6f 63 6b 20 61 20 73  en only lock a s
a0f0: 6d 61 6c 6c 20 72 61 6e 67 65 20 6f 66 20 62 79  mall range of by
a100: 74 65 73 20 66 72 6f 6d 20 53 48 41 52 45 44 5f  tes from SHARED_
a110: 46 49 52 53 54 0a 2a 2a 20 74 68 72 6f 75 67 68  FIRST.** through
a120: 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b 53 48   SHARED_FIRST+SH
a130: 41 52 45 44 5f 53 49 5a 45 2d 31 2e 20 20 42 75  ARED_SIZE-1.  Bu
a140: 74 20 69 66 20 53 51 4c 49 54 45 5f 57 48 4f 4c  t if SQLITE_WHOL
a150: 45 5f 46 49 4c 45 5f 4c 4f 43 4b 49 4e 47 20 69  E_FILE_LOCKING i
a160: 73 0a 2a 2a 20 74 72 75 65 20 74 68 65 6e 20 6c  s.** true then l
a170: 6f 63 6b 20 65 76 65 72 79 20 62 79 74 65 20 69  ock every byte i
a180: 6e 20 74 68 65 20 66 69 6c 65 20 65 78 63 65 70  n the file excep
a190: 74 20 66 6f 72 20 50 45 4e 44 49 4e 47 5f 42 59  t for PENDING_BY
a1a0: 54 45 20 61 6e 64 0a 2a 2a 20 52 45 53 45 52 56  TE and.** RESERV
a1b0: 45 44 5f 42 59 54 45 2e 0a 2a 2a 0a 2a 2a 20 53  ED_BYTE..**.** S
a1c0: 51 4c 49 54 45 5f 57 48 4f 4c 45 5f 46 49 4c 45  QLITE_WHOLE_FILE
a1d0: 5f 4c 4f 43 4b 49 4e 47 3d 74 72 75 65 20 6f 76  _LOCKING=true ov
a1e0: 65 72 6c 61 70 73 20 53 51 4c 49 54 45 5f 57 48  erlaps SQLITE_WH
a1f0: 4f 4c 45 5f 46 49 4c 45 5f 4c 4f 43 4b 49 4e 47  OLE_FILE_LOCKING
a200: 3d 66 61 6c 73 65 0a 2a 2a 20 61 6e 64 20 73 6f  =false.** and so
a210: 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 73 63 68   the locking sch
a220: 65 6d 65 73 20 61 72 65 20 63 6f 6d 70 61 74 69  emes are compati
a230: 62 6c 65 2e 20 20 4f 6e 65 20 74 79 70 65 20 6f  ble.  One type o
a240: 66 20 6c 6f 63 6b 20 77 69 6c 6c 0a 2a 2a 20 65  f lock will.** e
a250: 66 66 65 63 74 69 76 65 6c 79 20 65 78 63 6c 75  ffectively exclu
a260: 64 65 20 74 68 65 20 6f 74 68 65 72 20 74 79 70  de the other typ
a270: 65 2e 20 20 54 68 65 20 72 65 61 73 6f 6e 20 66  e.  The reason f
a280: 6f 72 20 75 73 69 6e 67 20 74 68 65 0a 2a 2a 20  or using the.** 
a290: 53 51 4c 49 54 45 5f 57 48 4f 4c 45 5f 46 49 4c  SQLITE_WHOLE_FIL
a2a0: 45 5f 4c 4f 43 4b 49 4e 47 3d 74 72 75 65 20 69  E_LOCKING=true i
a2b0: 73 20 74 68 61 74 20 62 79 20 69 6e 64 69 63 61  s that by indica
a2c0: 74 69 6e 67 20 74 68 65 20 66 75 6c 6c 20 72 61  ting the full ra
a2d0: 6e 67 65 0a 2a 2a 20 6f 66 20 62 79 74 65 73 20  nge.** of bytes 
a2e0: 74 6f 20 62 65 20 72 65 61 64 20 6f 72 20 77 72  to be read or wr
a2f0: 69 74 74 65 6e 2c 20 77 65 20 67 69 76 65 20 68  itten, we give h
a300: 69 6e 74 73 20 74 6f 20 4e 46 53 20 74 6f 20 68  ints to NFS to h
a310: 65 6c 70 20 69 74 0a 2a 2a 20 6d 61 69 6e 74 61  elp it.** mainta
a320: 69 6e 20 63 61 63 68 65 20 63 6f 68 65 72 65 6e  in cache coheren
a330: 63 79 2e 20 20 4f 6e 20 74 68 65 20 6f 74 68 65  cy.  On the othe
a340: 72 20 68 61 6e 64 2c 20 77 68 6f 6c 65 20 66 69  r hand, whole fi
a350: 6c 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 69 73  le locking.** is
a360: 20 73 6c 6f 77 65 72 2c 20 73 6f 20 77 65 20 64   slower, so we d
a370: 6f 6e 27 74 20 77 61 6e 74 20 74 6f 20 75 73 65  on't want to use
a380: 20 69 74 20 65 78 63 65 70 74 20 66 6f 72 20 4e   it except for N
a390: 46 53 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  FS..*/.static in
a3a0: 74 20 72 61 6e 67 65 4c 6f 63 6b 28 75 6e 69 78  t rangeLock(unix
a3b0: 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69 6e 74  File *pFile, int
a3c0: 20 6f 70 2c 20 69 6e 74 20 2a 70 45 72 72 63 6f   op, int *pErrco
a3d0: 64 65 29 7b 0a 20 20 73 74 72 75 63 74 20 66 6c  de){.  struct fl
a3e0: 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20  ock lock;.  int 
a3f0: 72 63 3b 0a 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70  rc;.  lock.l_typ
a400: 65 20 3d 20 6f 70 3b 0a 20 20 6c 6f 63 6b 2e 6c  e = op;.  lock.l
a410: 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f  _start = SHARED_
a420: 46 49 52 53 54 3b 0a 20 20 6c 6f 63 6b 2e 6c 5f  FIRST;.  lock.l_
a430: 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45  whence = SEEK_SE
a440: 54 3b 0a 20 20 69 66 28 20 28 70 46 69 6c 65 2d  T;.  if( (pFile-
a450: 3e 66 69 6c 65 46 6c 61 67 73 20 26 20 53 51 4c  >fileFlags & SQL
a460: 49 54 45 5f 57 48 4f 4c 45 5f 46 49 4c 45 5f 4c  ITE_WHOLE_FILE_L
a470: 4f 43 4b 49 4e 47 29 3d 3d 30 20 29 7b 0a 20 20  OCKING)==0 ){.  
a480: 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53    lock.l_len = S
a490: 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20  HARED_SIZE;.    
a4a0: 72 63 20 3d 20 66 63 6e 74 6c 28 70 46 69 6c 65  rc = fcntl(pFile
a4b0: 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c  ->h, F_SETLK, &l
a4c0: 6f 63 6b 29 3b 0a 20 20 20 20 2a 70 45 72 72 63  ock);.    *pErrc
a4d0: 6f 64 65 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 7d  ode = errno;.  }
a4e0: 65 6c 73 65 7b 0a 20 20 20 20 6c 6f 63 6b 2e 6c  else{.    lock.l
a4f0: 5f 6c 65 6e 20 3d 20 30 3b 0a 20 20 20 20 72 63  _len = 0;.    rc
a500: 20 3d 20 66 63 6e 74 6c 28 70 46 69 6c 65 2d 3e   = fcntl(pFile->
a510: 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63  h, F_SETLK, &loc
a520: 6b 29 3b 0a 20 20 20 20 2a 70 45 72 72 63 6f 64  k);.    *pErrcod
a530: 65 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 69  e = errno;.    i
a540: 66 28 20 4e 45 56 45 52 28 6f 70 3d 3d 46 5f 55  f( NEVER(op==F_U
a550: 4e 4c 43 4b 29 20 7c 7c 20 72 63 21 3d 28 2d 31  NLCK) || rc!=(-1
a560: 29 20 29 7b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e  ) ){.      lock.
a570: 6c 5f 73 74 61 72 74 20 3d 20 30 3b 0a 20 20 20  l_start = 0;.   
a580: 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20     lock.l_len = 
a590: 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20  PENDING_BYTE;.  
a5a0: 20 20 20 20 72 63 20 3d 20 66 63 6e 74 6c 28 70      rc = fcntl(p
a5b0: 46 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b  File->h, F_SETLK
a5c0: 2c 20 26 6c 6f 63 6b 29 3b 0a 20 20 20 20 20 20  , &lock);.      
a5d0: 69 66 28 20 41 4c 57 41 59 53 28 6f 70 21 3d 46  if( ALWAYS(op!=F
a5e0: 5f 55 4e 4c 43 4b 29 20 26 26 20 72 63 3d 3d 28  _UNLCK) && rc==(
a5f0: 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  -1) ){.        *
a600: 70 45 72 72 63 6f 64 65 20 3d 20 65 72 72 6e 6f  pErrcode = errno
a610: 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  ;.        lock.l
a620: 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b  _type = F_UNLCK;
a630: 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  .        lock.l_
a640: 73 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46  start = SHARED_F
a650: 49 52 53 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f  IRST;.        lo
a660: 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 30 3b 0a 20 20  ck.l_len = 0;.  
a670: 20 20 20 20 20 20 66 63 6e 74 6c 28 70 46 69 6c        fcntl(pFil
a680: 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26  e->h, F_SETLK, &
a690: 6c 6f 63 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20  lock);.      }. 
a6a0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
a6b0: 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20  n rc;.}..#endif 
a6c0: 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
a6d0: 5f 4e 46 53 5f 52 41 4e 47 45 4c 4f 43 4b 20 2a  _NFS_RANGELOCK *
a6e0: 2f 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65  /./*.** Lock the
a6f0: 20 66 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c   file with the l
a700: 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20 62 79  ock specified by
a710: 20 70 61 72 61 6d 65 74 65 72 20 6c 6f 63 6b 74   parameter lockt
a720: 79 70 65 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20  ype - one.** of 
a730: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a  the following:.*
a740: 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41  *.**     (1) SHA
a750: 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  RED_LOCK.**     
a760: 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  (2) RESERVED_LOC
a770: 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e  K.**     (3) PEN
a780: 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  DING_LOCK.**    
a790: 20 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c   (4) EXCLUSIVE_L
a7a0: 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69  OCK.**.** Someti
a7b0: 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65 73 74  mes when request
a7c0: 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61  ing one lock sta
a7d0: 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c  te, additional l
a7e0: 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72  ock states.** ar
a7f0: 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65  e inserted in be
a800: 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b  tween.  The lock
a810: 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f  ing might fail o
a820: 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74  n one of the lat
a830: 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  er.** transition
a840: 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f  s leaving the lo
a850: 63 6b 20 73 74 61 74 65 20 64 69 66 66 65 72 65  ck state differe
a860: 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20  nt from what it 
a870: 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73  started but.** s
a880: 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74  till short of it
a890: 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c  s goal.  The fol
a8a0: 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f  lowing chart sho
a8b0: 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a  ws the allowed.*
a8c0: 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e  * transitions an
a8d0: 64 20 74 68 65 20 69 6e 73 65 72 74 65 64 20 69  d the inserted i
a8e0: 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74  ntermediate stat
a8f0: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c  es:.**.**    UNL
a900: 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a  OCKED -> SHARED.
a910: 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20  **    SHARED -> 
a920: 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53  RESERVED.**    S
a930: 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e  HARED -> (PENDIN
a940: 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  G) -> EXCLUSIVE.
a950: 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44 20 2d  **    RESERVED -
a960: 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45  > (PENDING) -> E
a970: 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50  XCLUSIVE.**    P
a980: 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53  ENDING -> EXCLUS
a990: 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  IVE.**.** This r
a9a0: 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79  outine will only
a9b0: 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b   increase a lock
a9c0: 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c 69 74  .  Use the sqlit
a9d0: 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20  e3OsUnlock().** 
a9e0: 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72  routine to lower
a9f0: 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c   a locking level
aa00: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
aa10: 75 6e 69 78 4c 6f 63 6b 28 73 71 6c 69 74 65 33  unixLock(sqlite3
aa20: 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c  _file *id, int l
aa30: 6f 63 6b 74 79 70 65 29 7b 0a 20 20 2f 2a 20 54  ocktype){.  /* T
aa40: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 64 65 73  he following des
aa50: 63 72 69 62 65 73 20 74 68 65 20 69 6d 70 6c 65  cribes the imple
aa60: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
aa70: 20 76 61 72 69 6f 75 73 20 6c 6f 63 6b 73 20 61   various locks a
aa80: 6e 64 0a 20 20 2a 2a 20 6c 6f 63 6b 20 74 72 61  nd.  ** lock tra
aa90: 6e 73 69 74 69 6f 6e 73 20 69 6e 20 74 65 72 6d  nsitions in term
aaa0: 73 20 6f 66 20 74 68 65 20 50 4f 53 49 58 20 61  s of the POSIX a
aab0: 64 76 69 73 6f 72 79 20 73 68 61 72 65 64 20 61  dvisory shared a
aac0: 6e 64 20 65 78 63 6c 75 73 69 76 65 0a 20 20 2a  nd exclusive.  *
aad0: 2a 20 6c 6f 63 6b 20 70 72 69 6d 69 74 69 76 65  * lock primitive
aae0: 73 20 28 63 61 6c 6c 65 64 20 72 65 61 64 2d 6c  s (called read-l
aaf0: 6f 63 6b 73 20 61 6e 64 20 77 72 69 74 65 2d 6c  ocks and write-l
ab00: 6f 63 6b 73 20 62 65 6c 6f 77 2c 20 74 6f 20 61  ocks below, to a
ab10: 76 6f 69 64 0a 20 20 2a 2a 20 63 6f 6e 66 75 73  void.  ** confus
ab20: 69 6f 6e 20 77 69 74 68 20 53 51 4c 69 74 65 20  ion with SQLite 
ab30: 6c 6f 63 6b 20 6e 61 6d 65 73 29 2e 20 54 68 65  lock names). The
ab40: 20 61 6c 67 6f 72 69 74 68 6d 73 20 61 72 65 20   algorithms are 
ab50: 63 6f 6d 70 6c 69 63 61 74 65 64 0a 20 20 2a 2a  complicated.  **
ab60: 20 73 6c 69 67 68 74 6c 79 20 69 6e 20 6f 72 64   slightly in ord
ab70: 65 72 20 74 6f 20 62 65 20 63 6f 6d 70 61 74 69  er to be compati
ab80: 62 6c 65 20 77 69 74 68 20 77 69 6e 64 6f 77 73  ble with windows
ab90: 20 73 79 73 74 65 6d 73 20 73 69 6d 75 6c 74 61   systems simulta
aba0: 6e 65 6f 75 73 6c 79 0a 20 20 2a 2a 20 61 63 63  neously.  ** acc
abb0: 65 73 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20  essing the same 
abc0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69  database file, i
abd0: 6e 20 63 61 73 65 20 74 68 61 74 20 69 73 20 65  n case that is e
abe0: 76 65 72 20 72 65 71 75 69 72 65 64 2e 0a 20 20  ver required..  
abf0: 2a 2a 0a 20 20 2a 2a 20 53 79 6d 62 6f 6c 73 20  **.  ** Symbols 
ac00: 64 65 66 69 6e 65 64 20 69 6e 20 6f 73 2e 68 20  defined in os.h 
ac10: 69 6e 64 65 6e 74 69 66 79 20 74 68 65 20 27 70  indentify the 'p
ac20: 65 6e 64 69 6e 67 20 62 79 74 65 27 20 61 6e 64  ending byte' and
ac30: 20 74 68 65 20 27 72 65 73 65 72 76 65 64 0a 20   the 'reserved. 
ac40: 20 2a 2a 20 62 79 74 65 27 2c 20 65 61 63 68 20   ** byte', each 
ac50: 73 69 6e 67 6c 65 20 62 79 74 65 73 20 61 74 20  single bytes at 
ac60: 77 65 6c 6c 20 6b 6e 6f 77 6e 20 6f 66 66 73 65  well known offse
ac70: 74 73 2c 20 61 6e 64 20 74 68 65 20 27 73 68 61  ts, and the 'sha
ac80: 72 65 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61  red byte.  ** ra
ac90: 6e 67 65 27 2c 20 61 20 72 61 6e 67 65 20 6f 66  nge', a range of
aca0: 20 35 31 30 20 62 79 74 65 73 20 61 74 20 61 20   510 bytes at a 
acb0: 77 65 6c 6c 20 6b 6e 6f 77 6e 20 6f 66 66 73 65  well known offse
acc0: 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 6f 20  t..  **.  ** To 
acd0: 6f 62 74 61 69 6e 20 61 20 53 48 41 52 45 44 20  obtain a SHARED 
ace0: 6c 6f 63 6b 2c 20 61 20 72 65 61 64 2d 6c 6f 63  lock, a read-loc
acf0: 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 20 6f 6e  k is obtained on
ad00: 20 74 68 65 20 27 70 65 6e 64 69 6e 67 0a 20 20   the 'pending.  
ad10: 2a 2a 20 62 79 74 65 27 2e 20 20 49 66 20 74 68  ** byte'.  If th
ad20: 69 73 20 69 73 20 73 75 63 63 65 73 73 66 75 6c  is is successful
ad30: 2c 20 61 20 72 61 6e 64 6f 6d 20 62 79 74 65 20  , a random byte 
ad40: 66 72 6f 6d 20 74 68 65 20 27 73 68 61 72 65 64  from the 'shared
ad50: 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65   byte.  ** range
ad60: 27 20 69 73 20 72 65 61 64 2d 6c 6f 63 6b 65 64  ' is read-locked
ad70: 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e   and the lock on
ad80: 20 74 68 65 20 27 70 65 6e 64 69 6e 67 20 62 79   the 'pending by
ad90: 74 65 27 20 72 65 6c 65 61 73 65 64 2e 0a 20 20  te' released..  
ada0: 2a 2a 0a 20 20 2a 2a 20 41 20 70 72 6f 63 65 73  **.  ** A proces
adb0: 73 20 6d 61 79 20 6f 6e 6c 79 20 6f 62 74 61 69  s may only obtai
adc0: 6e 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  n a RESERVED loc
add0: 6b 20 61 66 74 65 72 20 69 74 20 68 61 73 20 61  k after it has a
ade0: 20 53 48 41 52 45 44 20 6c 6f 63 6b 2e 0a 20 20   SHARED lock..  
adf0: 2a 2a 20 41 20 52 45 53 45 52 56 45 44 20 6c 6f  ** A RESERVED lo
ae00: 63 6b 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65  ck is implemente
ae10: 64 20 62 79 20 67 72 61 62 62 69 6e 67 20 61 20  d by grabbing a 
ae20: 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68  write-lock on th
ae30: 65 0a 20 20 2a 2a 20 27 72 65 73 65 72 76 65 64  e.  ** 'reserved
ae40: 20 62 79 74 65 27 2e 20 0a 20 20 2a 2a 0a 20 20   byte'. .  **.  
ae50: 2a 2a 20 41 20 70 72 6f 63 65 73 73 20 6d 61 79  ** A process may
ae60: 20 6f 6e 6c 79 20 6f 62 74 61 69 6e 20 61 20 50   only obtain a P
ae70: 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 61 66 74 65  ENDING lock afte
ae80: 72 20 69 74 20 68 61 73 20 6f 62 74 61 69 6e 65  r it has obtaine
ae90: 64 20 61 0a 20 20 2a 2a 20 53 48 41 52 45 44 20  d a.  ** SHARED 
aea0: 6c 6f 63 6b 2e 20 41 20 50 45 4e 44 49 4e 47 20  lock. A PENDING 
aeb0: 6c 6f 63 6b 20 69 73 20 69 6d 70 6c 65 6d 65 6e  lock is implemen
aec0: 74 65 64 20 62 79 20 6f 62 74 61 69 6e 69 6e 67  ted by obtaining
aed0: 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 0a 20 20   a write-lock.  
aee0: 2a 2a 20 6f 6e 20 74 68 65 20 27 70 65 6e 64 69  ** on the 'pendi
aef0: 6e 67 20 62 79 74 65 27 2e 20 54 68 69 73 20 65  ng byte'. This e
af00: 6e 73 75 72 65 73 20 74 68 61 74 20 6e 6f 20 6e  nsures that no n
af10: 65 77 20 53 48 41 52 45 44 20 6c 6f 63 6b 73 20  ew SHARED locks 
af20: 63 61 6e 20 62 65 0a 20 20 2a 2a 20 6f 62 74 61  can be.  ** obta
af30: 69 6e 65 64 2c 20 62 75 74 20 65 78 69 73 74 69  ined, but existi
af40: 6e 67 20 53 48 41 52 45 44 20 6c 6f 63 6b 73 20  ng SHARED locks 
af50: 61 72 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20 70  are allowed to p
af60: 65 72 73 69 73 74 2e 20 41 20 70 72 6f 63 65 73  ersist. A proces
af70: 73 0a 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20  s.  ** does not 
af80: 68 61 76 65 20 74 6f 20 6f 62 74 61 69 6e 20 61  have to obtain a
af90: 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f   RESERVED lock o
afa0: 6e 20 74 68 65 20 77 61 79 20 74 6f 20 61 20 50  n the way to a P
afb0: 45 4e 44 49 4e 47 20 6c 6f 63 6b 2e 0a 20 20 2a  ENDING lock..  *
afc0: 2a 20 54 68 69 73 20 70 72 6f 70 65 72 74 79 20  * This property 
afd0: 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20 61  is used by the a
afe0: 6c 67 6f 72 69 74 68 6d 20 66 6f 72 20 72 6f 6c  lgorithm for rol
aff0: 6c 69 6e 67 20 62 61 63 6b 20 61 20 6a 6f 75 72  ling back a jour
b000: 6e 61 6c 20 66 69 6c 65 0a 20 20 2a 2a 20 61 66  nal file.  ** af
b010: 74 65 72 20 61 20 63 72 61 73 68 2e 0a 20 20 2a  ter a crash..  *
b020: 2a 0a 20 20 2a 2a 20 41 6e 20 45 58 43 4c 55 53  *.  ** An EXCLUS
b030: 49 56 45 20 6c 6f 63 6b 2c 20 6f 62 74 61 69 6e  IVE lock, obtain
b040: 65 64 20 61 66 74 65 72 20 61 20 50 45 4e 44 49  ed after a PENDI
b050: 4e 47 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c  NG lock is held,
b060: 20 69 73 0a 20 20 2a 2a 20 69 6d 70 6c 65 6d 65   is.  ** impleme
b070: 6e 74 65 64 20 62 79 20 6f 62 74 61 69 6e 69 6e  nted by obtainin
b080: 67 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f  g a write-lock o
b090: 6e 20 74 68 65 20 65 6e 74 69 72 65 20 27 73 68  n the entire 'sh
b0a0: 61 72 65 64 20 62 79 74 65 0a 20 20 2a 2a 20 72  ared byte.  ** r
b0b0: 61 6e 67 65 27 2e 20 53 69 6e 63 65 20 61 6c 6c  ange'. Since all
b0c0: 20 6f 74 68 65 72 20 6c 6f 63 6b 73 20 72 65 71   other locks req
b0d0: 75 69 72 65 20 61 20 72 65 61 64 2d 6c 6f 63 6b  uire a read-lock
b0e0: 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 62   on one of the b
b0f0: 79 74 65 73 0a 20 20 2a 2a 20 77 69 74 68 69 6e  ytes.  ** within
b100: 20 74 68 69 73 20 72 61 6e 67 65 2c 20 74 68 69   this range, thi
b110: 73 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 6e  s ensures that n
b120: 6f 20 6f 74 68 65 72 20 6c 6f 63 6b 73 20 61 72  o other locks ar
b130: 65 20 68 65 6c 64 20 6f 6e 20 74 68 65 0a 20 20  e held on the.  
b140: 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 0a 20 20  ** database. .  
b150: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 72 65 61 73  **.  ** The reas
b160: 6f 6e 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65  on a single byte
b170: 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 20   cannot be used 
b180: 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20 27  instead of the '
b190: 73 68 61 72 65 64 20 62 79 74 65 0a 20 20 2a 2a  shared byte.  **
b1a0: 20 72 61 6e 67 65 27 20 69 73 20 74 68 61 74 20   range' is that 
b1b0: 73 6f 6d 65 20 76 65 72 73 69 6f 6e 73 20 6f 66  some versions of
b1c0: 20 77 69 6e 64 6f 77 73 20 64 6f 20 6e 6f 74 20   windows do not 
b1d0: 73 75 70 70 6f 72 74 20 72 65 61 64 2d 6c 6f 63  support read-loc
b1e0: 6b 73 2e 20 42 79 0a 20 20 2a 2a 20 6c 6f 63 6b  ks. By.  ** lock
b1f0: 69 6e 67 20 61 20 72 61 6e 64 6f 6d 20 62 79 74  ing a random byt
b200: 65 20 66 72 6f 6d 20 61 20 72 61 6e 67 65 2c 20  e from a range, 
b210: 63 6f 6e 63 75 72 72 65 6e 74 20 53 48 41 52 45  concurrent SHARE
b220: 44 20 6c 6f 63 6b 73 20 6d 61 79 20 65 78 69 73  D locks may exis
b230: 74 0a 20 20 2a 2a 20 65 76 65 6e 20 69 66 20 74  t.  ** even if t
b240: 68 65 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69  he locking primi
b250: 74 69 76 65 20 75 73 65 64 20 69 73 20 61 6c 77  tive used is alw
b260: 61 79 73 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b  ays a write-lock
b270: 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ..  */.  int rc 
b280: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75  = SQLITE_OK;.  u
b290: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
b2a0: 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
b2b0: 20 20 73 74 72 75 63 74 20 75 6e 69 78 4c 6f 63    struct unixLoc
b2c0: 6b 49 6e 66 6f 20 2a 70 4c 6f 63 6b 20 3d 20 70  kInfo *pLock = p
b2d0: 46 69 6c 65 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 73  File->pLock;.  s
b2e0: 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b  truct flock lock
b2f0: 3b 0a 20 20 69 6e 74 20 73 20 3d 20 30 3b 0a 20  ;.  int s = 0;. 
b300: 20 69 6e 74 20 74 45 72 72 6e 6f 3b 0a 0a 20 20   int tErrno;..  
b310: 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
b320: 0a 20 20 4f 53 54 52 41 43 45 37 28 22 4c 4f 43  .  OSTRACE7("LOC
b330: 4b 20 20 20 20 25 64 20 25 73 20 77 61 73 20 25  K    %d %s was %
b340: 73 28 25 73 2c 25 64 29 20 70 69 64 3d 25 64 20  s(%s,%d) pid=%d 
b350: 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65  (unix)\n", pFile
b360: 2d 3e 68 2c 0a 20 20 20 20 20 20 6c 6f 63 6b 74  ->h,.      lockt
b370: 79 70 65 4e 61 6d 65 28 6c 6f 63 6b 74 79 70 65  ypeName(locktype
b380: 29 2c 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28  ), locktypeName(
b390: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29  pFile->locktype)
b3a0: 2c 0a 20 20 20 20 20 20 6c 6f 63 6b 74 79 70 65  ,.      locktype
b3b0: 4e 61 6d 65 28 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b  Name(pLock->lock
b3c0: 74 79 70 65 29 2c 20 70 4c 6f 63 6b 2d 3e 63 6e  type), pLock->cn
b3d0: 74 20 2c 20 67 65 74 70 69 64 28 29 29 3b 0a 0a  t , getpid());..
b3e0: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
b3f0: 20 61 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b 20   already a lock 
b400: 6f 66 20 74 68 69 73 20 74 79 70 65 20 6f 72 20  of this type or 
b410: 6d 6f 72 65 20 72 65 73 74 72 69 63 74 69 76 65  more restrictive
b420: 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 75 6e 69   on the.  ** uni
b430: 78 46 69 6c 65 2c 20 64 6f 20 6e 6f 74 68 69 6e  xFile, do nothin
b440: 67 2e 20 44 6f 6e 27 74 20 75 73 65 20 74 68 65  g. Don't use the
b450: 20 65 6e 64 5f 6c 6f 63 6b 3a 20 65 78 69 74 20   end_lock: exit 
b460: 70 61 74 68 2c 20 61 73 0a 20 20 2a 2a 20 75 6e  path, as.  ** un
b470: 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 20 68  ixEnterMutex() h
b480: 61 73 6e 27 74 20 62 65 65 6e 20 63 61 6c 6c 65  asn't been calle
b490: 64 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  d yet..  */.  if
b4a0: 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  ( pFile->locktyp
b4b0: 65 3e 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20  e>=locktype ){. 
b4c0: 20 20 20 4f 53 54 52 41 43 45 33 28 22 4c 4f 43     OSTRACE3("LOC
b4d0: 4b 20 20 20 20 25 64 20 25 73 20 6f 6b 20 28 61  K    %d %s ok (a
b4e0: 6c 72 65 61 64 79 20 68 65 6c 64 29 20 28 75 6e  lready held) (un
b4f0: 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  ix)\n", pFile->h
b500: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 6f  ,.            lo
b510: 63 6b 74 79 70 65 4e 61 6d 65 28 6c 6f 63 6b 74  cktypeName(lockt
b520: 79 70 65 29 29 3b 0a 20 20 20 20 72 65 74 75 72  ype));.    retur
b530: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
b540: 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
b550: 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 73 65 71   the locking seq
b560: 75 65 6e 63 65 20 69 73 20 63 6f 72 72 65 63 74  uence is correct
b570: 2e 0a 20 20 2a 2a 20 20 28 31 29 20 57 65 20 6e  ..  **  (1) We n
b580: 65 76 65 72 20 6d 6f 76 65 20 66 72 6f 6d 20 75  ever move from u
b590: 6e 6c 6f 63 6b 65 64 20 74 6f 20 61 6e 79 74 68  nlocked to anyth
b5a0: 69 6e 67 20 68 69 67 68 65 72 20 74 68 61 6e 20  ing higher than 
b5b0: 73 68 61 72 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a  shared lock..  *
b5c0: 2a 20 20 28 32 29 20 53 51 4c 69 74 65 20 6e 65  *  (2) SQLite ne
b5d0: 76 65 72 20 65 78 70 6c 69 63 69 74 6c 79 20 72  ver explicitly r
b5e0: 65 71 75 65 73 74 73 20 61 20 70 65 6e 64 69 67  equests a pendig
b5f0: 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28 33 29   lock..  **  (3)
b600: 20 41 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 69   A shared lock i
b610: 73 20 61 6c 77 61 79 73 20 68 65 6c 64 20 77 68  s always held wh
b620: 65 6e 20 61 20 72 65 73 65 72 76 65 20 6c 6f 63  en a reserve loc
b630: 6b 20 69 73 20 72 65 71 75 65 73 74 65 64 2e 0a  k is requested..
b640: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
b650: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 21 3d  File->locktype!=
b660: 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 6c 6f 63 6b 74  NO_LOCK || lockt
b670: 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype==SHARED_LOCK
b680: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 6f   );.  assert( lo
b690: 63 6b 74 79 70 65 21 3d 50 45 4e 44 49 4e 47 5f  cktype!=PENDING_
b6a0: 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
b6b0: 28 20 6c 6f 63 6b 74 79 70 65 21 3d 52 45 53 45  ( locktype!=RESE
b6c0: 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69  RVED_LOCK || pFi
b6d0: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 53 48  le->locktype==SH
b6e0: 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20  ARED_LOCK );..  
b6f0: 2f 2a 20 54 68 69 73 20 6d 75 74 65 78 20 69 73  /* This mutex is
b700: 20 6e 65 65 64 65 64 20 62 65 63 61 75 73 65 20   needed because 
b710: 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 20 69 73 20  pFile->pLock is 
b720: 73 68 61 72 65 64 20 61 63 72 6f 73 73 20 74 68  shared across th
b730: 72 65 61 64 73 0a 20 20 2a 2f 0a 20 20 75 6e 69  reads.  */.  uni
b740: 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 0a  xEnterMutex();..
b750: 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
b760: 68 65 20 63 75 72 72 65 6e 74 20 74 68 72 65 61  he current threa
b770: 64 20 6f 77 6e 73 20 74 68 65 20 70 46 69 6c 65  d owns the pFile
b780: 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 74 72  ..  */.  rc = tr
b790: 61 6e 73 66 65 72 4f 77 6e 65 72 73 68 69 70 28  ansferOwnership(
b7a0: 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 72 63  pFile);.  if( rc
b7b0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
b7c0: 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65     unixLeaveMute
b7d0: 78 28 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  x();.    return 
b7e0: 72 63 3b 0a 20 20 7d 0a 20 20 70 4c 6f 63 6b 20  rc;.  }.  pLock 
b7f0: 3d 20 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 3b 0a  = pFile->pLock;.
b800: 0a 20 20 2f 2a 20 49 66 20 73 6f 6d 65 20 74 68  .  /* If some th
b810: 72 65 61 64 20 75 73 69 6e 67 20 74 68 69 73 20  read using this 
b820: 50 49 44 20 68 61 73 20 61 20 6c 6f 63 6b 20 76  PID has a lock v
b830: 69 61 20 61 20 64 69 66 66 65 72 65 6e 74 20 75  ia a different u
b840: 6e 69 78 46 69 6c 65 2a 0a 20 20 2a 2a 20 68 61  nixFile*.  ** ha
b850: 6e 64 6c 65 20 74 68 61 74 20 70 72 65 63 6c 75  ndle that preclu
b860: 64 65 73 20 74 68 65 20 72 65 71 75 65 73 74 65  des the requeste
b870: 64 20 6c 6f 63 6b 2c 20 72 65 74 75 72 6e 20 42  d lock, return B
b880: 55 53 59 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  USY..  */.  if( 
b890: 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65  (pFile->locktype
b8a0: 21 3d 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70  !=pLock->locktyp
b8b0: 65 20 26 26 20 0a 20 20 20 20 20 20 20 20 20 20  e && .          
b8c0: 28 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65  (pLock->locktype
b8d0: 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 7c  >=PENDING_LOCK |
b8e0: 7c 20 6c 6f 63 6b 74 79 70 65 3e 53 48 41 52 45  | locktype>SHARE
b8f0: 44 5f 4c 4f 43 4b 29 29 0a 20 20 29 7b 0a 20 20  D_LOCK)).  ){.  
b900: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
b910: 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64  SY;.    goto end
b920: 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  _lock;.  }..  /*
b930: 20 49 66 20 61 20 53 48 41 52 45 44 20 6c 6f 63   If a SHARED loc
b940: 6b 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20  k is requested, 
b950: 61 6e 64 20 73 6f 6d 65 20 74 68 72 65 61 64 20  and some thread 
b960: 75 73 69 6e 67 20 74 68 69 73 20 50 49 44 20 61  using this PID a
b970: 6c 72 65 61 64 79 0a 20 20 2a 2a 20 68 61 73 20  lready.  ** has 
b980: 61 20 53 48 41 52 45 44 20 6f 72 20 52 45 53 45  a SHARED or RESE
b990: 52 56 45 44 20 6c 6f 63 6b 2c 20 74 68 65 6e 20  RVED lock, then 
b9a0: 69 6e 63 72 65 6d 65 6e 74 20 72 65 66 65 72 65  increment refere
b9b0: 6e 63 65 20 63 6f 75 6e 74 73 20 61 6e 64 0a 20  nce counts and. 
b9c0: 20 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54   ** return SQLIT
b9d0: 45 5f 4f 4b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  E_OK..  */.  if(
b9e0: 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45   locktype==SHARE
b9f0: 44 5f 4c 4f 43 4b 20 26 26 20 0a 20 20 20 20 20  D_LOCK && .     
ba00: 20 28 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70   (pLock->locktyp
ba10: 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c  e==SHARED_LOCK |
ba20: 7c 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70  | pLock->locktyp
ba30: 65 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  e==RESERVED_LOCK
ba40: 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ) ){.    assert(
ba50: 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45   locktype==SHARE
ba60: 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 61 73  D_LOCK );.    as
ba70: 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63  sert( pFile->loc
ba80: 6b 74 79 70 65 3d 3d 30 20 29 3b 0a 20 20 20 20  ktype==0 );.    
ba90: 61 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 63  assert( pLock->c
baa0: 6e 74 3e 30 20 29 3b 0a 20 20 20 20 70 46 69 6c  nt>0 );.    pFil
bab0: 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 53 48  e->locktype = SH
bac0: 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70  ARED_LOCK;.    p
bad0: 4c 6f 63 6b 2d 3e 63 6e 74 2b 2b 3b 0a 20 20 20  Lock->cnt++;.   
bae0: 20 70 46 69 6c 65 2d 3e 70 4f 70 65 6e 2d 3e 6e   pFile->pOpen->n
baf0: 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f  Lock++;.    goto
bb00: 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a   end_lock;.  }..
bb10: 0a 20 20 2f 2a 20 41 20 50 45 4e 44 49 4e 47 20  .  /* A PENDING 
bb20: 6c 6f 63 6b 20 69 73 20 6e 65 65 64 65 64 20 62  lock is needed b
bb30: 65 66 6f 72 65 20 61 63 71 75 69 72 69 6e 67 20  efore acquiring 
bb40: 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 61 6e  a SHARED lock an
bb50: 64 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20 61 63  d before.  ** ac
bb60: 71 75 69 72 69 6e 67 20 61 6e 20 45 58 43 4c 55  quiring an EXCLU
bb70: 53 49 56 45 20 6c 6f 63 6b 2e 20 20 46 6f 72 20  SIVE lock.  For 
bb80: 74 68 65 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c  the SHARED lock,
bb90: 20 74 68 65 20 50 45 4e 44 49 4e 47 20 77 69 6c   the PENDING wil
bba0: 6c 0a 20 20 2a 2a 20 62 65 20 72 65 6c 65 61 73  l.  ** be releas
bbb0: 65 64 2e 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b 2e  ed..  */.  lock.
bbc0: 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 20 20 6c 6f  l_len = 1L;.  lo
bbd0: 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45  ck.l_whence = SE
bbe0: 45 4b 5f 53 45 54 3b 0a 20 20 69 66 28 20 6c 6f  EK_SET;.  if( lo
bbf0: 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c  cktype==SHARED_L
bc00: 4f 43 4b 20 0a 20 20 20 20 20 20 7c 7c 20 28 6c  OCK .      || (l
bc10: 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53 49  ocktype==EXCLUSI
bc20: 56 45 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65  VE_LOCK && pFile
bc30: 2d 3e 6c 6f 63 6b 74 79 70 65 3c 50 45 4e 44 49  ->locktype<PENDI
bc40: 4e 47 5f 4c 4f 43 4b 29 0a 20 20 29 7b 0a 20 20  NG_LOCK).  ){.  
bc50: 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20    lock.l_type = 
bc60: 28 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45  (locktype==SHARE
bc70: 44 5f 4c 4f 43 4b 3f 46 5f 52 44 4c 43 4b 3a 46  D_LOCK?F_RDLCK:F
bc80: 5f 57 52 4c 43 4b 29 3b 0a 20 20 20 20 6c 6f 63  _WRLCK);.    loc
bc90: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50 45 4e 44  k.l_start = PEND
bca0: 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20 20 73 20  ING_BYTE;.    s 
bcb0: 3d 20 66 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68  = fcntl(pFile->h
bcc0: 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b  , F_SETLK, &lock
bcd0: 29 3b 0a 20 20 20 20 69 66 28 20 73 3d 3d 28 2d  );.    if( s==(-
bce0: 31 29 20 29 7b 0a 20 20 20 20 20 20 74 45 72 72  1) ){.      tErr
bcf0: 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
bd00: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72    rc = sqliteErr
bd10: 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72  orFromPosixError
bd20: 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f  (tErrno, SQLITE_
bd30: 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20  IOERR_LOCK);.   
bd40: 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
bd50: 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20  RROR(rc) ){.    
bd60: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
bd70: 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20  rrno = tErrno;. 
bd80: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74       }.      got
bd90: 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20  o end_lock;.    
bda0: 7d 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 49 66 20  }.  }...  /* If 
bdb0: 63 6f 6e 74 72 6f 6c 20 67 65 74 73 20 74 6f 20  control gets to 
bdc0: 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e  this point, then
bdd0: 20 61 63 74 75 61 6c 6c 79 20 67 6f 20 61 68 65   actually go ahe
bde0: 61 64 20 61 6e 64 20 6d 61 6b 65 0a 20 20 2a 2a  ad and make.  **
bdf0: 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
be00: 6d 20 63 61 6c 6c 73 20 66 6f 72 20 74 68 65 20  m calls for the 
be10: 73 70 65 63 69 66 69 65 64 20 6c 6f 63 6b 2e 0a  specified lock..
be20: 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74    */.  if( lockt
be30: 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype==SHARED_LOCK
be40: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
be50: 70 4c 6f 63 6b 2d 3e 63 6e 74 3d 3d 30 20 29 3b  pLock->cnt==0 );
be60: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f  .    assert( pLo
be70: 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 30 20  ck->locktype==0 
be80: 29 3b 0a 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 67  );..    /* Now g
be90: 65 74 20 74 68 65 20 72 65 61 64 2d 6c 6f 63 6b  et the read-lock
bea0: 20 2a 2f 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73   */.    lock.l_s
beb0: 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49  tart = SHARED_FI
bec0: 52 53 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  RST;.    lock.l_
bed0: 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a  len = SHARED_SIZ
bee0: 45 3b 0a 20 20 20 20 69 66 28 20 28 73 20 3d 20  E;.    if( (s = 
bef0: 66 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20  fcntl(pFile->h, 
bf00: 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 29  F_SETLK, &lock))
bf10: 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20  ==(-1) ){.      
bf20: 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
bf30: 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 44 72 6f      }.    /* Dro
bf40: 70 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  p the temporary 
bf50: 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 2a 2f 0a  PENDING lock */.
bf60: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74      lock.l_start
bf70: 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b   = PENDING_BYTE;
bf80: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20  .    lock.l_len 
bf90: 3d 20 31 4c 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c  = 1L;.    lock.l
bfa0: 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b  _type = F_UNLCK;
bfb0: 0a 20 20 20 20 69 66 28 20 66 63 6e 74 6c 28 70  .    if( fcntl(p
bfc0: 46 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b  File->h, F_SETLK
bfd0: 2c 20 26 6c 6f 63 6b 29 21 3d 30 20 29 7b 0a 20  , &lock)!=0 ){. 
bfe0: 20 20 20 20 20 69 66 28 20 73 20 21 3d 20 2d 31       if( s != -1
bff0: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
c000: 68 69 73 20 63 6f 75 6c 64 20 68 61 70 70 65 6e  his could happen
c010: 20 77 69 74 68 20 61 20 6e 65 74 77 6f 72 6b 20   with a network 
c020: 6d 6f 75 6e 74 20 2a 2f 0a 20 20 20 20 20 20 20  mount */.       
c030: 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
c040: 20 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73   .        rc = s
c050: 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
c060: 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c  sixError(tErrno,
c070: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e   SQLITE_IOERR_UN
c080: 4c 4f 43 4b 29 3b 20 0a 20 20 20 20 20 20 20 20  LOCK); .        
c090: 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  if( IS_LOCK_ERRO
c0a0: 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20  R(rc) ){.       
c0b0: 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
c0c0: 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20  rno = tErrno;.  
c0d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
c0e0: 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20  goto end_lock;. 
c0f0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
c100: 20 69 66 28 20 73 3d 3d 28 2d 31 29 20 29 7b 0a   if( s==(-1) ){.
c110: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
c120: 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45  eErrorFromPosixE
c130: 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c  rror(tErrno, SQL
c140: 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b  ITE_IOERR_LOCK);
c150: 0a 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f  .      if( IS_LO
c160: 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a  CK_ERROR(rc) ){.
c170: 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c          pFile->l
c180: 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e  astErrno = tErrn
c190: 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  o;.      }.    }
c1a0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 46 69 6c  else{.      pFil
c1b0: 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 53 48  e->locktype = SH
c1c0: 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20  ARED_LOCK;.     
c1d0: 20 70 46 69 6c 65 2d 3e 70 4f 70 65 6e 2d 3e 6e   pFile->pOpen->n
c1e0: 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 20 20 70 4c  Lock++;.      pL
c1f0: 6f 63 6b 2d 3e 63 6e 74 20 3d 20 31 3b 0a 20 20  ock->cnt = 1;.  
c200: 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
c210: 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53  locktype==EXCLUS
c220: 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70 4c 6f 63  IVE_LOCK && pLoc
c230: 6b 2d 3e 63 6e 74 3e 31 20 29 7b 0a 20 20 20 20  k->cnt>1 ){.    
c240: 2f 2a 20 57 65 20 61 72 65 20 74 72 79 69 6e 67  /* We are trying
c250: 20 66 6f 72 20 61 6e 20 65 78 63 6c 75 73 69 76   for an exclusiv
c260: 65 20 6c 6f 63 6b 20 62 75 74 20 61 6e 6f 74 68  e lock but anoth
c270: 65 72 20 74 68 72 65 61 64 20 69 6e 20 74 68 69  er thread in thi
c280: 73 0a 20 20 20 20 2a 2a 20 73 61 6d 65 20 70 72  s.    ** same pr
c290: 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20 68  ocess is still h
c2a0: 6f 6c 64 69 6e 67 20 61 20 73 68 61 72 65 64 20  olding a shared 
c2b0: 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 20 20 72 63 20  lock. */.    rc 
c2c0: 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
c2d0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
c2e0: 68 65 20 72 65 71 75 65 73 74 20 77 61 73 20 66  he request was f
c2f0: 6f 72 20 61 20 52 45 53 45 52 56 45 44 20 6f 72  or a RESERVED or
c300: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
c310: 20 20 49 74 20 69 73 0a 20 20 20 20 2a 2a 20 61    It is.    ** a
c320: 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 72  ssumed that ther
c330: 65 20 69 73 20 61 20 53 48 41 52 45 44 20 6f 72  e is a SHARED or
c340: 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e   greater lock on
c350: 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a   the file.    **
c360: 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f   already..    */
c370: 0a 20 20 20 20 61 73 73 65 72 74 28 20 30 21 3d  .    assert( 0!=
c380: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20  pFile->locktype 
c390: 29 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79  );.    lock.l_ty
c3a0: 70 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20 20  pe = F_WRLCK;.  
c3b0: 20 20 73 77 69 74 63 68 28 20 6c 6f 63 6b 74 79    switch( lockty
c3c0: 70 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65  pe ){.      case
c3d0: 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 3a 0a   RESERVED_LOCK:.
c3e0: 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73          lock.l_s
c3f0: 74 61 72 74 20 3d 20 52 45 53 45 52 56 45 44 5f  tart = RESERVED_
c400: 42 59 54 45 3b 0a 20 20 20 20 20 20 20 20 62 72  BYTE;.        br
c410: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
c420: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3a 0a  EXCLUSIVE_LOCK:.
c430: 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73          lock.l_s
c440: 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49  tart = SHARED_FI
c450: 52 53 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63  RST;.        loc
c460: 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44  k.l_len = SHARED
c470: 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20 20 20 62  _SIZE;.        b
c480: 72 65 61 6b 3b 0a 20 20 20 20 20 20 64 65 66 61  reak;.      defa
c490: 75 6c 74 3a 0a 20 20 20 20 20 20 20 20 61 73 73  ult:.        ass
c4a0: 65 72 74 28 30 29 3b 0a 20 20 20 20 7d 0a 20 20  ert(0);.    }.  
c4b0: 20 20 73 20 3d 20 66 63 6e 74 6c 28 70 46 69 6c    s = fcntl(pFil
c4c0: 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26  e->h, F_SETLK, &
c4d0: 6c 6f 63 6b 29 3b 0a 20 20 20 20 69 66 28 20 73  lock);.    if( s
c4e0: 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20  ==(-1) ){.      
c4f0: 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
c500: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
c510: 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45  eErrorFromPosixE
c520: 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c  rror(tErrno, SQL
c530: 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b  ITE_IOERR_LOCK);
c540: 0a 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f  .      if( IS_LO
c550: 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a  CK_ERROR(rc) ){.
c560: 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c          pFile->l
c570: 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e  astErrno = tErrn
c580: 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  o;.      }.    }
c590: 0a 20 20 7d 0a 20 20 0a 0a 23 69 66 6e 64 65 66  .  }.  ..#ifndef
c5a0: 20 4e 44 45 42 55 47 0a 20 20 2f 2a 20 53 65 74   NDEBUG.  /* Set
c5b0: 20 75 70 20 74 68 65 20 74 72 61 6e 73 61 63 74   up the transact
c5c0: 69 6f 6e 2d 63 6f 75 6e 74 65 72 20 63 68 61 6e  ion-counter chan
c5d0: 67 65 20 63 68 65 63 6b 69 6e 67 20 66 6c 61 67  ge checking flag
c5e0: 73 20 77 68 65 6e 0a 20 20 2a 2a 20 74 72 61 6e  s when.  ** tran
c5f0: 73 69 74 69 6f 6e 69 6e 67 20 66 72 6f 6d 20 61  sitioning from a
c600: 20 53 48 41 52 45 44 20 74 6f 20 61 20 52 45 53   SHARED to a RES
c610: 45 52 56 45 44 20 6c 6f 63 6b 2e 20 20 54 68 65  ERVED lock.  The
c620: 20 63 68 61 6e 67 65 0a 20 20 2a 2a 20 66 72 6f   change.  ** fro
c630: 6d 20 53 48 41 52 45 44 20 74 6f 20 52 45 53 45  m SHARED to RESE
c640: 52 56 45 44 20 6d 61 72 6b 73 20 74 68 65 20 62  RVED marks the b
c650: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61 20 6e 6f  eginning of a no
c660: 72 6d 61 6c 0a 20 20 2a 2a 20 77 72 69 74 65 20  rmal.  ** write 
c670: 6f 70 65 72 61 74 69 6f 6e 20 28 6e 6f 74 20 61  operation (not a
c680: 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 72 6f 6c   hot journal rol
c690: 6c 62 61 63 6b 29 2e 0a 20 20 2a 2f 0a 20 20 69  lback)..  */.  i
c6a0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
c6b0: 0a 20 20 20 26 26 20 70 46 69 6c 65 2d 3e 6c 6f  .   && pFile->lo
c6c0: 63 6b 74 79 70 65 3c 3d 53 48 41 52 45 44 5f 4c  cktype<=SHARED_L
c6d0: 4f 43 4b 0a 20 20 20 26 26 20 6c 6f 63 6b 74 79  OCK.   && lockty
c6e0: 70 65 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  pe==RESERVED_LOC
c6f0: 4b 0a 20 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  K.  ){.    pFile
c700: 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 20  ->transCntrChng 
c710: 3d 20 30 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  = 0;.    pFile->
c720: 64 62 55 70 64 61 74 65 20 3d 20 30 3b 0a 20 20  dbUpdate = 0;.  
c730: 20 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61    pFile->inNorma
c740: 6c 57 72 69 74 65 20 3d 20 31 3b 0a 20 20 7d 0a  lWrite = 1;.  }.
c750: 23 65 6e 64 69 66 0a 0a 0a 20 20 69 66 28 20 72  #endif...  if( r
c760: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
c770: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74      pFile->lockt
c780: 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a  ype = locktype;.
c790: 20 20 20 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74      pLock->lockt
c7a0: 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a  ype = locktype;.
c7b0: 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b    }else if( lock
c7c0: 74 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f  type==EXCLUSIVE_
c7d0: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c  LOCK ){.    pFil
c7e0: 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 50 45  e->locktype = PE
c7f0: 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 20 20  NDING_LOCK;.    
c800: 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 20  pLock->locktype 
c810: 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a  = PENDING_LOCK;.
c820: 20 20 7d 0a 0a 65 6e 64 5f 6c 6f 63 6b 3a 0a 20    }..end_lock:. 
c830: 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
c840: 29 3b 0a 20 20 4f 53 54 52 41 43 45 34 28 22 4c  );.  OSTRACE4("L
c850: 4f 43 4b 20 20 20 20 25 64 20 25 73 20 25 73 20  OCK    %d %s %s 
c860: 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65  (unix)\n", pFile
c870: 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70 65 4e 61 6d  ->h, locktypeNam
c880: 65 28 6c 6f 63 6b 74 79 70 65 29 2c 20 0a 20 20  e(locktype), .  
c890: 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f      rc==SQLITE_O
c8a0: 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c  K ? "ok" : "fail
c8b0: 65 64 22 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ed");.  return r
c8c0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  c;.}../*.** Clos
c8d0: 65 20 61 6c 6c 20 66 69 6c 65 20 64 65 73 63 72  e all file descr
c8e0: 69 70 74 6f 72 73 20 61 63 63 75 6d 75 61 74 65  iptors accumuate
c8f0: 64 20 69 6e 20 74 68 65 20 75 6e 69 78 4f 70 65  d in the unixOpe
c900: 6e 43 6e 74 2d 3e 70 55 6e 75 73 65 64 20 6c 69  nCnt->pUnused li
c910: 73 74 2e 0a 2a 2a 20 49 66 20 61 6c 6c 20 73 75  st..** If all su
c920: 63 68 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ch file descript
c930: 6f 72 73 20 61 72 65 20 63 6c 6f 73 65 64 20 77  ors are closed w
c940: 69 74 68 6f 75 74 20 65 72 72 6f 72 2c 20 74 68  ithout error, th
c950: 65 20 6c 69 73 74 20 69 73 0a 2a 2a 20 63 6c 65  e list is.** cle
c960: 61 72 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f  ared and SQLITE_
c970: 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  OK returned..**.
c980: 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  ** Otherwise, if
c990: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
c9a0: 2c 20 74 68 65 6e 20 73 75 63 63 65 73 73 66 75  , then successfu
c9b0: 6c 6c 79 20 63 6c 6f 73 65 64 20 66 69 6c 65 20  lly closed file 
c9c0: 64 65 73 63 72 69 70 74 6f 72 0a 2a 2a 20 65 6e  descriptor.** en
c9d0: 74 72 69 65 73 20 61 72 65 20 72 65 6d 6f 76 65  tries are remove
c9e0: 64 20 66 72 6f 6d 20 74 68 65 20 6c 69 73 74 2c  d from the list,
c9f0: 20 61 6e 64 20 53 51 4c 49 54 45 5f 49 4f 45 52   and SQLITE_IOER
ca00: 52 5f 43 4c 4f 53 45 20 72 65 74 75 72 6e 65 64  R_CLOSE returned
ca10: 2e 20 0a 2a 2a 20 6e 6f 74 20 64 65 6c 65 74 65  . .** not delete
ca20: 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 49 4f 45  d and SQLITE_IOE
ca30: 52 52 5f 43 4c 4f 53 45 20 72 65 74 75 72 6e 65  RR_CLOSE returne
ca40: 64 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 69 6e  d..*/ .static in
ca50: 74 20 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64  t closePendingFd
ca60: 73 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c  s(unixFile *pFil
ca70: 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  e){.  int rc = S
ca80: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73 74 72 75  QLITE_OK;.  stru
ca90: 63 74 20 75 6e 69 78 4f 70 65 6e 43 6e 74 20 2a  ct unixOpenCnt *
caa0: 70 4f 70 65 6e 20 3d 20 70 46 69 6c 65 2d 3e 70  pOpen = pFile->p
cab0: 4f 70 65 6e 3b 0a 20 20 55 6e 69 78 55 6e 75 73  Open;.  UnixUnus
cac0: 65 64 46 64 20 2a 70 45 72 72 6f 72 20 3d 20 30  edFd *pError = 0
cad0: 3b 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64  ;.  UnixUnusedFd
cae0: 20 2a 70 3b 0a 20 20 55 6e 69 78 55 6e 75 73 65   *p;.  UnixUnuse
caf0: 64 46 64 20 2a 70 4e 65 78 74 3b 0a 20 20 66 6f  dFd *pNext;.  fo
cb00: 72 28 70 3d 70 4f 70 65 6e 2d 3e 70 55 6e 75 73  r(p=pOpen->pUnus
cb10: 65 64 3b 20 70 3b 20 70 3d 70 4e 65 78 74 29 7b  ed; p; p=pNext){
cb20: 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e  .    pNext = p->
cb30: 70 4e 65 78 74 3b 0a 20 20 20 20 69 66 28 20 63  pNext;.    if( c
cb40: 6c 6f 73 65 28 70 2d 3e 66 64 29 20 29 7b 0a 20  lose(p->fd) ){. 
cb50: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
cb60: 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
cb70: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
cb80: 5f 49 4f 45 52 52 5f 43 4c 4f 53 45 3b 0a 20 20  _IOERR_CLOSE;.  
cb90: 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70      p->pNext = p
cba0: 45 72 72 6f 72 3b 0a 20 20 20 20 20 20 70 45 72  Error;.      pEr
cbb0: 72 6f 72 20 3d 20 70 3b 0a 20 20 20 20 7d 65 6c  ror = p;.    }el
cbc0: 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
cbd0: 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 7d  3_free(p);.    }
cbe0: 0a 20 20 7d 0a 20 20 70 4f 70 65 6e 2d 3e 70 55  .  }.  pOpen->pU
cbf0: 6e 75 73 65 64 20 3d 20 70 45 72 72 6f 72 3b 0a  nused = pError;.
cc00: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
cc10: 2f 2a 0a 2a 2a 20 41 64 64 20 74 68 65 20 66 69  /*.** Add the fi
cc20: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 75 73  le descriptor us
cc30: 65 64 20 62 79 20 66 69 6c 65 20 68 61 6e 64 6c  ed by file handl
cc40: 65 20 70 46 69 6c 65 20 74 6f 20 74 68 65 20 63  e pFile to the c
cc50: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20  orresponding.** 
cc60: 70 55 6e 75 73 65 64 20 6c 69 73 74 2e 0a 2a 2f  pUnused list..*/
cc70: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74  .static void set
cc80: 50 65 6e 64 69 6e 67 46 64 28 75 6e 69 78 46 69  PendingFd(unixFi
cc90: 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 73 74  le *pFile){.  st
cca0: 72 75 63 74 20 75 6e 69 78 4f 70 65 6e 43 6e 74  ruct unixOpenCnt
ccb0: 20 2a 70 4f 70 65 6e 20 3d 20 70 46 69 6c 65 2d   *pOpen = pFile-
ccc0: 3e 70 4f 70 65 6e 3b 0a 20 20 55 6e 69 78 55 6e  >pOpen;.  UnixUn
ccd0: 75 73 65 64 46 64 20 2a 70 20 3d 20 70 46 69 6c  usedFd *p = pFil
cce0: 65 2d 3e 70 55 6e 75 73 65 64 3b 0a 20 20 70 2d  e->pUnused;.  p-
ccf0: 3e 70 4e 65 78 74 20 3d 20 70 4f 70 65 6e 2d 3e  >pNext = pOpen->
cd00: 70 55 6e 75 73 65 64 3b 0a 20 20 70 4f 70 65 6e  pUnused;.  pOpen
cd10: 2d 3e 70 55 6e 75 73 65 64 20 3d 20 70 3b 0a 20  ->pUnused = p;. 
cd20: 20 70 46 69 6c 65 2d 3e 68 20 3d 20 2d 31 3b 0a   pFile->h = -1;.
cd30: 20 20 70 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64    pFile->pUnused
cd40: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c   = 0;.}../*.** L
cd50: 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67  ower the locking
cd60: 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64   level on file d
cd70: 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20  escriptor pFile 
cd80: 74 6f 20 6c 6f 63 6b 74 79 70 65 2e 20 20 6c 6f  to locktype.  lo
cd90: 63 6b 74 79 70 65 0a 2a 2a 20 6d 75 73 74 20 62  cktype.** must b
cda0: 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b  e either NO_LOCK
cdb0: 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e   or SHARED_LOCK.
cdc0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f  .**.** If the lo
cdd0: 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74  cking level of t
cde0: 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
cdf0: 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74  or is already at
ce00: 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65   or below.** the
ce10: 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69   requested locki
ce20: 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72  ng level, this r
ce30: 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
ce40: 70 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 68 61 6e  p..** .** If han
ce50: 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 20 69 73 20  dleNFSUnlock is 
ce60: 74 72 75 65 2c 20 74 68 65 6e 20 6f 6e 20 64 6f  true, then on do
ce70: 77 6e 67 72 61 64 69 6e 67 20 61 6e 20 45 58 43  wngrading an EXC
ce80: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 74 6f 20 53  LUSIVE_LOCK to S
ce90: 48 41 52 45 44 0a 2a 2a 20 74 68 65 20 62 79 74  HARED.** the byt
cea0: 65 20 72 61 6e 67 65 20 69 73 20 64 69 76 69 64  e range is divid
ceb0: 65 64 20 69 6e 74 6f 20 32 20 70 61 72 74 73 20  ed into 2 parts 
cec0: 61 6e 64 20 74 68 65 20 66 69 72 73 74 20 70 61  and the first pa
ced0: 72 74 20 69 73 20 75 6e 6c 6f 63 6b 65 64 20 74  rt is unlocked t
cee0: 68 65 6e 0a 2a 2a 20 73 65 74 20 74 6f 20 61 20  hen.** set to a 
cef0: 72 65 61 64 20 6c 6f 63 6b 2c 20 74 68 65 6e 20  read lock, then 
cf00: 74 68 65 20 6f 74 68 65 72 20 70 61 72 74 20 69  the other part i
cf10: 73 20 73 69 6d 70 6c 79 20 75 6e 6c 6f 63 6b 65  s simply unlocke
cf20: 64 2e 20 20 54 68 69 73 20 77 6f 72 6b 73 20 0a  d.  This works .
cf30: 2a 2a 20 61 72 6f 75 6e 64 20 61 20 62 75 67 20  ** around a bug 
cf40: 69 6e 20 42 53 44 20 4e 46 53 20 6c 6f 63 6b 64  in BSD NFS lockd
cf50: 20 28 61 6c 73 6f 20 73 65 65 6e 20 6f 6e 20 4d   (also seen on M
cf60: 61 63 4f 53 58 20 31 30 2e 33 2b 29 20 74 68 61  acOSX 10.3+) tha
cf70: 74 20 66 61 69 6c 73 20 74 6f 20 0a 2a 2a 20 72  t fails to .** r
cf80: 65 6d 6f 76 65 20 74 68 65 20 77 72 69 74 65 20  emove the write 
cf90: 6c 6f 63 6b 20 6f 6e 20 61 20 72 65 67 69 6f 6e  lock on a region
cfa0: 20 77 68 65 6e 20 61 20 72 65 61 64 20 6c 6f 63   when a read loc
cfb0: 6b 20 69 73 20 73 65 74 2e 0a 2a 2f 0a 73 74 61  k is set..*/.sta
cfc0: 74 69 63 20 69 6e 74 20 5f 70 6f 73 69 78 55 6e  tic int _posixUn
cfd0: 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  lock(sqlite3_fil
cfe0: 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74  e *id, int lockt
cff0: 79 70 65 2c 20 69 6e 74 20 68 61 6e 64 6c 65 4e  ype, int handleN
d000: 46 53 55 6e 6c 6f 63 6b 29 7b 0a 20 20 75 6e 69  FSUnlock){.  uni
d010: 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
d020: 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
d030: 73 74 72 75 63 74 20 75 6e 69 78 4c 6f 63 6b 49  struct unixLockI
d040: 6e 66 6f 20 2a 70 4c 6f 63 6b 3b 0a 20 20 73 74  nfo *pLock;.  st
d050: 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b  ruct flock lock;
d060: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
d070: 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 68 3b 0a  TE_OK;.  int h;.
d080: 20 20 69 6e 74 20 74 45 72 72 6e 6f 3b 20 20 20    int tErrno;   
d090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d0a0: 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65     /* Error code
d0b0: 20 66 72 6f 6d 20 73 79 73 74 65 6d 20 63 61 6c   from system cal
d0c0: 6c 20 65 72 72 6f 72 73 20 2a 2f 0a 0a 20 20 61  l errors */..  a
d0d0: 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
d0e0: 20 20 4f 53 54 52 41 43 45 37 28 22 55 4e 4c 4f    OSTRACE7("UNLO
d0f0: 43 4b 20 20 25 64 20 25 64 20 77 61 73 20 25 64  CK  %d %d was %d
d100: 28 25 64 2c 25 64 29 20 70 69 64 3d 25 64 20 28  (%d,%d) pid=%d (
d110: 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  unix)\n", pFile-
d120: 3e 68 2c 20 6c 6f 63 6b 74 79 70 65 2c 0a 20 20  >h, locktype,.  
d130: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74      pFile->lockt
d140: 79 70 65 2c 20 70 46 69 6c 65 2d 3e 70 4c 6f 63  ype, pFile->pLoc
d150: 6b 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 70 46 69  k->locktype, pFi
d160: 6c 65 2d 3e 70 4c 6f 63 6b 2d 3e 63 6e 74 2c 20  le->pLock->cnt, 
d170: 67 65 74 70 69 64 28 29 29 3b 0a 0a 20 20 61 73  getpid());..  as
d180: 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 3c 3d  sert( locktype<=
d190: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
d1a0: 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b   if( pFile->lock
d1b0: 74 79 70 65 3c 3d 6c 6f 63 6b 74 79 70 65 20 29  type<=locktype )
d1c0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
d1d0: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66  ITE_OK;.  }.  if
d1e0: 28 20 43 48 45 43 4b 5f 54 48 52 45 41 44 49 44  ( CHECK_THREADID
d1f0: 28 70 46 69 6c 65 29 20 29 7b 0a 20 20 20 20 72  (pFile) ){.    r
d200: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
d210: 55 53 45 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 45  USE;.  }.  unixE
d220: 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 68  nterMutex();.  h
d230: 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 20 20 70   = pFile->h;.  p
d240: 4c 6f 63 6b 20 3d 20 70 46 69 6c 65 2d 3e 70 4c  Lock = pFile->pL
d250: 6f 63 6b 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ock;.  assert( p
d260: 4c 6f 63 6b 2d 3e 63 6e 74 21 3d 30 20 29 3b 0a  Lock->cnt!=0 );.
d270: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63    if( pFile->loc
d280: 6b 74 79 70 65 3e 53 48 41 52 45 44 5f 4c 4f 43  ktype>SHARED_LOC
d290: 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  K ){.    assert(
d2a0: 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65   pLock->locktype
d2b0: 3d 3d 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  ==pFile->locktyp
d2c0: 65 20 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74  e );.    Simulat
d2d0: 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31  eIOErrorBenign(1
d2e0: 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49  );.    SimulateI
d2f0: 4f 45 72 72 6f 72 28 20 68 3d 28 2d 31 29 20 29  OError( h=(-1) )
d300: 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  .    SimulateIOE
d310: 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 0a  rrorBenign(0);..
d320: 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
d330: 20 20 20 2f 2a 20 57 68 65 6e 20 72 65 64 75 63     /* When reduc
d340: 69 6e 67 20 61 20 6c 6f 63 6b 20 73 75 63 68 20  ing a lock such 
d350: 74 68 61 74 20 6f 74 68 65 72 20 70 72 6f 63 65  that other proce
d360: 73 73 65 73 20 63 61 6e 20 73 74 61 72 74 0a 20  sses can start. 
d370: 20 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 74 68     ** reading th
d380: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
d390: 61 67 61 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65  again, make sure
d3a0: 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 2a 2a   that the.    **
d3b0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
d3c0: 6e 74 65 72 20 77 61 73 20 75 70 64 61 74 65 64  nter was updated
d3d0: 20 69 66 20 61 6e 79 20 70 61 72 74 20 6f 66 20   if any part of 
d3e0: 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20  the database.   
d3f0: 20 2a 2a 20 66 69 6c 65 20 63 68 61 6e 67 65 64   ** file changed
d400: 2e 20 20 49 66 20 74 68 65 20 74 72 61 6e 73 61  .  If the transa
d410: 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 69 73  ction counter is
d420: 20 6e 6f 74 20 75 70 64 61 74 65 64 2c 0a 20 20   not updated,.  
d430: 20 20 2a 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65    ** other conne
d440: 63 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 73 61  ctions to the sa
d450: 6d 65 20 66 69 6c 65 20 6d 69 67 68 74 20 6e 6f  me file might no
d460: 74 20 72 65 61 6c 69 7a 65 20 74 68 61 74 0a 20  t realize that. 
d470: 20 20 20 2a 2a 20 74 68 65 20 66 69 6c 65 20 68     ** the file h
d480: 61 73 20 63 68 61 6e 67 65 64 20 61 6e 64 20 68  as changed and h
d490: 65 6e 63 65 20 6d 69 67 68 74 20 6e 6f 74 20 6b  ence might not k
d4a0: 6e 6f 77 20 74 6f 20 66 6c 75 73 68 20 74 68 65  now to flush the
d4b0: 69 72 0a 20 20 20 20 2a 2a 20 63 61 63 68 65 2e  ir.    ** cache.
d4c0: 20 20 54 68 65 20 75 73 65 20 6f 66 20 61 20 73    The use of a s
d4d0: 74 61 6c 65 20 63 61 63 68 65 20 63 61 6e 20 6c  tale cache can l
d4e0: 65 61 64 20 74 6f 20 64 61 74 61 62 61 73 65 20  ead to database 
d4f0: 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20  corruption..    
d500: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
d510: 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72  File->inNormalWr
d520: 69 74 65 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  ite==0.         
d530: 7c 7c 20 70 46 69 6c 65 2d 3e 64 62 55 70 64 61  || pFile->dbUpda
d540: 74 65 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 7c  te==0.         |
d550: 7c 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e  | pFile->transCn
d560: 74 72 43 68 6e 67 3d 3d 31 20 29 3b 0a 20 20 20  trChng==1 );.   
d570: 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c   pFile->inNormal
d580: 57 72 69 74 65 20 3d 20 30 3b 0a 23 65 6e 64 69  Write = 0;.#endi
d590: 66 0a 0a 20 20 20 20 2f 2a 20 64 6f 77 6e 67 72  f..    /* downgr
d5a0: 61 64 69 6e 67 20 74 6f 20 61 20 73 68 61 72 65  ading to a share
d5b0: 64 20 6c 6f 63 6b 20 6f 6e 20 4e 46 53 20 69 6e  d lock on NFS in
d5c0: 76 6f 6c 76 65 73 20 63 6c 65 61 72 69 6e 67 20  volves clearing 
d5d0: 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 0a 20  the write lock. 
d5e0: 20 20 20 20 2a 2a 20 62 65 66 6f 72 65 20 65 73      ** before es
d5f0: 74 61 62 6c 69 73 68 69 6e 67 20 74 68 65 20 72  tablishing the r
d600: 65 61 64 6c 6f 63 6b 20 2d 20 74 6f 20 61 76 6f  eadlock - to avo
d610: 69 64 20 61 20 72 61 63 65 20 63 6f 6e 64 69 74  id a race condit
d620: 69 6f 6e 20 77 65 20 64 6f 77 6e 67 72 61 64 65  ion we downgrade
d630: 0a 20 20 20 20 20 2a 2a 20 74 68 65 20 6c 6f 63  .     ** the loc
d640: 6b 20 69 6e 20 32 20 62 6c 6f 63 6b 73 2c 20 73  k in 2 blocks, s
d650: 6f 20 74 68 61 74 20 70 61 72 74 20 6f 66 20 74  o that part of t
d660: 68 65 20 72 61 6e 67 65 20 77 69 6c 6c 20 62 65  he range will be
d670: 20 63 6f 76 65 72 65 64 20 62 79 20 61 20 0a 20   covered by a . 
d680: 20 20 20 20 2a 2a 20 77 72 69 74 65 20 6c 6f 63      ** write loc
d690: 6b 20 75 6e 74 69 6c 20 74 68 65 20 72 65 73 74  k until the rest
d6a0: 20 69 73 20 63 6f 76 65 72 65 64 20 62 79 20 61   is covered by a
d6b0: 20 72 65 61 64 20 6c 6f 63 6b 3a 0a 20 20 20 20   read lock:.    
d6c0: 20 2a 2a 20 20 31 3a 20 20 20 5b 57 57 57 57 57   **  1:   [WWWWW
d6d0: 5d 0a 20 20 20 20 20 2a 2a 20 20 32 3a 20 20 20  ].     **  2:   
d6e0: 5b 2e 2e 2e 2e 57 5d 0a 20 20 20 20 20 2a 2a 20  [....W].     ** 
d6f0: 20 33 3a 20 20 20 5b 52 52 52 52 57 5d 0a 20 20   3:   [RRRRW].  
d700: 20 20 20 2a 2a 20 20 34 3a 20 20 20 5b 52 52 52     **  4:   [RRR
d710: 52 2e 5d 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20  R.].     */.    
d720: 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48  if( locktype==SH
d730: 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
d740: 20 20 20 69 66 28 20 68 61 6e 64 6c 65 4e 46 53     if( handleNFS
d750: 55 6e 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20  Unlock ){.      
d760: 20 20 6f 66 66 5f 74 20 64 69 76 53 69 7a 65 20    off_t divSize 
d770: 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 20 2d 20  = SHARED_SIZE - 
d780: 31 3b 0a 20 20 20 20 20 20 20 20 0a 20 20 20 20  1;.        .    
d790: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20      lock.l_type 
d7a0: 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 20  = F_UNLCK;.     
d7b0: 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65     lock.l_whence
d7c0: 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20   = SEEK_SET;.   
d7d0: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72       lock.l_star
d7e0: 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54  t = SHARED_FIRST
d7f0: 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  ;.        lock.l
d800: 5f 6c 65 6e 20 3d 20 64 69 76 53 69 7a 65 3b 0a  _len = divSize;.
d810: 20 20 20 20 20 20 20 20 69 66 28 20 66 63 6e 74          if( fcnt
d820: 6c 28 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c  l(h, F_SETLK, &l
d830: 6f 63 6b 29 3d 3d 28 2d 31 29 20 29 7b 0a 20 20  ock)==(-1) ){.  
d840: 20 20 20 20 20 20 20 20 69 6e 74 20 74 45 72 72          int tErr
d850: 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
d860: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
d870: 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45  eErrorFromPosixE
d880: 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c  rror(tErrno, SQL
d890: 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
d8a0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
d8b0: 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72   IS_LOCK_ERROR(r
d8c0: 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  c) ){.          
d8d0: 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
d8e0: 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20  no = tErrno;.   
d8f0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
d900: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f     goto end_unlo
d910: 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ck;.        }.  
d920: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70        lock.l_typ
d930: 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 20  e = F_RDLCK;.   
d940: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e       lock.l_when
d950: 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20  ce = SEEK_SET;. 
d960: 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74         lock.l_st
d970: 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52  art = SHARED_FIR
d980: 53 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b  ST;.        lock
d990: 2e 6c 5f 6c 65 6e 20 3d 20 64 69 76 53 69 7a 65  .l_len = divSize
d9a0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 66 63  ;.        if( fc
d9b0: 6e 74 6c 28 68 2c 20 46 5f 53 45 54 4c 4b 2c 20  ntl(h, F_SETLK, 
d9c0: 26 6c 6f 63 6b 29 3d 3d 28 2d 31 29 20 29 7b 0a  &lock)==(-1) ){.
d9d0: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 74 45            int tE
d9e0: 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
d9f0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
da00: 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
da10: 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53  xError(tErrno, S
da20: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f  QLITE_IOERR_RDLO
da30: 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  CK);.          i
da40: 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
da50: 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20  (rc) ){.        
da60: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
da70: 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20  rrno = tErrno;. 
da80: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
da90: 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e       goto end_un
daa0: 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  lock;.        }.
dab0: 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74          lock.l_t
dac0: 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20  ype = F_UNLCK;. 
dad0: 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68         lock.l_wh
dae0: 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b  ence = SEEK_SET;
daf0: 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  .        lock.l_
db00: 73 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46  start = SHARED_F
db10: 49 52 53 54 2b 64 69 76 53 69 7a 65 3b 0a 20 20  IRST+divSize;.  
db20: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e        lock.l_len
db30: 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 2d 64   = SHARED_SIZE-d
db40: 69 76 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20  ivSize;.        
db50: 69 66 28 20 66 63 6e 74 6c 28 68 2c 20 46 5f 53  if( fcntl(h, F_S
db60: 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3d 3d 28 2d  ETLK, &lock)==(-
db70: 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  1) ){.          
db80: 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72  int tErrno = err
db90: 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  no;.          rc
dba0: 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
dbb0: 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
dbc0: 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
dbd0: 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  R_UNLOCK);.     
dbe0: 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b       if( IS_LOCK
dbf0: 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20  _ERROR(rc) ){.  
dc00: 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
dc10: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72  >lastErrno = tEr
dc20: 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  rno;.          }
dc30: 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
dc40: 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20  end_unlock;.    
dc50: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
dc60: 65 7b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e  e{.        lock.
dc70: 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b  l_type = F_RDLCK
dc80: 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  ;.        lock.l
dc90: 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
dca0: 45 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b  ET;.        lock
dcb0: 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45  .l_start = SHARE
dcc0: 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20 20  D_FIRST;.       
dcd0: 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48   lock.l_len = SH
dce0: 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20 20  ARED_SIZE;.     
dcf0: 20 20 20 69 66 28 20 66 63 6e 74 6c 28 68 2c 20     if( fcntl(h, 
dd00: 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3d  F_SETLK, &lock)=
dd10: 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20  =(-1) ){.       
dd20: 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20     int tErrno = 
dd30: 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20  errno;.         
dd40: 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f   rc = sqliteErro
dd50: 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28  rFromPosixError(
dd60: 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49  tErrno, SQLITE_I
dd70: 4f 45 52 52 5f 52 44 4c 4f 43 4b 29 3b 0a 20 20  OERR_RDLOCK);.  
dd80: 20 20 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c          if( IS_L
dd90: 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b  OCK_ERROR(rc) ){
dda0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 46 69  .            pFi
ddb0: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
ddc0: 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20  tErrno;.        
ddd0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 67 6f    }.          go
dde0: 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20  to end_unlock;. 
ddf0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
de00: 0a 20 20 20 20 7d 0a 20 20 20 20 6c 6f 63 6b 2e  .    }.    lock.
de10: 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b  l_type = F_UNLCK
de20: 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65  ;.    lock.l_whe
de30: 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a  nce = SEEK_SET;.
de40: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74      lock.l_start
de50: 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b   = PENDING_BYTE;
de60: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20  .    lock.l_len 
de70: 3d 20 32 4c 3b 20 20 61 73 73 65 72 74 28 20 50  = 2L;  assert( P
de80: 45 4e 44 49 4e 47 5f 42 59 54 45 2b 31 3d 3d 52  ENDING_BYTE+1==R
de90: 45 53 45 52 56 45 44 5f 42 59 54 45 20 29 3b 0a  ESERVED_BYTE );.
dea0: 20 20 20 20 69 66 28 20 66 63 6e 74 6c 28 68 2c      if( fcntl(h,
deb0: 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29   F_SETLK, &lock)
dec0: 21 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20  !=(-1) ){.      
ded0: 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 20  pLock->locktype 
dee0: 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20  = SHARED_LOCK;. 
def0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
df00: 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
df10: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
df20: 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45  eErrorFromPosixE
df30: 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c  rror(tErrno, SQL
df40: 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
df50: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 49 53 5f  );.      if( IS_
df60: 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29  LOCK_ERROR(rc) )
df70: 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d  {.        pFile-
df80: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72  >lastErrno = tEr
df90: 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rno;.      }.   
dfa0: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f     goto end_unlo
dfb0: 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ck;.    }.  }.  
dfc0: 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f  if( locktype==NO
dfd0: 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 73 74 72  _LOCK ){.    str
dfe0: 75 63 74 20 75 6e 69 78 4f 70 65 6e 43 6e 74 20  uct unixOpenCnt 
dff0: 2a 70 4f 70 65 6e 3b 0a 0a 20 20 20 20 2f 2a 20  *pOpen;..    /* 
e000: 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 73 68  Decrement the sh
e010: 61 72 65 64 20 6c 6f 63 6b 20 63 6f 75 6e 74 65  ared lock counte
e020: 72 2e 20 20 52 65 6c 65 61 73 65 20 74 68 65 20  r.  Release the 
e030: 6c 6f 63 6b 20 75 73 69 6e 67 20 61 6e 0a 20 20  lock using an.  
e040: 20 20 2a 2a 20 4f 53 20 63 61 6c 6c 20 6f 6e 6c    ** OS call onl
e050: 79 20 77 68 65 6e 20 61 6c 6c 20 74 68 72 65 61  y when all threa
e060: 64 73 20 69 6e 20 74 68 69 73 20 73 61 6d 65 20  ds in this same 
e070: 70 72 6f 63 65 73 73 20 68 61 76 65 20 72 65 6c  process have rel
e080: 65 61 73 65 64 0a 20 20 20 20 2a 2a 20 74 68 65  eased.    ** the
e090: 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20   lock..    */.  
e0a0: 20 20 70 4c 6f 63 6b 2d 3e 63 6e 74 2d 2d 3b 0a    pLock->cnt--;.
e0b0: 20 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 63      if( pLock->c
e0c0: 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6c  nt==0 ){.      l
e0d0: 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55  ock.l_type = F_U
e0e0: 4e 4c 43 4b 3b 0a 20 20 20 20 20 20 6c 6f 63 6b  NLCK;.      lock
e0f0: 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b  .l_whence = SEEK
e100: 5f 53 45 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b  _SET;.      lock
e110: 2e 6c 5f 73 74 61 72 74 20 3d 20 6c 6f 63 6b 2e  .l_start = lock.
e120: 6c 5f 6c 65 6e 20 3d 20 30 4c 3b 0a 20 20 20 20  l_len = 0L;.    
e130: 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
e140: 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20  rBenign(1);.    
e150: 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
e160: 72 28 20 68 3d 28 2d 31 29 20 29 0a 20 20 20 20  r( h=(-1) ).    
e170: 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
e180: 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20  rBenign(0);.    
e190: 20 20 69 66 28 20 66 63 6e 74 6c 28 68 2c 20 46    if( fcntl(h, F
e1a0: 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 21 3d  _SETLK, &lock)!=
e1b0: 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20  (-1) ){.        
e1c0: 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 20  pLock->locktype 
e1d0: 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20  = NO_LOCK;.     
e1e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
e1f0: 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
e200: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
e210: 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
e220: 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53  xError(tErrno, S
e230: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
e240: 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  CK);.        if(
e250: 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72   IS_LOCK_ERROR(r
e260: 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  c) ){.          
e270: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
e280: 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20   = tErrno;.     
e290: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 4c 6f     }.        pLo
e2a0: 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 4e  ck->locktype = N
e2b0: 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20  O_LOCK;.        
e2c0: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20  pFile->locktype 
e2d0: 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20  = NO_LOCK;.     
e2e0: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
e2f0: 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 63   Decrement the c
e300: 6f 75 6e 74 20 6f 66 20 6c 6f 63 6b 73 20 61 67  ount of locks ag
e310: 61 69 6e 73 74 20 74 68 69 73 20 73 61 6d 65 20  ainst this same 
e320: 66 69 6c 65 2e 20 20 57 68 65 6e 20 74 68 65 0a  file.  When the.
e330: 20 20 20 20 2a 2a 20 63 6f 75 6e 74 20 72 65 61      ** count rea
e340: 63 68 65 73 20 7a 65 72 6f 2c 20 63 6c 6f 73 65  ches zero, close
e350: 20 61 6e 79 20 6f 74 68 65 72 20 66 69 6c 65 20   any other file 
e360: 64 65 73 63 72 69 70 74 6f 72 73 20 77 68 6f 73  descriptors whos
e370: 65 20 63 6c 6f 73 65 0a 20 20 20 20 2a 2a 20 77  e close.    ** w
e380: 61 73 20 64 65 66 65 72 72 65 64 20 62 65 63 61  as deferred beca
e390: 75 73 65 20 6f 66 20 6f 75 74 73 74 61 6e 64 69  use of outstandi
e3a0: 6e 67 20 6c 6f 63 6b 73 2e 0a 20 20 20 20 2a 2f  ng locks..    */
e3b0: 0a 20 20 20 20 70 4f 70 65 6e 20 3d 20 70 46 69  .    pOpen = pFi
e3c0: 6c 65 2d 3e 70 4f 70 65 6e 3b 0a 20 20 20 20 70  le->pOpen;.    p
e3d0: 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 2d 2d 3b 0a 20  Open->nLock--;. 
e3e0: 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 65 6e     assert( pOpen
e3f0: 2d 3e 6e 4c 6f 63 6b 3e 3d 30 20 29 3b 0a 20 20  ->nLock>=0 );.  
e400: 20 20 69 66 28 20 70 4f 70 65 6e 2d 3e 6e 4c 6f    if( pOpen->nLo
e410: 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ck==0 ){.      i
e420: 6e 74 20 72 63 32 20 3d 20 63 6c 6f 73 65 50 65  nt rc2 = closePe
e430: 6e 64 69 6e 67 46 64 73 28 70 46 69 6c 65 29 3b  ndingFds(pFile);
e440: 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
e450: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
e460: 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20      rc = rc2;.  
e470: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
e480: 09 0a 65 6e 64 5f 75 6e 6c 6f 63 6b 3a 0a 20 20  ..end_unlock:.  
e490: 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
e4a0: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
e4b0: 54 45 5f 4f 4b 20 29 20 70 46 69 6c 65 2d 3e 6c  TE_OK ) pFile->l
e4c0: 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79  ocktype = lockty
e4d0: 70 65 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  pe;.  return rc;
e4e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20  .}../*.** Lower 
e4f0: 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
e500: 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69  l on file descri
e510: 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 6c 6f  ptor pFile to lo
e520: 63 6b 74 79 70 65 2e 20 20 6c 6f 63 6b 74 79 70  cktype.  locktyp
e530: 65 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74  e.** must be eit
e540: 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53  her NO_LOCK or S
e550: 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a  HARED_LOCK..**.*
e560: 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67  * If the locking
e570: 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69   level of the fi
e580: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73  le descriptor is
e590: 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62   already at or b
e5a0: 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75  elow.** the requ
e5b0: 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65  ested locking le
e5c0: 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  vel, this routin
e5d0: 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  e is a no-op..*/
e5e0: 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
e5f0: 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  Unlock(sqlite3_f
e600: 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63  ile *id, int loc
e610: 6b 74 79 70 65 29 7b 0a 20 20 72 65 74 75 72 6e  ktype){.  return
e620: 20 5f 70 6f 73 69 78 55 6e 6c 6f 63 6b 28 69 64   _posixUnlock(id
e630: 2c 20 6c 6f 63 6b 74 79 70 65 2c 20 30 29 3b 0a  , locktype, 0);.
e640: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
e650: 6e 63 74 69 6f 6e 20 70 65 72 66 6f 72 6d 73 20  nction performs 
e660: 74 68 65 20 70 61 72 74 73 20 6f 66 20 74 68 65  the parts of the
e670: 20 22 63 6c 6f 73 65 20 66 69 6c 65 22 20 6f 70   "close file" op
e680: 65 72 61 74 69 6f 6e 20 0a 2a 2a 20 63 6f 6d 6d  eration .** comm
e690: 6f 6e 20 74 6f 20 61 6c 6c 20 6c 6f 63 6b 69 6e  on to all lockin
e6a0: 67 20 73 63 68 65 6d 65 73 2e 20 49 74 20 63 6c  g schemes. It cl
e6b0: 6f 73 65 73 20 74 68 65 20 64 69 72 65 63 74 6f  oses the directo
e6c0: 72 79 20 61 6e 64 20 66 69 6c 65 0a 2a 2a 20 68  ry and file.** h
e6d0: 61 6e 64 6c 65 73 2c 20 69 66 20 74 68 65 79 20  andles, if they 
e6e0: 61 72 65 20 76 61 6c 69 64 2c 20 61 6e 64 20 73  are valid, and s
e6f0: 65 74 73 20 61 6c 6c 20 66 69 65 6c 64 73 20 6f  ets all fields o
e700: 66 20 74 68 65 20 75 6e 69 78 46 69 6c 65 0a 2a  f the unixFile.*
e710: 2a 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 30  * structure to 0
e720: 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 2a 6e  ..**.** It is *n
e730: 6f 74 2a 20 6e 65 63 65 73 73 61 72 79 20 74 6f  ot* necessary to
e740: 20 68 6f 6c 64 20 74 68 65 20 6d 75 74 65 78 20   hold the mutex 
e750: 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  when this routin
e760: 65 20 69 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20  e is called,.** 
e770: 65 76 65 6e 20 6f 6e 20 56 78 57 6f 72 6b 73 2e  even on VxWorks.
e780: 20 20 41 20 6d 75 74 65 78 20 77 69 6c 6c 20 62    A mutex will b
e790: 65 20 61 63 71 75 69 72 65 64 20 6f 6e 20 56 78  e acquired on Vx
e7a0: 57 6f 72 6b 73 20 62 79 20 74 68 65 0a 2a 2a 20  Works by the.** 
e7b0: 76 78 77 6f 72 6b 73 52 65 6c 65 61 73 65 46 69  vxworksReleaseFi
e7c0: 6c 65 49 64 28 29 20 72 6f 75 74 69 6e 65 2e 0a  leId() routine..
e7d0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6c  */.static int cl
e7e0: 6f 73 65 55 6e 69 78 46 69 6c 65 28 73 71 6c 69  oseUnixFile(sqli
e7f0: 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20  te3_file *id){. 
e800: 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
e810: 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
e820: 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 20 29 7b  ;.  if( pFile ){
e830: 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  .    if( pFile->
e840: 64 69 72 66 64 3e 3d 30 20 29 7b 0a 20 20 20 20  dirfd>=0 ){.    
e850: 20 20 69 6e 74 20 65 72 72 20 3d 20 63 6c 6f 73    int err = clos
e860: 65 28 70 46 69 6c 65 2d 3e 64 69 72 66 64 29 3b  e(pFile->dirfd);
e870: 0a 20 20 20 20 20 20 69 66 28 20 65 72 72 20 29  .      if( err )
e880: 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d  {.        pFile-
e890: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72  >lastErrno = err
e8a0: 6e 6f 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  no;.        retu
e8b0: 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
e8c0: 44 49 52 5f 43 4c 4f 53 45 3b 0a 20 20 20 20 20  DIR_CLOSE;.     
e8d0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
e8e0: 70 46 69 6c 65 2d 3e 64 69 72 66 64 3d 2d 31 3b  pFile->dirfd=-1;
e8f0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
e900: 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 68 3e     if( pFile->h>
e910: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
e920: 65 72 72 20 3d 20 63 6c 6f 73 65 28 70 46 69 6c  err = close(pFil
e930: 65 2d 3e 68 29 3b 0a 20 20 20 20 20 20 69 66 28  e->h);.      if(
e940: 20 65 72 72 20 29 7b 0a 20 20 20 20 20 20 20 20   err ){.        
e950: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
e960: 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
e970: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
e980: 49 4f 45 52 52 5f 43 4c 4f 53 45 3b 0a 20 20 20  IOERR_CLOSE;.   
e990: 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66 20 4f     }.    }.#if O
e9a0: 53 5f 56 58 57 4f 52 4b 53 0a 20 20 20 20 69 66  S_VXWORKS.    if
e9b0: 28 20 70 46 69 6c 65 2d 3e 70 49 64 20 29 7b 0a  ( pFile->pId ){.
e9c0: 20 20 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d        if( pFile-
e9d0: 3e 69 73 44 65 6c 65 74 65 20 29 7b 0a 20 20 20  >isDelete ){.   
e9e0: 20 20 20 20 20 75 6e 6c 69 6e 6b 28 70 46 69 6c       unlink(pFil
e9f0: 65 2d 3e 70 49 64 2d 3e 7a 43 61 6e 6f 6e 69 63  e->pId->zCanonic
ea00: 61 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d  alName);.      }
ea10: 0a 20 20 20 20 20 20 76 78 77 6f 72 6b 73 52 65  .      vxworksRe
ea20: 6c 65 61 73 65 46 69 6c 65 49 64 28 70 46 69 6c  leaseFileId(pFil
ea30: 65 2d 3e 70 49 64 29 3b 0a 20 20 20 20 20 20 70  e->pId);.      p
ea40: 46 69 6c 65 2d 3e 70 49 64 20 3d 20 30 3b 0a 20  File->pId = 0;. 
ea50: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
ea60: 4f 53 54 52 41 43 45 32 28 22 43 4c 4f 53 45 20  OSTRACE2("CLOSE 
ea70: 20 20 25 2d 33 64 5c 6e 22 2c 20 70 46 69 6c 65    %-3d\n", pFile
ea80: 2d 3e 68 29 3b 0a 20 20 20 20 4f 70 65 6e 43 6f  ->h);.    OpenCo
ea90: 75 6e 74 65 72 28 2d 31 29 3b 0a 20 20 20 20 73  unter(-1);.    s
eaa0: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 46 69 6c  qlite3_free(pFil
eab0: 65 2d 3e 70 55 6e 75 73 65 64 29 3b 0a 20 20 20  e->pUnused);.   
eac0: 20 6d 65 6d 73 65 74 28 70 46 69 6c 65 2c 20 30   memset(pFile, 0
ead0: 2c 20 73 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c  , sizeof(unixFil
eae0: 65 29 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  e));.  }.  retur
eaf0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
eb00: 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69  /*.** Close a fi
eb10: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
eb20: 74 20 75 6e 69 78 43 6c 6f 73 65 28 73 71 6c 69  t unixClose(sqli
eb30: 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20  te3_file *id){. 
eb40: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
eb50: 5f 4f 4b 3b 0a 20 20 69 66 28 20 69 64 20 29 7b  _OK;.  if( id ){
eb60: 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  .    unixFile *p
eb70: 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
eb80: 20 2a 29 69 64 3b 0a 20 20 20 20 75 6e 69 78 55   *)id;.    unixU
eb90: 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43  nlock(id, NO_LOC
eba0: 4b 29 3b 0a 20 20 20 20 75 6e 69 78 45 6e 74 65  K);.    unixEnte
ebb0: 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 69 66  rMutex();.    if
ebc0: 28 20 70 46 69 6c 65 2d 3e 70 4f 70 65 6e 20 26  ( pFile->pOpen &
ebd0: 26 20 70 46 69 6c 65 2d 3e 70 4f 70 65 6e 2d 3e  & pFile->pOpen->
ebe0: 6e 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 2f  nLock ){.      /
ebf0: 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6f  * If there are o
ec00: 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73  utstanding locks
ec10: 2c 20 64 6f 20 6e 6f 74 20 61 63 74 75 61 6c 6c  , do not actuall
ec20: 79 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65  y close the file
ec30: 20 6a 75 73 74 0a 20 20 20 20 20 20 2a 2a 20 79   just.      ** y
ec40: 65 74 20 62 65 63 61 75 73 65 20 74 68 61 74 20  et because that 
ec50: 77 6f 75 6c 64 20 63 6c 65 61 72 20 74 68 6f 73  would clear thos
ec60: 65 20 6c 6f 63 6b 73 2e 20 20 49 6e 73 74 65 61  e locks.  Instea
ec70: 64 2c 20 61 64 64 20 74 68 65 20 66 69 6c 65 0a  d, add the file.
ec80: 20 20 20 20 20 20 2a 2a 20 64 65 73 63 72 69 70        ** descrip
ec90: 74 6f 72 20 74 6f 20 70 4f 70 65 6e 2d 3e 70 55  tor to pOpen->pU
eca0: 6e 75 73 65 64 20 6c 69 73 74 2e 20 20 49 74 20  nused list.  It 
ecb0: 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74 69  will be automati
ecc0: 63 61 6c 6c 79 20 63 6c 6f 73 65 64 20 0a 20 20  cally closed .  
ecd0: 20 20 20 20 2a 2a 20 77 68 65 6e 20 74 68 65 20      ** when the 
ece0: 6c 61 73 74 20 6c 6f 63 6b 20 69 73 20 63 6c 65  last lock is cle
ecf0: 61 72 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ared..      */. 
ed00: 20 20 20 20 20 73 65 74 50 65 6e 64 69 6e 67 46       setPendingF
ed10: 64 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a  d(pFile);.    }.
ed20: 20 20 20 20 72 65 6c 65 61 73 65 4c 6f 63 6b 49      releaseLockI
ed30: 6e 66 6f 28 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b  nfo(pFile->pLock
ed40: 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 4f 70  );.    releaseOp
ed50: 65 6e 43 6e 74 28 70 46 69 6c 65 2d 3e 70 4f 70  enCnt(pFile->pOp
ed60: 65 6e 29 3b 0a 20 20 20 20 72 63 20 3d 20 63 6c  en);.    rc = cl
ed70: 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b  oseUnixFile(id);
ed80: 0a 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75  .    unixLeaveMu
ed90: 74 65 78 28 29 3b 0a 20 20 7d 0a 20 20 72 65 74  tex();.  }.  ret
eda0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a  urn rc;.}../****
edb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f  ********** End o
edc0: 66 20 74 68 65 20 70 6f 73 69 78 20 61 64 76 69  f the posix advi
edd0: 73 6f 72 79 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d  sory lock implem
ede0: 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a  entation *******
edf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
ee00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ee10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ee20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ee30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ee40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a  *********/../***
ee50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ee60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ee70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ee80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ee90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
eea0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
eeb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e 6f 2d 6f 70  ********** No-op
eec0: 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a   Locking *******
eed0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
eee0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a  ***********.**.*
eef0: 2a 20 4f 66 20 74 68 65 20 76 61 72 69 6f 75 73  * Of the various
ef00: 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c 65 6d 65   locking impleme
ef10: 6e 74 61 74 69 6f 6e 73 20 61 76 61 69 6c 61 62  ntations availab
ef20: 6c 65 2c 20 74 68 69 73 20 69 73 20 62 79 20 66  le, this is by f
ef30: 61 72 20 74 68 65 0a 2a 2a 20 73 69 6d 70 6c 65  ar the.** simple
ef40: 73 74 3a 20 20 6c 6f 63 6b 69 6e 67 20 69 73 20  st:  locking is 
ef50: 69 67 6e 6f 72 65 64 2e 20 20 4e 6f 20 61 74 74  ignored.  No att
ef60: 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20  empt is made to 
ef70: 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73  lock the databas
ef80: 65 0a 2a 2a 20 66 69 6c 65 20 66 6f 72 20 72 65  e.** file for re
ef90: 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67  ading or writing
efa0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6c 6f 63  ..**.** This loc
efb0: 6b 69 6e 67 20 6d 6f 64 65 20 69 73 20 61 70 70  king mode is app
efc0: 72 6f 70 72 69 61 74 65 20 66 6f 72 20 75 73 65  ropriate for use
efd0: 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61   on read-only da
efe0: 74 61 62 61 73 65 73 0a 2a 2a 20 28 65 78 3a 20  tabases.** (ex: 
eff0: 64 61 74 61 62 61 73 65 73 20 74 68 61 74 20 61  databases that a
f000: 72 65 20 62 75 72 6e 65 64 20 69 6e 74 6f 20 43  re burned into C
f010: 44 2d 52 4f 4d 2c 20 66 6f 72 20 65 78 61 6d 70  D-ROM, for examp
f020: 6c 65 2e 29 20 20 49 74 20 63 61 6e 0a 2a 2a 20  le.)  It can.** 
f030: 61 6c 73 6f 20 62 65 20 75 73 65 64 20 69 66 20  also be used if 
f040: 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 20  the application 
f050: 65 6d 70 6c 6f 79 73 20 73 6f 6d 65 20 65 78 74  employs some ext
f060: 65 72 6e 61 6c 20 6d 65 63 68 61 6e 69 73 6d 20  ernal mechanism 
f070: 74 6f 0a 2a 2a 20 70 72 65 76 65 6e 74 20 73 69  to.** prevent si
f080: 6d 75 6c 74 61 6e 65 6f 75 73 20 61 63 63 65 73  multaneous acces
f090: 73 20 6f 66 20 74 68 65 20 73 61 6d 65 20 64 61  s of the same da
f0a0: 74 61 62 61 73 65 20 62 79 20 74 77 6f 20 6f 72  tabase by two or
f0b0: 20 6d 6f 72 65 0a 2a 2a 20 64 61 74 61 62 61 73   more.** databas
f0c0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 20 20  e connections.  
f0d0: 42 75 74 20 74 68 65 72 65 20 69 73 20 61 20 73  But there is a s
f0e0: 65 72 69 6f 75 73 20 72 69 73 6b 20 6f 66 20 64  erious risk of d
f0f0: 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 72 72 75  atabase.** corru
f100: 70 74 69 6f 6e 20 69 66 20 74 68 69 73 20 6c 6f  ption if this lo
f110: 63 6b 69 6e 67 20 6d 6f 64 65 20 69 73 20 75 73  cking mode is us
f120: 65 64 20 69 6e 20 73 69 74 75 61 74 69 6f 6e 73  ed in situations
f130: 20 77 68 65 72 65 20 6d 75 6c 74 69 70 6c 65 0a   where multiple.
f140: 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  ** database conn
f150: 65 63 74 69 6f 6e 73 20 61 72 65 20 61 63 63 65  ections are acce
f160: 73 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20 64  ssing the same d
f170: 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20  atabase file at 
f180: 74 68 65 20 73 61 6d 65 0a 2a 2a 20 74 69 6d 65  the same.** time
f190: 20 61 6e 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65   and one or more
f1a0: 20 6f 66 20 74 68 6f 73 65 20 63 6f 6e 6e 65 63   of those connec
f1b0: 74 69 6f 6e 73 20 61 72 65 20 77 72 69 74 69 6e  tions are writin
f1c0: 67 2e 0a 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e  g..*/..static in
f1d0: 74 20 6e 6f 6c 6f 63 6b 43 68 65 63 6b 52 65 73  t nolockCheckRes
f1e0: 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65  ervedLock(sqlite
f1f0: 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64 2c  3_file *NotUsed,
f200: 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a   int *pResOut){.
f210: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
f220: 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 2a  ER(NotUsed);.  *
f230: 70 52 65 73 4f 75 74 20 3d 20 30 3b 0a 20 20 72  pResOut = 0;.  r
f240: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
f250: 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f  .}.static int no
f260: 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69 74 65 33  lockLock(sqlite3
f270: 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64 2c 20  _file *NotUsed, 
f280: 69 6e 74 20 4e 6f 74 55 73 65 64 32 29 7b 0a 20  int NotUsed2){. 
f290: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
f2a0: 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55  R2(NotUsed, NotU
f2b0: 73 65 64 32 29 3b 0a 20 20 72 65 74 75 72 6e 20  sed2);.  return 
f2c0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 73 74 61  SQLITE_OK;.}.sta
f2d0: 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 55 6e  tic int nolockUn
f2e0: 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  lock(sqlite3_fil
f2f0: 65 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20  e *NotUsed, int 
f300: 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20 55 4e 55  NotUsed2){.  UNU
f310: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 32 28 4e  SED_PARAMETER2(N
f320: 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73 65 64 32  otUsed, NotUsed2
f330: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
f340: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
f350: 43 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 2e 0a  Close the file..
f360: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f  */.static int no
f370: 6c 6f 63 6b 43 6c 6f 73 65 28 73 71 6c 69 74 65  lockClose(sqlite
f380: 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20  3_file *id) {.  
f390: 72 65 74 75 72 6e 20 63 6c 6f 73 65 55 6e 69 78  return closeUnix
f3a0: 46 69 6c 65 28 69 64 29 3b 0a 7d 0a 0a 2f 2a 2a  File(id);.}../**
f3b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f3c0: 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6e 6f 2d  * End of the no-
f3d0: 6f 70 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e  op lock implemen
f3e0: 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  tation *********
f3f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
f400: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f410: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f420: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f430: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f440: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a  ***********/../*
f450: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f460: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f470: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f480: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f490: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
f4a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f4b0: 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 64 6f  ******* Begin do
f4c0: 74 2d 66 69 6c 65 20 4c 6f 63 6b 69 6e 67 20 2a  t-file Locking *
f4d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f4e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
f4f0: 0a 2a 2a 20 54 68 65 20 64 6f 74 66 69 6c 65 20  .** The dotfile 
f500: 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c 65 6d 65 6e  locking implemen
f510: 74 61 74 69 6f 6e 20 75 73 65 73 20 74 68 65 20  tation uses the 
f520: 65 78 69 73 74 61 6e 63 65 20 6f 66 20 73 65 70  existance of sep
f530: 61 72 61 74 65 20 6c 6f 63 6b 0a 2a 2a 20 66 69  arate lock.** fi
f540: 6c 65 73 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  les in order to 
f550: 63 6f 6e 74 72 6f 6c 20 61 63 63 65 73 73 20 74  control access t
f560: 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  o the database. 
f570: 20 54 68 69 73 20 77 6f 72 6b 73 20 6f 6e 20 6a   This works on j
f580: 75 73 74 0a 2a 2a 20 61 62 6f 75 74 20 65 76 65  ust.** about eve
f590: 72 79 20 66 69 6c 65 73 79 73 74 65 6d 20 69 6d  ry filesystem im
f5a0: 61 67 69 6e 61 62 6c 65 2e 20 20 42 75 74 20 74  aginable.  But t
f5b0: 68 65 72 65 20 61 72 65 20 73 65 72 69 6f 75 73  here are serious
f5c0: 20 64 6f 77 6e 73 69 64 65 73 3a 0a 2a 2a 0a 2a   downsides:.**.*
f5d0: 2a 20 20 20 20 28 31 29 20 20 54 68 65 72 65 20  *    (1)  There 
f5e0: 69 73 20 7a 65 72 6f 20 63 6f 6e 63 75 72 72 65  is zero concurre
f5f0: 6e 63 79 2e 20 20 41 20 73 69 6e 67 6c 65 20 72  ncy.  A single r
f600: 65 61 64 65 72 20 62 6c 6f 63 6b 73 20 61 6c 6c  eader blocks all
f610: 20 6f 74 68 65 72 0a 2a 2a 20 20 20 20 20 20 20   other.**       
f620: 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 66 72    connections fr
f630: 6f 6d 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72  om reading or wr
f640: 69 74 69 6e 67 20 74 68 65 20 64 61 74 61 62 61  iting the databa
f650: 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29  se..**.**    (2)
f660: 20 20 41 6e 20 61 70 70 6c 69 63 61 74 69 6f 6e    An application
f670: 20 63 72 61 73 68 20 6f 72 20 70 6f 77 65 72 20   crash or power 
f680: 6c 6f 73 73 20 63 61 6e 20 6c 65 61 76 65 20 73  loss can leave s
f690: 74 61 6c 65 20 6c 6f 63 6b 20 66 69 6c 65 73 0a  tale lock files.
f6a0: 2a 2a 20 20 20 20 20 20 20 20 20 73 69 74 74 69  **         sitti
f6b0: 6e 67 20 61 72 6f 75 6e 64 20 74 68 61 74 20 6e  ng around that n
f6c0: 65 65 64 20 74 6f 20 62 65 20 63 6c 65 61 72 65  eed to be cleare
f6d0: 64 20 6d 61 6e 75 61 6c 6c 79 2e 0a 2a 2a 0a 2a  d manually..**.*
f6e0: 2a 20 4e 65 76 65 72 74 68 65 6c 65 73 73 2c 20  * Nevertheless, 
f6f0: 61 20 64 6f 74 6c 6f 63 6b 20 69 73 20 61 6e 20  a dotlock is an 
f700: 61 70 70 72 6f 70 72 69 61 74 65 20 6c 6f 63 6b  appropriate lock
f710: 69 6e 67 20 6d 6f 64 65 20 66 6f 72 20 75 73 65  ing mode for use
f720: 20 69 66 20 6e 6f 0a 2a 2a 20 6f 74 68 65 72 20   if no.** other 
f730: 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74 65 67 79  locking strategy
f740: 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a   is available..*
f750: 2a 0a 2a 2a 20 44 6f 74 66 69 6c 65 20 6c 6f 63  *.** Dotfile loc
f760: 6b 69 6e 67 20 77 6f 72 6b 73 20 62 79 20 63 72  king works by cr
f770: 65 61 74 69 6e 67 20 61 20 66 69 6c 65 20 69 6e  eating a file in
f780: 20 74 68 65 20 73 61 6d 65 20 64 69 72 65 63 74   the same direct
f790: 6f 72 79 20 61 73 20 74 68 65 0a 2a 2a 20 64 61  ory as the.** da
f7a0: 74 61 62 61 73 65 20 61 6e 64 20 77 69 74 68 20  tabase and with 
f7b0: 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 62 75  the same name bu
f7c0: 74 20 77 69 74 68 20 61 20 22 2e 6c 6f 63 6b 22  t with a ".lock"
f7d0: 20 65 78 74 65 6e 73 69 6f 6e 20 61 64 64 65 64   extension added
f7e0: 2e 0a 2a 2a 20 54 68 65 20 65 78 69 73 74 61 6e  ..** The existan
f7f0: 63 65 20 6f 66 20 61 20 6c 6f 63 6b 20 66 69 6c  ce of a lock fil
f800: 65 20 69 6d 70 6c 69 65 73 20 61 6e 20 45 58 43  e implies an EXC
f810: 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 41 6c  LUSIVE lock.  Al
f820: 6c 20 6f 74 68 65 72 20 6c 6f 63 6b 0a 2a 2a 20  l other lock.** 
f830: 74 79 70 65 73 20 28 53 48 41 52 45 44 2c 20 52  types (SHARED, R
f840: 45 53 45 52 56 45 44 2c 20 50 45 4e 44 49 4e 47  ESERVED, PENDING
f850: 29 20 61 72 65 20 6d 61 70 70 65 64 20 69 6e 74  ) are mapped int
f860: 6f 20 45 58 43 4c 55 53 49 56 45 2e 0a 2a 2f 0a  o EXCLUSIVE..*/.
f870: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20  ./*.** The file 
f880: 73 75 66 66 69 78 20 61 64 64 65 64 20 74 6f 20  suffix added to 
f890: 74 68 65 20 64 61 74 61 20 62 61 73 65 20 66 69  the data base fi
f8a0: 6c 65 6e 61 6d 65 20 69 6e 20 6f 72 64 65 72 20  lename in order 
f8b0: 74 6f 20 63 72 65 61 74 65 20 74 68 65 0a 2a 2a  to create the.**
f8c0: 20 6c 6f 63 6b 20 66 69 6c 65 2e 0a 2a 2f 0a 23   lock file..*/.#
f8d0: 64 65 66 69 6e 65 20 44 4f 54 4c 4f 43 4b 5f 53  define DOTLOCK_S
f8e0: 55 46 46 49 58 20 22 2e 6c 6f 63 6b 22 0a 0a 2f  UFFIX ".lock"../
f8f0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
f900: 65 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 72  e checks if ther
f910: 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20  e is a RESERVED 
f920: 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65  lock held on the
f930: 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69   specified.** fi
f940: 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e  le by this or an
f950: 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e  y other process.
f960: 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20   If such a lock 
f970: 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52  is held, set *pR
f980: 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f  esOut.** to a no
f990: 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68  n-zero value oth
f9a0: 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20  erwise *pResOut 
f9b0: 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20  is set to zero. 
f9c0: 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
f9d0: 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53  e.** is set to S
f9e0: 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20  QLITE_OK unless 
f9f0: 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63  an I/O error occ
fa00: 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20  urs during lock 
fa10: 63 68 65 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  checking..**.** 
fa20: 49 6e 20 64 6f 74 66 69 6c 65 20 6c 6f 63 6b 69  In dotfile locki
fa30: 6e 67 2c 20 65 69 74 68 65 72 20 61 20 6c 6f 63  ng, either a loc
fa40: 6b 20 65 78 69 73 74 73 20 6f 72 20 69 74 20 64  k exists or it d
fa50: 6f 65 73 20 6e 6f 74 2e 20 20 53 6f 20 69 6e 20  oes not.  So in 
fa60: 74 68 69 73 0a 2a 2a 20 76 61 72 69 61 74 69 6f  this.** variatio
fa70: 6e 20 6f 66 20 43 68 65 63 6b 52 65 73 65 72 76  n of CheckReserv
fa80: 65 64 4c 6f 63 6b 28 29 2c 20 2a 70 52 65 73 4f  edLock(), *pResO
fa90: 75 74 20 69 73 20 73 65 74 20 74 6f 20 74 72 75  ut is set to tru
faa0: 65 20 69 66 20 61 6e 79 20 6c 6f 63 6b 0a 2a 2a  e if any lock.**
fab0: 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20   is held on the 
fac0: 66 69 6c 65 20 61 6e 64 20 66 61 6c 73 65 20 69  file and false i
fad0: 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 75 6e  f the file is un
fae0: 6c 6f 63 6b 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  locked..*/.stati
faf0: 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 43 68 65  c int dotlockChe
fb00: 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73  ckReservedLock(s
fb10: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
fb20: 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 20 7b   int *pResOut) {
fb30: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
fb40: 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73  TE_OK;.  int res
fb50: 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69  erved = 0;.  uni
fb60: 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
fb70: 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20  unixFile*)id;.. 
fb80: 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
fb90: 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ( return SQLITE_
fba0: 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52  IOERR_CHECKRESER
fbb0: 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20  VEDLOCK; );.  . 
fbc0: 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
fbd0: 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66  ;..  /* Check if
fbe0: 20 61 20 74 68 72 65 61 64 20 69 6e 20 74 68 69   a thread in thi
fbf0: 73 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20  s process holds 
fc00: 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20  such a lock */. 
fc10: 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b   if( pFile->lock
fc20: 74 79 70 65 3e 53 48 41 52 45 44 5f 4c 4f 43 4b  type>SHARED_LOCK
fc30: 20 29 7b 0a 20 20 20 20 2f 2a 20 45 69 74 68 65   ){.    /* Eithe
fc40: 72 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f  r this connectio
fc50: 6e 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20  n or some other 
fc60: 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 20 74 68  connection in th
fc70: 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 0a 20  e same process. 
fc80: 20 20 20 2a 2a 20 68 6f 6c 64 73 20 61 20 6c 6f     ** holds a lo
fc90: 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e 20  ck on the file. 
fca0: 20 4e 6f 20 6e 65 65 64 20 74 6f 20 63 68 65 63   No need to chec
fcb0: 6b 20 66 75 72 74 68 65 72 2e 20 2a 2f 0a 20 20  k further. */.  
fcc0: 20 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a    reserved = 1;.
fcd0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
fce0: 54 68 65 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  The lock is held
fcf0: 20 69 66 20 61 6e 64 20 6f 6e 6c 79 20 69 66 20   if and only if 
fd00: 74 68 65 20 6c 6f 63 6b 66 69 6c 65 20 65 78 69  the lockfile exi
fd10: 73 74 73 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74  sts */.    const
fd20: 20 63 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65   char *zLockFile
fd30: 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
fd40: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
fd50: 6e 74 65 78 74 3b 0a 20 20 20 20 72 65 73 65 72  ntext;.    reser
fd60: 76 65 64 20 3d 20 61 63 63 65 73 73 28 7a 4c 6f  ved = access(zLo
fd70: 63 6b 46 69 6c 65 2c 20 30 29 3d 3d 30 3b 0a 20  ckFile, 0)==0;. 
fd80: 20 7d 0a 20 20 4f 53 54 52 41 43 45 34 28 22 54   }.  OSTRACE4("T
fd90: 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25  EST WR-LOCK %d %
fda0: 64 20 25 64 20 28 64 6f 74 6c 6f 63 6b 29 5c 6e  d %d (dotlock)\n
fdb0: 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c  ", pFile->h, rc,
fdc0: 20 72 65 73 65 72 76 65 64 29 3b 0a 20 20 2a 70   reserved);.  *p
fdd0: 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72 76 65  ResOut = reserve
fde0: 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  d;.  return rc;.
fdf0: 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68  }../*.** Lock th
fe00: 65 20 66 69 6c 65 20 77 69 74 68 20 74 68 65 20  e file with the 
fe10: 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20 62  lock specified b
fe20: 79 20 70 61 72 61 6d 65 74 65 72 20 6c 6f 63 6b  y parameter lock
fe30: 74 79 70 65 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66  type - one.** of
fe40: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
fe50: 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48  **.**     (1) SH
fe60: 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  ARED_LOCK.**    
fe70: 20 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f   (2) RESERVED_LO
fe80: 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45  CK.**     (3) PE
fe90: 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  NDING_LOCK.**   
fea0: 20 20 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f    (4) EXCLUSIVE_
feb0: 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74  LOCK.**.** Somet
fec0: 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65 73  imes when reques
fed0: 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74  ting one lock st
fee0: 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20  ate, additional 
fef0: 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61  lock states.** a
ff00: 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62  re inserted in b
ff10: 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63  etween.  The loc
ff20: 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20  king might fail 
ff30: 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61  on one of the la
ff40: 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  ter.** transitio
ff50: 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c  ns leaving the l
ff60: 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66 65 72  ock state differ
ff70: 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74  ent from what it
ff80: 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20   started but.** 
ff90: 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69  still short of i
ffa0: 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f  ts goal.  The fo
ffb0: 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68  llowing chart sh
ffc0: 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a  ows the allowed.
ffd0: 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61  ** transitions a
ffe0: 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65 64 20  nd the inserted 
fff0: 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61  intermediate sta
10000 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e  tes:.**.**    UN
10010 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44  LOCKED -> SHARED
10020 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e  .**    SHARED ->
10030 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20   RESERVED.**    
10040 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49  SHARED -> (PENDI
10050 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  NG) -> EXCLUSIVE
10060 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44 20  .**    RESERVED 
10070 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20  -> (PENDING) -> 
10080 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20  EXCLUSIVE.**    
10090 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55  PENDING -> EXCLU
100a0 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  SIVE.**.** This 
100b0 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c  routine will onl
100c0 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63  y increase a loc
100d0 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c 69  k.  Use the sqli
100e0 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a  te3OsUnlock().**
100f0 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65   routine to lowe
10100 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  r a locking leve
10110 6c 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 20 64 6f  l..**.** With do
10120 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2c 20 77  tfile locking, w
10130 65 20 72 65 61 6c 6c 79 20 6f 6e 6c 79 20 73 75  e really only su
10140 70 70 6f 72 74 20 73 74 61 74 65 20 28 34 29 3a  pport state (4):
10150 20 45 58 43 4c 55 53 49 56 45 2e 0a 2a 2a 20 42   EXCLUSIVE..** B
10160 75 74 20 77 65 20 74 72 61 63 6b 20 74 68 65 20  ut we track the 
10170 6f 74 68 65 72 20 6c 6f 63 6b 69 6e 67 20 6c 65  other locking le
10180 76 65 6c 73 20 69 6e 74 65 72 6e 61 6c 6c 79 2e  vels internally.
10190 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
101a0 6f 74 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69 74  otlockLock(sqlit
101b0 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
101c0 20 6c 6f 63 6b 74 79 70 65 29 20 7b 0a 20 20 75   locktype) {.  u
101d0 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
101e0 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
101f0 20 20 69 6e 74 20 66 64 3b 0a 20 20 63 68 61 72    int fd;.  char
10200 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63   *zLockFile = (c
10210 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63  har *)pFile->loc
10220 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 69  kingContext;.  i
10230 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
10240 4b 3b 0a 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20  K;...  /* If we 
10250 68 61 76 65 20 61 6e 79 20 6c 6f 63 6b 2c 20 74  have any lock, t
10260 68 65 6e 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c  hen the lock fil
10270 65 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  e already exists
10280 2e 20 20 41 6c 6c 20 77 65 20 68 61 76 65 0a 20  .  All we have. 
10290 20 2a 2a 20 74 6f 20 64 6f 20 69 73 20 61 64 6a   ** to do is adj
102a0 75 73 74 20 6f 75 72 20 69 6e 74 65 72 6e 61 6c  ust our internal
102b0 20 72 65 63 6f 72 64 20 6f 66 20 74 68 65 20 6c   record of the l
102c0 6f 63 6b 20 6c 65 76 65 6c 2e 0a 20 20 2a 2f 0a  ock level..  */.
102d0 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63    if( pFile->loc
102e0 6b 74 79 70 65 20 3e 20 4e 4f 5f 4c 4f 43 4b 20  ktype > NO_LOCK 
102f0 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f  ){.    pFile->lo
10300 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70  cktype = locktyp
10310 65 3b 0a 23 69 66 20 21 4f 53 5f 56 58 57 4f 52  e;.#if !OS_VXWOR
10320 4b 53 0a 20 20 20 20 2f 2a 20 41 6c 77 61 79 73  KS.    /* Always
10330 20 75 70 64 61 74 65 20 74 68 65 20 74 69 6d 65   update the time
10340 73 74 61 6d 70 20 6f 6e 20 74 68 65 20 6f 6c 64  stamp on the old
10350 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 75 74 69   file */.    uti
10360 6d 65 73 28 7a 4c 6f 63 6b 46 69 6c 65 2c 20 4e  mes(zLockFile, N
10370 55 4c 4c 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  ULL);.#endif.   
10380 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
10390 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 67  K;.  }.  .  /* g
103a0 72 61 62 20 61 6e 20 65 78 63 6c 75 73 69 76 65  rab an exclusive
103b0 20 6c 6f 63 6b 20 2a 2f 0a 20 20 66 64 20 3d 20   lock */.  fd = 
103c0 6f 70 65 6e 28 7a 4c 6f 63 6b 46 69 6c 65 2c 4f  open(zLockFile,O
103d0 5f 52 44 4f 4e 4c 59 7c 4f 5f 43 52 45 41 54 7c  _RDONLY|O_CREAT|
103e0 4f 5f 45 58 43 4c 2c 30 36 30 30 29 3b 0a 20 20  O_EXCL,0600);.  
103f0 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20  if( fd<0 ){.    
10400 2f 2a 20 66 61 69 6c 65 64 20 74 6f 20 6f 70 65  /* failed to ope
10410 6e 2f 63 72 65 61 74 65 20 74 68 65 20 66 69 6c  n/create the fil
10420 65 2c 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20  e, someone else 
10430 6d 61 79 20 68 61 76 65 20 73 74 6f 6c 65 6e 20  may have stolen 
10440 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20  the lock */.    
10450 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72  int tErrno = err
10460 6e 6f 3b 0a 20 20 20 20 69 66 28 20 45 45 58 49  no;.    if( EEXI
10470 53 54 20 3d 3d 20 74 45 72 72 6e 6f 20 29 7b 0a  ST == tErrno ){.
10480 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
10490 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 20 65 6c  E_BUSY;.    } el
104a0 73 65 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  se {.      rc = 
104b0 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
104c0 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
104d0 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c  , SQLITE_IOERR_L
104e0 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20  OCK);.      if( 
104f0 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63  IS_LOCK_ERROR(rc
10500 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69  ) ){.        pFi
10510 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
10520 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a  tErrno;.      }.
10530 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
10540 20 72 63 3b 0a 20 20 7d 20 0a 20 20 69 66 28 20   rc;.  } .  if( 
10550 63 6c 6f 73 65 28 66 64 29 20 29 7b 0a 20 20 20  close(fd) ){.   
10560 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
10570 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 72  o = errno;.    r
10580 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
10590 5f 43 4c 4f 53 45 3b 0a 20 20 7d 0a 20 20 0a 20  _CLOSE;.  }.  . 
105a0 20 2f 2a 20 67 6f 74 20 69 74 2c 20 73 65 74 20   /* got it, set 
105b0 74 68 65 20 74 79 70 65 20 61 6e 64 20 72 65 74  the type and ret
105c0 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20 70 46 69 6c  urn ok */.  pFil
105d0 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f  e->locktype = lo
105e0 63 6b 74 79 70 65 3b 0a 20 20 72 65 74 75 72 6e  cktype;.  return
105f0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f   rc;.}../*.** Lo
10600 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  wer the locking 
10610 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65  level on file de
10620 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74  scriptor pFile t
10630 6f 20 6c 6f 63 6b 74 79 70 65 2e 20 20 6c 6f 63  o locktype.  loc
10640 6b 74 79 70 65 0a 2a 2a 20 6d 75 73 74 20 62 65  ktype.** must be
10650 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20   either NO_LOCK 
10660 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a  or SHARED_LOCK..
10670 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63  **.** If the loc
10680 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68  king level of th
10690 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
106a0 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20  r is already at 
106b0 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20  or below.** the 
106c0 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e  requested lockin
106d0 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f  g level, this ro
106e0 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
106f0 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 65  ..**.** When the
10700 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 72   locking level r
10710 65 61 63 68 65 73 20 4e 4f 5f 4c 4f 43 4b 2c 20  eaches NO_LOCK, 
10720 64 65 6c 65 74 65 20 74 68 65 20 6c 6f 63 6b 20  delete the lock 
10730 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
10740 69 6e 74 20 64 6f 74 6c 6f 63 6b 55 6e 6c 6f 63  int dotlockUnloc
10750 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
10760 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65  id, int locktype
10770 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  ) {.  unixFile *
10780 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
10790 65 2a 29 69 64 3b 0a 20 20 63 68 61 72 20 2a 7a  e*)id;.  char *z
107a0 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63 68 61 72  LockFile = (char
107b0 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e   *)pFile->lockin
107c0 67 43 6f 6e 74 65 78 74 3b 0a 0a 20 20 61 73 73  gContext;..  ass
107d0 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
107e0 4f 53 54 52 41 43 45 35 28 22 55 4e 4c 4f 43 4b  OSTRACE5("UNLOCK
107f0 20 20 25 64 20 25 64 20 77 61 73 20 25 64 20 70    %d %d was %d p
10800 69 64 3d 25 64 20 28 64 6f 74 6c 6f 63 6b 29 5c  id=%d (dotlock)\
10810 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f  n", pFile->h, lo
10820 63 6b 74 79 70 65 2c 0a 09 20 20 20 70 46 69 6c  cktype,..   pFil
10830 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 67 65 74  e->locktype, get
10840 70 69 64 28 29 29 3b 0a 20 20 61 73 73 65 72 74  pid());.  assert
10850 28 20 6c 6f 63 6b 74 79 70 65 3c 3d 53 48 41 52  ( locktype<=SHAR
10860 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20  ED_LOCK );.  .  
10870 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20 70 6f 73 73  /* no-op if poss
10880 69 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70 46  ible */.  if( pF
10890 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 6c  ile->locktype==l
108a0 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 72  ocktype ){.    r
108b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
108c0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 6f 20 64 6f  .  }..  /* To do
108d0 77 6e 67 72 61 64 65 20 74 6f 20 73 68 61 72 65  wngrade to share
108e0 64 2c 20 73 69 6d 70 6c 79 20 75 70 64 61 74 65  d, simply update
108f0 20 6f 75 72 20 69 6e 74 65 72 6e 61 6c 20 6e 6f   our internal no
10900 74 69 6f 6e 20 6f 66 20 74 68 65 0a 20 20 2a 2a  tion of the.  **
10910 20 6c 6f 63 6b 20 73 74 61 74 65 2e 20 20 4e 6f   lock state.  No
10920 20 6e 65 65 64 20 74 6f 20 6d 65 73 73 20 77 69   need to mess wi
10930 74 68 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64  th the file on d
10940 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  isk..  */.  if( 
10950 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44  locktype==SHARED
10960 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46 69  _LOCK ){.    pFi
10970 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 53  le->locktype = S
10980 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20  HARED_LOCK;.    
10990 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
109a0 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 54 6f  ;.  }.  .  /* To
109b0 20 66 75 6c 6c 79 20 75 6e 6c 6f 63 6b 20 74 68   fully unlock th
109c0 65 20 64 61 74 61 62 61 73 65 2c 20 64 65 6c 65  e database, dele
109d0 74 65 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65  te the lock file
109e0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6c 6f   */.  assert( lo
109f0 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 20  cktype==NO_LOCK 
10a00 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6e 6b 28  );.  if( unlink(
10a10 7a 4c 6f 63 6b 46 69 6c 65 29 20 29 7b 0a 20 20  zLockFile) ){.  
10a20 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20    int rc = 0;.  
10a30 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65    int tErrno = e
10a40 72 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20 45 4e  rrno;.    if( EN
10a50 4f 45 4e 54 20 21 3d 20 74 45 72 72 6e 6f 20 29  OENT != tErrno )
10a60 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
10a70 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
10a80 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53  xError(tErrno, S
10a90 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
10aa0 43 4b 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  CK);.    }.    i
10ab0 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
10ac0 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 70 46  (rc) ){.      pF
10ad0 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
10ae0 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20   tErrno;.    }. 
10af0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 20 0a 20     return rc; . 
10b00 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b   }.  pFile->lock
10b10 74 79 70 65 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a  type = NO_LOCK;.
10b20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10b30 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  OK;.}../*.** Clo
10b40 73 65 20 61 20 66 69 6c 65 2e 20 20 4d 61 6b 65  se a file.  Make
10b50 20 73 75 72 65 20 74 68 65 20 6c 6f 63 6b 20 68   sure the lock h
10b60 61 73 20 62 65 65 6e 20 72 65 6c 65 61 73 65 64  as been released
10b70 20 62 65 66 6f 72 65 20 63 6c 6f 73 69 6e 67 2e   before closing.
10b80 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
10b90 6f 74 6c 6f 63 6b 43 6c 6f 73 65 28 73 71 6c 69  otlockClose(sqli
10ba0 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a  te3_file *id) {.
10bb0 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20    int rc;.  if( 
10bc0 69 64 20 29 7b 0a 20 20 20 20 75 6e 69 78 46 69  id ){.    unixFi
10bd0 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
10be0 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20 64  xFile*)id;.    d
10bf0 6f 74 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 69 64 2c  otlockUnlock(id,
10c00 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 73   NO_LOCK);.    s
10c10 71 6c 69 74 65 33 5f 66 72 65 65 28 70 46 69 6c  qlite3_free(pFil
10c20 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
10c30 74 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 63  t);.  }.  rc = c
10c40 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29  loseUnixFile(id)
10c50 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
10c60 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
10c70 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20  **** End of the 
10c80 64 6f 74 2d 66 69 6c 65 20 6c 6f 63 6b 20 69 6d  dot-file lock im
10c90 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a  plementation ***
10ca0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10cb0 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
10cc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10cd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10ce0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10cf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
10d00 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
10d10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10d20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10d30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10d40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10d50 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
10d60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67  ************ Beg
10d70 69 6e 20 66 6c 6f 63 6b 20 4c 6f 63 6b 69 6e 67  in flock Locking
10d80 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
10d90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10da0 2a 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20  *.**.** Use the 
10db0 66 6c 6f 63 6b 28 29 20 73 79 73 74 65 6d 20 63  flock() system c
10dc0 61 6c 6c 20 74 6f 20 64 6f 20 66 69 6c 65 20 6c  all to do file l
10dd0 6f 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 66 6c  ocking..**.** fl
10de0 6f 63 6b 28 29 20 6c 6f 63 6b 69 6e 67 20 69 73  ock() locking is
10df0 20 6c 69 6b 65 20 64 6f 74 2d 66 69 6c 65 20 6c   like dot-file l
10e00 6f 63 6b 69 6e 67 20 69 6e 20 74 68 61 74 20 74  ocking in that t
10e10 68 65 20 76 61 72 69 6f 75 73 0a 2a 2a 20 66 69  he various.** fi
10e20 6e 65 2d 67 72 61 69 6e 20 6c 6f 63 6b 69 6e 67  ne-grain locking
10e30 20 6c 65 76 65 6c 73 20 73 75 70 70 6f 72 74 65   levels supporte
10e40 64 20 62 79 20 53 51 4c 69 74 65 20 61 72 65 20  d by SQLite are 
10e50 63 6f 6c 6c 61 70 73 65 64 20 69 6e 74 6f 0a 2a  collapsed into.*
10e60 2a 20 61 20 73 69 6e 67 6c 65 20 65 78 63 6c 75  * a single exclu
10e70 73 69 76 65 20 6c 6f 63 6b 2e 20 20 49 6e 20 6f  sive lock.  In o
10e80 74 68 65 72 20 77 6f 72 64 73 2c 20 53 48 41 52  ther words, SHAR
10e90 45 44 2c 20 52 45 53 45 52 56 45 44 2c 20 61 6e  ED, RESERVED, an
10ea0 64 0a 2a 2a 20 50 45 4e 44 49 4e 47 20 6c 6f 63  d.** PENDING loc
10eb0 6b 73 20 61 72 65 20 74 68 65 20 73 61 6d 65 20  ks are the same 
10ec0 74 68 69 6e 67 20 61 73 20 61 6e 20 45 58 43 4c  thing as an EXCL
10ed0 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 53 51 4c  USIVE lock.  SQL
10ee0 69 74 65 0a 2a 2a 20 73 74 69 6c 6c 20 77 6f 72  ite.** still wor
10ef0 6b 73 20 77 68 65 6e 20 79 6f 75 20 64 6f 20 74  ks when you do t
10f00 68 69 73 2c 20 62 75 74 20 63 6f 6e 63 75 72 72  his, but concurr
10f10 65 6e 63 79 20 69 73 20 72 65 64 75 63 65 64 20  ency is reduced 
10f20 73 69 6e 63 65 0a 2a 2a 20 6f 6e 6c 79 20 61 20  since.** only a 
10f30 73 69 6e 67 6c 65 20 70 72 6f 63 65 73 73 20 63  single process c
10f40 61 6e 20 62 65 20 72 65 61 64 69 6e 67 20 74 68  an be reading th
10f50 65 20 64 61 74 61 62 61 73 65 20 61 74 20 61 20  e database at a 
10f60 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 4f 6d 69 74  time..**.** Omit
10f70 20 74 68 69 73 20 73 65 63 74 69 6f 6e 20 69 66   this section if
10f80 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
10f90 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 69 73 20  OCKING_STYLE is 
10fa0 74 75 72 6e 65 64 20 6f 66 66 20 6f 72 20 69 66  turned off or if
10fb0 0a 2a 2a 20 63 6f 6d 70 69 6c 69 6e 67 20 66 6f  .** compiling fo
10fc0 72 20 56 58 57 4f 52 4b 53 2e 0a 2a 2f 0a 23 69  r VXWORKS..*/.#i
10fd0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
10fe0 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26  LOCKING_STYLE &&
10ff0 20 21 4f 53 5f 56 58 57 4f 52 4b 53 0a 0a 2f 2a   !OS_VXWORKS../*
11000 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
11010 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 72 65   checks if there
11020 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20 6c   is a RESERVED l
11030 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20  ock held on the 
11040 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c  specified.** fil
11050 65 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79  e by this or any
11060 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20   other process. 
11070 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69  If such a lock i
11080 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65  s held, set *pRe
11090 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e  sOut.** to a non
110a0 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65  -zero value othe
110b0 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69  rwise *pResOut i
110c0 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20  s set to zero.  
110d0 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  The return value
110e0 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51  .** is set to SQ
110f0 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61  LITE_OK unless a
11100 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75  n I/O error occu
11110 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63  rs during lock c
11120 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  hecking..*/.stat
11130 69 63 20 69 6e 74 20 66 6c 6f 63 6b 43 68 65 63  ic int flockChec
11140 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71  kReservedLock(sq
11150 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
11160 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20  int *pResOut){. 
11170 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
11180 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65 72  _OK;.  int reser
11190 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46  ved = 0;.  unixF
111a0 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
111b0 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 0a 20  ixFile*)id;.  . 
111c0 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
111d0 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ( return SQLITE_
111e0 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52  IOERR_CHECKRESER
111f0 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20  VEDLOCK; );.  . 
11200 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
11210 3b 0a 20 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20  ;.  .  /* Check 
11220 69 66 20 61 20 74 68 72 65 61 64 20 69 6e 20 74  if a thread in t
11230 68 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c 64  his process hold
11240 73 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f  s such a lock */
11250 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f  .  if( pFile->lo
11260 63 6b 74 79 70 65 3e 53 48 41 52 45 44 5f 4c 4f  cktype>SHARED_LO
11270 43 4b 20 29 7b 0a 20 20 20 20 72 65 73 65 72 76  CK ){.    reserv
11280 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a 20  ed = 1;.  }.  . 
11290 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 20 73 65   /* Otherwise se
112a0 65 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20  e if some other 
112b0 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 69 74  process holds it
112c0 2e 20 2a 2f 0a 20 20 69 66 28 20 21 72 65 73 65  . */.  if( !rese
112d0 72 76 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20 61  rved ){.    /* a
112e0 74 74 65 6d 70 74 20 74 6f 20 67 65 74 20 74 68  ttempt to get th
112f0 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 69 6e  e lock */.    in
11300 74 20 6c 72 63 20 3d 20 66 6c 6f 63 6b 28 70 46  t lrc = flock(pF
11310 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 45 58 20  ile->h, LOCK_EX 
11320 7c 20 4c 4f 43 4b 5f 4e 42 29 3b 0a 20 20 20 20  | LOCK_NB);.    
11330 69 66 28 20 21 6c 72 63 20 29 7b 0a 20 20 20 20  if( !lrc ){.    
11340 20 20 2f 2a 20 67 6f 74 20 74 68 65 20 6c 6f 63    /* got the loc
11350 6b 2c 20 75 6e 6c 6f 63 6b 20 69 74 20 2a 2f 0a  k, unlock it */.
11360 20 20 20 20 20 20 6c 72 63 20 3d 20 66 6c 6f 63        lrc = floc
11370 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b  k(pFile->h, LOCK
11380 5f 55 4e 29 3b 0a 20 20 20 20 20 20 69 66 20 28  _UN);.      if (
11390 20 6c 72 63 20 29 20 7b 0a 20 20 20 20 20 20 20   lrc ) {.       
113a0 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72   int tErrno = er
113b0 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  rno;.        /* 
113c0 75 6e 6c 6f 63 6b 20 66 61 69 6c 65 64 20 77 69  unlock failed wi
113d0 74 68 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20  th an error */. 
113e0 20 20 20 20 20 20 20 6c 72 63 20 3d 20 73 71 6c         lrc = sql
113f0 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
11400 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53  xError(tErrno, S
11410 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
11420 43 4b 29 3b 20 0a 20 20 20 20 20 20 20 20 69 66  CK); .        if
11430 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  ( IS_LOCK_ERROR(
11440 6c 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20  lrc) ){.        
11450 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
11460 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20  no = tErrno;.   
11470 20 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63 3b         rc = lrc;
11480 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
11490 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a   }.    } else {.
114a0 20 20 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f        int tErrno
114b0 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
114c0 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20  reserved = 1;.  
114d0 20 20 20 20 2f 2a 20 73 6f 6d 65 6f 6e 65 20 65      /* someone e
114e0 6c 73 65 20 6d 69 67 68 74 20 68 61 76 65 20 69  lse might have i
114f0 74 20 72 65 73 65 72 76 65 64 20 2a 2f 0a 20 20  t reserved */.  
11500 20 20 20 20 6c 72 63 20 3d 20 73 71 6c 69 74 65      lrc = sqlite
11510 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
11520 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49  ror(tErrno, SQLI
11530 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 20  TE_IOERR_LOCK); 
11540 0a 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f  .      if( IS_LO
11550 43 4b 5f 45 52 52 4f 52 28 6c 72 63 29 20 29 7b  CK_ERROR(lrc) ){
11560 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  .        pFile->
11570 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72  lastErrno = tErr
11580 6e 6f 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  no;.        rc =
11590 20 6c 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20   lrc;.      }.  
115a0 20 20 7d 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43    }.  }.  OSTRAC
115b0 45 34 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b  E4("TEST WR-LOCK
115c0 20 25 64 20 25 64 20 25 64 20 28 66 6c 6f 63 6b   %d %d %d (flock
115d0 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
115e0 72 63 2c 20 72 65 73 65 72 76 65 64 29 3b 0a 0a  rc, reserved);..
115f0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 49 47  #ifdef SQLITE_IG
11600 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f  NORE_FLOCK_LOCK_
11610 45 52 52 4f 52 53 0a 20 20 69 66 28 20 28 72 63  ERRORS.  if( (rc
11620 20 26 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29   & SQLITE_IOERR)
11630 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52   == SQLITE_IOERR
11640 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
11650 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 72 65 73 65  ITE_OK;.    rese
11660 72 76 65 64 3d 31 3b 0a 20 20 7d 0a 23 65 6e 64  rved=1;.  }.#end
11670 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e  if /* SQLITE_IGN
11680 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45  ORE_FLOCK_LOCK_E
11690 52 52 4f 52 53 20 2a 2f 0a 20 20 2a 70 52 65 73  RRORS */.  *pRes
116a0 4f 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a  Out = reserved;.
116b0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
116c0 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66  /*.** Lock the f
116d0 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63  ile with the loc
116e0 6b 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70  k specified by p
116f0 61 72 61 6d 65 74 65 72 20 6c 6f 63 6b 74 79 70  arameter locktyp
11700 65 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68  e - one.** of th
11710 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
11720 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45  **     (1) SHARE
11730 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32  D_LOCK.**     (2
11740 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a  ) RESERVED_LOCK.
11750 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49  **     (3) PENDI
11760 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  NG_LOCK.**     (
11770 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  4) EXCLUSIVE_LOC
11780 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65  K.**.** Sometime
11790 73 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e  s when requestin
117a0 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65  g one lock state
117b0 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63  , additional loc
117c0 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20  k states.** are 
117d0 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77  inserted in betw
117e0 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e  een.  The lockin
117f0 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20  g might fail on 
11800 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72  one of the later
11810 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  .** transitions 
11820 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b  leaving the lock
11830 20 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74   state different
11840 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74   from what it st
11850 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69  arted but.** sti
11860 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20  ll short of its 
11870 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  goal.  The follo
11880 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73  wing chart shows
11890 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20   the allowed.** 
118a0 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20  transitions and 
118b0 74 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74  the inserted int
118c0 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73  ermediate states
118d0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43  :.**.**    UNLOC
118e0 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a  KED -> SHARED.**
118f0 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45      SHARED -> RE
11900 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41  SERVED.**    SHA
11910 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  RED -> (PENDING)
11920 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
11930 20 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20      RESERVED -> 
11940 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43  (PENDING) -> EXC
11950 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e  LUSIVE.**    PEN
11960 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56  DING -> EXCLUSIV
11970 45 0a 2a 2a 0a 2a 2a 20 66 6c 6f 63 6b 28 29 20  E.**.** flock() 
11980 6f 6e 6c 79 20 72 65 61 6c 6c 79 20 73 75 70 70  only really supp
11990 6f 72 74 20 45 58 43 4c 55 53 49 56 45 20 6c 6f  ort EXCLUSIVE lo
119a0 63 6b 73 2e 20 20 57 65 20 74 72 61 63 6b 20 69  cks.  We track i
119b0 6e 74 65 72 6d 65 64 69 61 74 65 0a 2a 2a 20 6c  ntermediate.** l
119c0 6f 63 6b 20 73 74 61 74 65 73 20 69 6e 20 74 68  ock states in th
119d0 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 73  e sqlite3_file s
119e0 74 72 75 63 74 75 72 65 2c 20 62 75 74 20 61 6c  tructure, but al
119f0 6c 20 6c 6f 63 6b 73 20 53 48 41 52 45 44 20 6f  l locks SHARED o
11a00 72 0a 2a 2a 20 61 62 6f 76 65 20 61 72 65 20 72  r.** above are r
11a10 65 61 6c 6c 79 20 45 58 43 4c 55 53 49 56 45 20  eally EXCLUSIVE 
11a20 6c 6f 63 6b 73 20 61 6e 64 20 65 78 63 6c 75 64  locks and exclud
11a30 65 20 61 6c 6c 20 6f 74 68 65 72 20 70 72 6f 63  e all other proc
11a40 65 73 73 65 73 20 66 72 6f 6d 0a 2a 2a 20 61 63  esses from.** ac
11a50 63 65 73 73 20 74 68 65 20 66 69 6c 65 2e 0a 2a  cess the file..*
11a60 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
11a70 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72  e will only incr
11a80 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73  ease a lock.  Us
11a90 65 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55  e the sqlite3OsU
11aa0 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69  nlock().** routi
11ab0 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f  ne to lower a lo
11ac0 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a  cking level..*/.
11ad0 73 74 61 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b  static int flock
11ae0 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
11af0 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74  e *id, int lockt
11b00 79 70 65 29 20 7b 0a 20 20 69 6e 74 20 72 63 20  ype) {.  int rc 
11b10 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75  = SQLITE_OK;.  u
11b20 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
11b30 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
11b40 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
11b50 20 29 3b 0a 0a 20 20 2f 2a 20 69 66 20 77 65 20   );..  /* if we 
11b60 61 6c 72 65 61 64 79 20 68 61 76 65 20 61 20 6c  already have a l
11b70 6f 63 6b 2c 20 69 74 20 69 73 20 65 78 63 6c 75  ock, it is exclu
11b80 73 69 76 65 2e 20 20 0a 20 20 2a 2a 20 4a 75 73  sive.  .  ** Jus
11b90 74 20 61 64 6a 75 73 74 20 6c 65 76 65 6c 20 61  t adjust level a
11ba0 6e 64 20 70 75 6e 74 20 6f 6e 20 6f 75 74 74 61  nd punt on outta
11bb0 20 68 65 72 65 2e 20 2a 2f 0a 20 20 69 66 20 28   here. */.  if (
11bc0 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20  pFile->locktype 
11bd0 3e 20 4e 4f 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20  > NO_LOCK) {.   
11be0 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
11bf0 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20   = locktype;.   
11c00 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
11c10 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 67  K;.  }.  .  /* g
11c20 72 61 62 20 61 6e 20 65 78 63 6c 75 73 69 76 65  rab an exclusive
11c30 20 6c 6f 63 6b 20 2a 2f 0a 20 20 0a 20 20 69 66   lock */.  .  if
11c40 20 28 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68   (flock(pFile->h
11c50 2c 20 4c 4f 43 4b 5f 45 58 20 7c 20 4c 4f 43 4b  , LOCK_EX | LOCK
11c60 5f 4e 42 29 29 20 7b 0a 20 20 20 20 69 6e 74 20  _NB)) {.    int 
11c70 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
11c80 20 20 20 20 2f 2a 20 64 69 64 6e 27 74 20 67 65      /* didn't ge
11c90 74 2c 20 6d 75 73 74 20 62 65 20 62 75 73 79 20  t, must be busy 
11ca0 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
11cb0 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78  teErrorFromPosix
11cc0 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51  Error(tErrno, SQ
11cd0 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29  LITE_IOERR_LOCK)
11ce0 3b 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43  ;.    if( IS_LOC
11cf0 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20  K_ERROR(rc) ){. 
11d00 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
11d10 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a  Errno = tErrno;.
11d20 20 20 20 20 7d 0a 20 20 7d 20 65 6c 73 65 20 7b      }.  } else {
11d30 0a 20 20 20 20 2f 2a 20 67 6f 74 20 69 74 2c 20  .    /* got it, 
11d40 73 65 74 20 74 68 65 20 74 79 70 65 20 61 6e 64  set the type and
11d50 20 72 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20   return ok */.  
11d60 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70    pFile->locktyp
11d70 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20  e = locktype;.  
11d80 7d 0a 20 20 4f 53 54 52 41 43 45 34 28 22 4c 4f  }.  OSTRACE4("LO
11d90 43 4b 20 20 20 20 25 64 20 25 73 20 25 73 20 28  CK    %d %s %s (
11da0 66 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65  flock)\n", pFile
11db0 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70 65 4e 61 6d  ->h, locktypeNam
11dc0 65 28 6c 6f 63 6b 74 79 70 65 29 2c 20 0a 20 20  e(locktype), .  
11dd0 20 20 20 20 20 20 20 20 20 72 63 3d 3d 53 51 4c           rc==SQL
11de0 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20  ITE_OK ? "ok" : 
11df0 22 66 61 69 6c 65 64 22 29 3b 0a 23 69 66 64 65  "failed");.#ifde
11e00 66 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f  f SQLITE_IGNORE_
11e10 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52  FLOCK_LOCK_ERROR
11e20 53 0a 20 20 69 66 28 20 28 72 63 20 26 20 53 51  S.  if( (rc & SQ
11e30 4c 49 54 45 5f 49 4f 45 52 52 29 20 3d 3d 20 53  LITE_IOERR) == S
11e40 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20  QLITE_IOERR ){. 
11e50 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
11e60 55 53 59 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20  USY;.  }.#endif 
11e70 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45  /* SQLITE_IGNORE
11e80 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f  _FLOCK_LOCK_ERRO
11e90 52 53 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72  RS */.  return r
11ea0 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77  c;.}.../*.** Low
11eb0 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  er the locking l
11ec0 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73  evel on file des
11ed0 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f  criptor pFile to
11ee0 20 6c 6f 63 6b 74 79 70 65 2e 20 20 6c 6f 63 6b   locktype.  lock
11ef0 74 79 70 65 0a 2a 2a 20 6d 75 73 74 20 62 65 20  type.** must be 
11f00 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f  either NO_LOCK o
11f10 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a  r SHARED_LOCK..*
11f20 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b  *.** If the lock
11f30 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65  ing level of the
11f40 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
11f50 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f   is already at o
11f60 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72  r below.** the r
11f70 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67  equested locking
11f80 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75   level, this rou
11f90 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
11fa0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
11fb0 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71 6c 69 74  lockUnlock(sqlit
11fc0 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
11fd0 20 6c 6f 63 6b 74 79 70 65 29 20 7b 0a 20 20 75   locktype) {.  u
11fe0 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
11ff0 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
12000 20 20 0a 20 20 61 73 73 65 72 74 28 20 70 46 69    .  assert( pFi
12010 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 35  le );.  OSTRACE5
12020 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20  ("UNLOCK  %d %d 
12030 77 61 73 20 25 64 20 70 69 64 3d 25 64 20 28 66  was %d pid=%d (f
12040 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  lock)\n", pFile-
12050 3e 68 2c 20 6c 6f 63 6b 74 79 70 65 2c 0a 20 20  >h, locktype,.  
12060 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e           pFile->
12070 6c 6f 63 6b 74 79 70 65 2c 20 67 65 74 70 69 64  locktype, getpid
12080 28 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6c  ());.  assert( l
12090 6f 63 6b 74 79 70 65 3c 3d 53 48 41 52 45 44 5f  ocktype<=SHARED_
120a0 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20  LOCK );.  .  /* 
120b0 6e 6f 2d 6f 70 20 69 66 20 70 6f 73 73 69 62 6c  no-op if possibl
120c0 65 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65  e */.  if( pFile
120d0 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 6c 6f 63 6b  ->locktype==lock
120e0 74 79 70 65 20 29 7b 0a 20 20 20 20 72 65 74 75  type ){.    retu
120f0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
12100 7d 0a 20 20 0a 20 20 2f 2a 20 73 68 61 72 65 64  }.  .  /* shared
12110 20 63 61 6e 20 6a 75 73 74 20 62 65 20 73 65 74   can just be set
12120 20 62 65 63 61 75 73 65 20 77 65 20 61 6c 77 61   because we alwa
12130 79 73 20 68 61 76 65 20 61 6e 20 65 78 63 6c 75  ys have an exclu
12140 73 69 76 65 20 2a 2f 0a 20 20 69 66 20 28 6c 6f  sive */.  if (lo
12150 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c  cktype==SHARED_L
12160 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65  OCK) {.    pFile
12170 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63  ->locktype = loc
12180 6b 74 79 70 65 3b 0a 20 20 20 20 72 65 74 75 72  ktype;.    retur
12190 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
121a0 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2c 20 72 65 61  .  .  /* no, rea
121b0 6c 6c 79 2c 20 75 6e 6c 6f 63 6b 2e 20 2a 2f 0a  lly, unlock. */.
121c0 20 20 69 6e 74 20 72 63 20 3d 20 66 6c 6f 63 6b    int rc = flock
121d0 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f  (pFile->h, LOCK_
121e0 55 4e 29 3b 0a 20 20 69 66 20 28 72 63 29 20 7b  UN);.  if (rc) {
121f0 0a 20 20 20 20 69 6e 74 20 72 2c 20 74 45 72 72  .    int r, tErr
12200 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
12210 72 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  r = sqliteErrorF
12220 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
12230 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45  rrno, SQLITE_IOE
12240 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20  RR_UNLOCK);.    
12250 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  if( IS_LOCK_ERRO
12260 52 28 72 29 20 29 7b 0a 20 20 20 20 20 20 70 46  R(r) ){.      pF
12270 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
12280 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 23   tErrno;.    }.#
12290 69 66 64 65 66 20 53 51 4c 49 54 45 5f 49 47 4e  ifdef SQLITE_IGN
122a0 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45  ORE_FLOCK_LOCK_E
122b0 52 52 4f 52 53 0a 20 20 20 20 69 66 28 20 28 72  RRORS.    if( (r
122c0 20 26 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29   & SQLITE_IOERR)
122d0 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52   == SQLITE_IOERR
122e0 20 29 7b 0a 20 20 20 20 20 20 72 20 3d 20 53 51   ){.      r = SQ
122f0 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d  LITE_BUSY;.    }
12300 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
12310 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c  E_IGNORE_FLOCK_L
12320 4f 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20  OCK_ERRORS */.  
12330 20 20 0a 20 20 20 20 72 65 74 75 72 6e 20 72 3b    .    return r;
12340 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20  .  } else {.    
12350 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20  pFile->locktype 
12360 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 72  = NO_LOCK;.    r
12370 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
12380 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  .  }.}../*.** Cl
12390 6f 73 65 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73  ose a file..*/.s
123a0 74 61 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b 43  tatic int flockC
123b0 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  lose(sqlite3_fil
123c0 65 20 2a 69 64 29 20 7b 0a 20 20 69 66 28 20 69  e *id) {.  if( i
123d0 64 20 29 7b 0a 20 20 20 20 66 6c 6f 63 6b 55 6e  d ){.    flockUn
123e0 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b  lock(id, NO_LOCK
123f0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
12400 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64  closeUnixFile(id
12410 29 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20  );.}..#endif /* 
12420 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
12430 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 21  CKING_STYLE && !
12440 4f 53 5f 56 58 57 4f 52 4b 20 2a 2f 0a 0a 2f 2a  OS_VXWORK */../*
12450 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12460 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 66 6c  ** End of the fl
12470 6f 63 6b 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65  ock lock impleme
12480 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a  ntation ********
12490 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
124a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
124b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
124c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
124d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
124e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f  ************/../
124f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12500 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12510 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12520 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12530 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
12540 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12550 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 4e 61  ******* Begin Na
12560 6d 65 64 20 53 65 6d 61 70 68 6f 72 65 20 4c 6f  med Semaphore Lo
12570 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  cking **********
12580 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
12590 2a 0a 2a 2a 20 4e 61 6d 65 64 20 73 65 6d 61 70  *.** Named semap
125a0 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20  hore locking is 
125b0 6f 6e 6c 79 20 73 75 70 70 6f 72 74 65 64 20 6f  only supported o
125c0 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a 0a 2a 2a  n VxWorks..**.**
125d0 20 53 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69   Semaphore locki
125e0 6e 67 20 69 73 20 6c 69 6b 65 20 64 6f 74 2d 6c  ng is like dot-l
125f0 6f 63 6b 20 61 6e 64 20 66 6c 6f 63 6b 20 69 6e  ock and flock in
12600 20 74 68 61 74 20 69 74 20 72 65 61 6c 6c 79 20   that it really 
12610 6f 6e 6c 79 0a 2a 2a 20 73 75 70 70 6f 72 74 73  only.** supports
12620 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 69   EXCLUSIVE locki
12630 6e 67 2e 20 20 4f 6e 6c 79 20 61 20 73 69 6e 67  ng.  Only a sing
12640 6c 65 20 70 72 6f 63 65 73 73 20 63 61 6e 20 72  le process can r
12650 65 61 64 20 6f 72 20 77 72 69 74 65 0a 2a 2a 20  ead or write.** 
12660 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
12670 65 20 61 74 20 61 20 74 69 6d 65 2e 20 20 54 68  e at a time.  Th
12680 69 73 20 72 65 64 75 63 65 73 20 70 6f 74 65 6e  is reduces poten
12690 74 69 61 6c 20 63 6f 6e 63 75 72 72 65 6e 63 79  tial concurrency
126a0 2c 20 62 75 74 0a 2a 2a 20 6d 61 6b 65 73 20 74  , but.** makes t
126b0 68 65 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e  he lock implemen
126c0 74 61 74 69 6f 6e 20 6d 75 63 68 20 65 61 73 69  tation much easi
126d0 65 72 2e 0a 2a 2f 0a 23 69 66 20 4f 53 5f 56 58  er..*/.#if OS_VX
126e0 57 4f 52 4b 53 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  WORKS../*.** Thi
126f0 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73  s routine checks
12700 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 52   if there is a R
12710 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c  ESERVED lock hel
12720 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69  d on the specifi
12730 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68  ed.** file by th
12740 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20  is or any other 
12750 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68  process. If such
12760 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c   a lock is held,
12770 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a   set *pResOut.**
12780 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76   to a non-zero v
12790 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a  alue otherwise *
127a0 70 52 65 73 4f 75 74 20 69 73 20 73 65 74 20 74  pResOut is set t
127b0 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74  o zero.  The ret
127c0 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20  urn value.** is 
127d0 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b  set to SQLITE_OK
127e0 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65   unless an I/O e
127f0 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69  rror occurs duri
12800 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67  ng lock checking
12810 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
12820 73 65 6d 43 68 65 63 6b 52 65 73 65 72 76 65 64  semCheckReserved
12830 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
12840 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73  e *id, int *pRes
12850 4f 75 74 29 20 7b 0a 20 20 69 6e 74 20 72 63 20  Out) {.  int rc 
12860 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
12870 6e 74 20 72 65 73 65 72 76 65 64 20 3d 20 30 3b  nt reserved = 0;
12880 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
12890 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
128a0 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49  id;..  SimulateI
128b0 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53  OError( return S
128c0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43  QLITE_IOERR_CHEC
128d0 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29  KRESERVEDLOCK; )
128e0 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 70  ;.  .  assert( p
128f0 46 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 43 68  File );..  /* Ch
12900 65 63 6b 20 69 66 20 61 20 74 68 72 65 61 64 20  eck if a thread 
12910 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 20  in this process 
12920 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c 6f 63  holds such a loc
12930 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65  k */.  if( pFile
12940 2d 3e 6c 6f 63 6b 74 79 70 65 3e 53 48 41 52 45  ->locktype>SHARE
12950 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65  D_LOCK ){.    re
12960 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a  served = 1;.  }.
12970 20 20 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69 73    .  /* Otherwis
12980 65 20 73 65 65 20 69 66 20 73 6f 6d 65 20 6f 74  e see if some ot
12990 68 65 72 20 70 72 6f 63 65 73 73 20 68 6f 6c 64  her process hold
129a0 73 20 69 74 2e 20 2a 2f 0a 20 20 69 66 28 20 21  s it. */.  if( !
129b0 72 65 73 65 72 76 65 64 20 29 7b 0a 20 20 20 20  reserved ){.    
129c0 73 65 6d 5f 74 20 2a 70 53 65 6d 20 3d 20 70 46  sem_t *pSem = pF
129d0 69 6c 65 2d 3e 70 4f 70 65 6e 2d 3e 70 53 65 6d  ile->pOpen->pSem
129e0 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73 74 61  ;.    struct sta
129f0 74 20 73 74 61 74 42 75 66 3b 0a 0a 20 20 20 20  t statBuf;..    
12a00 69 66 28 20 73 65 6d 5f 74 72 79 77 61 69 74 28  if( sem_trywait(
12a10 70 53 65 6d 29 3d 3d 2d 31 20 29 7b 0a 20 20 20  pSem)==-1 ){.   
12a20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20     int tErrno = 
12a30 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 69 66 28  errno;.      if(
12a40 20 45 41 47 41 49 4e 20 21 3d 20 74 45 72 72 6e   EAGAIN != tErrn
12a50 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  o ){.        rc 
12a60 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  = sqliteErrorFro
12a70 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72  mPosixError(tErr
12a80 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  no, SQLITE_IOERR
12a90 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f  _CHECKRESERVEDLO
12aa0 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 70 46 69  CK);.        pFi
12ab0 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
12ac0 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 20  tErrno;.      } 
12ad0 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 2f  else {.        /
12ae0 2a 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 68  * someone else h
12af0 61 73 20 74 68 65 20 6c 6f 63 6b 20 77 68 65 6e  as the lock when
12b00 20 77 65 20 61 72 65 20 69 6e 20 4e 4f 5f 4c 4f   we are in NO_LO
12b10 43 4b 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65  CK */.        re
12b20 73 65 72 76 65 64 20 3d 20 28 70 46 69 6c 65 2d  served = (pFile-
12b30 3e 6c 6f 63 6b 74 79 70 65 20 3c 20 53 48 41 52  >locktype < SHAR
12b40 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  ED_LOCK);.      
12b50 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
12b60 20 20 20 2f 2a 20 77 65 20 63 6f 75 6c 64 20 68     /* we could h
12b70 61 76 65 20 69 74 20 69 66 20 77 65 20 77 61 6e  ave it if we wan
12b80 74 20 69 74 20 2a 2f 0a 20 20 20 20 20 20 73 65  t it */.      se
12b90 6d 5f 70 6f 73 74 28 70 53 65 6d 29 3b 0a 20 20  m_post(pSem);.  
12ba0 20 20 7d 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43    }.  }.  OSTRAC
12bb0 45 34 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b  E4("TEST WR-LOCK
12bc0 20 25 64 20 25 64 20 25 64 20 28 73 65 6d 29 5c   %d %d %d (sem)\
12bd0 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63  n", pFile->h, rc
12be0 2c 20 72 65 73 65 72 76 65 64 29 3b 0a 0a 20 20  , reserved);..  
12bf0 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72  *pResOut = reser
12c00 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ved;.  return rc
12c10 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20  ;.}../*.** Lock 
12c20 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74 68  the file with th
12c30 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64  e lock specified
12c40 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 6c 6f   by parameter lo
12c50 63 6b 74 79 70 65 20 2d 20 6f 6e 65 0a 2a 2a 20  cktype - one.** 
12c60 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
12c70 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20  :.**.**     (1) 
12c80 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20  SHARED_LOCK.**  
12c90 20 20 20 28 32 29 20 52 45 53 45 52 56 45 44 5f     (2) RESERVED_
12ca0 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20  LOCK.**     (3) 
12cb0 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20  PENDING_LOCK.** 
12cc0 20 20 20 20 28 34 29 20 45 58 43 4c 55 53 49 56      (4) EXCLUSIV
12cd0 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d  E_LOCK.**.** Som
12ce0 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75  etimes when requ
12cf0 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20  esting one lock 
12d00 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61  state, additiona
12d10 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a  l lock states.**
12d20 20 61 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e   are inserted in
12d30 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c   between.  The l
12d40 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69  ocking might fai
12d50 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  l on one of the 
12d60 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74  later.** transit
12d70 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65  ions leaving the
12d80 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66   lock state diff
12d90 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20  erent from what 
12da0 69 74 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a  it started but.*
12db0 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66  * still short of
12dc0 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20   its goal.  The 
12dd0 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20  following chart 
12de0 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65  shows the allowe
12df0 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73  d.** transitions
12e00 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65   and the inserte
12e10 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73  d intermediate s
12e20 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  tates:.**.**    
12e30 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52  UNLOCKED -> SHAR
12e40 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20  ED.**    SHARED 
12e50 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20  -> RESERVED.**  
12e60 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e    SHARED -> (PEN
12e70 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49  DING) -> EXCLUSI
12e80 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45  VE.**    RESERVE
12e90 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d  D -> (PENDING) -
12ea0 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  > EXCLUSIVE.**  
12eb0 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43    PENDING -> EXC
12ec0 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 53 65 6d  LUSIVE.**.** Sem
12ed0 61 70 68 6f 72 65 20 6c 6f 63 6b 73 20 6f 6e 6c  aphore locks onl
12ee0 79 20 72 65 61 6c 6c 79 20 73 75 70 70 6f 72 74  y really support
12ef0 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73   EXCLUSIVE locks
12f00 2e 20 20 57 65 20 74 72 61 63 6b 20 69 6e 74 65  .  We track inte
12f10 72 6d 65 64 69 61 74 65 0a 2a 2a 20 6c 6f 63 6b  rmediate.** lock
12f20 20 73 74 61 74 65 73 20 69 6e 20 74 68 65 20 73   states in the s
12f30 71 6c 69 74 65 33 5f 66 69 6c 65 20 73 74 72 75  qlite3_file stru
12f40 63 74 75 72 65 2c 20 62 75 74 20 61 6c 6c 20 6c  cture, but all l
12f50 6f 63 6b 73 20 53 48 41 52 45 44 20 6f 72 0a 2a  ocks SHARED or.*
12f60 2a 20 61 62 6f 76 65 20 61 72 65 20 72 65 61 6c  * above are real
12f70 6c 79 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  ly EXCLUSIVE loc
12f80 6b 73 20 61 6e 64 20 65 78 63 6c 75 64 65 20 61  ks and exclude a
12f90 6c 6c 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  ll other process
12fa0 65 73 20 66 72 6f 6d 0a 2a 2a 20 61 63 63 65 73  es from.** acces
12fb0 73 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  s the file..**.*
12fc0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
12fd0 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73  ill only increas
12fe0 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74  e a lock.  Use t
12ff0 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f  he sqlite3OsUnlo
13000 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  ck().** routine 
13010 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69  to lower a locki
13020 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61  ng level..*/.sta
13030 74 69 63 20 69 6e 74 20 73 65 6d 4c 6f 63 6b 28  tic int semLock(
13040 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
13050 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 20  , int locktype) 
13060 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  {.  unixFile *pF
13070 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
13080 29 69 64 3b 0a 20 20 69 6e 74 20 66 64 3b 0a 20  )id;.  int fd;. 
13090 20 73 65 6d 5f 74 20 2a 70 53 65 6d 20 3d 20 70   sem_t *pSem = p
130a0 46 69 6c 65 2d 3e 70 4f 70 65 6e 2d 3e 70 53 65  File->pOpen->pSe
130b0 6d 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  m;.  int rc = SQ
130c0 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 69  LITE_OK;..  /* i
130d0 66 20 77 65 20 61 6c 72 65 61 64 79 20 68 61 76  f we already hav
130e0 65 20 61 20 6c 6f 63 6b 2c 20 69 74 20 69 73 20  e a lock, it is 
130f0 65 78 63 6c 75 73 69 76 65 2e 20 20 0a 20 20 2a  exclusive.  .  *
13100 2a 20 4a 75 73 74 20 61 64 6a 75 73 74 20 6c 65  * Just adjust le
13110 76 65 6c 20 61 6e 64 20 70 75 6e 74 20 6f 6e 20  vel and punt on 
13120 6f 75 74 74 61 20 68 65 72 65 2e 20 2a 2f 0a 20  outta here. */. 
13130 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b   if (pFile->lock
13140 74 79 70 65 20 3e 20 4e 4f 5f 4c 4f 43 4b 29 20  type > NO_LOCK) 
13150 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63  {.    pFile->loc
13160 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65  ktype = locktype
13170 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
13180 45 5f 4f 4b 3b 0a 20 20 20 20 67 6f 74 6f 20 73  E_OK;.    goto s
13190 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d  em_end_lock;.  }
131a0 0a 20 20 0a 20 20 2f 2a 20 6c 6f 63 6b 20 73 65  .  .  /* lock se
131b0 6d 61 70 68 6f 72 65 20 6e 6f 77 20 62 75 74 20  maphore now but 
131c0 62 61 69 6c 20 6f 75 74 20 77 68 65 6e 20 61 6c  bail out when al
131d0 72 65 61 64 79 20 6c 6f 63 6b 65 64 2e 20 2a 2f  ready locked. */
131e0 0a 20 20 69 66 28 20 73 65 6d 5f 74 72 79 77 61  .  if( sem_trywa
131f0 69 74 28 70 53 65 6d 29 3d 3d 2d 31 20 29 7b 0a  it(pSem)==-1 ){.
13200 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
13210 42 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20 73  BUSY;.    goto s
13220 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d  em_end_lock;.  }
13230 0a 0a 20 20 2f 2a 20 67 6f 74 20 69 74 2c 20 73  ..  /* got it, s
13240 65 74 20 74 68 65 20 74 79 70 65 20 61 6e 64 20  et the type and 
13250 72 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20 70  return ok */.  p
13260 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d  File->locktype =
13270 20 6c 6f 63 6b 74 79 70 65 3b 0a 0a 20 73 65 6d   locktype;.. sem
13280 5f 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 72 65 74  _end_lock:.  ret
13290 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
132a0 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69   Lower the locki
132b0 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65  ng level on file
132c0 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c   descriptor pFil
132d0 65 20 74 6f 20 6c 6f 63 6b 74 79 70 65 2e 20 20  e to locktype.  
132e0 6c 6f 63 6b 74 79 70 65 0a 2a 2a 20 6d 75 73 74  locktype.** must
132f0 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f   be either NO_LO
13300 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43  CK or SHARED_LOC
13310 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  K..**.** If the 
13320 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66  locking level of
13330 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
13340 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20  ptor is already 
13350 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74  at or below.** t
13360 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63  he requested loc
13370 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73  king level, this
13380 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
13390 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  -op..*/.static i
133a0 6e 74 20 73 65 6d 55 6e 6c 6f 63 6b 28 73 71 6c  nt semUnlock(sql
133b0 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
133c0 6e 74 20 6c 6f 63 6b 74 79 70 65 29 20 7b 0a 20  nt locktype) {. 
133d0 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
133e0 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
133f0 3b 0a 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d 20  ;.  sem_t *pSem 
13400 3d 20 70 46 69 6c 65 2d 3e 70 4f 70 65 6e 2d 3e  = pFile->pOpen->
13410 70 53 65 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28  pSem;..  assert(
13420 20 70 46 69 6c 65 20 29 3b 0a 20 20 61 73 73 65   pFile );.  asse
13430 72 74 28 20 70 53 65 6d 20 29 3b 0a 20 20 4f 53  rt( pSem );.  OS
13440 54 52 41 43 45 35 28 22 55 4e 4c 4f 43 4b 20 20  TRACE5("UNLOCK  
13450 25 64 20 25 64 20 77 61 73 20 25 64 20 70 69 64  %d %d was %d pid
13460 3d 25 64 20 28 73 65 6d 29 5c 6e 22 2c 20 70 46  =%d (sem)\n", pF
13470 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70 65  ile->h, locktype
13480 2c 0a 09 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63  ,..   pFile->loc
13490 6b 74 79 70 65 2c 20 67 65 74 70 69 64 28 29 29  ktype, getpid())
134a0 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b  ;.  assert( lock
134b0 74 79 70 65 3c 3d 53 48 41 52 45 44 5f 4c 4f 43  type<=SHARED_LOC
134c0 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d  K );.  .  /* no-
134d0 6f 70 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a  op if possible *
134e0 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c  /.  if( pFile->l
134f0 6f 63 6b 74 79 70 65 3d 3d 6c 6f 63 6b 74 79 70  ocktype==locktyp
13500 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
13510 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
13520 20 0a 20 20 2f 2a 20 73 68 61 72 65 64 20 63 61   .  /* shared ca
13530 6e 20 6a 75 73 74 20 62 65 20 73 65 74 20 62 65  n just be set be
13540 63 61 75 73 65 20 77 65 20 61 6c 77 61 79 73 20  cause we always 
13550 68 61 76 65 20 61 6e 20 65 78 63 6c 75 73 69 76  have an exclusiv
13560 65 20 2a 2f 0a 20 20 69 66 20 28 6c 6f 63 6b 74  e */.  if (lockt
13570 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype==SHARED_LOCK
13580 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c  ) {.    pFile->l
13590 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79  ocktype = lockty
135a0 70 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  pe;.    return S
135b0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
135c0 0a 20 20 2f 2a 20 6e 6f 2c 20 72 65 61 6c 6c 79  .  /* no, really
135d0 20 75 6e 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 69 66   unlock. */.  if
135e0 20 28 20 73 65 6d 5f 70 6f 73 74 28 70 53 65 6d   ( sem_post(pSem
135f0 29 3d 3d 2d 31 20 29 20 7b 0a 20 20 20 20 69 6e  )==-1 ) {.    in
13600 74 20 72 63 2c 20 74 45 72 72 6e 6f 20 3d 20 65  t rc, tErrno = e
13610 72 72 6e 6f 3b 0a 20 20 20 20 72 63 20 3d 20 73  rrno;.    rc = s
13620 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
13630 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c  sixError(tErrno,
13640 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e   SQLITE_IOERR_UN
13650 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 49  LOCK);.    if( I
13660 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29  S_LOCK_ERROR(rc)
13670 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d   ){.      pFile-
13680 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72  >lastErrno = tEr
13690 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  rno;.    }.    r
136a0 65 74 75 72 6e 20 72 63 3b 20 0a 20 20 7d 0a 20  eturn rc; .  }. 
136b0 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
136c0 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 72 65   = NO_LOCK;.  re
136d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
136e0 7d 0a 0a 2f 2a 0a 20 2a 2a 20 43 6c 6f 73 65 20  }../*. ** Close 
136f0 61 20 66 69 6c 65 2e 0a 20 2a 2f 0a 73 74 61 74  a file.. */.stat
13700 69 63 20 69 6e 74 20 73 65 6d 43 6c 6f 73 65 28  ic int semClose(
13710 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
13720 29 20 7b 0a 20 20 69 66 28 20 69 64 20 29 7b 0a  ) {.  if( id ){.
13730 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46      unixFile *pF
13740 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
13750 29 69 64 3b 0a 20 20 20 20 73 65 6d 55 6e 6c 6f  )id;.    semUnlo
13760 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b  ck(id, NO_LOCK);
13770 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69  .    assert( pFi
13780 6c 65 20 29 3b 0a 20 20 20 20 75 6e 69 78 45 6e  le );.    unixEn
13790 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20  terMutex();.    
137a0 72 65 6c 65 61 73 65 4c 6f 63 6b 49 6e 66 6f 28  releaseLockInfo(
137b0 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 29 3b 0a 20  pFile->pLock);. 
137c0 20 20 20 72 65 6c 65 61 73 65 4f 70 65 6e 43 6e     releaseOpenCn
137d0 74 28 70 46 69 6c 65 2d 3e 70 4f 70 65 6e 29 3b  t(pFile->pOpen);
137e0 0a 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75  .    unixLeaveMu
137f0 74 65 78 28 29 3b 0a 20 20 20 20 63 6c 6f 73 65  tex();.    close
13800 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 20 20  UnixFile(id);.  
13810 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
13820 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20  E_OK;.}..#endif 
13830 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f  /* OS_VXWORKS */
13840 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65 64 20 73 65 6d  ./*.** Named sem
13850 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 69  aphore locking i
13860 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65  s only available
13870 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a 0a   on VxWorks..**.
13880 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
13890 45 6e 64 20 6f 66 20 74 68 65 20 6e 61 6d 65 64  End of the named
138a0 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 20   semaphore lock 
138b0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a  implementation *
138c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
138d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
138e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
138f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13900 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13910 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
13920 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
13930 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13940 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13950 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13960 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13970 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
13980 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65  ************* Be
13990 67 69 6e 20 41 46 50 20 4c 6f 63 6b 69 6e 67 20  gin AFP Locking 
139a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
139b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
139c0 2a 0a 2a 2a 0a 2a 2a 20 41 46 50 20 69 73 20 74  *.**.** AFP is t
139d0 68 65 20 41 70 70 6c 65 20 46 69 6c 69 6e 67 20  he Apple Filing 
139e0 50 72 6f 74 6f 63 6f 6c 2e 20 20 41 46 50 20 69  Protocol.  AFP i
139f0 73 20 61 20 6e 65 74 77 6f 72 6b 20 66 69 6c 65  s a network file
13a00 73 79 73 74 65 6d 20 66 6f 75 6e 64 0a 2a 2a 20  system found.** 
13a10 6f 6e 20 41 70 70 6c 65 20 4d 61 63 69 6e 74 6f  on Apple Macinto
13a20 73 68 20 63 6f 6d 70 75 74 65 72 73 20 2d 20 62  sh computers - b
13a30 6f 74 68 20 4f 53 39 20 61 6e 64 20 4f 53 58 2e  oth OS9 and OSX.
13a40 0a 2a 2a 0a 2a 2a 20 54 68 69 72 64 2d 70 61 72  .**.** Third-par
13a50 74 79 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ty implementatio
13a60 6e 73 20 6f 66 20 41 46 50 20 61 72 65 20 61 76  ns of AFP are av
13a70 61 69 6c 61 62 6c 65 2e 20 20 42 75 74 20 74 68  ailable.  But th
13a80 69 73 20 63 6f 64 65 20 68 65 72 65 0a 2a 2a 20  is code here.** 
13a90 6f 6e 6c 79 20 77 6f 72 6b 73 20 6f 6e 20 4f 53  only works on OS
13aa0 58 2e 0a 2a 2f 0a 0a 23 69 66 20 64 65 66 69 6e  X..*/..#if defin
13ab0 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26  ed(__APPLE__) &&
13ac0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
13ad0 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 0a  OCKING_STYLE./*.
13ae0 2a 2a 20 54 68 65 20 61 66 70 4c 6f 63 6b 69 6e  ** The afpLockin
13af0 67 43 6f 6e 74 65 78 74 20 73 74 72 75 63 74 75  gContext structu
13b00 72 65 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 20  re contains all 
13b10 61 66 70 20 6c 6f 63 6b 20 73 70 65 63 69 66 69  afp lock specifi
13b20 63 20 73 74 61 74 65 0a 2a 2f 0a 74 79 70 65 64  c state.*/.typed
13b30 65 66 20 73 74 72 75 63 74 20 61 66 70 4c 6f 63  ef struct afpLoc
13b40 6b 69 6e 67 43 6f 6e 74 65 78 74 20 61 66 70 4c  kingContext afpL
13b50 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 73  ockingContext;.s
13b60 74 72 75 63 74 20 61 66 70 4c 6f 63 6b 69 6e 67  truct afpLocking
13b70 43 6f 6e 74 65 78 74 20 7b 0a 20 20 69 6e 74 20  Context {.  int 
13b80 72 65 73 65 72 76 65 64 3b 0a 20 20 63 6f 6e 73  reserved;.  cons
13b90 74 20 63 68 61 72 20 2a 64 62 50 61 74 68 3b 20  t char *dbPath; 
13ba0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
13bb0 61 6d 65 20 6f 66 20 74 68 65 20 6f 70 65 6e 20  ame of the open 
13bc0 66 69 6c 65 20 2a 2f 0a 7d 3b 0a 0a 73 74 72 75  file */.};..stru
13bd0 63 74 20 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b  ct ByteRangeLock
13be0 50 42 32 0a 7b 0a 20 20 75 6e 73 69 67 6e 65 64  PB2.{.  unsigned
13bf0 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6f 66 66 73 65   long long offse
13c00 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 6f 66 66  t;        /* off
13c10 73 65 74 20 74 6f 20 66 69 72 73 74 20 62 79 74  set to first byt
13c20 65 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75  e to lock */.  u
13c30 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e  nsigned long lon
13c40 67 20 6c 65 6e 67 74 68 3b 20 20 20 20 20 20 20  g length;       
13c50 20 2f 2a 20 6e 62 72 20 6f 66 20 62 79 74 65 73   /* nbr of bytes
13c60 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e   to lock */.  un
13c70 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67  signed long long
13c80 20 72 65 74 52 61 6e 67 65 53 74 61 72 74 3b 20   retRangeStart; 
13c90 2f 2a 20 6e 62 72 20 6f 66 20 31 73 74 20 62 79  /* nbr of 1st by
13ca0 74 65 20 6c 6f 63 6b 65 64 20 69 66 20 73 75 63  te locked if suc
13cb0 63 65 73 73 66 75 6c 20 2a 2f 0a 20 20 75 6e 73  cessful */.  uns
13cc0 69 67 6e 65 64 20 63 68 61 72 20 75 6e 4c 6f 63  igned char unLoc
13cd0 6b 46 6c 61 67 3b 20 20 20 20 20 20 20 20 20 2f  kFlag;         /
13ce0 2a 20 31 20 3d 20 75 6e 6c 6f 63 6b 2c 20 30 20  * 1 = unlock, 0 
13cf0 3d 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73 69  = lock */.  unsi
13d00 67 6e 65 64 20 63 68 61 72 20 73 74 61 72 74 45  gned char startE
13d10 6e 64 46 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a  ndFlag;       /*
13d20 20 31 3d 72 65 6c 20 74 6f 20 65 6e 64 20 6f 66   1=rel to end of
13d30 20 66 6f 72 6b 2c 20 30 3d 72 65 6c 20 74 6f 20   fork, 0=rel to 
13d40 73 74 61 72 74 20 2a 2f 0a 20 20 69 6e 74 20 66  start */.  int f
13d50 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
13d60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13d70 66 69 6c 65 20 64 65 73 63 20 74 6f 20 61 73 73  file desc to ass
13d80 6f 63 20 74 68 69 73 20 6c 6f 63 6b 20 77 69 74  oc this lock wit
13d90 68 20 2a 2f 0a 7d 3b 0a 0a 23 64 65 66 69 6e 65  h */.};..#define
13da0 20 61 66 70 66 73 42 79 74 65 52 61 6e 67 65 4c   afpfsByteRangeL
13db0 6f 63 6b 32 46 53 43 54 4c 20 20 20 20 20 20 20  ock2FSCTL       
13dc0 20 5f 49 4f 57 52 28 27 7a 27 2c 20 32 33 2c 20   _IOWR('z', 23, 
13dd0 73 74 72 75 63 74 20 42 79 74 65 52 61 6e 67 65  struct ByteRange
13de0 4c 6f 63 6b 50 42 32 29 0a 0a 2f 2a 0a 2a 2a 20  LockPB2)../*.** 
13df0 54 68 69 73 20 69 73 20 61 20 75 74 69 6c 69 74  This is a utilit
13e00 79 20 66 6f 72 20 73 65 74 74 69 6e 67 20 6f 72  y for setting or
13e10 20 63 6c 65 61 72 69 6e 67 20 61 20 62 69 74 2d   clearing a bit-
13e20 72 61 6e 67 65 20 6c 6f 63 6b 20 6f 6e 20 61 6e  range lock on an
13e30 0a 2a 2a 20 41 46 50 20 66 69 6c 65 73 79 73 74  .** AFP filesyst
13e40 65 6d 2e 0a 2a 2a 20 0a 2a 2a 20 52 65 74 75 72  em..** .** Retur
13e50 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
13e60 75 63 63 65 73 73 2c 20 53 51 4c 49 54 45 5f 42  uccess, SQLITE_B
13e70 55 53 59 20 6f 6e 20 66 61 69 6c 75 72 65 2e 0a  USY on failure..
13e80 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66  */.static int af
13e90 70 53 65 74 4c 6f 63 6b 28 0a 20 20 63 6f 6e 73  pSetLock(.  cons
13ea0 74 20 63 68 61 72 20 2a 70 61 74 68 2c 20 20 20  t char *path,   
13eb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
13ec0 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 74  me of the file t
13ed0 6f 20 62 65 20 6c 6f 63 6b 65 64 20 6f 72 20 75  o be locked or u
13ee0 6e 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 6e 69  nlocked */.  uni
13ef0 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 20  xFile *pFile,   
13f00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
13f10 70 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70  pen file descrip
13f20 74 6f 72 20 6f 6e 20 70 61 74 68 20 2a 2f 0a 20  tor on path */. 
13f30 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c   unsigned long l
13f40 6f 6e 67 20 6f 66 66 73 65 74 2c 20 20 20 20 20  ong offset,     
13f50 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 74 6f  /* First byte to
13f60 20 62 65 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20   be locked */.  
13f70 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f  unsigned long lo
13f80 6e 67 20 6c 65 6e 67 74 68 2c 20 20 20 20 20 2f  ng length,     /
13f90 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
13fa0 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69  s to lock */.  i
13fb0 6e 74 20 73 65 74 4c 6f 63 6b 46 6c 61 67 20 20  nt setLockFlag  
13fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13fd0 20 54 72 75 65 20 74 6f 20 73 65 74 20 6c 6f 63   True to set loc
13fe0 6b 2e 20 20 46 61 6c 73 65 20 74 6f 20 63 6c 65  k.  False to cle
13ff0 61 72 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20  ar lock */.){.  
14000 73 74 72 75 63 74 20 42 79 74 65 52 61 6e 67 65  struct ByteRange
14010 4c 6f 63 6b 50 42 32 20 70 62 3b 0a 20 20 69 6e  LockPB2 pb;.  in
14020 74 20 65 72 72 3b 0a 20 20 0a 20 20 70 62 2e 75  t err;.  .  pb.u
14030 6e 4c 6f 63 6b 46 6c 61 67 20 3d 20 73 65 74 4c  nLockFlag = setL
14040 6f 63 6b 46 6c 61 67 20 3f 20 30 20 3a 20 31 3b  ockFlag ? 0 : 1;
14050 0a 20 20 70 62 2e 73 74 61 72 74 45 6e 64 46 6c  .  pb.startEndFl
14060 61 67 20 3d 20 30 3b 0a 20 20 70 62 2e 6f 66 66  ag = 0;.  pb.off
14070 73 65 74 20 3d 20 6f 66 66 73 65 74 3b 0a 20 20  set = offset;.  
14080 70 62 2e 6c 65 6e 67 74 68 20 3d 20 6c 65 6e 67  pb.length = leng
14090 74 68 3b 20 0a 20 20 70 62 2e 66 64 20 3d 20 70  th; .  pb.fd = p
140a0 46 69 6c 65 2d 3e 68 3b 0a 20 20 0a 20 20 4f 53  File->h;.  .  OS
140b0 54 52 41 43 45 36 28 22 41 46 50 53 45 54 4c 4f  TRACE6("AFPSETLO
140c0 43 4b 20 5b 25 73 5d 20 66 6f 72 20 25 64 25 73  CK [%s] for %d%s
140d0 20 69 6e 20 72 61 6e 67 65 20 25 6c 6c 78 3a 25   in range %llx:%
140e0 6c 6c 78 5c 6e 22 2c 20 0a 20 20 20 20 28 73 65  llx\n", .    (se
140f0 74 4c 6f 63 6b 46 6c 61 67 3f 22 4f 4e 22 3a 22  tLockFlag?"ON":"
14100 4f 46 46 22 29 2c 20 70 46 69 6c 65 2d 3e 68 2c  OFF"), pFile->h,
14110 20 28 70 62 2e 66 64 3d 3d 2d 31 3f 22 5b 74 65   (pb.fd==-1?"[te
14120 73 74 76 61 6c 2d 31 5d 22 3a 22 22 29 2c 0a 20  stval-1]":""),. 
14130 20 20 20 6f 66 66 73 65 74 2c 20 6c 65 6e 67 74     offset, lengt
14140 68 29 3b 0a 20 20 65 72 72 20 3d 20 66 73 63 74  h);.  err = fsct
14150 6c 28 70 61 74 68 2c 20 61 66 70 66 73 42 79 74  l(path, afpfsByt
14160 65 52 61 6e 67 65 4c 6f 63 6b 32 46 53 43 54 4c  eRangeLock2FSCTL
14170 2c 20 26 70 62 2c 20 30 29 3b 0a 20 20 69 66 20  , &pb, 0);.  if 
14180 28 20 65 72 72 3d 3d 2d 31 20 29 20 7b 0a 20 20  ( err==-1 ) {.  
14190 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 69 6e    int rc;.    in
141a0 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  t tErrno = errno
141b0 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 34 28 22  ;.    OSTRACE4("
141c0 41 46 50 53 45 54 4c 4f 43 4b 20 66 61 69 6c 65  AFPSETLOCK faile
141d0 64 20 74 6f 20 66 73 63 74 6c 28 29 20 27 25 73  d to fsctl() '%s
141e0 27 20 25 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20  ' %d %s\n",.    
141f0 20 20 20 20 20 20 20 20 20 70 61 74 68 2c 20 74           path, t
14200 45 72 72 6e 6f 2c 20 73 74 72 65 72 72 6f 72 28  Errno, strerror(
14210 74 45 72 72 6e 6f 29 29 3b 0a 23 69 66 64 65 66  tErrno));.#ifdef
14220 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 41   SQLITE_IGNORE_A
14230 46 50 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20  FP_LOCK_ERRORS. 
14240 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
14250 55 53 59 3b 0a 23 65 6c 73 65 0a 20 20 20 20 72  USY;.#else.    r
14260 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  c = sqliteErrorF
14270 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
14280 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
14290 20 20 20 20 20 20 20 20 20 20 73 65 74 4c 6f 63            setLoc
142a0 6b 46 6c 61 67 20 3f 20 53 51 4c 49 54 45 5f 49  kFlag ? SQLITE_I
142b0 4f 45 52 52 5f 4c 4f 43 4b 20 3a 20 53 51 4c 49  OERR_LOCK : SQLI
142c0 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29  TE_IOERR_UNLOCK)
142d0 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ;.#endif /* SQLI
142e0 54 45 5f 49 47 4e 4f 52 45 5f 41 46 50 5f 4c 4f  TE_IGNORE_AFP_LO
142f0 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20 20  CK_ERRORS */.   
14300 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
14310 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20  OR(rc) ){.      
14320 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
14330 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d   = tErrno;.    }
14340 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
14350 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 72    } else {.    r
14360 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
14370 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
14380 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b  is routine check
14390 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20  s if there is a 
143a0 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65  RESERVED lock he
143b0 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66  ld on the specif
143c0 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74  ied.** file by t
143d0 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72  his or any other
143e0 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63   process. If suc
143f0 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  h a lock is held
14400 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a  , set *pResOut.*
14410 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20  * to a non-zero 
14420 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20  value otherwise 
14430 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65 74 20  *pResOut is set 
14440 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65  to zero.  The re
14450 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73  turn value.** is
14460 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f   set to SQLITE_O
14470 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20  K unless an I/O 
14480 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72  error occurs dur
14490 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e  ing lock checkin
144a0 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
144b0 20 61 66 70 43 68 65 63 6b 52 65 73 65 72 76 65   afpCheckReserve
144c0 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  dLock(sqlite3_fi
144d0 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65  le *id, int *pRe
144e0 73 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72 63 20  sOut){.  int rc 
144f0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
14500 6e 74 20 72 65 73 65 72 76 65 64 20 3d 20 30 3b  nt reserved = 0;
14510 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
14520 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
14530 69 64 3b 0a 20 20 0a 20 20 53 69 6d 75 6c 61 74  id;.  .  Simulat
14540 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
14550 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48   SQLITE_IOERR_CH
14560 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b  ECKRESERVEDLOCK;
14570 20 29 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28   );.  .  assert(
14580 20 70 46 69 6c 65 20 29 3b 0a 20 20 61 66 70 4c   pFile );.  afpL
14590 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 63  ockingContext *c
145a0 6f 6e 74 65 78 74 20 3d 20 28 61 66 70 4c 6f 63  ontext = (afpLoc
145b0 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 20 70  kingContext *) p
145c0 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
145d0 74 65 78 74 3b 0a 20 20 69 66 28 20 63 6f 6e 74  text;.  if( cont
145e0 65 78 74 2d 3e 72 65 73 65 72 76 65 64 20 29 7b  ext->reserved ){
145f0 0a 20 20 20 20 2a 70 52 65 73 4f 75 74 20 3d 20  .    *pResOut = 
14600 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  1;.    return SQ
14610 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 75  LITE_OK;.  }.  u
14620 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
14630 20 2f 2a 20 42 65 63 61 75 73 65 20 70 46 69 6c   /* Because pFil
14640 65 2d 3e 70 4c 6f 63 6b 20 69 73 20 73 68 61 72  e->pLock is shar
14650 65 64 20 61 63 72 6f 73 73 20 74 68 72 65 61 64  ed across thread
14660 73 20 2a 2f 0a 20 20 0a 20 20 2f 2a 20 43 68 65  s */.  .  /* Che
14670 63 6b 20 69 66 20 61 20 74 68 72 65 61 64 20 69  ck if a thread i
14680 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 68  n this process h
14690 6f 6c 64 73 20 73 75 63 68 20 61 20 6c 6f 63 6b  olds such a lock
146a0 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
146b0 3e 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65  >pLock->locktype
146c0 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  >SHARED_LOCK ){.
146d0 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31      reserved = 1
146e0 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74  ;.  }.  .  /* Ot
146f0 68 65 72 77 69 73 65 20 73 65 65 20 69 66 20 73  herwise see if s
14700 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73  ome other proces
14710 73 20 68 6f 6c 64 73 20 69 74 2e 0a 20 20 20 2a  s holds it..   *
14720 2f 0a 20 20 69 66 28 20 21 72 65 73 65 72 76 65  /.  if( !reserve
14730 64 20 29 7b 0a 20 20 20 20 2f 2a 20 6c 6f 63 6b  d ){.    /* lock
14740 20 74 68 65 20 52 45 53 45 52 56 45 44 20 62 79   the RESERVED by
14750 74 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6c 72  te */.    int lr
14760 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63  c = afpSetLock(c
14770 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20  ontext->dbPath, 
14780 70 46 69 6c 65 2c 20 52 45 53 45 52 56 45 44 5f  pFile, RESERVED_
14790 42 59 54 45 2c 20 31 2c 31 29 3b 20 20 0a 20 20  BYTE, 1,1);  .  
147a0 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d    if( SQLITE_OK=
147b0 3d 6c 72 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a  =lrc ){.      /*
147c0 20 69 66 20 77 65 20 73 75 63 63 65 65 64 65 64   if we succeeded
147d0 20 69 6e 20 74 61 6b 69 6e 67 20 74 68 65 20 72   in taking the r
147e0 65 73 65 72 76 65 64 20 6c 6f 63 6b 2c 20 75 6e  eserved lock, un
147f0 6c 6f 63 6b 20 69 74 20 74 6f 20 72 65 73 74 6f  lock it to resto
14800 72 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  re.      ** the 
14810 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65 20 2a  original state *
14820 2f 0a 20 20 20 20 20 20 6c 72 63 20 3d 20 61 66  /.      lrc = af
14830 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  pSetLock(context
14840 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
14850 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20   RESERVED_BYTE, 
14860 31 2c 20 30 29 3b 0a 20 20 20 20 7d 20 65 6c 73  1, 0);.    } els
14870 65 20 7b 0a 20 20 20 20 20 20 2f 2a 20 69 66 20  e {.      /* if 
14880 77 65 20 66 61 69 6c 65 64 20 74 6f 20 67 65 74  we failed to get
14890 20 74 68 65 20 6c 6f 63 6b 20 74 68 65 6e 20 73   the lock then s
148a0 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 6d 75 73 74  omeone else must
148b0 20 68 61 76 65 20 69 74 20 2a 2f 0a 20 20 20 20   have it */.    
148c0 20 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a    reserved = 1;.
148d0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 49 53      }.    if( IS
148e0 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 29  _LOCK_ERROR(lrc)
148f0 20 29 7b 0a 20 20 20 20 20 20 72 63 3d 6c 72 63   ){.      rc=lrc
14900 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20  ;.    }.  }.  . 
14910 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
14920 29 3b 0a 20 20 4f 53 54 52 41 43 45 34 28 22 54  );.  OSTRACE4("T
14930 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25  EST WR-LOCK %d %
14940 64 20 25 64 20 28 61 66 70 29 5c 6e 22 2c 20 70  d %d (afp)\n", p
14950 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73  File->h, rc, res
14960 65 72 76 65 64 29 3b 0a 20 20 0a 20 20 2a 70 52  erved);.  .  *pR
14970 65 73 4f 75 74 20 3d 20 72 65 73 65 72 76 65 64  esOut = reserved
14980 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
14990 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65  ../*.** Lock the
149a0 20 66 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c   file with the l
149b0 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20 62 79  ock specified by
149c0 20 70 61 72 61 6d 65 74 65 72 20 6c 6f 63 6b 74   parameter lockt
149d0 79 70 65 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20  ype - one.** of 
149e0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a  the following:.*
149f0 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41  *.**     (1) SHA
14a00 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  RED_LOCK.**     
14a10 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  (2) RESERVED_LOC
14a20 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e  K.**     (3) PEN
14a30 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  DING_LOCK.**    
14a40 20 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c   (4) EXCLUSIVE_L
14a50 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69  OCK.**.** Someti
14a60 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65 73 74  mes when request
14a70 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61  ing one lock sta
14a80 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c  te, additional l
14a90 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72  ock states.** ar
14aa0 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65  e inserted in be
14ab0 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b  tween.  The lock
14ac0 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f  ing might fail o
14ad0 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74  n one of the lat
14ae0 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  er.** transition
14af0 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f  s leaving the lo
14b00 63 6b 20 73 74 61 74 65 20 64 69 66 66 65 72 65  ck state differe
14b10 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20  nt from what it 
14b20 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73  started but.** s
14b30 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74  till short of it
14b40 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c  s goal.  The fol
14b50 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f  lowing chart sho
14b60 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a  ws the allowed.*
14b70 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e  * transitions an
14b80 64 20 74 68 65 20 69 6e 73 65 72 74 65 64 20 69  d the inserted i
14b90 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74  ntermediate stat
14ba0 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c  es:.**.**    UNL
14bb0 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a  OCKED -> SHARED.
14bc0 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20  **    SHARED -> 
14bd0 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53  RESERVED.**    S
14be0 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e  HARED -> (PENDIN
14bf0 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  G) -> EXCLUSIVE.
14c00 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44 20 2d  **    RESERVED -
14c10 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45  > (PENDING) -> E
14c20 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50  XCLUSIVE.**    P
14c30 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53  ENDING -> EXCLUS
14c40 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  IVE.**.** This r
14c50 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79  outine will only
14c60 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b   increase a lock
14c70 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c 69 74  .  Use the sqlit
14c80 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20  e3OsUnlock().** 
14c90 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72  routine to lower
14ca0 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c   a locking level
14cb0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
14cc0 61 66 70 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  afpLock(sqlite3_
14cd0 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f  file *id, int lo
14ce0 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74 20 72  cktype){.  int r
14cf0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
14d00 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
14d10 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
14d20 3b 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78 4c  ;.  struct unixL
14d30 6f 63 6b 49 6e 66 6f 20 2a 70 4c 6f 63 6b 20 3d  ockInfo *pLock =
14d40 20 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 3b 0a 20   pFile->pLock;. 
14d50 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65   afpLockingConte
14d60 78 74 20 2a 63 6f 6e 74 65 78 74 20 3d 20 28 61  xt *context = (a
14d70 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
14d80 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69   *) pFile->locki
14d90 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 0a 20 20  ngContext;.  .  
14da0 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
14db0 0a 20 20 4f 53 54 52 41 43 45 37 28 22 4c 4f 43  .  OSTRACE7("LOC
14dc0 4b 20 20 20 20 25 64 20 25 73 20 77 61 73 20 25  K    %d %s was %
14dd0 73 28 25 73 2c 25 64 29 20 70 69 64 3d 25 64 20  s(%s,%d) pid=%d 
14de0 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  (afp)\n", pFile-
14df0 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6c  >h,.           l
14e00 6f 63 6b 74 79 70 65 4e 61 6d 65 28 6c 6f 63 6b  ocktypeName(lock
14e10 74 79 70 65 29 2c 20 6c 6f 63 6b 74 79 70 65 4e  type), locktypeN
14e20 61 6d 65 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  ame(pFile->lockt
14e30 79 70 65 29 2c 0a 20 20 20 20 20 20 20 20 20 20  ype),.          
14e40 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28 70 4c   locktypeName(pL
14e50 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 29 2c 20  ock->locktype), 
14e60 70 4c 6f 63 6b 2d 3e 63 6e 74 20 2c 20 67 65 74  pLock->cnt , get
14e70 70 69 64 28 29 29 3b 0a 0a 20 20 2f 2a 20 49 66  pid());..  /* If
14e80 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64   there is alread
14e90 79 20 61 20 6c 6f 63 6b 20 6f 66 20 74 68 69 73  y a lock of this
14ea0 20 74 79 70 65 20 6f 72 20 6d 6f 72 65 20 72 65   type or more re
14eb0 73 74 72 69 63 74 69 76 65 20 6f 6e 20 74 68 65  strictive on the
14ec0 0a 20 20 2a 2a 20 75 6e 69 78 46 69 6c 65 2c 20  .  ** unixFile, 
14ed0 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e 27  do nothing. Don'
14ee0 74 20 75 73 65 20 74 68 65 20 61 66 70 5f 65 6e  t use the afp_en
14ef0 64 5f 6c 6f 63 6b 3a 20 65 78 69 74 20 70 61 74  d_lock: exit pat
14f00 68 2c 20 61 73 0a 20 20 2a 2a 20 75 6e 69 78 45  h, as.  ** unixE
14f10 6e 74 65 72 4d 75 74 65 78 28 29 20 68 61 73 6e  nterMutex() hasn
14f20 27 74 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 79  't been called y
14f30 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  et..  */.  if( p
14f40 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d  File->locktype>=
14f50 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20  locktype ){.    
14f60 4f 53 54 52 41 43 45 33 28 22 4c 4f 43 4b 20 20  OSTRACE3("LOCK  
14f70 20 20 25 64 20 25 73 20 6f 6b 20 28 61 6c 72 65    %d %s ok (alre
14f80 61 64 79 20 68 65 6c 64 29 20 28 61 66 70 29 5c  ady held) (afp)\
14f90 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20  n", pFile->h,.  
14fa0 20 20 20 20 20 20 20 20 20 6c 6f 63 6b 74 79 70           locktyp
14fb0 65 4e 61 6d 65 28 6c 6f 63 6b 74 79 70 65 29 29  eName(locktype))
14fc0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
14fd0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f  ITE_OK;.  }..  /
14fe0 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
14ff0 6c 6f 63 6b 69 6e 67 20 73 65 71 75 65 6e 63 65  locking sequence
15000 20 69 73 20 63 6f 72 72 65 63 74 0a 20 20 2a 2a   is correct.  **
15010 20 20 28 31 29 20 57 65 20 6e 65 76 65 72 20 6d    (1) We never m
15020 6f 76 65 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65  ove from unlocke
15030 64 20 74 6f 20 61 6e 79 74 68 69 6e 67 20 68 69  d to anything hi
15040 67 68 65 72 20 74 68 61 6e 20 73 68 61 72 65 64  gher than shared
15050 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28 32 29   lock..  **  (2)
15060 20 53 51 4c 69 74 65 20 6e 65 76 65 72 20 65 78   SQLite never ex
15070 70 6c 69 63 69 74 6c 79 20 72 65 71 75 65 73 74  plicitly request
15080 73 20 61 20 70 65 6e 64 69 67 20 6c 6f 63 6b 2e  s a pendig lock.
15090 0a 20 20 2a 2a 20 20 28 33 29 20 41 20 73 68 61  .  **  (3) A sha
150a0 72 65 64 20 6c 6f 63 6b 20 69 73 20 61 6c 77 61  red lock is alwa
150b0 79 73 20 68 65 6c 64 20 77 68 65 6e 20 61 20 72  ys held when a r
150c0 65 73 65 72 76 65 20 6c 6f 63 6b 20 69 73 20 72  eserve lock is r
150d0 65 71 75 65 73 74 65 64 2e 0a 20 20 2a 2f 0a 20  equested..  */. 
150e0 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e   assert( pFile->
150f0 6c 6f 63 6b 74 79 70 65 21 3d 4e 4f 5f 4c 4f 43  locktype!=NO_LOC
15100 4b 20 7c 7c 20 6c 6f 63 6b 74 79 70 65 3d 3d 53  K || locktype==S
15110 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
15120 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65  assert( locktype
15130 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29  !=PENDING_LOCK )
15140 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b  ;.  assert( lock
15150 74 79 70 65 21 3d 52 45 53 45 52 56 45 44 5f 4c  type!=RESERVED_L
15160 4f 43 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 6c 6f  OCK || pFile->lo
15170 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c  cktype==SHARED_L
15180 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 54  OCK );.  .  /* T
15190 68 69 73 20 6d 75 74 65 78 20 69 73 20 6e 65 65  his mutex is nee
151a0 64 65 64 20 62 65 63 61 75 73 65 20 70 46 69 6c  ded because pFil
151b0 65 2d 3e 70 4c 6f 63 6b 20 69 73 20 73 68 61 72  e->pLock is shar
151c0 65 64 20 61 63 72 6f 73 73 20 74 68 72 65 61 64  ed across thread
151d0 73 0a 20 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74  s.  */.  unixEnt
151e0 65 72 4d 75 74 65 78 28 29 3b 0a 0a 20 20 2f 2a  erMutex();..  /*
151f0 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 63   Make sure the c
15200 75 72 72 65 6e 74 20 74 68 72 65 61 64 20 6f 77  urrent thread ow
15210 6e 73 20 74 68 65 20 70 46 69 6c 65 2e 0a 20 20  ns the pFile..  
15220 2a 2f 0a 20 20 72 63 20 3d 20 74 72 61 6e 73 66  */.  rc = transf
15230 65 72 4f 77 6e 65 72 73 68 69 70 28 70 46 69 6c  erOwnership(pFil
15240 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  e);.  if( rc!=SQ
15250 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 75  LITE_OK ){.    u
15260 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
15270 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
15280 20 20 7d 0a 20 20 70 4c 6f 63 6b 20 3d 20 70 46    }.  pLock = pF
15290 69 6c 65 2d 3e 70 4c 6f 63 6b 3b 0a 0a 20 20 2f  ile->pLock;..  /
152a0 2a 20 49 66 20 73 6f 6d 65 20 74 68 72 65 61 64  * If some thread
152b0 20 75 73 69 6e 67 20 74 68 69 73 20 50 49 44 20   using this PID 
152c0 68 61 73 20 61 20 6c 6f 63 6b 20 76 69 61 20 61  has a lock via a
152d0 20 64 69 66 66 65 72 65 6e 74 20 75 6e 69 78 46   different unixF
152e0 69 6c 65 2a 0a 20 20 2a 2a 20 68 61 6e 64 6c 65  ile*.  ** handle
152f0 20 74 68 61 74 20 70 72 65 63 6c 75 64 65 73 20   that precludes 
15300 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
15310 63 6b 2c 20 72 65 74 75 72 6e 20 42 55 53 59 2e  ck, return BUSY.
15320 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 46 69  .  */.  if( (pFi
15330 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 21 3d 70 4c  le->locktype!=pL
15340 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 20 26 26  ock->locktype &&
15350 20 0a 20 20 20 20 20 20 20 28 70 4c 6f 63 6b 2d   .       (pLock-
15360 3e 6c 6f 63 6b 74 79 70 65 3e 3d 50 45 4e 44 49  >locktype>=PENDI
15370 4e 47 5f 4c 4f 43 4b 20 7c 7c 20 6c 6f 63 6b 74  NG_LOCK || lockt
15380 79 70 65 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 29  ype>SHARED_LOCK)
15390 29 0a 20 20 20 20 20 29 7b 0a 20 20 20 20 72 63  ).     ){.    rc
153a0 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
153b0 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64      goto afp_end
153c0 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 0a 20 20  _lock;.  }.  .  
153d0 2f 2a 20 49 66 20 61 20 53 48 41 52 45 44 20 6c  /* If a SHARED l
153e0 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74 65 64  ock is requested
153f0 2c 20 61 6e 64 20 73 6f 6d 65 20 74 68 72 65 61  , and some threa
15400 64 20 75 73 69 6e 67 20 74 68 69 73 20 50 49 44  d using this PID
15410 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 68 61   already.  ** ha
15420 73 20 61 20 53 48 41 52 45 44 20 6f 72 20 52 45  s a SHARED or RE
15430 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 74 68 65  SERVED lock, the
15440 6e 20 69 6e 63 72 65 6d 65 6e 74 20 72 65 66 65  n increment refe
15450 72 65 6e 63 65 20 63 6f 75 6e 74 73 20 61 6e 64  rence counts and
15460 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c  .  ** return SQL
15470 49 54 45 5f 4f 4b 2e 0a 20 20 2a 2f 0a 20 20 69  ITE_OK..  */.  i
15480 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41  f( locktype==SHA
15490 52 45 44 5f 4c 4f 43 4b 20 26 26 20 0a 20 20 20  RED_LOCK && .   
154a0 20 20 28 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79    (pLock->lockty
154b0 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  pe==SHARED_LOCK 
154c0 7c 7c 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79  || pLock->lockty
154d0 70 65 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  pe==RESERVED_LOC
154e0 4b 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  K) ){.    assert
154f0 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52  ( locktype==SHAR
15500 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 61  ED_LOCK );.    a
15510 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f  ssert( pFile->lo
15520 63 6b 74 79 70 65 3d 3d 30 20 29 3b 0a 20 20 20  cktype==0 );.   
15530 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e   assert( pLock->
15540 63 6e 74 3e 30 20 29 3b 0a 20 20 20 20 70 46 69  cnt>0 );.    pFi
15550 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 53  le->locktype = S
15560 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20  HARED_LOCK;.    
15570 70 4c 6f 63 6b 2d 3e 63 6e 74 2b 2b 3b 0a 20 20  pLock->cnt++;.  
15580 20 20 70 46 69 6c 65 2d 3e 70 4f 70 65 6e 2d 3e    pFile->pOpen->
15590 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 67 6f 74  nLock++;.    got
155a0 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a  o afp_end_lock;.
155b0 20 20 7d 0a 20 20 20 20 0a 20 20 2f 2a 20 41 20    }.    .  /* A 
155c0 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20  PENDING lock is 
155d0 6e 65 65 64 65 64 20 62 65 66 6f 72 65 20 61 63  needed before ac
155e0 71 75 69 72 69 6e 67 20 61 20 53 48 41 52 45 44  quiring a SHARED
155f0 20 6c 6f 63 6b 20 61 6e 64 20 62 65 66 6f 72 65   lock and before
15600 0a 20 20 2a 2a 20 61 63 71 75 69 72 69 6e 67 20  .  ** acquiring 
15610 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
15620 6b 2e 20 20 46 6f 72 20 74 68 65 20 53 48 41 52  k.  For the SHAR
15630 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20 50 45 4e  ED lock, the PEN
15640 44 49 4e 47 20 77 69 6c 6c 0a 20 20 2a 2a 20 62  DING will.  ** b
15650 65 20 72 65 6c 65 61 73 65 64 2e 0a 20 20 2a 2f  e released..  */
15660 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d  .  if( locktype=
15670 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 0a 20 20  =SHARED_LOCK .  
15680 20 20 20 20 7c 7c 20 28 6c 6f 63 6b 74 79 70 65      || (locktype
15690 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
156a0 20 26 26 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74   && pFile->lockt
156b0 79 70 65 3c 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  ype<PENDING_LOCK
156c0 29 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74 20 66  ).  ){.    int f
156d0 61 69 6c 65 64 3b 0a 20 20 20 20 66 61 69 6c 65  ailed;.    faile
156e0 64 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63  d = afpSetLock(c
156f0 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20  ontext->dbPath, 
15700 70 46 69 6c 65 2c 20 50 45 4e 44 49 4e 47 5f 42  pFile, PENDING_B
15710 59 54 45 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20  YTE, 1, 1);.    
15720 69 66 20 28 66 61 69 6c 65 64 29 20 7b 0a 20 20  if (failed) {.  
15730 20 20 20 20 72 63 20 3d 20 66 61 69 6c 65 64 3b      rc = failed;
15740 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70 5f  .      goto afp_
15750 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a  end_lock;.    }.
15760 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 49 66 20 63    }.  .  /* If c
15770 6f 6e 74 72 6f 6c 20 67 65 74 73 20 74 6f 20 74  ontrol gets to t
15780 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20  his point, then 
15790 61 63 74 75 61 6c 6c 79 20 67 6f 20 61 68 65 61  actually go ahea
157a0 64 20 61 6e 64 20 6d 61 6b 65 0a 20 20 2a 2a 20  d and make.  ** 
157b0 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
157c0 20 63 61 6c 6c 73 20 66 6f 72 20 74 68 65 20 73   calls for the s
157d0 70 65 63 69 66 69 65 64 20 6c 6f 63 6b 2e 0a 20  pecified lock.. 
157e0 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79   */.  if( lockty
157f0 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  pe==SHARED_LOCK 
15800 29 7b 0a 20 20 20 20 69 6e 74 20 6c 72 63 31 2c  ){.    int lrc1,
15810 20 6c 72 63 32 2c 20 6c 72 63 31 45 72 72 6e 6f   lrc2, lrc1Errno
15820 3b 0a 20 20 20 20 6c 6f 6e 67 20 6c 6b 2c 20 6d  ;.    long lk, m
15830 61 73 6b 3b 0a 20 20 20 20 0a 20 20 20 20 61 73  ask;.    .    as
15840 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 63 6e 74  sert( pLock->cnt
15850 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
15860 74 28 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79  t( pLock->lockty
15870 70 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  pe==0 );.       
15880 20 0a 20 20 20 20 6d 61 73 6b 20 3d 20 28 73 69   .    mask = (si
15890 7a 65 6f 66 28 6c 6f 6e 67 29 3d 3d 38 29 20 3f  zeof(long)==8) ?
158a0 20 4c 41 52 47 45 53 54 5f 49 4e 54 36 34 20 3a   LARGEST_INT64 :
158b0 20 30 78 37 66 66 66 66 66 66 66 3b 0a 20 20 20   0x7fffffff;.   
158c0 20 2f 2a 20 4e 6f 77 20 67 65 74 20 74 68 65 20   /* Now get the 
158d0 72 65 61 64 2d 6c 6f 63 6b 20 53 48 41 52 45 44  read-lock SHARED
158e0 5f 4c 4f 43 4b 20 2a 2f 0a 20 20 20 20 2f 2a 20  _LOCK */.    /* 
158f0 6e 6f 74 65 20 74 68 61 74 20 74 68 65 20 71 75  note that the qu
15900 61 6c 69 74 79 20 6f 66 20 74 68 65 20 72 61 6e  ality of the ran
15910 64 6f 6d 6e 65 73 73 20 64 6f 65 73 6e 27 74 20  domness doesn't 
15920 6d 61 74 74 65 72 20 74 68 61 74 20 6d 75 63 68  matter that much
15930 20 2a 2f 0a 20 20 20 20 6c 6b 20 3d 20 72 61 6e   */.    lk = ran
15940 64 6f 6d 28 29 3b 20 0a 20 20 20 20 70 4c 6f 63  dom(); .    pLoc
15950 6b 2d 3e 73 68 61 72 65 64 42 79 74 65 20 3d 20  k->sharedByte = 
15960 28 6c 6b 20 26 20 6d 61 73 6b 29 25 28 53 48 41  (lk & mask)%(SHA
15970 52 45 44 5f 53 49 5a 45 20 2d 20 31 29 3b 0a 20  RED_SIZE - 1);. 
15980 20 20 20 6c 72 63 31 20 3d 20 61 66 70 53 65 74     lrc1 = afpSet
15990 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62  Lock(context->db
159a0 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 0a 20 20  Path, pFile, .  
159b0 20 20 20 20 20 20 20 20 53 48 41 52 45 44 5f 46          SHARED_F
159c0 49 52 53 54 2b 70 4c 6f 63 6b 2d 3e 73 68 61 72  IRST+pLock->shar
159d0 65 64 42 79 74 65 2c 20 31 2c 20 31 29 3b 0a 20  edByte, 1, 1);. 
159e0 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
159f0 52 52 4f 52 28 6c 72 63 31 29 20 29 7b 0a 20 20  RROR(lrc1) ){.  
15a00 20 20 20 20 6c 72 63 31 45 72 72 6e 6f 20 3d 20      lrc1Errno = 
15a10 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
15a20 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 44  ;.    }.    /* D
15a30 72 6f 70 20 74 68 65 20 74 65 6d 70 6f 72 61 72  rop the temporar
15a40 79 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 2a  y PENDING lock *
15a50 2f 0a 20 20 20 20 6c 72 63 32 20 3d 20 61 66 70  /.    lrc2 = afp
15a60 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d  SetLock(context-
15a70 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20  >dbPath, pFile, 
15a80 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 31 2c  PENDING_BYTE, 1,
15a90 20 30 29 3b 0a 20 20 20 20 0a 20 20 20 20 69 66   0);.    .    if
15aa0 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  ( IS_LOCK_ERROR(
15ab0 6c 72 63 31 29 20 29 20 7b 0a 20 20 20 20 20 20  lrc1) ) {.      
15ac0 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
15ad0 20 3d 20 6c 72 63 31 45 72 72 6e 6f 3b 0a 20 20   = lrc1Errno;.  
15ae0 20 20 20 20 72 63 20 3d 20 6c 72 63 31 3b 0a 20      rc = lrc1;. 
15af0 20 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e       goto afp_en
15b00 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 20 65 6c  d_lock;.    } el
15b10 73 65 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45  se if( IS_LOCK_E
15b20 52 52 4f 52 28 6c 72 63 32 29 20 29 7b 0a 20 20  RROR(lrc2) ){.  
15b30 20 20 20 20 72 63 20 3d 20 6c 72 63 32 3b 0a 20      rc = lrc2;. 
15b40 20 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e       goto afp_en
15b50 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 20 65 6c  d_lock;.    } el
15b60 73 65 20 69 66 28 20 6c 72 63 31 20 21 3d 20 53  se if( lrc1 != S
15b70 51 4c 49 54 45 5f 4f 4b 20 29 20 7b 0a 20 20 20  QLITE_OK ) {.   
15b80 20 20 20 72 63 20 3d 20 6c 72 63 31 3b 0a 20 20     rc = lrc1;.  
15b90 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
15ba0 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
15bb0 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a   = SHARED_LOCK;.
15bc0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 70 4f 70        pFile->pOp
15bd0 65 6e 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20  en->nLock++;.   
15be0 20 20 20 70 4c 6f 63 6b 2d 3e 63 6e 74 20 3d 20     pLock->cnt = 
15bf0 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  1;.    }.  }else
15c00 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 45   if( locktype==E
15c10 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26  XCLUSIVE_LOCK &&
15c20 20 70 4c 6f 63 6b 2d 3e 63 6e 74 3e 31 20 29 7b   pLock->cnt>1 ){
15c30 0a 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20 74  .    /* We are t
15c40 72 79 69 6e 67 20 66 6f 72 20 61 6e 20 65 78 63  rying for an exc
15c50 6c 75 73 69 76 65 20 6c 6f 63 6b 20 62 75 74 20  lusive lock but 
15c60 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64 20 69  another thread i
15c70 6e 20 74 68 69 73 0a 20 20 20 20 20 2a 2a 20 73  n this.     ** s
15c80 61 6d 65 20 70 72 6f 63 65 73 73 20 69 73 20 73  ame process is s
15c90 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 20 73  till holding a s
15ca0 68 61 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20  hared lock. */. 
15cb0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
15cc0 55 53 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  USY;.  }else{.  
15cd0 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74    /* The request
15ce0 20 77 61 73 20 66 6f 72 20 61 20 52 45 53 45 52   was for a RESER
15cf0 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45  VED or EXCLUSIVE
15d00 20 6c 6f 63 6b 2e 20 20 49 74 20 69 73 0a 20 20   lock.  It is.  
15d10 20 20 2a 2a 20 61 73 73 75 6d 65 64 20 74 68 61    ** assumed tha
15d20 74 20 74 68 65 72 65 20 69 73 20 61 20 53 48 41  t there is a SHA
15d30 52 45 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c  RED or greater l
15d40 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 0a  ock on the file.
15d50 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79 2e 0a      ** already..
15d60 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 66      */.    int f
15d70 61 69 6c 65 64 20 3d 20 30 3b 0a 20 20 20 20 61  ailed = 0;.    a
15d80 73 73 65 72 74 28 20 30 21 3d 70 46 69 6c 65 2d  ssert( 0!=pFile-
15d90 3e 6c 6f 63 6b 74 79 70 65 20 29 3b 0a 20 20 20  >locktype );.   
15da0 20 69 66 20 28 6c 6f 63 6b 74 79 70 65 20 3e 3d   if (locktype >=
15db0 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 26   RESERVED_LOCK &
15dc0 26 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  & pFile->locktyp
15dd0 65 20 3c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  e < RESERVED_LOC
15de0 4b 29 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  K) {.        /* 
15df0 41 63 71 75 69 72 65 20 61 20 52 45 53 45 52 56  Acquire a RESERV
15e00 45 44 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20  ED lock */.     
15e10 20 20 20 66 61 69 6c 65 64 20 3d 20 61 66 70 53     failed = afpS
15e20 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
15e30 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 52  dbPath, pFile, R
15e40 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 31 2c  ESERVED_BYTE, 1,
15e50 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 66  1);.      if( !f
15e60 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20  ailed ){.       
15e70 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73 65 72 76   context->reserv
15e80 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  ed = 1;.      }.
15e90 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 21 66      }.    if (!f
15ea0 61 69 6c 65 64 20 26 26 20 6c 6f 63 6b 74 79 70  ailed && locktyp
15eb0 65 20 3d 3d 20 45 58 43 4c 55 53 49 56 45 5f 4c  e == EXCLUSIVE_L
15ec0 4f 43 4b 29 20 7b 0a 20 20 20 20 20 20 2f 2a 20  OCK) {.      /* 
15ed0 41 63 71 75 69 72 65 20 61 6e 20 45 58 43 4c 55  Acquire an EXCLU
15ee0 53 49 56 45 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20  SIVE lock */.   
15ef0 20 20 20 20 20 0a 20 20 20 20 20 20 2f 2a 20 52       .      /* R
15f00 65 6d 6f 76 65 20 74 68 65 20 73 68 61 72 65 64  emove the shared
15f10 20 6c 6f 63 6b 20 62 65 66 6f 72 65 20 74 72 79   lock before try
15f20 69 6e 67 20 74 68 65 20 72 61 6e 67 65 2e 20 20  ing the range.  
15f30 77 65 27 6c 6c 20 6e 65 65 64 20 74 6f 20 0a 20  we'll need to . 
15f40 20 20 20 20 20 2a 2a 20 72 65 65 73 74 61 62 6c       ** reestabl
15f50 69 73 68 20 74 68 65 20 73 68 61 72 65 64 20 6c  ish the shared l
15f60 6f 63 6b 20 69 66 20 77 65 20 63 61 6e 27 74 20  ock if we can't 
15f70 67 65 74 20 74 68 65 20 20 61 66 70 55 6e 6c 6f  get the  afpUnlo
15f80 63 6b 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  ck.      */.    
15f90 20 20 69 66 28 20 21 28 66 61 69 6c 65 64 20 3d    if( !(failed =
15fa0 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74   afpSetLock(cont
15fb0 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69  ext->dbPath, pFi
15fc0 6c 65 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54  le, SHARED_FIRST
15fd0 20 2b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   +.             
15fe0 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 6f 63              pLoc
15ff0 6b 2d 3e 73 68 61 72 65 64 42 79 74 65 2c 20 31  k->sharedByte, 1
16000 2c 20 30 29 29 20 29 7b 0a 20 20 20 20 20 20 20  , 0)) ){.       
16010 20 69 6e 74 20 66 61 69 6c 65 64 32 20 3d 20 53   int failed2 = S
16020 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
16030 20 20 2f 2a 20 6e 6f 77 20 61 74 74 65 6d 6d 70    /* now attemmp
16040 74 20 74 6f 20 67 65 74 20 74 68 65 20 65 78 63  t to get the exc
16050 6c 75 73 69 76 65 20 6c 6f 63 6b 20 72 61 6e 67  lusive lock rang
16060 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 61 69  e */.        fai
16070 6c 65 64 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b  led = afpSetLock
16080 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
16090 2c 20 70 46 69 6c 65 2c 20 53 48 41 52 45 44 5f  , pFile, SHARED_
160a0 46 49 52 53 54 2c 20 0a 20 20 20 20 20 20 20 20  FIRST, .        
160b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
160c0 20 20 20 20 20 20 20 53 48 41 52 45 44 5f 53 49         SHARED_SI
160d0 5a 45 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  ZE, 1);.        
160e0 69 66 28 20 66 61 69 6c 65 64 20 26 26 20 28 66  if( failed && (f
160f0 61 69 6c 65 64 32 20 3d 20 61 66 70 53 65 74 4c  ailed2 = afpSetL
16100 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50  ock(context->dbP
16110 61 74 68 2c 20 70 46 69 6c 65 2c 20 0a 20 20 20  ath, pFile, .   
16120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16130 20 20 20 20 53 48 41 52 45 44 5f 46 49 52 53 54      SHARED_FIRST
16140 20 2b 20 70 4c 6f 63 6b 2d 3e 73 68 61 72 65 64   + pLock->shared
16150 42 79 74 65 2c 20 31 2c 20 31 29 29 20 29 7b 0a  Byte, 1, 1)) ){.
16160 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61 6e            /* Can
16170 27 74 20 72 65 65 73 74 61 62 6c 69 73 68 20 74  't reestablish t
16180 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20  he shared lock. 
16190 20 53 71 6c 69 74 65 20 63 61 6e 27 74 20 64 65   Sqlite can't de
161a0 61 6c 2c 20 74 68 69 73 20 69 73 0a 20 20 20 20  al, this is.    
161b0 20 20 20 20 20 20 2a 2a 20 61 20 63 72 69 74 69        ** a criti
161c0 63 61 6c 20 49 2f 4f 20 65 72 72 6f 72 0a 20 20  cal I/O error.  
161d0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
161e0 20 20 20 20 20 72 63 20 3d 20 28 28 66 61 69 6c       rc = ((fail
161f0 65 64 20 26 20 53 51 4c 49 54 45 5f 49 4f 45 52  ed & SQLITE_IOER
16200 52 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45  R) == SQLITE_IOE
16210 52 52 29 20 3f 20 66 61 69 6c 65 64 32 20 3a 20  RR) ? failed2 : 
16220 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16230 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43  SQLITE_IOERR_LOC
16240 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  K;.          got
16250 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a  o afp_end_lock;.
16260 20 20 20 20 20 20 20 20 7d 20 0a 20 20 20 20 20          } .     
16270 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
16280 72 63 20 3d 20 66 61 69 6c 65 64 3b 20 0a 20 20  rc = failed; .  
16290 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
162a0 69 66 28 20 66 61 69 6c 65 64 20 29 7b 0a 20 20  if( failed ){.  
162b0 20 20 20 20 72 63 20 3d 20 66 61 69 6c 65 64 3b      rc = failed;
162c0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20  .    }.  }.  .  
162d0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
162e0 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  K ){.    pFile->
162f0 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74  locktype = lockt
16300 79 70 65 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e  ype;.    pLock->
16310 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74  locktype = lockt
16320 79 70 65 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ype;.  }else if(
16330 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55   locktype==EXCLU
16340 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  SIVE_LOCK ){.   
16350 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
16360 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b   = PENDING_LOCK;
16370 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b  .    pLock->lock
16380 74 79 70 65 20 3d 20 50 45 4e 44 49 4e 47 5f 4c  type = PENDING_L
16390 4f 43 4b 3b 0a 20 20 7d 0a 20 20 0a 61 66 70 5f  OCK;.  }.  .afp_
163a0 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 75 6e 69 78  end_lock:.  unix
163b0 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
163c0 4f 53 54 52 41 43 45 34 28 22 4c 4f 43 4b 20 20  OSTRACE4("LOCK  
163d0 20 20 25 64 20 25 73 20 25 73 20 28 61 66 70 29    %d %s %s (afp)
163e0 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6c  \n", pFile->h, l
163f0 6f 63 6b 74 79 70 65 4e 61 6d 65 28 6c 6f 63 6b  ocktypeName(lock
16400 74 79 70 65 29 2c 20 0a 20 20 20 20 20 20 20 20  type), .        
16410 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f   rc==SQLITE_OK ?
16420 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22   "ok" : "failed"
16430 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
16440 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74  }../*.** Lower t
16450 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
16460 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70   on file descrip
16470 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 6c 6f 63  tor pFile to loc
16480 6b 74 79 70 65 2e 20 20 6c 6f 63 6b 74 79 70 65  ktype.  locktype
16490 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68  .** must be eith
164a0 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48  er NO_LOCK or SH
164b0 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a  ARED_LOCK..**.**
164c0 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   If the locking 
164d0 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c  level of the fil
164e0 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
164f0 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65  already at or be
16500 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65  low.** the reque
16510 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  sted locking lev
16520 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  el, this routine
16530 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
16540 73 74 61 74 69 63 20 69 6e 74 20 61 66 70 55 6e  static int afpUn
16550 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  lock(sqlite3_fil
16560 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74  e *id, int lockt
16570 79 70 65 29 20 7b 0a 20 20 69 6e 74 20 72 63 20  ype) {.  int rc 
16580 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75  = SQLITE_OK;.  u
16590 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
165a0 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
165b0 20 20 73 74 72 75 63 74 20 75 6e 69 78 4c 6f 63    struct unixLoc
165c0 6b 49 6e 66 6f 20 2a 70 4c 6f 63 6b 3b 0a 20 20  kInfo *pLock;.  
165d0 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
165e0 74 20 2a 63 6f 6e 74 65 78 74 20 3d 20 28 61 66  t *context = (af
165f0 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  pLockingContext 
16600 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e  *) pFile->lockin
16610 67 43 6f 6e 74 65 78 74 3b 0a 20 20 69 6e 74 20  gContext;.  int 
16620 73 6b 69 70 53 68 61 72 65 64 20 3d 20 30 3b 0a  skipShared = 0;.
16630 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
16640 53 54 0a 20 20 69 6e 74 20 68 20 3d 20 70 46 69  ST.  int h = pFi
16650 6c 65 2d 3e 68 3b 0a 23 65 6e 64 69 66 0a 0a 20  le->h;.#endif.. 
16660 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
16670 3b 0a 20 20 4f 53 54 52 41 43 45 37 28 22 55 4e  ;.  OSTRACE7("UN
16680 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73 20  LOCK  %d %d was 
16690 25 64 28 25 64 2c 25 64 29 20 70 69 64 3d 25 64  %d(%d,%d) pid=%d
166a0 20 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65   (afp)\n", pFile
166b0 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70 65 2c 0a 20  ->h, locktype,. 
166c0 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
166d0 3e 6c 6f 63 6b 74 79 70 65 2c 20 70 46 69 6c 65  >locktype, pFile
166e0 2d 3e 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70  ->pLock->locktyp
166f0 65 2c 20 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 2d  e, pFile->pLock-
16700 3e 63 6e 74 2c 20 67 65 74 70 69 64 28 29 29 3b  >cnt, getpid());
16710 0a 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b  ..  assert( lock
16720 74 79 70 65 3c 3d 53 48 41 52 45 44 5f 4c 4f 43  type<=SHARED_LOC
16730 4b 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65  K );.  if( pFile
16740 2d 3e 6c 6f 63 6b 74 79 70 65 3c 3d 6c 6f 63 6b  ->locktype<=lock
16750 74 79 70 65 20 29 7b 0a 20 20 20 20 72 65 74 75  type ){.    retu
16760 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
16770 7d 0a 20 20 69 66 28 20 43 48 45 43 4b 5f 54 48  }.  if( CHECK_TH
16780 52 45 41 44 49 44 28 70 46 69 6c 65 29 20 29 7b  READID(pFile) ){
16790 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
167a0 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20 7d 0a 20  TE_MISUSE;.  }. 
167b0 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
167c0 29 3b 0a 20 20 70 4c 6f 63 6b 20 3d 20 70 46 69  );.  pLock = pFi
167d0 6c 65 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 61 73 73  le->pLock;.  ass
167e0 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 63 6e 74 21  ert( pLock->cnt!
167f0 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c  =0 );.  if( pFil
16800 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 53 48 41 52  e->locktype>SHAR
16810 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61  ED_LOCK ){.    a
16820 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 6c 6f  ssert( pLock->lo
16830 63 6b 74 79 70 65 3d 3d 70 46 69 6c 65 2d 3e 6c  cktype==pFile->l
16840 6f 63 6b 74 79 70 65 20 29 3b 0a 20 20 20 20 53  ocktype );.    S
16850 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65  imulateIOErrorBe
16860 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 53 69 6d  nign(1);.    Sim
16870 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 68 3d  ulateIOError( h=
16880 28 2d 31 29 20 29 0a 20 20 20 20 53 69 6d 75 6c  (-1) ).    Simul
16890 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e  ateIOErrorBenign
168a0 28 30 29 3b 0a 20 20 20 20 0a 23 69 66 6e 64 65  (0);.    .#ifnde
168b0 66 20 4e 44 45 42 55 47 0a 20 20 20 20 2f 2a 20  f NDEBUG.    /* 
168c0 57 68 65 6e 20 72 65 64 75 63 69 6e 67 20 61 20  When reducing a 
168d0 6c 6f 63 6b 20 73 75 63 68 20 74 68 61 74 20 6f  lock such that o
168e0 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 63  ther processes c
168f0 61 6e 20 73 74 61 72 74 0a 20 20 20 20 20 2a 2a  an start.     **
16900 20 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74   reading the dat
16910 61 62 61 73 65 20 66 69 6c 65 20 61 67 61 69 6e  abase file again
16920 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  , make sure that
16930 20 74 68 65 0a 20 20 20 20 20 2a 2a 20 74 72 61   the.     ** tra
16940 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72  nsaction counter
16950 20 77 61 73 20 75 70 64 61 74 65 64 20 69 66 20   was updated if 
16960 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65 20  any part of the 
16970 64 61 74 61 62 61 73 65 0a 20 20 20 20 20 2a 2a  database.     **
16980 20 66 69 6c 65 20 63 68 61 6e 67 65 64 2e 20 20   file changed.  
16990 49 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  If the transacti
169a0 6f 6e 20 63 6f 75 6e 74 65 72 20 69 73 20 6e 6f  on counter is no
169b0 74 20 75 70 64 61 74 65 64 2c 0a 20 20 20 20 20  t updated,.     
169c0 2a 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74  ** other connect
169d0 69 6f 6e 73 20 74 6f 20 74 68 65 20 73 61 6d 65  ions to the same
169e0 20 66 69 6c 65 20 6d 69 67 68 74 20 6e 6f 74 20   file might not 
169f0 72 65 61 6c 69 7a 65 20 74 68 61 74 0a 20 20 20  realize that.   
16a00 20 20 2a 2a 20 74 68 65 20 66 69 6c 65 20 68 61    ** the file ha
16a10 73 20 63 68 61 6e 67 65 64 20 61 6e 64 20 68 65  s changed and he
16a20 6e 63 65 20 6d 69 67 68 74 20 6e 6f 74 20 6b 6e  nce might not kn
16a30 6f 77 20 74 6f 20 66 6c 75 73 68 20 74 68 65 69  ow to flush thei
16a40 72 0a 20 20 20 20 20 2a 2a 20 63 61 63 68 65 2e  r.     ** cache.
16a50 20 20 54 68 65 20 75 73 65 20 6f 66 20 61 20 73    The use of a s
16a60 74 61 6c 65 20 63 61 63 68 65 20 63 61 6e 20 6c  tale cache can l
16a70 65 61 64 20 74 6f 20 64 61 74 61 62 61 73 65 20  ead to database 
16a80 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20  corruption..    
16a90 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
16aa0 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57  pFile->inNormalW
16ab0 72 69 74 65 3d 3d 30 0a 20 20 20 20 20 20 20 20  rite==0.        
16ac0 20 20 20 7c 7c 20 70 46 69 6c 65 2d 3e 64 62 55     || pFile->dbU
16ad0 70 64 61 74 65 3d 3d 30 0a 20 20 20 20 20 20 20  pdate==0.       
16ae0 20 20 20 20 7c 7c 20 70 46 69 6c 65 2d 3e 74 72      || pFile->tr
16af0 61 6e 73 43 6e 74 72 43 68 6e 67 3d 3d 31 20 29  ansCntrChng==1 )
16b00 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 69 6e 4e  ;.    pFile->inN
16b10 6f 72 6d 61 6c 57 72 69 74 65 20 3d 20 30 3b 0a  ormalWrite = 0;.
16b20 23 65 6e 64 69 66 0a 20 20 20 20 0a 20 20 20 20  #endif.    .    
16b30 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  if( pFile->lockt
16b40 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ype==EXCLUSIVE_L
16b50 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  OCK ){.      rc 
16b60 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e  = afpSetLock(con
16b70 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46  text->dbPath, pF
16b80 69 6c 65 2c 20 53 48 41 52 45 44 5f 46 49 52 53  ile, SHARED_FIRS
16b90 54 2c 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20  T, SHARED_SIZE, 
16ba0 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
16bb0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28  ==SQLITE_OK && (
16bc0 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44  locktype==SHARED
16bd0 5f 4c 4f 43 4b 20 7c 7c 20 70 4c 6f 63 6b 2d 3e  _LOCK || pLock->
16be0 63 6e 74 3e 31 29 20 29 7b 0a 20 20 20 20 20 20  cnt>1) ){.      
16bf0 20 20 2f 2a 20 6f 6e 6c 79 20 72 65 2d 65 73 74    /* only re-est
16c00 61 62 6c 69 73 68 20 74 68 65 20 73 68 61 72 65  ablish the share
16c10 64 20 6c 6f 63 6b 20 69 66 20 6e 65 63 65 73 73  d lock if necess
16c20 61 72 79 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ary */.        i
16c30 6e 74 20 73 68 61 72 65 64 4c 6f 63 6b 42 79 74  nt sharedLockByt
16c40 65 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54  e = SHARED_FIRST
16c50 2b 70 4c 6f 63 6b 2d 3e 73 68 61 72 65 64 42 79  +pLock->sharedBy
16c60 74 65 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  te;.        rc =
16c70 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74   afpSetLock(cont
16c80 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69  ext->dbPath, pFi
16c90 6c 65 2c 20 73 68 61 72 65 64 4c 6f 63 6b 42 79  le, sharedLockBy
16ca0 74 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 20  te, 1, 1);.     
16cb0 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
16cc0 20 20 73 6b 69 70 53 68 61 72 65 64 20 3d 20 31    skipShared = 1
16cd0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
16ce0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
16cf0 54 45 5f 4f 4b 20 26 26 20 70 46 69 6c 65 2d 3e  TE_OK && pFile->
16d00 6c 6f 63 6b 74 79 70 65 3e 3d 50 45 4e 44 49 4e  locktype>=PENDIN
16d10 47 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20  G_LOCK ){.      
16d20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28  rc = afpSetLock(
16d30 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c  context->dbPath,
16d40 20 70 46 69 6c 65 2c 20 50 45 4e 44 49 4e 47 5f   pFile, PENDING_
16d50 42 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20  BYTE, 1, 0);.   
16d60 20 7d 20 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   } .    if( rc==
16d70 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 46 69  SQLITE_OK && pFi
16d80 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 52 45  le->locktype>=RE
16d90 53 45 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20 63  SERVED_LOCK && c
16da0 6f 6e 74 65 78 74 2d 3e 72 65 73 65 72 76 65 64  ontext->reserved
16db0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61   ){.      rc = a
16dc0 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78  fpSetLock(contex
16dd0 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65  t->dbPath, pFile
16de0 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c  , RESERVED_BYTE,
16df0 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66   1, 0);.      if
16e00 28 20 21 72 63 20 29 7b 20 0a 20 20 20 20 20 20  ( !rc ){ .      
16e10 20 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73 65 72    context->reser
16e20 76 65 64 20 3d 20 30 3b 20 0a 20 20 20 20 20 20  ved = 0; .      
16e30 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
16e40 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
16e50 20 28 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52   (locktype==SHAR
16e60 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 4c 6f 63 6b  ED_LOCK || pLock
16e70 2d 3e 63 6e 74 3e 31 29 29 7b 0a 20 20 20 20 20  ->cnt>1)){.     
16e80 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65   pLock->locktype
16e90 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a   = SHARED_LOCK;.
16ea0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
16eb0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
16ec0 20 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f   locktype==NO_LO
16ed0 43 4b 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 44 65  CK ){..    /* De
16ee0 63 72 65 6d 65 6e 74 20 74 68 65 20 73 68 61 72  crement the shar
16ef0 65 64 20 6c 6f 63 6b 20 63 6f 75 6e 74 65 72 2e  ed lock counter.
16f00 20 20 52 65 6c 65 61 73 65 20 74 68 65 20 6c 6f    Release the lo
16f10 63 6b 20 75 73 69 6e 67 20 61 6e 0a 20 20 20 20  ck using an.    
16f20 20 2a 2a 20 4f 53 20 63 61 6c 6c 20 6f 6e 6c 79   ** OS call only
16f30 20 77 68 65 6e 20 61 6c 6c 20 74 68 72 65 61 64   when all thread
16f40 73 20 69 6e 20 74 68 69 73 20 73 61 6d 65 20 70  s in this same p
16f50 72 6f 63 65 73 73 20 68 61 76 65 20 72 65 6c 65  rocess have rele
16f60 61 73 65 64 0a 20 20 20 20 20 2a 2a 20 74 68 65  ased.     ** the
16f70 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 2a 2f 0a 20   lock..     */. 
16f80 20 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67     unsigned long
16f90 20 6c 6f 6e 67 20 73 68 61 72 65 64 4c 6f 63 6b   long sharedLock
16fa0 42 79 74 65 20 3d 20 53 48 41 52 45 44 5f 46 49  Byte = SHARED_FI
16fb0 52 53 54 2b 70 4c 6f 63 6b 2d 3e 73 68 61 72 65  RST+pLock->share
16fc0 64 42 79 74 65 3b 0a 20 20 20 20 70 4c 6f 63 6b  dByte;.    pLock
16fd0 2d 3e 63 6e 74 2d 2d 3b 0a 20 20 20 20 69 66 28  ->cnt--;.    if(
16fe0 20 70 4c 6f 63 6b 2d 3e 63 6e 74 3d 3d 30 20 29   pLock->cnt==0 )
16ff0 7b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65  {.      Simulate
17000 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29  IOErrorBenign(1)
17010 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65  ;.      Simulate
17020 49 4f 45 72 72 6f 72 28 20 68 3d 28 2d 31 29 20  IOError( h=(-1) 
17030 29 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65  ).      Simulate
17040 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29  IOErrorBenign(0)
17050 3b 0a 20 20 20 20 20 20 69 66 28 20 21 73 6b 69  ;.      if( !ski
17060 70 53 68 61 72 65 64 20 29 7b 0a 20 20 20 20 20  pShared ){.     
17070 20 20 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f     rc = afpSetLo
17080 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61  ck(context->dbPa
17090 74 68 2c 20 70 46 69 6c 65 2c 20 73 68 61 72 65  th, pFile, share
170a0 64 4c 6f 63 6b 42 79 74 65 2c 20 31 2c 20 30 29  dLockByte, 1, 0)
170b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
170c0 69 66 28 20 21 72 63 20 29 7b 0a 20 20 20 20 20  if( !rc ){.     
170d0 20 20 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79     pLock->lockty
170e0 70 65 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20  pe = NO_LOCK;.  
170f0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63        pFile->loc
17100 6b 74 79 70 65 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b  ktype = NO_LOCK;
17110 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
17120 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
17130 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 74  E_OK ){.      st
17140 72 75 63 74 20 75 6e 69 78 4f 70 65 6e 43 6e 74  ruct unixOpenCnt
17150 20 2a 70 4f 70 65 6e 20 3d 20 70 46 69 6c 65 2d   *pOpen = pFile-
17160 3e 70 4f 70 65 6e 3b 0a 20 20 20 20 20 20 20 20  >pOpen;.        
17170 0a 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e 6e 4c  .      pOpen->nL
17180 6f 63 6b 2d 2d 3b 0a 20 20 20 20 20 20 61 73 73  ock--;.      ass
17190 65 72 74 28 20 70 4f 70 65 6e 2d 3e 6e 4c 6f 63  ert( pOpen->nLoc
171a0 6b 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  k>=0 );.      if
171b0 28 20 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 3d 3d  ( pOpen->nLock==
171c0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  0 ){.        rc 
171d0 3d 20 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64  = closePendingFd
171e0 73 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20  s(pFile);.      
171f0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20  }.    }.  }.  . 
17200 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
17210 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
17220 49 54 45 5f 4f 4b 20 29 20 70 46 69 6c 65 2d 3e  ITE_OK ) pFile->
17230 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74  locktype = lockt
17240 79 70 65 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ype;.  return rc
17250 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
17260 20 61 20 66 69 6c 65 20 26 20 63 6c 65 61 6e 75   a file & cleanu
17270 70 20 41 46 50 20 73 70 65 63 69 66 69 63 20 6c  p AFP specific l
17280 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 0a  ocking context .
17290 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66  */.static int af
172a0 70 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66  pClose(sqlite3_f
172b0 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69 6e 74  ile *id) {.  int
172c0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
172d0 0a 20 20 69 66 28 20 69 64 20 29 7b 0a 20 20 20  .  if( id ){.   
172e0 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
172f0 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
17300 3b 0a 20 20 20 20 61 66 70 55 6e 6c 6f 63 6b 28  ;.    afpUnlock(
17310 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20  id, NO_LOCK);.  
17320 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
17330 28 29 3b 0a 20 20 20 20 69 66 28 20 70 46 69 6c  ();.    if( pFil
17340 65 2d 3e 70 4f 70 65 6e 20 26 26 20 70 46 69 6c  e->pOpen && pFil
17350 65 2d 3e 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 20  e->pOpen->nLock 
17360 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ){.      /* If t
17370 68 65 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e  here are outstan
17380 64 69 6e 67 20 6c 6f 63 6b 73 2c 20 64 6f 20 6e  ding locks, do n
17390 6f 74 20 61 63 74 75 61 6c 6c 79 20 63 6c 6f 73  ot actually clos
173a0 65 20 74 68 65 20 66 69 6c 65 20 6a 75 73 74 0a  e the file just.
173b0 20 20 20 20 20 20 2a 2a 20 79 65 74 20 62 65 63        ** yet bec
173c0 61 75 73 65 20 74 68 61 74 20 77 6f 75 6c 64 20  ause that would 
173d0 63 6c 65 61 72 20 74 68 6f 73 65 20 6c 6f 63 6b  clear those lock
173e0 73 2e 20 20 49 6e 73 74 65 61 64 2c 20 61 64 64  s.  Instead, add
173f0 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 20 20   the file.      
17400 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f  ** descriptor to
17410 20 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67   pOpen->aPending
17420 2e 20 20 49 74 20 77 69 6c 6c 20 62 65 20 61 75  .  It will be au
17430 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73  tomatically clos
17440 65 64 20 77 68 65 6e 0a 20 20 20 20 20 20 2a 2a  ed when.      **
17450 20 74 68 65 20 6c 61 73 74 20 6c 6f 63 6b 20 69   the last lock i
17460 73 20 63 6c 65 61 72 65 64 2e 0a 20 20 20 20 20  s cleared..     
17470 20 2a 2f 0a 20 20 20 20 20 20 73 65 74 50 65 6e   */.      setPen
17480 64 69 6e 67 46 64 28 70 46 69 6c 65 29 3b 0a 20  dingFd(pFile);. 
17490 20 20 20 7d 0a 20 20 20 20 72 65 6c 65 61 73 65     }.    release
174a0 4c 6f 63 6b 49 6e 66 6f 28 70 46 69 6c 65 2d 3e  LockInfo(pFile->
174b0 70 4c 6f 63 6b 29 3b 0a 20 20 20 20 72 65 6c 65  pLock);.    rele
174c0 61 73 65 4f 70 65 6e 43 6e 74 28 70 46 69 6c 65  aseOpenCnt(pFile
174d0 2d 3e 70 4f 70 65 6e 29 3b 0a 20 20 20 20 73 71  ->pOpen);.    sq
174e0 6c 69 74 65 33 5f 66 72 65 65 28 70 46 69 6c 65  lite3_free(pFile
174f0 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
17500 29 3b 0a 20 20 20 20 72 63 20 3d 20 63 6c 6f 73  );.    rc = clos
17510 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 20  eUnixFile(id);. 
17520 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65     unixLeaveMute
17530 78 28 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  x();.  }.  retur
17540 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20  n rc;.}..#endif 
17550 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  /* defined(__APP
17560 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f  LE__) && SQLITE_
17570 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
17580 54 59 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68  TYLE */./*.** Th
17590 65 20 63 6f 64 65 20 61 62 6f 76 65 20 69 73 20  e code above is 
175a0 74 68 65 20 41 46 50 20 6c 6f 63 6b 20 69 6d 70  the AFP lock imp
175b0 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 20 54 68  lementation.  Th
175c0 65 20 63 6f 64 65 20 69 73 20 73 70 65 63 69 66  e code is specif
175d0 69 63 0a 2a 2a 20 74 6f 20 4d 61 63 4f 53 58 20  ic.** to MacOSX 
175e0 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72  and does not wor
175f0 6b 20 6f 6e 20 6f 74 68 65 72 20 75 6e 69 78 20  k on other unix 
17600 70 6c 61 74 66 6f 72 6d 73 2e 20 20 4e 6f 20 61  platforms.  No a
17610 6c 74 65 72 6e 61 74 69 76 65 0a 2a 2a 20 69 73  lternative.** is
17620 20 61 76 61 69 6c 61 62 6c 65 2e 20 20 49 66 20   available.  If 
17630 79 6f 75 20 64 6f 6e 27 74 20 63 6f 6d 70 69 6c  you don't compil
17640 65 20 66 6f 72 20 61 20 6d 61 63 2c 20 74 68 65  e for a mac, the
17650 6e 20 74 68 65 20 22 75 6e 69 78 2d 61 66 70 22  n the "unix-afp"
17660 0a 2a 2a 20 56 46 53 20 69 73 20 6e 6f 74 20 61  .** VFS is not a
17670 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 2a  vailable..**.***
17680 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17690 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 41 46  ** End of the AF
176a0 50 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74  P lock implement
176b0 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ation **********
176c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
176d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
176e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
176f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17700 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17710 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a  ***********/../*
17720 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17730 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17740 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17750 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17760 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
17770 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17780 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20  ********* Begin 
17790 4e 46 53 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a  NFS Locking ****
177a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
177b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 23  ************/..#
177c0 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
177d0 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f  LE__) && SQLITE_
177e0 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
177f0 54 59 4c 45 0a 2f 2a 0a 20 2a 2a 20 4c 6f 77 65  TYLE./*. ** Lowe
17800 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  r the locking le
17810 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63  vel on file desc
17820 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20  riptor pFile to 
17830 6c 6f 63 6b 74 79 70 65 2e 20 20 6c 6f 63 6b 74  locktype.  lockt
17840 79 70 65 0a 20 2a 2a 20 6d 75 73 74 20 62 65 20  ype. ** must be 
17850 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f  either NO_LOCK o
17860 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 20  r SHARED_LOCK.. 
17870 2a 2a 0a 20 2a 2a 20 49 66 20 74 68 65 20 6c 6f  **. ** If the lo
17880 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74  cking level of t
17890 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
178a0 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74  or is already at
178b0 20 6f 72 20 62 65 6c 6f 77 0a 20 2a 2a 20 74 68   or below. ** th
178c0 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
178d0 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20  ing level, this 
178e0 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
178f0 6f 70 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69  op.. */.static i
17900 6e 74 20 6e 66 73 55 6e 6c 6f 63 6b 28 73 71 6c  nt nfsUnlock(sql
17910 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
17920 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20  nt locktype){.  
17930 72 65 74 75 72 6e 20 5f 70 6f 73 69 78 55 6e 6c  return _posixUnl
17940 6f 63 6b 28 69 64 2c 20 6c 6f 63 6b 74 79 70 65  ock(id, locktype
17950 2c 20 31 29 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20  , 1);.}..#endif 
17960 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  /* defined(__APP
17970 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f  LE__) && SQLITE_
17980 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
17990 54 59 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68  TYLE */./*.** Th
179a0 65 20 63 6f 64 65 20 61 62 6f 76 65 20 69 73 20  e code above is 
179b0 74 68 65 20 4e 46 53 20 6c 6f 63 6b 20 69 6d 70  the NFS lock imp
179c0 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 20 54 68  lementation.  Th
179d0 65 20 63 6f 64 65 20 69 73 20 73 70 65 63 69 66  e code is specif
179e0 69 63 0a 2a 2a 20 74 6f 20 4d 61 63 4f 53 58 20  ic.** to MacOSX 
179f0 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72  and does not wor
17a00 6b 20 6f 6e 20 6f 74 68 65 72 20 75 6e 69 78 20  k on other unix 
17a10 70 6c 61 74 66 6f 72 6d 73 2e 20 20 4e 6f 20 61  platforms.  No a
17a20 6c 74 65 72 6e 61 74 69 76 65 0a 2a 2a 20 69 73  lternative.** is
17a30 20 61 76 61 69 6c 61 62 6c 65 2e 20 20 0a 2a 2a   available.  .**
17a40 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
17a50 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68  ****** End of th
17a60 65 20 4e 46 53 20 6c 6f 63 6b 20 69 6d 70 6c 65  e NFS lock imple
17a70 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a  mentation ******
17a80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17a90 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
17aa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17ab0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17ac0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17ad0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
17ae0 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
17af0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17b00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17b10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17b20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17b30 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
17b40 2a 2a 20 4e 6f 6e 2d 6c 6f 63 6b 69 6e 67 20 73  ** Non-locking s
17b50 71 6c 69 74 65 33 5f 66 69 6c 65 20 6d 65 74 68  qlite3_file meth
17b60 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ods ************
17b70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17b80 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 78 74  *.**.** The next
17b90 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74 61 69   division contai
17ba0 6e 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ns implementatio
17bb0 6e 73 20 66 6f 72 20 61 6c 6c 20 6d 65 74 68 6f  ns for all metho
17bc0 64 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20 73 71  ds of the .** sq
17bd0 6c 69 74 65 33 5f 66 69 6c 65 20 6f 62 6a 65 63  lite3_file objec
17be0 74 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 65  t other than the
17bf0 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73   locking methods
17c00 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 0a 2a  .  The locking.*
17c10 2a 20 6d 65 74 68 6f 64 73 20 77 65 72 65 20 64  * methods were d
17c20 65 66 69 6e 65 64 20 69 6e 20 64 69 76 69 73 69  efined in divisi
17c30 6f 6e 73 20 61 62 6f 76 65 20 28 6f 6e 65 20 6c  ons above (one l
17c40 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 20 70 65  ocking method pe
17c50 72 0a 2a 2a 20 64 69 76 69 73 69 6f 6e 29 2e 20  r.** division). 
17c60 20 54 68 6f 73 65 20 6d 65 74 68 6f 64 73 20 74   Those methods t
17c70 68 61 74 20 61 72 65 20 63 6f 6d 6d 6f 6e 20 74  hat are common t
17c80 6f 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6d 6f  o all locking mo
17c90 64 65 73 0a 2a 2a 20 61 72 65 20 67 61 74 68 65  des.** are gathe
17ca0 72 20 74 6f 67 65 74 68 65 72 20 69 6e 74 6f 20  r together into 
17cb0 74 68 69 73 20 64 69 76 69 73 69 6f 6e 2e 0a 2a  this division..*
17cc0 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74 6f  /../*.** Seek to
17cd0 20 74 68 65 20 6f 66 66 73 65 74 20 70 61 73 73   the offset pass
17ce0 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
17cf0 20 61 72 67 75 6d 65 6e 74 2c 20 74 68 65 6e 20   argument, then 
17d00 72 65 61 64 20 63 6e 74 20 0a 2a 2a 20 62 79 74  read cnt .** byt
17d10 65 73 20 69 6e 74 6f 20 70 42 75 66 2e 20 52 65  es into pBuf. Re
17d20 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
17d30 6f 66 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c  of bytes actuall
17d40 79 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 4e 42  y read..**.** NB
17d50 3a 20 20 49 66 20 79 6f 75 20 64 65 66 69 6e 65  :  If you define
17d60 20 55 53 45 5f 50 52 45 41 44 20 6f 72 20 55 53   USE_PREAD or US
17d70 45 5f 50 52 45 41 44 36 34 2c 20 74 68 65 6e 20  E_PREAD64, then 
17d80 69 74 20 6d 69 67 68 74 20 61 6c 73 6f 0a 2a 2a  it might also.**
17d90 20 62 65 20 6e 65 63 65 73 73 61 72 79 20 74 6f   be necessary to
17da0 20 64 65 66 69 6e 65 20 5f 58 4f 50 45 4e 5f 53   define _XOPEN_S
17db0 4f 55 52 43 45 20 74 6f 20 62 65 20 35 30 30 2e  OURCE to be 500.
17dc0 20 20 54 68 69 73 20 76 61 72 69 65 73 20 66 72    This varies fr
17dd0 6f 6d 0a 2a 2a 20 6f 6e 65 20 73 79 73 74 65 6d  om.** one system
17de0 20 74 6f 20 61 6e 6f 74 68 65 72 2e 20 20 53 69   to another.  Si
17df0 6e 63 65 20 53 51 4c 69 74 65 20 64 6f 65 73 20  nce SQLite does 
17e00 6e 6f 74 20 64 65 66 69 6e 65 20 55 53 45 5f 50  not define USE_P
17e10 52 45 41 44 0a 2a 2a 20 61 6e 79 20 61 6e 79 20  READ.** any any 
17e20 66 6f 72 6d 20 62 79 20 64 65 66 61 75 6c 74 2c  form by default,
17e30 20 77 65 20 77 69 6c 6c 20 6e 6f 74 20 61 74 74   we will not att
17e40 65 6d 70 74 20 74 6f 20 64 65 66 69 6e 65 20 5f  empt to define _
17e50 58 4f 50 45 4e 5f 53 4f 55 52 43 45 2e 0a 2a 2a  XOPEN_SOURCE..**
17e60 20 53 65 65 20 74 69 63 6b 65 74 73 20 23 32 37   See tickets #27
17e70 34 31 20 61 6e 64 20 23 32 36 38 31 2e 0a 2a 2a  41 and #2681..**
17e80 0a 2a 2a 20 54 6f 20 61 76 6f 69 64 20 73 74 6f  .** To avoid sto
17e90 6d 70 69 6e 67 20 74 68 65 20 65 72 72 6e 6f 20  mping the errno 
17ea0 76 61 6c 75 65 20 6f 6e 20 61 20 66 61 69 6c 65  value on a faile
17eb0 64 20 72 65 61 64 20 74 68 65 20 6c 61 73 74 45  d read the lastE
17ec0 72 72 6e 6f 20 76 61 6c 75 65 0a 2a 2a 20 69 73  rrno value.** is
17ed0 20 73 65 74 20 62 65 66 6f 72 65 20 72 65 74 75   set before retu
17ee0 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  rning..*/.static
17ef0 20 69 6e 74 20 73 65 65 6b 41 6e 64 52 65 61 64   int seekAndRead
17f00 28 75 6e 69 78 46 69 6c 65 20 2a 69 64 2c 20 73  (unixFile *id, s
17f10 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66  qlite3_int64 off
17f20 73 65 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 2c  set, void *pBuf,
17f30 20 69 6e 74 20 63 6e 74 29 7b 0a 20 20 69 6e 74   int cnt){.  int
17f40 20 67 6f 74 3b 0a 23 69 66 20 28 21 64 65 66 69   got;.#if (!defi
17f50 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29 20 26  ned(USE_PREAD) &
17f60 26 20 21 64 65 66 69 6e 65 64 28 55 53 45 5f 50  & !defined(USE_P
17f70 52 45 41 44 36 34 29 29 0a 20 20 69 36 34 20 6e  READ64)).  i64 n
17f80 65 77 4f 66 66 73 65 74 3b 0a 23 65 6e 64 69 66  ewOffset;.#endif
17f90 0a 20 20 54 49 4d 45 52 5f 53 54 41 52 54 3b 0a  .  TIMER_START;.
17fa0 23 69 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f  #if defined(USE_
17fb0 50 52 45 41 44 29 0a 20 20 67 6f 74 20 3d 20 70  PREAD).  got = p
17fc0 72 65 61 64 28 69 64 2d 3e 68 2c 20 70 42 75 66  read(id->h, pBuf
17fd0 2c 20 63 6e 74 2c 20 6f 66 66 73 65 74 29 3b 0a  , cnt, offset);.
17fe0 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
17ff0 72 28 20 67 6f 74 20 3d 20 2d 31 20 29 3b 0a 23  r( got = -1 );.#
18000 65 6c 69 66 20 64 65 66 69 6e 65 64 28 55 53 45  elif defined(USE
18010 5f 50 52 45 41 44 36 34 29 0a 20 20 67 6f 74 20  _PREAD64).  got 
18020 3d 20 70 72 65 61 64 36 34 28 69 64 2d 3e 68 2c  = pread64(id->h,
18030 20 70 42 75 66 2c 20 63 6e 74 2c 20 6f 66 66 73   pBuf, cnt, offs
18040 65 74 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49  et);.  SimulateI
18050 4f 45 72 72 6f 72 28 20 67 6f 74 20 3d 20 2d 31  OError( got = -1
18060 20 29 3b 0a 23 65 6c 73 65 0a 20 20 6e 65 77 4f   );.#else.  newO
18070 66 66 73 65 74 20 3d 20 6c 73 65 65 6b 28 69 64  ffset = lseek(id
18080 2d 3e 68 2c 20 6f 66 66 73 65 74 2c 20 53 45 45  ->h, offset, SEE
18090 4b 5f 53 45 54 29 3b 0a 20 20 53 69 6d 75 6c 61  K_SET);.  Simula
180a0 74 65 49 4f 45 72 72 6f 72 28 20 6e 65 77 4f 66  teIOError( newOf
180b0 66 73 65 74 2d 2d 20 29 3b 0a 20 20 69 66 28 20  fset-- );.  if( 
180c0 6e 65 77 4f 66 66 73 65 74 21 3d 6f 66 66 73 65  newOffset!=offse
180d0 74 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 65 77  t ){.    if( new
180e0 4f 66 66 73 65 74 20 3d 3d 20 2d 31 20 29 7b 0a  Offset == -1 ){.
180f0 20 20 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65        ((unixFile
18100 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f  *)id)->lastErrno
18110 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 7d 65   = errno;.    }e
18120 6c 73 65 7b 0a 20 20 20 20 20 20 28 28 75 6e 69  lse{.      ((uni
18130 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74  xFile*)id)->last
18140 45 72 72 6e 6f 20 3d 20 30 3b 09 09 09 0a 20 20  Errno = 0;....  
18150 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 2d    }.    return -
18160 31 3b 0a 20 20 7d 0a 20 20 67 6f 74 20 3d 20 72  1;.  }.  got = r
18170 65 61 64 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c  ead(id->h, pBuf,
18180 20 63 6e 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20   cnt);.#endif.  
18190 54 49 4d 45 52 5f 45 4e 44 3b 0a 20 20 69 66 28  TIMER_END;.  if(
181a0 20 67 6f 74 3c 30 20 29 7b 0a 20 20 20 20 28 28   got<0 ){.    ((
181b0 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c  unixFile*)id)->l
181c0 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  astErrno = errno
181d0 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 35  ;.  }.  OSTRACE5
181e0 28 22 52 45 41 44 20 20 20 20 25 2d 33 64 20 25  ("READ    %-3d %
181f0 35 64 20 25 37 6c 6c 64 20 25 6c 6c 75 5c 6e 22  5d %7lld %llu\n"
18200 2c 20 69 64 2d 3e 68 2c 20 67 6f 74 2c 20 6f 66  , id->h, got, of
18210 66 73 65 74 2c 20 54 49 4d 45 52 5f 45 4c 41 50  fset, TIMER_ELAP
18220 53 45 44 29 3b 0a 20 20 72 65 74 75 72 6e 20 67  SED);.  return g
18230 6f 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  ot;.}../*.** Rea
18240 64 20 64 61 74 61 20 66 72 6f 6d 20 61 20 66 69  d data from a fi
18250 6c 65 20 69 6e 74 6f 20 61 20 62 75 66 66 65 72  le into a buffer
18260 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
18270 5f 4f 4b 20 69 66 20 61 6c 6c 0a 2a 2a 20 62 79  _OK if all.** by
18280 74 65 73 20 77 65 72 65 20 72 65 61 64 20 73 75  tes were read su
18290 63 63 65 73 73 66 75 6c 6c 79 20 61 6e 64 20 53  ccessfully and S
182a0 51 4c 49 54 45 5f 49 4f 45 52 52 20 69 66 20 61  QLITE_IOERR if a
182b0 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20  nything goes.** 
182c0 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  wrong..*/.static
182d0 20 69 6e 74 20 75 6e 69 78 52 65 61 64 28 0a 20   int unixRead(. 
182e0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69   sqlite3_file *i
182f0 64 2c 20 0a 20 20 76 6f 69 64 20 2a 70 42 75 66  d, .  void *pBuf
18300 2c 20 0a 20 20 69 6e 74 20 61 6d 74 2c 0a 20 20  , .  int amt,.  
18310 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66  sqlite3_int64 of
18320 66 73 65 74 0a 29 7b 0a 20 20 75 6e 69 78 46 69  fset.){.  unixFi
18330 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
18340 78 46 69 6c 65 20 2a 29 69 64 3b 0a 20 20 69 6e  xFile *)id;.  in
18350 74 20 67 6f 74 3b 0a 20 20 61 73 73 65 72 74 28  t got;.  assert(
18360 20 69 64 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20   id );..  /* If 
18370 74 68 69 73 20 69 73 20 61 20 64 61 74 61 62 61  this is a databa
18380 73 65 20 66 69 6c 65 20 28 6e 6f 74 20 61 20 6a  se file (not a j
18390 6f 75 72 6e 61 6c 2c 20 6d 61 73 74 65 72 2d 6a  ournal, master-j
183a0 6f 75 72 6e 61 6c 20 6f 72 20 74 65 6d 70 0a 20  ournal or temp. 
183b0 20 2a 2a 20 66 69 6c 65 29 2c 20 74 68 65 20 62   ** file), the b
183c0 79 74 65 73 20 69 6e 20 74 68 65 20 6c 6f 63 6b  ytes in the lock
183d0 69 6e 67 20 72 61 6e 67 65 20 73 68 6f 75 6c 64  ing range should
183e0 20 6e 65 76 65 72 20 62 65 20 72 65 61 64 20 6f   never be read o
183f0 72 20 77 72 69 74 74 65 6e 2e 20 2a 2f 0a 20 20  r written. */.  
18400 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 70  assert( pFile->p
18410 55 6e 75 73 65 64 3d 3d 30 0a 20 20 20 20 20 20  Unused==0.      
18420 20 7c 7c 20 6f 66 66 73 65 74 3e 3d 50 45 4e 44   || offset>=PEND
18430 49 4e 47 5f 42 59 54 45 2b 35 31 32 0a 20 20 20  ING_BYTE+512.   
18440 20 20 20 20 7c 7c 20 6f 66 66 73 65 74 2b 61 6d      || offset+am
18450 74 3c 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 20  t<=PENDING_BYTE 
18460 0a 20 20 29 3b 0a 0a 20 20 67 6f 74 20 3d 20 73  .  );..  got = s
18470 65 65 6b 41 6e 64 52 65 61 64 28 70 46 69 6c 65  eekAndRead(pFile
18480 2c 20 6f 66 66 73 65 74 2c 20 70 42 75 66 2c 20  , offset, pBuf, 
18490 61 6d 74 29 3b 0a 20 20 69 66 28 20 67 6f 74 3d  amt);.  if( got=
184a0 3d 61 6d 74 20 29 7b 0a 20 20 20 20 72 65 74 75  =amt ){.    retu
184b0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
184c0 7d 65 6c 73 65 20 69 66 28 20 67 6f 74 3c 30 20  }else if( got<0 
184d0 29 7b 0a 20 20 20 20 2f 2a 20 6c 61 73 74 45 72  ){.    /* lastEr
184e0 72 6e 6f 20 73 65 74 20 62 79 20 73 65 65 6b 41  rno set by seekA
184f0 6e 64 52 65 61 64 20 2a 2f 0a 20 20 20 20 72 65  ndRead */.    re
18500 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
18510 52 5f 52 45 41 44 3b 0a 20 20 7d 65 6c 73 65 7b  R_READ;.  }else{
18520 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74  .    pFile->last
18530 45 72 72 6e 6f 20 3d 20 30 3b 20 2f 2a 20 6e 6f  Errno = 0; /* no
18540 74 20 61 20 73 79 73 74 65 6d 20 65 72 72 6f 72  t a system error
18550 20 2a 2f 0a 20 20 20 20 2f 2a 20 55 6e 72 65 61   */.    /* Unrea
18560 64 20 70 61 72 74 73 20 6f 66 20 74 68 65 20 62  d parts of the b
18570 75 66 66 65 72 20 6d 75 73 74 20 62 65 20 7a 65  uffer must be ze
18580 72 6f 2d 66 69 6c 6c 65 64 20 2a 2f 0a 20 20 20  ro-filled */.   
18590 20 6d 65 6d 73 65 74 28 26 28 28 63 68 61 72 2a   memset(&((char*
185a0 29 70 42 75 66 29 5b 67 6f 74 5d 2c 20 30 2c 20  )pBuf)[got], 0, 
185b0 61 6d 74 2d 67 6f 74 29 3b 0a 20 20 20 20 72 65  amt-got);.    re
185c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
185d0 52 5f 53 48 4f 52 54 5f 52 45 41 44 3b 0a 20 20  R_SHORT_READ;.  
185e0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20  }.}../*.** Seek 
185f0 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20 69 6e  to the offset in
18600 20 69 64 2d 3e 6f 66 66 73 65 74 20 74 68 65 6e   id->offset then
18610 20 72 65 61 64 20 63 6e 74 20 62 79 74 65 73 20   read cnt bytes 
18620 69 6e 74 6f 20 70 42 75 66 2e 0a 2a 2a 20 52 65  into pBuf..** Re
18630 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
18640 6f 66 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c  of bytes actuall
18650 79 20 72 65 61 64 2e 20 20 55 70 64 61 74 65 20  y read.  Update 
18660 74 68 65 20 6f 66 66 73 65 74 2e 0a 2a 2a 0a 2a  the offset..**.*
18670 2a 20 54 6f 20 61 76 6f 69 64 20 73 74 6f 6d 70  * To avoid stomp
18680 69 6e 67 20 74 68 65 20 65 72 72 6e 6f 20 76 61  ing the errno va
18690 6c 75 65 20 6f 6e 20 61 20 66 61 69 6c 65 64 20  lue on a failed 
186a0 77 72 69 74 65 20 74 68 65 20 6c 61 73 74 45 72  write the lastEr
186b0 72 6e 6f 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20  rno value.** is 
186c0 73 65 74 20 62 65 66 6f 72 65 20 72 65 74 75 72  set before retur
186d0 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ning..*/.static 
186e0 69 6e 74 20 73 65 65 6b 41 6e 64 57 72 69 74 65  int seekAndWrite
186f0 28 75 6e 69 78 46 69 6c 65 20 2a 69 64 2c 20 69  (unixFile *id, i
18700 36 34 20 6f 66 66 73 65 74 2c 20 63 6f 6e 73 74  64 offset, const
18710 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 69 6e 74   void *pBuf, int
18720 20 63 6e 74 29 7b 0a 20 20 69 6e 74 20 67 6f 74   cnt){.  int got
18730 3b 0a 23 69 66 20 28 21 64 65 66 69 6e 65 64 28  ;.#if (!defined(
18740 55 53 45 5f 50 52 45 41 44 29 20 26 26 20 21 64  USE_PREAD) && !d
18750 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44  efined(USE_PREAD
18760 36 34 29 29 0a 20 20 69 36 34 20 6e 65 77 4f 66  64)).  i64 newOf
18770 66 73 65 74 3b 0a 23 65 6e 64 69 66 0a 20 20 54  fset;.#endif.  T
18780 49 4d 45 52 5f 53 54 41 52 54 3b 0a 23 69 66 20  IMER_START;.#if 
18790 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41  defined(USE_PREA
187a0 44 29 0a 20 20 67 6f 74 20 3d 20 70 77 72 69 74  D).  got = pwrit
187b0 65 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63  e(id->h, pBuf, c
187c0 6e 74 2c 20 6f 66 66 73 65 74 29 3b 0a 23 65 6c  nt, offset);.#el
187d0 69 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50  if defined(USE_P
187e0 52 45 41 44 36 34 29 0a 20 20 67 6f 74 20 3d 20  READ64).  got = 
187f0 70 77 72 69 74 65 36 34 28 69 64 2d 3e 68 2c 20  pwrite64(id->h, 
18800 70 42 75 66 2c 20 63 6e 74 2c 20 6f 66 66 73 65  pBuf, cnt, offse
18810 74 29 3b 0a 23 65 6c 73 65 0a 20 20 6e 65 77 4f  t);.#else.  newO
18820 66 66 73 65 74 20 3d 20 6c 73 65 65 6b 28 69 64  ffset = lseek(id
18830 2d 3e 68 2c 20 6f 66 66 73 65 74 2c 20 53 45 45  ->h, offset, SEE
18840 4b 5f 53 45 54 29 3b 0a 20 20 69 66 28 20 6e 65  K_SET);.  if( ne
18850 77 4f 66 66 73 65 74 21 3d 6f 66 66 73 65 74 20  wOffset!=offset 
18860 29 7b 0a 20 20 20 20 69 66 28 20 6e 65 77 4f 66  ){.    if( newOf
18870 66 73 65 74 20 3d 3d 20 2d 31 20 29 7b 0a 20 20  fset == -1 ){.  
18880 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29      ((unixFile*)
18890 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  id)->lastErrno =
188a0 20 65 72 72 6e 6f 3b 0a 20 20 20 20 7d 65 6c 73   errno;.    }els
188b0 65 7b 0a 20 20 20 20 20 20 28 28 75 6e 69 78 46  e{.      ((unixF
188c0 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72  ile*)id)->lastEr
188d0 72 6e 6f 20 3d 20 30 3b 09 09 09 0a 20 20 20 20  rno = 0;....    
188e0 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b  }.    return -1;
188f0 0a 20 20 7d 0a 20 20 67 6f 74 20 3d 20 77 72 69  .  }.  got = wri
18900 74 65 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20  te(id->h, pBuf, 
18910 63 6e 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20 54  cnt);.#endif.  T
18920 49 4d 45 52 5f 45 4e 44 3b 0a 20 20 69 66 28 20  IMER_END;.  if( 
18930 67 6f 74 3c 30 20 29 7b 0a 20 20 20 20 28 28 75  got<0 ){.    ((u
18940 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61  nixFile*)id)->la
18950 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b  stErrno = errno;
18960 0a 20 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45 35  .  }..  OSTRACE5
18970 28 22 57 52 49 54 45 20 20 20 25 2d 33 64 20 25  ("WRITE   %-3d %
18980 35 64 20 25 37 6c 6c 64 20 25 6c 6c 75 5c 6e 22  5d %7lld %llu\n"
18990 2c 20 69 64 2d 3e 68 2c 20 67 6f 74 2c 20 6f 66  , id->h, got, of
189a0 66 73 65 74 2c 20 54 49 4d 45 52 5f 45 4c 41 50  fset, TIMER_ELAP
189b0 53 45 44 29 3b 0a 20 20 72 65 74 75 72 6e 20 67  SED);.  return g
189c0 6f 74 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72  ot;.}.../*.** Wr
189d0 69 74 65 20 64 61 74 61 20 66 72 6f 6d 20 61 20  ite data from a 
189e0 62 75 66 66 65 72 20 69 6e 74 6f 20 61 20 66 69  buffer into a fi
189f0 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  le.  Return SQLI
18a00 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
18a10 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65  .** or some othe
18a20 72 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 6e 20  r error code on 
18a30 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74  failure..*/.stat
18a40 69 63 20 69 6e 74 20 75 6e 69 78 57 72 69 74 65  ic int unixWrite
18a50 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  (.  sqlite3_file
18a60 20 2a 69 64 2c 20 0a 20 20 63 6f 6e 73 74 20 76   *id, .  const v
18a70 6f 69 64 20 2a 70 42 75 66 2c 20 0a 20 20 69 6e  oid *pBuf, .  in
18a80 74 20 61 6d 74 2c 0a 20 20 73 71 6c 69 74 65 33  t amt,.  sqlite3
18a90 5f 69 6e 74 36 34 20 6f 66 66 73 65 74 20 0a 29  _int64 offset .)
18aa0 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  {.  unixFile *pF
18ab0 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
18ac0 29 69 64 3b 0a 20 20 69 6e 74 20 77 72 6f 74 65  )id;.  int wrote
18ad0 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20   = 0;.  assert( 
18ae0 69 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  id );.  assert( 
18af0 61 6d 74 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 49  amt>0 );..  /* I
18b00 66 20 74 68 69 73 20 69 73 20 61 20 64 61 74 61  f this is a data
18b10 62 61 73 65 20 66 69 6c 65 20 28 6e 6f 74 20 61  base file (not a
18b20 20 6a 6f 75 72 6e 61 6c 2c 20 6d 61 73 74 65 72   journal, master
18b30 2d 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 65 6d 70  -journal or temp
18b40 0a 20 20 2a 2a 20 66 69 6c 65 29 2c 20 74 68 65  .  ** file), the
18b50 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6c 6f   bytes in the lo
18b60 63 6b 69 6e 67 20 72 61 6e 67 65 20 73 68 6f 75  cking range shou
18b70 6c 64 20 6e 65 76 65 72 20 62 65 20 72 65 61 64  ld never be read
18b80 20 6f 72 20 77 72 69 74 74 65 6e 2e 20 2a 2f 0a   or written. */.
18b90 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d    assert( pFile-
18ba0 3e 70 55 6e 75 73 65 64 3d 3d 30 0a 20 20 20 20  >pUnused==0.    
18bb0 20 20 20 7c 7c 20 6f 66 66 73 65 74 3e 3d 50 45     || offset>=PE
18bc0 4e 44 49 4e 47 5f 42 59 54 45 2b 35 31 32 0a 20  NDING_BYTE+512. 
18bd0 20 20 20 20 20 20 7c 7c 20 6f 66 66 73 65 74 2b        || offset+
18be0 61 6d 74 3c 3d 50 45 4e 44 49 4e 47 5f 42 59 54  amt<=PENDING_BYT
18bf0 45 20 0a 20 20 29 3b 0a 0a 23 69 66 6e 64 65 66  E .  );..#ifndef
18c00 20 4e 44 45 42 55 47 0a 20 20 2f 2a 20 49 66 20   NDEBUG.  /* If 
18c10 77 65 20 61 72 65 20 64 6f 69 6e 67 20 61 20 6e  we are doing a n
18c20 6f 72 6d 61 6c 20 77 72 69 74 65 20 74 6f 20 61  ormal write to a
18c30 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28   database file (
18c40 61 73 20 6f 70 70 6f 73 65 64 20 74 6f 0a 20 20  as opposed to.  
18c50 2a 2a 20 64 6f 69 6e 67 20 61 20 68 6f 74 2d 6a  ** doing a hot-j
18c60 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20  ournal rollback 
18c70 6f 72 20 61 20 77 72 69 74 65 20 74 6f 20 73 6f  or a write to so
18c80 6d 65 20 66 69 6c 65 20 6f 74 68 65 72 20 74 68  me file other th
18c90 61 6e 20 61 0a 20 20 2a 2a 20 6e 6f 72 6d 61 6c  an a.  ** normal
18ca0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 29 20   database file) 
18cb0 74 68 65 6e 20 72 65 63 6f 72 64 20 74 68 65 20  then record the 
18cc0 66 61 63 74 20 74 68 61 74 20 74 68 65 20 64 61  fact that the da
18cd0 74 61 62 61 73 65 0a 20 20 2a 2a 20 68 61 73 20  tabase.  ** has 
18ce0 63 68 61 6e 67 65 64 2e 20 20 49 66 20 74 68 65  changed.  If the
18cf0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
18d00 6e 74 65 72 20 69 73 20 6d 6f 64 69 66 69 65 64  nter is modified
18d10 2c 20 72 65 63 6f 72 64 20 74 68 61 74 0a 20 20  , record that.  
18d20 2a 2a 20 66 61 63 74 20 74 6f 6f 2e 0a 20 20 2a  ** fact too..  *
18d30 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 69  /.  if( pFile->i
18d40 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 29 7b 0a  nNormalWrite ){.
18d50 20 20 20 20 70 46 69 6c 65 2d 3e 64 62 55 70 64      pFile->dbUpd
18d60 61 74 65 20 3d 20 31 3b 20 20 2f 2a 20 54 68 65  ate = 1;  /* The
18d70 20 64 61 74 61 62 61 73 65 20 68 61 73 20 62 65   database has be
18d80 65 6e 20 6d 6f 64 69 66 69 65 64 20 2a 2f 0a 20  en modified */. 
18d90 20 20 20 69 66 28 20 6f 66 66 73 65 74 3c 3d 32     if( offset<=2
18da0 34 20 26 26 20 6f 66 66 73 65 74 2b 61 6d 74 3e  4 && offset+amt>
18db0 3d 32 37 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  =27 ){.      int
18dc0 20 72 63 3b 0a 20 20 20 20 20 20 63 68 61 72 20   rc;.      char 
18dd0 6f 6c 64 43 6e 74 72 5b 34 5d 3b 0a 20 20 20 20  oldCntr[4];.    
18de0 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
18df0 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20  rBenign(1);.    
18e00 20 20 72 63 20 3d 20 73 65 65 6b 41 6e 64 52 65    rc = seekAndRe
18e10 61 64 28 70 46 69 6c 65 2c 20 32 34 2c 20 6f 6c  ad(pFile, 24, ol
18e20 64 43 6e 74 72 2c 20 34 29 3b 0a 20 20 20 20 20  dCntr, 4);.     
18e30 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
18e40 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20  Benign(0);.     
18e50 20 69 66 28 20 72 63 21 3d 34 20 7c 7c 20 6d 65   if( rc!=4 || me
18e60 6d 63 6d 70 28 6f 6c 64 43 6e 74 72 2c 20 26 28  mcmp(oldCntr, &(
18e70 28 63 68 61 72 2a 29 70 42 75 66 29 5b 32 34 2d  (char*)pBuf)[24-
18e80 6f 66 66 73 65 74 5d 2c 20 34 29 21 3d 30 20 29  offset], 4)!=0 )
18e90 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d  {.        pFile-
18ea0 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 20 3d  >transCntrChng =
18eb0 20 31 3b 20 20 2f 2a 20 54 68 65 20 74 72 61 6e   1;  /* The tran
18ec0 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20  saction counter 
18ed0 68 61 73 20 63 68 61 6e 67 65 64 20 2a 2f 0a 20  has changed */. 
18ee0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
18ef0 0a 23 65 6e 64 69 66 0a 0a 20 20 77 68 69 6c 65  .#endif..  while
18f00 28 20 61 6d 74 3e 30 20 26 26 20 28 77 72 6f 74  ( amt>0 && (wrot
18f10 65 20 3d 20 73 65 65 6b 41 6e 64 57 72 69 74 65  e = seekAndWrite
18f20 28 70 46 69 6c 65 2c 20 6f 66 66 73 65 74 2c 20  (pFile, offset, 
18f30 70 42 75 66 2c 20 61 6d 74 29 29 3e 30 20 29 7b  pBuf, amt))>0 ){
18f40 0a 20 20 20 20 61 6d 74 20 2d 3d 20 77 72 6f 74  .    amt -= wrot
18f50 65 3b 0a 20 20 20 20 6f 66 66 73 65 74 20 2b 3d  e;.    offset +=
18f60 20 77 72 6f 74 65 3b 0a 20 20 20 20 70 42 75 66   wrote;.    pBuf
18f70 20 3d 20 26 28 28 63 68 61 72 2a 29 70 42 75 66   = &((char*)pBuf
18f80 29 5b 77 72 6f 74 65 5d 3b 0a 20 20 7d 0a 20 20  )[wrote];.  }.  
18f90 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
18fa0 28 20 77 72 6f 74 65 3d 28 2d 31 29 2c 20 61 6d  ( wrote=(-1), am
18fb0 74 3d 31 20 29 29 3b 0a 20 20 53 69 6d 75 6c 61  t=1 ));.  Simula
18fc0 74 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28  teDiskfullError(
18fd0 28 20 77 72 6f 74 65 3d 30 2c 20 61 6d 74 3d 31  ( wrote=0, amt=1
18fe0 20 29 29 3b 0a 20 20 69 66 28 20 61 6d 74 3e 30   ));.  if( amt>0
18ff0 20 29 7b 0a 20 20 20 20 69 66 28 20 77 72 6f 74   ){.    if( wrot
19000 65 3c 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  e<0 ){.      /* 
19010 6c 61 73 74 45 72 72 6e 6f 20 73 65 74 20 62 79  lastErrno set by
19020 20 73 65 65 6b 41 6e 64 57 72 69 74 65 20 2a 2f   seekAndWrite */
19030 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
19040 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45  LITE_IOERR_WRITE
19050 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
19060 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
19070 72 6e 6f 20 3d 20 30 3b 20 2f 2a 20 6e 6f 74 20  rno = 0; /* not 
19080 61 20 73 79 73 74 65 6d 20 65 72 72 6f 72 20 2a  a system error *
19090 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  /.      return S
190a0 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20  QLITE_FULL;.    
190b0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  }.  }.  return S
190c0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66  QLITE_OK;.}..#if
190d0 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
190e0 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20  /*.** Count the 
190f0 6e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 73 79  number of fullsy
19100 6e 63 73 20 61 6e 64 20 6e 6f 72 6d 61 6c 20 73  ncs and normal s
19110 79 6e 63 73 2e 20 20 54 68 69 73 20 69 73 20 75  yncs.  This is u
19120 73 65 64 20 74 6f 20 74 65 73 74 0a 2a 2a 20 74  sed to test.** t
19130 68 61 74 20 73 79 6e 63 73 20 61 6e 64 20 66 75  hat syncs and fu
19140 6c 6c 73 79 6e 63 73 20 61 72 65 20 6f 63 63 75  llsyncs are occu
19150 72 72 69 6e 67 20 61 74 20 74 68 65 20 72 69 67  rring at the rig
19160 68 74 20 74 69 6d 65 73 2e 0a 2a 2f 0a 69 6e 74  ht times..*/.int
19170 20 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f   sqlite3_sync_co
19180 75 6e 74 20 3d 20 30 3b 0a 69 6e 74 20 73 71 6c  unt = 0;.int sql
19190 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f  ite3_fullsync_co
191a0 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  unt = 0;.#endif.
191b0 0a 2f 2a 0a 2a 2a 20 57 65 20 64 6f 20 6e 6f 74  ./*.** We do not
191c0 20 74 72 75 73 74 20 73 79 73 74 65 6d 73 20 74   trust systems t
191d0 6f 20 70 72 6f 76 69 64 65 20 61 20 77 6f 72 6b  o provide a work
191e0 69 6e 67 20 66 64 61 74 61 73 79 6e 63 28 29 2e  ing fdatasync().
191f0 20 20 53 6f 6d 65 20 64 6f 2e 0a 2a 2a 20 4f 74    Some do..** Ot
19200 68 65 72 73 20 64 6f 20 6e 6f 2e 20 20 54 6f 20  hers do no.  To 
19210 62 65 20 73 61 66 65 2c 20 77 65 20 77 69 6c 6c  be safe, we will
19220 20 73 74 69 63 6b 20 77 69 74 68 20 74 68 65 20   stick with the 
19230 28 73 6c 6f 77 65 72 29 20 66 73 79 6e 63 28 29  (slower) fsync()
19240 2e 0a 2a 2a 20 49 66 20 79 6f 75 20 6b 6e 6f 77  ..** If you know
19250 20 74 68 61 74 20 79 6f 75 72 20 73 79 73 74 65   that your syste
19260 6d 20 64 6f 65 73 20 73 75 70 70 6f 72 74 20 66  m does support f
19270 64 61 74 61 73 79 6e 63 28 29 20 63 6f 72 72 65  datasync() corre
19280 63 74 6c 79 2c 0a 2a 2a 20 74 68 65 6e 20 73 69  ctly,.** then si
19290 6d 70 6c 79 20 63 6f 6d 70 69 6c 65 20 77 69 74  mply compile wit
192a0 68 20 2d 44 66 64 61 74 61 73 79 6e 63 3d 66 64  h -Dfdatasync=fd
192b0 61 74 61 73 79 6e 63 0a 2a 2f 0a 23 69 66 20 21  atasync.*/.#if !
192c0 64 65 66 69 6e 65 64 28 66 64 61 74 61 73 79 6e  defined(fdatasyn
192d0 63 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 5f  c) && !defined(_
192e0 5f 6c 69 6e 75 78 5f 5f 29 0a 23 20 64 65 66 69  _linux__).# defi
192f0 6e 65 20 66 64 61 74 61 73 79 6e 63 20 66 73 79  ne fdatasync fsy
19300 6e 63 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  nc.#endif../*.**
19310 20 44 65 66 69 6e 65 20 48 41 56 45 5f 46 55 4c   Define HAVE_FUL
19320 4c 46 53 59 4e 43 20 74 6f 20 30 20 6f 72 20 31  LFSYNC to 0 or 1
19330 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68   depending on wh
19340 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20  ether or not.** 
19350 74 68 65 20 46 5f 46 55 4c 4c 46 53 59 4e 43 20  the F_FULLFSYNC 
19360 6d 61 63 72 6f 20 69 73 20 64 65 66 69 6e 65 64  macro is defined
19370 2e 20 20 46 5f 46 55 4c 4c 46 53 59 4e 43 20 69  .  F_FULLFSYNC i
19380 73 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 6f  s currently.** o
19390 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e  nly available on
193a0 20 4d 61 63 20 4f 53 20 58 2e 20 20 42 75 74 20   Mac OS X.  But 
193b0 74 68 61 74 20 63 6f 75 6c 64 20 63 68 61 6e 67  that could chang
193c0 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 46 5f 46  e..*/.#ifdef F_F
193d0 55 4c 4c 46 53 59 4e 43 0a 23 20 64 65 66 69 6e  ULLFSYNC.# defin
193e0 65 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43  e HAVE_FULLFSYNC
193f0 20 31 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e   1.#else.# defin
19400 65 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43  e HAVE_FULLFSYNC
19410 20 30 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a   0.#endif.../*.*
19420 2a 20 54 68 65 20 66 73 79 6e 63 28 29 20 73 79  * The fsync() sy
19430 73 74 65 6d 20 63 61 6c 6c 20 64 6f 65 73 20 6e  stem call does n
19440 6f 74 20 77 6f 72 6b 20 61 73 20 61 64 76 65 72  ot work as adver
19450 74 69 73 65 64 20 6f 6e 20 6d 61 6e 79 0a 2a 2a  tised on many.**
19460 20 75 6e 69 78 20 73 79 73 74 65 6d 73 2e 20 20   unix systems.  
19470 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 72  The following pr
19480 6f 63 65 64 75 72 65 20 69 73 20 61 6e 20 61 74  ocedure is an at
19490 74 65 6d 70 74 20 74 6f 20 6d 61 6b 65 0a 2a 2a  tempt to make.**
194a0 20 69 74 20 77 6f 72 6b 20 62 65 74 74 65 72 2e   it work better.
194b0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54  .**.** The SQLIT
194c0 45 5f 4e 4f 5f 53 59 4e 43 20 6d 61 63 72 6f 20  E_NO_SYNC macro 
194d0 64 69 73 61 62 6c 65 73 20 61 6c 6c 20 66 73 79  disables all fsy
194e0 6e 63 28 29 73 2e 20 20 54 68 69 73 20 69 73 20  nc()s.  This is 
194f0 75 73 65 66 75 6c 0a 2a 2a 20 66 6f 72 20 74 65  useful.** for te
19500 73 74 69 6e 67 20 77 68 65 6e 20 77 65 20 77 61  sting when we wa
19510 6e 74 20 74 6f 20 72 75 6e 20 74 68 72 6f 75 67  nt to run throug
19520 68 20 74 68 65 20 74 65 73 74 20 73 75 69 74 65  h the test suite
19530 20 71 75 69 63 6b 6c 79 2e 0a 2a 2a 20 59 6f 75   quickly..** You
19540 20 61 72 65 20 73 74 72 6f 6e 67 6c 79 20 61 64   are strongly ad
19550 76 69 73 65 64 20 2a 6e 6f 74 2a 20 74 6f 20 64  vised *not* to d
19560 65 70 6c 6f 79 20 77 69 74 68 20 53 51 4c 49 54  eploy with SQLIT
19570 45 5f 4e 4f 5f 53 59 4e 43 0a 2a 2a 20 65 6e 61  E_NO_SYNC.** ena
19580 62 6c 65 64 2c 20 68 6f 77 65 76 65 72 2c 20 73  bled, however, s
19590 69 6e 63 65 20 77 69 74 68 20 53 51 4c 49 54 45  ince with SQLITE
195a0 5f 4e 4f 5f 53 59 4e 43 20 65 6e 61 62 6c 65 64  _NO_SYNC enabled
195b0 2c 20 61 6e 20 4f 53 20 63 72 61 73 68 0a 2a 2a  , an OS crash.**
195c0 20 6f 72 20 70 6f 77 65 72 20 66 61 69 6c 75 72   or power failur
195d0 65 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 63 6f  e will likely co
195e0 72 72 75 70 74 20 74 68 65 20 64 61 74 61 62 61  rrupt the databa
195f0 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53  se file..**.** S
19600 51 4c 69 74 65 20 73 65 74 73 20 74 68 65 20 64  QLite sets the d
19610 61 74 61 4f 6e 6c 79 20 66 6c 61 67 20 69 66 20  ataOnly flag if 
19620 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
19630 66 69 6c 65 20 69 73 20 75 6e 63 68 61 6e 67 65  file is unchange
19640 64 2e 0a 2a 2a 20 54 68 65 20 69 64 65 61 20 62  d..** The idea b
19650 65 68 69 6e 64 20 64 61 74 61 4f 6e 6c 79 20 69  ehind dataOnly i
19660 73 20 74 68 61 74 20 69 74 20 73 68 6f 75 6c 64  s that it should
19670 20 6f 6e 6c 79 20 77 72 69 74 65 20 74 68 65 20   only write the 
19680 66 69 6c 65 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20  file content.** 
19690 74 6f 20 64 69 73 6b 2c 20 6e 6f 74 20 74 68 65  to disk, not the
196a0 20 69 6e 6f 64 65 2e 20 20 57 65 20 6f 6e 6c 79   inode.  We only
196b0 20 73 65 74 20 64 61 74 61 4f 6e 6c 79 20 69 66   set dataOnly if
196c0 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20 69   the file size i
196d0 73 20 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20  s .** unchanged 
196e0 73 69 6e 63 65 20 74 68 65 20 66 69 6c 65 20 73  since the file s
196f0 69 7a 65 20 69 73 20 70 61 72 74 20 6f 66 20 74  ize is part of t
19700 68 65 20 69 6e 6f 64 65 2e 20 20 48 6f 77 65 76  he inode.  Howev
19710 65 72 2c 20 0a 2a 2a 20 54 65 64 20 54 73 27 6f  er, .** Ted Ts'o
19720 20 74 65 6c 6c 73 20 75 73 20 74 68 61 74 20 66   tells us that f
19730 64 61 74 61 73 79 6e 63 28 29 20 77 69 6c 6c 20  datasync() will 
19740 61 6c 73 6f 20 77 72 69 74 65 20 74 68 65 20 69  also write the i
19750 6e 6f 64 65 20 69 66 20 74 68 65 0a 2a 2a 20 66  node if the.** f
19760 69 6c 65 20 73 69 7a 65 20 68 61 73 20 63 68 61  ile size has cha
19770 6e 67 65 64 2e 20 20 54 68 65 20 6f 6e 6c 79 20  nged.  The only 
19780 72 65 61 6c 20 64 69 66 66 65 72 65 6e 63 65 20  real difference 
19790 62 65 74 77 65 65 6e 20 66 64 61 74 61 73 79 6e  between fdatasyn
197a0 63 28 29 0a 2a 2a 20 61 6e 64 20 66 73 79 6e 63  c().** and fsync
197b0 28 29 2c 20 54 65 64 20 74 65 6c 6c 73 20 75 73  (), Ted tells us
197c0 2c 20 69 73 20 74 68 61 74 20 66 64 61 74 61 73  , is that fdatas
197d0 79 6e 63 28 29 20 77 69 6c 6c 20 6e 6f 74 20 66  ync() will not f
197e0 6c 75 73 68 20 74 68 65 0a 2a 2a 20 69 6e 6f 64  lush the.** inod
197f0 65 20 69 66 20 74 68 65 20 6d 74 69 6d 65 20 6f  e if the mtime o
19800 72 20 6f 77 6e 65 72 20 6f 72 20 6f 74 68 65 72  r owner or other
19810 20 69 6e 6f 64 65 20 61 74 74 72 69 62 75 74 65   inode attribute
19820 73 20 68 61 76 65 20 63 68 61 6e 67 65 64 2e 0a  s have changed..
19830 2a 2a 20 57 65 20 6f 6e 6c 79 20 63 61 72 65 20  ** We only care 
19840 61 62 6f 75 74 20 74 68 65 20 66 69 6c 65 20 73  about the file s
19850 69 7a 65 2c 20 6e 6f 74 20 74 68 65 20 6f 74 68  ize, not the oth
19860 65 72 20 66 69 6c 65 20 61 74 74 72 69 62 75 74  er file attribut
19870 65 73 2c 20 73 6f 0a 2a 2a 20 61 73 20 66 61 72  es, so.** as far
19880 20 61 73 20 53 51 4c 69 74 65 20 69 73 20 63 6f   as SQLite is co
19890 6e 63 65 72 6e 65 64 2c 20 61 6e 20 66 64 61 74  ncerned, an fdat
198a0 61 73 79 6e 63 28 29 20 69 73 20 61 6c 77 61 79  async() is alway
198b0 73 20 61 64 65 71 75 61 74 65 2e 0a 2a 2a 20 53  s adequate..** S
198c0 6f 2c 20 77 65 20 61 6c 77 61 79 73 20 75 73 65  o, we always use
198d0 20 66 64 61 74 61 73 79 6e 63 28 29 20 69 66 20   fdatasync() if 
198e0 69 74 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c  it is available,
198f0 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 0a 2a   regardless of.*
19900 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  * the value of t
19910 68 65 20 64 61 74 61 4f 6e 6c 79 20 66 6c 61 67  he dataOnly flag
19920 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
19930 66 75 6c 6c 5f 66 73 79 6e 63 28 69 6e 74 20 66  full_fsync(int f
19940 64 2c 20 69 6e 74 20 66 75 6c 6c 53 79 6e 63 2c  d, int fullSync,
19950 20 69 6e 74 20 64 61 74 61 4f 6e 6c 79 29 7b 0a   int dataOnly){.
19960 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20    int rc;..  /* 
19970 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 22 69  The following "i
19980 66 64 65 66 2f 65 6c 69 66 2f 65 6c 73 65 2f 22  fdef/elif/else/"
19990 20 62 6c 6f 63 6b 20 68 61 73 20 74 68 65 20 73   block has the s
199a0 61 6d 65 20 73 74 72 75 63 74 75 72 65 20 61 73  ame structure as
199b0 0a 20 20 2a 2a 20 74 68 65 20 6f 6e 65 20 62 65  .  ** the one be
199c0 6c 6f 77 2e 20 49 74 20 69 73 20 72 65 70 6c 69  low. It is repli
199d0 63 61 74 65 64 20 68 65 72 65 20 73 6f 6c 65 6c  cated here solel
199e0 79 20 74 6f 20 61 76 6f 69 64 20 63 6c 75 74 74  y to avoid clutt
199f0 65 72 69 6e 67 20 0a 20 20 2a 2a 20 75 70 20 74  ering .  ** up t
19a00 68 65 20 72 65 61 6c 20 63 6f 64 65 20 77 69 74  he real code wit
19a10 68 20 74 68 65 20 55 4e 55 53 45 44 5f 50 41 52  h the UNUSED_PAR
19a20 41 4d 45 54 45 52 28 29 20 6d 61 63 72 6f 73 2e  AMETER() macros.
19a30 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  .  */.#ifdef SQL
19a40 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20 55 4e  ITE_NO_SYNC.  UN
19a50 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66  USED_PARAMETER(f
19a60 64 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  d);.  UNUSED_PAR
19a70 41 4d 45 54 45 52 28 66 75 6c 6c 53 79 6e 63 29  AMETER(fullSync)
19a80 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
19a90 45 54 45 52 28 64 61 74 61 4f 6e 6c 79 29 3b 0a  ETER(dataOnly);.
19aa0 23 65 6c 69 66 20 48 41 56 45 5f 46 55 4c 4c 46  #elif HAVE_FULLF
19ab0 53 59 4e 43 0a 20 20 55 4e 55 53 45 44 5f 50 41  SYNC.  UNUSED_PA
19ac0 52 41 4d 45 54 45 52 28 64 61 74 61 4f 6e 6c 79  RAMETER(dataOnly
19ad0 29 3b 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45  );.#else.  UNUSE
19ae0 44 5f 50 41 52 41 4d 45 54 45 52 28 66 75 6c 6c  D_PARAMETER(full
19af0 53 79 6e 63 29 3b 0a 20 20 55 4e 55 53 45 44 5f  Sync);.  UNUSED_
19b00 50 41 52 41 4d 45 54 45 52 28 64 61 74 61 4f 6e  PARAMETER(dataOn
19b10 6c 79 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  ly);.#endif..  /
19b20 2a 20 52 65 63 6f 72 64 20 74 68 65 20 6e 75 6d  * Record the num
19b30 62 65 72 20 6f 66 20 74 69 6d 65 73 20 74 68 61  ber of times tha
19b40 74 20 77 65 20 64 6f 20 61 20 6e 6f 72 6d 61 6c  t we do a normal
19b50 20 66 73 79 6e 63 28 29 20 61 6e 64 20 0a 20 20   fsync() and .  
19b60 2a 2a 20 46 55 4c 4c 53 59 4e 43 2e 20 20 54 68  ** FULLSYNC.  Th
19b70 69 73 20 69 73 20 75 73 65 64 20 64 75 72 69 6e  is is used durin
19b80 67 20 74 65 73 74 69 6e 67 20 74 6f 20 76 65 72  g testing to ver
19b90 69 66 79 20 74 68 61 74 20 74 68 69 73 20 70 72  ify that this pr
19ba0 6f 63 65 64 75 72 65 0a 20 20 2a 2a 20 67 65 74  ocedure.  ** get
19bb0 73 20 63 61 6c 6c 65 64 20 77 69 74 68 20 74 68  s called with th
19bc0 65 20 63 6f 72 72 65 63 74 20 61 72 67 75 6d 65  e correct argume
19bd0 6e 74 73 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66  nts..  */.#ifdef
19be0 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69   SQLITE_TEST.  i
19bf0 66 28 20 66 75 6c 6c 53 79 6e 63 20 29 20 73 71  f( fullSync ) sq
19c00 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63  lite3_fullsync_c
19c10 6f 75 6e 74 2b 2b 3b 0a 20 20 73 71 6c 69 74 65  ount++;.  sqlite
19c20 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a  3_sync_count++;.
19c30 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20  #endif..  /* If 
19c40 77 65 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68  we compiled with
19c50 20 74 68 65 20 53 51 4c 49 54 45 5f 4e 4f 5f 53   the SQLITE_NO_S
19c60 59 4e 43 20 66 6c 61 67 2c 20 74 68 65 6e 20 73  YNC flag, then s
19c70 79 6e 63 69 6e 67 20 69 73 20 61 0a 20 20 2a 2a  yncing is a.  **
19c80 20 6e 6f 2d 6f 70 0a 20 20 2a 2f 0a 23 69 66 64   no-op.  */.#ifd
19c90 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e  ef SQLITE_NO_SYN
19ca0 43 0a 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  C.  rc = SQLITE_
19cb0 4f 4b 3b 0a 23 65 6c 69 66 20 48 41 56 45 5f 46  OK;.#elif HAVE_F
19cc0 55 4c 4c 46 53 59 4e 43 0a 20 20 69 66 28 20 66  ULLFSYNC.  if( f
19cd0 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 72  ullSync ){.    r
19ce0 63 20 3d 20 66 63 6e 74 6c 28 66 64 2c 20 46 5f  c = fcntl(fd, F_
19cf0 46 55 4c 4c 46 53 59 4e 43 2c 20 30 29 3b 0a 20  FULLFSYNC, 0);. 
19d00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
19d10 20 31 3b 0a 20 20 7d 0a 20 20 2f 2a 20 49 66 20   1;.  }.  /* If 
19d20 74 68 65 20 46 55 4c 4c 46 53 59 4e 43 20 66 61  the FULLFSYNC fa
19d30 69 6c 65 64 2c 20 66 61 6c 6c 20 62 61 63 6b 20  iled, fall back 
19d40 74 6f 20 61 74 74 65 6d 70 74 69 6e 67 20 61 6e  to attempting an
19d50 20 66 73 79 6e 63 28 29 2e 0a 20 20 2a 2a 20 49   fsync()..  ** I
19d60 74 20 73 68 6f 75 6c 64 6e 27 74 20 62 65 20 70  t shouldn't be p
19d70 6f 73 73 69 62 6c 65 20 66 6f 72 20 66 75 6c 6c  ossible for full
19d80 66 73 79 6e 63 20 74 6f 20 66 61 69 6c 20 6f 6e  fsync to fail on
19d90 20 74 68 65 20 6c 6f 63 61 6c 20 0a 20 20 2a 2a   the local .  **
19da0 20 66 69 6c 65 20 73 79 73 74 65 6d 20 28 6f 6e   file system (on
19db0 20 4f 53 58 29 2c 20 73 6f 20 66 61 69 6c 75 72   OSX), so failur
19dc0 65 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74  e indicates that
19dd0 20 46 55 4c 4c 46 53 59 4e 43 0a 20 20 2a 2a 20   FULLFSYNC.  ** 
19de0 69 73 6e 27 74 20 73 75 70 70 6f 72 74 65 64 20  isn't supported 
19df0 66 6f 72 20 74 68 69 73 20 66 69 6c 65 20 73 79  for this file sy
19e00 73 74 65 6d 2e 20 53 6f 2c 20 61 74 74 65 6d 70  stem. So, attemp
19e10 74 20 61 6e 20 66 73 79 6e 63 20 0a 20 20 2a 2a  t an fsync .  **
19e20 20 61 6e 64 20 28 66 6f 72 20 6e 6f 77 29 20 69   and (for now) i
19e30 67 6e 6f 72 65 20 74 68 65 20 6f 76 65 72 68 65  gnore the overhe
19e40 61 64 20 6f 66 20 61 20 73 75 70 65 72 66 6c 75  ad of a superflu
19e50 6f 75 73 20 66 63 6e 74 6c 20 63 61 6c 6c 2e 20  ous fcntl call. 
19e60 20 0a 20 20 2a 2a 20 49 74 27 64 20 62 65 20 62   .  ** It'd be b
19e70 65 74 74 65 72 20 74 6f 20 64 65 74 65 63 74 20  etter to detect 
19e80 66 75 6c 6c 66 73 79 6e 63 20 73 75 70 70 6f 72  fullfsync suppor
19e90 74 20 6f 6e 63 65 20 61 6e 64 20 61 76 6f 69 64  t once and avoid
19ea0 20 0a 20 20 2a 2a 20 74 68 65 20 66 63 6e 74 6c   .  ** the fcntl
19eb0 20 63 61 6c 6c 20 65 76 65 72 79 20 74 69 6d 65   call every time
19ec0 20 73 79 6e 63 20 69 73 20 63 61 6c 6c 65 64 2e   sync is called.
19ed0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 20 29  .  */.  if( rc )
19ee0 20 72 63 20 3d 20 66 73 79 6e 63 28 66 64 29 3b   rc = fsync(fd);
19ef0 0a 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28  ..#elif defined(
19f00 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 2f 2f 20  __APPLE__).  // 
19f10 66 64 61 74 61 73 79 6e 63 28 29 20 6f 6e 20 48  fdatasync() on H
19f20 46 53 2b 20 64 6f 65 73 6e 27 74 20 79 65 74 20  FS+ doesn't yet 
19f30 66 6c 75 73 68 20 74 68 65 20 66 69 6c 65 20 73  flush the file s
19f40 69 7a 65 20 69 66 20 69 74 20 63 68 61 6e 67 65  ize if it change
19f50 64 20 63 6f 72 72 65 63 74 6c 79 0a 09 2f 2f 20  d correctly..// 
19f60 73 6f 20 63 75 72 72 65 6e 74 6c 79 20 77 65 20  so currently we 
19f70 64 65 66 61 75 6c 74 20 74 6f 20 74 68 65 20 6d  default to the m
19f80 61 63 72 6f 20 74 68 61 74 20 72 65 64 65 66 69  acro that redefi
19f90 6e 65 73 20 66 64 61 74 61 73 79 6e 63 20 74 6f  nes fdatasync to
19fa0 20 66 73 79 6e 63 0a 20 20 72 63 20 3d 20 66 73   fsync.  rc = fs
19fb0 79 6e 63 28 66 64 29 3b 0a 23 65 6c 73 65 20 0a  ync(fd);.#else .
19fc0 20 20 72 63 20 3d 20 66 64 61 74 61 73 79 6e 63    rc = fdatasync
19fd0 28 66 64 29 3b 0a 23 69 66 20 4f 53 5f 56 58 57  (fd);.#if OS_VXW
19fe0 4f 52 4b 53 0a 20 20 69 66 28 20 72 63 3d 3d 2d  ORKS.  if( rc==-
19ff0 31 20 26 26 20 65 72 72 6e 6f 3d 3d 45 4e 4f 54  1 && errno==ENOT
1a000 53 55 50 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  SUP ){.    rc = 
1a010 66 73 79 6e 63 28 66 64 29 3b 0a 20 20 7d 0a 23  fsync(fd);.  }.#
1a020 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f  endif /* OS_VXWO
1a030 52 4b 53 20 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a  RKS */.#endif /*
1a040 20 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f   ifdef SQLITE_NO
1a050 5f 53 59 4e 43 20 65 6c 69 66 20 48 41 56 45 5f  _SYNC elif HAVE_
1a060 46 55 4c 4c 46 53 59 4e 43 20 2a 2f 0a 0a 20 20  FULLFSYNC */..  
1a070 69 66 28 20 4f 53 5f 56 58 57 4f 52 4b 53 20 26  if( OS_VXWORKS &
1a080 26 20 72 63 21 3d 20 2d 31 20 29 7b 0a 20 20 20  & rc!= -1 ){.   
1a090 20 72 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72   rc = 0;.  }.  r
1a0a0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1a0b0 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c  ** Make sure all
1a0c0 20 77 72 69 74 65 73 20 74 6f 20 61 20 70 61 72   writes to a par
1a0d0 74 69 63 75 6c 61 72 20 66 69 6c 65 20 61 72 65  ticular file are
1a0e0 20 63 6f 6d 6d 69 74 74 65 64 20 74 6f 20 64 69   committed to di
1a0f0 73 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 61 74  sk..**.** If dat
1a100 61 4f 6e 6c 79 3d 3d 30 20 74 68 65 6e 20 62 6f  aOnly==0 then bo
1a110 74 68 20 74 68 65 20 66 69 6c 65 20 69 74 73 65  th the file itse
1a120 6c 66 20 61 6e 64 20 69 74 73 20 6d 65 74 61 64  lf and its metad
1a130 61 74 61 20 28 66 69 6c 65 0a 2a 2a 20 73 69 7a  ata (file.** siz
1a140 65 2c 20 61 63 63 65 73 73 20 74 69 6d 65 2c 20  e, access time, 
1a150 65 74 63 29 20 61 72 65 20 73 79 6e 63 65 64 2e  etc) are synced.
1a160 20 20 49 66 20 64 61 74 61 4f 6e 6c 79 21 3d 30    If dataOnly!=0
1a170 20 74 68 65 6e 20 6f 6e 6c 79 20 74 68 65 0a 2a   then only the.*
1a180 2a 20 66 69 6c 65 20 64 61 74 61 20 69 73 20 73  * file data is s
1a190 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 55 6e 64  ynced..**.** Und
1a1a0 65 72 20 55 6e 69 78 2c 20 61 6c 73 6f 20 6d 61  er Unix, also ma
1a1b0 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65  ke sure that the
1a1c0 20 64 69 72 65 63 74 6f 72 79 20 65 6e 74 72 79   directory entry
1a1d0 20 66 6f 72 20 74 68 65 20 66 69 6c 65 0a 2a 2a   for the file.**
1a1e0 20 68 61 73 20 62 65 65 6e 20 63 72 65 61 74 65   has been create
1a1f0 64 20 62 79 20 66 73 79 6e 63 2d 69 6e 67 20 74  d by fsync-ing t
1a200 68 65 20 64 69 72 65 63 74 6f 72 79 20 74 68 61  he directory tha
1a210 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 66  t contains the f
1a220 69 6c 65 2e 0a 2a 2a 20 49 66 20 77 65 20 64 6f  ile..** If we do
1a230 20 6e 6f 74 20 64 6f 20 74 68 69 73 20 61 6e 64   not do this and
1a240 20 77 65 20 65 6e 63 6f 75 6e 74 65 72 20 61 20   we encounter a 
1a250 70 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20 74  power failure, t
1a260 68 65 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20  he directory.** 
1a270 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 6a 6f  entry for the jo
1a280 75 72 6e 61 6c 20 6d 69 67 68 74 20 6e 6f 74 20  urnal might not 
1a290 65 78 69 73 74 20 61 66 74 65 72 20 77 65 20 72  exist after we r
1a2a0 65 62 6f 6f 74 2e 20 20 54 68 65 20 6e 65 78 74  eboot.  The next
1a2b0 0a 2a 2a 20 53 51 4c 69 74 65 20 74 6f 20 61 63  .** SQLite to ac
1a2c0 63 65 73 73 20 74 68 65 20 66 69 6c 65 20 77 69  cess the file wi
1a2d0 6c 6c 20 6e 6f 74 20 6b 6e 6f 77 20 74 68 61 74  ll not know that
1a2e0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 65 78 69   the journal exi
1a2f0 73 74 73 20 28 62 65 63 61 75 73 65 0a 2a 2a 20  sts (because.** 
1a300 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 65 6e  the directory en
1a310 74 72 79 20 66 6f 72 20 74 68 65 20 6a 6f 75 72  try for the jour
1a320 6e 61 6c 20 77 61 73 20 6e 65 76 65 72 20 63 72  nal was never cr
1a330 65 61 74 65 64 29 20 61 6e 64 20 74 68 65 20 74  eated) and the t
1a340 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 77 69  ransaction.** wi
1a350 6c 6c 20 6e 6f 74 20 72 6f 6c 6c 20 62 61 63 6b  ll not roll back
1a360 20 2d 20 70 6f 73 73 69 62 6c 79 20 6c 65 61 64   - possibly lead
1a370 69 6e 67 20 74 6f 20 64 61 74 61 62 61 73 65 20  ing to database 
1a380 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73  corruption..*/.s
1a390 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 79  tatic int unixSy
1a3a0 6e 63 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  nc(sqlite3_file 
1a3b0 2a 69 64 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b  *id, int flags){
1a3c0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e 69  .  int rc;.  uni
1a3d0 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
1a3e0 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20  unixFile*)id;.. 
1a3f0 20 69 6e 74 20 69 73 44 61 74 61 4f 6e 6c 79 20   int isDataOnly 
1a400 3d 20 28 66 6c 61 67 73 26 53 51 4c 49 54 45 5f  = (flags&SQLITE_
1a410 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 29 3b 0a  SYNC_DATAONLY);.
1a420 20 20 69 6e 74 20 69 73 46 75 6c 6c 73 79 6e 63    int isFullsync
1a430 20 3d 20 28 66 6c 61 67 73 26 30 78 30 46 29 3d   = (flags&0x0F)=
1a440 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c  =SQLITE_SYNC_FUL
1a450 4c 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  L;..  /* Check t
1a460 68 61 74 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54  hat one of SQLIT
1a470 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72  E_SYNC_NORMAL or
1a480 20 46 55 4c 4c 20 77 61 73 20 70 61 73 73 65 64   FULL was passed
1a490 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 28 66 6c   */.  assert((fl
1a4a0 61 67 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54  ags&0x0F)==SQLIT
1a4b0 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 0a 20 20  E_SYNC_NORMAL.  
1a4c0 20 20 20 20 7c 7c 20 28 66 6c 61 67 73 26 30 78      || (flags&0x
1a4d0 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43  0F)==SQLITE_SYNC
1a4e0 5f 46 55 4c 4c 0a 20 20 29 3b 0a 0a 20 20 2f 2a  _FULL.  );..  /*
1a4f0 20 55 6e 69 78 20 63 61 6e 6e 6f 74 2c 20 62 75   Unix cannot, bu
1a500 74 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 20 6d  t some systems m
1a510 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ay return SQLITE
1a520 5f 46 55 4c 4c 20 66 72 6f 6d 20 68 65 72 65 2e  _FULL from here.
1a530 20 54 68 69 73 0a 20 20 2a 2a 20 6c 69 6e 65 20   This.  ** line 
1a540 69 73 20 74 6f 20 74 65 73 74 20 74 68 61 74 20  is to test that 
1a550 64 6f 69 6e 67 20 73 6f 20 64 6f 65 73 20 6e 6f  doing so does no
1a560 74 20 63 61 75 73 65 20 61 6e 79 20 70 72 6f 62  t cause any prob
1a570 6c 65 6d 73 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d  lems..  */.  Sim
1a580 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45 72 72  ulateDiskfullErr
1a590 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54  or( return SQLIT
1a5a0 45 5f 46 55 4c 4c 20 29 3b 0a 0a 20 20 61 73 73  E_FULL );..  ass
1a5b0 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
1a5c0 4f 53 54 52 41 43 45 32 28 22 53 59 4e 43 20 20  OSTRACE2("SYNC  
1a5d0 20 20 25 2d 33 64 5c 6e 22 2c 20 70 46 69 6c 65    %-3d\n", pFile
1a5e0 2d 3e 68 29 3b 0a 20 20 72 63 20 3d 20 66 75 6c  ->h);.  rc = ful
1a5f0 6c 5f 66 73 79 6e 63 28 70 46 69 6c 65 2d 3e 68  l_fsync(pFile->h
1a600 2c 20 69 73 46 75 6c 6c 73 79 6e 63 2c 20 69 73  , isFullsync, is
1a610 44 61 74 61 4f 6e 6c 79 29 3b 0a 20 20 53 69 6d  DataOnly);.  Sim
1a620 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 63  ulateIOError( rc
1a630 3d 31 20 29 3b 0a 20 20 69 66 28 20 72 63 20 29  =1 );.  if( rc )
1a640 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73  {.    pFile->las
1a650 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
1a660 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1a670 45 5f 49 4f 45 52 52 5f 46 53 59 4e 43 3b 0a 20  E_IOERR_FSYNC;. 
1a680 20 7d 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e   }.  if( pFile->
1a690 64 69 72 66 64 3e 3d 30 20 29 7b 0a 20 20 20 20  dirfd>=0 ){.    
1a6a0 69 6e 74 20 65 72 72 3b 0a 20 20 20 20 4f 53 54  int err;.    OST
1a6b0 52 41 43 45 34 28 22 44 49 52 53 59 4e 43 20 25  RACE4("DIRSYNC %
1a6c0 2d 33 64 20 28 68 61 76 65 5f 66 75 6c 6c 66 73  -3d (have_fullfs
1a6d0 79 6e 63 3d 25 64 20 66 75 6c 6c 73 79 6e 63 3d  ync=%d fullsync=
1a6e0 25 64 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 64  %d)\n", pFile->d
1a6f0 69 72 66 64 2c 0a 20 20 20 20 20 20 20 20 20 20  irfd,.          
1a700 20 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43    HAVE_FULLFSYNC
1a710 2c 20 69 73 46 75 6c 6c 73 79 6e 63 29 3b 0a 23  , isFullsync);.#
1a720 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 49  ifndef SQLITE_DI
1a730 53 41 42 4c 45 5f 44 49 52 53 59 4e 43 0a 20 20  SABLE_DIRSYNC.  
1a740 20 20 2f 2a 20 54 68 65 20 64 69 72 65 63 74 6f    /* The directo
1a750 72 79 20 73 79 6e 63 20 69 73 20 6f 6e 6c 79 20  ry sync is only 
1a760 61 74 74 65 6d 70 74 65 64 20 69 66 20 66 75 6c  attempted if ful
1a770 6c 5f 66 73 79 6e 63 20 69 73 0a 20 20 20 20 2a  l_fsync is.    *
1a780 2a 20 74 75 72 6e 65 64 20 6f 66 66 20 6f 72 20  * turned off or 
1a790 75 6e 61 76 61 69 6c 61 62 6c 65 2e 20 20 49 66  unavailable.  If
1a7a0 20 61 20 66 75 6c 6c 5f 66 73 79 6e 63 20 6f 63   a full_fsync oc
1a7b0 63 75 72 72 65 64 20 61 62 6f 76 65 2c 0a 20 20  curred above,.  
1a7c0 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 64 69    ** then the di
1a7d0 72 65 63 74 6f 72 79 20 73 79 6e 63 20 69 73 20  rectory sync is 
1a7e0 73 75 70 65 72 66 6c 75 6f 75 73 2e 0a 20 20 20  superfluous..   
1a7f0 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 21 48 41   */.    if( (!HA
1a800 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 7c 7c 20  VE_FULLFSYNC || 
1a810 21 69 73 46 75 6c 6c 73 79 6e 63 29 20 26 26 20  !isFullsync) && 
1a820 66 75 6c 6c 5f 66 73 79 6e 63 28 70 46 69 6c 65  full_fsync(pFile
1a830 2d 3e 64 69 72 66 64 2c 30 2c 30 29 20 29 7b 0a  ->dirfd,0,0) ){.
1a840 20 20 20 20 20 20 20 2f 2a 0a 20 20 20 20 20 20         /*.      
1a850 20 2a 2a 20 57 65 20 68 61 76 65 20 72 65 63 65   ** We have rece
1a860 69 76 65 64 20 6d 75 6c 74 69 70 6c 65 20 72 65  ived multiple re
1a870 70 6f 72 74 73 20 6f 66 20 66 73 79 6e 63 28 29  ports of fsync()
1a880 20 72 65 74 75 72 6e 69 6e 67 0a 20 20 20 20 20   returning.     
1a890 20 20 2a 2a 20 65 72 72 6f 72 73 20 77 68 65 6e    ** errors when
1a8a0 20 61 70 70 6c 69 65 64 20 74 6f 20 64 69 72 65   applied to dire
1a8b0 63 74 6f 72 69 65 73 20 6f 6e 20 63 65 72 74 61  ctories on certa
1a8c0 69 6e 20 66 69 6c 65 20 73 79 73 74 65 6d 73 2e  in file systems.
1a8d0 0a 20 20 20 20 20 20 20 2a 2a 20 41 20 66 61 69  .       ** A fai
1a8e0 6c 65 64 20 64 69 72 65 63 74 6f 72 79 20 73 79  led directory sy
1a8f0 6e 63 20 69 73 20 6e 6f 74 20 61 20 62 69 67 20  nc is not a big 
1a900 64 65 61 6c 2e 20 20 53 6f 20 69 74 20 73 65 65  deal.  So it see
1a910 6d 73 0a 20 20 20 20 20 20 20 2a 2a 20 62 65 74  ms.       ** bet
1a920 74 65 72 20 74 6f 20 69 67 6e 6f 72 65 20 74 68  ter to ignore th
1a930 65 20 65 72 72 6f 72 2e 20 20 54 69 63 6b 65 74  e error.  Ticket
1a940 20 23 31 36 35 37 0a 20 20 20 20 20 20 20 2a 2f   #1657.       */
1a950 0a 20 20 20 20 20 20 20 2f 2a 20 70 46 69 6c 65  .       /* pFile
1a960 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72  ->lastErrno = er
1a970 72 6e 6f 3b 20 2a 2f 0a 20 20 20 20 20 20 20 2f  rno; */.       /
1a980 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * return SQLITE_
1a990 49 4f 45 52 52 3b 20 2a 2f 0a 20 20 20 20 7d 0a  IOERR; */.    }.
1a9a0 23 65 6e 64 69 66 0a 20 20 20 20 65 72 72 20 3d  #endif.    err =
1a9b0 20 63 6c 6f 73 65 28 70 46 69 6c 65 2d 3e 64 69   close(pFile->di
1a9c0 72 66 64 29 3b 20 2f 2a 20 4f 6e 6c 79 20 6e 65  rfd); /* Only ne
1a9d0 65 64 20 74 6f 20 73 79 6e 63 20 6f 6e 63 65 2c  ed to sync once,
1a9e0 20 73 6f 20 63 6c 6f 73 65 20 74 68 65 20 2a 2f   so close the */
1a9f0 0a 20 20 20 20 69 66 28 20 65 72 72 3d 3d 30 20  .    if( err==0 
1aa00 29 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ){              
1aa10 2f 2a 20 64 69 72 65 63 74 6f 72 79 20 77 68 65  /* directory whe
1aa20 6e 20 77 65 20 61 72 65 20 64 6f 6e 65 20 2a 2f  n we are done */
1aa30 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 64 69  .      pFile->di
1aa40 72 66 64 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 65  rfd = -1;.    }e
1aa50 6c 73 65 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  lse{.      pFile
1aa60 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72  ->lastErrno = er
1aa70 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  rno;.      rc = 
1aa80 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49 52  SQLITE_IOERR_DIR
1aa90 5f 43 4c 4f 53 45 3b 0a 20 20 20 20 7d 0a 20 20  _CLOSE;.    }.  
1aaa0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
1aab0 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65  ../*.** Truncate
1aac0 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20 74 6f   an open file to
1aad0 20 61 20 73 70 65 63 69 66 69 65 64 20 73 69 7a   a specified siz
1aae0 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  e.*/.static int 
1aaf0 75 6e 69 78 54 72 75 6e 63 61 74 65 28 73 71 6c  unixTruncate(sql
1ab00 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
1ab10 36 34 20 6e 42 79 74 65 29 7b 0a 20 20 69 6e 74  64 nByte){.  int
1ab20 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 69   rc;.  assert( i
1ab30 64 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49  d );.  SimulateI
1ab40 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53  OError( return S
1ab50 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e  QLITE_IOERR_TRUN
1ab60 43 41 54 45 20 29 3b 0a 20 20 72 63 20 3d 20 66  CATE );.  rc = f
1ab70 74 72 75 6e 63 61 74 65 28 28 28 75 6e 69 78 46  truncate(((unixF
1ab80 69 6c 65 2a 29 69 64 29 2d 3e 68 2c 20 28 6f 66  ile*)id)->h, (of
1ab90 66 5f 74 29 6e 42 79 74 65 29 3b 0a 20 20 69 66  f_t)nByte);.  if
1aba0 28 20 72 63 20 29 7b 0a 20 20 20 20 28 28 75 6e  ( rc ){.    ((un
1abb0 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73  ixFile*)id)->las
1abc0 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
1abd0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1abe0 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45  E_IOERR_TRUNCATE
1abf0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 23 69 66 6e 64  ;.  }else{.#ifnd
1ac00 65 66 20 4e 44 45 42 55 47 0a 20 20 20 20 2f 2a  ef NDEBUG.    /*
1ac10 20 49 66 20 77 65 20 61 72 65 20 64 6f 69 6e 67   If we are doing
1ac20 20 61 20 6e 6f 72 6d 61 6c 20 77 72 69 74 65 20   a normal write 
1ac30 74 6f 20 61 20 64 61 74 61 62 61 73 65 20 66 69  to a database fi
1ac40 6c 65 20 28 61 73 20 6f 70 70 6f 73 65 64 20 74  le (as opposed t
1ac50 6f 0a 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20 61  o.    ** doing a
1ac60 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c   hot-journal rol
1ac70 6c 62 61 63 6b 20 6f 72 20 61 20 77 72 69 74 65  lback or a write
1ac80 20 74 6f 20 73 6f 6d 65 20 66 69 6c 65 20 6f 74   to some file ot
1ac90 68 65 72 20 74 68 61 6e 20 61 0a 20 20 20 20 2a  her than a.    *
1aca0 2a 20 6e 6f 72 6d 61 6c 20 64 61 74 61 62 61 73  * normal databas
1acb0 65 20 66 69 6c 65 29 20 61 6e 64 20 77 65 20 74  e file) and we t
1acc0 72 75 6e 63 61 74 65 20 74 68 65 20 66 69 6c 65  runcate the file
1acd0 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68 2c   to zero length,
1ace0 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 65 66 66  .    ** that eff
1acf0 65 63 74 69 76 65 6c 79 20 75 70 64 61 74 65 73  ectively updates
1ad00 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e   the change coun
1ad10 74 65 72 2e 20 20 54 68 69 73 20 6d 69 67 68 74  ter.  This might
1ad20 20 68 61 70 70 65 6e 0a 20 20 20 20 2a 2a 20 77   happen.    ** w
1ad30 68 65 6e 20 72 65 73 74 6f 72 69 6e 67 20 61 20  hen restoring a 
1ad40 64 61 74 61 62 61 73 65 20 75 73 69 6e 67 20 74  database using t
1ad50 68 65 20 62 61 63 6b 75 70 20 41 50 49 20 66 72  he backup API fr
1ad60 6f 6d 20 61 20 7a 65 72 6f 2d 6c 65 6e 67 74 68  om a zero-length
1ad70 0a 20 20 20 20 2a 2a 20 73 6f 75 72 63 65 2e 0a  .    ** source..
1ad80 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28      */.    if( (
1ad90 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e  (unixFile*)id)->
1ada0 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 26 26  inNormalWrite &&
1adb0 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20   nByte==0 ){.   
1adc0 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69     ((unixFile*)i
1add0 64 29 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e  d)->transCntrChn
1ade0 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e  g = 1;.    }.#en
1adf0 64 69 66 0a 0a 20 20 20 20 72 65 74 75 72 6e 20  dif..    return 
1ae00 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d  SQLITE_OK;.  }.}
1ae10 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e  ../*.** Determin
1ae20 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69  e the current si
1ae30 7a 65 20 6f 66 20 61 20 66 69 6c 65 20 69 6e 20  ze of a file in 
1ae40 62 79 74 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20  bytes.*/.static 
1ae50 69 6e 74 20 75 6e 69 78 46 69 6c 65 53 69 7a 65  int unixFileSize
1ae60 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
1ae70 64 2c 20 69 36 34 20 2a 70 53 69 7a 65 29 7b 0a  d, i64 *pSize){.
1ae80 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 74 72 75    int rc;.  stru
1ae90 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20 61  ct stat buf;.  a
1aea0 73 73 65 72 74 28 20 69 64 20 29 3b 0a 20 20 72  ssert( id );.  r
1aeb0 63 20 3d 20 66 73 74 61 74 28 28 28 75 6e 69 78  c = fstat(((unix
1aec0 46 69 6c 65 2a 29 69 64 29 2d 3e 68 2c 20 26 62  File*)id)->h, &b
1aed0 75 66 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49  uf);.  SimulateI
1aee0 4f 45 72 72 6f 72 28 20 72 63 3d 31 20 29 3b 0a  OError( rc=1 );.
1aef0 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20    if( rc!=0 ){. 
1af00 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69     ((unixFile*)i
1af10 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  d)->lastErrno = 
1af20 65 72 72 6e 6f 3b 0a 20 20 20 20 72 65 74 75 72  errno;.    retur
1af30 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46  n SQLITE_IOERR_F
1af40 53 54 41 54 3b 0a 20 20 7d 0a 20 20 2a 70 53 69  STAT;.  }.  *pSi
1af50 7a 65 20 3d 20 62 75 66 2e 73 74 5f 73 69 7a 65  ze = buf.st_size
1af60 3b 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 6f 70 65  ;..  /* When ope
1af70 6e 69 6e 67 20 61 20 7a 65 72 6f 2d 73 69 7a 65  ning a zero-size
1af80 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20 66   database, the f
1af90 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28 29 20 70 72  indLockInfo() pr
1afa0 6f 63 65 64 75 72 65 0a 20 20 2a 2a 20 77 72 69  ocedure.  ** wri
1afb0 74 65 73 20 61 20 73 69 6e 67 6c 65 20 62 79 74  tes a single byt
1afc0 65 20 69 6e 74 6f 20 74 68 61 74 20 66 69 6c 65  e into that file
1afd0 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 77 6f 72   in order to wor
1afe0 6b 20 61 72 6f 75 6e 64 20 61 20 62 75 67 0a 20  k around a bug. 
1aff0 20 2a 2a 20 69 6e 20 74 68 65 20 4f 53 2d 58 20   ** in the OS-X 
1b000 6d 73 64 6f 73 20 66 69 6c 65 73 79 73 74 65 6d  msdos filesystem
1b010 2e 20 20 49 6e 20 6f 72 64 65 72 20 74 6f 20 61  .  In order to a
1b020 76 6f 69 64 20 70 72 6f 62 6c 65 6d 73 20 77 69  void problems wi
1b030 74 68 20 75 70 70 65 72 0a 20 20 2a 2a 20 6c 61  th upper.  ** la
1b040 79 65 72 73 2c 20 77 65 20 6e 65 65 64 20 74 6f  yers, we need to
1b050 20 72 65 70 6f 72 74 20 74 68 69 73 20 66 69 6c   report this fil
1b060 65 20 73 69 7a 65 20 61 73 20 7a 65 72 6f 20 65  e size as zero e
1b070 76 65 6e 20 74 68 6f 75 67 68 20 69 74 20 69 73  ven though it is
1b080 0a 20 20 2a 2a 20 72 65 61 6c 6c 79 20 31 2e 20  .  ** really 1. 
1b090 20 20 54 69 63 6b 65 74 20 23 33 32 36 30 2e 0a    Ticket #3260..
1b0a0 20 20 2a 2f 0a 20 20 69 66 28 20 2a 70 53 69 7a    */.  if( *pSiz
1b0b0 65 3d 3d 31 20 29 20 2a 70 53 69 7a 65 20 3d 20  e==1 ) *pSize = 
1b0c0 30 3b 0a 0a 0a 20 20 72 65 74 75 72 6e 20 53 51  0;...  return SQ
1b0d0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20  LITE_OK;.}..#if 
1b0e0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
1b0f0 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64  CKING_STYLE && d
1b100 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
1b110 29 0a 2f 2a 0a 2a 2a 20 48 61 6e 64 6c 65 72 20  )./*.** Handler 
1b120 66 6f 72 20 70 72 6f 78 79 2d 6c 6f 63 6b 69 6e  for proxy-lockin
1b130 67 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 76  g file-control v
1b140 65 72 62 73 2e 20 20 44 65 66 69 6e 65 64 20 62  erbs.  Defined b
1b150 65 6c 6f 77 20 69 6e 20 74 68 65 0a 2a 2a 20 70  elow in the.** p
1b160 72 6f 78 79 69 6e 67 20 6c 6f 63 6b 69 6e 67 20  roxying locking 
1b170 64 69 76 69 73 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  division..*/.sta
1b180 74 69 63 20 69 6e 74 20 70 72 6f 78 79 46 69 6c  tic int proxyFil
1b190 65 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33  eControl(sqlite3
1b1a0 5f 66 69 6c 65 2a 2c 69 6e 74 2c 76 6f 69 64 2a  _file*,int,void*
1b1b0 29 3b 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  );.#endif.../*.*
1b1c0 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 6e  * Information an
1b1d0 64 20 63 6f 6e 74 72 6f 6c 20 6f 66 20 61 6e 20  d control of an 
1b1e0 6f 70 65 6e 20 66 69 6c 65 20 68 61 6e 64 6c 65  open file handle
1b1f0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1b200 75 6e 69 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 28  unixFileControl(
1b210 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
1b220 2c 20 69 6e 74 20 6f 70 2c 20 76 6f 69 64 20 2a  , int op, void *
1b230 70 41 72 67 29 7b 0a 20 20 73 77 69 74 63 68 28  pArg){.  switch(
1b240 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20   op ){.    case 
1b250 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43  SQLITE_FCNTL_LOC
1b260 4b 53 54 41 54 45 3a 20 7b 0a 20 20 20 20 20 20  KSTATE: {.      
1b270 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d 20 28 28  *(int*)pArg = ((
1b280 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c  unixFile*)id)->l
1b290 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20 20 20 72  ocktype;.      r
1b2a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1b2b0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1b2c0 53 51 4c 49 54 45 5f 4c 41 53 54 5f 45 52 52 4e  SQLITE_LAST_ERRN
1b2d0 4f 3a 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74  O: {.      *(int
1b2e0 2a 29 70 41 72 67 20 3d 20 28 28 75 6e 69 78 46  *)pArg = ((unixF
1b2f0 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72  ile*)id)->lastEr
1b300 72 6e 6f 3b 0a 20 20 20 20 20 20 72 65 74 75 72  rno;.      retur
1b310 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
1b320 20 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55   }.#ifndef NDEBU
1b330 47 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67  G.    /* The pag
1b340 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20 6d 65  er calls this me
1b350 74 68 6f 64 20 74 6f 20 73 69 67 6e 61 6c 20 74  thod to signal t
1b360 68 61 74 20 69 74 20 68 61 73 20 64 6f 6e 65 0a  hat it has done.
1b370 20 20 20 20 2a 2a 20 61 20 72 6f 6c 6c 62 61 63      ** a rollbac
1b380 6b 20 61 6e 64 20 74 68 61 74 20 74 68 65 20 64  k and that the d
1b390 61 74 61 62 61 73 65 20 69 73 20 74 68 65 72 65  atabase is there
1b3a0 66 6f 72 65 20 75 6e 63 68 61 6e 67 65 64 20 61  fore unchanged a
1b3b0 6e 64 0a 20 20 20 20 2a 2a 20 69 74 20 68 65 6e  nd.    ** it hen
1b3c0 63 65 20 69 74 20 69 73 20 4f 4b 20 66 6f 72 20  ce it is OK for 
1b3d0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
1b3e0 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 74  change counter t
1b3f0 6f 20 62 65 0a 20 20 20 20 2a 2a 20 75 6e 63 68  o be.    ** unch
1b400 61 6e 67 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  anged..    */.  
1b410 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
1b420 4e 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44  NTL_DB_UNCHANGED
1b430 3a 20 7b 0a 20 20 20 20 20 20 28 28 75 6e 69 78  : {.      ((unix
1b440 46 69 6c 65 2a 29 69 64 29 2d 3e 64 62 55 70 64  File*)id)->dbUpd
1b450 61 74 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  ate = 0;.      r
1b460 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1b470 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69  .    }.#endif.#i
1b480 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
1b490 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26  LOCKING_STYLE &&
1b4a0 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
1b4b0 5f 5f 29 0a 20 20 20 20 63 61 73 65 20 53 51 4c  __).    case SQL
1b4c0 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58  ITE_SET_LOCKPROX
1b4d0 59 46 49 4c 45 3a 0a 20 20 20 20 63 61 73 65 20  YFILE:.    case 
1b4e0 53 51 4c 49 54 45 5f 47 45 54 5f 4c 4f 43 4b 50  SQLITE_GET_LOCKP
1b4f0 52 4f 58 59 46 49 4c 45 3a 20 7b 0a 20 20 20 20  ROXYFILE: {.    
1b500 20 20 72 65 74 75 72 6e 20 70 72 6f 78 79 46 69    return proxyFi
1b510 6c 65 43 6f 6e 74 72 6f 6c 28 69 64 2c 6f 70 2c  leControl(id,op,
1b520 70 41 72 67 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  pArg);.    }.#en
1b530 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e  dif /* SQLITE_EN
1b540 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
1b550 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f  LE && defined(__
1b560 41 50 50 4c 45 5f 5f 29 20 2a 2f 0a 20 20 7d 0a  APPLE__) */.  }.
1b570 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1b580 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ERROR;.}../*.** 
1b590 52 65 74 75 72 6e 20 74 68 65 20 73 65 63 74 6f  Return the secto
1b5a0 72 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20  r size in bytes 
1b5b0 6f 66 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  of the underlyin
1b5c0 67 20 62 6c 6f 63 6b 20 64 65 76 69 63 65 20 66  g block device f
1b5d0 6f 72 0a 2a 2a 20 74 68 65 20 73 70 65 63 69 66  or.** the specif
1b5e0 69 65 64 20 66 69 6c 65 2e 20 54 68 69 73 20 69  ied file. This i
1b5f0 73 20 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20  s almost always 
1b600 35 31 32 20 62 79 74 65 73 2c 20 62 75 74 20 6d  512 bytes, but m
1b610 61 79 20 62 65 0a 2a 2a 20 6c 61 72 67 65 72 20  ay be.** larger 
1b620 66 6f 72 20 73 6f 6d 65 20 64 65 76 69 63 65 73  for some devices
1b630 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 63  ..**.** SQLite c
1b640 6f 64 65 20 61 73 73 75 6d 65 73 20 74 68 69 73  ode assumes this
1b650 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e 6e 6f 74   function cannot
1b660 20 66 61 69 6c 2e 20 49 74 20 61 6c 73 6f 20 61   fail. It also a
1b670 73 73 75 6d 65 73 20 74 68 61 74 0a 2a 2a 20 69  ssumes that.** i
1b680 66 20 74 77 6f 20 66 69 6c 65 73 20 61 72 65 20  f two files are 
1b690 63 72 65 61 74 65 64 20 69 6e 20 74 68 65 20 73  created in the s
1b6a0 61 6d 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  ame file-system 
1b6b0 64 69 72 65 63 74 6f 72 79 20 28 69 2e 65 2e 0a  directory (i.e..
1b6c0 2a 2a 20 61 20 64 61 74 61 62 61 73 65 20 61 6e  ** a database an
1b6d0 64 20 69 74 73 20 6a 6f 75 72 6e 61 6c 20 66 69  d its journal fi
1b6e0 6c 65 29 20 74 68 61 74 20 74 68 65 20 73 65 63  le) that the sec
1b6f0 74 6f 72 20 73 69 7a 65 20 77 69 6c 6c 20 62 65  tor size will be
1b700 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 66 6f 72   the.** same for
1b710 20 62 6f 74 68 2e 0a 2a 2f 0a 73 74 61 74 69 63   both..*/.static
1b720 20 69 6e 74 20 75 6e 69 78 53 65 63 74 6f 72 53   int unixSectorS
1b730 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ize(sqlite3_file
1b740 20 2a 4e 6f 74 55 73 65 64 29 7b 0a 20 20 55 4e   *NotUsed){.  UN
1b750 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
1b760 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72  otUsed);.  retur
1b770 6e 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  n SQLITE_DEFAULT
1b780 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 7d 0a  _SECTOR_SIZE;.}.
1b790 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
1b7a0 65 20 64 65 76 69 63 65 20 63 68 61 72 61 63 74  e device charact
1b7b0 65 72 69 73 74 69 63 73 20 66 6f 72 20 74 68 65  eristics for the
1b7c0 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20 61   file. This is a
1b7d0 6c 77 61 79 73 20 30 20 66 6f 72 20 75 6e 69 78  lways 0 for unix
1b7e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1b7f0 75 6e 69 78 44 65 76 69 63 65 43 68 61 72 61 63  unixDeviceCharac
1b800 74 65 72 69 73 74 69 63 73 28 73 71 6c 69 74 65  teristics(sqlite
1b810 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64 29  3_file *NotUsed)
1b820 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
1b830 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
1b840 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
1b850 0a 2a 2a 20 48 65 72 65 20 65 6e 64 73 20 74 68  .** Here ends th
1b860 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
1b870 20 6f 66 20 61 6c 6c 20 73 71 6c 69 74 65 33 5f   of all sqlite3_
1b880 66 69 6c 65 20 6d 65 74 68 6f 64 73 2e 0a 2a 2a  file methods..**
1b890 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
1b8a0 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 73 71 6c 69  ******* End sqli
1b8b0 74 65 33 5f 66 69 6c 65 20 4d 65 74 68 6f 64 73  te3_file Methods
1b8c0 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
1b8d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1b8e0 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
1b8f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1b900 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1b910 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1b920 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
1b930 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 64 69 76  ../*.** This div
1b940 69 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 64  ision contains d
1b950 65 66 69 6e 69 74 69 6f 6e 73 20 6f 66 20 73 71  efinitions of sq
1b960 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
1b970 20 6f 62 6a 65 63 74 73 20 74 68 61 74 0a 2a 2a   objects that.**
1b980 20 69 6d 70 6c 65 6d 65 6e 74 20 76 61 72 69 6f   implement vario
1b990 75 73 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20  us file locking 
1b9a0 73 74 72 61 74 65 67 69 65 73 2e 20 20 49 74 20  strategies.  It 
1b9b0 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 73 20 64 65  also contains de
1b9c0 66 69 6e 69 74 69 6f 6e 73 0a 2a 2a 20 6f 66 20  finitions.** of 
1b9d0 22 66 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f  "finder" functio
1b9e0 6e 73 2e 20 20 41 20 66 69 6e 64 65 72 2d 66 75  ns.  A finder-fu
1b9f0 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  nction is used t
1ba00 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 61 70 70  o locate the app
1ba10 72 6f 70 72 69 61 74 65 0a 2a 2a 20 73 71 6c 69  ropriate.** sqli
1ba20 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f  te3_io_methods o
1ba30 62 6a 65 63 74 20 66 6f 72 20 61 20 70 61 72 74  bject for a part
1ba40 69 63 75 6c 61 72 20 64 61 74 61 62 61 73 65 20  icular database 
1ba50 66 69 6c 65 2e 20 20 54 68 65 20 70 41 70 70 44  file.  The pAppD
1ba60 61 74 61 0a 2a 2a 20 66 69 65 6c 64 20 6f 66 20  ata.** field of 
1ba70 74 68 65 20 73 71 6c 69 74 65 33 5f 76 66 73 20  the sqlite3_vfs 
1ba80 56 46 53 20 6f 62 6a 65 63 74 73 20 61 72 65 20  VFS objects are 
1ba90 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 62  initialized to b
1baa0 65 20 70 6f 69 6e 74 65 72 73 20 74 6f 0a 2a 2a  e pointers to.**
1bab0 20 74 68 65 20 63 6f 72 72 65 63 74 20 66 69 6e   the correct fin
1bac0 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 66 6f 72  der-function for
1bad0 20 74 68 61 74 20 56 46 53 2e 0a 2a 2a 0a 2a 2a   that VFS..**.**
1bae0 20 4d 6f 73 74 20 66 69 6e 64 65 72 20 66 75 6e   Most finder fun
1baf0 63 74 69 6f 6e 73 20 72 65 74 75 72 6e 20 61 20  ctions return a 
1bb00 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 69 78  pointer to a fix
1bb10 65 64 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  ed sqlite3_io_me
1bb20 74 68 6f 64 73 0a 2a 2a 20 6f 62 6a 65 63 74 2e  thods.** object.
1bb30 20 20 54 68 65 20 6f 6e 6c 79 20 69 6e 74 65 72    The only inter
1bb40 65 73 74 69 6e 67 20 66 69 6e 64 65 72 2d 66 75  esting finder-fu
1bb50 6e 63 74 69 6f 6e 20 69 73 20 61 75 74 6f 6c 6f  nction is autolo
1bb60 63 6b 49 6f 46 69 6e 64 65 72 2c 20 77 68 69 63  ckIoFinder, whic
1bb70 68 0a 2a 2a 20 6c 6f 6f 6b 73 20 61 74 20 74 68  h.** looks at th
1bb80 65 20 66 69 6c 65 73 79 73 74 65 6d 20 74 79 70  e filesystem typ
1bb90 65 20 61 6e 64 20 74 72 69 65 73 20 74 6f 20 67  e and tries to g
1bba0 75 65 73 73 20 74 68 65 20 62 65 73 74 20 6c 6f  uess the best lo
1bbb0 63 6b 69 6e 67 0a 2a 2a 20 73 74 72 61 74 65 67  cking.** strateg
1bbc0 79 20 66 72 6f 6d 20 74 68 61 74 2e 0a 2a 2a 0a  y from that..**.
1bbd0 2a 2a 20 46 6f 72 20 66 69 6e 64 65 72 2d 66 75  ** For finder-fu
1bbe0 6e 74 69 6f 6e 20 46 2c 20 74 77 6f 20 6f 62 6a  ntion F, two obj
1bbf0 65 63 74 73 20 61 72 65 20 63 72 65 61 74 65 64  ects are created
1bc00 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 54  :.**.**    (1) T
1bc10 68 65 20 72 65 61 6c 20 66 69 6e 64 65 72 2d 66  he real finder-f
1bc20 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 64 20 22 46  unction named "F
1bc30 49 6d 70 74 28 29 22 2e 0a 2a 2a 0a 2a 2a 20 20  Impt()"..**.**  
1bc40 20 20 28 32 29 20 41 20 63 6f 6e 73 74 61 6e 74    (2) A constant
1bc50 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 69 73   pointer to this
1bc60 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 64 20   function named 
1bc70 6a 75 73 74 20 22 46 22 2e 0a 2a 2a 0a 2a 2a 0a  just "F"..**.**.
1bc80 2a 2a 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20  ** A pointer to 
1bc90 74 68 65 20 46 20 70 6f 69 6e 74 65 72 20 69 73  the F pointer is
1bca0 20 75 73 65 64 20 61 73 20 74 68 65 20 70 41 70   used as the pAp
1bcb0 70 44 61 74 61 20 76 61 6c 75 65 20 66 6f 72 20  pData value for 
1bcc0 56 46 53 0a 2a 2a 20 6f 62 6a 65 63 74 73 2e 20  VFS.** objects. 
1bcd0 20 57 65 20 68 61 76 65 20 74 6f 20 64 6f 20 74   We have to do t
1bce0 68 69 73 20 69 6e 73 74 65 61 64 20 6f 66 20 6c  his instead of l
1bcf0 65 74 74 69 6e 67 20 70 41 70 70 44 61 74 61 20  etting pAppData 
1bd00 70 6f 69 6e 74 0a 2a 2a 20 64 69 72 65 63 74 6c  point.** directl
1bd10 79 20 61 74 20 74 68 65 20 66 69 6e 64 65 72 2d  y at the finder-
1bd20 66 75 6e 63 74 69 6f 6e 20 73 69 6e 63 65 20 43  function since C
1bd30 39 30 20 72 75 6c 65 73 20 70 72 65 76 65 6e 74  90 rules prevent
1bd40 20 61 20 76 6f 69 64 2a 0a 2a 2a 20 66 72 6f 6d   a void*.** from
1bd50 20 62 65 20 63 61 73 74 20 69 6e 74 6f 20 61 20   be cast into a 
1bd60 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72  function pointer
1bd70 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 45 61 63 68 20  ..**.**.** Each 
1bd80 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73  instance of this
1bd90 20 6d 61 63 72 6f 20 67 65 6e 65 72 61 74 65 73   macro generates
1bda0 20 74 77 6f 20 6f 62 6a 65 63 74 73 3a 0a 2a 2a   two objects:.**
1bdb0 0a 2a 2a 20 20 20 2a 20 20 41 20 63 6f 6e 73 74  .**   *  A const
1bdc0 61 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  ant sqlite3_io_m
1bdd0 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 63 61  ethods object ca
1bde0 6c 6c 20 4d 45 54 48 4f 44 20 74 68 61 74 20 68  ll METHOD that h
1bdf0 61 73 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20  as locking.**   
1be00 20 20 20 6d 65 74 68 6f 64 73 20 43 4c 4f 53 45     methods CLOSE
1be10 2c 20 4c 4f 43 4b 2c 20 55 4e 4c 4f 43 4b 2c 20  , LOCK, UNLOCK, 
1be20 43 4b 52 45 53 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a  CKRESLOCK..**.**
1be30 20 20 20 2a 20 20 41 6e 20 49 2f 4f 20 6d 65 74     *  An I/O met
1be40 68 6f 64 20 66 69 6e 64 65 72 20 66 75 6e 63 74  hod finder funct
1be50 69 6f 6e 20 63 61 6c 6c 65 64 20 46 49 4e 44 45  ion called FINDE
1be60 52 20 74 68 61 74 20 72 65 74 75 72 6e 73 20 61  R that returns a
1be70 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 20 20 20 20   pointer.**     
1be80 20 74 6f 20 74 68 65 20 4d 45 54 48 4f 44 20 6f   to the METHOD o
1be90 62 6a 65 63 74 20 69 6e 20 74 68 65 20 70 72 65  bject in the pre
1bea0 76 69 6f 75 73 20 62 75 6c 6c 65 74 2e 0a 2a 2f  vious bullet..*/
1beb0 0a 23 64 65 66 69 6e 65 20 49 4f 4d 45 54 48 4f  .#define IOMETHO
1bec0 44 53 28 46 49 4e 44 45 52 2c 20 4d 45 54 48 4f  DS(FINDER, METHO
1bed0 44 2c 20 43 4c 4f 53 45 2c 20 4c 4f 43 4b 2c 20  D, CLOSE, LOCK, 
1bee0 55 4e 4c 4f 43 4b 2c 20 43 4b 4c 4f 43 4b 29 20  UNLOCK, CKLOCK) 
1bef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
1bf00 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c  static const sql
1bf10 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
1bf20 4d 45 54 48 4f 44 20 3d 20 7b 20 20 20 20 20 20  METHOD = {      
1bf30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bf40 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
1bf50 20 20 31 2c 20 20 20 20 20 20 20 20 20 20 20 20    1,            
1bf60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1bf70 20 69 56 65 72 73 69 6f 6e 20 2a 2f 20 20 20 20   iVersion */    
1bf80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bf90 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
1bfa0 20 43 4c 4f 53 45 2c 20 20 20 20 20 20 20 20 20   CLOSE,         
1bfb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1bfc0 78 43 6c 6f 73 65 20 2a 2f 20 20 20 20 20 20 20  xClose */       
1bfd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bfe0 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
1bff0 75 6e 69 78 52 65 61 64 2c 20 20 20 20 20 20 20  unixRead,       
1c000 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
1c010 52 65 61 64 20 2a 2f 20 20 20 20 20 20 20 20 20  Read */         
1c020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c030 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75            \.   u
1c040 6e 69 78 57 72 69 74 65 2c 20 20 20 20 20 20 20  nixWrite,       
1c050 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 57             /* xW
1c060 72 69 74 65 20 2a 2f 20 20 20 20 20 20 20 20 20  rite */         
1c070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c080 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e           \.   un
1c090 69 78 54 72 75 6e 63 61 74 65 2c 20 20 20 20 20  ixTruncate,     
1c0a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 54 72            /* xTr
1c0b0 75 6e 63 61 74 65 20 2a 2f 20 20 20 20 20 20 20  uncate */       
1c0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c0d0 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69          \.   uni
1c0e0 78 53 79 6e 63 2c 20 20 20 20 20 20 20 20 20 20  xSync,          
1c0f0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 79 6e           /* xSyn
1c100 63 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  c */            
1c110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c120 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78         \.   unix
1c130 46 69 6c 65 53 69 7a 65 2c 20 20 20 20 20 20 20  FileSize,       
1c140 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 65          /* xFile
1c150 53 69 7a 65 20 2a 2f 20 20 20 20 20 20 20 20 20  Size */         
1c160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c170 20 20 20 20 20 20 5c 0a 20 20 20 4c 4f 43 4b 2c        \.   LOCK,
1c180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c190 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20         /* xLock 
1c1a0 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
1c1b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c1c0 20 20 20 20 20 5c 0a 20 20 20 55 4e 4c 4f 43 4b       \.   UNLOCK
1c1d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1c1e0 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b        /* xUnlock
1c1f0 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
1c200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c210 20 20 20 20 5c 0a 20 20 20 43 4b 4c 4f 43 4b 2c      \.   CKLOCK,
1c220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c230 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65       /* xCheckRe
1c240 73 65 72 76 65 64 4c 6f 63 6b 20 2a 2f 20 20 20  servedLock */   
1c250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c260 20 20 20 5c 0a 20 20 20 75 6e 69 78 46 69 6c 65     \.   unixFile
1c270 43 6f 6e 74 72 6f 6c 2c 20 20 20 20 20 20 20 20  Control,        
1c280 20 20 20 20 2f 2a 20 78 46 69 6c 65 43 6f 6e 74      /* xFileCont
1c290 72 6f 6c 20 2a 2f 20 20 20 20 20 20 20 20 20 20  rol */          
1c2a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c2b0 20 20 5c 0a 20 20 20 75 6e 69 78 53 65 63 74 6f    \.   unixSecto
1c2c0 72 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20  rSize,          
1c2d0 20 20 20 2f 2a 20 78 53 65 63 74 6f 72 53 69 7a     /* xSectorSiz
1c2e0 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  e */            
1c2f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c300 20 5c 0a 20 20 20 75 6e 69 78 44 65 76 69 63 65   \.   unixDevice
1c310 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20  Characteristics 
1c320 20 20 2f 2a 20 78 44 65 76 69 63 65 43 61 70 61    /* xDeviceCapa
1c330 62 69 6c 69 74 69 65 73 20 2a 2f 20 20 20 20 20  bilities */     
1c340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c350 5c 0a 7d 3b 20 20 20 20 20 20 20 20 20 20 20 20  \.};            
1c360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
1c3a0 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71  .static const sq
1c3b0 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
1c3c0 20 2a 46 49 4e 44 45 52 23 23 49 6d 70 6c 28 63   *FINDER##Impl(c
1c3d0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 75 6e  onst char *z, un
1c3e0 69 78 46 69 6c 65 20 2a 70 29 7b 20 20 20 5c 0a  ixFile *p){   \.
1c3f0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
1c400 45 52 28 7a 29 3b 20 55 4e 55 53 45 44 5f 50 41  ER(z); UNUSED_PA
1c410 52 41 4d 45 54 45 52 28 70 29 3b 20 20 20 20 20  RAMETER(p);     
1c420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c430 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
1c440 20 72 65 74 75 72 6e 20 26 4d 45 54 48 4f 44 3b   return &METHOD;
1c450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c480 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 7d 20              \.} 
1c490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c4b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c4d0 20 20 20 20 20 20 20 20 20 20 20 5c 0a 73 74 61             \.sta
1c4e0 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  tic const sqlite
1c4f0 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 28 2a  3_io_methods *(*
1c500 63 6f 6e 73 74 20 46 49 4e 44 45 52 29 28 63 6f  const FINDER)(co
1c510 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69 78 46 69  nst char*,unixFi
1c520 6c 65 20 2a 70 29 20 20 20 20 5c 0a 20 20 20 20  le *p)    \.    
1c530 3d 20 46 49 4e 44 45 52 23 23 49 6d 70 6c 3b 0a  = FINDER##Impl;.
1c540 0a 2f 2a 0a 2a 2a 20 48 65 72 65 20 61 72 65 20  ./*.** Here are 
1c550 61 6c 6c 20 6f 66 20 74 68 65 20 73 71 6c 69 74  all of the sqlit
1c560 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62  e3_io_methods ob
1c570 6a 65 63 74 73 20 66 6f 72 20 65 61 63 68 20 6f  jects for each o
1c580 66 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 69 6e 67  f the.** locking
1c590 20 73 74 72 61 74 65 67 69 65 73 2e 20 20 46 75   strategies.  Fu
1c5a0 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 72 65 74  nctions that ret
1c5b0 75 72 6e 20 70 6f 69 6e 74 65 72 73 20 74 6f 20  urn pointers to 
1c5c0 74 68 65 73 65 20 6d 65 74 68 6f 64 73 0a 2a 2a  these methods.**
1c5d0 20 61 72 65 20 61 6c 73 6f 20 63 72 65 61 74 65   are also create
1c5e0 64 2e 0a 2a 2f 0a 49 4f 4d 45 54 48 4f 44 53 28  d..*/.IOMETHODS(
1c5f0 0a 20 20 70 6f 73 69 78 49 6f 46 69 6e 64 65 72  .  posixIoFinder
1c600 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
1c610 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20  Finder function 
1c620 6e 61 6d 65 20 2a 2f 0a 20 20 70 6f 73 69 78 49  name */.  posixI
1c630 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20  oMethods,       
1c640 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69      /* sqlite3_i
1c650 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74  o_methods object
1c660 20 6e 61 6d 65 20 2a 2f 0a 20 20 75 6e 69 78 43   name */.  unixC
1c670 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  lose,           
1c680 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d       /* xClose m
1c690 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 4c  ethod */.  unixL
1c6a0 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
1c6b0 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65       /* xLock me
1c6c0 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 55 6e  thod */.  unixUn
1c6d0 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  lock,           
1c6e0 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d      /* xUnlock m
1c6f0 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 43  ethod */.  unixC
1c700 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
1c710 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65       /* xCheckRe
1c720 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f  servedLock metho
1c730 64 20 2a 2f 0a 29 0a 49 4f 4d 45 54 48 4f 44 53  d */.).IOMETHODS
1c740 28 0a 20 20 6e 6f 6c 6f 63 6b 49 6f 46 69 6e 64  (.  nolockIoFind
1c750 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  er,           /*
1c760 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e   Finder function
1c770 20 6e 61 6d 65 20 2a 2f 0a 20 20 6e 6f 6c 6f 63   name */.  noloc
1c780 6b 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20  kIoMethods,     
1c790 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f       /* sqlite3_
1c7a0 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63  io_methods objec
1c7b0 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 6e 6f 6c 6f  t name */.  nolo
1c7c0 63 6b 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20  ckClose,        
1c7d0 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20        /* xClose 
1c7e0 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c 6f  method */.  nolo
1c7f0 63 6b 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  ckLock,         
1c800 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d        /* xLock m
1c810 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63  ethod */.  noloc
1c820 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20  kUnlock,        
1c830 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20       /* xUnlock 
1c840 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c 6f  method */.  nolo
1c850 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  ckCheckReservedL
1c860 6f 63 6b 20 20 20 2f 2a 20 78 43 68 65 63 6b 52  ock   /* xCheckR
1c870 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68  eservedLock meth
1c880 6f 64 20 2a 2f 0a 29 0a 49 4f 4d 45 54 48 4f 44  od */.).IOMETHOD
1c890 53 28 0a 20 20 64 6f 74 6c 6f 63 6b 49 6f 46 69  S(.  dotlockIoFi
1c8a0 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 2f  nder,          /
1c8b0 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f  * Finder functio
1c8c0 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 64 6f 74 6c  n name */.  dotl
1c8d0 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20  ockIoMethods,   
1c8e0 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33        /* sqlite3
1c8f0 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65  _io_methods obje
1c900 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 64 6f 74  ct name */.  dot
1c910 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20 20 20 20 20  lockClose,      
1c920 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65         /* xClose
1c930 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 64 6f 74   method */.  dot
1c940 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20 20 20 20  lockLock,       
1c950 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20         /* xLock 
1c960 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 64 6f 74 6c  method */.  dotl
1c970 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20  ockUnlock,      
1c980 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b        /* xUnlock
1c990 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 64 6f 74   method */.  dot
1c9a0 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65  lockCheckReserve
1c9b0 64 4c 6f 63 6b 20 20 2f 2a 20 78 43 68 65 63 6b  dLock  /* xCheck
1c9c0 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74  ReservedLock met
1c9d0 68 6f 64 20 2a 2f 0a 29 0a 0a 23 69 66 20 53 51  hod */.)..#if SQ
1c9e0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
1c9f0 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 21 4f 53  ING_STYLE && !OS
1ca00 5f 56 58 57 4f 52 4b 53 0a 49 4f 4d 45 54 48 4f  _VXWORKS.IOMETHO
1ca10 44 53 28 0a 20 20 66 6c 6f 63 6b 49 6f 46 69 6e  DS(.  flockIoFin
1ca20 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  der,            
1ca30 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69  /* Finder functi
1ca40 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 66 6c 6f  on name */.  flo
1ca50 63 6b 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20  ckIoMethods,    
1ca60 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65         /* sqlite
1ca70 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a  3_io_methods obj
1ca80 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 66 6c  ect name */.  fl
1ca90 6f 63 6b 43 6c 6f 73 65 2c 20 20 20 20 20 20 20  ockClose,       
1caa0 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73          /* xClos
1cab0 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 66 6c  e method */.  fl
1cac0 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20  ockLock,        
1cad0 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b          /* xLock
1cae0 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f   method */.  flo
1caf0 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20  ckUnlock,       
1cb00 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63         /* xUnloc
1cb10 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 66 6c  k method */.  fl
1cb20 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64  ockCheckReserved
1cb30 4c 6f 63 6b 20 20 20 20 2f 2a 20 78 43 68 65 63  Lock    /* xChec
1cb40 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65  kReservedLock me
1cb50 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66  thod */.).#endif
1cb60 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  ..#if OS_VXWORKS
1cb70 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 73 65  .IOMETHODS(.  se
1cb80 6d 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20  mIoFinder,      
1cb90 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65          /* Finde
1cba0 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20  r function name 
1cbb0 2a 2f 0a 20 20 73 65 6d 49 6f 4d 65 74 68 6f 64  */.  semIoMethod
1cbc0 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  s,             /
1cbd0 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  * sqlite3_io_met
1cbe0 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65  hods object name
1cbf0 20 2a 2f 0a 20 20 73 65 6d 43 6c 6f 73 65 2c 20   */.  semClose, 
1cc00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cc10 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64  /* xClose method
1cc20 20 2a 2f 0a 20 20 73 65 6d 4c 6f 63 6b 2c 20 20   */.  semLock,  
1cc30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cc40 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  /* xLock method 
1cc50 2a 2f 0a 20 20 73 65 6d 55 6e 6c 6f 63 6b 2c 20  */.  semUnlock, 
1cc60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1cc70 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64  * xUnlock method
1cc80 20 2a 2f 0a 20 20 73 65 6d 43 68 65 63 6b 52 65   */.  semCheckRe
1cc90 73 65 72 76 65 64 4c 6f 63 6b 20 20 20 20 20 20  servedLock      
1cca0 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65  /* xCheckReserve
1ccb0 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  dLock method */.
1ccc0 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65  ).#endif..#if de
1ccd0 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
1cce0 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
1ccf0 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
1cd00 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 61 66 70  IOMETHODS(.  afp
1cd10 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20  IoFinder,       
1cd20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72         /* Finder
1cd30 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a   function name *
1cd40 2f 0a 20 20 61 66 70 49 6f 4d 65 74 68 6f 64 73  /.  afpIoMethods
1cd50 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
1cd60 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
1cd70 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20  ods object name 
1cd80 2a 2f 0a 20 20 61 66 70 43 6c 6f 73 65 2c 20 20  */.  afpClose,  
1cd90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1cda0 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20  * xClose method 
1cdb0 2a 2f 0a 20 20 61 66 70 4c 6f 63 6b 2c 20 20 20  */.  afpLock,   
1cdc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1cdd0 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  * xLock method *
1cde0 2f 0a 20 20 61 66 70 55 6e 6c 6f 63 6b 2c 20 20  /.  afpUnlock,  
1cdf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ce00 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20   xUnlock method 
1ce10 2a 2f 0a 20 20 61 66 70 43 68 65 63 6b 52 65 73  */.  afpCheckRes
1ce20 65 72 76 65 64 4c 6f 63 6b 20 20 20 20 20 20 2f  ervedLock      /
1ce30 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  * xCheckReserved
1ce40 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29  Lock method */.)
1ce50 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
1ce60 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67  he proxy locking
1ce70 20 6d 65 74 68 6f 64 20 69 73 20 61 20 22 73 75   method is a "su
1ce80 70 65 72 2d 6d 65 74 68 6f 64 22 20 69 6e 20 74  per-method" in t
1ce90 68 65 20 73 65 6e 73 65 20 74 68 61 74 20 69 74  he sense that it
1cea0 0a 2a 2a 20 6f 70 65 6e 73 20 73 65 63 6f 6e 64  .** opens second
1ceb0 61 72 79 20 66 69 6c 65 20 64 65 73 63 72 69 70  ary file descrip
1cec0 74 6f 72 73 20 66 6f 72 20 74 68 65 20 63 6f 6e  tors for the con
1ced0 63 68 20 61 6e 64 20 6c 6f 63 6b 20 66 69 6c 65  ch and lock file
1cee0 73 20 61 6e 64 0a 2a 2a 20 69 74 20 75 73 65 73  s and.** it uses
1cef0 20 70 72 6f 78 79 2c 20 64 6f 74 2d 66 69 6c 65   proxy, dot-file
1cf00 2c 20 41 46 50 2c 20 61 6e 64 20 66 6c 6f 63 6b  , AFP, and flock
1cf10 28 29 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f  () locking metho
1cf20 64 73 20 6f 6e 20 74 68 6f 73 65 0a 2a 2a 20 73  ds on those.** s
1cf30 65 63 6f 6e 64 61 72 79 20 66 69 6c 65 73 2e 20  econdary files. 
1cf40 20 46 6f 72 20 74 68 69 73 20 72 65 61 73 6f 6e   For this reason
1cf50 2c 20 74 68 65 20 64 69 76 69 73 69 6f 6e 20 74  , the division t
1cf60 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 0a 2a  hat implements.*
1cf70 2a 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20  * proxy locking 
1cf80 69 73 20 6c 6f 63 61 74 65 64 20 6d 75 63 68 20  is located much 
1cf90 66 75 72 74 68 65 72 20 64 6f 77 6e 20 69 6e 20  further down in 
1cfa0 74 68 65 20 66 69 6c 65 2e 20 20 42 75 74 20 77  the file.  But w
1cfb0 65 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 67 6f 20  e need.** to go 
1cfc0 61 68 65 61 64 20 61 6e 64 20 64 65 66 69 6e 65  ahead and define
1cfd0 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f   the sqlite3_io_
1cfe0 6d 65 74 68 6f 64 73 20 61 6e 64 20 66 69 6e 64  methods and find
1cff0 65 72 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 66  er function.** f
1d000 6f 72 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67  or proxy locking
1d010 20 68 65 72 65 2e 20 20 53 6f 20 77 65 20 66 6f   here.  So we fo
1d020 72 77 61 72 64 20 64 65 63 6c 61 72 65 20 74 68  rward declare th
1d030 65 20 49 2f 4f 20 6d 65 74 68 6f 64 73 2e 0a 2a  e I/O methods..*
1d040 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  /.#if defined(__
1d050 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
1d060 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
1d070 47 5f 53 54 59 4c 45 0a 73 74 61 74 69 63 20 69  G_STYLE.static i
1d080 6e 74 20 70 72 6f 78 79 43 6c 6f 73 65 28 73 71  nt proxyClose(sq
1d090 6c 69 74 65 33 5f 66 69 6c 65 2a 29 3b 0a 73 74  lite3_file*);.st
1d0a0 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 4c 6f  atic int proxyLo
1d0b0 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  ck(sqlite3_file*
1d0c0 2c 20 69 6e 74 29 3b 0a 73 74 61 74 69 63 20 69  , int);.static i
1d0d0 6e 74 20 70 72 6f 78 79 55 6e 6c 6f 63 6b 28 73  nt proxyUnlock(s
1d0e0 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e  qlite3_file*, in
1d0f0 74 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 70  t);.static int p
1d100 72 6f 78 79 43 68 65 63 6b 52 65 73 65 72 76 65  roxyCheckReserve
1d110 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  dLock(sqlite3_fi
1d120 6c 65 2a 2c 20 69 6e 74 2a 29 3b 0a 49 4f 4d 45  le*, int*);.IOME
1d130 54 48 4f 44 53 28 0a 20 20 70 72 6f 78 79 49 6f  THODS(.  proxyIo
1d140 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20  Finder,         
1d150 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e     /* Finder fun
1d160 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  ction name */.  
1d170 70 72 6f 78 79 49 6f 4d 65 74 68 6f 64 73 2c 20  proxyIoMethods, 
1d180 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c            /* sql
1d190 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
1d1a0 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20  object name */. 
1d1b0 20 70 72 6f 78 79 43 6c 6f 73 65 2c 20 20 20 20   proxyClose,    
1d1c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
1d1d0 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lose method */. 
1d1e0 20 70 72 6f 78 79 4c 6f 63 6b 2c 20 20 20 20 20   proxyLock,     
1d1f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c             /* xL
1d200 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
1d210 70 72 6f 78 79 55 6e 6c 6f 63 6b 2c 20 20 20 20  proxyUnlock,    
1d220 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e            /* xUn
1d230 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lock method */. 
1d240 20 70 72 6f 78 79 43 68 65 63 6b 52 65 73 65 72   proxyCheckReser
1d250 76 65 64 4c 6f 63 6b 20 20 20 20 2f 2a 20 78 43  vedLock    /* xC
1d260 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
1d270 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e   method */.).#en
1d280 64 69 66 0a 0a 2f 2a 20 6e 66 73 20 6c 6f 63 6b  dif../* nfs lock
1d290 64 20 6f 6e 20 4f 53 58 20 31 30 2e 33 2b 20 64  d on OSX 10.3+ d
1d2a0 6f 65 73 6e 27 74 20 63 6c 65 61 72 20 77 72 69  oesn't clear wri
1d2b0 74 65 20 6c 6f 63 6b 73 20 77 68 65 6e 20 61 20  te locks when a 
1d2c0 72 65 61 64 20 6c 6f 63 6b 20 69 73 20 73 65 74  read lock is set
1d2d0 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28   */.#if defined(
1d2e0 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51  __APPLE__) && SQ
1d2f0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
1d300 49 4e 47 5f 53 54 59 4c 45 0a 49 4f 4d 45 54 48  ING_STYLE.IOMETH
1d310 4f 44 53 28 0a 20 20 6e 66 73 49 6f 46 69 6e 64  ODS(.  nfsIoFind
1d320 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
1d330 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63    /* Finder func
1d340 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 6e  tion name */.  n
1d350 66 73 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20  fsIoMethods,    
1d360 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c            /* sql
1d370 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
1d380 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20  object name */. 
1d390 20 75 6e 69 78 43 6c 6f 73 65 2c 20 20 20 20 20   unixClose,     
1d3a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
1d3b0 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a  Close method */.
1d3c0 20 20 75 6e 69 78 4c 6f 63 6b 2c 20 20 20 20 20    unixLock,     
1d3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d3e0 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  xLock method */.
1d3f0 20 20 6e 66 73 55 6e 6c 6f 63 6b 2c 20 20 20 20    nfsUnlock,    
1d400 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d410 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  xUnlock method *
1d420 2f 0a 20 20 75 6e 69 78 43 68 65 63 6b 52 65 73  /.  unixCheckRes
1d430 65 72 76 65 64 4c 6f 63 6b 20 20 20 20 20 20 2f  ervedLock      /
1d440 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  * xCheckReserved
1d450 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29  Lock method */.)
1d460 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66  .#endif..#if def
1d470 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
1d480 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
1d490 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f  _LOCKING_STYLE./
1d4a0 2a 20 0a 2a 2a 20 54 68 69 73 20 22 66 69 6e 64  * .** This "find
1d4b0 65 72 22 20 66 75 6e 63 74 69 6f 6e 20 61 74 74  er" function att
1d4c0 65 6d 70 74 73 20 74 6f 20 64 65 74 65 72 6d 69  empts to determi
1d4d0 6e 65 20 74 68 65 20 62 65 73 74 20 6c 6f 63 6b  ne the best lock
1d4e0 69 6e 67 20 73 74 72 61 74 65 67 79 20 0a 2a 2a  ing strategy .**
1d4f0 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73   for the databas
1d500 65 20 66 69 6c 65 20 22 66 69 6c 65 50 61 74 68  e file "filePath
1d510 22 2e 20 20 49 74 20 74 68 65 6e 20 72 65 74 75  ".  It then retu
1d520 72 6e 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f  rns the sqlite3_
1d530 69 6f 5f 6d 65 74 68 6f 64 73 0a 2a 2a 20 6f 62  io_methods.** ob
1d540 6a 65 63 74 20 74 68 61 74 20 69 6d 70 6c 65 6d  ject that implem
1d550 65 6e 74 73 20 74 68 61 74 20 73 74 72 61 74 65  ents that strate
1d560 67 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  gy..**.** This i
1d570 73 20 66 6f 72 20 4d 61 63 4f 53 58 20 6f 6e 6c  s for MacOSX onl
1d580 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  y..*/.static con
1d590 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  st sqlite3_io_me
1d5a0 74 68 6f 64 73 20 2a 61 75 74 6f 6c 6f 63 6b 49  thods *autolockI
1d5b0 6f 46 69 6e 64 65 72 49 6d 70 6c 28 0a 20 20 63  oFinderImpl(.  c
1d5c0 6f 6e 73 74 20 63 68 61 72 20 2a 66 69 6c 65 50  onst char *fileP
1d5d0 61 74 68 2c 20 20 20 20 2f 2a 20 6e 61 6d 65 20  ath,    /* name 
1d5e0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1d5f0 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 46 69  file */.  unixFi
1d600 6c 65 20 2a 70 4e 65 77 20 20 20 20 20 20 20 20  le *pNew        
1d610 20 20 20 2f 2a 20 6f 70 65 6e 20 66 69 6c 65 20     /* open file 
1d620 6f 62 6a 65 63 74 20 66 6f 72 20 74 68 65 20 64  object for the d
1d630 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
1d640 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  ){.  static cons
1d650 74 20 73 74 72 75 63 74 20 4d 61 70 70 69 6e 67  t struct Mapping
1d660 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61   {.    const cha
1d670 72 20 2a 7a 46 69 6c 65 73 79 73 74 65 6d 3b 20  r *zFilesystem; 
1d680 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d690 46 69 6c 65 73 79 73 74 65 6d 20 74 79 70 65 20  Filesystem type 
1d6a0 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 63 6f 6e 73  name */.    cons
1d6b0 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  t sqlite3_io_met
1d6c0 68 6f 64 73 20 2a 70 4d 65 74 68 6f 64 73 3b 20  hods *pMethods; 
1d6d0 20 20 2f 2a 20 41 70 70 72 6f 70 72 69 61 74 65    /* Appropriate
1d6e0 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 20   locking method 
1d6f0 2a 2f 0a 20 20 7d 20 61 4d 61 70 5b 5d 20 3d 20  */.  } aMap[] = 
1d700 7b 0a 20 20 20 20 7b 20 22 68 66 73 22 2c 20 20  {.    { "hfs",  
1d710 20 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64    &posixIoMethod
1d720 73 20 7d 2c 0a 20 20 20 20 7b 20 22 75 66 73 22  s },.    { "ufs"
1d730 2c 20 20 20 20 26 70 6f 73 69 78 49 6f 4d 65 74  ,    &posixIoMet
1d740 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20 22 61  hods },.    { "a
1d750 66 70 66 73 22 2c 20 20 26 61 66 70 49 6f 4d 65  fpfs",  &afpIoMe
1d760 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20 22  thods },.    { "
1d770 73 6d 62 66 73 22 2c 20 20 26 61 66 70 49 6f 4d  smbfs",  &afpIoM
1d780 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20  ethods },.    { 
1d790 22 77 65 62 64 61 76 22 2c 20 26 6e 6f 6c 6f 63  "webdav", &noloc
1d7a0 6b 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20  kIoMethods },.  
1d7b0 20 20 7b 20 30 2c 20 30 20 7d 0a 20 20 7d 3b 0a    { 0, 0 }.  };.
1d7c0 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63    int i;.  struc
1d7d0 74 20 73 74 61 74 66 73 20 66 73 49 6e 66 6f 3b  t statfs fsInfo;
1d7e0 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20  .  struct flock 
1d7f0 6c 6f 63 6b 49 6e 66 6f 3b 0a 0a 20 20 69 66 28  lockInfo;..  if(
1d800 20 21 66 69 6c 65 50 61 74 68 20 29 7b 0a 20 20   !filePath ){.  
1d810 20 20 2f 2a 20 49 66 20 66 69 6c 65 50 61 74 68    /* If filePath
1d820 3d 3d 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e  ==NULL that mean
1d830 73 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67  s we are dealing
1d840 20 77 69 74 68 20 61 20 74 72 61 6e 73 69 65 6e   with a transien
1d850 74 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68  t file.    ** th
1d860 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64  at does not need
1d870 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 2e 20 2a   to be locked. *
1d880 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 26 6e 6f  /.    return &no
1d890 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20  lockIoMethods;. 
1d8a0 20 7d 0a 20 20 69 66 28 20 73 74 61 74 66 73 28   }.  if( statfs(
1d8b0 66 69 6c 65 50 61 74 68 2c 20 26 66 73 49 6e 66  filePath, &fsInf
1d8c0 6f 29 20 21 3d 20 2d 31 20 29 7b 0a 20 20 20 20  o) != -1 ){.    
1d8d0 69 66 28 20 66 73 49 6e 66 6f 2e 66 5f 66 6c 61  if( fsInfo.f_fla
1d8e0 67 73 20 26 20 4d 4e 54 5f 52 44 4f 4e 4c 59 20  gs & MNT_RDONLY 
1d8f0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1d900 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73  &nolockIoMethods
1d910 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
1d920 69 3d 30 3b 20 61 4d 61 70 5b 69 5d 2e 7a 46 69  i=0; aMap[i].zFi
1d930 6c 65 73 79 73 74 65 6d 3b 20 69 2b 2b 29 7b 0a  lesystem; i++){.
1d940 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70        if( strcmp
1d950 28 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65  (fsInfo.f_fstype
1d960 6e 61 6d 65 2c 20 61 4d 61 70 5b 69 5d 2e 7a 46  name, aMap[i].zF
1d970 69 6c 65 73 79 73 74 65 6d 29 3d 3d 30 20 29 7b  ilesystem)==0 ){
1d980 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1d990 61 4d 61 70 5b 69 5d 2e 70 4d 65 74 68 6f 64 73  aMap[i].pMethods
1d9a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1d9b0 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 66 61 75 6c    }..  /* Defaul
1d9c0 74 20 63 61 73 65 2e 20 48 61 6e 64 6c 65 73 2c  t case. Handles,
1d9d0 20 61 6d 6f 6e 67 73 74 20 6f 74 68 65 72 73 2c   amongst others,
1d9e0 20 22 6e 66 73 22 2e 0a 20 20 2a 2a 20 54 65 73   "nfs"..  ** Tes
1d9f0 74 20 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63  t byte-range loc
1da00 6b 20 75 73 69 6e 67 20 66 63 6e 74 6c 28 29 2e  k using fcntl().
1da10 20 49 66 20 74 68 65 20 63 61 6c 6c 20 73 75 63   If the call suc
1da20 63 65 65 64 73 2c 20 0a 20 20 2a 2a 20 61 73 73  ceeds, .  ** ass
1da30 75 6d 65 20 74 68 61 74 20 74 68 65 20 66 69 6c  ume that the fil
1da40 65 2d 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74  e-system support
1da50 73 20 50 4f 53 49 58 20 73 74 79 6c 65 20 6c 6f  s POSIX style lo
1da60 63 6b 73 2e 20 0a 20 20 2a 2f 0a 20 20 6c 6f 63  cks. .  */.  loc
1da70 6b 49 6e 66 6f 2e 6c 5f 6c 65 6e 20 3d 20 31 3b  kInfo.l_len = 1;
1da80 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 73 74  .  lockInfo.l_st
1da90 61 72 74 20 3d 20 30 3b 0a 20 20 6c 6f 63 6b 49  art = 0;.  lockI
1daa0 6e 66 6f 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53  nfo.l_whence = S
1dab0 45 45 4b 5f 53 45 54 3b 0a 20 20 6c 6f 63 6b 49  EEK_SET;.  lockI
1dac0 6e 66 6f 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52  nfo.l_type = F_R
1dad0 44 4c 43 4b 3b 0a 20 20 69 66 28 20 66 63 6e 74  DLCK;.  if( fcnt
1dae0 6c 28 70 4e 65 77 2d 3e 68 2c 20 46 5f 47 45 54  l(pNew->h, F_GET
1daf0 4c 4b 2c 20 26 6c 6f 63 6b 49 6e 66 6f 29 21 3d  LK, &lockInfo)!=
1db00 2d 31 20 29 20 7b 0a 20 20 20 20 69 66 28 20 73  -1 ) {.    if( s
1db10 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e 66 5f 66  trcmp(fsInfo.f_f
1db20 73 74 79 70 65 6e 61 6d 65 2c 20 22 6e 66 73 22  stypename, "nfs"
1db30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  )==0 ){.      re
1db40 74 75 72 6e 20 26 6e 66 73 49 6f 4d 65 74 68 6f  turn &nfsIoMetho
1db50 64 73 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  ds;.    } else {
1db60 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 26 70  .      return &p
1db70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 3b 0a 20  osixIoMethods;. 
1db80 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
1db90 20 20 72 65 74 75 72 6e 20 26 64 6f 74 6c 6f 63    return &dotloc
1dba0 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a  kIoMethods;.  }.
1dbb0 7d 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73  }.static const s
1dbc0 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
1dbd0 73 20 0a 20 20 2a 28 2a 63 6f 6e 73 74 20 61 75  s .  *(*const au
1dbe0 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 29 28  tolockIoFinder)(
1dbf0 63 6f 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69 78  const char*,unix
1dc00 46 69 6c 65 2a 29 20 3d 20 61 75 74 6f 6c 6f 63  File*) = autoloc
1dc10 6b 49 6f 46 69 6e 64 65 72 49 6d 70 6c 3b 0a 0a  kIoFinderImpl;..
1dc20 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65  #endif /* define
1dc30 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20  d(__APPLE__) && 
1dc40 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
1dc50 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a  CKING_STYLE */..
1dc60 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 20 26  #if OS_VXWORKS &
1dc70 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  & SQLITE_ENABLE_
1dc80 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a  LOCKING_STYLE./*
1dc90 20 0a 2a 2a 20 54 68 69 73 20 22 66 69 6e 64 65   .** This "finde
1dca0 72 22 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65  r" function atte
1dcb0 6d 70 74 73 20 74 6f 20 64 65 74 65 72 6d 69 6e  mpts to determin
1dcc0 65 20 74 68 65 20 62 65 73 74 20 6c 6f 63 6b 69  e the best locki
1dcd0 6e 67 20 73 74 72 61 74 65 67 79 20 0a 2a 2a 20  ng strategy .** 
1dce0 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65  for the database
1dcf0 20 66 69 6c 65 20 22 66 69 6c 65 50 61 74 68 22   file "filePath"
1dd00 2e 20 20 49 74 20 74 68 65 6e 20 72 65 74 75 72  .  It then retur
1dd10 6e 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69  ns the sqlite3_i
1dd20 6f 5f 6d 65 74 68 6f 64 73 0a 2a 2a 20 6f 62 6a  o_methods.** obj
1dd30 65 63 74 20 74 68 61 74 20 69 6d 70 6c 65 6d 65  ect that impleme
1dd40 6e 74 73 20 74 68 61 74 20 73 74 72 61 74 65 67  nts that strateg
1dd50 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  y..**.** This is
1dd60 20 66 6f 72 20 56 58 57 6f 72 6b 73 20 6f 6e 6c   for VXWorks onl
1dd70 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  y..*/.static con
1dd80 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  st sqlite3_io_me
1dd90 74 68 6f 64 73 20 2a 61 75 74 6f 6c 6f 63 6b 49  thods *autolockI
1dda0 6f 46 69 6e 64 65 72 49 6d 70 6c 28 0a 20 20 63  oFinderImpl(.  c
1ddb0 6f 6e 73 74 20 63 68 61 72 20 2a 66 69 6c 65 50  onst char *fileP
1ddc0 61 74 68 2c 20 20 20 20 2f 2a 20 6e 61 6d 65 20  ath,    /* name 
1ddd0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1dde0 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 46 69  file */.  unixFi
1ddf0 6c 65 20 2a 70 4e 65 77 20 20 20 20 20 20 20 20  le *pNew        
1de00 20 20 20 2f 2a 20 74 68 65 20 6f 70 65 6e 20 66     /* the open f
1de10 69 6c 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b  ile object */.){
1de20 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20  .  struct flock 
1de30 6c 6f 63 6b 49 6e 66 6f 3b 0a 0a 20 20 69 66 28  lockInfo;..  if(
1de40 20 21 66 69 6c 65 50 61 74 68 20 29 7b 0a 20 20   !filePath ){.  
1de50 20 20 2f 2a 20 49 66 20 66 69 6c 65 50 61 74 68    /* If filePath
1de60 3d 3d 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e  ==NULL that mean
1de70 73 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67  s we are dealing
1de80 20 77 69 74 68 20 61 20 74 72 61 6e 73 69 65 6e   with a transien
1de90 74 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68  t file.    ** th
1dea0 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64  at does not need
1deb0 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 2e 20 2a   to be locked. *
1dec0 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 26 6e 6f  /.    return &no
1ded0 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20  lockIoMethods;. 
1dee0 20 7d 0a 0a 20 20 2f 2a 20 54 65 73 74 20 69 66   }..  /* Test if
1def0 20 66 63 6e 74 6c 28 29 20 69 73 20 73 75 70 70   fcntl() is supp
1df00 6f 72 74 65 64 20 61 6e 64 20 75 73 65 20 50 4f  orted and use PO
1df10 53 49 58 20 73 74 79 6c 65 20 6c 6f 63 6b 73 2e  SIX style locks.
1df20 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 20  .  ** Otherwise 
1df30 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 74 68 65  fall back to the
1df40 20 6e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65   named semaphore
1df50 20 6d 65 74 68 6f 64 2e 0a 20 20 2a 2f 0a 20 20   method..  */.  
1df60 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 6c 65 6e 20 3d  lockInfo.l_len =
1df70 20 31 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c   1;.  lockInfo.l
1df80 5f 73 74 61 72 74 20 3d 20 30 3b 0a 20 20 6c 6f  _start = 0;.  lo
1df90 63 6b 49 6e 66 6f 2e 6c 5f 77 68 65 6e 63 65 20  ckInfo.l_whence 
1dfa0 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 6c 6f  = SEEK_SET;.  lo
1dfb0 63 6b 49 6e 66 6f 2e 6c 5f 74 79 70 65 20 3d 20  ckInfo.l_type = 
1dfc0 46 5f 52 44 4c 43 4b 3b 0a 20 20 69 66 28 20 66  F_RDLCK;.  if( f
1dfd0 63 6e 74 6c 28 70 4e 65 77 2d 3e 68 2c 20 46 5f  cntl(pNew->h, F_
1dfe0 47 45 54 4c 4b 2c 20 26 6c 6f 63 6b 49 6e 66 6f  GETLK, &lockInfo
1dff0 29 21 3d 2d 31 20 29 20 7b 0a 20 20 20 20 72 65  )!=-1 ) {.    re
1e000 74 75 72 6e 20 26 70 6f 73 69 78 49 6f 4d 65 74  turn &posixIoMet
1e010 68 6f 64 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  hods;.  }else{. 
1e020 20 20 20 72 65 74 75 72 6e 20 26 73 65 6d 49 6f     return &semIo
1e030 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 7d 0a 73  Methods;.  }.}.s
1e040 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69  tatic const sqli
1e050 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 0a  te3_io_methods .
1e060 20 20 2a 28 2a 63 6f 6e 73 74 20 61 75 74 6f 6c    *(*const autol
1e070 6f 63 6b 49 6f 46 69 6e 64 65 72 29 28 63 6f 6e  ockIoFinder)(con
1e080 73 74 20 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c  st char*,unixFil
1e090 65 2a 29 20 3d 20 61 75 74 6f 6c 6f 63 6b 49 6f  e*) = autolockIo
1e0a0 46 69 6e 64 65 72 49 6d 70 6c 3b 0a 0a 23 65 6e  FinderImpl;..#en
1e0b0 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b  dif /* OS_VXWORK
1e0c0 53 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42  S && SQLITE_ENAB
1e0d0 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
1e0e0 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 61 62   */../*.** An ab
1e0f0 73 74 72 61 63 74 20 74 79 70 65 20 66 6f 72 20  stract type for 
1e100 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 49  a pointer to a I
1e110 4f 20 6d 65 74 68 6f 64 20 66 69 6e 64 65 72 20  O method finder 
1e120 66 75 6e 63 74 69 6f 6e 3a 0a 2a 2f 0a 74 79 70  function:.*/.typ
1e130 65 64 65 66 20 63 6f 6e 73 74 20 73 71 6c 69 74  edef const sqlit
1e140 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 28  e3_io_methods *(
1e150 2a 66 69 6e 64 65 72 5f 74 79 70 65 29 28 63 6f  *finder_type)(co
1e160 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69 78 46 69  nst char*,unixFi
1e170 6c 65 2a 29 3b 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  le*);.../*******
1e180 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e190 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e1a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e1b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e1c0 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
1e1d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e1e0 2a 2a 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d  ** sqlite3_vfs m
1e1f0 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ethods *********
1e200 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e210 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 64  ***.**.** This d
1e220 69 76 69 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73  ivision contains
1e230 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   the implementat
1e240 69 6f 6e 20 6f 66 20 6d 65 74 68 6f 64 73 20 6f  ion of methods o
1e250 6e 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33  n the.** sqlite3
1e260 5f 76 66 73 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a  _vfs object..*/.
1e270 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
1e280 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  e the contents o
1e290 66 20 74 68 65 20 75 6e 69 78 46 69 6c 65 20 73  f the unixFile s
1e2a0 74 72 75 63 74 75 72 65 20 70 6f 69 6e 74 65 64  tructure pointed
1e2b0 20 74 6f 20 62 79 20 70 49 64 2e 0a 2a 2f 0a 73   to by pId..*/.s
1e2c0 74 61 74 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e  tatic int fillIn
1e2d0 55 6e 69 78 46 69 6c 65 28 0a 20 20 73 71 6c 69  UnixFile(.  sqli
1e2e0 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20  te3_vfs *pVfs,  
1e2f0 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
1e300 6f 20 76 66 73 20 6f 62 6a 65 63 74 20 2a 2f 0a  o vfs object */.
1e310 20 20 69 6e 74 20 68 2c 20 20 20 20 20 20 20 20    int h,        
1e320 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65            /* Ope
1e330 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
1e340 72 20 6f 66 20 66 69 6c 65 20 62 65 69 6e 67 20  r of file being 
1e350 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 69 6e 74 20  opened */.  int 
1e360 64 69 72 66 64 2c 20 20 20 20 20 20 20 20 20 20  dirfd,          
1e370 20 20 20 20 2f 2a 20 44 69 72 65 63 74 6f 72 79      /* Directory
1e380 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
1e390 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69   */.  sqlite3_fi
1e3a0 6c 65 20 2a 70 49 64 2c 20 20 20 20 20 20 2f 2a  le *pId,      /*
1e3b0 20 57 72 69 74 65 20 74 6f 20 74 68 65 20 75 6e   Write to the un
1e3c0 69 78 46 69 6c 65 20 73 74 72 75 63 74 75 72 65  ixFile structure
1e3d0 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74   here */.  const
1e3e0 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
1e3f0 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68  ,  /* Name of th
1e400 65 20 66 69 6c 65 20 62 65 69 6e 67 20 6f 70 65  e file being ope
1e410 6e 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 4c  ned */.  int noL
1e420 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
1e430 20 2f 2a 20 4f 6d 69 74 20 6c 6f 63 6b 69 6e 67   /* Omit locking
1e440 20 69 66 20 74 72 75 65 20 2a 2f 0a 20 20 69 6e   if true */.  in
1e450 74 20 69 73 44 65 6c 65 74 65 20 20 20 20 20 20  t isDelete      
1e460 20 20 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20        /* Delete 
1e470 6f 6e 20 63 6c 6f 73 65 20 69 66 20 74 72 75 65  on close if true
1e480 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 73   */.){.  const s
1e490 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
1e4a0 73 20 2a 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65  s *pLockingStyle
1e4b0 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e  ;.  unixFile *pN
1e4c0 65 77 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a  ew = (unixFile *
1e4d0 29 70 49 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d  )pId;.  int rc =
1e4e0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61   SQLITE_OK;..  a
1e4f0 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 70 4c 6f  ssert( pNew->pLo
1e500 63 6b 3d 3d 4e 55 4c 4c 20 29 3b 0a 20 20 61 73  ck==NULL );.  as
1e510 73 65 72 74 28 20 70 4e 65 77 2d 3e 70 4f 70 65  sert( pNew->pOpe
1e520 6e 3d 3d 4e 55 4c 4c 20 29 3b 0a 0a 20 20 2f 2a  n==NULL );..  /*
1e530 20 50 61 72 61 6d 65 74 65 72 20 69 73 44 65 6c   Parameter isDel
1e540 65 74 65 20 69 73 20 6f 6e 6c 79 20 75 73 65 64  ete is only used
1e550 20 6f 6e 20 76 78 77 6f 72 6b 73 2e 20 45 78 70   on vxworks. Exp
1e560 72 65 73 73 20 74 68 69 73 20 65 78 70 6c 69 63  ress this explic
1e570 69 74 6c 79 20 0a 20 20 2a 2a 20 68 65 72 65 20  itly .  ** here 
1e580 74 6f 20 70 72 65 76 65 6e 74 20 63 6f 6d 70 69  to prevent compi
1e590 6c 65 72 20 77 61 72 6e 69 6e 67 73 20 61 62 6f  ler warnings abo
1e5a0 75 74 20 75 6e 75 73 65 64 20 70 61 72 61 6d 65  ut unused parame
1e5b0 74 65 72 73 2e 0a 20 20 2a 2f 0a 20 20 55 4e 55  ters..  */.  UNU
1e5c0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 69 73  SED_PARAMETER(is
1e5d0 44 65 6c 65 74 65 29 3b 0a 0a 20 20 4f 53 54 52  Delete);..  OSTR
1e5e0 41 43 45 33 28 22 4f 50 45 4e 20 20 20 20 25 2d  ACE3("OPEN    %-
1e5f0 33 64 20 25 73 5c 6e 22 2c 20 68 2c 20 7a 46 69  3d %s\n", h, zFi
1e600 6c 65 6e 61 6d 65 29 3b 20 20 20 20 0a 20 20 70  lename);    .  p
1e610 4e 65 77 2d 3e 68 20 3d 20 68 3b 0a 20 20 70 4e  New->h = h;.  pN
1e620 65 77 2d 3e 64 69 72 66 64 20 3d 20 64 69 72 66  ew->dirfd = dirf
1e630 64 3b 0a 20 20 53 45 54 5f 54 48 52 45 41 44 49  d;.  SET_THREADI
1e640 44 28 70 4e 65 77 29 3b 0a 20 20 70 4e 65 77 2d  D(pNew);.  pNew-
1e650 3e 66 69 6c 65 46 6c 61 67 73 20 3d 20 30 3b 0a  >fileFlags = 0;.
1e660 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
1e670 20 20 70 4e 65 77 2d 3e 70 49 64 20 3d 20 76 78    pNew->pId = vx
1e680 77 6f 72 6b 73 46 69 6e 64 46 69 6c 65 49 64 28  worksFindFileId(
1e690 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66  zFilename);.  if
1e6a0 28 20 70 4e 65 77 2d 3e 70 49 64 3d 3d 30 20 29  ( pNew->pId==0 )
1e6b0 7b 0a 20 20 20 20 6e 6f 4c 6f 63 6b 20 3d 20 31  {.    noLock = 1
1e6c0 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
1e6d0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 23 65 6e  E_NOMEM;.  }.#en
1e6e0 64 69 66 0a 0a 20 20 69 66 28 20 6e 6f 4c 6f 63  dif..  if( noLoc
1e6f0 6b 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 69 6e  k ){.    pLockin
1e700 67 53 74 79 6c 65 20 3d 20 26 6e 6f 6c 6f 63 6b  gStyle = &nolock
1e710 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 65 6c  IoMethods;.  }el
1e720 73 65 7b 0a 20 20 20 20 70 4c 6f 63 6b 69 6e 67  se{.    pLocking
1e730 53 74 79 6c 65 20 3d 20 28 2a 2a 28 66 69 6e 64  Style = (**(find
1e740 65 72 5f 74 79 70 65 2a 29 70 56 66 73 2d 3e 70  er_type*)pVfs->p
1e750 41 70 70 44 61 74 61 29 28 7a 46 69 6c 65 6e 61  AppData)(zFilena
1e760 6d 65 2c 20 70 4e 65 77 29 3b 0a 23 69 66 20 53  me, pNew);.#if S
1e770 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
1e780 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20 2f  KING_STYLE.    /
1e790 2a 20 43 61 63 68 65 20 7a 46 69 6c 65 6e 61 6d  * Cache zFilenam
1e7a0 65 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67  e in the locking
1e7b0 20 63 6f 6e 74 65 78 74 20 28 41 46 50 20 61 6e   context (AFP an
1e7c0 64 20 64 6f 74 6c 6f 63 6b 20 6f 76 65 72 72 69  d dotlock overri
1e7d0 64 65 29 20 66 6f 72 0a 20 20 20 20 2a 2a 20 70  de) for.    ** p
1e7e0 72 6f 78 79 4c 6f 63 6b 20 61 63 74 69 76 61 74  roxyLock activat
1e7f0 69 6f 6e 20 69 73 20 70 6f 73 73 69 62 6c 65 20  ion is possible 
1e800 28 72 65 6d 6f 74 65 20 70 72 6f 78 79 20 69 73  (remote proxy is
1e810 20 62 61 73 65 64 20 6f 6e 20 64 62 20 6e 61 6d   based on db nam
1e820 65 29 0a 20 20 20 20 2a 2a 20 7a 46 69 6c 65 6e  e).    ** zFilen
1e830 61 6d 65 20 72 65 6d 61 69 6e 73 20 76 61 6c 69  ame remains vali
1e840 64 20 75 6e 74 69 6c 20 66 69 6c 65 20 69 73 20  d until file is 
1e850 63 6c 6f 73 65 64 2c 20 74 6f 20 73 75 70 70 6f  closed, to suppo
1e860 72 74 20 2a 2f 0a 20 20 20 20 70 4e 65 77 2d 3e  rt */.    pNew->
1e870 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d  lockingContext =
1e880 20 28 76 6f 69 64 2a 29 7a 46 69 6c 65 6e 61 6d   (void*)zFilenam
1e890 65 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20  e;.#endif.  }.. 
1e8a0 20 69 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79   if( pLockingSty
1e8b0 6c 65 20 3d 3d 20 26 70 6f 73 69 78 49 6f 4d 65  le == &posixIoMe
1e8c0 74 68 6f 64 73 0a 23 69 66 20 64 65 66 69 6e 65  thods.#if define
1e8d0 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20  d(__APPLE__) && 
1e8e0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
1e8f0 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20  CKING_STYLE.    
1e900 7c 7c 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65  || pLockingStyle
1e910 20 3d 3d 20 26 6e 66 73 49 6f 4d 65 74 68 6f 64   == &nfsIoMethod
1e920 73 0a 23 65 6e 64 69 66 0a 20 20 29 7b 0a 20 20  s.#endif.  ){.  
1e930 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
1e940 28 29 3b 0a 20 20 20 20 72 63 20 3d 20 66 69 6e  ();.    rc = fin
1e950 64 4c 6f 63 6b 49 6e 66 6f 28 70 4e 65 77 2c 20  dLockInfo(pNew, 
1e960 26 70 4e 65 77 2d 3e 70 4c 6f 63 6b 2c 20 26 70  &pNew->pLock, &p
1e970 4e 65 77 2d 3e 70 4f 70 65 6e 29 3b 0a 20 20 20  New->pOpen);.   
1e980 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1e990 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  OK ){.      /* I
1e9a0 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
1e9b0 65 64 20 69 6e 20 66 69 6e 64 4c 6f 63 6b 49 6e  ed in findLockIn
1e9c0 66 6f 28 29 2c 20 63 6c 6f 73 65 20 74 68 65 20  fo(), close the 
1e9d0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 0a  file descriptor.
1e9e0 20 20 20 20 20 20 2a 2a 20 69 6d 6d 65 64 69 61        ** immedia
1e9f0 74 65 6c 79 2c 20 62 65 66 6f 72 65 20 72 65 6c  tely, before rel
1ea00 65 61 73 69 6e 67 20 74 68 65 20 6d 75 74 65 78  easing the mutex
1ea10 2e 20 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28 29  . findLockInfo()
1ea20 20 6d 61 79 20 66 61 69 6c 0a 20 20 20 20 20 20   may fail.      
1ea30 2a 2a 20 69 6e 20 74 77 6f 20 73 63 65 6e 61 72  ** in two scenar
1ea40 69 6f 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ios:.      **.  
1ea50 20 20 20 20 2a 2a 20 20 20 28 61 29 20 41 20 63      **   (a) A c
1ea60 61 6c 6c 20 74 6f 20 66 73 74 61 74 28 29 20 66  all to fstat() f
1ea70 61 69 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2a 20  ailed..      ** 
1ea80 20 20 28 62 29 20 41 20 6d 61 6c 6c 6f 63 20 66    (b) A malloc f
1ea90 61 69 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a  ailed..      **.
1eaa0 20 20 20 20 20 20 2a 2a 20 53 63 65 6e 61 72 69        ** Scenari
1eab0 6f 20 28 62 29 20 6d 61 79 20 6f 6e 6c 79 20 6f  o (b) may only o
1eac0 63 63 75 72 20 69 66 20 74 68 65 20 70 72 6f 63  ccur if the proc
1ead0 65 73 73 20 69 73 20 68 6f 6c 64 69 6e 67 20 6e  ess is holding n
1eae0 6f 20 6f 74 68 65 72 0a 20 20 20 20 20 20 2a 2a  o other.      **
1eaf0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
1eb00 73 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73 61  s open on the sa
1eb10 6d 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72  me file. If ther
1eb20 65 20 77 65 72 65 20 6f 74 68 65 72 20 66 69 6c  e were other fil
1eb30 65 0a 20 20 20 20 20 20 2a 2a 20 64 65 73 63 72  e.      ** descr
1eb40 69 70 74 6f 72 73 20 6f 6e 20 74 68 69 73 20 66  iptors on this f
1eb50 69 6c 65 2c 20 74 68 65 6e 20 6e 6f 20 6d 61 6c  ile, then no mal
1eb60 6c 6f 63 20 77 6f 75 6c 64 20 62 65 20 72 65 71  loc would be req
1eb70 75 69 72 65 64 20 62 79 0a 20 20 20 20 20 20 2a  uired by.      *
1eb80 2a 20 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28 29  * findLockInfo()
1eb90 2e 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  . If this is the
1eba0 20 63 61 73 65 2c 20 69 74 20 69 73 20 71 75 69   case, it is qui
1ebb0 74 65 20 73 61 66 65 20 74 6f 20 63 6c 6f 73 65  te safe to close
1ebc0 0a 20 20 20 20 20 20 2a 2a 20 68 61 6e 64 6c 65  .      ** handle
1ebd0 20 68 20 2d 20 61 73 20 69 74 20 69 73 20 67 75   h - as it is gu
1ebe0 61 72 61 6e 74 65 65 64 20 74 68 61 74 20 6e 6f  aranteed that no
1ebf0 20 70 6f 73 69 78 20 6c 6f 63 6b 73 20 77 69 6c   posix locks wil
1ec00 6c 20 62 65 20 72 65 6c 65 61 73 65 64 0a 20 20  l be released.  
1ec10 20 20 20 20 2a 2a 20 62 79 20 64 6f 69 6e 67 20      ** by doing 
1ec20 73 6f 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  so..      **.   
1ec30 20 20 20 2a 2a 20 49 66 20 73 63 65 6e 61 72 69     ** If scenari
1ec40 6f 20 28 61 29 20 63 61 75 73 65 64 20 74 68 65  o (a) caused the
1ec50 20 65 72 72 6f 72 20 74 68 65 6e 20 74 68 69 6e   error then thin
1ec60 67 73 20 61 72 65 20 6e 6f 74 20 73 6f 20 73 61  gs are not so sa
1ec70 66 65 2e 20 54 68 65 0a 20 20 20 20 20 20 2a 2a  fe. The.      **
1ec80 20 69 6d 70 6c 69 63 69 74 20 61 73 73 75 6d 70   implicit assump
1ec90 74 69 6f 6e 20 68 65 72 65 20 69 73 20 74 68 61  tion here is tha
1eca0 74 20 69 66 20 66 73 74 61 74 28 29 20 66 61 69  t if fstat() fai
1ecb0 6c 73 2c 20 74 68 69 6e 67 73 20 61 72 65 20 69  ls, things are i
1ecc0 6e 0a 20 20 20 20 20 20 2a 2a 20 73 75 63 68 20  n.      ** such 
1ecd0 62 61 64 20 73 68 61 70 65 20 74 68 61 74 20 64  bad shape that d
1ece0 72 6f 70 70 69 6e 67 20 61 20 6c 6f 63 6b 20 6f  ropping a lock o
1ecf0 72 20 74 77 6f 20 64 6f 65 73 6e 27 74 20 6d 61  r two doesn't ma
1ed00 74 74 65 72 20 6d 75 63 68 2e 0a 20 20 20 20 20  tter much..     
1ed10 20 2a 2f 0a 20 20 20 20 20 20 63 6c 6f 73 65 28   */.      close(
1ed20 68 29 3b 0a 20 20 20 20 20 20 68 20 3d 20 2d 31  h);.      h = -1
1ed30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e 69 78  ;.    }.    unix
1ed40 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
1ed50 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e  }..#if SQLITE_EN
1ed60 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
1ed70 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f  LE && defined(__
1ed80 41 50 50 4c 45 5f 5f 29 0a 20 20 65 6c 73 65 20  APPLE__).  else 
1ed90 69 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c  if( pLockingStyl
1eda0 65 20 3d 3d 20 26 61 66 70 49 6f 4d 65 74 68 6f  e == &afpIoMetho
1edb0 64 73 20 29 7b 0a 20 20 20 20 2f 2a 20 41 46 50  ds ){.    /* AFP
1edc0 20 6c 6f 63 6b 69 6e 67 20 75 73 65 73 20 74 68   locking uses th
1edd0 65 20 66 69 6c 65 20 70 61 74 68 20 73 6f 20 69  e file path so i
1ede0 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 69 6e  t needs to be in
1edf0 63 6c 75 64 65 64 20 69 6e 0a 20 20 20 20 2a 2a  cluded in.    **
1ee00 20 74 68 65 20 61 66 70 4c 6f 63 6b 69 6e 67 43   the afpLockingC
1ee10 6f 6e 74 65 78 74 2e 0a 20 20 20 20 2a 2f 0a 20  ontext..    */. 
1ee20 20 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e     afpLockingCon
1ee30 74 65 78 74 20 2a 70 43 74 78 3b 0a 20 20 20 20  text *pCtx;.    
1ee40 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  pNew->lockingCon
1ee50 74 65 78 74 20 3d 20 70 43 74 78 20 3d 20 73 71  text = pCtx = sq
1ee60 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69  lite3_malloc( si
1ee70 7a 65 6f 66 28 2a 70 43 74 78 29 20 29 3b 0a 20  zeof(*pCtx) );. 
1ee80 20 20 20 69 66 28 20 70 43 74 78 3d 3d 30 20 29     if( pCtx==0 )
1ee90 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
1eea0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
1eeb0 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 4e  else{.      /* N
1eec0 42 3a 20 7a 46 69 6c 65 6e 61 6d 65 20 65 78 69  B: zFilename exi
1eed0 73 74 73 20 61 6e 64 20 72 65 6d 61 69 6e 73 20  sts and remains 
1eee0 76 61 6c 69 64 20 75 6e 74 69 6c 20 74 68 65 20  valid until the 
1eef0 66 69 6c 65 20 69 73 20 63 6c 6f 73 65 64 0a 20  file is closed. 
1ef00 20 20 20 20 20 2a 2a 20 61 63 63 6f 72 64 69 6e       ** accordin
1ef10 67 20 74 6f 20 72 65 71 75 69 72 65 6d 65 6e 74  g to requirement
1ef20 20 46 31 31 31 34 31 2e 20 20 53 6f 20 77 65 20   F11141.  So we 
1ef30 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 6d  do not need to m
1ef40 61 6b 65 20 61 0a 20 20 20 20 20 20 2a 2a 20 63  ake a.      ** c
1ef50 6f 70 79 20 6f 66 20 74 68 65 20 66 69 6c 65 6e  opy of the filen
1ef60 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 20 20 70 43  ame. */.      pC
1ef70 74 78 2d 3e 64 62 50 61 74 68 20 3d 20 7a 46 69  tx->dbPath = zFi
1ef80 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 20 20 70 43  lename;.      pC
1ef90 74 78 2d 3e 72 65 73 65 72 76 65 64 20 3d 20 30  tx->reserved = 0
1efa0 3b 0a 20 20 20 20 20 20 73 72 61 6e 64 6f 6d 64  ;.      srandomd
1efb0 65 76 28 29 3b 0a 20 20 20 20 20 20 75 6e 69 78  ev();.      unix
1efc0 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
1efd0 20 20 20 20 72 63 20 3d 20 66 69 6e 64 4c 6f 63      rc = findLoc
1efe0 6b 49 6e 66 6f 28 70 4e 65 77 2c 20 26 70 4e 65  kInfo(pNew, &pNe
1eff0 77 2d 3e 70 4c 6f 63 6b 2c 20 26 70 4e 65 77 2d  w->pLock, &pNew-
1f000 3e 70 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 69  >pOpen);.      i
1f010 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1f020 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
1f030 74 65 33 5f 66 72 65 65 28 70 4e 65 77 2d 3e 6c  te3_free(pNew->l
1f040 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3b 0a  ockingContext);.
1f050 20 20 20 20 20 20 20 20 63 6c 6f 73 65 28 68 29          close(h)
1f060 3b 0a 20 20 20 20 20 20 20 20 68 20 3d 20 2d 31  ;.        h = -1
1f070 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1f080 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
1f090 3b 20 20 20 20 20 20 20 20 0a 20 20 20 20 7d 0a  ;        .    }.
1f0a0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 65 6c    }.#endif..  el
1f0b0 73 65 20 69 66 28 20 70 4c 6f 63 6b 69 6e 67 53  se if( pLockingS
1f0c0 74 79 6c 65 20 3d 3d 20 26 64 6f 74 6c 6f 63 6b  tyle == &dotlock
1f0d0 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20  IoMethods ){.   
1f0e0 20 2f 2a 20 44 6f 74 66 69 6c 65 20 6c 6f 63 6b   /* Dotfile lock
1f0f0 69 6e 67 20 75 73 65 73 20 74 68 65 20 66 69 6c  ing uses the fil
1f100 65 20 70 61 74 68 20 73 6f 20 69 74 20 6e 65 65  e path so it nee
1f110 64 73 20 74 6f 20 62 65 20 69 6e 63 6c 75 64 65  ds to be include
1f120 64 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20  d in.    ** the 
1f130 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f  dotlockLockingCo
1f140 6e 74 65 78 74 20 0a 20 20 20 20 2a 2f 0a 20 20  ntext .    */.  
1f150 20 20 63 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c    char *zLockFil
1f160 65 3b 0a 20 20 20 20 69 6e 74 20 6e 46 69 6c 65  e;.    int nFile
1f170 6e 61 6d 65 3b 0a 20 20 20 20 6e 46 69 6c 65 6e  name;.    nFilen
1f180 61 6d 65 20 3d 20 28 69 6e 74 29 73 74 72 6c 65  ame = (int)strle
1f190 6e 28 7a 46 69 6c 65 6e 61 6d 65 29 20 2b 20 36  n(zFilename) + 6
1f1a0 3b 0a 20 20 20 20 7a 4c 6f 63 6b 46 69 6c 65 20  ;.    zLockFile 
1f1b0 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  = (char *)sqlite
1f1c0 33 5f 6d 61 6c 6c 6f 63 28 6e 46 69 6c 65 6e 61  3_malloc(nFilena
1f1d0 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 7a 4c 6f  me);.    if( zLo
1f1e0 63 6b 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20  ckFile==0 ){.   
1f1f0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
1f200 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  OMEM;.    }else{
1f210 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
1f220 6e 70 72 69 6e 74 66 28 6e 46 69 6c 65 6e 61 6d  nprintf(nFilenam
1f230 65 2c 20 7a 4c 6f 63 6b 46 69 6c 65 2c 20 22 25  e, zLockFile, "%
1f240 73 22 20 44 4f 54 4c 4f 43 4b 5f 53 55 46 46 49  s" DOTLOCK_SUFFI
1f250 58 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  X, zFilename);. 
1f260 20 20 20 7d 0a 20 20 20 20 70 4e 65 77 2d 3e 6c     }.    pNew->l
1f270 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20  ockingContext = 
1f280 7a 4c 6f 63 6b 46 69 6c 65 3b 0a 20 20 7d 0a 0a  zLockFile;.  }..
1f290 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20  #if OS_VXWORKS. 
1f2a0 20 65 6c 73 65 20 69 66 28 20 70 4c 6f 63 6b 69   else if( pLocki
1f2b0 6e 67 53 74 79 6c 65 20 3d 3d 20 26 73 65 6d 49  ngStyle == &semI
1f2c0 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20  oMethods ){.    
1f2d0 2f 2a 20 4e 61 6d 65 64 20 73 65 6d 61 70 68 6f  /* Named semapho
1f2e0 72 65 20 6c 6f 63 6b 69 6e 67 20 75 73 65 73 20  re locking uses 
1f2f0 74 68 65 20 66 69 6c 65 20 70 61 74 68 20 73 6f  the file path so
1f300 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 0a   it needs to be.
1f310 20 20 20 20 2a 2a 20 69 6e 63 6c 75 64 65 64 20      ** included 
1f320 69 6e 20 74 68 65 20 73 65 6d 4c 6f 63 6b 69 6e  in the semLockin
1f330 67 43 6f 6e 74 65 78 74 0a 20 20 20 20 2a 2f 0a  gContext.    */.
1f340 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74      unixEnterMut
1f350 65 78 28 29 3b 0a 20 20 20 20 72 63 20 3d 20 66  ex();.    rc = f
1f360 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28 70 4e 65 77  indLockInfo(pNew
1f370 2c 20 26 70 4e 65 77 2d 3e 70 4c 6f 63 6b 2c 20  , &pNew->pLock, 
1f380 26 70 4e 65 77 2d 3e 70 4f 70 65 6e 29 3b 0a 20  &pNew->pOpen);. 
1f390 20 20 20 69 66 28 20 28 72 63 3d 3d 53 51 4c 49     if( (rc==SQLI
1f3a0 54 45 5f 4f 4b 29 20 26 26 20 28 70 4e 65 77 2d  TE_OK) && (pNew-
1f3b0 3e 70 4f 70 65 6e 2d 3e 70 53 65 6d 3d 3d 4e 55  >pOpen->pSem==NU
1f3c0 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20 63 68 61  LL) ){.      cha
1f3d0 72 20 2a 7a 53 65 6d 4e 61 6d 65 20 3d 20 70 4e  r *zSemName = pN
1f3e0 65 77 2d 3e 70 4f 70 65 6e 2d 3e 61 53 65 6d 4e  ew->pOpen->aSemN
1f3f0 61 6d 65 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  ame;.      int n
1f400 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
1f410 73 6e 70 72 69 6e 74 66 28 4d 41 58 5f 50 41 54  snprintf(MAX_PAT
1f420 48 4e 41 4d 45 2c 20 7a 53 65 6d 4e 61 6d 65 2c  HNAME, zSemName,
1f430 20 22 2f 25 73 2e 73 65 6d 22 2c 0a 20 20 20 20   "/%s.sem",.    
1f440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f450 20 20 20 70 4e 65 77 2d 3e 70 49 64 2d 3e 7a 43     pNew->pId->zC
1f460 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 29 3b 0a 20  anonicalName);. 
1f470 20 20 20 20 20 66 6f 72 28 20 6e 3d 31 3b 20 7a       for( n=1; z
1f480 53 65 6d 4e 61 6d 65 5b 6e 5d 3b 20 6e 2b 2b 20  SemName[n]; n++ 
1f490 29 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 53  ).        if( zS
1f4a0 65 6d 4e 61 6d 65 5b 6e 5d 3d 3d 27 2f 27 20 29  emName[n]=='/' )
1f4b0 20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d 20 3d 20 27   zSemName[n] = '
1f4c0 5f 27 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  _';.      pNew->
1f4d0 70 4f 70 65 6e 2d 3e 70 53 65 6d 20 3d 20 73 65  pOpen->pSem = se
1f4e0 6d 5f 6f 70 65 6e 28 7a 53 65 6d 4e 61 6d 65 2c  m_open(zSemName,
1f4f0 20 4f 5f 43 52 45 41 54 2c 20 30 36 36 36 2c 20   O_CREAT, 0666, 
1f500 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e  1);.      if( pN
1f510 65 77 2d 3e 70 4f 70 65 6e 2d 3e 70 53 65 6d 20  ew->pOpen->pSem 
1f520 3d 3d 20 53 45 4d 5f 46 41 49 4c 45 44 20 29 7b  == SEM_FAILED ){
1f530 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
1f540 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
1f550 20 20 20 20 70 4e 65 77 2d 3e 70 4f 70 65 6e 2d      pNew->pOpen-
1f560 3e 61 53 65 6d 4e 61 6d 65 5b 30 5d 20 3d 20 27  >aSemName[0] = '
1f570 5c 30 27 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  \0';.      }.   
1f580 20 7d 0a 20 20 20 20 75 6e 69 78 4c 65 61 76 65   }.    unixLeave
1f590 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a 23 65 6e  Mutex();.  }.#en
1f5a0 64 69 66 0a 20 20 0a 20 20 70 4e 65 77 2d 3e 6c  dif.  .  pNew->l
1f5b0 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b 0a 23 69  astErrno = 0;.#i
1f5c0 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 69  f OS_VXWORKS.  i
1f5d0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1f5e0 20 29 7b 0a 20 20 20 20 75 6e 6c 69 6e 6b 28 7a   ){.    unlink(z
1f5f0 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 69  Filename);.    i
1f600 73 44 65 6c 65 74 65 20 3d 20 30 3b 0a 20 20 7d  sDelete = 0;.  }
1f610 0a 20 20 70 4e 65 77 2d 3e 69 73 44 65 6c 65 74  .  pNew->isDelet
1f620 65 20 3d 20 69 73 44 65 6c 65 74 65 3b 0a 23 65  e = isDelete;.#e
1f630 6e 64 69 66 0a 20 20 69 66 28 20 72 63 21 3d 53  ndif.  if( rc!=S
1f640 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1f650 69 66 28 20 64 69 72 66 64 3e 3d 30 20 29 20 63  if( dirfd>=0 ) c
1f660 6c 6f 73 65 28 64 69 72 66 64 29 3b 20 2f 2a 20  lose(dirfd); /* 
1f670 73 69 6c 65 6e 74 20 6c 65 61 6b 20 69 66 20 66  silent leak if f
1f680 61 69 6c 2c 20 61 6c 72 65 61 64 79 20 69 6e 20  ail, already in 
1f690 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 69 66 28  error */.    if(
1f6a0 20 68 3e 3d 30 20 29 20 63 6c 6f 73 65 28 68 29   h>=0 ) close(h)
1f6b0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
1f6c0 4e 65 77 2d 3e 70 4d 65 74 68 6f 64 20 3d 20 70  New->pMethod = p
1f6d0 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3b 0a 20 20  LockingStyle;.  
1f6e0 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2b 31    OpenCounter(+1
1f6f0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
1f700 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65  rc;.}../*.** Ope
1f710 6e 20 61 20 66 69 6c 65 20 64 65 73 63 72 69 70  n a file descrip
1f720 74 6f 72 20 74 6f 20 74 68 65 20 64 69 72 65 63  tor to the direc
1f730 74 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20  tory containing 
1f740 66 69 6c 65 20 7a 46 69 6c 65 6e 61 6d 65 2e 0a  file zFilename..
1f750 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
1f760 2c 20 2a 70 46 64 20 69 73 20 73 65 74 20 74 6f  , *pFd is set to
1f770 20 74 68 65 20 6f 70 65 6e 65 64 20 66 69 6c 65   the opened file
1f780 20 64 65 73 63 72 69 70 74 6f 72 20 61 6e 64 0a   descriptor and.
1f790 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
1f7a0 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20  returned. If an 
1f7b0 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 65 69  error occurs, ei
1f7c0 74 68 65 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  ther SQLITE_NOME
1f7d0 4d 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 43  M.** or SQLITE_C
1f7e0 41 4e 54 4f 50 45 4e 20 69 73 20 72 65 74 75 72  ANTOPEN is retur
1f7f0 6e 65 64 20 61 6e 64 20 2a 70 46 64 20 69 73 20  ned and *pFd is 
1f800 73 65 74 20 74 6f 20 61 6e 20 75 6e 64 65 66 69  set to an undefi
1f810 6e 65 64 0a 2a 2a 20 76 61 6c 75 65 2e 0a 2a 2a  ned.** value..**
1f820 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 4f 4b  .** If SQLITE_OK
1f830 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68   is returned, th
1f840 65 20 63 61 6c 6c 65 72 20 69 73 20 72 65 73 70  e caller is resp
1f850 6f 6e 73 69 62 6c 65 20 66 6f 72 20 63 6c 6f 73  onsible for clos
1f860 69 6e 67 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20  ing.** the file 
1f870 64 65 73 63 72 69 70 74 6f 72 20 2a 70 46 64 20  descriptor *pFd 
1f880 75 73 69 6e 67 20 63 6c 6f 73 65 28 29 2e 0a 2a  using close()..*
1f890 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 70 65  /.static int ope
1f8a0 6e 44 69 72 65 63 74 6f 72 79 28 63 6f 6e 73 74  nDirectory(const
1f8b0 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
1f8c0 2c 20 69 6e 74 20 2a 70 46 64 29 7b 0a 20 20 69  , int *pFd){.  i
1f8d0 6e 74 20 69 69 3b 0a 20 20 69 6e 74 20 66 64 20  nt ii;.  int fd 
1f8e0 3d 20 2d 31 3b 0a 20 20 63 68 61 72 20 7a 44 69  = -1;.  char zDi
1f8f0 72 6e 61 6d 65 5b 4d 41 58 5f 50 41 54 48 4e 41  rname[MAX_PATHNA
1f900 4d 45 2b 31 5d 3b 0a 0a 20 20 73 71 6c 69 74 65  ME+1];..  sqlite
1f910 33 5f 73 6e 70 72 69 6e 74 66 28 4d 41 58 5f 50  3_snprintf(MAX_P
1f920 41 54 48 4e 41 4d 45 2c 20 7a 44 69 72 6e 61 6d  ATHNAME, zDirnam
1f930 65 2c 20 22 25 73 22 2c 20 7a 46 69 6c 65 6e 61  e, "%s", zFilena
1f940 6d 65 29 3b 0a 20 20 66 6f 72 28 69 69 3d 28 69  me);.  for(ii=(i
1f950 6e 74 29 73 74 72 6c 65 6e 28 7a 44 69 72 6e 61  nt)strlen(zDirna
1f960 6d 65 29 3b 20 69 69 3e 31 20 26 26 20 7a 44 69  me); ii>1 && zDi
1f970 72 6e 61 6d 65 5b 69 69 5d 21 3d 27 2f 27 3b 20  rname[ii]!='/'; 
1f980 69 69 2d 2d 29 3b 0a 20 20 69 66 28 20 69 69 3e  ii--);.  if( ii>
1f990 30 20 29 7b 0a 20 20 20 20 7a 44 69 72 6e 61 6d  0 ){.    zDirnam
1f9a0 65 5b 69 69 5d 20 3d 20 27 5c 30 27 3b 0a 20 20  e[ii] = '\0';.  
1f9b0 20 20 66 64 20 3d 20 6f 70 65 6e 28 7a 44 69 72    fd = open(zDir
1f9c0 6e 61 6d 65 2c 20 4f 5f 52 44 4f 4e 4c 59 7c 4f  name, O_RDONLY|O
1f9d0 5f 42 49 4e 41 52 59 2c 20 30 29 3b 0a 20 20 20  _BINARY, 0);.   
1f9e0 20 69 66 28 20 66 64 3e 3d 30 20 29 7b 0a 23 69   if( fd>=0 ){.#i
1f9f0 66 64 65 66 20 46 44 5f 43 4c 4f 45 58 45 43 0a  fdef FD_CLOEXEC.
1fa00 20 20 20 20 20 20 66 63 6e 74 6c 28 66 64 2c 20        fcntl(fd, 
1fa10 46 5f 53 45 54 46 44 2c 20 66 63 6e 74 6c 28 66  F_SETFD, fcntl(f
1fa20 64 2c 20 46 5f 47 45 54 46 44 2c 20 30 29 20 7c  d, F_GETFD, 0) |
1fa30 20 46 44 5f 43 4c 4f 45 58 45 43 29 3b 0a 23 65   FD_CLOEXEC);.#e
1fa40 6e 64 69 66 0a 20 20 20 20 20 20 4f 53 54 52 41  ndif.      OSTRA
1fa50 43 45 33 28 22 4f 50 45 4e 44 49 52 20 25 2d 33  CE3("OPENDIR %-3
1fa60 64 20 25 73 5c 6e 22 2c 20 66 64 2c 20 7a 44 69  d %s\n", fd, zDi
1fa70 72 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  rname);.    }.  
1fa80 7d 0a 20 20 2a 70 46 64 20 3d 20 66 64 3b 0a 20  }.  *pFd = fd;. 
1fa90 20 72 65 74 75 72 6e 20 28 66 64 3e 3d 30 3f 53   return (fd>=0?S
1faa0 51 4c 49 54 45 5f 4f 4b 3a 53 51 4c 49 54 45 5f  QLITE_OK:SQLITE_
1fab0 43 41 4e 54 4f 50 45 4e 29 3b 0a 7d 0a 0a 2f 2a  CANTOPEN);.}../*
1fac0 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 74 65 6d  .** Create a tem
1fad0 70 6f 72 61 72 79 20 66 69 6c 65 20 6e 61 6d 65  porary file name
1fae0 20 69 6e 20 7a 42 75 66 2e 20 20 7a 42 75 66 20   in zBuf.  zBuf 
1faf0 6d 75 73 74 20 62 65 20 61 6c 6c 6f 63 61 74 65  must be allocate
1fb00 64 0a 2a 2a 20 62 79 20 74 68 65 20 63 61 6c 6c  d.** by the call
1fb10 69 6e 67 20 70 72 6f 63 65 73 73 20 61 6e 64 20  ing process and 
1fb20 6d 75 73 74 20 62 65 20 62 69 67 20 65 6e 6f 75  must be big enou
1fb30 67 68 20 74 6f 20 68 6f 6c 64 20 61 74 20 6c 65  gh to hold at le
1fb40 61 73 74 0a 2a 2a 20 70 56 66 73 2d 3e 6d 78 50  ast.** pVfs->mxP
1fb50 61 74 68 6e 61 6d 65 20 62 79 74 65 73 2e 0a 2a  athname bytes..*
1fb60 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74  /.static int get
1fb70 54 65 6d 70 6e 61 6d 65 28 69 6e 74 20 6e 42 75  Tempname(int nBu
1fb80 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a  f, char *zBuf){.
1fb90 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
1fba0 68 61 72 20 2a 61 7a 44 69 72 73 5b 5d 20 3d 20  har *azDirs[] = 
1fbb0 7b 0a 20 20 20 20 20 30 2c 0a 20 20 20 20 20 30  {.     0,.     0
1fbc0 2c 0a 20 20 20 20 20 22 2f 76 61 72 2f 74 6d 70  ,.     "/var/tmp
1fbd0 22 2c 0a 20 20 20 20 20 22 2f 75 73 72 2f 74 6d  ",.     "/usr/tm
1fbe0 70 22 2c 0a 20 20 20 20 20 22 2f 74 6d 70 22 2c  p",.     "/tmp",
1fbf0 0a 20 20 20 20 20 22 2e 22 2c 0a 20 20 7d 3b 0a  .     ".",.  };.
1fc00 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
1fc10 6e 73 69 67 6e 65 64 20 63 68 61 72 20 7a 43 68  nsigned char zCh
1fc20 61 72 73 5b 5d 20 3d 0a 20 20 20 20 22 61 62 63  ars[] =.    "abc
1fc30 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73  defghijklmnopqrs
1fc40 74 75 76 77 78 79 7a 22 0a 20 20 20 20 22 41 42  tuvwxyz".    "AB
1fc50 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52  CDEFGHIJKLMNOPQR
1fc60 53 54 55 56 57 58 59 5a 22 0a 20 20 20 20 22 30  STUVWXYZ".    "0
1fc70 31 32 33 34 35 36 37 38 39 22 3b 0a 20 20 75 6e  123456789";.  un
1fc80 73 69 67 6e 65 64 20 69 6e 74 20 69 2c 20 6a 3b  signed int i, j;
1fc90 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 20 62  .  struct stat b
1fca0 75 66 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  uf;.  const char
1fcb0 20 2a 7a 44 69 72 20 3d 20 22 2e 22 3b 0a 0a 20   *zDir = ".";.. 
1fcc0 20 2f 2a 20 49 74 27 73 20 6f 64 64 20 74 6f 20   /* It's odd to 
1fcd0 73 69 6d 75 6c 61 74 65 20 61 6e 20 69 6f 2d 65  simulate an io-e
1fce0 72 72 6f 72 20 68 65 72 65 2c 20 62 75 74 20 72  rror here, but r
1fcf0 65 61 6c 6c 79 20 74 68 69 73 20 69 73 20 6a 75  eally this is ju
1fd00 73 74 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74 68  st.  ** using th
1fd10 65 20 69 6f 2d 65 72 72 6f 72 20 69 6e 66 72 61  e io-error infra
1fd20 73 74 72 75 63 74 75 72 65 20 74 6f 20 74 65 73  structure to tes
1fd30 74 20 74 68 61 74 20 53 51 4c 69 74 65 20 68 61  t that SQLite ha
1fd40 6e 64 6c 65 73 20 74 68 69 73 0a 20 20 2a 2a 20  ndles this.  ** 
1fd50 66 75 6e 63 74 69 6f 6e 20 66 61 69 6c 69 6e 67  function failing
1fd60 2e 20 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61  . .  */.  Simula
1fd70 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72  teIOError( retur
1fd80 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29  n SQLITE_IOERR )
1fd90 3b 0a 0a 20 20 61 7a 44 69 72 73 5b 30 5d 20 3d  ;..  azDirs[0] =
1fda0 20 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69   sqlite3_temp_di
1fdb0 72 65 63 74 6f 72 79 3b 0a 20 20 69 66 20 28 4e  rectory;.  if (N
1fdc0 55 4c 4c 20 3d 3d 20 61 7a 44 69 72 73 5b 31 5d  ULL == azDirs[1]
1fdd0 29 20 7b 0a 20 20 20 20 61 7a 44 69 72 73 5b 31  ) {.    azDirs[1
1fde0 5d 20 3d 20 67 65 74 65 6e 76 28 22 54 4d 50 44  ] = getenv("TMPD
1fdf0 49 52 22 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 66  IR");.  }.  .  f
1fe00 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66  or(i=0; i<sizeof
1fe10 28 61 7a 44 69 72 73 29 2f 73 69 7a 65 6f 66 28  (azDirs)/sizeof(
1fe20 61 7a 44 69 72 73 5b 30 5d 29 3b 20 69 2b 2b 29  azDirs[0]); i++)
1fe30 7b 0a 20 20 20 20 69 66 28 20 61 7a 44 69 72 73  {.    if( azDirs
1fe40 5b 69 5d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  [i]==0 ) continu
1fe50 65 3b 0a 20 20 20 20 69 66 28 20 73 74 61 74 28  e;.    if( stat(
1fe60 61 7a 44 69 72 73 5b 69 5d 2c 20 26 62 75 66 29  azDirs[i], &buf)
1fe70 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1fe80 20 69 66 28 20 21 53 5f 49 53 44 49 52 28 62 75   if( !S_ISDIR(bu
1fe90 66 2e 73 74 5f 6d 6f 64 65 29 20 29 20 63 6f 6e  f.st_mode) ) con
1fea0 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 61  tinue;.    if( a
1feb0 63 63 65 73 73 28 61 7a 44 69 72 73 5b 69 5d 2c  ccess(azDirs[i],
1fec0 20 30 37 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b   07) ) continue;
1fed0 0a 20 20 20 20 7a 44 69 72 20 3d 20 61 7a 44 69  .    zDir = azDi
1fee0 72 73 5b 69 5d 3b 0a 20 20 20 20 62 72 65 61 6b  rs[i];.    break
1fef0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63  ;.  }..  /* Chec
1ff00 6b 20 74 68 61 74 20 74 68 65 20 6f 75 74 70 75  k that the outpu
1ff10 74 20 62 75 66 66 65 72 20 69 73 20 6c 61 72 67  t buffer is larg
1ff20 65 20 65 6e 6f 75 67 68 20 66 6f 72 20 74 68 65  e enough for the
1ff30 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
1ff40 0a 20 20 2a 2a 20 6e 61 6d 65 2e 20 49 66 20 69  .  ** name. If i
1ff50 74 20 69 73 20 6e 6f 74 2c 20 72 65 74 75 72 6e  t is not, return
1ff60 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 20   SQLITE_ERROR.. 
1ff70 20 2a 2f 0a 20 20 69 66 28 20 28 73 74 72 6c 65   */.  if( (strle
1ff80 6e 28 7a 44 69 72 29 20 2b 20 73 74 72 6c 65 6e  n(zDir) + strlen
1ff90 28 53 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c  (SQLITE_TEMP_FIL
1ffa0 45 5f 50 52 45 46 49 58 29 20 2b 20 31 37 29 20  E_PREFIX) + 17) 
1ffb0 3e 3d 20 28 73 69 7a 65 5f 74 29 6e 42 75 66 20  >= (size_t)nBuf 
1ffc0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
1ffd0 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
1ffe0 0a 20 20 64 6f 7b 0a 20 20 20 20 73 71 6c 69 74  .  do{.    sqlit
1fff0 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75 66  e3_snprintf(nBuf
20000 2d 31 37 2c 20 7a 42 75 66 2c 20 22 25 73 2f 22  -17, zBuf, "%s/"
20010 53 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45  SQLITE_TEMP_FILE
20020 5f 50 52 45 46 49 58 2c 20 7a 44 69 72 29 3b 0a  _PREFIX, zDir);.
20030 20 20 20 20 6a 20 3d 20 28 69 6e 74 29 73 74 72      j = (int)str
20040 6c 65 6e 28 7a 42 75 66 29 3b 0a 20 20 20 20 73  len(zBuf);.    s
20050 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73  qlite3_randomnes
20060 73 28 31 35 2c 20 26 7a 42 75 66 5b 6a 5d 29 3b  s(15, &zBuf[j]);
20070 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
20080 31 35 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20  15; i++, j++){. 
20090 20 20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 28       zBuf[j] = (
200a0 63 68 61 72 29 7a 43 68 61 72 73 5b 20 28 28 75  char)zChars[ ((u
200b0 6e 73 69 67 6e 65 64 20 63 68 61 72 29 7a 42 75  nsigned char)zBu
200c0 66 5b 6a 5d 29 25 28 73 69 7a 65 6f 66 28 7a 43  f[j])%(sizeof(zC
200d0 68 61 72 73 29 2d 31 29 20 5d 3b 0a 20 20 20 20  hars)-1) ];.    
200e0 7d 0a 20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20  }.    zBuf[j] = 
200f0 30 3b 0a 20 20 7d 77 68 69 6c 65 28 20 61 63 63  0;.  }while( acc
20100 65 73 73 28 7a 42 75 66 2c 30 29 3d 3d 30 20 29  ess(zBuf,0)==0 )
20110 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
20120 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c  E_OK;.}..#if SQL
20130 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
20140 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69  NG_STYLE && defi
20150 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 2f  ned(__APPLE__)./
20160 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65 20 74 6f 20  *.** Routine to 
20170 74 72 61 6e 73 66 6f 72 6d 20 61 20 75 6e 69 78  transform a unix
20180 46 69 6c 65 20 69 6e 74 6f 20 61 20 70 72 6f 78  File into a prox
20190 79 2d 6c 6f 63 6b 69 6e 67 20 75 6e 69 78 46 69  y-locking unixFi
201a0 6c 65 2e 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  le..** Implement
201b0 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 70 72 6f  ation in the pro
201c0 78 79 2d 6c 6f 63 6b 20 64 69 76 69 73 69 6f 6e  xy-lock division
201d0 2c 20 62 75 74 20 75 73 65 64 20 62 79 20 75 6e  , but used by un
201e0 69 78 4f 70 65 6e 28 29 0a 2a 2a 20 69 66 20 53  ixOpen().** if S
201f0 51 4c 49 54 45 5f 50 52 45 46 45 52 5f 50 52 4f  QLITE_PREFER_PRO
20200 58 59 5f 4c 4f 43 4b 49 4e 47 20 69 73 20 64 65  XY_LOCKING is de
20210 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  fined..*/.static
20220 20 69 6e 74 20 70 72 6f 78 79 54 72 61 6e 73 66   int proxyTransf
20230 6f 72 6d 55 6e 69 78 46 69 6c 65 28 75 6e 69 78  ormUnixFile(unix
20240 46 69 6c 65 2a 2c 20 63 6f 6e 73 74 20 63 68 61  File*, const cha
20250 72 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  r*);.#endif../*.
20260 2a 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61 6e  ** Search for an
20270 20 75 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73   unused file des
20280 63 72 69 70 74 6f 72 20 74 68 61 74 20 77 61 73  criptor that was
20290 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68 65 20 64   opened on the d
202a0 61 74 61 62 61 73 65 20 0a 2a 2a 20 66 69 6c 65  atabase .** file
202b0 20 28 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 20   (not a journal 
202c0 6f 72 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61  or master-journa
202d0 6c 20 66 69 6c 65 29 20 69 64 65 6e 74 69 66 69  l file) identifi
202e0 65 64 20 62 79 20 70 61 74 68 6e 61 6d 65 0a 2a  ed by pathname.*
202f0 2a 20 7a 50 61 74 68 20 77 69 74 68 20 53 51 4c  * zPath with SQL
20300 49 54 45 5f 4f 50 45 4e 5f 58 58 58 20 66 6c 61  ITE_OPEN_XXX fla
20310 67 73 20 6d 61 74 63 68 69 6e 67 20 74 68 6f 73  gs matching thos
20320 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  e passed as the 
20330 73 65 63 6f 6e 64 0a 2a 2a 20 61 72 67 75 6d 65  second.** argume
20340 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  nt to this funct
20350 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 53 75 63 68 20  ion..**.** Such 
20360 61 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  a file descripto
20370 72 20 6d 61 79 20 65 78 69 73 74 20 69 66 20 61  r may exist if a
20380 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
20390 74 69 6f 6e 20 77 61 73 20 63 6c 6f 73 65 64 0a  tion was closed.
203a0 2a 2a 20 62 75 74 20 74 68 65 20 61 73 73 6f 63  ** but the assoc
203b0 69 61 74 65 64 20 66 69 6c 65 20 64 65 73 63 72  iated file descr
203c0 69 70 74 6f 72 20 63 6f 75 6c 64 20 6e 6f 74 20  iptor could not 
203d0 62 65 20 63 6c 6f 73 65 64 20 62 65 63 61 75 73  be closed becaus
203e0 65 20 73 6f 6d 65 0a 2a 2a 20 6f 74 68 65 72 20  e some.** other 
203f0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
20400 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65  open on the same
20410 20 66 69 6c 65 20 69 73 20 68 6f 6c 64 69 6e 67   file is holding
20420 20 61 20 66 69 6c 65 2d 6c 6f 63 6b 2e 0a 2a 2a   a file-lock..**
20430 20 52 65 66 65 72 20 74 6f 20 63 6f 6d 6d 65 6e   Refer to commen
20440 74 73 20 69 6e 20 74 68 65 20 75 6e 69 78 43 6c  ts in the unixCl
20450 6f 73 65 28 29 20 66 75 6e 63 74 69 6f 6e 20 61  ose() function a
20460 6e 64 20 74 68 65 20 6c 65 6e 67 74 68 79 20 63  nd the lengthy c
20470 6f 6d 6d 65 6e 74 0a 2a 2a 20 64 65 73 63 72 69  omment.** descri
20480 62 69 6e 67 20 22 50 6f 73 69 78 20 41 64 76 69  bing "Posix Advi
20490 73 6f 72 79 20 4c 6f 63 6b 69 6e 67 22 20 61 74  sory Locking" at
204a0 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
204b0 69 73 20 66 69 6c 65 20 66 6f 72 20 0a 2a 2a 20  is file for .** 
204c0 66 75 72 74 68 65 72 20 64 65 74 61 69 6c 73 2e  further details.
204d0 20 41 6c 73 6f 2c 20 74 69 63 6b 65 74 20 23 34   Also, ticket #4
204e0 30 31 38 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  018..**.** If a 
204f0 73 75 69 74 61 62 6c 65 20 66 69 6c 65 20 64 65  suitable file de
20500 73 63 72 69 70 74 6f 72 20 69 73 20 66 6f 75 6e  scriptor is foun
20510 64 2c 20 74 68 65 6e 20 69 74 20 69 73 20 72 65  d, then it is re
20520 74 75 72 6e 65 64 2e 20 49 66 20 6e 6f 0a 2a 2a  turned. If no.**
20530 20 73 75 63 68 20 66 69 6c 65 20 64 65 73 63 72   such file descr
20540 69 70 74 6f 72 20 69 73 20 6c 6f 63 61 74 65 64  iptor is located
20550 2c 20 2d 31 20 69 73 20 72 65 74 75 72 6e 65 64  , -1 is returned
20560 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 55 6e 69 78  ..*/.static Unix
20570 55 6e 75 73 65 64 46 64 20 2a 66 69 6e 64 52 65  UnusedFd *findRe
20580 75 73 61 62 6c 65 46 64 28 63 6f 6e 73 74 20 63  usableFd(const c
20590 68 61 72 20 2a 7a 50 61 74 68 2c 20 69 6e 74 20  har *zPath, int 
205a0 66 6c 61 67 73 29 7b 0a 20 20 55 6e 69 78 55 6e  flags){.  UnixUn
205b0 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64 20  usedFd *pUnused 
205c0 3d 20 30 3b 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f  = 0;..  /* Do no
205d0 74 20 73 65 61 72 63 68 20 66 6f 72 20 61 6e 20  t search for an 
205e0 75 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73 63  unused file desc
205f0 72 69 70 74 6f 72 20 6f 6e 20 76 78 77 6f 72 6b  riptor on vxwork
20600 73 2e 20 4e 6f 74 20 62 65 63 61 75 73 65 0a 20  s. Not because. 
20610 20 2a 2a 20 76 78 77 6f 72 6b 73 20 77 6f 75 6c   ** vxworks woul
20620 64 20 6e 6f 74 20 62 65 6e 65 66 69 74 20 66 72  d not benefit fr
20630 6f 6d 20 74 68 65 20 63 68 61 6e 67 65 20 28 69  om the change (i
20640 74 20 6d 69 67 68 74 2c 20 77 65 27 72 65 20 6e  t might, we're n
20650 6f 74 20 73 75 72 65 29 2c 0a 20 20 2a 2a 20 62  ot sure),.  ** b
20660 75 74 20 62 65 63 61 75 73 65 20 6e 6f 20 77 61  ut because no wa
20670 79 20 74 6f 20 74 65 73 74 20 69 74 20 69 73 20  y to test it is 
20680 63 75 72 72 65 6e 74 6c 79 20 61 76 61 69 6c 61  currently availa
20690 62 6c 65 2e 20 49 74 20 69 73 20 62 65 74 74 65  ble. It is bette
206a0 72 20 0a 20 20 2a 2a 20 6e 6f 74 20 74 6f 20 72  r .  ** not to r
206b0 69 73 6b 20 62 72 65 61 6b 69 6e 67 20 76 78 77  isk breaking vxw
206c0 6f 72 6b 73 20 73 75 70 70 6f 72 74 20 66 6f 72  orks support for
206d0 20 74 68 65 20 73 61 6b 65 20 6f 66 20 73 75 63   the sake of suc
206e0 68 20 61 6e 20 6f 62 73 63 75 72 65 20 0a 20 20  h an obscure .  
206f0 2a 2a 20 66 65 61 74 75 72 65 2e 20 20 2a 2f 0a  ** feature.  */.
20700 23 69 66 20 21 4f 53 5f 56 58 57 4f 52 4b 53 0a  #if !OS_VXWORKS.
20710 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73 53    struct stat sS
20720 74 61 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  tat;            
20730 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
20740 73 20 6f 66 20 73 74 61 74 28 29 20 63 61 6c 6c  s of stat() call
20750 20 2a 2f 0a 0a 20 20 2f 2a 20 41 20 73 74 61 74   */..  /* A stat
20760 28 29 20 63 61 6c 6c 20 6d 61 79 20 66 61 69 6c  () call may fail
20770 20 66 6f 72 20 76 61 72 69 6f 75 73 20 72 65 61   for various rea
20780 73 6f 6e 73 2e 20 49 66 20 74 68 69 73 20 68 61  sons. If this ha
20790 70 70 65 6e 73 2c 20 69 74 20 69 73 0a 20 20 2a  ppens, it is.  *
207a0 2a 20 61 6c 6d 6f 73 74 20 63 65 72 74 61 69 6e  * almost certain
207b0 20 74 68 61 74 20 61 6e 20 6f 70 65 6e 28 29 20   that an open() 
207c0 63 61 6c 6c 20 6f 6e 20 74 68 65 20 73 61 6d 65  call on the same
207d0 20 70 61 74 68 20 77 69 6c 6c 20 61 6c 73 6f 20   path will also 
207e0 66 61 69 6c 2e 0a 20 20 2a 2a 20 46 6f 72 20 74  fail..  ** For t
207f0 68 69 73 20 72 65 61 73 6f 6e 2c 20 69 66 20 61  his reason, if a
20800 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 69  n error occurs i
20810 6e 20 74 68 65 20 73 74 61 74 28 29 20 63 61 6c  n the stat() cal
20820 6c 20 68 65 72 65 2c 20 69 74 20 69 73 0a 20 20  l here, it is.  
20830 2a 2a 20 69 67 6e 6f 72 65 64 20 61 6e 64 20 2d  ** ignored and -
20840 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 54  1 is returned. T
20850 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 74  he caller will t
20860 72 79 20 74 6f 20 6f 70 65 6e 20 61 20 6e 65 77  ry to open a new
20870 20 66 69 6c 65 0a 20 20 2a 2a 20 64 65 73 63 72   file.  ** descr
20880 69 70 74 6f 72 20 6f 6e 20 74 68 65 20 73 61 6d  iptor on the sam
20890 65 20 70 61 74 68 2c 20 66 61 69 6c 2c 20 61 6e  e path, fail, an
208a0 64 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  d return an erro
208b0 72 20 74 6f 20 53 51 4c 69 74 65 2e 0a 20 20 2a  r to SQLite..  *
208c0 2a 0a 20 20 2a 2a 20 45 76 65 6e 20 69 66 20 61  *.  ** Even if a
208d0 20 73 75 62 73 65 71 75 65 6e 74 20 6f 70 65 6e   subsequent open
208e0 28 29 20 63 61 6c 6c 20 64 6f 65 73 20 73 75 63  () call does suc
208f0 63 65 65 64 2c 20 74 68 65 20 63 6f 6e 73 65 71  ceed, the conseq
20900 75 65 6e 63 65 73 20 6f 66 0a 20 20 2a 2a 20 6e  uences of.  ** n
20910 6f 74 20 73 65 61 72 63 68 69 6e 67 20 66 6f 72  ot searching for
20920 20 61 20 72 65 73 75 73 61 62 6c 65 20 66 69 6c   a resusable fil
20930 65 20 64 65 73 63 72 69 70 74 6f 72 20 61 72 65  e descriptor are
20940 20 6e 6f 74 20 64 69 72 65 2e 20 20 2a 2f 0a 20   not dire.  */. 
20950 20 69 66 28 20 30 3d 3d 73 74 61 74 28 7a 50 61   if( 0==stat(zPa
20960 74 68 2c 20 26 73 53 74 61 74 29 20 29 7b 0a 20  th, &sStat) ){. 
20970 20 20 20 73 74 72 75 63 74 20 75 6e 69 78 4f 70     struct unixOp
20980 65 6e 43 6e 74 20 2a 70 4f 70 65 6e 3b 0a 0a 20  enCnt *pOpen;.. 
20990 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65     unixEnterMute
209a0 78 28 29 3b 0a 20 20 20 20 70 4f 70 65 6e 20 3d  x();.    pOpen =
209b0 20 6f 70 65 6e 4c 69 73 74 3b 0a 20 20 20 20 77   openList;.    w
209c0 68 69 6c 65 28 20 70 4f 70 65 6e 20 26 26 20 28  hile( pOpen && (
209d0 70 4f 70 65 6e 2d 3e 66 69 6c 65 49 64 2e 64 65  pOpen->fileId.de
209e0 76 21 3d 73 53 74 61 74 2e 73 74 5f 64 65 76 0a  v!=sStat.st_dev.
209f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20a00 20 20 20 20 20 7c 7c 20 70 4f 70 65 6e 2d 3e 66       || pOpen->f
20a10 69 6c 65 49 64 2e 69 6e 6f 21 3d 73 53 74 61 74  ileId.ino!=sStat
20a20 2e 73 74 5f 69 6e 6f 29 20 29 7b 0a 20 20 20 20  .st_ino) ){.    
20a30 20 20 20 70 4f 70 65 6e 20 3d 20 70 4f 70 65 6e     pOpen = pOpen
20a40 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20  ->pNext;.    }. 
20a50 20 20 20 69 66 28 20 70 4f 70 65 6e 20 29 7b 0a     if( pOpen ){.
20a60 20 20 20 20 20 20 55 6e 69 78 55 6e 75 73 65 64        UnixUnused
20a70 46 64 20 2a 2a 70 70 3b 0a 20 20 20 20 20 20 66  Fd **pp;.      f
20a80 6f 72 28 70 70 3d 26 70 4f 70 65 6e 2d 3e 70 55  or(pp=&pOpen->pU
20a90 6e 75 73 65 64 3b 20 2a 70 70 20 26 26 20 28 2a  nused; *pp && (*
20aa0 70 70 29 2d 3e 66 6c 61 67 73 21 3d 66 6c 61 67  pp)->flags!=flag
20ab0 73 3b 20 70 70 3d 26 28 28 2a 70 70 29 2d 3e 70  s; pp=&((*pp)->p
20ac0 4e 65 78 74 29 29 3b 0a 20 20 20 20 20 20 70 55  Next));.      pU
20ad0 6e 75 73 65 64 20 3d 20 2a 70 70 3b 0a 20 20 20  nused = *pp;.   
20ae0 20 20 20 69 66 28 20 70 55 6e 75 73 65 64 20 29     if( pUnused )
20af0 7b 0a 20 20 20 20 20 20 20 20 2a 70 70 20 3d 20  {.        *pp = 
20b00 70 55 6e 75 73 65 64 2d 3e 70 4e 65 78 74 3b 0a  pUnused->pNext;.
20b10 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
20b20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
20b30 28 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 20  ();.  }.#endif  
20b40 20 20 2f 2a 20 69 66 20 21 4f 53 5f 56 58 57 4f    /* if !OS_VXWO
20b50 52 4b 53 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  RKS */.  return 
20b60 70 55 6e 75 73 65 64 3b 0a 7d 0a 0a 2f 2a 0a 2a  pUnused;.}../*.*
20b70 2a 20 4f 70 65 6e 20 74 68 65 20 66 69 6c 65 20  * Open the file 
20b80 7a 50 61 74 68 2e 0a 2a 2a 20 0a 2a 2a 20 50 72  zPath..** .** Pr
20b90 65 76 69 6f 75 73 6c 79 2c 20 74 68 65 20 53 51  eviously, the SQ
20ba0 4c 69 74 65 20 4f 53 20 6c 61 79 65 72 20 75 73  Lite OS layer us
20bb0 65 64 20 74 68 72 65 65 20 66 75 6e 63 74 69 6f  ed three functio
20bc0 6e 73 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 74  ns in place of t
20bd0 68 69 73 0a 2a 2a 20 6f 6e 65 3a 0a 2a 2a 0a 2a  his.** one:.**.*
20be0 2a 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 4f  *     sqlite3OsO
20bf0 70 65 6e 52 65 61 64 57 72 69 74 65 28 29 3b 0a  penReadWrite();.
20c00 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  **     sqlite3Os
20c10 4f 70 65 6e 52 65 61 64 4f 6e 6c 79 28 29 3b 0a  OpenReadOnly();.
20c20 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  **     sqlite3Os
20c30 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28 29 3b  OpenExclusive();
20c40 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 63 61 6c  .**.** These cal
20c50 6c 73 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f  ls correspond to
20c60 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   the following c
20c70 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6f 66 20 66  ombinations of f
20c80 6c 61 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  lags:.**.**     
20c90 52 65 61 64 57 72 69 74 65 28 29 20 2d 3e 20 20  ReadWrite() ->  
20ca0 20 20 20 28 52 45 41 44 57 52 49 54 45 20 7c 20     (READWRITE | 
20cb0 43 52 45 41 54 45 29 0a 2a 2a 20 20 20 20 20 52  CREATE).**     R
20cc0 65 61 64 4f 6e 6c 79 28 29 20 20 2d 3e 20 20 20  eadOnly()  ->   
20cd0 20 20 28 52 45 41 44 4f 4e 4c 59 29 20 0a 2a 2a    (READONLY) .**
20ce0 20 20 20 20 20 4f 70 65 6e 45 78 63 6c 75 73 69       OpenExclusi
20cf0 76 65 28 29 20 2d 3e 20 28 52 45 41 44 57 52 49  ve() -> (READWRI
20d00 54 45 20 7c 20 43 52 45 41 54 45 20 7c 20 45 58  TE | CREATE | EX
20d10 43 4c 55 53 49 56 45 29 0a 2a 2a 0a 2a 2a 20 54  CLUSIVE).**.** T
20d20 68 65 20 6f 6c 64 20 4f 70 65 6e 45 78 63 6c 75  he old OpenExclu
20d30 73 69 76 65 28 29 20 61 63 63 65 70 74 65 64 20  sive() accepted 
20d40 61 20 62 6f 6f 6c 65 61 6e 20 61 72 67 75 6d 65  a boolean argume
20d50 6e 74 20 2d 20 22 64 65 6c 46 6c 61 67 22 2e 20  nt - "delFlag". 
20d60 49 66 0a 2a 2a 20 74 72 75 65 2c 20 74 68 65 20  If.** true, the 
20d70 66 69 6c 65 20 77 61 73 20 63 6f 6e 66 69 67 75  file was configu
20d80 72 65 64 20 74 6f 20 62 65 20 61 75 74 6f 6d 61  red to be automa
20d90 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 20  tically deleted 
20da0 77 68 65 6e 20 74 68 65 0a 2a 2a 20 66 69 6c 65  when the.** file
20db0 20 68 61 6e 64 6c 65 20 63 6c 6f 73 65 64 2e 20   handle closed. 
20dc0 54 6f 20 61 63 68 69 65 76 65 20 74 68 65 20 73  To achieve the s
20dd0 61 6d 65 20 65 66 66 65 63 74 20 75 73 69 6e 67  ame effect using
20de0 20 74 68 69 73 20 6e 65 77 20 0a 2a 2a 20 69 6e   this new .** in
20df0 74 65 72 66 61 63 65 2c 20 61 64 64 20 74 68 65  terface, add the
20e00 20 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 66   DELETEONCLOSE f
20e10 6c 61 67 20 74 6f 20 74 68 6f 73 65 20 73 70 65  lag to those spe
20e20 63 69 66 69 65 64 20 61 62 6f 76 65 20 66 6f 72  cified above for
20e30 20 0a 2a 2a 20 4f 70 65 6e 45 78 63 6c 75 73 69   .** OpenExclusi
20e40 76 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ve()..*/.static 
20e50 69 6e 74 20 75 6e 69 78 4f 70 65 6e 28 0a 20 20  int unixOpen(.  
20e60 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
20e70 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  s,           /* 
20e80 54 68 65 20 56 46 53 20 66 6f 72 20 77 68 69 63  The VFS for whic
20e90 68 20 74 68 69 73 20 69 73 20 74 68 65 20 78 4f  h this is the xO
20ea0 70 65 6e 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  pen method */.  
20eb0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74  const char *zPat
20ec0 68 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  h,           /* 
20ed0 50 61 74 68 6e 61 6d 65 20 6f 66 20 66 69 6c 65  Pathname of file
20ee0 20 74 6f 20 62 65 20 6f 70 65 6e 65 64 20 2a 2f   to be opened */
20ef0 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
20f00 2a 70 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20  *pFile,         
20f10 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65 73 63  /* The file desc
20f20 72 69 70 74 6f 72 20 74 6f 20 62 65 20 66 69 6c  riptor to be fil
20f30 6c 65 64 20 69 6e 20 2a 2f 0a 20 20 69 6e 74 20  led in */.  int 
20f40 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  flags,          
20f50 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 70 75           /* Inpu
20f60 74 20 66 6c 61 67 73 20 74 6f 20 63 6f 6e 74 72  t flags to contr
20f70 6f 6c 20 74 68 65 20 6f 70 65 6e 69 6e 67 20 2a  ol the opening *
20f80 2f 0a 20 20 69 6e 74 20 2a 70 4f 75 74 46 6c 61  /.  int *pOutFla
20f90 67 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20  gs              
20fa0 20 2f 2a 20 4f 75 74 70 75 74 20 66 6c 61 67 73   /* Output flags
20fb0 20 72 65 74 75 72 6e 65 64 20 74 6f 20 53 51 4c   returned to SQL
20fc0 69 74 65 20 63 6f 72 65 20 2a 2f 0a 29 7b 0a 20  ite core */.){. 
20fd0 20 75 6e 69 78 46 69 6c 65 20 2a 70 20 3d 20 28   unixFile *p = (
20fe0 75 6e 69 78 46 69 6c 65 20 2a 29 70 46 69 6c 65  unixFile *)pFile
20ff0 3b 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d 31 3b  ;.  int fd = -1;
21000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21010 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72     /* File descr
21020 69 70 74 6f 72 20 72 65 74 75 72 6e 65 64 20 62  iptor returned b
21030 79 20 6f 70 65 6e 28 29 20 2a 2f 0a 20 20 69 6e  y open() */.  in
21040 74 20 64 69 72 66 64 20 3d 20 2d 31 3b 20 20 20  t dirfd = -1;   
21050 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21060 44 69 72 65 63 74 6f 72 79 20 66 69 6c 65 20 64  Directory file d
21070 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 69  escriptor */.  i
21080 6e 74 20 6f 70 65 6e 46 6c 61 67 73 20 3d 20 30  nt openFlags = 0
21090 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
210a0 20 46 6c 61 67 73 20 74 6f 20 70 61 73 73 20 74   Flags to pass t
210b0 6f 20 6f 70 65 6e 28 29 20 2a 2f 0a 20 20 69 6e  o open() */.  in
210c0 74 20 65 54 79 70 65 20 3d 20 66 6c 61 67 73 26  t eType = flags&
210d0 30 78 46 46 46 46 46 46 30 30 3b 20 20 2f 2a 20  0xFFFFFF00;  /* 
210e0 54 79 70 65 20 6f 66 20 66 69 6c 65 20 74 6f 20  Type of file to 
210f0 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f  open */.  int no
21100 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20  Lock;           
21110 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
21120 20 74 6f 20 6f 6d 69 74 20 6c 6f 63 6b 69 6e 67   to omit locking
21130 20 70 72 69 6d 69 74 69 76 65 73 20 2a 2f 0a 20   primitives */. 
21140 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
21150 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
21160 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 52 65 74 75  /* Function Retu
21170 72 6e 20 43 6f 64 65 20 2a 2f 0a 0a 20 20 69 6e  rn Code */..  in
21180 74 20 69 73 45 78 63 6c 75 73 69 76 65 20 20 3d  t isExclusive  =
21190 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
211a0 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 29  _OPEN_EXCLUSIVE)
211b0 3b 0a 20 20 69 6e 74 20 69 73 44 65 6c 65 74 65  ;.  int isDelete
211c0 20 20 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20       = (flags & 
211d0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45  SQLITE_OPEN_DELE
211e0 54 45 4f 4e 43 4c 4f 53 45 29 3b 0a 20 20 69 6e  TEONCLOSE);.  in
211f0 74 20 69 73 43 72 65 61 74 65 20 20 20 20 20 3d  t isCreate     =
21200 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
21210 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a 20  _OPEN_CREATE);. 
21220 20 69 6e 74 20 69 73 52 65 61 64 6f 6e 6c 79 20   int isReadonly 
21230 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c    = (flags & SQL
21240 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
21250 59 29 3b 0a 20 20 69 6e 74 20 69 73 52 65 61 64  Y);.  int isRead
21260 57 72 69 74 65 20 20 3d 20 28 66 6c 61 67 73 20  Write  = (flags 
21270 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  & SQLITE_OPEN_RE
21280 41 44 57 52 49 54 45 29 3b 0a 20 20 69 6e 74 20  ADWRITE);.  int 
21290 69 73 41 75 74 6f 50 72 6f 78 79 20 20 3d 20 28  isAutoProxy  = (
212a0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
212b0 50 45 4e 5f 41 55 54 4f 50 52 4f 58 59 29 3b 0a  PEN_AUTOPROXY);.
212c0 0a 20 20 2f 2a 20 49 66 20 63 72 65 61 74 69 6e  .  /* If creatin
212d0 67 20 61 20 6d 61 73 74 65 72 20 6f 72 20 6d 61  g a master or ma
212e0 69 6e 2d 66 69 6c 65 20 6a 6f 75 72 6e 61 6c 2c  in-file journal,
212f0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   this function w
21300 69 6c 6c 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20  ill open.  ** a 
21310 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 20  file-descriptor 
21320 6f 6e 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  on the directory
21330 20 74 6f 6f 2e 20 54 68 65 20 66 69 72 73 74 20   too. The first 
21340 74 69 6d 65 20 75 6e 69 78 53 79 6e 63 28 29 0a  time unixSync().
21350 20 20 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 74    ** is called t
21360 68 65 20 64 69 72 65 63 74 6f 72 79 20 66 69 6c  he directory fil
21370 65 20 64 65 73 63 72 69 70 74 6f 72 20 77 69 6c  e descriptor wil
21380 6c 20 62 65 20 66 73 79 6e 63 28 29 65 64 20 61  l be fsync()ed a
21390 6e 64 20 63 6c 6f 73 65 28 29 64 2e 0a 20 20 2a  nd close()d..  *
213a0 2f 0a 20 20 69 6e 74 20 69 73 4f 70 65 6e 44 69  /.  int isOpenDi
213b0 72 65 63 74 6f 72 79 20 3d 20 28 69 73 43 72 65  rectory = (isCre
213c0 61 74 65 20 26 26 20 0a 20 20 20 20 20 20 28 65  ate && .      (e
213d0 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
213e0 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c  N_MASTER_JOURNAL
213f0 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
21400 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
21410 4e 41 4c 29 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20  NAL).  );..  /* 
21420 49 66 20 61 72 67 75 6d 65 6e 74 20 7a 50 61 74  If argument zPat
21430 68 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e  h is a NULL poin
21440 74 65 72 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ter, this functi
21450 6f 6e 20 69 73 20 72 65 71 75 69 72 65 64 20 74  on is required t
21460 6f 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 74 65  o open.  ** a te
21470 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 55 73  mporary file. Us
21480 65 20 74 68 69 73 20 62 75 66 66 65 72 20 74 6f  e this buffer to
21490 20 73 74 6f 72 65 20 74 68 65 20 66 69 6c 65 20   store the file 
214a0 6e 61 6d 65 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20  name in..  */.  
214b0 63 68 61 72 20 7a 54 6d 70 6e 61 6d 65 5b 4d 41  char zTmpname[MA
214c0 58 5f 50 41 54 48 4e 41 4d 45 2b 31 5d 3b 0a 20  X_PATHNAME+1];. 
214d0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
214e0 6d 65 20 3d 20 7a 50 61 74 68 3b 0a 0a 20 20 2f  me = zPath;..  /
214f0 2a 20 43 68 65 63 6b 20 74 68 65 20 66 6f 6c 6c  * Check the foll
21500 6f 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73  owing statements
21510 20 61 72 65 20 74 72 75 65 3a 20 0a 20 20 2a 2a   are true: .  **
21520 0a 20 20 2a 2a 20 20 20 28 61 29 20 45 78 61 63  .  **   (a) Exac
21530 74 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 52  tly one of the R
21540 45 41 44 57 52 49 54 45 20 61 6e 64 20 52 45 41  EADWRITE and REA
21550 44 4f 4e 4c 59 20 66 6c 61 67 73 20 6d 75 73 74  DONLY flags must
21560 20 62 65 20 73 65 74 2c 20 61 6e 64 20 0a 20 20   be set, and .  
21570 2a 2a 20 20 20 28 62 29 20 69 66 20 43 52 45 41  **   (b) if CREA
21580 54 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20  TE is set, then 
21590 52 45 41 44 57 52 49 54 45 20 6d 75 73 74 20 61  READWRITE must a
215a0 6c 73 6f 20 62 65 20 73 65 74 2c 20 61 6e 64 0a  lso be set, and.
215b0 20 20 2a 2a 20 20 20 28 63 29 20 69 66 20 45 58    **   (c) if EX
215c0 43 4c 55 53 49 56 45 20 69 73 20 73 65 74 2c 20  CLUSIVE is set, 
215d0 74 68 65 6e 20 43 52 45 41 54 45 20 6d 75 73 74  then CREATE must
215e0 20 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20 20   also be set..  
215f0 2a 2a 20 20 20 28 64 29 20 69 66 20 44 45 4c 45  **   (d) if DELE
21600 54 45 4f 4e 43 4c 4f 53 45 20 69 73 20 73 65 74  TEONCLOSE is set
21610 2c 20 74 68 65 6e 20 43 52 45 41 54 45 20 6d 75  , then CREATE mu
21620 73 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a  st also be set..
21630 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 28 69    */.  assert((i
21640 73 52 65 61 64 6f 6e 6c 79 3d 3d 30 20 7c 7c 20  sReadonly==0 || 
21650 69 73 52 65 61 64 57 72 69 74 65 3d 3d 30 29 20  isReadWrite==0) 
21660 26 26 20 28 69 73 52 65 61 64 57 72 69 74 65 20  && (isReadWrite 
21670 7c 7c 20 69 73 52 65 61 64 6f 6e 6c 79 29 29 3b  || isReadonly));
21680 0a 20 20 61 73 73 65 72 74 28 69 73 43 72 65 61  .  assert(isCrea
21690 74 65 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64 57  te==0 || isReadW
216a0 72 69 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28  rite);.  assert(
216b0 69 73 45 78 63 6c 75 73 69 76 65 3d 3d 30 20 7c  isExclusive==0 |
216c0 7c 20 69 73 43 72 65 61 74 65 29 3b 0a 20 20 61  | isCreate);.  a
216d0 73 73 65 72 74 28 69 73 44 65 6c 65 74 65 3d 3d  ssert(isDelete==
216e0 30 20 7c 7c 20 69 73 43 72 65 61 74 65 29 3b 0a  0 || isCreate);.
216f0 0a 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 44  .  /* The main D
21700 42 2c 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c  B, main journal,
21710 20 61 6e 64 20 6d 61 73 74 65 72 20 6a 6f 75 72   and master jour
21720 6e 61 6c 20 61 72 65 20 6e 65 76 65 72 20 61 75  nal are never au
21730 74 6f 6d 61 74 69 63 61 6c 6c 79 0a 20 20 2a 2a  tomatically.  **
21740 20 64 65 6c 65 74 65 64 2e 20 4e 6f 72 20 61 72   deleted. Nor ar
21750 65 20 74 68 65 79 20 65 76 65 72 20 74 65 6d 70  e they ever temp
21760 6f 72 61 72 79 20 66 69 6c 65 73 2e 20 20 2a 2f  orary files.  */
21770 0a 20 20 61 73 73 65 72 74 28 20 28 21 69 73 44  .  assert( (!isD
21780 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20  elete && zName) 
21790 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45  || eType!=SQLITE
217a0 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 29 3b  _OPEN_MAIN_DB );
217b0 0a 20 20 61 73 73 65 72 74 28 20 28 21 69 73 44  .  assert( (!isD
217c0 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20  elete && zName) 
217d0 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45  || eType!=SQLITE
217e0 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
217f0 41 4c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  AL );.  assert( 
21800 28 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e  (!isDelete && zN
21810 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53  ame) || eType!=S
21820 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45  QLITE_OPEN_MASTE
21830 52 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 0a 20 20  R_JOURNAL );..  
21840 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74 20 74  /* Assert that t
21850 68 65 20 75 70 70 65 72 20 6c 61 79 65 72 20 68  he upper layer h
21860 61 73 20 73 65 74 20 6f 6e 65 20 6f 66 20 74 68  as set one of th
21870 65 20 22 66 69 6c 65 2d 74 79 70 65 22 20 66 6c  e "file-type" fl
21880 61 67 73 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74  ags. */.  assert
21890 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  ( eType==SQLITE_
218a0 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 20 20 20  OPEN_MAIN_DB    
218b0 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49    || eType==SQLI
218c0 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 20  TE_OPEN_TEMP_DB 
218d0 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65  .       || eType
218e0 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  ==SQLITE_OPEN_MA
218f0 49 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 7c 20 65 54  IN_JOURNAL || eT
21900 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
21910 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 20 0a 20  _TEMP_JOURNAL . 
21920 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d        || eType==
21930 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a  SQLITE_OPEN_SUBJ
21940 4f 55 52 4e 41 4c 20 20 20 7c 7c 20 65 54 79 70  OURNAL   || eTyp
21950 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e==SQLITE_OPEN_M
21960 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 0a 20  ASTER_JOURNAL . 
21970 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d        || eType==
21980 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 52 41 4e  SQLITE_OPEN_TRAN
21990 53 49 45 4e 54 5f 44 42 0a 20 20 29 3b 0a 0a 20  SIENT_DB.  );.. 
219a0 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69   memset(p, 0, si
219b0 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65 29 29 3b  zeof(unixFile));
219c0 0a 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 53  ..  if( eType==S
219d0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
219e0 44 42 20 29 7b 0a 20 20 20 20 55 6e 69 78 55 6e  DB ){.    UnixUn
219f0 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64 3b  usedFd *pUnused;
21a00 0a 20 20 20 20 70 55 6e 75 73 65 64 20 3d 20 66  .    pUnused = f
21a10 69 6e 64 52 65 75 73 61 62 6c 65 46 64 28 7a 4e  indReusableFd(zN
21a20 61 6d 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20  ame, flags);.   
21a30 20 69 66 28 20 70 55 6e 75 73 65 64 20 29 7b 0a   if( pUnused ){.
21a40 20 20 20 20 20 20 66 64 20 3d 20 70 55 6e 75 73        fd = pUnus
21a50 65 64 2d 3e 66 64 3b 0a 20 20 20 20 7d 65 6c 73  ed->fd;.    }els
21a60 65 7b 0a 20 20 20 20 20 20 70 55 6e 75 73 65 64  e{.      pUnused
21a70 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
21a80 63 28 73 69 7a 65 6f 66 28 2a 70 55 6e 75 73 65  c(sizeof(*pUnuse
21a90 64 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  d));.      if( !
21aa0 70 55 6e 75 73 65 64 20 29 7b 0a 20 20 20 20 20  pUnused ){.     
21ab0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
21ac0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a  _NOMEM;.      }.
21ad0 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 70 55 6e      }.    p->pUn
21ae0 75 73 65 64 20 3d 20 70 55 6e 75 73 65 64 3b 0a  used = pUnused;.
21af0 20 20 7d 65 6c 73 65 20 69 66 28 20 21 7a 4e 61    }else if( !zNa
21b00 6d 65 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  me ){.    /* If 
21b10 7a 4e 61 6d 65 20 69 73 20 4e 55 4c 4c 2c 20 74  zName is NULL, t
21b20 68 65 20 75 70 70 65 72 20 6c 61 79 65 72 20 69  he upper layer i
21b30 73 20 72 65 71 75 65 73 74 69 6e 67 20 61 20 74  s requesting a t
21b40 65 6d 70 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20  emp file. */.   
21b50 20 61 73 73 65 72 74 28 69 73 44 65 6c 65 74 65   assert(isDelete
21b60 20 26 26 20 21 69 73 4f 70 65 6e 44 69 72 65 63   && !isOpenDirec
21b70 74 6f 72 79 29 3b 0a 20 20 20 20 72 63 20 3d 20  tory);.    rc = 
21b80 67 65 74 54 65 6d 70 6e 61 6d 65 28 4d 41 58 5f  getTempname(MAX_
21b90 50 41 54 48 4e 41 4d 45 2b 31 2c 20 7a 54 6d 70  PATHNAME+1, zTmp
21ba0 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 72  name);.    if( r
21bb0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
21bc0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
21bd0 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4e 61 6d 65  .    }.    zName
21be0 20 3d 20 7a 54 6d 70 6e 61 6d 65 3b 0a 20 20 7d   = zTmpname;.  }
21bf0 0a 0a 20 20 2f 2a 20 44 65 74 65 72 6d 69 6e 65  ..  /* Determine
21c00 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
21c10 65 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65  e flags paramete
21c20 72 20 70 61 73 73 65 64 20 74 6f 20 50 4f 53 49  r passed to POSI
21c30 58 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20  X function.  ** 
21c40 6f 70 65 6e 28 29 2e 20 54 68 65 73 65 20 6d 75  open(). These mu
21c50 73 74 20 62 65 20 63 61 6c 63 75 6c 61 74 65 64  st be calculated
21c60 20 65 76 65 6e 20 69 66 20 6f 70 65 6e 28 29 20   even if open() 
21c70 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64 2c 20 61  is not called, a
21c80 73 0a 20 20 2a 2a 20 74 68 65 79 20 6d 61 79 20  s.  ** they may 
21c90 62 65 20 73 74 6f 72 65 64 20 61 73 20 70 61 72  be stored as par
21ca0 74 20 6f 66 20 74 68 65 20 66 69 6c 65 20 68 61  t of the file ha
21cb0 6e 64 6c 65 20 61 6e 64 20 75 73 65 64 20 62 79  ndle and used by
21cc0 20 74 68 65 20 0a 20 20 2a 2a 20 27 63 6f 6e 63   the .  ** 'conc
21cd0 68 20 66 69 6c 65 27 20 6c 6f 63 6b 69 6e 67 20  h file' locking 
21ce0 66 75 6e 63 74 69 6f 6e 73 20 6c 61 74 65 72 20  functions later 
21cf0 6f 6e 2e 20 20 2a 2f 0a 20 20 69 66 28 20 69 73  on.  */.  if( is
21d00 52 65 61 64 6f 6e 6c 79 20 29 20 20 6f 70 65 6e  Readonly )  open
21d10 46 6c 61 67 73 20 7c 3d 20 4f 5f 52 44 4f 4e 4c  Flags |= O_RDONL
21d20 59 3b 0a 20 20 69 66 28 20 69 73 52 65 61 64 57  Y;.  if( isReadW
21d30 72 69 74 65 20 29 20 6f 70 65 6e 46 6c 61 67 73  rite ) openFlags
21d40 20 7c 3d 20 4f 5f 52 44 57 52 3b 0a 20 20 69 66   |= O_RDWR;.  if
21d50 28 20 69 73 43 72 65 61 74 65 20 29 20 20 20 20  ( isCreate )    
21d60 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f 43  openFlags |= O_C
21d70 52 45 41 54 3b 0a 20 20 69 66 28 20 69 73 45 78  REAT;.  if( isEx
21d80 63 6c 75 73 69 76 65 20 29 20 6f 70 65 6e 46 6c  clusive ) openFl
21d90 61 67 73 20 7c 3d 20 28 4f 5f 45 58 43 4c 7c 4f  ags |= (O_EXCL|O
21da0 5f 4e 4f 46 4f 4c 4c 4f 57 29 3b 0a 20 20 6f 70  _NOFOLLOW);.  op
21db0 65 6e 46 6c 61 67 73 20 7c 3d 20 28 4f 5f 4c 41  enFlags |= (O_LA
21dc0 52 47 45 46 49 4c 45 7c 4f 5f 42 49 4e 41 52 59  RGEFILE|O_BINARY
21dd0 29 3b 0a 0a 20 20 69 66 28 20 66 64 3c 30 20 29  );..  if( fd<0 )
21de0 7b 0a 20 20 20 20 6d 6f 64 65 5f 74 20 6f 70 65  {.    mode_t ope
21df0 6e 4d 6f 64 65 20 3d 20 28 69 73 44 65 6c 65 74  nMode = (isDelet
21e00 65 3f 30 36 30 30 3a 53 51 4c 49 54 45 5f 44 45  e?0600:SQLITE_DE
21e10 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49  FAULT_FILE_PERMI
21e20 53 53 49 4f 4e 53 29 3b 0a 20 20 20 20 66 64 20  SSIONS);.    fd 
21e30 3d 20 6f 70 65 6e 28 7a 4e 61 6d 65 2c 20 6f 70  = open(zName, op
21e40 65 6e 46 6c 61 67 73 2c 20 6f 70 65 6e 4d 6f 64  enFlags, openMod
21e50 65 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 34  e);.    OSTRACE4
21e60 28 22 4f 50 45 4e 58 20 20 20 25 2d 33 64 20 25  ("OPENX   %-3d %
21e70 73 20 30 25 6f 5c 6e 22 2c 20 66 64 2c 20 7a 4e  s 0%o\n", fd, zN
21e80 61 6d 65 2c 20 6f 70 65 6e 46 6c 61 67 73 29 3b  ame, openFlags);
21e90 0a 20 20 20 20 69 66 28 20 66 64 3c 30 20 26 26  .    if( fd<0 &&
21ea0 20 65 72 72 6e 6f 21 3d 45 49 53 44 49 52 20 26   errno!=EISDIR &
21eb0 26 20 69 73 52 65 61 64 57 72 69 74 65 20 26 26  & isReadWrite &&
21ec0 20 21 69 73 45 78 63 6c 75 73 69 76 65 20 29 7b   !isExclusive ){
21ed0 0a 20 20 20 20 20 20 2f 2a 20 46 61 69 6c 65 64  .      /* Failed
21ee0 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 66 69 6c   to open the fil
21ef0 65 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65  e for read/write
21f00 20 61 63 63 65 73 73 2e 20 54 72 79 20 72 65 61   access. Try rea
21f10 64 2d 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20 20 20  d-only. */.     
21f20 20 66 6c 61 67 73 20 26 3d 20 7e 28 53 51 4c 49   flags &= ~(SQLI
21f30 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
21f40 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  E|SQLITE_OPEN_CR
21f50 45 41 54 45 29 3b 0a 20 20 20 20 20 20 6f 70 65  EATE);.      ope
21f60 6e 46 6c 61 67 73 20 26 3d 20 7e 28 4f 5f 52 44  nFlags &= ~(O_RD
21f70 57 52 7c 4f 5f 43 52 45 41 54 29 3b 0a 20 20 20  WR|O_CREAT);.   
21f80 20 20 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49     flags |= SQLI
21f90 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
21fa0 3b 0a 20 20 20 20 20 20 6f 70 65 6e 46 6c 61 67  ;.      openFlag
21fb0 73 20 7c 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20  s |= O_RDONLY;. 
21fc0 20 20 20 20 20 66 64 20 3d 20 6f 70 65 6e 28 7a       fd = open(z
21fd0 4e 61 6d 65 2c 20 6f 70 65 6e 46 6c 61 67 73 2c  Name, openFlags,
21fe0 20 6f 70 65 6e 4d 6f 64 65 29 3b 0a 20 20 20 20   openMode);.    
21ff0 7d 0a 20 20 20 20 69 66 28 20 66 64 3c 30 20 29  }.    if( fd<0 )
22000 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
22010 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20  ITE_CANTOPEN;.  
22020 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 5f 66 69      goto open_fi
22030 6e 69 73 68 65 64 3b 0a 20 20 20 20 7d 0a 20 20  nished;.    }.  
22040 7d 0a 20 20 61 73 73 65 72 74 28 20 66 64 3e 3d  }.  assert( fd>=
22050 30 20 29 3b 0a 20 20 69 66 28 20 70 4f 75 74 46  0 );.  if( pOutF
22060 6c 61 67 73 20 29 7b 0a 20 20 20 20 2a 70 4f 75  lags ){.    *pOu
22070 74 46 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a  tFlags = flags;.
22080 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 70 55    }..  if( p->pU
22090 6e 75 73 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e  nused ){.    p->
220a0 70 55 6e 75 73 65 64 2d 3e 66 64 20 3d 20 66 64  pUnused->fd = fd
220b0 3b 0a 20 20 20 20 70 2d 3e 70 55 6e 75 73 65 64  ;.    p->pUnused
220c0 2d 3e 66 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b  ->flags = flags;
220d0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69 73 44 65  .  }..  if( isDe
220e0 6c 65 74 65 20 29 7b 0a 23 69 66 20 4f 53 5f 56  lete ){.#if OS_V
220f0 58 57 4f 52 4b 53 0a 20 20 20 20 7a 50 61 74 68  XWORKS.    zPath
22100 20 3d 20 7a 4e 61 6d 65 3b 0a 23 65 6c 73 65 0a   = zName;.#else.
22110 20 20 20 20 75 6e 6c 69 6e 6b 28 7a 4e 61 6d 65      unlink(zName
22120 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 69  );.#endif.  }.#i
22130 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
22140 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20  LOCKING_STYLE.  
22150 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 6f 70 65  else{.    p->ope
22160 6e 46 6c 61 67 73 20 3d 20 6f 70 65 6e 46 6c 61  nFlags = openFla
22170 67 73 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  gs;.  }.#endif..
22180 20 20 69 66 28 20 69 73 4f 70 65 6e 44 69 72 65    if( isOpenDire
22190 63 74 6f 72 79 20 29 7b 0a 20 20 20 20 72 63 20  ctory ){.    rc 
221a0 3d 20 6f 70 65 6e 44 69 72 65 63 74 6f 72 79 28  = openDirectory(
221b0 7a 50 61 74 68 2c 20 26 64 69 72 66 64 29 3b 0a  zPath, &dirfd);.
221c0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
221d0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f  TE_OK ){.      /
221e0 2a 20 49 74 20 69 73 20 73 61 66 65 20 74 6f 20  * It is safe to 
221f0 63 6c 6f 73 65 20 66 64 20 61 74 20 74 68 69 73  close fd at this
22200 20 70 6f 69 6e 74 2c 20 62 65 63 61 75 73 65 20   point, because 
22210 69 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  it is guaranteed
22220 20 6e 6f 74 0a 20 20 20 20 20 20 2a 2a 20 74 6f   not.      ** to
22230 20 62 65 20 6f 70 65 6e 20 6f 6e 20 61 20 64 61   be open on a da
22240 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20  tabase file. If 
22250 69 74 20 77 65 72 65 20 6f 70 65 6e 20 6f 6e 20  it were open on 
22260 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  a database file,
22270 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 77 6f 75  .      ** it wou
22280 6c 64 20 6e 6f 74 20 62 65 20 73 61 66 65 20 74  ld not be safe t
22290 6f 20 63 6c 6f 73 65 20 61 73 20 74 68 69 73 20  o close as this 
222a0 77 6f 75 6c 64 20 72 65 6c 65 61 73 65 20 61 6e  would release an
222b0 79 20 6c 6f 63 6b 73 20 68 65 6c 64 0a 20 20 20  y locks held.   
222c0 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 66 69 6c     ** on the fil
222d0 65 20 62 79 20 74 68 69 73 20 70 72 6f 63 65 73  e by this proces
222e0 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  s.  */.      ass
222f0 65 72 74 28 20 65 54 79 70 65 21 3d 53 51 4c 49  ert( eType!=SQLI
22300 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20  TE_OPEN_MAIN_DB 
22310 29 3b 0a 20 20 20 20 20 20 63 6c 6f 73 65 28 66  );.      close(f
22320 64 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  d);             
22330 2f 2a 20 73 69 6c 65 6e 74 6c 79 20 6c 65 61 6b  /* silently leak
22340 20 69 66 20 66 61 69 6c 2c 20 61 6c 72 65 61 64   if fail, alread
22350 79 20 69 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20  y in error */.  
22360 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 5f 66 69      goto open_fi
22370 6e 69 73 68 65 64 3b 0a 20 20 20 20 7d 0a 20 20  nished;.    }.  
22380 7d 0a 0a 23 69 66 64 65 66 20 46 44 5f 43 4c 4f  }..#ifdef FD_CLO
22390 45 58 45 43 0a 20 20 66 63 6e 74 6c 28 66 64 2c  EXEC.  fcntl(fd,
223a0 20 46 5f 53 45 54 46 44 2c 20 66 63 6e 74 6c 28   F_SETFD, fcntl(
223b0 66 64 2c 20 46 5f 47 45 54 46 44 2c 20 30 29 20  fd, F_GETFD, 0) 
223c0 7c 20 46 44 5f 43 4c 4f 45 58 45 43 29 3b 0a 23  | FD_CLOEXEC);.#
223d0 65 6e 64 69 66 0a 0a 20 20 6e 6f 4c 6f 63 6b 20  endif..  noLock 
223e0 3d 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f  = eType!=SQLITE_
223f0 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 3b 0a 0a 23  OPEN_MAIN_DB;..#
22400 69 66 20 53 51 4c 49 54 45 5f 50 52 45 46 45 52  if SQLITE_PREFER
22410 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 0a 20  _PROXY_LOCKING. 
22420 20 69 73 41 75 74 6f 50 72 6f 78 79 20 3d 20 31   isAutoProxy = 1
22430 3b 0a 23 65 6e 64 69 66 0a 20 20 0a 23 69 66 20  ;.#endif.  .#if 
22440 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
22450 5f 29 20 7c 7c 20 53 51 4c 49 54 45 5f 45 4e 41  _) || SQLITE_ENA
22460 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
22470 45 0a 0a 20 20 73 74 72 75 63 74 20 73 74 61 74  E..  struct stat
22480 66 73 20 66 73 49 6e 66 6f 3b 0a 20 20 69 66 28  fs fsInfo;.  if(
22490 20 66 73 74 61 74 66 73 28 66 64 2c 20 26 66 73   fstatfs(fd, &fs
224a0 49 6e 66 6f 29 20 3d 3d 20 2d 31 20 29 7b 0a 20  Info) == -1 ){. 
224b0 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 70     ((unixFile*)p
224c0 46 69 6c 65 29 2d 3e 6c 61 73 74 45 72 72 6e 6f  File)->lastErrno
224d0 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 69 66   = errno;.    if
224e0 28 20 64 69 72 66 64 3e 3d 30 20 29 20 63 6c 6f  ( dirfd>=0 ) clo
224f0 73 65 28 64 69 72 66 64 29 3b 20 2f 2a 20 73 69  se(dirfd); /* si
22500 6c 65 6e 74 6c 79 20 6c 65 61 6b 20 69 66 20 66  lently leak if f
22510 61 69 6c 2c 20 69 6e 20 65 72 72 6f 72 20 2a 2f  ail, in error */
22520 0a 20 20 20 20 63 6c 6f 73 65 28 66 64 29 3b 20  .    close(fd); 
22530 2f 2a 20 73 69 6c 65 6e 74 6c 79 20 6c 65 61 6b  /* silently leak
22540 20 69 66 20 66 61 69 6c 2c 20 69 6e 20 65 72 72   if fail, in err
22550 6f 72 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  or */.    return
22560 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43   SQLITE_IOERR_AC
22570 43 45 53 53 3b 0a 20 20 7d 0a 20 20 0a 20 20 28  CESS;.  }.  .  (
22580 28 75 6e 69 78 46 69 6c 65 2a 29 70 46 69 6c 65  (unixFile*)pFile
22590 29 2d 3e 66 73 46 6c 61 67 73 20 3d 20 53 51 4c  )->fsFlags = SQL
225a0 49 54 45 5f 46 53 46 4c 41 47 53 5f 49 4e 49 54  ITE_FSFLAGS_INIT
225b0 49 41 4c 49 5a 45 44 3b 0a 20 20 0a 20 20 69 66  IALIZED;.  .  if
225c0 20 28 66 73 49 6e 66 6f 2e 66 5f 66 6c 61 67 73   (fsInfo.f_flags
225d0 20 26 20 4d 4e 54 5f 52 44 4f 4e 4c 59 29 20 7b   & MNT_RDONLY) {
225e0 0a 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a  .    ((unixFile*
225f0 29 70 46 69 6c 65 29 2d 3e 66 73 46 6c 61 67 73  )pFile)->fsFlags
22600 20 7c 3d 20 53 51 4c 49 54 45 5f 46 53 46 4c 41   |= SQLITE_FSFLA
22610 47 53 5f 49 53 5f 52 45 41 44 4f 4e 4c 59 3b 0a  GS_IS_READONLY;.
22620 20 20 7d 0a 20 20 69 66 20 28 66 73 49 6e 66 6f    }.  if (fsInfo
22630 2e 66 5f 66 6c 61 67 73 20 26 20 4d 4e 54 5f 4c  .f_flags & MNT_L
22640 4f 43 41 4c 29 20 7b 0a 20 20 20 20 28 28 75 6e  OCAL) {.    ((un
22650 69 78 46 69 6c 65 2a 29 70 46 69 6c 65 29 2d 3e  ixFile*)pFile)->
22660 66 73 46 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54  fsFlags |= SQLIT
22670 45 5f 46 53 46 4c 41 47 53 5f 49 53 5f 4c 4f 43  E_FSFLAGS_IS_LOC
22680 41 4c 3b 0a 20 20 7d 0a 20 20 69 66 20 28 30 20  AL;.  }.  if (0 
22690 3d 3d 20 73 74 72 6e 63 6d 70 28 22 68 66 73 22  == strncmp("hfs"
226a0 2c 20 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70  , fsInfo.f_fstyp
226b0 65 6e 61 6d 65 2c 20 33 29 29 20 7b 0a 20 20 20  ename, 3)) {.   
226c0 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 70 46 69   ((unixFile*)pFi
226d0 6c 65 29 2d 3e 66 73 46 6c 61 67 73 20 7c 3d 20  le)->fsFlags |= 
226e0 53 51 4c 49 54 45 5f 46 53 46 4c 41 47 53 5f 49  SQLITE_FSFLAGS_I
226f0 53 5f 48 46 53 50 4c 55 53 3b 0a 20 20 7d 20 65  S_HFSPLUS;.  } e
22700 6c 73 65 20 69 66 20 28 30 20 3d 3d 20 73 74 72  lse if (0 == str
22710 6e 63 6d 70 28 22 6d 73 64 6f 73 22 2c 20 66 73  ncmp("msdos", fs
22720 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d  Info.f_fstypenam
22730 65 2c 20 35 29 29 20 7b 0a 20 20 20 20 28 28 75  e, 5)) {.    ((u
22740 6e 69 78 46 69 6c 65 2a 29 70 46 69 6c 65 29 2d  nixFile*)pFile)-
22750 3e 66 73 46 6c 61 67 73 20 7c 3d 20 53 51 4c 49  >fsFlags |= SQLI
22760 54 45 5f 46 53 46 4c 41 47 53 5f 49 53 5f 4d 53  TE_FSFLAGS_IS_MS
22770 44 4f 53 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  DOS;.  }.#endif.
22780 20 20 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e    .#if SQLITE_EN
22790 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
227a0 4c 45 0a 20 20 69 66 28 20 69 73 41 75 74 6f 50  LE.  if( isAutoP
227b0 72 6f 78 79 20 26 26 20 28 7a 50 61 74 68 21 3d  roxy && (zPath!=
227c0 4e 55 4c 4c 29 20 26 26 20 28 21 6e 6f 4c 6f 63  NULL) && (!noLoc
227d0 6b 29 20 26 26 20 70 56 66 73 2d 3e 78 4f 70 65  k) && pVfs->xOpe
227e0 6e 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 65  n ){.    char *e
227f0 6e 76 66 6f 72 63 65 20 3d 20 67 65 74 65 6e 76  nvforce = getenv
22800 28 22 53 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50  ("SQLITE_FORCE_P
22810 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 22 29 3b 0a  ROXY_LOCKING");.
22820 20 20 20 20 69 6e 74 20 75 73 65 50 72 6f 78 79      int useProxy
22830 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 53 51   = 0;..    /* SQ
22840 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59  LITE_FORCE_PROXY
22850 5f 4c 4f 43 4b 49 4e 47 3d 3d 31 20 6d 65 61 6e  _LOCKING==1 mean
22860 73 20 66 6f 72 63 65 20 61 6c 77 61 79 73 20 75  s force always u
22870 73 65 20 70 72 6f 78 79 2c 20 30 20 6d 65 61 6e  se proxy, 0 mean
22880 73 20 0a 20 20 20 20 2a 2a 20 6e 65 76 65 72 20  s .    ** never 
22890 75 73 65 20 70 72 6f 78 79 2c 20 4e 55 4c 4c 20  use proxy, NULL 
228a0 6d 65 61 6e 73 20 75 73 65 20 70 72 6f 78 79 20  means use proxy 
228b0 66 6f 72 20 6e 6f 6e 2d 6c 6f 63 61 6c 20 66 69  for non-local fi
228c0 6c 65 73 20 6f 6e 6c 79 2e 20 20 2a 2f 0a 20 20  les only.  */.  
228d0 20 20 69 66 28 20 65 6e 76 66 6f 72 63 65 21 3d    if( envforce!=
228e0 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 75 73  NULL ){.      us
228f0 65 50 72 6f 78 79 20 3d 20 61 74 6f 69 28 65 6e  eProxy = atoi(en
22900 76 66 6f 72 63 65 29 3e 30 3b 0a 20 20 20 20 7d  vforce)>0;.    }
22910 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 74 72 75  else{.      stru
22920 63 74 20 73 74 61 74 66 73 20 66 73 49 6e 66 6f  ct statfs fsInfo
22930 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74 61 74  ;.      if( stat
22940 66 73 28 7a 50 61 74 68 2c 20 26 66 73 49 6e 66  fs(zPath, &fsInf
22950 6f 29 20 3d 3d 20 2d 31 20 29 7b 0a 20 20 20 20  o) == -1 ){.    
22960 20 20 20 20 2f 2a 20 49 6e 20 74 68 65 6f 72 79      /* In theory
22970 2c 20 74 68 65 20 63 6c 6f 73 65 28 66 64 29 20  , the close(fd) 
22980 63 61 6c 6c 20 69 73 20 73 75 62 2d 6f 70 74 69  call is sub-opti
22990 6d 61 6c 2e 20 49 66 20 74 68 65 20 66 69 6c 65  mal. If the file
229a0 20 6f 70 65 6e 65 64 0a 20 20 20 20 20 20 20 20   opened.        
229b0 2a 2a 20 77 69 74 68 20 66 64 20 69 73 20 61 20  ** with fd is a 
229c0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 61  database file, a
229d0 6e 64 20 74 68 65 72 65 20 61 72 65 20 6f 74 68  nd there are oth
229e0 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f  er connections o
229f0 70 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  pen.        ** o
22a00 6e 20 74 68 61 74 20 66 69 6c 65 20 74 68 61 74  n that file that
22a10 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 68   are currently h
22a20 6f 6c 64 69 6e 67 20 61 64 76 69 73 6f 72 79 20  olding advisory 
22a30 6c 6f 63 6b 73 20 6f 6e 20 69 74 2c 0a 20 20 20  locks on it,.   
22a40 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65       ** then the
22a50 20 63 61 6c 6c 20 74 6f 20 63 6c 6f 73 65 28 29   call to close()
22a60 20 77 69 6c 6c 20 63 61 6e 63 65 6c 20 74 68 6f   will cancel tho
22a70 73 65 20 6c 6f 63 6b 73 2e 20 49 6e 20 70 72 61  se locks. In pra
22a80 63 74 69 63 65 2c 0a 20 20 20 20 20 20 20 20 2a  ctice,.        *
22a90 2a 20 77 65 27 72 65 20 61 73 73 75 6d 69 6e 67  * we're assuming
22aa0 20 74 68 61 74 20 73 74 61 74 66 73 28 29 20 64   that statfs() d
22ab0 6f 65 73 6e 27 74 20 66 61 69 6c 20 76 65 72 79  oesn't fail very
22ac0 20 6f 66 74 65 6e 2e 20 41 74 20 6c 65 61 73 74   often. At least
22ad0 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20  .        ** not 
22ae0 77 68 69 6c 65 20 6f 74 68 65 72 20 66 69 6c 65  while other file
22af0 20 64 65 73 63 72 69 70 74 6f 72 73 20 6f 70 65   descriptors ope
22b00 6e 65 64 20 62 79 20 74 68 65 20 73 61 6d 65 20  ned by the same 
22b10 70 72 6f 63 65 73 73 20 6f 6e 0a 20 20 20 20 20  process on.     
22b20 20 20 20 2a 2a 20 74 68 65 20 73 61 6d 65 20 66     ** the same f
22b30 69 6c 65 20 61 72 65 20 77 6f 72 6b 69 6e 67 2e  ile are working.
22b40 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 2d 3e    */.        p->
22b50 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  lastErrno = errn
22b60 6f 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64  o;.        if( d
22b70 69 72 66 64 3e 3d 30 20 29 7b 0a 20 20 20 20 20  irfd>=0 ){.     
22b80 20 20 20 20 20 63 6c 6f 73 65 28 64 69 72 66 64       close(dirfd
22b90 29 3b 20 2f 2a 20 73 69 6c 65 6e 74 6c 79 20 6c  ); /* silently l
22ba0 65 61 6b 20 69 66 20 66 61 69 6c 2c 20 69 6e 20  eak if fail, in 
22bb0 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20  error */.       
22bc0 20 7d 0a 20 20 20 20 20 20 20 20 63 6c 6f 73 65   }.        close
22bd0 28 66 64 29 3b 20 2f 2a 20 73 69 6c 65 6e 74 6c  (fd); /* silentl
22be0 79 20 6c 65 61 6b 20 69 66 20 66 61 69 6c 2c 20  y leak if fail, 
22bf0 69 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20  in error */.    
22c00 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
22c10 49 4f 45 52 52 5f 41 43 43 45 53 53 3b 0a 20 20  IOERR_ACCESS;.  
22c20 20 20 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 5f        goto open_
22c30 66 69 6e 69 73 68 65 64 3b 0a 20 20 20 20 20 20  finished;.      
22c40 7d 0a 20 20 20 20 20 20 75 73 65 50 72 6f 78 79  }.      useProxy
22c50 20 3d 20 21 28 66 73 49 6e 66 6f 2e 66 5f 66 6c   = !(fsInfo.f_fl
22c60 61 67 73 26 4d 4e 54 5f 4c 4f 43 41 4c 29 3b 0a  ags&MNT_LOCAL);.
22c70 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 75 73      }.    if( us
22c80 65 50 72 6f 78 79 20 29 7b 0a 20 20 20 20 20 20  eProxy ){.      
22c90 72 63 20 3d 20 66 69 6c 6c 49 6e 55 6e 69 78 46  rc = fillInUnixF
22ca0 69 6c 65 28 70 56 66 73 2c 20 66 64 2c 20 64 69  ile(pVfs, fd, di
22cb0 72 66 64 2c 20 70 46 69 6c 65 2c 20 7a 50 61 74  rfd, pFile, zPat
22cc0 68 2c 20 6e 6f 4c 6f 63 6b 2c 20 69 73 44 65 6c  h, noLock, isDel
22cd0 65 74 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ete);.      if( 
22ce0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
22cf0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 72  .        rc = pr
22d00 6f 78 79 54 72 61 6e 73 66 6f 72 6d 55 6e 69 78  oxyTransformUnix
22d10 46 69 6c 65 28 28 75 6e 69 78 46 69 6c 65 2a 29  File((unixFile*)
22d20 70 46 69 6c 65 2c 20 22 3a 61 75 74 6f 3a 22 29  pFile, ":auto:")
22d30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
22d40 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
22d50 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20           /* Use 
22d60 75 6e 69 78 43 6c 6f 73 65 20 74 6f 20 63 6c 65  unixClose to cle
22d70 61 6e 20 75 70 20 74 68 65 20 72 65 73 6f 75 72  an up the resour
22d80 63 65 73 20 61 64 64 65 64 20 69 6e 20 66 69 6c  ces added in fil
22d90 6c 49 6e 55 6e 69 78 46 69 6c 65 20 0a 20 20 20  lInUnixFile .   
22da0 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 63 6c         ** and cl
22db0 65 61 72 20 61 6c 6c 20 74 68 65 20 73 74 72 75  ear all the stru
22dc0 63 74 75 72 65 27 73 20 72 65 66 65 72 65 6e 63  cture's referenc
22dd0 65 73 2e 20 20 53 70 65 63 69 66 69 63 61 6c 6c  es.  Specificall
22de0 79 2c 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  y, .          **
22df0 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 73   pFile->pMethods
22e00 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 20 73 6f   will be NULL so
22e10 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 20   sqlite3OsClose 
22e20 77 69 6c 6c 20 62 65 20 61 20 6e 6f 2d 6f 70 20  will be a no-op 
22e30 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
22e40 20 20 20 20 20 20 20 20 75 6e 69 78 43 6c 6f 73          unixClos
22e50 65 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20  e(pFile);.      
22e60 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
22e70 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
22e80 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e  .      goto open
22e90 5f 66 69 6e 69 73 68 65 64 3b 0a 20 20 20 20 7d  _finished;.    }
22ea0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20  .  }.#endif.  . 
22eb0 20 72 63 20 3d 20 66 69 6c 6c 49 6e 55 6e 69 78   rc = fillInUnix
22ec0 46 69 6c 65 28 70 56 66 73 2c 20 66 64 2c 20 64  File(pVfs, fd, d
22ed0 69 72 66 64 2c 20 70 46 69 6c 65 2c 20 7a 50 61  irfd, pFile, zPa
22ee0 74 68 2c 20 6e 6f 4c 6f 63 6b 2c 20 69 73 44 65  th, noLock, isDe
22ef0 6c 65 74 65 29 3b 0a 6f 70 65 6e 5f 66 69 6e 69  lete);.open_fini
22f00 73 68 65 64 3a 0a 20 20 69 66 28 20 72 63 21 3d  shed:.  if( rc!=
22f10 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
22f20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d   sqlite3_free(p-
22f30 3e 70 55 6e 75 73 65 64 29 3b 0a 20 20 7d 0a 20  >pUnused);.  }. 
22f40 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
22f50 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65  /*.** Delete the
22f60 20 66 69 6c 65 20 61 74 20 7a 50 61 74 68 2e 20   file at zPath. 
22f70 49 66 20 74 68 65 20 64 69 72 53 79 6e 63 20 61  If the dirSync a
22f80 72 67 75 6d 65 6e 74 20 69 73 20 74 72 75 65 2c  rgument is true,
22f90 20 66 73 79 6e 63 28 29 0a 2a 2a 20 74 68 65 20   fsync().** the 
22fa0 64 69 72 65 63 74 6f 72 79 20 61 66 74 65 72 20  directory after 
22fb0 64 65 6c 65 74 69 6e 67 20 74 68 65 20 66 69 6c  deleting the fil
22fc0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
22fd0 20 75 6e 69 78 44 65 6c 65 74 65 28 0a 20 20 73   unixDelete(.  s
22fe0 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55  qlite3_vfs *NotU
22ff0 73 65 64 2c 20 20 20 20 20 2f 2a 20 56 46 53 20  sed,     /* VFS 
23000 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 69 73 20  containing this 
23010 61 73 20 74 68 65 20 78 44 65 6c 65 74 65 20 6d  as the xDelete m
23020 65 74 68 6f 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  ethod */.  const
23030 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20   char *zPath,   
23040 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
23050 66 69 6c 65 20 74 6f 20 62 65 20 64 65 6c 65 74  file to be delet
23060 65 64 20 2a 2f 0a 20 20 69 6e 74 20 64 69 72 53  ed */.  int dirS
23070 79 6e 63 20 20 20 20 20 20 20 20 20 20 20 20 20  ync             
23080 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 66 73    /* If true, fs
23090 79 6e 63 28 29 20 64 69 72 65 63 74 6f 72 79 20  ync() directory 
230a0 61 66 74 65 72 20 64 65 6c 65 74 69 6e 67 20 66  after deleting f
230b0 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ile */.){.  int 
230c0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
230d0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
230e0 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 53  ER(NotUsed);.  S
230f0 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72  imulateIOError(r
23100 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
23110 52 52 5f 44 45 4c 45 54 45 29 3b 0a 20 20 75 6e  RR_DELETE);.  un
23120 6c 69 6e 6b 28 7a 50 61 74 68 29 3b 0a 23 69 66  link(zPath);.#if
23130 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 49 53 41  ndef SQLITE_DISA
23140 42 4c 45 5f 44 49 52 53 59 4e 43 0a 20 20 69 66  BLE_DIRSYNC.  if
23150 28 20 64 69 72 53 79 6e 63 20 29 7b 0a 20 20 20  ( dirSync ){.   
23160 20 69 6e 74 20 66 64 3b 0a 20 20 20 20 72 63 20   int fd;.    rc 
23170 3d 20 6f 70 65 6e 44 69 72 65 63 74 6f 72 79 28  = openDirectory(
23180 7a 50 61 74 68 2c 20 26 66 64 29 3b 0a 20 20 20  zPath, &fd);.   
23190 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
231a0 4f 4b 20 29 7b 0a 23 69 66 20 4f 53 5f 56 58 57  OK ){.#if OS_VXW
231b0 4f 52 4b 53 0a 20 20 20 20 20 20 69 66 28 20 66  ORKS.      if( f
231c0 73 79 6e 63 28 66 64 29 3d 3d 2d 31 20 29 0a 23  sync(fd)==-1 ).#
231d0 65 6c 73 65 0a 20 20 20 20 20 20 69 66 28 20 66  else.      if( f
231e0 73 79 6e 63 28 66 64 29 20 29 0a 23 65 6e 64 69  sync(fd) ).#endi
231f0 66 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20  f.      {.      
23200 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
23210 45 52 52 5f 44 49 52 5f 46 53 59 4e 43 3b 0a 20  ERR_DIR_FSYNC;. 
23220 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
23230 20 63 6c 6f 73 65 28 66 64 29 26 26 21 72 63 20   close(fd)&&!rc 
23240 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
23250 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49 52  SQLITE_IOERR_DIR
23260 5f 43 4c 4f 53 45 3b 0a 20 20 20 20 20 20 7d 0a  _CLOSE;.      }.
23270 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
23280 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
23290 0a 2f 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65 20  ./*.** Test the 
232a0 65 78 69 73 74 61 6e 63 65 20 6f 66 20 6f 72 20  existance of or 
232b0 61 63 63 65 73 73 20 70 65 72 6d 69 73 73 69 6f  access permissio
232c0 6e 73 20 6f 66 20 66 69 6c 65 20 7a 50 61 74 68  ns of file zPath
232d0 2e 20 54 68 65 0a 2a 2a 20 74 65 73 74 20 70 65  . The.** test pe
232e0 72 66 6f 72 6d 65 64 20 64 65 70 65 6e 64 73 20  rformed depends 
232f0 6f 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  on the value of 
23300 66 6c 61 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  flags:.**.**    
23310 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45   SQLITE_ACCESS_E
23320 58 49 53 54 53 3a 20 52 65 74 75 72 6e 20 31 20  XISTS: Return 1 
23330 69 66 20 74 68 65 20 66 69 6c 65 20 65 78 69 73  if the file exis
23340 74 73 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45  ts.**     SQLITE
23350 5f 41 43 43 45 53 53 5f 52 45 41 44 57 52 49 54  _ACCESS_READWRIT
23360 45 3a 20 52 65 74 75 72 6e 20 31 20 69 66 20 74  E: Return 1 if t
23370 68 65 20 66 69 6c 65 20 69 73 20 72 65 61 64 20  he file is read 
23380 61 6e 64 20 77 72 69 74 61 62 6c 65 2e 0a 2a 2a  and writable..**
23390 20 20 20 20 20 53 51 4c 49 54 45 5f 41 43 43 45       SQLITE_ACCE
233a0 53 53 5f 52 45 41 44 4f 4e 4c 59 3a 20 52 65 74  SS_READONLY: Ret
233b0 75 72 6e 20 31 20 69 66 20 74 68 65 20 66 69 6c  urn 1 if the fil
233c0 65 20 69 73 20 72 65 61 64 61 62 6c 65 2e 0a 2a  e is readable..*
233d0 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 20 72  *.** Otherwise r
233e0 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74  eturn 0..*/.stat
233f0 69 63 20 69 6e 74 20 75 6e 69 78 41 63 63 65 73  ic int unixAcces
23400 73 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  s(.  sqlite3_vfs
23410 20 2a 4e 6f 74 55 73 65 64 2c 20 20 20 2f 2a 20   *NotUsed,   /* 
23420 54 68 65 20 56 46 53 20 63 6f 6e 74 61 69 6e 69  The VFS containi
23430 6e 67 20 74 68 69 73 20 78 41 63 63 65 73 73 20  ng this xAccess 
23440 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 63 6f 6e 73  method */.  cons
23450 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20  t char *zPath,  
23460 20 20 20 20 2f 2a 20 50 61 74 68 20 6f 66 20 74      /* Path of t
23470 68 65 20 66 69 6c 65 20 74 6f 20 65 78 61 6d 69  he file to exami
23480 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  ne */.  int flag
23490 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
234a0 2f 2a 20 57 68 61 74 20 64 6f 20 77 65 20 77 61  /* What do we wa
234b0 6e 74 20 74 6f 20 6c 65 61 72 6e 20 61 62 6f 75  nt to learn abou
234c0 74 20 74 68 65 20 7a 50 61 74 68 20 66 69 6c 65  t the zPath file
234d0 3f 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73  ? */.  int *pRes
234e0 4f 75 74 20 20 20 20 20 20 20 20 20 20 20 20 2f  Out            /
234f0 2a 20 57 72 69 74 65 20 72 65 73 75 6c 74 20 62  * Write result b
23500 6f 6f 6c 65 61 6e 20 68 65 72 65 20 2a 2f 0a 29  oolean here */.)
23510 7b 0a 20 20 69 6e 74 20 61 6d 6f 64 65 20 3d 20  {.  int amode = 
23520 30 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  0;.  UNUSED_PARA
23530 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
23540 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
23550 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
23560 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 3b 20 29  _IOERR_ACCESS; )
23570 3b 0a 20 20 73 77 69 74 63 68 28 20 66 6c 61 67  ;.  switch( flag
23580 73 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51  s ){.    case SQ
23590 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53  LITE_ACCESS_EXIS
235a0 54 53 3a 0a 20 20 20 20 20 20 61 6d 6f 64 65 20  TS:.      amode 
235b0 3d 20 46 5f 4f 4b 3b 0a 20 20 20 20 20 20 62 72  = F_OK;.      br
235c0 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
235d0 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44  LITE_ACCESS_READ
235e0 57 52 49 54 45 3a 0a 20 20 20 20 20 20 61 6d 6f  WRITE:.      amo
235f0 64 65 20 3d 20 57 5f 4f 4b 7c 52 5f 4f 4b 3b 0a  de = W_OK|R_OK;.
23600 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
23610 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43   case SQLITE_ACC
23620 45 53 53 5f 52 45 41 44 3a 0a 20 20 20 20 20 20  ESS_READ:.      
23630 61 6d 6f 64 65 20 3d 20 52 5f 4f 4b 3b 0a 20 20  amode = R_OK;.  
23640 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20      break;..    
23650 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 61  default:.      a
23660 73 73 65 72 74 28 21 22 49 6e 76 61 6c 69 64 20  ssert(!"Invalid 
23670 66 6c 61 67 73 20 61 72 67 75 6d 65 6e 74 22 29  flags argument")
23680 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73 4f 75 74  ;.  }.  *pResOut
23690 20 3d 20 28 61 63 63 65 73 73 28 7a 50 61 74 68   = (access(zPath
236a0 2c 20 61 6d 6f 64 65 29 3d 3d 30 29 3b 0a 20 20  , amode)==0);.  
236b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
236c0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 75 72 6e  ;.}.../*.** Turn
236d0 20 61 20 72 65 6c 61 74 69 76 65 20 70 61 74 68   a relative path
236e0 6e 61 6d 65 20 69 6e 74 6f 20 61 20 66 75 6c 6c  name into a full
236f0 20 70 61 74 68 6e 61 6d 65 2e 20 54 68 65 20 72   pathname. The r
23700 65 6c 61 74 69 76 65 20 70 61 74 68 0a 2a 2a 20  elative path.** 
23710 69 73 20 73 74 6f 72 65 64 20 61 73 20 61 20 6e  is stored as a n
23720 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74  ul-terminated st
23730 72 69 6e 67 20 69 6e 20 74 68 65 20 62 75 66 66  ring in the buff
23740 65 72 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  er pointed to by
23750 0a 2a 2a 20 7a 50 61 74 68 2e 20 0a 2a 2a 0a 2a  .** zPath. .**.*
23760 2a 20 7a 4f 75 74 20 70 6f 69 6e 74 73 20 74 6f  * zOut points to
23770 20 61 20 62 75 66 66 65 72 20 6f 66 20 61 74 20   a buffer of at 
23780 6c 65 61 73 74 20 73 71 6c 69 74 65 33 5f 76 66  least sqlite3_vf
23790 73 2e 6d 78 50 61 74 68 6e 61 6d 65 20 62 79 74  s.mxPathname byt
237a0 65 73 20 0a 2a 2a 20 28 69 6e 20 74 68 69 73 20  es .** (in this 
237b0 63 61 73 65 2c 20 4d 41 58 5f 50 41 54 48 4e 41  case, MAX_PATHNA
237c0 4d 45 20 62 79 74 65 73 29 2e 20 54 68 65 20 66  ME bytes). The f
237d0 75 6c 6c 2d 70 61 74 68 20 69 73 20 77 72 69 74  ull-path is writ
237e0 74 65 6e 20 74 6f 0a 2a 2a 20 74 68 69 73 20 62  ten to.** this b
237f0 75 66 66 65 72 20 62 65 66 6f 72 65 20 72 65 74  uffer before ret
23800 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  urning..*/.stati
23810 63 20 69 6e 74 20 75 6e 69 78 46 75 6c 6c 50 61  c int unixFullPa
23820 74 68 6e 61 6d 65 28 0a 20 20 73 71 6c 69 74 65  thname(.  sqlite
23830 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20  3_vfs *pVfs,    
23840 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
23850 65 72 20 74 6f 20 76 66 73 20 6f 62 6a 65 63 74  er to vfs object
23860 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
23870 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20   *zPath,        
23880 20 20 20 20 2f 2a 20 50 6f 73 73 69 62 6c 79 20      /* Possibly 
23890 72 65 6c 61 74 69 76 65 20 69 6e 70 75 74 20 70  relative input p
238a0 61 74 68 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 75  ath */.  int nOu
238b0 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
238c0 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
238d0 66 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20  f output buffer 
238e0 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 63 68  in bytes */.  ch
238f0 61 72 20 2a 7a 4f 75 74 20 20 20 20 20 20 20 20  ar *zOut        
23900 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
23910 75 74 70 75 74 20 62 75 66 66 65 72 20 2a 2f 0a  utput buffer */.
23920 29 7b 0a 0a 20 20 2f 2a 20 49 74 27 73 20 6f 64  ){..  /* It's od
23930 64 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e  d to simulate an
23940 20 69 6f 2d 65 72 72 6f 72 20 68 65 72 65 2c 20   io-error here, 
23950 62 75 74 20 72 65 61 6c 6c 79 20 74 68 69 73 20  but really this 
23960 69 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75 73 69  is just.  ** usi
23970 6e 67 20 74 68 65 20 69 6f 2d 65 72 72 6f 72 20  ng the io-error 
23980 69 6e 66 72 61 73 74 72 75 63 74 75 72 65 20 74  infrastructure t
23990 6f 20 74 65 73 74 20 74 68 61 74 20 53 51 4c 69  o test that SQLi
239a0 74 65 20 68 61 6e 64 6c 65 73 20 74 68 69 73 0a  te handles this.
239b0 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66 61    ** function fa
239c0 69 6c 69 6e 67 2e 20 54 68 69 73 20 66 75 6e 63  iling. This func
239d0 74 69 6f 6e 20 63 6f 75 6c 64 20 66 61 69 6c 20  tion could fail 
239e0 69 66 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c  if, for example,
239f0 20 74 68 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e   the.  ** curren
23a00 74 20 77 6f 72 6b 69 6e 67 20 64 69 72 65 63 74  t working direct
23a10 6f 72 79 20 68 61 73 20 62 65 65 6e 20 75 6e 6c  ory has been unl
23a20 69 6e 6b 65 64 2e 0a 20 20 2a 2f 0a 20 20 53 69  inked..  */.  Si
23a30 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
23a40 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
23a50 4f 52 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  OR );..  assert(
23a60 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
23a70 65 3d 3d 4d 41 58 5f 50 41 54 48 4e 41 4d 45 20  e==MAX_PATHNAME 
23a80 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
23a90 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 0a 20 20  METER(pVfs);..  
23aa0 7a 4f 75 74 5b 6e 4f 75 74 2d 31 5d 20 3d 20 27  zOut[nOut-1] = '
23ab0 5c 30 27 3b 0a 20 20 69 66 28 20 7a 50 61 74 68  \0';.  if( zPath
23ac0 5b 30 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20  [0]=='/' ){.    
23ad0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
23ae0 28 6e 4f 75 74 2c 20 7a 4f 75 74 2c 20 22 25 73  (nOut, zOut, "%s
23af0 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20 7d 65 6c  ", zPath);.  }el
23b00 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 43 77 64  se{.    int nCwd
23b10 3b 0a 20 20 20 20 69 66 28 20 67 65 74 63 77 64  ;.    if( getcwd
23b20 28 7a 4f 75 74 2c 20 6e 4f 75 74 2d 31 29 3d 3d  (zOut, nOut-1)==
23b30 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  0 ){.      retur
23b40 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  n SQLITE_CANTOPE
23b50 4e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43 77  N;.    }.    nCw
23b60 64 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28  d = (int)strlen(
23b70 7a 4f 75 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  zOut);.    sqlit
23b80 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4f 75 74  e3_snprintf(nOut
23b90 2d 6e 43 77 64 2c 20 26 7a 4f 75 74 5b 6e 43 77  -nCwd, &zOut[nCw
23ba0 64 5d 2c 20 22 2f 25 73 22 2c 20 7a 50 61 74 68  d], "/%s", zPath
23bb0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
23bc0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 23  SQLITE_OK;.}...#
23bd0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
23be0 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f  IT_LOAD_EXTENSIO
23bf0 4e 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63  N./*.** Interfac
23c00 65 73 20 66 6f 72 20 6f 70 65 6e 69 6e 67 20 61  es for opening a
23c10 20 73 68 61 72 65 64 20 6c 69 62 72 61 72 79 2c   shared library,
23c20 20 66 69 6e 64 69 6e 67 20 65 6e 74 72 79 20 70   finding entry p
23c30 6f 69 6e 74 73 0a 2a 2a 20 77 69 74 68 69 6e 20  oints.** within 
23c40 74 68 65 20 73 68 61 72 65 64 20 6c 69 62 72 61  the shared libra
23c50 72 79 2c 20 61 6e 64 20 63 6c 6f 73 69 6e 67 20  ry, and closing 
23c60 74 68 65 20 73 68 61 72 65 64 20 6c 69 62 72 61  the shared libra
23c70 72 79 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20  ry..*/.#include 
23c80 3c 64 6c 66 63 6e 2e 68 3e 0a 73 74 61 74 69 63  <dlfcn.h>.static
23c90 20 76 6f 69 64 20 2a 75 6e 69 78 44 6c 4f 70 65   void *unixDlOpe
23ca0 6e 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e  n(sqlite3_vfs *N
23cb0 6f 74 55 73 65 64 2c 20 63 6f 6e 73 74 20 63 68  otUsed, const ch
23cc0 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a  ar *zFilename){.
23cd0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
23ce0 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72  ER(NotUsed);.  r
23cf0 65 74 75 72 6e 20 64 6c 6f 70 65 6e 28 7a 46 69  eturn dlopen(zFi
23d00 6c 65 6e 61 6d 65 2c 20 52 54 4c 44 5f 4e 4f 57  lename, RTLD_NOW
23d10 20 7c 20 52 54 4c 44 5f 47 4c 4f 42 41 4c 29 3b   | RTLD_GLOBAL);
23d20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 51 4c 69 74 65  .}../*.** SQLite
23d30 20 63 61 6c 6c 73 20 74 68 69 73 20 66 75 6e 63   calls this func
23d40 74 69 6f 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79  tion immediately
23d50 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f   after a call to
23d60 20 75 6e 69 78 44 6c 53 79 6d 28 29 20 6f 72 0a   unixDlSym() or.
23d70 2a 2a 20 75 6e 69 78 44 6c 4f 70 65 6e 28 29 20  ** unixDlOpen() 
23d80 66 61 69 6c 73 20 28 72 65 74 75 72 6e 73 20 61  fails (returns a
23d90 20 6e 75 6c 6c 20 70 6f 69 6e 74 65 72 29 2e 20   null pointer). 
23da0 49 66 20 61 20 6d 6f 72 65 20 64 65 74 61 69 6c  If a more detail
23db0 65 64 20 65 72 72 6f 72 0a 2a 2a 20 6d 65 73 73  ed error.** mess
23dc0 61 67 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65  age is available
23dd0 2c 20 69 74 20 69 73 20 77 72 69 74 74 65 6e 20  , it is written 
23de0 74 6f 20 7a 42 75 66 4f 75 74 2e 20 49 66 20 6e  to zBufOut. If n
23df0 6f 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a  o error message.
23e00 2a 2a 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c  ** is available,
23e10 20 7a 42 75 66 4f 75 74 20 69 73 20 6c 65 66 74   zBufOut is left
23e20 20 75 6e 6d 6f 64 69 66 69 65 64 20 61 6e 64 20   unmodified and 
23e30 53 51 4c 69 74 65 20 75 73 65 73 20 61 20 64 65  SQLite uses a de
23e40 66 61 75 6c 74 0a 2a 2a 20 65 72 72 6f 72 20 6d  fault.** error m
23e50 65 73 73 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69  essage..*/.stati
23e60 63 20 76 6f 69 64 20 75 6e 69 78 44 6c 45 72 72  c void unixDlErr
23e70 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  or(sqlite3_vfs *
23e80 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 6e 42 75  NotUsed, int nBu
23e90 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 4f 75 74  f, char *zBufOut
23ea0 29 7b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 3b  ){.  char *zErr;
23eb0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
23ec0 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
23ed0 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
23ee0 3b 0a 20 20 7a 45 72 72 20 3d 20 64 6c 65 72 72  ;.  zErr = dlerr
23ef0 6f 72 28 29 3b 0a 20 20 69 66 28 20 7a 45 72 72  or();.  if( zErr
23f00 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
23f10 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2c 20 7a  snprintf(nBuf, z
23f20 42 75 66 4f 75 74 2c 20 22 25 73 22 2c 20 7a 45  BufOut, "%s", zE
23f30 72 72 29 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 4c  rr);.  }.  unixL
23f40 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 7d 0a 73  eaveMutex();.}.s
23f50 74 61 74 69 63 20 76 6f 69 64 20 28 2a 75 6e 69  tatic void (*uni
23f60 78 44 6c 53 79 6d 28 73 71 6c 69 74 65 33 5f 76  xDlSym(sqlite3_v
23f70 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 76 6f 69  fs *NotUsed, voi
23f80 64 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  d *p, const char
23f90 2a 7a 53 79 6d 29 29 28 76 6f 69 64 29 7b 0a 20  *zSym))(void){. 
23fa0 20 2f 2a 20 0a 20 20 2a 2a 20 47 43 43 20 77 69   /* .  ** GCC wi
23fb0 74 68 20 2d 70 65 64 61 6e 74 69 63 2d 65 72 72  th -pedantic-err
23fc0 6f 72 73 20 73 61 79 73 20 74 68 61 74 20 43 39  ors says that C9
23fd0 30 20 64 6f 65 73 20 6e 6f 74 20 61 6c 6c 6f 77  0 does not allow
23fe0 20 61 20 76 6f 69 64 2a 20 74 6f 20 62 65 0a 20   a void* to be. 
23ff0 20 2a 2a 20 63 61 73 74 20 69 6e 74 6f 20 61 20   ** cast into a 
24000 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e  pointer to a fun
24010 63 74 69 6f 6e 2e 20 20 41 6e 64 20 79 65 74 20  ction.  And yet 
24020 74 68 65 20 6c 69 62 72 61 72 79 20 64 6c 73 79  the library dlsy
24030 6d 28 29 20 72 6f 75 74 69 6e 65 0a 20 20 2a 2a  m() routine.  **
24040 20 72 65 74 75 72 6e 73 20 61 20 76 6f 69 64 2a   returns a void*
24050 20 77 68 69 63 68 20 69 73 20 72 65 61 6c 6c 79   which is really
24060 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
24070 66 75 6e 63 74 69 6f 6e 2e 20 20 53 6f 20 68 6f  function.  So ho
24080 77 20 64 6f 20 77 65 0a 20 20 2a 2a 20 75 73 65  w do we.  ** use
24090 20 64 6c 73 79 6d 28 29 20 77 69 74 68 20 2d 70   dlsym() with -p
240a0 65 64 61 6e 74 69 63 2d 65 72 72 6f 72 73 3f 0a  edantic-errors?.
240b0 20 20 2a 2a 0a 20 20 2a 2a 20 56 61 72 69 61 62    **.  ** Variab
240c0 6c 65 20 78 20 62 65 6c 6f 77 20 69 73 20 64 65  le x below is de
240d0 66 69 6e 65 64 20 74 6f 20 62 65 20 61 20 70 6f  fined to be a po
240e0 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74  inter to a funct
240f0 69 6f 6e 20 74 61 6b 69 6e 67 0a 20 20 2a 2a 20  ion taking.  ** 
24100 70 61 72 61 6d 65 74 65 72 73 20 76 6f 69 64 2a  parameters void*
24110 20 61 6e 64 20 63 6f 6e 73 74 20 63 68 61 72 2a   and const char*
24120 20 61 6e 64 20 72 65 74 75 72 6e 69 6e 67 20 61   and returning a
24130 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 75   pointer to a fu
24140 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 57 65 20  nction..  ** We 
24150 69 6e 69 74 69 61 6c 69 7a 65 20 78 20 62 79 20  initialize x by 
24160 61 73 73 69 67 6e 69 6e 67 20 69 74 20 61 20 70  assigning it a p
24170 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 64 6c  ointer to the dl
24180 73 79 6d 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a  sym() function..
24190 20 20 2a 2a 20 28 54 68 61 74 20 61 73 73 69 67    ** (That assig
241a0 6e 6d 65 6e 74 20 72 65 71 75 69 72 65 73 20 61  nment requires a
241b0 20 63 61 73 74 2e 29 20 20 54 68 65 6e 20 77 65   cast.)  Then we
241c0 20 63 61 6c 6c 20 74 68 65 20 66 75 6e 63 74 69   call the functi
241d0 6f 6e 20 74 68 61 74 0a 20 20 2a 2a 20 78 20 70  on that.  ** x p
241e0 6f 69 6e 74 73 20 74 6f 2e 20 20 0a 20 20 2a 2a  oints to.  .  **
241f0 0a 20 20 2a 2a 20 54 68 69 73 20 77 6f 72 6b 2d  .  ** This work-
24200 61 72 6f 75 6e 64 20 69 73 20 75 6e 6c 69 6b 65  around is unlike
24210 6c 79 20 74 6f 20 77 6f 72 6b 20 63 6f 72 72 65  ly to work corre
24220 63 74 6c 79 20 6f 6e 20 61 6e 79 20 73 79 73 74  ctly on any syst
24230 65 6d 20 77 68 65 72 65 0a 20 20 2a 2a 20 79 6f  em where.  ** yo
24240 75 20 72 65 61 6c 6c 79 20 63 61 6e 6e 6f 74 20  u really cannot 
24250 63 61 73 74 20 61 20 66 75 6e 63 74 69 6f 6e 20  cast a function 
24260 70 6f 69 6e 74 65 72 20 69 6e 74 6f 20 76 6f 69  pointer into voi
24270 64 2a 2e 20 20 42 75 74 20 74 68 65 6e 2c 20 6f  d*.  But then, o
24280 6e 20 74 68 65 0a 20 20 2a 2a 20 6f 74 68 65 72  n the.  ** other
24290 20 68 61 6e 64 2c 20 64 6c 73 79 6d 28 29 20 77   hand, dlsym() w
242a0 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20  ill not work on 
242b0 73 75 63 68 20 61 20 73 79 73 74 65 6d 20 65 69  such a system ei
242c0 74 68 65 72 2c 20 73 6f 20 77 65 20 68 61 76 65  ther, so we have
242d0 0a 20 20 2a 2a 20 6e 6f 74 20 72 65 61 6c 6c 79  .  ** not really
242e0 20 6c 6f 73 74 20 61 6e 79 74 68 69 6e 67 2e 0a   lost anything..
242f0 20 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 28 2a    */.  void (*(*
24300 78 29 28 76 6f 69 64 2a 2c 63 6f 6e 73 74 20 63  x)(void*,const c
24310 68 61 72 2a 29 29 28 76 6f 69 64 29 3b 0a 20 20  har*))(void);.  
24320 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
24330 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 78 20 3d  (NotUsed);.  x =
24340 20 28 76 6f 69 64 28 2a 28 2a 29 28 76 6f 69 64   (void(*(*)(void
24350 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 29 28  *,const char*))(
24360 76 6f 69 64 29 29 64 6c 73 79 6d 3b 0a 20 20 72  void))dlsym;.  r
24370 65 74 75 72 6e 20 28 2a 78 29 28 70 2c 20 7a 53  eturn (*x)(p, zS
24380 79 6d 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  ym);.}.static vo
24390 69 64 20 75 6e 69 78 44 6c 43 6c 6f 73 65 28 73  id unixDlClose(s
243a0 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55  qlite3_vfs *NotU
243b0 73 65 64 2c 20 76 6f 69 64 20 2a 70 48 61 6e 64  sed, void *pHand
243c0 6c 65 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  le){.  UNUSED_PA
243d0 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
243e0 3b 0a 20 20 64 6c 63 6c 6f 73 65 28 70 48 61 6e  ;.  dlclose(pHan
243f0 64 6c 65 29 3b 0a 7d 0a 23 65 6c 73 65 20 2f 2a  dle);.}.#else /*
24400 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   if SQLITE_OMIT_
24410 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 20 69  LOAD_EXTENSION i
24420 73 20 64 65 66 69 6e 65 64 3a 20 2a 2f 0a 20 20  s defined: */.  
24430 23 64 65 66 69 6e 65 20 75 6e 69 78 44 6c 4f 70  #define unixDlOp
24440 65 6e 20 20 30 0a 20 20 23 64 65 66 69 6e 65 20  en  0.  #define 
24450 75 6e 69 78 44 6c 45 72 72 6f 72 20 30 0a 20 20  unixDlError 0.  
24460 23 64 65 66 69 6e 65 20 75 6e 69 78 44 6c 53 79  #define unixDlSy
24470 6d 20 20 20 30 0a 20 20 23 64 65 66 69 6e 65 20  m   0.  #define 
24480 75 6e 69 78 44 6c 43 6c 6f 73 65 20 30 0a 23 65  unixDlClose 0.#e
24490 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  ndif../*.** Writ
244a0 65 20 6e 42 75 66 20 62 79 74 65 73 20 6f 66 20  e nBuf bytes of 
244b0 72 61 6e 64 6f 6d 20 64 61 74 61 20 74 6f 20 74  random data to t
244c0 68 65 20 73 75 70 70 6c 69 65 64 20 62 75 66 66  he supplied buff
244d0 65 72 20 7a 42 75 66 2e 0a 2a 2f 0a 73 74 61 74  er zBuf..*/.stat
244e0 69 63 20 69 6e 74 20 75 6e 69 78 52 61 6e 64 6f  ic int unixRando
244f0 6d 6e 65 73 73 28 73 71 6c 69 74 65 33 5f 76 66  mness(sqlite3_vf
24500 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20  s *NotUsed, int 
24510 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66  nBuf, char *zBuf
24520 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
24530 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
24540 20 20 61 73 73 65 72 74 28 28 73 69 7a 65 5f 74    assert((size_t
24550 29 6e 42 75 66 3e 3d 28 73 69 7a 65 6f 66 28 74  )nBuf>=(sizeof(t
24560 69 6d 65 5f 74 29 2b 73 69 7a 65 6f 66 28 69 6e  ime_t)+sizeof(in
24570 74 29 29 29 3b 0a 0a 20 20 2f 2a 20 57 65 20 68  t)));..  /* We h
24580 61 76 65 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a  ave to initializ
24590 65 20 7a 42 75 66 20 74 6f 20 70 72 65 76 65 6e  e zBuf to preven
245a0 74 20 76 61 6c 67 72 69 6e 64 20 66 72 6f 6d 20  t valgrind from 
245b0 72 65 70 6f 72 74 69 6e 67 0a 20 20 2a 2a 20 65  reporting.  ** e
245c0 72 72 6f 72 73 2e 20 20 54 68 65 20 72 65 70 6f  rrors.  The repo
245d0 72 74 73 20 69 73 73 75 65 64 20 62 79 20 76 61  rts issued by va
245e0 6c 67 72 69 6e 64 20 61 72 65 20 69 6e 63 6f 72  lgrind are incor
245f0 72 65 63 74 20 2d 20 77 65 20 77 6f 75 6c 64 0a  rect - we would.
24600 20 20 2a 2a 20 70 72 65 66 65 72 20 74 68 61 74    ** prefer that
24610 20 74 68 65 20 72 61 6e 64 6f 6d 6e 65 73 73 20   the randomness 
24620 62 65 20 69 6e 63 72 65 61 73 65 64 20 62 79 20  be increased by 
24630 6d 61 6b 69 6e 67 20 75 73 65 20 6f 66 20 74 68  making use of th
24640 65 0a 20 20 2a 2a 20 75 6e 69 6e 69 74 69 61 6c  e.  ** uninitial
24650 69 7a 65 64 20 73 70 61 63 65 20 69 6e 20 7a 42  ized space in zB
24660 75 66 20 2d 20 62 75 74 20 76 61 6c 67 72 69 6e  uf - but valgrin
24670 64 20 65 72 72 6f 72 73 20 74 65 6e 64 20 74 6f  d errors tend to
24680 20 77 6f 72 72 79 0a 20 20 2a 2a 20 73 6f 6d 65   worry.  ** some
24690 20 75 73 65 72 73 2e 20 20 52 61 74 68 65 72 20   users.  Rather 
246a0 74 68 61 6e 20 61 72 67 75 65 2c 20 69 74 20 73  than argue, it s
246b0 65 65 6d 73 20 65 61 73 69 65 72 20 6a 75 73 74  eems easier just
246c0 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 0a 20   to initialize. 
246d0 20 2a 2a 20 74 68 65 20 77 68 6f 6c 65 20 61 72   ** the whole ar
246e0 72 61 79 20 61 6e 64 20 73 69 6c 65 6e 63 65 20  ray and silence 
246f0 76 61 6c 67 72 69 6e 64 2c 20 65 76 65 6e 20 69  valgrind, even i
24700 66 20 74 68 61 74 20 6d 65 61 6e 73 20 6c 65 73  f that means les
24710 73 20 72 61 6e 64 6f 6d 6e 65 73 73 0a 20 20 2a  s randomness.  *
24720 2a 20 69 6e 20 74 68 65 20 72 61 6e 64 6f 6d 20  * in the random 
24730 73 65 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  seed..  **.  ** 
24740 57 68 65 6e 20 74 65 73 74 69 6e 67 2c 20 69 6e  When testing, in
24750 69 74 69 61 6c 69 7a 69 6e 67 20 7a 42 75 66 5b  itializing zBuf[
24760 5d 20 74 6f 20 7a 65 72 6f 20 69 73 20 61 6c 6c  ] to zero is all
24770 20 77 65 20 64 6f 2e 20 20 54 68 61 74 20 6d 65   we do.  That me
24780 61 6e 73 0a 20 20 2a 2a 20 74 68 61 74 20 77 65  ans.  ** that we
24790 20 61 6c 77 61 79 73 20 75 73 65 20 74 68 65 20   always use the 
247a0 73 61 6d 65 20 72 61 6e 64 6f 6d 20 6e 75 6d 62  same random numb
247b0 65 72 20 73 65 71 75 65 6e 63 65 2e 20 20 54 68  er sequence.  Th
247c0 69 73 20 6d 61 6b 65 73 20 74 68 65 0a 20 20 2a  is makes the.  *
247d0 2a 20 74 65 73 74 73 20 72 65 70 65 61 74 61 62  * tests repeatab
247e0 6c 65 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65  le..  */.  memse
247f0 74 28 7a 42 75 66 2c 20 30 2c 20 6e 42 75 66 29  t(zBuf, 0, nBuf)
24800 3b 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ;.#if !defined(S
24810 51 4c 49 54 45 5f 54 45 53 54 29 0a 20 20 7b 0a  QLITE_TEST).  {.
24820 20 20 20 20 69 6e 74 20 70 69 64 2c 20 66 64 3b      int pid, fd;
24830 0a 20 20 20 20 66 64 20 3d 20 6f 70 65 6e 28 22  .    fd = open("
24840 2f 64 65 76 2f 75 72 61 6e 64 6f 6d 22 2c 20 4f  /dev/urandom", O
24850 5f 52 44 4f 4e 4c 59 29 3b 0a 20 20 20 20 69 66  _RDONLY);.    if
24860 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 20 20  ( fd<0 ){.      
24870 74 69 6d 65 5f 74 20 74 3b 0a 20 20 20 20 20 20  time_t t;.      
24880 74 69 6d 65 28 26 74 29 3b 0a 20 20 20 20 20 20  time(&t);.      
24890 6d 65 6d 63 70 79 28 7a 42 75 66 2c 20 26 74 2c  memcpy(zBuf, &t,
248a0 20 73 69 7a 65 6f 66 28 74 29 29 3b 0a 20 20 20   sizeof(t));.   
248b0 20 20 20 70 69 64 20 3d 20 67 65 74 70 69 64 28     pid = getpid(
248c0 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  );.      memcpy(
248d0 26 7a 42 75 66 5b 73 69 7a 65 6f 66 28 74 29 5d  &zBuf[sizeof(t)]
248e0 2c 20 26 70 69 64 2c 20 73 69 7a 65 6f 66 28 70  , &pid, sizeof(p
248f0 69 64 29 29 3b 0a 20 20 20 20 20 20 61 73 73 65  id));.      asse
24900 72 74 28 20 73 69 7a 65 6f 66 28 74 29 2b 73 69  rt( sizeof(t)+si
24910 7a 65 6f 66 28 70 69 64 29 3c 3d 28 73 69 7a 65  zeof(pid)<=(size
24920 5f 74 29 6e 42 75 66 20 29 3b 0a 20 20 20 20 20  _t)nBuf );.     
24930 20 6e 42 75 66 20 3d 20 73 69 7a 65 6f 66 28 74   nBuf = sizeof(t
24940 29 20 2b 20 73 69 7a 65 6f 66 28 70 69 64 29 3b  ) + sizeof(pid);
24950 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
24960 20 20 6e 42 75 66 20 3d 20 72 65 61 64 28 66 64    nBuf = read(fd
24970 2c 20 7a 42 75 66 2c 20 6e 42 75 66 29 3b 0a 20  , zBuf, nBuf);. 
24980 20 20 20 20 20 63 6c 6f 73 65 28 66 64 29 3b 0a       close(fd);.
24990 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
249a0 0a 20 20 72 65 74 75 72 6e 20 6e 42 75 66 3b 0a  .  return nBuf;.
249b0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20  }.../*.** Sleep 
249c0 66 6f 72 20 61 20 6c 69 74 74 6c 65 20 77 68 69  for a little whi
249d0 6c 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  le.  Return the 
249e0 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65 20 73  amount of time s
249f0 6c 65 70 74 2e 0a 2a 2a 20 54 68 65 20 61 72 67  lept..** The arg
24a00 75 6d 65 6e 74 20 69 73 20 74 68 65 20 6e 75 6d  ument is the num
24a10 62 65 72 20 6f 66 20 6d 69 63 72 6f 73 65 63 6f  ber of microseco
24a20 6e 64 73 20 77 65 20 77 61 6e 74 20 74 6f 20 73  nds we want to s
24a30 6c 65 65 70 2e 0a 2a 2a 20 54 68 65 20 72 65 74  leep..** The ret
24a40 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74 68 65  urn value is the
24a50 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 63 72 6f   number of micro
24a60 73 65 63 6f 6e 64 73 20 6f 66 20 73 6c 65 65 70  seconds of sleep
24a70 20 61 63 74 75 61 6c 6c 79 0a 2a 2a 20 72 65 71   actually.** req
24a80 75 65 73 74 65 64 20 66 72 6f 6d 20 74 68 65 20  uested from the 
24a90 75 6e 64 65 72 6c 79 69 6e 67 20 6f 70 65 72 61  underlying opera
24aa0 74 69 6e 67 20 73 79 73 74 65 6d 2c 20 61 20 6e  ting system, a n
24ab0 75 6d 62 65 72 20 77 68 69 63 68 0a 2a 2a 20 6d  umber which.** m
24ac0 69 67 68 74 20 62 65 20 67 72 65 61 74 65 72 20  ight be greater 
24ad0 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
24ae0 20 74 68 65 20 61 72 67 75 6d 65 6e 74 2c 20 62   the argument, b
24af0 75 74 20 6e 6f 74 20 6c 65 73 73 0a 2a 2a 20 74  ut not less.** t
24b00 68 61 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74  han the argument
24b10 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
24b20 75 6e 69 78 53 6c 65 65 70 28 73 71 6c 69 74 65  unixSleep(sqlite
24b30 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20  3_vfs *NotUsed, 
24b40 69 6e 74 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73  int microseconds
24b50 29 7b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b  ){.#if OS_VXWORK
24b60 53 0a 20 20 73 74 72 75 63 74 20 74 69 6d 65 73  S.  struct times
24b70 70 65 63 20 73 70 3b 0a 0a 20 20 73 70 2e 74 76  pec sp;..  sp.tv
24b80 5f 73 65 63 20 3d 20 6d 69 63 72 6f 73 65 63 6f  _sec = microseco
24b90 6e 64 73 20 2f 20 31 30 30 30 30 30 30 3b 0a 20  nds / 1000000;. 
24ba0 20 73 70 2e 74 76 5f 6e 73 65 63 20 3d 20 28 6d   sp.tv_nsec = (m
24bb0 69 63 72 6f 73 65 63 6f 6e 64 73 20 25 20 31 30  icroseconds % 10
24bc0 30 30 30 30 30 29 20 2a 20 31 30 30 30 3b 0a 20  00000) * 1000;. 
24bd0 20 6e 61 6e 6f 73 6c 65 65 70 28 26 73 70 2c 20   nanosleep(&sp, 
24be0 4e 55 4c 4c 29 3b 0a 20 20 55 4e 55 53 45 44 5f  NULL);.  UNUSED_
24bf0 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
24c00 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 6d 69 63  d);.  return mic
24c10 72 6f 73 65 63 6f 6e 64 73 3b 0a 23 65 6c 69 66  roseconds;.#elif
24c20 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f 55 53   defined(HAVE_US
24c30 4c 45 45 50 29 20 26 26 20 48 41 56 45 5f 55 53  LEEP) && HAVE_US
24c40 4c 45 45 50 0a 20 20 75 73 6c 65 65 70 28 6d 69  LEEP.  usleep(mi
24c50 63 72 6f 73 65 63 6f 6e 64 73 29 3b 0a 20 20 55  croseconds);.  U
24c60 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
24c70 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75  NotUsed);.  retu
24c80 72 6e 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 3b  rn microseconds;
24c90 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 73 65 63  .#else.  int sec
24ca0 6f 6e 64 73 20 3d 20 28 6d 69 63 72 6f 73 65 63  onds = (microsec
24cb0 6f 6e 64 73 2b 39 39 39 39 39 39 29 2f 31 30 30  onds+999999)/100
24cc0 30 30 30 30 3b 0a 20 20 73 6c 65 65 70 28 73 65  0000;.  sleep(se
24cd0 63 6f 6e 64 73 29 3b 0a 20 20 55 4e 55 53 45 44  conds);.  UNUSED
24ce0 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
24cf0 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 65  ed);.  return se
24d00 63 6f 6e 64 73 2a 31 30 30 30 30 30 30 3b 0a 23  conds*1000000;.#
24d10 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  endif.}../*.** T
24d20 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72  he following var
24d30 69 61 62 6c 65 2c 20 69 66 20 73 65 74 20 74 6f  iable, if set to
24d40 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75   a non-zero valu
24d50 65 2c 20 69 73 20 69 6e 74 65 72 70 72 65 74 65  e, is interprete
24d60 64 20 61 73 0a 2a 2a 20 74 68 65 20 6e 75 6d 62  d as.** the numb
24d70 65 72 20 6f 66 20 73 65 63 6f 6e 64 73 20 73 69  er of seconds si
24d80 6e 63 65 20 31 39 37 30 20 61 6e 64 20 69 73 20  nce 1970 and is 
24d90 75 73 65 64 20 74 6f 20 73 65 74 20 74 68 65 20  used to set the 
24da0 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20 73 71 6c  result of.** sql
24db0 69 74 65 33 4f 73 43 75 72 72 65 6e 74 54 69 6d  ite3OsCurrentTim
24dc0 65 28 29 20 64 75 72 69 6e 67 20 74 65 73 74 69  e() during testi
24dd0 6e 67 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  ng..*/.#ifdef SQ
24de0 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71  LITE_TEST.int sq
24df0 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69  lite3_current_ti
24e00 6d 65 20 3d 20 30 3b 20 20 2f 2a 20 46 61 6b 65  me = 0;  /* Fake
24e10 20 73 79 73 74 65 6d 20 74 69 6d 65 20 69 6e 20   system time in 
24e20 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 31 39  seconds since 19
24e30 37 30 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f  70. */.#endif../
24e40 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 63 75  *.** Find the cu
24e50 72 72 65 6e 74 20 74 69 6d 65 20 28 69 6e 20 55  rrent time (in U
24e60 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e  niversal Coordin
24e70 61 74 65 64 20 54 69 6d 65 29 2e 20 20 57 72 69  ated Time).  Wri
24e80 74 65 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e  te the.** curren
24e90 74 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20  t time and date 
24ea0 61 73 20 61 20 4a 75 6c 69 61 6e 20 44 61 79 20  as a Julian Day 
24eb0 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70 72 4e  number into *prN
24ec0 6f 77 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e  ow and.** return
24ed0 20 30 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66   0.  Return 1 if
24ee0 20 74 68 65 20 74 69 6d 65 20 61 6e 64 20 64 61   the time and da
24ef0 74 65 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75  te cannot be fou
24f00 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nd..*/.static in
24f10 74 20 75 6e 69 78 43 75 72 72 65 6e 74 54 69 6d  t unixCurrentTim
24f20 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e  e(sqlite3_vfs *N
24f30 6f 74 55 73 65 64 2c 20 64 6f 75 62 6c 65 20 2a  otUsed, double *
24f40 70 72 4e 6f 77 29 7b 0a 23 69 66 20 64 65 66 69  prNow){.#if defi
24f50 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
24f60 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 29 0a  FLOATING_POINT).
24f70 20 20 74 69 6d 65 5f 74 20 74 3b 0a 20 20 74 69    time_t t;.  ti
24f80 6d 65 28 26 74 29 3b 0a 20 20 2a 70 72 4e 6f 77  me(&t);.  *prNow
24f90 20 3d 20 28 28 28 73 71 6c 69 74 65 33 5f 69 6e   = (((sqlite3_in
24fa0 74 36 34 29 74 29 2f 38 36 34 30 20 2b 20 32 34  t64)t)/8640 + 24
24fb0 34 30 35 38 37 35 29 2f 31 30 3b 0a 23 65 6c 69  405875)/10;.#eli
24fc0 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 47 45 54  f defined(NO_GET
24fd0 54 4f 44 29 0a 20 20 74 69 6d 65 5f 74 20 74 3b  TOD).  time_t t;
24fe0 0a 20 20 74 69 6d 65 28 26 74 29 3b 0a 20 20 2a  .  time(&t);.  *
24ff0 70 72 4e 6f 77 20 3d 20 74 2f 38 36 34 30 30 2e  prNow = t/86400.
25000 30 20 2b 20 32 34 34 30 35 38 37 2e 35 3b 0a 23  0 + 2440587.5;.#
25010 65 6c 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  elif OS_VXWORKS.
25020 20 20 73 74 72 75 63 74 20 74 69 6d 65 73 70 65    struct timespe
25030 63 20 73 4e 6f 77 3b 0a 20 20 63 6c 6f 63 6b 5f  c sNow;.  clock_
25040 67 65 74 74 69 6d 65 28 43 4c 4f 43 4b 5f 52 45  gettime(CLOCK_RE
25050 41 4c 54 49 4d 45 2c 20 26 73 4e 6f 77 29 3b 0a  ALTIME, &sNow);.
25060 20 20 2a 70 72 4e 6f 77 20 3d 20 32 34 34 30 35    *prNow = 24405
25070 38 37 2e 35 20 2b 20 73 4e 6f 77 2e 74 76 5f 73  87.5 + sNow.tv_s
25080 65 63 2f 38 36 34 30 30 2e 30 20 2b 20 73 4e 6f  ec/86400.0 + sNo
25090 77 2e 74 76 5f 6e 73 65 63 2f 38 36 34 30 30 30  w.tv_nsec/864000
250a0 30 30 30 30 30 30 30 30 2e 30 3b 0a 23 65 6c 73  00000000.0;.#els
250b0 65 0a 20 20 73 74 72 75 63 74 20 74 69 6d 65 76  e.  struct timev
250c0 61 6c 20 73 4e 6f 77 3b 0a 20 20 67 65 74 74 69  al sNow;.  getti
250d0 6d 65 6f 66 64 61 79 28 26 73 4e 6f 77 2c 20 30  meofday(&sNow, 0
250e0 29 3b 0a 20 20 2a 70 72 4e 6f 77 20 3d 20 32 34  );.  *prNow = 24
250f0 34 30 35 38 37 2e 35 20 2b 20 73 4e 6f 77 2e 74  40587.5 + sNow.t
25100 76 5f 73 65 63 2f 38 36 34 30 30 2e 30 20 2b 20  v_sec/86400.0 + 
25110 73 4e 6f 77 2e 74 76 5f 75 73 65 63 2f 38 36 34  sNow.tv_usec/864
25120 30 30 30 30 30 30 30 30 2e 30 3b 0a 23 65 6e 64  00000000.0;.#end
25130 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  if..#ifdef SQLIT
25140 45 5f 54 45 53 54 0a 20 20 69 66 28 20 73 71 6c  E_TEST.  if( sql
25150 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d  ite3_current_tim
25160 65 20 29 7b 0a 20 20 20 20 2a 70 72 4e 6f 77 20  e ){.    *prNow 
25170 3d 20 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e  = sqlite3_curren
25180 74 5f 74 69 6d 65 2f 38 36 34 30 30 2e 30 20 2b  t_time/86400.0 +
25190 20 32 34 34 30 35 38 37 2e 35 3b 0a 20 20 7d 0a   2440587.5;.  }.
251a0 23 65 6e 64 69 66 0a 20 20 55 4e 55 53 45 44 5f  #endif.  UNUSED_
251b0 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
251c0 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a  d);.  return 0;.
251d0 7d 0a 0a 2f 2a 0a 2a 2a 20 57 65 20 61 64 64 65  }../*.** We adde
251e0 64 20 74 68 65 20 78 47 65 74 4c 61 73 74 45 72  d the xGetLastEr
251f0 72 6f 72 28 29 20 6d 65 74 68 6f 64 20 77 69 74  ror() method wit
25200 68 20 74 68 65 20 69 6e 74 65 6e 74 69 6f 6e 20  h the intention 
25210 6f 66 20 70 72 6f 76 69 64 69 6e 67 0a 2a 2a 20  of providing.** 
25220 62 65 74 74 65 72 20 6c 6f 77 2d 6c 65 76 65 6c  better low-level
25230 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20   error messages 
25240 77 68 65 6e 20 6f 70 65 72 61 74 69 6e 67 2d 73  when operating-s
25250 79 73 74 65 6d 20 70 72 6f 62 6c 65 6d 73 20 63  ystem problems c
25260 6f 6d 65 20 75 70 0a 2a 2a 20 64 75 72 69 6e 67  ome up.** during
25270 20 53 51 4c 69 74 65 20 6f 70 65 72 61 74 69 6f   SQLite operatio
25280 6e 2e 20 20 42 75 74 20 73 6f 20 66 61 72 2c 20  n.  But so far, 
25290 6e 6f 6e 65 20 6f 66 20 74 68 61 74 20 68 61 73  none of that has
252a0 20 62 65 65 6e 20 69 6d 70 6c 65 6d 65 6e 74 65   been implemente
252b0 64 0a 2a 2a 20 69 6e 20 74 68 65 20 63 6f 72 65  d.** in the core
252c0 2e 20 20 53 6f 20 74 68 69 73 20 72 6f 75 74 69  .  So this routi
252d0 6e 65 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c  ne is never call
252e0 65 64 2e 20 20 46 6f 72 20 6e 6f 77 2c 20 69 74  ed.  For now, it
252f0 20 69 73 20 6d 65 72 65 6c 79 0a 2a 2a 20 61 20   is merely.** a 
25300 70 6c 61 63 65 2d 68 6f 6c 64 65 72 2e 0a 2a 2f  place-holder..*/
25310 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
25320 47 65 74 4c 61 73 74 45 72 72 6f 72 28 73 71 6c  GetLastError(sql
25330 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65  ite3_vfs *NotUse
25340 64 2c 20 69 6e 74 20 4e 6f 74 55 73 65 64 32 2c  d, int NotUsed2,
25350 20 63 68 61 72 20 2a 4e 6f 74 55 73 65 64 33 29   char *NotUsed3)
25360 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
25370 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
25380 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
25390 52 28 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 55  R(NotUsed2);.  U
253a0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
253b0 4e 6f 74 55 73 65 64 33 29 3b 0a 20 20 72 65 74  NotUsed3);.  ret
253c0 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 2a  urn 0;.}../*.***
253d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
253e0 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 73 71 6c  ***** End of sql
253f0 69 74 65 33 5f 76 66 73 20 6d 65 74 68 6f 64 73  ite3_vfs methods
25400 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
25410 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
25420 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25430 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25440 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25450 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25460 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a  ***********/../*
25470 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25480 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25490 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
254a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
254b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
254c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
254d0 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 50  ******** Begin P
254e0 72 6f 78 79 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a  roxy Locking ***
254f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25500 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
25510 0a 2a 2a 20 50 72 6f 78 79 20 6c 6f 63 6b 69 6e  .** Proxy lockin
25520 67 20 69 73 20 61 20 22 75 62 65 72 2d 6c 6f 63  g is a "uber-loc
25530 6b 69 6e 67 2d 6d 65 74 68 6f 64 22 20 69 6e 20  king-method" in 
25540 74 68 69 73 20 73 65 6e 73 65 3a 20 20 49 74 20  this sense:  It 
25550 75 73 65 73 20 74 68 65 0a 2a 2a 20 6f 74 68 65  uses the.** othe
25560 72 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64  r locking method
25570 73 20 6f 6e 20 73 65 63 6f 6e 64 61 72 79 20 6c  s on secondary l
25580 6f 63 6b 20 66 69 6c 65 73 2e 20 20 50 72 6f 78  ock files.  Prox
25590 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20 61 0a 2a  y locking is a.*
255a0 2a 20 6d 65 74 61 2d 6c 61 79 65 72 20 6f 76 65  * meta-layer ove
255b0 72 20 74 6f 70 20 6f 66 20 74 68 65 20 70 72 69  r top of the pri
255c0 6d 69 74 69 76 65 20 6c 6f 63 6b 69 6e 67 20 69  mitive locking i
255d0 6d 70 6c 65 6d 65 6e 74 65 64 20 61 62 6f 76 65  mplemented above
255e0 2e 20 20 46 6f 72 0a 2a 2a 20 74 68 69 73 20 72  .  For.** this r
255f0 65 61 73 6f 6e 2c 20 74 68 65 20 64 69 76 69 73  eason, the divis
25600 69 6f 6e 20 74 68 61 74 20 69 6d 70 6c 65 6d 65  ion that impleme
25610 6e 74 73 20 6f 66 20 70 72 6f 78 79 20 6c 6f 63  nts of proxy loc
25620 6b 69 6e 67 20 69 73 20 64 65 66 65 72 72 65 64  king is deferred
25630 0a 2a 2a 20 75 6e 74 69 6c 20 6c 61 74 65 20 69  .** until late i
25640 6e 20 74 68 65 20 66 69 6c 65 20 28 68 65 72 65  n the file (here
25650 29 20 61 66 74 65 72 20 61 6c 6c 20 6f 66 20 74  ) after all of t
25660 68 65 20 6f 74 68 65 72 20 49 2f 4f 20 6d 65 74  he other I/O met
25670 68 6f 64 73 20 68 61 76 65 0a 2a 2a 20 62 65 65  hods have.** bee
25680 6e 20 64 65 66 69 6e 65 64 20 2d 20 73 6f 20 74  n defined - so t
25690 68 61 74 20 74 68 65 20 70 72 69 6d 69 74 69 76  hat the primitiv
256a0 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64  e locking method
256b0 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 0a  s are available.
256c0 2a 2a 20 61 73 20 73 65 72 76 69 63 65 73 20 74  ** as services t
256d0 6f 20 68 65 6c 70 20 77 69 74 68 20 74 68 65 20  o help with the 
256e0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
256f0 66 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 2e  f proxy locking.
25700 0a 2a 2a 0a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54  .**.****.**.** T
25710 68 65 20 64 65 66 61 75 6c 74 20 6c 6f 63 6b 69  he default locki
25720 6e 67 20 73 63 68 65 6d 65 73 20 69 6e 20 53 51  ng schemes in SQ
25730 4c 69 74 65 20 75 73 65 20 62 79 74 65 2d 72 61  Lite use byte-ra
25740 6e 67 65 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65  nge locks on the
25750 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c  .** database fil
25760 65 20 74 6f 20 63 6f 6f 72 64 69 6e 61 74 65 20  e to coordinate 
25770 73 61 66 65 2c 20 63 6f 6e 63 75 72 72 65 6e 74  safe, concurrent
25780 20 61 63 63 65 73 73 20 62 79 20 6d 75 6c 74 69   access by multi
25790 70 6c 65 20 72 65 61 64 65 72 73 0a 2a 2a 20 61  ple readers.** a
257a0 6e 64 20 77 72 69 74 65 72 73 20 5b 68 74 74 70  nd writers [http
257b0 3a 2f 2f 73 71 6c 69 74 65 2e 6f 72 67 2f 6c 6f  ://sqlite.org/lo
257c0 63 6b 69 6e 67 76 33 2e 68 74 6d 6c 5d 2e 20 20  ckingv3.html].  
257d0 54 68 65 20 66 69 76 65 20 66 69 6c 65 20 6c 6f  The five file lo
257e0 63 6b 69 6e 67 0a 2a 2a 20 73 74 61 74 65 73 20  cking.** states 
257f0 28 55 4e 4c 4f 43 4b 45 44 2c 20 50 45 4e 44 49  (UNLOCKED, PENDI
25800 4e 47 2c 20 53 48 41 52 45 44 2c 20 52 45 53 45  NG, SHARED, RESE
25810 52 56 45 44 2c 20 45 58 43 4c 55 53 49 56 45 29  RVED, EXCLUSIVE)
25820 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64   are implemented
25830 0a 2a 2a 20 61 73 20 50 4f 53 49 58 20 72 65 61  .** as POSIX rea
25840 64 20 26 20 77 72 69 74 65 20 6c 6f 63 6b 73 20  d & write locks 
25850 6f 76 65 72 20 66 69 78 65 64 20 73 65 74 20 6f  over fixed set o
25860 66 20 6c 6f 63 61 74 69 6f 6e 73 20 28 76 69 61  f locations (via
25870 20 66 73 63 74 6c 29 2c 0a 2a 2a 20 6f 6e 20 41   fsctl),.** on A
25880 46 50 20 61 6e 64 20 53 4d 42 20 6f 6e 6c 79 20  FP and SMB only 
25890 65 78 63 6c 75 73 69 76 65 20 62 79 74 65 2d 72  exclusive byte-r
258a0 61 6e 67 65 20 6c 6f 63 6b 73 20 61 72 65 20 61  ange locks are a
258b0 76 61 69 6c 61 62 6c 65 20 76 69 61 20 66 73 63  vailable via fsc
258c0 74 6c 0a 2a 2a 20 77 69 74 68 20 5f 49 4f 57 52  tl.** with _IOWR
258d0 28 27 7a 27 2c 20 32 33 2c 20 73 74 72 75 63 74  ('z', 23, struct
258e0 20 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42   ByteRangeLockPB
258f0 32 29 20 74 6f 20 74 72 61 63 6b 20 74 68 65 20  2) to track the 
25900 73 61 6d 65 20 35 20 73 74 61 74 65 73 2e 0a 2a  same 5 states..*
25910 2a 20 54 6f 20 73 69 6d 75 6c 61 74 65 20 61 20  * To simulate a 
25920 46 5f 52 44 4c 43 4b 20 6f 6e 20 74 68 65 20 73  F_RDLCK on the s
25930 68 61 72 65 64 20 72 61 6e 67 65 2c 20 6f 6e 20  hared range, on 
25940 41 46 50 20 61 20 72 61 6e 64 6f 6d 6c 79 20 73  AFP a randomly s
25950 65 6c 65 63 74 65 64 0a 2a 2a 20 61 64 64 72 65  elected.** addre
25960 73 73 20 69 6e 20 74 68 65 20 73 68 61 72 65 64  ss in the shared
25970 20 72 61 6e 67 65 20 69 73 20 74 61 6b 65 6e 20   range is taken 
25980 66 6f 72 20 61 20 53 48 41 52 45 44 20 6c 6f 63  for a SHARED loc
25990 6b 2c 20 74 68 65 20 65 6e 74 69 72 65 0a 2a 2a  k, the entire.**
259a0 20 73 68 61 72 65 64 20 72 61 6e 67 65 20 69 73   shared range is
259b0 20 74 61 6b 65 6e 20 66 6f 72 20 61 6e 20 45 58   taken for an EX
259c0 43 4c 55 53 49 56 45 20 6c 6f 63 6b 29 3a 0a 2a  CLUSIVE lock):.*
259d0 2a 0a 2a 2a 20 20 20 20 20 20 50 45 4e 44 49 4e  *.**      PENDIN
259e0 47 5f 42 59 54 45 20 20 20 20 20 20 20 20 30 78  G_BYTE        0x
259f0 34 30 30 30 30 30 30 30 09 09 20 20 20 09 0a 2a  40000000..   ..*
25a00 2a 20 20 20 20 20 20 52 45 53 45 52 56 45 44 5f  *      RESERVED_
25a10 42 59 54 45 20 20 20 20 20 20 20 30 78 34 30 30  BYTE       0x400
25a20 30 30 30 30 31 0a 2a 2a 20 20 20 20 20 20 53 48  00001.**      SH
25a30 41 52 45 44 5f 52 41 4e 47 45 20 20 20 20 20 20  ARED_RANGE      
25a40 20 20 30 78 34 30 30 30 30 30 30 32 20 2d 3e 20    0x40000002 -> 
25a50 30 78 34 30 30 30 30 32 30 30 0a 2a 2a 0a 2a 2a  0x40000200.**.**
25a60 20 54 68 69 73 20 77 6f 72 6b 73 20 77 65 6c 6c   This works well
25a70 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 66 69   on the local fi
25a80 6c 65 20 73 79 73 74 65 6d 2c 20 62 75 74 20 73  le system, but s
25a90 68 6f 77 73 20 61 20 6e 65 61 72 6c 79 20 31 30  hows a nearly 10
25aa0 30 78 0a 2a 2a 20 73 6c 6f 77 64 6f 77 6e 20 69  0x.** slowdown i
25ab0 6e 20 72 65 61 64 20 70 65 72 66 6f 72 6d 61 6e  n read performan
25ac0 63 65 20 6f 6e 20 41 46 50 20 62 65 63 61 75 73  ce on AFP becaus
25ad0 65 20 74 68 65 20 41 46 50 20 63 6c 69 65 6e 74  e the AFP client
25ae0 20 64 69 73 61 62 6c 65 73 0a 2a 2a 20 74 68 65   disables.** the
25af0 20 72 65 61 64 20 63 61 63 68 65 20 77 68 65 6e   read cache when
25b00 20 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b   byte-range lock
25b10 73 20 61 72 65 20 70 72 65 73 65 6e 74 2e 20 20  s are present.  
25b20 45 6e 61 62 6c 69 6e 67 20 74 68 65 20 72 65 61  Enabling the rea
25b30 64 0a 2a 2a 20 63 61 63 68 65 20 65 78 70 6f 73  d.** cache expos
25b40 65 73 20 61 20 63 61 63 68 65 20 63 6f 68 65 72  es a cache coher
25b50 65 6e 63 79 20 70 72 6f 62 6c 65 6d 20 74 68 61  ency problem tha
25b60 74 20 69 73 20 70 72 65 73 65 6e 74 20 6f 6e 20  t is present on 
25b70 61 6c 6c 20 4f 53 20 58 0a 2a 2a 20 73 75 70 70  all OS X.** supp
25b80 6f 72 74 65 64 20 6e 65 74 77 6f 72 6b 20 66 69  orted network fi
25b90 6c 65 20 73 79 73 74 65 6d 73 2e 20 20 4e 46 53  le systems.  NFS
25ba0 20 61 6e 64 20 41 46 50 20 62 6f 74 68 20 6f 62   and AFP both ob
25bb0 73 65 72 76 65 20 74 68 65 0a 2a 2a 20 63 6c 6f  serve the.** clo
25bc0 73 65 2d 74 6f 2d 6f 70 65 6e 20 73 65 6d 61 6e  se-to-open seman
25bd0 74 69 63 73 20 66 6f 72 20 65 6e 73 75 72 69 6e  tics for ensurin
25be0 67 20 63 61 63 68 65 20 63 6f 68 65 72 65 6e 63  g cache coherenc
25bf0 79 0a 2a 2a 20 5b 68 74 74 70 3a 2f 2f 6e 66 73  y.** [http://nfs
25c00 2e 73 6f 75 72 63 65 66 6f 72 67 65 2e 6e 65 74  .sourceforge.net
25c10 2f 23 66 61 71 5f 61 38 5d 2c 20 77 68 69 63 68  /#faq_a8], which
25c20 20 64 6f 65 73 20 6e 6f 74 20 65 66 66 65 63 74   does not effect
25c30 69 76 65 6c 79 0a 2a 2a 20 61 64 64 72 65 73 73  ively.** address
25c40 20 74 68 65 20 72 65 71 75 69 72 65 6d 65 6e 74   the requirement
25c50 73 20 66 6f 72 20 63 6f 6e 63 75 72 72 65 6e 74  s for concurrent
25c60 20 64 61 74 61 62 61 73 65 20 61 63 63 65 73 73   database access
25c70 20 62 79 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20   by multiple.** 
25c80 72 65 61 64 65 72 73 20 61 6e 64 20 77 72 69 74  readers and writ
25c90 65 72 73 0a 2a 2a 20 5b 68 74 74 70 3a 2f 2f 77  ers.** [http://w
25ca0 77 77 2e 6e 61 62 62 6c 65 2e 63 6f 6d 2f 53 51  ww.nabble.com/SQ
25cb0 4c 69 74 65 2d 6f 6e 2d 4e 46 53 2d 63 61 63 68  Lite-on-NFS-cach
25cc0 65 2d 63 6f 68 65 72 65 6e 63 79 2d 74 64 31 35  e-coherency-td15
25cd0 36 35 35 37 30 31 2e 68 74 6d 6c 5d 2e 0a 2a 2a  655701.html]..**
25ce0 0a 2a 2a 20 54 6f 20 61 64 64 72 65 73 73 20 74  .** To address t
25cf0 68 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 61  he performance a
25d00 6e 64 20 63 61 63 68 65 20 63 6f 68 65 72 65 6e  nd cache coheren
25d10 63 79 20 69 73 73 75 65 73 2c 20 70 72 6f 78 79  cy issues, proxy
25d20 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a   file locking.**
25d30 20 63 68 61 6e 67 65 73 20 74 68 65 20 77 61 79   changes the way
25d40 20 64 61 74 61 62 61 73 65 20 61 63 63 65 73 73   database access
25d50 20 69 73 20 63 6f 6e 74 72 6f 6c 6c 65 64 20 62   is controlled b
25d60 79 20 6c 69 6d 69 74 69 6e 67 20 61 63 63 65 73  y limiting acces
25d70 73 20 74 6f 20 61 0a 2a 2a 20 73 69 6e 67 6c 65  s to a.** single
25d80 20 68 6f 73 74 20 61 74 20 61 20 74 69 6d 65 20   host at a time 
25d90 61 6e 64 20 6d 6f 76 69 6e 67 20 66 69 6c 65 20  and moving file 
25da0 6c 6f 63 6b 73 20 6f 66 66 20 6f 66 20 74 68 65  locks off of the
25db0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 2a   database file.*
25dc0 2a 20 61 6e 64 20 6f 6e 74 6f 20 61 20 70 72 6f  * and onto a pro
25dd0 78 79 20 66 69 6c 65 20 6f 6e 20 74 68 65 20 6c  xy file on the l
25de0 6f 63 61 6c 20 66 69 6c 65 20 73 79 73 74 65 6d  ocal file system
25df0 2e 20 20 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 55 73 69  .  .**.**.** Usi
25e00 6e 67 20 70 72 6f 78 79 20 6c 6f 63 6b 73 0a 2a  ng proxy locks.*
25e10 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  * --------------
25e20 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 43 20 41 50 49 73  ---.**.** C APIs
25e30 0a 2a 2a 0a 2a 2a 20 20 73 71 6c 69 74 65 33 5f  .**.**  sqlite3_
25e40 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c  file_control(db,
25e50 20 64 62 6e 61 6d 65 2c 20 53 51 4c 49 54 45 5f   dbname, SQLITE_
25e60 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c  SET_LOCKPROXYFIL
25e70 45 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  E,.**           
25e80 20 20 20 20 20 20 20 20 20 20 20 20 3c 70 72 6f              <pro
25e90 78 79 5f 70 61 74 68 3e 20 7c 20 22 3a 61 75 74  xy_path> | ":aut
25ea0 6f 3a 22 29 3b 0a 2a 2a 20 20 73 71 6c 69 74 65  o:");.**  sqlite
25eb0 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64  3_file_control(d
25ec0 62 2c 20 64 62 6e 61 6d 65 2c 20 53 51 4c 49 54  b, dbname, SQLIT
25ed0 45 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46  E_GET_LOCKPROXYF
25ee0 49 4c 45 2c 20 26 3c 70 72 6f 78 79 5f 70 61 74  ILE, &<proxy_pat
25ef0 68 3e 29 3b 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 53 51  h>);.**.**.** SQ
25f00 4c 20 70 72 61 67 6d 61 73 0a 2a 2a 0a 2a 2a 20  L pragmas.**.** 
25f10 20 50 52 41 47 4d 41 20 5b 64 61 74 61 62 61 73   PRAGMA [databas
25f20 65 2e 5d 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66 69  e.]lock_proxy_fi
25f30 6c 65 3d 3c 70 72 6f 78 79 5f 70 61 74 68 3e 20  le=<proxy_path> 
25f40 7c 20 3a 61 75 74 6f 3a 0a 2a 2a 20 20 50 52 41  | :auto:.**  PRA
25f50 47 4d 41 20 5b 64 61 74 61 62 61 73 65 2e 5d 6c  GMA [database.]l
25f60 6f 63 6b 5f 70 72 6f 78 79 5f 66 69 6c 65 0a 2a  ock_proxy_file.*
25f70 2a 0a 2a 2a 20 53 70 65 63 69 66 79 69 6e 67 20  *.** Specifying 
25f80 22 3a 61 75 74 6f 3a 22 20 6d 65 61 6e 73 20 74  ":auto:" means t
25f90 68 61 74 20 69 66 20 74 68 65 72 65 20 69 73 20  hat if there is 
25fa0 61 20 63 6f 6e 63 68 20 66 69 6c 65 20 77 69 74  a conch file wit
25fb0 68 20 61 20 6d 61 74 63 68 69 6e 67 0a 2a 2a 20  h a matching.** 
25fc0 68 6f 73 74 20 49 44 20 69 6e 20 69 74 2c 20 74  host ID in it, t
25fd0 68 65 20 70 72 6f 78 79 20 70 61 74 68 20 69 6e  he proxy path in
25fe0 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20   the conch file 
25ff0 77 69 6c 6c 20 62 65 20 75 73 65 64 2c 20 6f 74  will be used, ot
26000 68 65 72 77 69 73 65 0a 2a 2a 20 61 20 70 72 6f  herwise.** a pro
26010 78 79 20 70 61 74 68 20 62 61 73 65 64 20 6f 6e  xy path based on
26020 20 74 68 65 20 75 73 65 72 27 73 20 74 65 6d 70   the user's temp
26030 20 64 69 72 0a 2a 2a 20 28 76 69 61 20 63 6f 6e   dir.** (via con
26040 66 73 74 72 28 5f 43 53 5f 44 41 52 57 49 4e 5f  fstr(_CS_DARWIN_
26050 55 53 45 52 5f 54 45 4d 50 5f 44 49 52 2c 2e 2e  USER_TEMP_DIR,..
26060 2e 29 29 20 77 69 6c 6c 20 62 65 20 75 73 65 64  .)) will be used
26070 20 61 6e 64 20 74 68 65 0a 2a 2a 20 61 63 74 75   and the.** actu
26080 61 6c 20 70 72 6f 78 79 20 66 69 6c 65 20 6e 61  al proxy file na
26090 6d 65 20 69 73 20 67 65 6e 65 72 61 74 65 64 20  me is generated 
260a0 66 72 6f 6d 20 74 68 65 20 6e 61 6d 65 20 61 6e  from the name an
260b0 64 20 70 61 74 68 20 6f 66 20 74 68 65 0a 2a 2a  d path of the.**
260c0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
260d0 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a   For example:.**
260e0 0a 2a 2a 20 20 20 20 20 20 20 46 6f 72 20 64 61  .**       For da
260f0 74 61 62 61 73 65 20 70 61 74 68 20 22 2f 55 73  tabase path "/Us
26100 65 72 73 2f 6d 65 2f 66 6f 6f 2e 64 62 22 20 0a  ers/me/foo.db" .
26110 2a 2a 20 20 20 20 20 20 20 54 68 65 20 6c 6f 63  **       The loc
26120 6b 20 70 61 74 68 20 77 69 6c 6c 20 62 65 20 22  k path will be "
26130 3c 74 6d 70 64 69 72 3e 2f 73 71 6c 69 74 65 70  <tmpdir>/sqlitep
26140 6c 6f 63 6b 73 2f 5f 55 73 65 72 73 5f 6d 65 5f  locks/_Users_me_
26150 66 6f 6f 2e 64 62 3a 61 75 74 6f 3a 22 29 0a 2a  foo.db:auto:").*
26160 2a 0a 2a 2a 20 4f 6e 63 65 20 61 20 6c 6f 63 6b  *.** Once a lock
26170 20 70 72 6f 78 79 20 69 73 20 63 6f 6e 66 69 67   proxy is config
26180 75 72 65 64 20 66 6f 72 20 61 20 64 61 74 61 62  ured for a datab
26190 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2c 20  ase connection, 
261a0 69 74 20 63 61 6e 20 6e 6f 74 0a 2a 2a 20 62 65  it can not.** be
261b0 20 72 65 6d 6f 76 65 64 2c 20 68 6f 77 65 76 65   removed, howeve
261c0 72 20 69 74 20 6d 61 79 20 62 65 20 73 77 69 74  r it may be swit
261d0 63 68 65 64 20 74 6f 20 61 20 64 69 66 66 65 72  ched to a differ
261e0 65 6e 74 20 70 72 6f 78 79 20 70 61 74 68 20 76  ent proxy path v
261f0 69 61 0a 2a 2a 20 74 68 65 20 61 62 6f 76 65 20  ia.** the above 
26200 41 50 49 73 20 28 61 73 73 75 6d 69 6e 67 20 74  APIs (assuming t
26210 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 69 73  he conch file is
26220 20 6e 6f 74 20 62 65 69 6e 67 20 68 65 6c 64 20   not being held 
26230 62 79 20 61 6e 6f 74 68 65 72 0a 2a 2a 20 63 6f  by another.** co
26240 6e 6e 65 63 74 69 6f 6e 20 6f 72 20 70 72 6f 63  nnection or proc
26250 65 73 73 29 2e 20 0a 2a 2a 0a 2a 2a 0a 2a 2a 20  ess). .**.**.** 
26260 48 6f 77 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e  How proxy lockin
26270 67 20 77 6f 72 6b 73 0a 2a 2a 20 2d 2d 2d 2d 2d  g works.** -----
26280 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
26290 2d 2d 0a 2a 2a 0a 2a 2a 20 50 72 6f 78 79 20 66  --.**.** Proxy f
262a0 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 72 65 6c 69  ile locking reli
262b0 65 73 20 70 72 69 6d 61 72 69 6c 79 20 6f 6e 20  es primarily on 
262c0 74 77 6f 20 6e 65 77 20 73 75 70 70 6f 72 74 69  two new supporti
262d0 6e 67 20 66 69 6c 65 73 3a 20 0a 2a 2a 0a 2a 2a  ng files: .**.**
262e0 20 20 20 2a 20 20 63 6f 6e 63 68 20 66 69 6c 65     *  conch file
262f0 20 74 6f 20 6c 69 6d 69 74 20 61 63 63 65 73 73   to limit access
26300 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
26310 20 66 69 6c 65 20 74 6f 20 61 20 73 69 6e 67 6c   file to a singl
26320 65 20 68 6f 73 74 0a 2a 2a 20 20 20 20 20 20 61  e host.**      a
26330 74 20 61 20 74 69 6d 65 0a 2a 2a 0a 2a 2a 20 20  t a time.**.**  
26340 20 2a 20 20 70 72 6f 78 79 20 66 69 6c 65 20 74   *  proxy file t
26350 6f 20 61 63 74 20 61 73 20 61 20 70 72 6f 78 79  o act as a proxy
26360 20 66 6f 72 20 74 68 65 20 61 64 76 69 73 6f 72   for the advisor
26370 79 20 6c 6f 63 6b 73 20 6e 6f 72 6d 61 6c 6c 79  y locks normally
26380 0a 2a 2a 20 20 20 20 20 20 74 61 6b 65 6e 20 6f  .**      taken o
26390 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a  n the database.*
263a0 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e 63 68 20 66  *.** The conch f
263b0 69 6c 65 20 2d 20 74 6f 20 75 73 65 20 61 20 70  ile - to use a p
263c0 72 6f 78 79 20 66 69 6c 65 2c 20 73 71 6c 69 74  roxy file, sqlit
263d0 65 20 6d 75 73 74 20 66 69 72 73 74 20 22 68 6f  e must first "ho
263e0 6c 64 20 74 68 65 20 63 6f 6e 63 68 22 0a 2a 2a  ld the conch".**
263f0 20 62 79 20 74 61 6b 69 6e 67 20 61 6e 20 73 71   by taking an sq
26400 6c 69 74 65 2d 73 74 79 6c 65 20 73 68 61 72 65  lite-style share
26410 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 63 6f  d lock on the co
26420 6e 63 68 20 66 69 6c 65 2c 20 72 65 61 64 69 6e  nch file, readin
26430 67 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74  g the.** content
26440 73 20 61 6e 64 20 63 6f 6d 70 61 72 69 6e 67 20  s and comparing 
26450 74 68 65 20 68 6f 73 74 27 73 20 75 6e 69 71 75  the host's uniqu
26460 65 20 68 6f 73 74 20 49 44 20 28 73 65 65 20 62  e host ID (see b
26470 65 6c 6f 77 29 20 61 6e 64 20 6c 6f 63 6b 0a 2a  elow) and lock.*
26480 2a 20 70 72 6f 78 79 20 70 61 74 68 20 61 67 61  * proxy path aga
26490 69 6e 73 74 20 74 68 65 20 76 61 6c 75 65 73 20  inst the values 
264a0 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 63 6f  stored in the co
264b0 6e 63 68 2e 20 20 54 68 65 20 63 6f 6e 63 68 20  nch.  The conch 
264c0 66 69 6c 65 20 69 73 0a 2a 2a 20 73 74 6f 72 65  file is.** store
264d0 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 69  d in the same di
264e0 72 65 63 74 6f 72 79 20 61 73 20 74 68 65 20 64  rectory as the d
264f0 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64  atabase file and
26500 20 74 68 65 20 66 69 6c 65 20 6e 61 6d 65 0a 2a   the file name.*
26510 2a 20 69 73 20 70 61 74 74 65 72 6e 65 64 20 61  * is patterned a
26520 66 74 65 72 20 74 68 65 20 64 61 74 61 62 61 73  fter the databas
26530 65 20 66 69 6c 65 20 6e 61 6d 65 20 61 73 20 22  e file name as "
26540 2e 3c 64 61 74 61 62 61 73 65 6e 61 6d 65 3e 2d  .<databasename>-
26550 63 6f 6e 63 68 22 2e 0a 2a 2a 20 49 66 20 74 68  conch"..** If th
26560 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 64 6f 65  e conch file doe
26570 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 6f 72 20  s not exist, or 
26580 69 74 27 73 20 63 6f 6e 74 65 6e 74 73 20 64 6f  it's contents do
26590 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 0a 2a   not match the.*
265a0 2a 20 68 6f 73 74 20 49 44 20 61 6e 64 2f 6f 72  * host ID and/or
265b0 20 70 72 6f 78 79 20 70 61 74 68 2c 20 74 68 65   proxy path, the
265c0 6e 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 65 73  n the lock is es
265d0 63 61 6c 61 74 65 64 20 74 6f 20 61 6e 20 65 78  calated to an ex
265e0 63 6c 75 73 69 76 65 0a 2a 2a 20 6c 6f 63 6b 20  clusive.** lock 
265f0 61 6e 64 20 74 68 65 20 63 6f 6e 63 68 20 66 69  and the conch fi
26600 6c 65 20 63 6f 6e 74 65 6e 74 73 20 69 73 20 75  le contents is u
26610 70 64 61 74 65 64 20 77 69 74 68 20 74 68 65 20  pdated with the 
26620 68 6f 73 74 20 49 44 20 61 6e 64 20 70 72 6f 78  host ID and prox
26630 79 0a 2a 2a 20 70 61 74 68 20 61 6e 64 20 74 68  y.** path and th
26640 65 20 6c 6f 63 6b 20 69 73 20 64 6f 77 6e 67 72  e lock is downgr
26650 61 64 65 64 20 74 6f 20 61 20 73 68 61 72 65 64  aded to a shared
26660 20 6c 6f 63 6b 20 61 67 61 69 6e 2e 20 20 49 66   lock again.  If
26670 20 74 68 65 20 63 6f 6e 63 68 0a 2a 2a 20 69 73   the conch.** is
26680 20 68 65 6c 64 20 62 79 20 61 6e 6f 74 68 65 72   held by another
26690 20 70 72 6f 63 65 73 73 20 28 77 69 74 68 20 61   process (with a
266a0 20 73 68 61 72 65 64 20 6c 6f 63 6b 29 2c 20 74   shared lock), t
266b0 68 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  he exclusive loc
266c0 6b 0a 2a 2a 20 77 69 6c 6c 20 66 61 69 6c 20 61  k.** will fail a
266d0 6e 64 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69  nd SQLITE_BUSY i
266e0 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
266f0 2a 20 54 68 65 20 70 72 6f 78 79 20 66 69 6c 65  * The proxy file
26700 20 2d 20 61 20 73 69 6e 67 6c 65 2d 62 79 74 65   - a single-byte
26710 20 66 69 6c 65 20 75 73 65 64 20 66 6f 72 20 61   file used for a
26720 6c 6c 20 61 64 76 69 73 6f 72 79 20 66 69 6c 65  ll advisory file
26730 20 6c 6f 63 6b 73 0a 2a 2a 20 6e 6f 72 6d 61 6c   locks.** normal
26740 6c 79 20 74 61 6b 65 6e 20 6f 6e 20 74 68 65 20  ly taken on the 
26750 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
26760 20 54 68 69 73 20 61 6c 6c 6f 77 73 20 66 6f 72   This allows for
26770 20 73 61 66 65 20 73 68 61 72 69 6e 67 0a 2a 2a   safe sharing.**
26780 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
26790 20 66 69 6c 65 20 66 6f 72 20 6d 75 6c 74 69 70   file for multip
267a0 6c 65 20 72 65 61 64 65 72 73 20 61 6e 64 20 77  le readers and w
267b0 72 69 74 65 72 73 20 6f 6e 20 74 68 65 20 73 61  riters on the sa
267c0 6d 65 0a 2a 2a 20 68 6f 73 74 20 28 74 68 65 20  me.** host (the 
267d0 63 6f 6e 63 68 20 65 6e 73 75 72 65 73 20 74 68  conch ensures th
267e0 61 74 20 74 68 65 79 20 61 6c 6c 20 75 73 65 20  at they all use 
267f0 74 68 65 20 73 61 6d 65 20 6c 6f 63 61 6c 20 6c  the same local l
26800 6f 63 6b 20 66 69 6c 65 29 2e 0a 2a 2a 0a 2a 2a  ock file)..**.**
26810 20 52 65 71 75 65 73 74 69 6e 67 20 74 68 65 20   Requesting the 
26820 6c 6f 63 6b 20 70 72 6f 78 79 20 64 6f 65 73 20  lock proxy does 
26830 6e 6f 74 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  not immediately 
26840 74 61 6b 65 20 74 68 65 20 63 6f 6e 63 68 2c 20  take the conch, 
26850 69 74 20 69 73 0a 2a 2a 20 6f 6e 6c 79 20 74 61  it is.** only ta
26860 6b 65 6e 20 77 68 65 6e 20 74 68 65 20 66 69 72  ken when the fir
26870 73 74 20 72 65 71 75 65 73 74 20 74 6f 20 6c 6f  st request to lo
26880 63 6b 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ck database file
26890 20 69 73 20 6d 61 64 65 2e 20 20 0a 2a 2a 20 54   is made.  .** T
268a0 68 69 73 20 6d 61 74 63 68 65 73 20 74 68 65 20  his matches the 
268b0 73 65 6d 61 6e 74 69 63 73 20 6f 66 20 74 68 65  semantics of the
268c0 20 74 72 61 64 69 74 69 6f 6e 61 6c 20 6c 6f 63   traditional loc
268d0 6b 69 6e 67 20 62 65 68 61 76 69 6f 72 2c 20 77  king behavior, w
268e0 68 65 72 65 0a 2a 2a 20 6f 70 65 6e 69 6e 67 20  here.** opening 
268f0 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  a connection to 
26900 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  a database file 
26910 64 6f 65 73 20 6e 6f 74 20 74 61 6b 65 20 61 20  does not take a 
26920 6c 6f 63 6b 20 6f 6e 20 69 74 2e 0a 2a 2a 20 54  lock on it..** T
26930 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 61  he shared lock a
26940 6e 64 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20  nd an open file 
26950 64 65 73 63 72 69 70 74 6f 72 20 61 72 65 20 6d  descriptor are m
26960 61 69 6e 74 61 69 6e 65 64 20 75 6e 74 69 6c 20  aintained until 
26970 0a 2a 2a 20 74 68 65 20 63 6f 6e 6e 65 63 74 69  .** the connecti
26980 6f 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  on to the databa
26990 73 65 20 69 73 20 63 6c 6f 73 65 64 2e 20 0a 2a  se is closed. .*
269a0 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79 20 66  *.** The proxy f
269b0 69 6c 65 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b  ile and the lock
269c0 20 66 69 6c 65 20 61 72 65 20 6e 65 76 65 72 20   file are never 
269d0 64 65 6c 65 74 65 64 20 73 6f 20 74 68 65 79 20  deleted so they 
269e0 6f 6e 6c 79 20 6e 65 65 64 0a 2a 2a 20 74 6f 20  only need.** to 
269f0 62 65 20 63 72 65 61 74 65 64 20 74 68 65 20 66  be created the f
26a00 69 72 73 74 20 74 69 6d 65 20 74 68 65 79 20 61  irst time they a
26a10 72 65 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 43  re used..**.** C
26a20 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f 70 74  onfiguration opt
26a30 69 6f 6e 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d  ions.** --------
26a40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a  -------------.**
26a50 0a 2a 2a 20 20 53 51 4c 49 54 45 5f 50 52 45 46  .**  SQLITE_PREF
26a60 45 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47  ER_PROXY_LOCKING
26a70 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 44 61 74  .**.**       Dat
26a80 61 62 61 73 65 20 66 69 6c 65 73 20 61 63 63 65  abase files acce
26a90 73 73 65 64 20 6f 6e 20 6e 6f 6e 2d 6c 6f 63 61  ssed on non-loca
26aa0 6c 20 66 69 6c 65 20 73 79 73 74 65 6d 73 20 61  l file systems a
26ab0 72 65 0a 2a 2a 20 20 20 20 20 20 20 61 75 74 6f  re.**       auto
26ac0 6d 61 74 69 63 61 6c 6c 79 20 63 6f 6e 66 69 67  matically config
26ad0 75 72 65 64 20 66 6f 72 20 70 72 6f 78 79 20 6c  ured for proxy l
26ae0 6f 63 6b 69 6e 67 2c 20 6c 6f 63 6b 20 66 69 6c  ocking, lock fil
26af0 65 73 20 61 72 65 0a 2a 2a 20 20 20 20 20 20 20  es are.**       
26b00 6e 61 6d 65 64 20 61 75 74 6f 6d 61 74 69 63 61  named automatica
26b10 6c 6c 79 20 75 73 69 6e 67 20 74 68 65 20 73 61  lly using the sa
26b20 6d 65 20 6c 6f 67 69 63 20 61 73 0a 2a 2a 20 20  me logic as.**  
26b30 20 20 20 20 20 50 52 41 47 4d 41 20 6c 6f 63 6b       PRAGMA lock
26b40 5f 70 72 6f 78 79 5f 66 69 6c 65 3d 22 3a 61 75  _proxy_file=":au
26b50 74 6f 3a 22 0a 2a 2a 20 20 20 20 0a 2a 2a 20 20  to:".**    .**  
26b60 53 51 4c 49 54 45 5f 50 52 4f 58 59 5f 44 45 42  SQLITE_PROXY_DEB
26b70 55 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 45  UG.**.**       E
26b80 6e 61 62 6c 65 73 20 74 68 65 20 6c 6f 67 67 69  nables the loggi
26b90 6e 67 20 6f 66 20 65 72 72 6f 72 20 6d 65 73 73  ng of error mess
26ba0 61 67 65 73 20 64 75 72 69 6e 67 20 68 6f 73 74  ages during host
26bb0 20 69 64 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20   id file.**     
26bc0 20 20 72 65 74 72 69 65 76 61 6c 20 61 6e 64 20    retrieval and 
26bd0 63 72 65 61 74 69 6f 6e 0a 2a 2a 0a 2a 2a 20 20  creation.**.**  
26be0 4c 4f 43 4b 50 52 4f 58 59 44 49 52 0a 2a 2a 0a  LOCKPROXYDIR.**.
26bf0 2a 2a 20 20 20 20 20 20 20 4f 76 65 72 72 69 64  **       Overrid
26c00 65 73 20 74 68 65 20 64 65 66 61 75 6c 74 20 64  es the default d
26c10 69 72 65 63 74 6f 72 79 20 75 73 65 64 20 66 6f  irectory used fo
26c20 72 20 6c 6f 63 6b 20 70 72 6f 78 79 20 66 69 6c  r lock proxy fil
26c30 65 73 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20  es that.**      
26c40 20 61 72 65 20 6e 61 6d 65 64 20 61 75 74 6f 6d   are named autom
26c50 61 74 69 63 61 6c 6c 79 20 76 69 61 20 74 68 65  atically via the
26c60 20 22 3a 61 75 74 6f 3a 22 20 73 65 74 74 69 6e   ":auto:" settin
26c70 67 0a 2a 2a 0a 2a 2a 20 20 53 51 4c 49 54 45 5f  g.**.**  SQLITE_
26c80 44 45 46 41 55 4c 54 5f 50 52 4f 58 59 44 49 52  DEFAULT_PROXYDIR
26c90 5f 50 45 52 4d 49 53 53 49 4f 4e 53 0a 2a 2a 0a  _PERMISSIONS.**.
26ca0 2a 2a 20 20 20 20 20 20 20 50 65 72 6d 69 73 73  **       Permiss
26cb0 69 6f 6e 73 20 74 6f 20 75 73 65 20 77 68 65 6e  ions to use when
26cc0 20 63 72 65 61 74 69 6e 67 20 61 20 64 69 72 65   creating a dire
26cd0 63 74 6f 72 79 20 66 6f 72 20 73 74 6f 72 69 6e  ctory for storin
26ce0 67 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 6c  g the.**       l
26cf0 6f 63 6b 20 70 72 6f 78 79 20 66 69 6c 65 73 2c  ock proxy files,
26d00 20 6f 6e 6c 79 20 75 73 65 64 20 77 68 65 6e 20   only used when 
26d10 4c 4f 43 4b 50 52 4f 58 59 44 49 52 20 69 73 20  LOCKPROXYDIR is 
26d20 6e 6f 74 20 73 65 74 2e 0a 2a 2a 20 20 20 20 0a  not set..**    .
26d30 2a 2a 20 20 20 20 0a 2a 2a 20 41 73 20 6d 65 6e  **    .** As men
26d40 74 69 6f 6e 65 64 20 61 62 6f 76 65 2c 20 77 68  tioned above, wh
26d50 65 6e 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68  en compiled with
26d60 20 53 51 4c 49 54 45 5f 50 52 45 46 45 52 5f 50   SQLITE_PREFER_P
26d70 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 2c 0a 2a 2a  ROXY_LOCKING,.**
26d80 20 73 65 74 74 69 6e 67 20 74 68 65 20 65 6e 76   setting the env
26d90 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c  ironment variabl
26da0 65 20 53 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50  e SQLITE_FORCE_P
26db0 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 20 74 6f 20  ROXY_LOCKING to 
26dc0 31 20 77 69 6c 6c 0a 2a 2a 20 66 6f 72 63 65 20  1 will.** force 
26dd0 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 74 6f  proxy locking to
26de0 20 62 65 20 75 73 65 64 20 66 6f 72 20 65 76 65   be used for eve
26df0 72 79 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ry database file
26e00 20 6f 70 65 6e 65 64 2c 20 61 6e 64 20 30 0a 2a   opened, and 0.*
26e10 2a 20 77 69 6c 6c 20 66 6f 72 63 65 20 61 75 74  * will force aut
26e20 6f 6d 61 74 69 63 20 70 72 6f 78 79 20 6c 6f 63  omatic proxy loc
26e30 6b 69 6e 67 20 74 6f 20 62 65 20 64 69 73 61 62  king to be disab
26e40 6c 65 64 20 66 6f 72 20 61 6c 6c 20 64 61 74 61  led for all data
26e50 62 61 73 65 0a 2a 2a 20 66 69 6c 65 73 20 28 65  base.** files (e
26e60 78 70 6c 69 63 69 74 79 20 63 61 6c 6c 69 6e 67  xplicity calling
26e70 20 74 68 65 20 53 51 4c 49 54 45 5f 53 45 54 5f   the SQLITE_SET_
26e80 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 20 70 72  LOCKPROXYFILE pr
26e90 61 67 6d 61 20 6f 72 0a 2a 2a 20 73 71 6c 69 74  agma or.** sqlit
26ea0 65 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20 41  e_file_control A
26eb0 50 49 20 69 73 20 6e 6f 74 20 61 66 66 65 63 74  PI is not affect
26ec0 65 64 20 62 79 20 53 51 4c 49 54 45 5f 46 4f 52  ed by SQLITE_FOR
26ed0 43 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47  CE_PROXY_LOCKING
26ee0 29 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f  )..*/../*.** Pro
26ef0 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6f 6e  xy locking is on
26f00 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20  ly available on 
26f10 4d 61 63 4f 53 58 20 0a 2a 2f 0a 23 69 66 20 64  MacOSX .*/.#if d
26f20 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
26f30 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42  ) && SQLITE_ENAB
26f40 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
26f50 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 78  ../*.** The prox
26f60 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  yLockingContext 
26f70 68 61 73 20 74 68 65 20 70 61 74 68 20 61 6e 64  has the path and
26f80 20 66 69 6c 65 20 73 74 72 75 63 74 75 72 65 73   file structures
26f90 20 66 6f 72 20 74 68 65 20 72 65 6d 6f 74 65 20   for the remote 
26fa0 0a 2a 2a 20 61 6e 64 20 6c 6f 63 61 6c 20 70 72  .** and local pr
26fb0 6f 78 79 20 66 69 6c 65 73 20 69 6e 20 69 74 0a  oxy files in it.
26fc0 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
26fd0 74 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f  t proxyLockingCo
26fe0 6e 74 65 78 74 20 70 72 6f 78 79 4c 6f 63 6b 69  ntext proxyLocki
26ff0 6e 67 43 6f 6e 74 65 78 74 3b 0a 73 74 72 75 63  ngContext;.struc
27000 74 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f  t proxyLockingCo
27010 6e 74 65 78 74 20 7b 0a 20 20 75 6e 69 78 46 69  ntext {.  unixFi
27020 6c 65 20 2a 63 6f 6e 63 68 46 69 6c 65 3b 20 20  le *conchFile;  
27030 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 63         /* Open c
27040 6f 6e 63 68 20 66 69 6c 65 20 2a 2f 0a 20 20 63  onch file */.  c
27050 68 61 72 20 2a 63 6f 6e 63 68 46 69 6c 65 50 61  har *conchFilePa
27060 74 68 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  th;         /* N
27070 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6e 63 68  ame of the conch
27080 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 46   file */.  unixF
27090 69 6c 65 20 2a 6c 6f 63 6b 50 72 6f 78 79 3b 20  ile *lockProxy; 
270a0 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20          /* Open 
270b0 70 72 6f 78 79 20 6c 6f 63 6b 20 66 69 6c 65 20  proxy lock file 
270c0 2a 2f 0a 20 20 63 68 61 72 20 2a 6c 6f 63 6b 50  */.  char *lockP
270d0 72 6f 78 79 50 61 74 68 3b 20 20 20 20 20 20 20  roxyPath;       
270e0 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
270f0 20 70 72 6f 78 79 20 6c 6f 63 6b 20 66 69 6c 65   proxy lock file
27100 20 2a 2f 0a 20 20 63 68 61 72 20 2a 64 62 50 61   */.  char *dbPa
27110 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  th;             
27120 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
27130 65 20 6f 70 65 6e 20 66 69 6c 65 20 2a 2f 0a 20  e open file */. 
27140 20 69 6e 74 20 63 6f 6e 63 68 48 65 6c 64 3b 20   int conchHeld; 
27150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
27160 20 31 20 69 66 20 74 68 65 20 63 6f 6e 63 68 20   1 if the conch 
27170 69 73 20 68 65 6c 64 2c 20 2d 31 20 69 66 20 6c  is held, -1 if l
27180 6f 63 6b 6c 65 73 73 20 2a 2f 0a 20 20 76 6f 69  ockless */.  voi
27190 64 20 2a 6f 6c 64 4c 6f 63 6b 69 6e 67 43 6f 6e  d *oldLockingCon
271a0 74 65 78 74 3b 20 20 20 20 20 2f 2a 20 4f 72 69  text;     /* Ori
271b0 67 69 6e 61 6c 20 6c 6f 63 6b 69 6e 67 63 6f 6e  ginal lockingcon
271c0 74 65 78 74 20 74 6f 20 72 65 73 74 6f 72 65 20  text to restore 
271d0 6f 6e 20 63 6c 6f 73 65 20 2a 2f 0a 20 20 73 71  on close */.  sq
271e0 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
271f0 20 63 6f 6e 73 74 20 2a 70 4f 6c 64 4d 65 74 68   const *pOldMeth
27200 6f 64 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67 69  od;     /* Origi
27210 6e 61 6c 20 49 2f 4f 20 6d 65 74 68 6f 64 73 20  nal I/O methods 
27220 66 6f 72 20 63 6c 6f 73 65 20 2a 2f 0a 7d 3b 0a  for close */.};.
27230 0a 2f 2a 20 0a 2a 2a 20 54 68 65 20 70 72 6f 78  ./* .** The prox
27240 79 20 6c 6f 63 6b 20 66 69 6c 65 20 70 61 74 68  y lock file path
27250 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73   for the databas
27260 65 20 61 74 20 64 62 50 61 74 68 20 69 73 20 77  e at dbPath is w
27270 72 69 74 74 65 6e 20 69 6e 74 6f 20 6c 50 61 74  ritten into lPat
27280 68 2c 20 0a 2a 2a 20 77 68 69 63 68 20 6d 75 73  h, .** which mus
27290 74 20 70 6f 69 6e 74 20 74 6f 20 76 61 6c 69 64  t point to valid
272a0 2c 20 77 72 69 74 61 62 6c 65 20 6d 65 6d 6f 72  , writable memor
272b0 79 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 66  y large enough f
272c0 6f 72 20 61 20 6d 61 78 4c 65 6e 20 6c 65 6e 67  or a maxLen leng
272d0 74 68 0a 2a 2a 20 66 69 6c 65 20 70 61 74 68 2e  th.** file path.
272e0 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20   .*/.static int 
272f0 70 72 6f 78 79 47 65 74 4c 6f 63 6b 50 61 74 68  proxyGetLockPath
27300 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 64 62 50  (const char *dbP
27310 61 74 68 2c 20 63 68 61 72 20 2a 6c 50 61 74 68  ath, char *lPath
27320 2c 20 73 69 7a 65 5f 74 20 6d 61 78 4c 65 6e 29  , size_t maxLen)
27330 7b 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 69  {.  int len;.  i
27340 6e 74 20 64 62 4c 65 6e 3b 0a 20 20 69 6e 74 20  nt dbLen;.  int 
27350 69 3b 0a 0a 23 69 66 64 65 66 20 4c 4f 43 4b 50  i;..#ifdef LOCKP
27360 52 4f 58 59 44 49 52 0a 20 20 6c 65 6e 20 3d 20  ROXYDIR.  len = 
27370 73 74 72 6c 63 70 79 28 6c 50 61 74 68 2c 20 4c  strlcpy(lPath, L
27380 4f 43 4b 50 52 4f 58 59 44 49 52 2c 20 6d 61 78  OCKPROXYDIR, max
27390 4c 65 6e 29 3b 0a 23 65 6c 73 65 0a 23 20 69 66  Len);.#else.# if
273a0 64 65 66 20 5f 43 53 5f 44 41 52 57 49 4e 5f 55  def _CS_DARWIN_U
273b0 53 45 52 5f 54 45 4d 50 5f 44 49 52 0a 20 20 7b  SER_TEMP_DIR.  {
273c0 0a 20 20 20 20 69 66 28 20 21 63 6f 6e 66 73 74  .    if( !confst
273d0 72 28 5f 43 53 5f 44 41 52 57 49 4e 5f 55 53 45  r(_CS_DARWIN_USE
273e0 52 5f 54 45 4d 50 5f 44 49 52 2c 20 6c 50 61 74  R_TEMP_DIR, lPat
273f0 68 2c 20 6d 61 78 4c 65 6e 29 20 29 7b 0a 20 20  h, maxLen) ){.  
27400 20 20 20 20 4f 53 54 52 41 43 45 34 28 22 47 45      OSTRACE4("GE
27410 54 4c 4f 43 4b 50 41 54 48 20 20 66 61 69 6c 65  TLOCKPATH  faile
27420 64 20 25 73 20 65 72 72 6e 6f 3d 25 64 20 70 69  d %s errno=%d pi
27430 64 3d 25 64 5c 6e 22 2c 20 6c 50 61 74 68 2c 20  d=%d\n", lPath, 
27440 65 72 72 6e 6f 2c 20 67 65 74 70 69 64 28 29 29  errno, getpid())
27450 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
27460 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b  QLITE_IOERR_LOCK
27470 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20  ;.    }.    len 
27480 3d 20 73 74 72 6c 63 61 74 28 6c 50 61 74 68 2c  = strlcat(lPath,
27490 20 22 73 71 6c 69 74 65 70 6c 6f 63 6b 73 22 2c   "sqliteplocks",
274a0 20 6d 61 78 4c 65 6e 29 3b 20 20 20 20 0a 20 20   maxLen);    .  
274b0 7d 0a 23 20 65 6c 73 65 0a 20 20 6c 65 6e 20 3d  }.# else.  len =
274c0 20 73 74 72 6c 63 70 79 28 6c 50 61 74 68 2c 20   strlcpy(lPath, 
274d0 22 2f 74 6d 70 2f 22 2c 20 6d 61 78 4c 65 6e 29  "/tmp/", maxLen)
274e0 3b 0a 23 20 65 6e 64 69 66 0a 23 65 6e 64 69 66  ;.# endif.#endif
274f0 0a 0a 20 20 69 66 28 20 6c 50 61 74 68 5b 6c 65  ..  if( lPath[le
27500 6e 2d 31 5d 21 3d 27 2f 27 20 29 7b 0a 20 20 20  n-1]!='/' ){.   
27510 20 6c 65 6e 20 3d 20 73 74 72 6c 63 61 74 28 6c   len = strlcat(l
27520 50 61 74 68 2c 20 22 2f 22 2c 20 6d 61 78 4c 65  Path, "/", maxLe
27530 6e 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  n);.  }.  .  /* 
27540 74 72 61 6e 73 66 6f 72 6d 20 74 68 65 20 64 62  transform the db
27550 20 70 61 74 68 20 74 6f 20 61 20 75 6e 69 71 75   path to a uniqu
27560 65 20 63 61 63 68 65 20 6e 61 6d 65 20 2a 2f 0a  e cache name */.
27570 20 20 64 62 4c 65 6e 20 3d 20 28 69 6e 74 29 73    dbLen = (int)s
27580 74 72 6c 65 6e 28 64 62 50 61 74 68 29 3b 0a 20  trlen(dbPath);. 
27590 20 66 6f 72 28 20 69 3d 30 3b 20 69 3c 64 62 4c   for( i=0; i<dbL
275a0 65 6e 20 26 26 20 28 69 2b 6c 65 6e 2b 37 29 3c  en && (i+len+7)<
275b0 6d 61 78 4c 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20  maxLen; i++){.  
275c0 20 20 63 68 61 72 20 63 20 3d 20 64 62 50 61 74    char c = dbPat
275d0 68 5b 69 5d 3b 0a 20 20 20 20 6c 50 61 74 68 5b  h[i];.    lPath[
275e0 69 2b 6c 65 6e 5d 20 3d 20 28 63 3d 3d 27 2f 27  i+len] = (c=='/'
275f0 29 3f 27 5f 27 3a 63 3b 0a 20 20 7d 0a 20 20 6c  )?'_':c;.  }.  l
27600 50 61 74 68 5b 69 2b 6c 65 6e 5d 3d 27 5c 30 27  Path[i+len]='\0'
27610 3b 0a 20 20 73 74 72 6c 63 61 74 28 6c 50 61 74  ;.  strlcat(lPat
27620 68 2c 20 22 3a 61 75 74 6f 3a 22 2c 20 6d 61 78  h, ":auto:", max
27630 4c 65 6e 29 3b 0a 20 20 4f 53 54 52 41 43 45 33  Len);.  OSTRACE3
27640 28 22 47 45 54 4c 4f 43 4b 50 41 54 48 20 20 70  ("GETLOCKPATH  p
27650 72 6f 78 79 20 6c 6f 63 6b 20 70 61 74 68 3d 25  roxy lock path=%
27660 73 20 70 69 64 3d 25 64 5c 6e 22 2c 20 6c 50 61  s pid=%d\n", lPa
27670 74 68 2c 20 67 65 74 70 69 64 28 29 29 3b 0a 20  th, getpid());. 
27680 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
27690 4b 3b 0a 7d 0a 0a 2f 2a 20 0a 20 2a 2a 20 43 72  K;.}../* . ** Cr
276a0 65 61 74 65 73 20 74 68 65 20 6c 6f 63 6b 20 66  eates the lock f
276b0 69 6c 65 20 61 6e 64 20 61 6e 79 20 6d 69 73 73  ile and any miss
276c0 69 6e 67 20 64 69 72 65 63 74 6f 72 69 65 73 20  ing directories 
276d0 69 6e 20 6c 6f 63 6b 50 61 74 68 0a 20 2a 2f 0a  in lockPath. */.
276e0 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
276f0 43 72 65 61 74 65 4c 6f 63 6b 50 61 74 68 28 63  CreateLockPath(c
27700 6f 6e 73 74 20 63 68 61 72 20 2a 6c 6f 63 6b 50  onst char *lockP
27710 61 74 68 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6c  ath){.  int i, l
27720 65 6e 3b 0a 20 20 63 68 61 72 20 62 75 66 5b 4d  en;.  char buf[M
27730 41 58 50 41 54 48 4c 45 4e 5d 3b 0a 20 20 69 6e  AXPATHLEN];.  in
27740 74 20 73 74 61 72 74 20 3d 20 30 3b 0a 20 20 0a  t start = 0;.  .
27750 20 20 61 73 73 65 72 74 28 6c 6f 63 6b 50 61 74    assert(lockPat
27760 68 21 3d 4e 55 4c 4c 29 3b 0a 20 20 2f 2a 20 74  h!=NULL);.  /* t
27770 72 79 20 74 6f 20 63 72 65 61 74 65 20 61 6c 6c  ry to create all
27780 20 74 68 65 20 69 6e 74 65 72 6d 65 64 69 61 74   the intermediat
27790 65 20 64 69 72 65 63 74 6f 72 69 65 73 20 2a 2f  e directories */
277a0 0a 20 20 6c 65 6e 20 3d 20 28 69 6e 74 29 73 74  .  len = (int)st
277b0 72 6c 65 6e 28 6c 6f 63 6b 50 61 74 68 29 3b 0a  rlen(lockPath);.
277c0 20 20 62 75 66 5b 30 5d 20 3d 20 6c 6f 63 6b 50    buf[0] = lockP
277d0 61 74 68 5b 30 5d 3b 0a 20 20 66 6f 72 28 20 69  ath[0];.  for( i
277e0 3d 31 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b 20 29  =1; i<len; i++ )
277f0 7b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 50 61  {.    if( lockPa
27800 74 68 5b 69 5d 20 3d 3d 20 27 2f 27 20 26 26 20  th[i] == '/' && 
27810 28 69 20 2d 20 73 74 61 72 74 20 3e 20 30 29 20  (i - start > 0) 
27820 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6f 6e 6c 79  ){.      /* only
27830 20 6d 6b 64 69 72 20 69 66 20 6c 65 61 66 20 64   mkdir if leaf d
27840 69 72 20 21 3d 20 22 2e 22 20 6f 72 20 22 2f 22  ir != "." or "/"
27850 20 6f 72 20 22 2e 2e 22 20 2a 2f 0a 20 20 20 20   or ".." */.    
27860 20 20 69 66 28 20 69 2d 73 74 61 72 74 3e 32 20    if( i-start>2 
27870 7c 7c 20 28 69 2d 73 74 61 72 74 3d 3d 31 20 26  || (i-start==1 &
27880 26 20 62 75 66 5b 73 74 61 72 74 5d 20 21 3d 20  & buf[start] != 
27890 27 2e 27 20 26 26 20 62 75 66 5b 73 74 61 72 74  '.' && buf[start
278a0 5d 20 21 3d 20 27 2f 27 29 20 0a 20 20 20 20 20  ] != '/') .     
278b0 20 20 20 20 7c 7c 20 28 69 2d 73 74 61 72 74 3d      || (i-start=
278c0 3d 32 20 26 26 20 62 75 66 5b 73 74 61 72 74 5d  =2 && buf[start]
278d0 20 21 3d 20 27 2e 27 20 26 26 20 62 75 66 5b 73   != '.' && buf[s
278e0 74 61 72 74 2b 31 5d 20 21 3d 20 27 2e 27 29 20  tart+1] != '.') 
278f0 29 7b 0a 20 20 20 20 20 20 20 20 62 75 66 5b 69  ){.        buf[i
27900 5d 3d 27 5c 30 27 3b 0a 20 20 20 20 20 20 20 20  ]='\0';.        
27910 69 66 28 20 6d 6b 64 69 72 28 62 75 66 2c 20 53  if( mkdir(buf, S
27920 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 52  QLITE_DEFAULT_PR
27930 4f 58 59 44 49 52 5f 50 45 52 4d 49 53 53 49 4f  OXYDIR_PERMISSIO
27940 4e 53 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  NS) ){.         
27950 20 69 6e 74 20 65 72 72 3d 65 72 72 6e 6f 3b 0a   int err=errno;.
27960 20 20 20 20 20 20 20 20 20 20 69 66 28 20 65 72            if( er
27970 72 21 3d 45 45 58 49 53 54 20 29 20 7b 0a 20 20  r!=EEXIST ) {.  
27980 20 20 20 20 20 20 20 20 20 20 4f 53 54 52 41 43            OSTRAC
27990 45 35 28 22 43 52 45 41 54 45 4c 4f 43 4b 50 41  E5("CREATELOCKPA
279a0 54 48 20 20 46 41 49 4c 45 44 20 63 72 65 61 74  TH  FAILED creat
279b0 69 6e 67 20 25 73 2c 20 27 25 73 27 20 70 72 6f  ing %s, '%s' pro
279c0 78 79 20 6c 6f 63 6b 20 70 61 74 68 3d 25 73 20  xy lock path=%s 
279d0 70 69 64 3d 25 64 5c 6e 22 2c 20 62 75 66 2c 20  pid=%d\n", buf, 
279e0 73 74 72 65 72 72 6f 72 28 65 72 72 29 2c 20 6c  strerror(err), l
279f0 6f 63 6b 50 61 74 68 2c 20 67 65 74 70 69 64 28  ockPath, getpid(
27a00 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ));.            
27a10 72 65 74 75 72 6e 20 65 72 72 3b 0a 20 20 20 20  return err;.    
27a20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
27a30 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
27a40 73 74 61 72 74 3d 69 2b 31 3b 0a 20 20 20 20 7d  start=i+1;.    }
27a50 0a 20 20 20 20 62 75 66 5b 69 5d 20 3d 20 6c 6f  .    buf[i] = lo
27a60 63 6b 50 61 74 68 5b 69 5d 3b 0a 20 20 7d 0a 20  ckPath[i];.  }. 
27a70 20 4f 53 54 52 41 43 45 33 28 22 43 52 45 41 54   OSTRACE3("CREAT
27a80 45 4c 4f 43 4b 50 41 54 48 20 20 70 72 6f 78 79  ELOCKPATH  proxy
27a90 20 6c 6f 63 6b 20 70 61 74 68 3d 25 73 20 70 69   lock path=%s pi
27aa0 64 3d 25 64 5c 6e 22 2c 20 6c 6f 63 6b 50 61 74  d=%d\n", lockPat
27ab0 68 2c 20 67 65 74 70 69 64 28 29 29 3b 0a 20 20  h, getpid());.  
27ac0 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
27ad0 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  ** Create a new 
27ae0 56 46 53 20 66 69 6c 65 20 64 65 73 63 72 69 70  VFS file descrip
27af0 74 6f 72 20 28 73 74 6f 72 65 64 20 69 6e 20 6d  tor (stored in m
27b00 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66  emory obtained f
27b10 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6d  rom.** sqlite3_m
27b20 61 6c 6c 6f 63 29 20 61 6e 64 20 6f 70 65 6e 20  alloc) and open 
27b30 74 68 65 20 66 69 6c 65 20 6e 61 6d 65 64 20 22  the file named "
27b40 70 61 74 68 22 20 69 6e 20 74 68 65 20 66 69 6c  path" in the fil
27b50 65 20 64 65 73 63 72 69 70 74 6f 72 2e 0a 2a 2a  e descriptor..**
27b60 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 69  .** The caller i
27b70 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 6e 6f  s responsible no
27b80 74 20 6f 6e 6c 79 20 66 6f 72 20 63 6c 6f 73 69  t only for closi
27b90 6e 67 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  ng the file desc
27ba0 72 69 70 74 6f 72 0a 2a 2a 20 62 75 74 20 61 6c  riptor.** but al
27bb0 73 6f 20 66 6f 72 20 66 72 65 65 69 6e 67 20 74  so for freeing t
27bc0 68 65 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69  he memory associ
27bd0 61 74 65 64 20 77 69 74 68 20 74 68 65 20 66 69  ated with the fi
27be0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 0a 2a  le descriptor..*
27bf0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  /.static int pro
27c00 78 79 43 72 65 61 74 65 55 6e 69 78 46 69 6c 65  xyCreateUnixFile
27c10 28 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  (.    const char
27c20 20 2a 70 61 74 68 2c 20 20 20 20 20 20 20 20 2f   *path,        /
27c30 2a 20 70 61 74 68 20 66 6f 72 20 74 68 65 20 6e  * path for the n
27c40 65 77 20 75 6e 69 78 46 69 6c 65 20 2a 2f 0a 20  ew unixFile */. 
27c50 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 2a 70 70     unixFile **pp
27c60 46 69 6c 65 2c 20 20 20 20 20 20 20 2f 2a 20 75  File,       /* u
27c70 6e 69 78 46 69 6c 65 20 63 72 65 61 74 65 64 20  nixFile created 
27c80 61 6e 64 20 72 65 74 75 72 6e 65 64 20 62 79 20  and returned by 
27c90 72 65 66 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  ref */.    int i
27ca0 73 6c 6f 63 6b 66 69 6c 65 20 20 20 20 20 20 20  slockfile       
27cb0 20 20 20 20 2f 2a 20 69 66 20 6e 6f 6e 20 7a 65      /* if non ze
27cc0 72 6f 20 6d 69 73 73 69 6e 67 20 64 69 72 73 20  ro missing dirs 
27cd0 77 69 6c 6c 20 62 65 20 63 72 65 61 74 65 64 20  will be created 
27ce0 2a 2f 0a 29 20 7b 0a 20 20 69 6e 74 20 66 64 20  */.) {.  int fd 
27cf0 3d 20 2d 31 3b 0a 20 20 69 6e 74 20 64 69 72 66  = -1;.  int dirf
27d00 64 20 3d 20 2d 31 3b 0a 20 20 75 6e 69 78 46 69  d = -1;.  unixFi
27d10 6c 65 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20  le *pNew;.  int 
27d20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
27d30 20 20 69 6e 74 20 6f 70 65 6e 46 6c 61 67 73 20    int openFlags 
27d40 3d 20 4f 5f 52 44 57 52 20 7c 20 4f 5f 43 52 45  = O_RDWR | O_CRE
27d50 41 54 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  AT;.  sqlite3_vf
27d60 73 20 64 75 6d 6d 79 56 66 73 3b 0a 20 20 69 6e  s dummyVfs;.  in
27d70 74 20 74 65 72 72 6e 6f 20 3d 20 30 3b 0a 20 20  t terrno = 0;.  
27d80 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70 55  UnixUnusedFd *pU
27d90 6e 75 73 65 64 20 3d 20 4e 55 4c 4c 3b 0a 0a 20  nused = NULL;.. 
27da0 20 2f 2a 20 31 2e 20 66 69 72 73 74 20 74 72 79   /* 1. first try
27db0 20 74 6f 20 6f 70 65 6e 2f 63 72 65 61 74 65 20   to open/create 
27dc0 74 68 65 20 66 69 6c 65 0a 20 20 2a 2a 20 32 2e  the file.  ** 2.
27dd0 20 69 66 20 74 68 61 74 20 66 61 69 6c 73 2c 20   if that fails, 
27de0 61 6e 64 20 74 68 69 73 20 69 73 20 61 20 6c 6f  and this is a lo
27df0 63 6b 20 66 69 6c 65 20 28 6e 6f 74 2d 63 6f 6e  ck file (not-con
27e00 63 68 29 2c 20 74 72 79 20 63 72 65 61 74 69 6e  ch), try creatin
27e10 67 0a 20 20 2a 2a 20 74 68 65 20 70 61 72 65 6e  g.  ** the paren
27e20 74 20 64 69 72 65 63 74 6f 72 69 65 73 20 61 6e  t directories an
27e30 64 20 74 68 65 6e 20 74 72 79 20 61 67 61 69 6e  d then try again
27e40 2e 0a 20 20 2a 2a 20 33 2e 20 69 66 20 74 68 61  ..  ** 3. if tha
27e50 74 20 66 61 69 6c 73 2c 20 74 72 79 20 74 6f 20  t fails, try to 
27e60 6f 70 65 6e 20 74 68 65 20 66 69 6c 65 20 72 65  open the file re
27e70 61 64 2d 6f 6e 6c 79 0a 20 20 2a 2a 20 6f 74 68  ad-only.  ** oth
27e80 65 72 77 69 73 65 20 72 65 74 75 72 6e 20 42 55  erwise return BU
27e90 53 59 20 28 69 66 20 6c 6f 63 6b 20 66 69 6c 65  SY (if lock file
27ea0 29 20 6f 72 20 43 41 4e 54 4f 50 45 4e 20 66 6f  ) or CANTOPEN fo
27eb0 72 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65  r the conch file
27ec0 0a 20 20 2a 2f 0a 20 20 70 55 6e 75 73 65 64 20  .  */.  pUnused 
27ed0 3d 20 66 69 6e 64 52 65 75 73 61 62 6c 65 46 64  = findReusableFd
27ee0 28 70 61 74 68 2c 20 6f 70 65 6e 46 6c 61 67 73  (path, openFlags
27ef0 29 3b 0a 20 20 69 66 28 20 70 55 6e 75 73 65 64  );.  if( pUnused
27f00 20 29 7b 0a 20 20 20 20 66 64 20 3d 20 70 55 6e   ){.    fd = pUn
27f10 75 73 65 64 2d 3e 66 64 3b 0a 20 20 7d 65 6c 73  used->fd;.  }els
27f20 65 7b 0a 20 20 20 20 70 55 6e 75 73 65 64 20 3d  e{.    pUnused =
27f30 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
27f40 73 69 7a 65 6f 66 28 2a 70 55 6e 75 73 65 64 29  sizeof(*pUnused)
27f50 29 3b 0a 20 20 20 20 69 66 28 20 21 70 55 6e 75  );.    if( !pUnu
27f60 73 65 64 20 29 7b 0a 20 20 20 20 20 20 72 65 74  sed ){.      ret
27f70 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
27f80 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
27f90 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 66 64  ( fd<0 ){.    fd
27fa0 20 3d 20 6f 70 65 6e 28 70 61 74 68 2c 20 6f 70   = open(path, op
27fb0 65 6e 46 6c 61 67 73 2c 20 53 51 4c 49 54 45 5f  enFlags, SQLITE_
27fc0 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52  DEFAULT_FILE_PER
27fd0 4d 49 53 53 49 4f 4e 53 29 3b 0a 20 20 20 20 74  MISSIONS);.    t
27fe0 65 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  errno = errno;. 
27ff0 20 20 20 69 66 28 20 66 64 3c 30 20 26 26 20 65     if( fd<0 && e
28000 72 72 6e 6f 3d 3d 45 4e 4f 45 4e 54 20 26 26 20  rrno==ENOENT && 
28010 69 73 6c 6f 63 6b 66 69 6c 65 20 29 7b 0a 20 20  islockfile ){.  
28020 20 20 20 20 69 66 28 20 70 72 6f 78 79 43 72 65      if( proxyCre
28030 61 74 65 4c 6f 63 6b 50 61 74 68 28 70 61 74 68  ateLockPath(path
28040 29 20 3d 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 29  ) == SQLITE_OK )
28050 7b 0a 20 20 20 20 20 20 20 20 66 64 20 3d 20 6f  {.        fd = o
28060 70 65 6e 28 70 61 74 68 2c 20 6f 70 65 6e 46 6c  pen(path, openFl
28070 61 67 73 2c 20 53 51 4c 49 54 45 5f 44 45 46 41  ags, SQLITE_DEFA
28080 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53  ULT_FILE_PERMISS
28090 49 4f 4e 53 29 3b 0a 20 20 20 20 20 20 7d 0a 20  IONS);.      }. 
280a0 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 66     }.  }.  if( f
280b0 64 3c 30 20 29 7b 0a 20 20 20 20 6f 70 65 6e 46  d<0 ){.    openF
280c0 6c 61 67 73 20 3d 20 4f 5f 52 44 4f 4e 4c 59 3b  lags = O_RDONLY;
280d0 0a 20 20 20 20 66 64 20 3d 20 6f 70 65 6e 28 70  .    fd = open(p
280e0 61 74 68 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20  ath, openFlags, 
280f0 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46  SQLITE_DEFAULT_F
28100 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 29  ILE_PERMISSIONS)
28110 3b 0a 20 20 20 20 74 65 72 72 6e 6f 20 3d 20 65  ;.    terrno = e
28120 72 72 6e 6f 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rrno;.  }.  if( 
28130 66 64 3c 30 20 29 7b 0a 20 20 20 20 69 66 28 20  fd<0 ){.    if( 
28140 69 73 6c 6f 63 6b 66 69 6c 65 20 29 7b 0a 20 20  islockfile ){.  
28150 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
28160 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a 20 20  E_BUSY;.    }.  
28170 20 20 73 77 69 74 63 68 20 28 74 65 72 72 6e 6f    switch (terrno
28180 29 20 7b 0a 20 20 20 20 20 20 63 61 73 65 20 45  ) {.      case E
28190 41 43 43 45 53 3a 0a 20 20 20 20 20 20 20 20 72  ACCES:.        r
281a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52  eturn SQLITE_PER
281b0 4d 3b 0a 20 20 20 20 20 20 63 61 73 65 20 45 49  M;.      case EI
281c0 4f 3a 20 0a 20 20 20 20 20 20 20 20 72 65 74 75  O: .        retu
281d0 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
281e0 4c 4f 43 4b 3b 20 2f 2a 20 65 76 65 6e 20 74 68  LOCK; /* even th
281f0 6f 75 67 68 20 69 74 20 69 73 20 74 68 65 20 63  ough it is the c
28200 6f 6e 63 68 20 2a 2f 0a 20 20 20 20 20 20 64 65  onch */.      de
28210 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 20 20 72  fault:.        r
28220 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e  eturn SQLITE_CAN
28230 54 4f 50 45 4e 3b 0a 20 20 20 20 7d 0a 20 20 7d  TOPEN;.    }.  }
28240 0a 20 20 0a 20 20 70 4e 65 77 20 3d 20 28 75 6e  .  .  pNew = (un
28250 69 78 46 69 6c 65 20 2a 29 73 71 6c 69 74 65 33  ixFile *)sqlite3
28260 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a  _malloc(sizeof(*
28270 70 4e 65 77 29 29 3b 0a 20 20 69 66 28 20 70 4e  pNew));.  if( pN
28280 65 77 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20  ew==NULL ){.    
28290 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
282a0 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  M;.    goto end_
282b0 63 72 65 61 74 65 5f 70 72 6f 78 79 3b 0a 20 20  create_proxy;.  
282c0 7d 0a 20 20 6d 65 6d 73 65 74 28 70 4e 65 77 2c  }.  memset(pNew,
282d0 20 30 2c 20 73 69 7a 65 6f 66 28 75 6e 69 78 46   0, sizeof(unixF
282e0 69 6c 65 29 29 3b 0a 20 20 70 4e 65 77 2d 3e 6f  ile));.  pNew->o
282f0 70 65 6e 46 6c 61 67 73 20 3d 20 6f 70 65 6e 46  penFlags = openF
28300 6c 61 67 73 3b 0a 20 20 64 75 6d 6d 79 56 66 73  lags;.  dummyVfs
28310 2e 70 41 70 70 44 61 74 61 20 3d 20 28 76 6f 69  .pAppData = (voi
28320 64 2a 29 26 61 75 74 6f 6c 6f 63 6b 49 6f 46 69  d*)&autolockIoFi
28330 6e 64 65 72 3b 0a 20 20 70 55 6e 75 73 65 64 2d  nder;.  pUnused-
28340 3e 66 64 20 3d 20 66 64 3b 0a 20 20 70 55 6e 75  >fd = fd;.  pUnu
28350 73 65 64 2d 3e 66 6c 61 67 73 20 3d 20 6f 70 65  sed->flags = ope
28360 6e 46 6c 61 67 73 3b 0a 20 20 70 4e 65 77 2d 3e  nFlags;.  pNew->
28370 70 55 6e 75 73 65 64 20 3d 20 70 55 6e 75 73 65  pUnused = pUnuse
28380 64 3b 0a 20 20 0a 20 20 72 63 20 3d 20 66 69 6c  d;.  .  rc = fil
28390 6c 49 6e 55 6e 69 78 46 69 6c 65 28 26 64 75 6d  lInUnixFile(&dum
283a0 6d 79 56 66 73 2c 20 66 64 2c 20 64 69 72 66 64  myVfs, fd, dirfd
283b0 2c 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  , (sqlite3_file*
283c0 29 70 4e 65 77 2c 20 70 61 74 68 2c 20 30 2c 20  )pNew, path, 0, 
283d0 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  0);.  if( rc==SQ
283e0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a  LITE_OK ){.    *
283f0 70 70 46 69 6c 65 20 3d 20 70 4e 65 77 3b 0a 20  ppFile = pNew;. 
28400 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
28410 5f 4f 4b 3b 0a 20 20 7d 0a 65 6e 64 5f 63 72 65  _OK;.  }.end_cre
28420 61 74 65 5f 70 72 6f 78 79 3a 20 20 20 20 0a 20  ate_proxy:    . 
28430 20 63 6c 6f 73 65 28 66 64 29 3b 20 2f 2a 20 73   close(fd); /* s
28440 69 6c 65 6e 74 6c 79 20 6c 65 61 6b 20 66 64 20  ilently leak fd 
28450 69 66 20 65 72 72 6f 72 2c 20 77 65 27 72 65 20  if error, we're 
28460 61 6c 72 65 61 64 79 20 69 6e 20 65 72 72 6f 72  already in error
28470 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 72   */.  sqlite3_fr
28480 65 65 28 70 4e 65 77 29 3b 0a 20 20 73 71 6c 69  ee(pNew);.  sqli
28490 74 65 33 5f 66 72 65 65 28 70 55 6e 75 73 65 64  te3_free(pUnused
284a0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
284b0 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
284c0 5f 54 45 53 54 0a 2f 2a 20 73 69 6d 75 6c 61 74  _TEST./* simulat
284d0 65 20 6d 75 6c 74 69 70 6c 65 20 68 6f 73 74 73  e multiple hosts
284e0 20 62 79 20 63 72 65 61 74 69 6e 67 20 75 6e 69   by creating uni
284f0 71 75 65 20 68 6f 73 74 69 64 20 66 69 6c 65 20  que hostid file 
28500 70 61 74 68 73 20 2a 2f 0a 69 6e 74 20 73 71 6c  paths */.int sql
28510 69 74 65 33 5f 68 6f 73 74 69 64 5f 6e 75 6d 20  ite3_hostid_num 
28520 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 23 64 65  = 0;.#endif..#de
28530 66 69 6e 65 20 50 52 4f 58 59 5f 48 4f 53 54 49  fine PROXY_HOSTI
28540 44 4c 45 4e 20 20 20 20 31 36 20 20 2f 2a 20 63  DLEN    16  /* c
28550 6f 6e 63 68 20 66 69 6c 65 20 68 6f 73 74 20 69  onch file host i
28560 64 20 6c 65 6e 67 74 68 20 2a 2f 0a 0a 2f 2a 20  d length */../* 
28570 67 65 74 20 74 68 65 20 68 6f 73 74 20 49 44 20  get the host ID 
28580 76 69 61 20 67 65 74 68 6f 73 74 75 75 69 64 28  via gethostuuid(
28590 29 2c 20 70 48 6f 73 74 49 44 20 6d 75 73 74 20  ), pHostID must 
285a0 70 6f 69 6e 74 20 74 6f 20 50 52 4f 58 59 5f 48  point to PROXY_H
285b0 4f 53 54 49 44 4c 45 4e 20 0a 2a 2a 20 62 79 74  OSTIDLEN .** byt
285c0 65 73 20 6f 66 20 77 72 69 74 61 62 6c 65 20 6d  es of writable m
285d0 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  emory..*/.static
285e0 20 69 6e 74 20 70 72 6f 78 79 47 65 74 48 6f 73   int proxyGetHos
285f0 74 49 44 28 75 6e 73 69 67 6e 65 64 20 63 68 61  tID(unsigned cha
28600 72 20 2a 70 48 6f 73 74 49 44 2c 20 69 6e 74 20  r *pHostID, int 
28610 2a 70 45 72 72 6f 72 29 7b 0a 20 20 73 74 72 75  *pError){.  stru
28620 63 74 20 74 69 6d 65 73 70 65 63 20 74 69 6d 65  ct timespec time
28630 6f 75 74 20 3d 20 7b 31 2c 20 30 7d 3b 20 2f 2a  out = {1, 0}; /*
28640 20 31 20 73 65 63 20 74 69 6d 65 6f 75 74 20 2a   1 sec timeout *
28650 2f 0a 20 20 0a 20 20 61 73 73 65 72 74 28 50 52  /.  .  assert(PR
28660 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 20 3d 3d  OXY_HOSTIDLEN ==
28670 20 73 69 7a 65 6f 66 28 75 75 69 64 5f 74 29 29   sizeof(uuid_t))
28680 3b 0a 20 20 6d 65 6d 73 65 74 28 70 48 6f 73 74  ;.  memset(pHost
28690 49 44 2c 20 30 2c 20 50 52 4f 58 59 5f 48 4f 53  ID, 0, PROXY_HOS
286a0 54 49 44 4c 45 4e 29 3b 0a 20 20 69 66 28 20 67  TIDLEN);.  if( g
286b0 65 74 68 6f 73 74 75 75 69 64 28 70 48 6f 73 74  ethostuuid(pHost
286c0 49 44 2c 20 26 74 69 6d 65 6f 75 74 29 20 29 7b  ID, &timeout) ){
286d0 0a 20 20 20 20 69 6e 74 20 65 72 72 20 3d 20 65  .    int err = e
286e0 72 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20 70 45  rrno;.    if( pE
286f0 72 72 6f 72 20 29 7b 0a 20 20 20 20 20 20 2a 70  rror ){.      *p
28700 45 72 72 6f 72 20 3d 20 65 72 72 3b 0a 20 20 20  Error = err;.   
28710 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51   }.    return SQ
28720 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 7d 0a  LITE_IOERR;.  }.
28730 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
28740 53 54 0a 20 20 2f 2a 20 73 69 6d 75 6c 61 74 65  ST.  /* simulate
28750 20 6d 75 6c 74 69 70 6c 65 20 68 6f 73 74 73 20   multiple hosts 
28760 62 79 20 63 72 65 61 74 69 6e 67 20 75 6e 69 71  by creating uniq
28770 75 65 20 68 6f 73 74 69 64 20 66 69 6c 65 20 70  ue hostid file p
28780 61 74 68 73 20 2a 2f 0a 20 20 69 66 28 20 73 71  aths */.  if( sq
28790 6c 69 74 65 33 5f 68 6f 73 74 69 64 5f 6e 75 6d  lite3_hostid_num
287a0 20 21 3d 20 30 29 7b 0a 20 20 20 20 70 48 6f 73   != 0){.    pHos
287b0 74 49 44 5b 30 5d 20 3d 20 28 63 68 61 72 29 28  tID[0] = (char)(
287c0 70 48 6f 73 74 49 44 5b 30 5d 20 2b 20 28 63 68  pHostID[0] + (ch
287d0 61 72 29 28 73 71 6c 69 74 65 33 5f 68 6f 73 74  ar)(sqlite3_host
287e0 69 64 5f 6e 75 6d 20 26 20 30 78 46 46 29 29 3b  id_num & 0xFF));
287f0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20  .  }.#endif.  . 
28800 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
28810 4b 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 63 6f 6e  K;.}../* The con
28820 63 68 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73  ch file contains
28830 20 74 68 65 20 68 65 61 64 65 72 2c 20 68 6f 73   the header, hos
28840 74 20 69 64 20 61 6e 64 20 6c 6f 63 6b 20 66 69  t id and lock fi
28850 6c 65 20 70 61 74 68 0a 20 2a 2f 0a 23 64 65 66  le path. */.#def
28860 69 6e 65 20 50 52 4f 58 59 5f 43 4f 4e 43 48 56  ine PROXY_CONCHV
28870 45 52 53 49 4f 4e 20 32 20 20 20 2f 2a 20 31 2d  ERSION 2   /* 1-
28880 62 79 74 65 20 68 65 61 64 65 72 2c 20 31 36 2d  byte header, 16-
28890 62 79 74 65 20 68 6f 73 74 20 69 64 2c 20 70 61  byte host id, pa
288a0 74 68 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 52  th */.#define PR
288b0 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e 20 20 20  OXY_HEADERLEN   
288c0 20 31 20 20 20 2f 2a 20 63 6f 6e 63 68 20 66 69   1   /* conch fi
288d0 6c 65 20 68 65 61 64 65 72 20 6c 65 6e 67 74 68  le header length
288e0 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 52 4f 58   */.#define PROX
288f0 59 5f 50 41 54 48 49 4e 44 45 58 20 20 20 20 28  Y_PATHINDEX    (
28900 50 52 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e 2b  PROXY_HEADERLEN+
28910 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 29  PROXY_HOSTIDLEN)
28920 0a 23 64 65 66 69 6e 65 20 50 52 4f 58 59 5f 4d  .#define PROXY_M
28930 41 58 43 4f 4e 43 48 4c 45 4e 20 20 28 50 52 4f  AXCONCHLEN  (PRO
28940 58 59 5f 48 45 41 44 45 52 4c 45 4e 2b 50 52 4f  XY_HEADERLEN+PRO
28950 58 59 5f 48 4f 53 54 49 44 4c 45 4e 2b 4d 41 58  XY_HOSTIDLEN+MAX
28960 50 41 54 48 4c 45 4e 29 0a 0a 2f 2a 20 0a 2a 2a  PATHLEN)../* .**
28970 20 54 61 6b 65 73 20 61 6e 20 6f 70 65 6e 20 63   Takes an open c
28980 6f 6e 63 68 20 66 69 6c 65 2c 20 63 6f 70 69 65  onch file, copie
28990 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 74  s the contents t
289a0 6f 20 61 20 6e 65 77 20 70 61 74 68 20 61 6e 64  o a new path and
289b0 20 74 68 65 6e 20 6d 6f 76 65 73 20 0a 2a 2a 20   then moves .** 
289c0 69 74 20 62 61 63 6b 2e 20 20 54 68 65 20 6e 65  it back.  The ne
289d0 77 6c 79 20 63 72 65 61 74 65 64 20 66 69 6c 65  wly created file
289e0 27 73 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  's file descript
289f0 6f 72 20 69 73 20 61 73 73 69 67 6e 65 64 20 74  or is assigned t
28a00 6f 20 74 68 65 0a 2a 2a 20 63 6f 6e 63 68 20 66  o the.** conch f
28a10 69 6c 65 20 73 74 72 75 63 74 75 72 65 20 61 6e  ile structure an
28a20 64 20 66 69 6e 61 6c 6c 79 20 74 68 65 20 6f 72  d finally the or
28a30 69 67 69 6e 61 6c 20 63 6f 6e 63 68 20 66 69 6c  iginal conch fil
28a40 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
28a50 0a 2a 2a 20 63 6c 6f 73 65 64 2e 20 20 52 65 74  .** closed.  Ret
28a60 75 72 6e 73 20 7a 65 72 6f 20 69 66 20 73 75 63  urns zero if suc
28a70 63 65 73 73 66 75 6c 2e 0a 2a 2f 0a 73 74 61 74  cessful..*/.stat
28a80 69 63 20 69 6e 74 20 70 72 6f 78 79 42 72 65 61  ic int proxyBrea
28a90 6b 43 6f 6e 63 68 4c 6f 63 6b 28 75 6e 69 78 46  kConchLock(unixF
28aa0 69 6c 65 20 2a 70 46 69 6c 65 2c 20 75 75 69 64  ile *pFile, uuid
28ab0 5f 74 20 6d 79 48 6f 73 74 49 44 29 7b 0a 20 20  _t myHostID){.  
28ac0 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
28ad0 65 78 74 20 2a 70 43 74 78 20 3d 20 28 70 72 6f  ext *pCtx = (pro
28ae0 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  xyLockingContext
28af0 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e   *)pFile->lockin
28b00 67 43 6f 6e 74 65 78 74 3b 20 0a 20 20 75 6e 69  gContext; .  uni
28b10 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46 69 6c 65  xFile *conchFile
28b20 20 3d 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69   = pCtx->conchFi
28b30 6c 65 3b 0a 20 20 63 68 61 72 20 74 50 61 74 68  le;.  char tPath
28b40 5b 4d 41 58 50 41 54 48 4c 45 4e 5d 3b 0a 20 20  [MAXPATHLEN];.  
28b50 63 68 61 72 20 62 75 66 5b 50 52 4f 58 59 5f 4d  char buf[PROXY_M
28b60 41 58 43 4f 4e 43 48 4c 45 4e 5d 3b 0a 20 20 63  AXCONCHLEN];.  c
28b70 68 61 72 20 2a 63 50 61 74 68 20 3d 20 70 43 74  har *cPath = pCt
28b80 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 50 61 74 68  x->conchFilePath
28b90 3b 0a 20 20 73 69 7a 65 5f 74 20 72 65 61 64 4c  ;.  size_t readL
28ba0 65 6e 20 3d 20 30 3b 0a 20 20 73 69 7a 65 5f 74  en = 0;.  size_t
28bb0 20 70 61 74 68 4c 65 6e 20 3d 20 30 3b 0a 20 20   pathLen = 0;.  
28bc0 63 68 61 72 20 65 72 72 6d 73 67 5b 36 34 5d 20  char errmsg[64] 
28bd0 3d 20 22 22 3b 0a 20 20 69 6e 74 20 66 64 20 3d  = "";.  int fd =
28be0 20 2d 31 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20   -1;.  int rc = 
28bf0 2d 31 3b 0a 0a 20 20 2f 2a 20 63 72 65 61 74 65  -1;..  /* create
28c00 20 61 20 6e 65 77 20 70 61 74 68 20 62 79 20 72   a new path by r
28c10 65 70 6c 61 63 65 20 74 68 65 20 74 72 61 69 6c  eplace the trail
28c20 69 6e 67 20 27 2d 63 6f 6e 63 68 27 20 77 69 74  ing '-conch' wit
28c30 68 20 27 2d 62 72 65 61 6b 27 20 2a 2f 0a 20 20  h '-break' */.  
28c40 70 61 74 68 4c 65 6e 20 3d 20 73 74 72 6c 63 70  pathLen = strlcp
28c50 79 28 74 50 61 74 68 2c 20 63 50 61 74 68 2c 20  y(tPath, cPath, 
28c60 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a 20 20 69  MAXPATHLEN);.  i
28c70 66 28 20 70 61 74 68 4c 65 6e 3e 4d 41 58 50 41  f( pathLen>MAXPA
28c80 54 48 4c 45 4e 20 7c 7c 20 70 61 74 68 4c 65 6e  THLEN || pathLen
28c90 3c 36 20 7c 7c 20 0a 20 20 20 20 20 28 73 74 72  <6 || .     (str
28ca0 6c 63 70 79 28 26 74 50 61 74 68 5b 70 61 74 68  lcpy(&tPath[path
28cb0 4c 65 6e 2d 35 5d 2c 20 22 62 72 65 61 6b 22 2c  Len-5], "break",
28cc0 20 36 29 20 21 3d 20 35 29 20 29 7b 0a 20 20 20   6) != 5) ){.   
28cd0 20 73 70 72 69 6e 74 66 28 65 72 72 6d 73 67 2c   sprintf(errmsg,
28ce0 20 22 70 61 74 68 20 65 72 72 6f 72 20 28 6c 65   "path error (le
28cf0 6e 20 25 64 29 22 2c 20 28 69 6e 74 29 70 61 74  n %d)", (int)pat
28d00 68 4c 65 6e 29 3b 0a 20 20 20 20 67 6f 74 6f 20  hLen);.    goto 
28d10 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20  end_breaklock;. 
28d20 20 7d 0a 20 20 2f 2a 20 72 65 61 64 20 74 68 65   }.  /* read the
28d30 20 63 6f 6e 63 68 20 63 6f 6e 74 65 6e 74 20 2a   conch content *
28d40 2f 0a 20 20 72 65 61 64 4c 65 6e 20 3d 20 70 72  /.  readLen = pr
28d50 65 61 64 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68  ead(conchFile->h
28d60 2c 20 62 75 66 2c 20 50 52 4f 58 59 5f 4d 41 58  , buf, PROXY_MAX
28d70 43 4f 4e 43 48 4c 45 4e 2c 20 30 29 3b 0a 20 20  CONCHLEN, 0);.  
28d80 69 66 28 20 72 65 61 64 4c 65 6e 3c 50 52 4f 58  if( readLen<PROX
28d90 59 5f 50 41 54 48 49 4e 44 45 58 20 29 7b 0a 20  Y_PATHINDEX ){. 
28da0 20 20 20 73 70 72 69 6e 74 66 28 65 72 72 6d 73     sprintf(errms
28db0 67 2c 20 22 72 65 61 64 20 65 72 72 6f 72 20 28  g, "read error (
28dc0 6c 65 6e 20 25 64 29 22 2c 20 28 69 6e 74 29 72  len %d)", (int)r
28dd0 65 61 64 4c 65 6e 29 3b 0a 20 20 20 20 67 6f 74  eadLen);.    got
28de0 6f 20 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b  o end_breaklock;
28df0 0a 20 20 7d 0a 20 20 2f 2a 20 77 72 69 74 65 20  .  }.  /* write 
28e00 69 74 20 6f 75 74 20 74 6f 20 74 68 65 20 74 65  it out to the te
28e10 6d 70 6f 72 61 72 79 20 62 72 65 61 6b 20 66 69  mporary break fi
28e20 6c 65 20 2a 2f 0a 20 20 66 64 20 3d 20 6f 70 65  le */.  fd = ope
28e30 6e 28 74 50 61 74 68 2c 20 28 4f 5f 52 44 57 52  n(tPath, (O_RDWR
28e40 7c 4f 5f 43 52 45 41 54 7c 4f 5f 45 58 43 4c 29  |O_CREAT|O_EXCL)
28e50 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  , SQLITE_DEFAULT
28e60 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e  _FILE_PERMISSION
28e70 53 29 3b 0a 20 20 69 66 28 20 66 64 3c 30 20 29  S);.  if( fd<0 )
28e80 7b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 65 72  {.    sprintf(er
28e90 72 6d 73 67 2c 20 22 63 72 65 61 74 65 20 66 61  rmsg, "create fa
28ea0 69 6c 65 64 20 28 25 64 29 22 2c 20 65 72 72 6e  iled (%d)", errn
28eb0 6f 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64  o);.    goto end
28ec0 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a  _breaklock;.  }.
28ed0 20 20 69 66 28 20 70 77 72 69 74 65 28 66 64 2c    if( pwrite(fd,
28ee0 20 62 75 66 2c 20 72 65 61 64 4c 65 6e 2c 20 30   buf, readLen, 0
28ef0 29 20 21 3d 20 72 65 61 64 4c 65 6e 20 29 7b 0a  ) != readLen ){.
28f00 20 20 20 20 73 70 72 69 6e 74 66 28 65 72 72 6d      sprintf(errm
28f10 73 67 2c 20 22 77 72 69 74 65 20 66 61 69 6c 65  sg, "write faile
28f20 64 20 28 25 64 29 22 2c 20 65 72 72 6e 6f 29 3b  d (%d)", errno);
28f30 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 62 72  .    goto end_br
28f40 65 61 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 69  eaklock;.  }.  i
28f50 66 28 20 72 65 6e 61 6d 65 28 74 50 61 74 68 2c  f( rename(tPath,
28f60 20 63 50 61 74 68 29 20 29 7b 0a 20 20 20 20 73   cPath) ){.    s
28f70 70 72 69 6e 74 66 28 65 72 72 6d 73 67 2c 20 22  printf(errmsg, "
28f80 72 65 6e 61 6d 65 20 66 61 69 6c 65 64 20 28 25  rename failed (%
28f90 64 29 22 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20  d)", errno);.   
28fa0 20 67 6f 74 6f 20 65 6e 64 5f 62 72 65 61 6b 6c   goto end_breakl
28fb0 6f 63 6b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  ock;.  }.  rc = 
28fc0 30 3b 0a 20 20 66 70 72 69 6e 74 66 28 73 74 64  0;.  fprintf(std
28fd0 65 72 72 2c 20 22 62 72 6f 6b 65 20 73 74 61 6c  err, "broke stal
28fe0 65 20 6c 6f 63 6b 20 6f 6e 20 25 73 5c 6e 22 2c  e lock on %s\n",
28ff0 20 63 50 61 74 68 29 3b 0a 20 20 63 6c 6f 73 65   cPath);.  close
29000 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 29 3b 0a  (conchFile->h);.
29010 20 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 20 3d    conchFile->h =
29020 20 66 64 3b 0a 20 20 63 6f 6e 63 68 46 69 6c 65   fd;.  conchFile
29030 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 4f 5f  ->openFlags = O_
29040 52 44 57 52 20 7c 20 4f 5f 43 52 45 41 54 3b 0a  RDWR | O_CREAT;.
29050 0a 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3a 0a  .end_breaklock:.
29060 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
29070 69 66 28 20 66 64 3e 3d 30 20 29 7b 0a 20 20 20  if( fd>=0 ){.   
29080 20 20 20 75 6e 6c 69 6e 6b 28 74 50 61 74 68 29     unlink(tPath)
29090 3b 0a 20 20 20 20 20 20 63 6c 6f 73 65 28 66 64  ;.      close(fd
290a0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 70 72  );.    }.    fpr
290b0 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 66 61  intf(stderr, "fa
290c0 69 6c 65 64 20 74 6f 20 62 72 65 61 6b 20 73 74  iled to break st
290d0 61 6c 65 20 6c 6f 63 6b 20 6f 6e 20 25 73 2c 20  ale lock on %s, 
290e0 25 73 5c 6e 22 2c 20 63 50 61 74 68 2c 20 65 72  %s\n", cPath, er
290f0 72 6d 73 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74  rmsg);.  }.  ret
29100 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 54 61  urn rc;.}../* Ta
29110 6b 65 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ke the requested
29120 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 63 6f 6e   lock on the con
29130 63 68 20 66 69 6c 65 20 61 6e 64 20 62 72 65 61  ch file and brea
29140 6b 20 61 20 73 74 61 6c 65 20 6c 6f 63 6b 20 69  k a stale lock i
29150 66 20 74 68 65 20 0a 2a 2a 20 68 6f 73 74 20 69  f the .** host i
29160 64 20 6d 61 74 63 68 65 73 2e 0a 2a 2f 0a 73 74  d matches..*/.st
29170 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43 6f  atic int proxyCo
29180 6e 63 68 4c 6f 63 6b 28 75 6e 69 78 46 69 6c 65  nchLock(unixFile
29190 20 2a 70 46 69 6c 65 2c 20 75 75 69 64 5f 74 20   *pFile, uuid_t 
291a0 6d 79 48 6f 73 74 49 44 2c 20 69 6e 74 20 6c 6f  myHostID, int lo
291b0 63 6b 54 79 70 65 29 7b 0a 20 20 70 72 6f 78 79  ckType){.  proxy
291c0 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
291d0 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63  pCtx = (proxyLoc
291e0 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 46  kingContext *)pF
291f0 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
29200 65 78 74 3b 20 0a 20 20 75 6e 69 78 46 69 6c 65  ext; .  unixFile
29210 20 2a 63 6f 6e 63 68 46 69 6c 65 20 3d 20 70 43   *conchFile = pC
29220 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 3b 0a 20  tx->conchFile;. 
29230 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
29240 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 54 72 69 65  _OK;.  int nTrie
29250 73 20 3d 20 30 3b 0a 20 20 73 74 72 75 63 74 20  s = 0;.  struct 
29260 74 69 6d 65 73 70 65 63 20 63 6f 6e 63 68 4d 6f  timespec conchMo
29270 64 54 69 6d 65 3b 0a 20 20 0a 20 20 64 6f 20 7b  dTime;.  .  do {
29280 0a 20 20 20 20 72 63 20 3d 20 63 6f 6e 63 68 46  .    rc = conchF
29290 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 4c  ile->pMethod->xL
292a0 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c  ock((sqlite3_fil
292b0 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 6c 6f  e*)conchFile, lo
292c0 63 6b 54 79 70 65 29 3b 0a 20 20 20 20 6e 54 72  ckType);.    nTr
292d0 69 65 73 20 2b 2b 3b 0a 20 20 20 20 69 66 28 20  ies ++;.    if( 
292e0 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc==SQLITE_BUSY 
292f0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ){.      /* If t
29300 68 65 20 6c 6f 63 6b 20 66 61 69 6c 65 64 20 28  he lock failed (
29310 62 75 73 79 29 3a 0a 20 20 20 20 20 20 20 2a 20  busy):.       * 
29320 31 73 74 20 74 72 79 3a 20 67 65 74 20 74 68 65  1st try: get the
29330 20 6d 6f 64 20 74 69 6d 65 20 6f 66 20 74 68 65   mod time of the
29340 20 63 6f 6e 63 68 2c 20 77 61 69 74 20 30 2e 35   conch, wait 0.5
29350 73 20 61 6e 64 20 74 72 79 20 61 67 61 69 6e 2e  s and try again.
29360 20 0a 20 20 20 20 20 20 20 2a 20 32 6e 64 20 74   .       * 2nd t
29370 72 79 3a 20 66 61 69 6c 20 69 66 20 74 68 65 20  ry: fail if the 
29380 6d 6f 64 20 74 69 6d 65 20 63 68 61 6e 67 65 64  mod time changed
29390 20 6f 72 20 68 6f 73 74 20 69 64 20 69 73 20 64   or host id is d
293a0 69 66 66 65 72 65 6e 74 2c 20 77 61 69 74 20 0a  ifferent, wait .
293b0 20 20 20 20 20 20 20 2a 20 20 20 20 20 20 20 20         *        
293c0 20 20 20 31 30 20 73 65 63 20 61 6e 64 20 74 72     10 sec and tr
293d0 79 20 61 67 61 69 6e 0a 20 20 20 20 20 20 20 2a  y again.       *
293e0 20 33 72 64 20 74 72 79 3a 20 62 72 65 61 6b 20   3rd try: break 
293f0 74 68 65 20 6c 6f 63 6b 20 75 6e 6c 65 73 73 20  the lock unless 
29400 74 68 65 20 6d 6f 64 20 74 69 6d 65 20 68 61 73  the mod time has
29410 20 63 68 61 6e 67 65 64 2e 0a 20 20 20 20 20 20   changed..      
29420 20 2a 2f 0a 20 20 20 20 20 20 73 74 72 75 63 74   */.      struct
29430 20 73 74 61 74 20 62 75 66 3b 0a 20 20 20 20 20   stat buf;.     
29440 20 69 66 28 20 66 73 74 61 74 28 63 6f 6e 63 68   if( fstat(conch
29450 46 69 6c 65 2d 3e 68 2c 20 26 62 75 66 29 20 29  File->h, &buf) )
29460 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d  {.        pFile-
29470 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72  >lastErrno = err
29480 6e 6f 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  no;.        retu
29490 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
294a0 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  LOCK;.      }.  
294b0 20 20 20 20 0a 20 20 20 20 20 20 69 66 28 20 6e      .      if( n
294c0 54 72 69 65 73 3d 3d 31 20 29 7b 0a 20 20 20 20  Tries==1 ){.    
294d0 20 20 20 20 63 6f 6e 63 68 4d 6f 64 54 69 6d 65      conchModTime
294e0 20 3d 20 62 75 66 2e 73 74 5f 6d 74 69 6d 65 73   = buf.st_mtimes
294f0 70 65 63 3b 0a 20 20 20 20 20 20 20 20 75 73 6c  pec;.        usl
29500 65 65 70 28 35 30 30 30 30 30 29 3b 20 2f 2a 20  eep(500000); /* 
29510 77 61 69 74 20 30 2e 35 20 73 65 63 20 61 6e 64  wait 0.5 sec and
29520 20 74 72 79 20 74 68 65 20 6c 6f 63 6b 20 61 67   try the lock ag
29530 61 69 6e 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f  ain*/.        co
29540 6e 74 69 6e 75 65 3b 20 20 0a 20 20 20 20 20 20  ntinue;  .      
29550 7d 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  }..      assert(
29560 20 6e 54 72 69 65 73 3e 31 20 29 3b 0a 20 20 20   nTries>1 );.   
29570 20 20 20 69 66 28 20 63 6f 6e 63 68 4d 6f 64 54     if( conchModT
29580 69 6d 65 2e 74 76 5f 73 65 63 20 21 3d 20 62 75  ime.tv_sec != bu
29590 66 2e 73 74 5f 6d 74 69 6d 65 73 70 65 63 2e 74  f.st_mtimespec.t
295a0 76 5f 73 65 63 20 7c 7c 20 0a 20 20 20 20 20 20  v_sec || .      
295b0 20 20 20 63 6f 6e 63 68 4d 6f 64 54 69 6d 65 2e     conchModTime.
295c0 74 76 5f 6e 73 65 63 20 21 3d 20 62 75 66 2e 73  tv_nsec != buf.s
295d0 74 5f 6d 74 69 6d 65 73 70 65 63 2e 74 76 5f 6e  t_mtimespec.tv_n
295e0 73 65 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72  sec ){.        r
295f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
29600 59 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  Y;.      }.     
29610 20 0a 20 20 20 20 20 20 69 66 28 20 6e 54 72 69   .      if( nTri
29620 65 73 3d 3d 32 20 29 7b 20 20 0a 20 20 20 20 20  es==2 ){  .     
29630 20 20 20 63 68 61 72 20 74 42 75 66 5b 50 52 4f     char tBuf[PRO
29640 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 5d 3b  XY_MAXCONCHLEN];
29650 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6c 65 6e  .        int len
29660 20 3d 20 70 72 65 61 64 28 63 6f 6e 63 68 46 69   = pread(conchFi
29670 6c 65 2d 3e 68 2c 20 74 42 75 66 2c 20 50 52 4f  le->h, tBuf, PRO
29680 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 2c 20  XY_MAXCONCHLEN, 
29690 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
296a0 6c 65 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  len<0 ){.       
296b0 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
296c0 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
296d0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
296e0 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b  LITE_IOERR_LOCK;
296f0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
29700 20 20 20 69 66 28 20 6c 65 6e 3e 50 52 4f 58 59     if( len>PROXY
29710 5f 50 41 54 48 49 4e 44 45 58 20 26 26 20 74 42  _PATHINDEX && tB
29720 75 66 5b 30 5d 3d 3d 28 63 68 61 72 29 50 52 4f  uf[0]==(char)PRO
29730 58 59 5f 43 4f 4e 43 48 56 45 52 53 49 4f 4e 29  XY_CONCHVERSION)
29740 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64  {.          /* d
29750 6f 6e 27 74 20 62 72 65 61 6b 20 74 68 65 20 6c  on't break the l
29760 6f 63 6b 20 69 66 20 74 68 65 20 68 6f 73 74 20  ock if the host 
29770 69 64 20 64 6f 65 73 6e 27 74 20 6d 61 74 63 68  id doesn't match
29780 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
29790 28 20 30 21 3d 6d 65 6d 63 6d 70 28 26 74 42 75  ( 0!=memcmp(&tBu
297a0 66 5b 50 52 4f 58 59 5f 48 45 41 44 45 52 4c 45  f[PROXY_HEADERLE
297b0 4e 5d 2c 20 6d 79 48 6f 73 74 49 44 2c 20 50 52  N], myHostID, PR
297c0 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 29 20 29  OXY_HOSTIDLEN) )
297d0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  {.            re
297e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
297f0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
29800 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
29810 20 20 20 20 20 20 20 2f 2a 20 64 6f 6e 27 74 20         /* don't 
29820 62 72 65 61 6b 20 74 68 65 20 6c 6f 63 6b 20 6f  break the lock o
29830 6e 20 73 68 6f 72 74 20 72 65 61 64 20 6f 72 20  n short read or 
29840 61 20 76 65 72 73 69 6f 6e 20 6d 69 73 6d 61 74  a version mismat
29850 63 68 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ch */.          
29860 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
29870 53 59 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  SY;.        }.  
29880 20 20 20 20 20 20 75 73 6c 65 65 70 28 31 30 30        usleep(100
29890 30 30 30 30 30 29 3b 20 2f 2a 20 77 61 69 74 20  00000); /* wait 
298a0 31 30 20 73 65 63 20 61 6e 64 20 74 72 79 20 74  10 sec and try t
298b0 68 65 20 6c 6f 63 6b 20 61 67 61 69 6e 20 2a 2f  he lock again */
298c0 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  .        continu
298d0 65 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e; .      }.    
298e0 20 20 0a 20 20 20 20 20 20 61 73 73 65 72 74 28    .      assert(
298f0 20 6e 54 72 69 65 73 3d 3d 33 20 29 3b 0a 20 20   nTries==3 );.  
29900 20 20 20 20 69 66 28 20 30 3d 3d 70 72 6f 78 79      if( 0==proxy
29910 42 72 65 61 6b 43 6f 6e 63 68 4c 6f 63 6b 28 70  BreakConchLock(p
29920 46 69 6c 65 2c 20 6d 79 48 6f 73 74 49 44 29 20  File, myHostID) 
29930 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
29940 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
29950 20 20 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d     if( lockType=
29960 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
29970 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
29980 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65  = conchFile->pMe
29990 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28 73 71 6c  thod->xLock((sql
299a0 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68  ite3_file*)conch
299b0 46 69 6c 65 2c 20 53 48 41 52 45 44 5f 4c 4f 43  File, SHARED_LOC
299c0 4b 29 3b 20 20 20 20 20 20 20 20 20 20 0a 20 20  K);          .  
299d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
299e0 69 66 28 20 21 72 63 20 29 7b 0a 20 20 20 20 20  if( !rc ){.     
299f0 20 20 20 20 20 72 63 20 3d 20 63 6f 6e 63 68 46       rc = conchF
29a00 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 4c  ile->pMethod->xL
29a10 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c  ock((sqlite3_fil
29a20 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 6c 6f  e*)conchFile, lo
29a30 63 6b 54 79 70 65 29 3b 0a 20 20 20 20 20 20 20  ckType);.       
29a40 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
29a50 0a 20 20 7d 20 77 68 69 6c 65 28 20 72 63 3d 3d  .  } while( rc==
29a60 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20 6e  SQLITE_BUSY && n
29a70 54 72 69 65 73 3c 33 20 29 3b 0a 20 20 0a 20 20  Tries<3 );.  .  
29a80 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
29a90 20 54 61 6b 65 73 20 74 68 65 20 63 6f 6e 63 68   Takes the conch
29aa0 20 62 79 20 74 61 6b 69 6e 67 20 61 20 73 68 61   by taking a sha
29ab0 72 65 64 20 6c 6f 63 6b 20 61 6e 64 20 72 65 61  red lock and rea
29ac0 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 63  d the contents c
29ad0 6f 6e 63 68 2c 20 69 66 20 0a 2a 2a 20 6c 6f 63  onch, if .** loc
29ae0 6b 50 61 74 68 20 69 73 20 6e 6f 6e 2d 4e 55 4c  kPath is non-NUL
29af0 4c 2c 20 74 68 65 20 68 6f 73 74 20 49 44 20 61  L, the host ID a
29b00 6e 64 20 6c 6f 63 6b 20 66 69 6c 65 20 70 61 74  nd lock file pat
29b10 68 20 6d 75 73 74 20 6d 61 74 63 68 2e 20 20 41  h must match.  A
29b20 20 4e 55 4c 4c 20 0a 2a 2a 20 6c 6f 63 6b 50 61   NULL .** lockPa
29b30 74 68 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  th means that th
29b40 65 20 6c 6f 63 6b 50 61 74 68 20 69 6e 20 74 68  e lockPath in th
29b50 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 77 69 6c  e conch file wil
29b60 6c 20 62 65 20 75 73 65 64 20 69 66 20 74 68 65  l be used if the
29b70 20 0a 2a 2a 20 68 6f 73 74 20 49 44 73 20 6d 61   .** host IDs ma
29b80 74 63 68 2c 20 6f 72 20 61 20 6e 65 77 20 6c 6f  tch, or a new lo
29b90 63 6b 20 70 61 74 68 20 77 69 6c 6c 20 62 65 20  ck path will be 
29ba0 67 65 6e 65 72 61 74 65 64 20 61 75 74 6f 6d 61  generated automa
29bb0 74 69 63 61 6c 6c 79 20 0a 2a 2a 20 61 6e 64 20  tically .** and 
29bc0 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 63  written to the c
29bd0 6f 6e 63 68 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74  onch file..*/.st
29be0 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 54 61  atic int proxyTa
29bf0 6b 65 43 6f 6e 63 68 28 75 6e 69 78 46 69 6c 65  keConch(unixFile
29c00 20 2a 70 46 69 6c 65 29 7b 0a 20 20 70 72 6f 78   *pFile){.  prox
29c10 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  yLockingContext 
29c20 2a 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f  *pCtx = (proxyLo
29c30 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70  ckingContext *)p
29c40 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
29c50 74 65 78 74 3b 20 0a 20 20 0a 20 20 69 66 28 20  text; .  .  if( 
29c60 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 21  pCtx->conchHeld!
29c70 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
29c80 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65   SQLITE_OK;.  }e
29c90 6c 73 65 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c  lse{.    unixFil
29ca0 65 20 2a 63 6f 6e 63 68 46 69 6c 65 20 3d 20 70  e *conchFile = p
29cb0 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 3b 0a  Ctx->conchFile;.
29cc0 20 20 20 20 75 75 69 64 5f 74 20 6d 79 48 6f 73      uuid_t myHos
29cd0 74 49 44 3b 0a 20 20 20 20 69 6e 74 20 70 45 72  tID;.    int pEr
29ce0 72 6f 72 20 3d 20 30 3b 0a 20 20 20 20 63 68 61  ror = 0;.    cha
29cf0 72 20 72 65 61 64 42 75 66 5b 50 52 4f 58 59 5f  r readBuf[PROXY_
29d00 4d 41 58 43 4f 4e 43 48 4c 45 4e 5d 3b 0a 20 20  MAXCONCHLEN];.  
29d10 20 20 63 68 61 72 20 6c 6f 63 6b 50 61 74 68 5b    char lockPath[
29d20 4d 41 58 50 41 54 48 4c 45 4e 5d 3b 0a 20 20 20  MAXPATHLEN];.   
29d30 20 63 68 61 72 20 2a 74 65 6d 70 4c 6f 63 6b 50   char *tempLockP
29d40 61 74 68 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  ath = NULL;.    
29d50 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
29d60 4f 4b 3b 0a 20 20 20 20 69 6e 74 20 63 72 65 61  OK;.    int crea
29d70 74 65 43 6f 6e 63 68 20 3d 20 30 3b 0a 20 20 20  teConch = 0;.   
29d80 20 69 6e 74 20 68 6f 73 74 49 64 4d 61 74 63 68   int hostIdMatch
29d90 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 72 65   = 0;.    int re
29da0 61 64 4c 65 6e 20 3d 20 30 3b 0a 20 20 20 20 69  adLen = 0;.    i
29db0 6e 74 20 74 72 79 4f 6c 64 4c 6f 63 6b 50 61 74  nt tryOldLockPat
29dc0 68 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 66  h = 0;.    int f
29dd0 6f 72 63 65 4e 65 77 4c 6f 63 6b 50 61 74 68 20  orceNewLockPath 
29de0 3d 20 30 3b 0a 20 20 20 20 0a 20 20 20 20 4f 53  = 0;.    .    OS
29df0 54 52 41 43 45 34 28 22 54 41 4b 45 43 4f 4e 43  TRACE4("TAKECONC
29e00 48 20 20 25 64 20 66 6f 72 20 25 73 20 70 69 64  H  %d for %s pid
29e10 3d 25 64 5c 6e 22 2c 20 63 6f 6e 63 68 46 69 6c  =%d\n", conchFil
29e20 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20  e->h,.          
29e30 20 20 20 28 70 43 74 78 2d 3e 6c 6f 63 6b 50 72     (pCtx->lockPr
29e40 6f 78 79 50 61 74 68 20 3f 20 70 43 74 78 2d 3e  oxyPath ? pCtx->
29e50 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 3a 20  lockProxyPath : 
29e60 22 3a 61 75 74 6f 3a 22 29 2c 20 67 65 74 70 69  ":auto:"), getpi
29e70 64 28 29 29 3b 0a 0a 20 20 20 20 72 63 20 3d 20  d());..    rc = 
29e80 70 72 6f 78 79 47 65 74 48 6f 73 74 49 44 28 6d  proxyGetHostID(m
29e90 79 48 6f 73 74 49 44 2c 20 26 70 45 72 72 6f 72  yHostID, &pError
29ea0 29 3b 0a 20 20 20 20 69 66 28 20 28 72 63 26 30  );.    if( (rc&0
29eb0 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 49 4f 45  xff)==SQLITE_IOE
29ec0 52 52 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  RR ){.      pFil
29ed0 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 70  e->lastErrno = p
29ee0 45 72 72 6f 72 3b 0a 20 20 20 20 20 20 67 6f 74  Error;.      got
29ef0 6f 20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63 68 3b  o end_takeconch;
29f00 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
29f10 70 72 6f 78 79 43 6f 6e 63 68 4c 6f 63 6b 28 70  proxyConchLock(p
29f20 46 69 6c 65 2c 20 6d 79 48 6f 73 74 49 44 2c 20  File, myHostID, 
29f30 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20  SHARED_LOCK);.  
29f40 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
29f50 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  _OK ){.      got
29f60 6f 20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63 68 3b  o end_takeconch;
29f70 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 72 65  .    }.    /* re
29f80 61 64 20 74 68 65 20 65 78 69 73 74 69 6e 67 20  ad the existing 
29f90 63 6f 6e 63 68 20 66 69 6c 65 20 2a 2f 0a 20 20  conch file */.  
29fa0 20 20 72 65 61 64 4c 65 6e 20 3d 20 73 65 65 6b    readLen = seek
29fb0 41 6e 64 52 65 61 64 28 28 75 6e 69 78 46 69 6c  AndRead((unixFil
29fc0 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 30 2c  e*)conchFile, 0,
29fd0 20 72 65 61 64 42 75 66 2c 20 50 52 4f 58 59 5f   readBuf, PROXY_
29fe0 4d 41 58 43 4f 4e 43 48 4c 45 4e 29 3b 0a 20 20  MAXCONCHLEN);.  
29ff0 20 20 69 66 28 20 72 65 61 64 4c 65 6e 3c 30 20    if( readLen<0 
2a000 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 2f 4f 20  ){.      /* I/O 
2a010 65 72 72 6f 72 3a 20 6c 61 73 74 45 72 72 6e 6f  error: lastErrno
2a020 20 73 65 74 20 62 79 20 73 65 65 6b 41 6e 64 52   set by seekAndR
2a030 65 61 64 20 2a 2f 0a 20 20 20 20 20 20 70 46 69  ead */.      pFi
2a040 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
2a050 63 6f 6e 63 68 46 69 6c 65 2d 3e 6c 61 73 74 45  conchFile->lastE
2a060 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d  rrno;.      rc =
2a070 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45   SQLITE_IOERR_RE
2a080 41 44 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65  AD;.      goto e
2a090 6e 64 5f 74 61 6b 65 63 6f 6e 63 68 3b 0a 20 20  nd_takeconch;.  
2a0a0 20 20 7d 65 6c 73 65 20 69 66 28 20 72 65 61 64    }else if( read
2a0b0 4c 65 6e 3c 3d 28 50 52 4f 58 59 5f 48 45 41 44  Len<=(PROXY_HEAD
2a0c0 45 52 4c 45 4e 2b 50 52 4f 58 59 5f 48 4f 53 54  ERLEN+PROXY_HOST
2a0d0 49 44 4c 45 4e 29 20 7c 7c 20 0a 20 20 20 20 20  IDLEN) || .     
2a0e0 20 20 20 20 20 20 20 20 72 65 61 64 42 75 66 5b          readBuf[
2a0f0 30 5d 21 3d 28 63 68 61 72 29 50 52 4f 58 59 5f  0]!=(char)PROXY_
2a100 43 4f 4e 43 48 56 45 52 53 49 4f 4e 20 29 7b 0a  CONCHVERSION ){.
2a110 20 20 20 20 20 20 2f 2a 20 61 20 73 68 6f 72 74        /* a short
2a120 20 72 65 61 64 20 6f 72 20 76 65 72 73 69 6f 6e   read or version
2a130 20 66 6f 72 6d 61 74 20 6d 69 73 6d 61 74 63 68   format mismatch
2a140 20 6d 65 61 6e 73 20 77 65 20 6e 65 65 64 20 74   means we need t
2a150 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 0a  o create a new .
2a160 20 20 20 20 20 20 2a 2a 20 63 6f 6e 63 68 20 66        ** conch f
2a170 69 6c 65 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20  ile. .      */. 
2a180 20 20 20 20 20 63 72 65 61 74 65 43 6f 6e 63 68       createConch
2a190 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 1;.    }.    
2a1a0 2f 2a 20 69 66 20 74 68 65 20 68 6f 73 74 20 69  /* if the host i
2a1b0 64 20 6d 61 74 63 68 65 73 20 61 6e 64 20 74 68  d matches and th
2a1c0 65 20 6c 6f 63 6b 20 70 61 74 68 20 61 6c 72 65  e lock path alre
2a1d0 61 64 79 20 65 78 69 73 74 73 20 69 6e 20 74 68  ady exists in th
2a1e0 65 20 63 6f 6e 63 68 0a 20 20 20 20 2a 2a 20 77  e conch.    ** w
2a1f0 65 27 6c 6c 20 74 72 79 20 74 6f 20 75 73 65 20  e'll try to use 
2a200 74 68 65 20 70 61 74 68 20 74 68 65 72 65 2c 20  the path there, 
2a210 69 66 20 77 65 20 63 61 6e 27 74 20 6f 70 65 6e  if we can't open
2a220 20 74 68 61 74 20 70 61 74 68 2c 20 77 65 27 6c   that path, we'l
2a230 6c 20 0a 20 20 20 20 2a 2a 20 72 65 74 72 79 20  l .    ** retry 
2a240 77 69 74 68 20 61 20 6e 65 77 20 61 75 74 6f 2d  with a new auto-
2a250 67 65 6e 65 72 61 74 65 64 20 70 61 74 68 20 0a  generated path .
2a260 20 20 20 20 2a 2f 0a 20 20 20 20 64 6f 20 7b 20      */.    do { 
2a270 2f 2a 20 69 6e 20 63 61 73 65 20 77 65 20 6e 65  /* in case we ne
2a280 65 64 20 74 6f 20 74 72 79 20 61 67 61 69 6e 20  ed to try again 
2a290 66 6f 72 20 61 6e 20 3a 61 75 74 6f 3a 20 6e 61  for an :auto: na
2a2a0 6d 65 64 20 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f  med lock file */
2a2b0 0a 0a 20 20 20 20 20 20 69 66 28 20 21 63 72 65  ..      if( !cre
2a2c0 61 74 65 43 6f 6e 63 68 20 26 26 20 21 66 6f 72  ateConch && !for
2a2d0 63 65 4e 65 77 4c 6f 63 6b 50 61 74 68 20 29 7b  ceNewLockPath ){
2a2e0 0a 20 20 20 20 20 20 20 20 68 6f 73 74 49 64 4d  .        hostIdM
2a2f0 61 74 63 68 20 3d 20 21 6d 65 6d 63 6d 70 28 26  atch = !memcmp(&
2a300 72 65 61 64 42 75 66 5b 50 52 4f 58 59 5f 48 45  readBuf[PROXY_HE
2a310 41 44 45 52 4c 45 4e 5d 2c 20 6d 79 48 6f 73 74  ADERLEN], myHost
2a320 49 44 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  ID, .           
2a330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a340 20 20 20 20 20 20 20 50 52 4f 58 59 5f 48 4f 53         PROXY_HOS
2a350 54 49 44 4c 45 4e 29 3b 0a 20 20 20 20 20 20 20  TIDLEN);.       
2a360 20 2f 2a 20 69 66 20 74 68 65 20 63 6f 6e 63 68   /* if the conch
2a370 20 68 61 73 20 64 61 74 61 20 63 6f 6d 70 61 72   has data compar
2a380 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 2a  e the contents *
2a390 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70  /.        if( !p
2a3a0 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61  Ctx->lockProxyPa
2a3b0 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  th ){.          
2a3c0 2f 2a 20 66 6f 72 20 61 75 74 6f 2d 6e 61 6d 65  /* for auto-name
2a3d0 64 20 6c 6f 63 61 6c 20 6c 6f 63 6b 20 66 69 6c  d local lock fil
2a3e0 65 2c 20 6a 75 73 74 20 63 68 65 63 6b 20 74 68  e, just check th
2a3f0 65 20 68 6f 73 74 20 49 44 20 61 6e 64 20 77 65  e host ID and we
2a400 27 6c 6c 0a 20 20 20 20 20 20 20 20 20 20 20 2a  'll.           *
2a410 2a 20 75 73 65 20 74 68 65 20 6c 6f 63 61 6c 20  * use the local 
2a420 6c 6f 63 6b 20 66 69 6c 65 20 70 61 74 68 20 74  lock file path t
2a430 68 61 74 27 73 20 61 6c 72 65 61 64 79 20 69 6e  hat's already in
2a440 20 74 68 65 72 65 0a 20 20 20 20 20 20 20 20 20   there.         
2a450 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69    */.          i
2a460 66 28 20 68 6f 73 74 49 64 4d 61 74 63 68 20 29  f( hostIdMatch )
2a470 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 69  {.            si
2a480 7a 65 5f 74 20 70 61 74 68 4c 65 6e 20 3d 20 28  ze_t pathLen = (
2a490 72 65 61 64 4c 65 6e 20 2d 20 50 52 4f 58 59 5f  readLen - PROXY_
2a4a0 50 41 54 48 49 4e 44 45 58 29 3b 0a 20 20 20 20  PATHINDEX);.    
2a4b0 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20          .       
2a4c0 20 20 20 20 20 69 66 28 20 70 61 74 68 4c 65 6e       if( pathLen
2a4d0 3e 3d 4d 41 58 50 41 54 48 4c 45 4e 20 29 7b 0a  >=MAXPATHLEN ){.
2a4e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61                pa
2a4f0 74 68 4c 65 6e 3d 4d 41 58 50 41 54 48 4c 45 4e  thLen=MAXPATHLEN
2a500 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  -1;.            
2a510 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65  }.            me
2a520 6d 63 70 79 28 6c 6f 63 6b 50 61 74 68 2c 20 26  mcpy(lockPath, &
2a530 72 65 61 64 42 75 66 5b 50 52 4f 58 59 5f 50 41  readBuf[PROXY_PA
2a540 54 48 49 4e 44 45 58 5d 2c 20 70 61 74 68 4c 65  THINDEX], pathLe
2a550 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  n);.            
2a560 6c 6f 63 6b 50 61 74 68 5b 70 61 74 68 4c 65 6e  lockPath[pathLen
2a570 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  ] = 0;.         
2a580 20 20 20 74 65 6d 70 4c 6f 63 6b 50 61 74 68 20     tempLockPath 
2a590 3d 20 6c 6f 63 6b 50 61 74 68 3b 0a 20 20 20 20  = lockPath;.    
2a5a0 20 20 20 20 20 20 20 20 74 72 79 4f 6c 64 4c 6f          tryOldLo
2a5b0 63 6b 50 61 74 68 20 3d 20 31 3b 0a 20 20 20 20  ckPath = 1;.    
2a5c0 20 20 20 20 20 20 20 20 2f 2a 20 63 72 65 61 74          /* creat
2a5d0 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  e a copy of the 
2a5e0 6c 6f 63 6b 20 70 61 74 68 20 69 66 20 74 68 65  lock path if the
2a5f0 20 63 6f 6e 63 68 20 69 73 20 74 61 6b 65 6e 20   conch is taken 
2a600 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  */.            g
2a610 6f 74 6f 20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63  oto end_takeconc
2a620 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  h;.          }. 
2a630 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
2a640 20 68 6f 73 74 49 64 4d 61 74 63 68 20 26 26 20   hostIdMatch && 
2a650 21 73 74 72 6e 63 6d 70 28 70 43 74 78 2d 3e 6c  !strncmp(pCtx->l
2a660 6f 63 6b 50 72 6f 78 79 50 61 74 68 2c 20 0a 20  ockProxyPath, . 
2a670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a690 20 20 20 20 20 20 20 20 20 26 72 65 61 64 42 75           &readBu
2a6a0 66 5b 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45  f[PROXY_PATHINDE
2a6b0 58 5d 2c 20 72 65 61 64 4c 65 6e 2d 50 52 4f 58  X], readLen-PROX
2a6c0 59 5f 50 41 54 48 49 4e 44 45 58 29 20 29 7b 0a  Y_PATHINDEX) ){.
2a6d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 63 6f 6e            /* con
2a6e0 63 68 20 68 6f 73 74 20 61 6e 64 20 6c 6f 63 6b  ch host and lock
2a6f0 20 70 61 74 68 20 6d 61 74 63 68 20 2a 2f 0a 20   path match */. 
2a700 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
2a710 64 5f 74 61 6b 65 63 6f 6e 63 68 3b 20 0a 20 20  d_takeconch; .  
2a720 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
2a730 20 20 20 20 20 20 0a 20 20 20 20 20 20 2f 2a 20        .      /* 
2a740 69 66 20 74 68 65 20 63 6f 6e 63 68 20 69 73 6e  if the conch isn
2a750 27 74 20 77 72 69 74 61 62 6c 65 20 61 6e 64 20  't writable and 
2a760 64 6f 65 73 6e 27 74 20 6d 61 74 63 68 2c 20 77  doesn't match, w
2a770 65 20 63 61 6e 27 74 20 74 61 6b 65 20 69 74 20  e can't take it 
2a780 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 28 63 6f  */.      if( (co
2a790 6e 63 68 46 69 6c 65 2d 3e 6f 70 65 6e 46 6c 61  nchFile->openFla
2a7a0 67 73 26 4f 5f 52 44 57 52 29 20 3d 3d 20 30 20  gs&O_RDWR) == 0 
2a7b0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
2a7c0 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
2a7d0 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 74 61       goto end_ta
2a7e0 6b 65 63 6f 6e 63 68 3b 0a 20 20 20 20 20 20 7d  keconch;.      }
2a7f0 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20 2f 2a  .      .      /*
2a800 20 65 69 74 68 65 72 20 74 68 65 20 63 6f 6e 63   either the conc
2a810 68 20 64 69 64 6e 27 74 20 6d 61 74 63 68 20 6f  h didn't match o
2a820 72 20 77 65 20 6e 65 65 64 20 74 6f 20 63 72 65  r we need to cre
2a830 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 2a 2f  ate a new one */
2a840 0a 20 20 20 20 20 20 69 66 28 20 21 70 43 74 78  .      if( !pCtx
2a850 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20  ->lockProxyPath 
2a860 29 7b 0a 20 20 20 20 20 20 20 20 70 72 6f 78 79  ){.        proxy
2a870 47 65 74 4c 6f 63 6b 50 61 74 68 28 70 43 74 78  GetLockPath(pCtx
2a880 2d 3e 64 62 50 61 74 68 2c 20 6c 6f 63 6b 50 61  ->dbPath, lockPa
2a890 74 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b  th, MAXPATHLEN);
2a8a0 0a 20 20 20 20 20 20 20 20 74 65 6d 70 4c 6f 63  .        tempLoc
2a8b0 6b 50 61 74 68 20 3d 20 6c 6f 63 6b 50 61 74 68  kPath = lockPath
2a8c0 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 63 72 65  ;.        /* cre
2a8d0 61 74 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68  ate a copy of th
2a8e0 65 20 6c 6f 63 6b 20 70 61 74 68 20 5f 6f 6e 6c  e lock path _onl
2a8f0 79 5f 20 69 66 20 74 68 65 20 63 6f 6e 63 68 20  y_ if the conch 
2a900 69 73 20 74 61 6b 65 6e 20 2a 2f 0a 20 20 20 20  is taken */.    
2a910 20 20 7d 0a 20 20 20 20 20 20 0a 20 20 20 20 20    }.      .     
2a920 20 2f 2a 20 75 70 64 61 74 65 20 63 6f 6e 63 68   /* update conch
2a930 20 77 69 74 68 20 68 6f 73 74 20 61 6e 64 20 70   with host and p
2a940 61 74 68 20 28 74 68 69 73 20 77 69 6c 6c 20 66  ath (this will f
2a950 61 69 6c 20 69 66 20 6f 74 68 65 72 20 70 72 6f  ail if other pro
2a960 63 65 73 73 0a 20 20 20 20 20 20 2a 2a 20 68 61  cess.      ** ha
2a970 73 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  s a shared lock 
2a980 61 6c 72 65 61 64 79 29 2c 20 69 66 20 74 68 65  already), if the
2a990 20 68 6f 73 74 20 69 64 20 6d 61 74 63 68 65 73   host id matches
2a9a0 2c 20 75 73 65 20 74 68 65 20 62 69 67 0a 20 20  , use the big.  
2a9b0 20 20 20 20 2a 2a 20 73 74 69 63 6b 2e 0a 20 20      ** stick..  
2a9c0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 66 75 74      */.      fut
2a9d0 69 6d 65 73 28 63 6f 6e 63 68 46 69 6c 65 2d 3e  imes(conchFile->
2a9e0 68 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  h, NULL);.      
2a9f0 69 66 28 20 68 6f 73 74 49 64 4d 61 74 63 68 20  if( hostIdMatch 
2aa00 26 26 20 21 63 72 65 61 74 65 43 6f 6e 63 68 20  && !createConch 
2aa10 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63  ){.        if( c
2aa20 6f 6e 63 68 46 69 6c 65 2d 3e 70 4c 6f 63 6b 20  onchFile->pLock 
2aa30 26 26 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4c  && conchFile->pL
2aa40 6f 63 6b 2d 3e 63 6e 74 3e 31 20 29 7b 0a 20 20  ock->cnt>1 ){.  
2aa50 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 61 72          /* We ar
2aa60 65 20 74 72 79 69 6e 67 20 66 6f 72 20 61 6e 20  e trying for an 
2aa70 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 62  exclusive lock b
2aa80 75 74 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61  ut another threa
2aa90 64 20 69 6e 20 74 68 69 73 0a 20 20 20 20 20 20  d in this.      
2aaa0 20 20 20 20 20 2a 2a 20 73 61 6d 65 20 70 72 6f       ** same pro
2aab0 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20 68 6f  cess is still ho
2aac0 6c 64 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c  lding a shared l
2aad0 6f 63 6b 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ock. */.        
2aae0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
2aaf0 53 59 3b 0a 20 20 20 20 20 20 20 20 7d 20 65 6c  SY;.        } el
2ab00 73 65 20 7b 20 20 20 20 20 20 20 20 20 20 0a 20  se {          . 
2ab10 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 72           rc = pr
2ab20 6f 78 79 43 6f 6e 63 68 4c 6f 63 6b 28 70 46 69  oxyConchLock(pFi
2ab30 6c 65 2c 20 6d 79 48 6f 73 74 49 44 2c 20 45 58  le, myHostID, EX
2ab40 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20  CLUSIVE_LOCK);. 
2ab50 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2ab60 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63  else{.        rc
2ab70 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d   = conchFile->pM
2ab80 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28 73 71  ethod->xLock((sq
2ab90 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63  lite3_file*)conc
2aba0 68 46 69 6c 65 2c 20 45 58 43 4c 55 53 49 56 45  hFile, EXCLUSIVE
2abb0 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a  _LOCK);.      }.
2abc0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
2abd0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2abe0 20 20 20 63 68 61 72 20 77 72 69 74 65 42 75 66     char writeBuf
2abf0 66 65 72 5b 50 52 4f 58 59 5f 4d 41 58 43 4f 4e  fer[PROXY_MAXCON
2ac00 43 48 4c 45 4e 5d 3b 0a 20 20 20 20 20 20 20 20  CHLEN];.        
2ac10 69 6e 74 20 77 72 69 74 65 53 69 7a 65 20 3d 20  int writeSize = 
2ac20 30 3b 0a 20 20 20 20 20 20 20 20 0a 20 20 20 20  0;.        .    
2ac30 20 20 20 20 77 72 69 74 65 42 75 66 66 65 72 5b      writeBuffer[
2ac40 30 5d 20 3d 20 28 63 68 61 72 29 50 52 4f 58 59  0] = (char)PROXY
2ac50 5f 43 4f 4e 43 48 56 45 52 53 49 4f 4e 3b 0a 20  _CONCHVERSION;. 
2ac60 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 77         memcpy(&w
2ac70 72 69 74 65 42 75 66 66 65 72 5b 50 52 4f 58 59  riteBuffer[PROXY
2ac80 5f 48 45 41 44 45 52 4c 45 4e 5d 2c 20 6d 79 48  _HEADERLEN], myH
2ac90 6f 73 74 49 44 2c 20 50 52 4f 58 59 5f 48 4f 53  ostID, PROXY_HOS
2aca0 54 49 44 4c 45 4e 29 3b 0a 20 20 20 20 20 20 20  TIDLEN);.       
2acb0 20 69 66 28 20 70 43 74 78 2d 3e 6c 6f 63 6b 50   if( pCtx->lockP
2acc0 72 6f 78 79 50 61 74 68 21 3d 4e 55 4c 4c 20 29  roxyPath!=NULL )
2acd0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 72 6c  {.          strl
2ace0 63 70 79 28 26 77 72 69 74 65 42 75 66 66 65 72  cpy(&writeBuffer
2acf0 5b 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58  [PROXY_PATHINDEX
2ad00 5d 2c 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f  ], pCtx->lockPro
2ad10 78 79 50 61 74 68 2c 20 4d 41 58 50 41 54 48 4c  xyPath, MAXPATHL
2ad20 45 4e 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  EN);.        }el
2ad30 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74  se{.          st
2ad40 72 6c 63 70 79 28 26 77 72 69 74 65 42 75 66 66  rlcpy(&writeBuff
2ad50 65 72 5b 50 52 4f 58 59 5f 50 41 54 48 49 4e 44  er[PROXY_PATHIND
2ad60 45 58 5d 2c 20 74 65 6d 70 4c 6f 63 6b 50 61 74  EX], tempLockPat
2ad70 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a  h, MAXPATHLEN);.
2ad80 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2ad90 20 20 77 72 69 74 65 53 69 7a 65 20 3d 20 50 52    writeSize = PR
2ada0 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 20 2b 20  OXY_PATHINDEX + 
2adb0 73 74 72 6c 65 6e 28 26 77 72 69 74 65 42 75 66  strlen(&writeBuf
2adc0 66 65 72 5b 50 52 4f 58 59 5f 50 41 54 48 49 4e  fer[PROXY_PATHIN
2add0 44 45 58 5d 29 3b 0a 20 20 20 20 20 20 20 20 66  DEX]);.        f
2ade0 74 72 75 6e 63 61 74 65 28 63 6f 6e 63 68 46 69  truncate(conchFi
2adf0 6c 65 2d 3e 68 2c 20 77 72 69 74 65 53 69 7a 65  le->h, writeSize
2ae00 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
2ae10 75 6e 69 78 57 72 69 74 65 28 28 73 71 6c 69 74  unixWrite((sqlit
2ae20 65 33 5f 66 69 6c 65 20 2a 29 63 6f 6e 63 68 46  e3_file *)conchF
2ae30 69 6c 65 2c 20 77 72 69 74 65 42 75 66 66 65 72  ile, writeBuffer
2ae40 2c 20 77 72 69 74 65 53 69 7a 65 2c 20 30 29 3b  , writeSize, 0);
2ae50 0a 20 20 20 20 20 20 20 20 66 73 79 6e 63 28 63  .        fsync(c
2ae60 6f 6e 63 68 46 69 6c 65 2d 3e 68 29 3b 0a 20 20  onchFile->h);.  
2ae70 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20 63        /* If we c
2ae80 72 65 61 74 65 64 20 61 20 6e 65 77 20 63 6f 6e  reated a new con
2ae90 63 68 20 66 69 6c 65 20 28 6e 6f 74 20 6a 75 73  ch file (not jus
2aea0 74 20 75 70 64 61 74 65 64 20 74 68 65 20 63 6f  t updated the co
2aeb0 6e 74 65 6e 74 73 20 6f 66 20 61 20 0a 20 20 20  ntents of a .   
2aec0 20 20 20 20 20 20 2a 2a 20 76 61 6c 69 64 20 63        ** valid c
2aed0 6f 6e 63 68 20 66 69 6c 65 29 2c 20 74 72 79 20  onch file), try 
2aee0 74 6f 20 6d 61 74 63 68 20 74 68 65 20 70 65 72  to match the per
2aef0 6d 69 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 20  missions of the 
2af00 64 61 74 61 62 61 73 65 20 0a 20 20 20 20 20 20  database .      
2af10 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
2af20 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2af30 26 26 20 63 72 65 61 74 65 43 6f 6e 63 68 20 29  && createConch )
2af40 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 72 75  {.          stru
2af50 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20 20  ct stat buf;.   
2af60 20 20 20 20 20 20 20 69 6e 74 20 65 72 72 20 3d         int err =
2af70 20 66 73 74 61 74 28 70 46 69 6c 65 2d 3e 68 2c   fstat(pFile->h,
2af80 20 26 62 75 66 29 3b 0a 20 20 20 20 20 20 20 20   &buf);.        
2af90 20 20 69 66 28 20 65 72 72 3d 3d 30 20 29 7b 0a    if( err==0 ){.
2afa0 20 20 20 20 20 20 20 20 20 20 20 20 6d 6f 64 65              mode
2afb0 5f 74 20 63 6d 6f 64 65 20 3d 20 62 75 66 2e 73  _t cmode = buf.s
2afc0 74 5f 6d 6f 64 65 26 28 53 5f 49 52 55 53 52 7c  t_mode&(S_IRUSR|
2afd0 53 5f 49 57 55 53 52 20 7c 20 53 5f 49 52 47 52  S_IWUSR | S_IRGR
2afe0 50 7c 53 5f 49 57 47 52 50 20 7c 0a 20 20 20 20  P|S_IWGRP |.    
2aff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b010 20 20 20 20 53 5f 49 52 4f 54 48 7c 53 5f 49 57      S_IROTH|S_IW
2b020 4f 54 48 29 3b 0a 20 20 20 20 20 20 20 20 20 20  OTH);.          
2b030 20 20 2f 2a 20 74 72 79 20 74 6f 20 6d 61 74 63    /* try to matc
2b040 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  h the database f
2b050 69 6c 65 20 52 2f 57 20 70 65 72 6d 69 73 73 69  ile R/W permissi
2b060 6f 6e 73 2c 20 69 67 6e 6f 72 65 20 66 61 69 6c  ons, ignore fail
2b070 75 72 65 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ure */.#ifndef S
2b080 51 4c 49 54 45 5f 50 52 4f 58 59 5f 44 45 42 55  QLITE_PROXY_DEBU
2b090 47 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 63  G.            fc
2b0a0 68 6d 6f 64 28 63 6f 6e 63 68 46 69 6c 65 2d 3e  hmod(conchFile->
2b0b0 68 2c 20 63 6d 6f 64 65 29 3b 0a 23 65 6c 73 65  h, cmode);.#else
2b0c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
2b0d0 20 66 63 68 6d 6f 64 28 63 6f 6e 63 68 46 69 6c   fchmod(conchFil
2b0e0 65 2d 3e 68 2c 20 63 6d 6f 64 65 29 21 3d 30 20  e->h, cmode)!=0 
2b0f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2b100 20 69 6e 74 20 63 6f 64 65 20 3d 20 65 72 72 6e   int code = errn
2b110 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o;.             
2b120 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
2b130 20 22 66 63 68 6d 6f 64 20 25 6f 20 46 41 49 4c   "fchmod %o FAIL
2b140 45 44 20 77 69 74 68 20 25 64 20 25 73 5c 6e 22  ED with %d %s\n"
2b150 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2b160 20 20 20 20 20 20 20 20 63 6d 6f 64 65 2c 20 63          cmode, c
2b170 6f 64 65 2c 20 73 74 72 65 72 72 6f 72 28 63 6f  ode, strerror(co
2b180 64 65 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  de));.          
2b190 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
2b1a0 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66           fprintf
2b1b0 28 73 74 64 65 72 72 2c 20 22 66 63 68 6d 6f 64  (stderr, "fchmod
2b1c0 20 25 6f 20 53 55 43 43 45 44 45 44 5c 6e 22 2c   %o SUCCEDED\n",
2b1d0 63 6d 6f 64 65 29 3b 0a 20 20 20 20 20 20 20 20  cmode);.        
2b1e0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2b1f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
2b200 20 20 20 69 6e 74 20 63 6f 64 65 20 3d 20 65 72     int code = er
2b210 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 20  rno;.           
2b220 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
2b230 20 22 53 54 41 54 20 46 41 49 4c 45 44 5b 25 64   "STAT FAILED[%d
2b240 5d 20 77 69 74 68 20 25 64 20 25 73 5c 6e 22 2c  ] with %d %s\n",
2b250 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
2b260 20 20 20 20 20 20 65 72 72 2c 20 63 6f 64 65 2c        err, code,
2b270 20 73 74 72 65 72 72 6f 72 28 63 6f 64 65 29 29   strerror(code))
2b280 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  ;.#endif.       
2b290 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
2b2a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 6f 6e       }.      con
2b2b0 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d  chFile->pMethod-
2b2c0 3e 78 55 6e 6c 6f 63 6b 28 28 73 71 6c 69 74 65  >xUnlock((sqlite
2b2d0 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c  3_file*)conchFil
2b2e0 65 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b  e, SHARED_LOCK);
2b2f0 0a 20 20 20 20 20 20 0a 20 20 20 20 65 6e 64 5f  .      .    end_
2b300 74 61 6b 65 63 6f 6e 63 68 3a 0a 20 20 20 20 20  takeconch:.     
2b310 20 4f 53 54 52 41 43 45 32 28 22 54 52 41 4e 53   OSTRACE2("TRANS
2b320 50 52 4f 58 59 3a 20 43 4c 4f 53 45 20 20 25 64  PROXY: CLOSE  %d
2b330 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 3b 0a  \n", pFile->h);.
2b340 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
2b350 4c 49 54 45 5f 4f 4b 20 26 26 20 70 46 69 6c 65  LITE_OK && pFile
2b360 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 29 7b 0a 20  ->openFlags ){. 
2b370 20 20 20 20 20 20 20 69 66 28 20 70 46 69 6c 65         if( pFile
2b380 2d 3e 68 3e 3d 30 20 29 7b 0a 23 69 66 64 65 66  ->h>=0 ){.#ifdef
2b390 20 53 54 52 49 43 54 5f 43 4c 4f 53 45 5f 45 52   STRICT_CLOSE_ER
2b3a0 52 4f 52 0a 20 20 20 20 20 20 20 20 20 20 69 66  ROR.          if
2b3b0 28 20 63 6c 6f 73 65 28 70 46 69 6c 65 2d 3e 68  ( close(pFile->h
2b3c0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
2b3d0 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
2b3e0 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
2b3f0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
2b400 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53 45  LITE_IOERR_CLOSE
2b410 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65  ;.          }.#e
2b420 6c 73 65 0a 20 20 20 20 20 20 20 20 20 20 63 6c  lse.          cl
2b430 6f 73 65 28 70 46 69 6c 65 2d 3e 68 29 3b 20 2f  ose(pFile->h); /
2b440 2a 20 73 69 6c 65 6e 74 6c 79 20 6c 65 61 6b 20  * silently leak 
2b450 66 64 20 69 66 20 66 61 69 6c 20 2a 2f 0a 23 65  fd if fail */.#e
2b460 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7d 0a 20  ndif.        }. 
2b470 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 20         pFile->h 
2b480 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 69 6e  = -1;.        in
2b490 74 20 66 64 20 3d 20 6f 70 65 6e 28 70 43 74 78  t fd = open(pCtx
2b4a0 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2d  ->dbPath, pFile-
2b4b0 3e 6f 70 65 6e 46 6c 61 67 73 2c 0a 20 20 20 20  >openFlags,.    
2b4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b4d0 20 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54    SQLITE_DEFAULT
2b4e0 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e  _FILE_PERMISSION
2b4f0 53 29 3b 0a 20 20 20 20 20 20 20 20 4f 53 54 52  S);.        OSTR
2b500 41 43 45 32 28 22 54 52 41 4e 53 50 52 4f 58 59  ACE2("TRANSPROXY
2b510 3a 20 4f 50 45 4e 20 20 25 64 5c 6e 22 2c 20 66  : OPEN  %d\n", f
2b520 64 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  d);.        if( 
2b530 66 64 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  fd>=0 ){.       
2b540 20 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 66 64     pFile->h = fd
2b550 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
2b560 0a 20 20 20 20 20 20 20 20 20 20 72 63 3d 53 51  .          rc=SQ
2b570 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 20 2f  LITE_CANTOPEN; /
2b580 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 3f 20 70  * SQLITE_BUSY? p
2b590 72 6f 78 79 54 61 6b 65 43 6f 6e 63 68 20 63 61  roxyTakeConch ca
2b5a0 6c 6c 65 64 0a 20 20 20 20 20 20 20 20 20 20 20  lled.           
2b5b0 64 75 72 69 6e 67 20 6c 6f 63 6b 69 6e 67 20 2a  during locking *
2b5c0 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  /.        }.    
2b5d0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
2b5e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21  ==SQLITE_OK && !
2b5f0 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 20  pCtx->lockProxy 
2b600 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
2b610 2a 70 61 74 68 20 3d 20 74 65 6d 70 4c 6f 63 6b  *path = tempLock
2b620 50 61 74 68 20 3f 20 74 65 6d 70 4c 6f 63 6b 50  Path ? tempLockP
2b630 61 74 68 20 3a 20 70 43 74 78 2d 3e 6c 6f 63 6b  ath : pCtx->lock
2b640 50 72 6f 78 79 50 61 74 68 3b 0a 20 20 20 20 20  ProxyPath;.     
2b650 20 20 20 72 63 20 3d 20 70 72 6f 78 79 43 72 65     rc = proxyCre
2b660 61 74 65 55 6e 69 78 46 69 6c 65 28 70 61 74 68  ateUnixFile(path
2b670 2c 20 26 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f  , &pCtx->lockPro
2b680 78 79 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  xy, 1);.        
2b690 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2b6a0 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f  K && rc!=SQLITE_
2b6b0 4e 4f 4d 45 4d 20 26 26 20 74 72 79 4f 6c 64 4c  NOMEM && tryOldL
2b6c0 6f 63 6b 50 61 74 68 20 29 7b 0a 20 20 20 20 20  ockPath ){.     
2b6d0 20 20 20 20 20 2f 2a 20 77 65 20 63 6f 75 6c 64       /* we could
2b6e0 6e 27 74 20 63 72 65 61 74 65 20 74 68 65 20 70  n't create the p
2b6f0 72 6f 78 79 20 6c 6f 63 6b 20 66 69 6c 65 20 77  roxy lock file w
2b700 69 74 68 20 74 68 65 20 6f 6c 64 20 6c 6f 63 6b  ith the old lock
2b710 20 66 69 6c 65 20 70 61 74 68 0a 20 20 20 20 20   file path.     
2b720 20 20 20 20 20 20 2a 2a 20 73 6f 20 74 72 79 20        ** so try 
2b730 61 67 61 69 6e 20 76 69 61 20 61 75 74 6f 2d 6e  again via auto-n
2b740 61 6d 69 6e 67 20 0a 20 20 20 20 20 20 20 20 20  aming .         
2b750 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 66    */.          f
2b760 6f 72 63 65 4e 65 77 4c 6f 63 6b 50 61 74 68 20  orceNewLockPath 
2b770 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 74  = 1;.          t
2b780 72 79 4f 6c 64 4c 6f 63 6b 50 61 74 68 20 3d 20  ryOldLockPath = 
2b790 30 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e  0;.          con
2b7a0 74 69 6e 75 65 3b 20 2f 2f 20 67 6f 20 62 61 63  tinue; // go bac
2b7b0 6b 20 74 6f 20 74 68 65 20 64 6f 20 7b 7d 20 77  k to the do {} w
2b7c0 68 69 6c 65 20 73 74 61 72 74 20 70 6f 69 6e 74  hile start point
2b7d0 2c 20 74 72 79 20 61 67 61 69 6e 0a 20 20 20 20  , try again.    
2b7e0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
2b7f0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2b800 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2b810 20 2f 2a 20 4e 65 65 64 20 74 6f 20 6d 61 6b 65   /* Need to make
2b820 20 61 20 63 6f 70 79 20 6f 66 20 70 61 74 68 20   a copy of path 
2b830 69 66 20 77 65 20 65 78 74 72 61 63 74 65 64 20  if we extracted 
2b840 74 68 65 20 76 61 6c 75 65 0a 20 20 20 20 20 20  the value.      
2b850 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 63     ** from the c
2b860 6f 6e 63 68 20 66 69 6c 65 20 6f 72 20 74 68 65  onch file or the
2b870 20 70 61 74 68 20 77 61 73 20 61 6c 6c 6f 63 61   path was alloca
2b880 74 65 64 20 6f 6e 20 74 68 65 20 73 74 61 63 6b  ted on the stack
2b890 0a 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  .         */.   
2b8a0 20 20 20 20 20 69 66 28 20 74 65 6d 70 4c 6f 63       if( tempLoc
2b8b0 6b 50 61 74 68 20 29 7b 0a 20 20 20 20 20 20 20  kPath ){.       
2b8c0 20 20 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f     pCtx->lockPro
2b8d0 78 79 50 61 74 68 20 3d 20 73 71 6c 69 74 65 33  xyPath = sqlite3
2b8e0 44 62 53 74 72 44 75 70 28 30 2c 20 74 65 6d 70  DbStrDup(0, temp
2b8f0 4c 6f 63 6b 50 61 74 68 29 3b 0a 20 20 20 20 20  LockPath);.     
2b900 20 20 20 20 20 69 66 28 20 21 70 43 74 78 2d 3e       if( !pCtx->
2b910 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 29 7b  lockProxyPath ){
2b920 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
2b930 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
2b940 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2b950 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
2b960 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2b970 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2b980 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64   pCtx->conchHeld
2b990 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 0a 20   = 1;.        . 
2b9a0 20 20 20 20 20 20 20 69 66 28 20 70 43 74 78 2d         if( pCtx-
2b9b0 3e 6c 6f 63 6b 50 72 6f 78 79 2d 3e 70 4d 65 74  >lockProxy->pMet
2b9c0 68 6f 64 20 3d 3d 20 26 61 66 70 49 6f 4d 65 74  hod == &afpIoMet
2b9d0 68 6f 64 73 20 29 7b 0a 20 20 20 20 20 20 20 20  hods ){.        
2b9e0 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74    afpLockingCont
2b9f0 65 78 74 20 2a 61 66 70 43 74 78 3b 0a 20 20 20  ext *afpCtx;.   
2ba00 20 20 20 20 20 20 20 61 66 70 43 74 78 20 3d 20         afpCtx = 
2ba10 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  (afpLockingConte
2ba20 78 74 20 2a 29 70 43 74 78 2d 3e 6c 6f 63 6b 50  xt *)pCtx->lockP
2ba30 72 6f 78 79 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  roxy->lockingCon
2ba40 74 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20  text;.          
2ba50 61 66 70 43 74 78 2d 3e 64 62 50 61 74 68 20 3d  afpCtx->dbPath =
2ba60 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79   pCtx->lockProxy
2ba70 50 61 74 68 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Path;.        }.
2ba80 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20        } else {. 
2ba90 20 20 20 20 20 20 20 63 6f 6e 63 68 46 69 6c 65         conchFile
2baa0 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f  ->pMethod->xUnlo
2bab0 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ck((sqlite3_file
2bac0 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 4e 4f 5f  *)conchFile, NO_
2bad0 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20  LOCK);.      }. 
2bae0 20 20 20 20 20 4f 53 54 52 41 43 45 33 28 22 54       OSTRACE3("T
2baf0 41 4b 45 43 4f 4e 43 48 20 20 25 64 20 25 73 5c  AKECONCH  %d %s\
2bb00 6e 22 2c 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 68  n", conchFile->h
2bb10 2c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3f  , rc==SQLITE_OK?
2bb20 22 6f 6b 22 3a 22 66 61 69 6c 65 64 22 29 3b 0a  "ok":"failed");.
2bb30 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
2bb40 0a 20 20 20 20 7d 20 77 68 69 6c 65 20 28 31 29  .    } while (1)
2bb50 3b 20 2f 2a 20 69 6e 20 63 61 73 65 20 77 65 20  ; /* in case we 
2bb60 6e 65 65 64 20 74 6f 20 72 65 74 72 79 20 74 68  need to retry th
2bb70 65 20 3a 61 75 74 6f 3a 20 6c 6f 63 6b 20 66 69  e :auto: lock fi
2bb80 6c 65 20 2d 20 77 65 20 73 68 6f 75 6c 64 20 6e  le - we should n
2bb90 65 76 65 72 20 67 65 74 20 68 65 72 65 20 65 78  ever get here ex
2bba0 63 65 70 74 20 76 69 61 20 74 68 65 20 27 63 6f  cept via the 'co
2bbb0 6e 74 69 6e 75 65 27 20 63 61 6c 6c 2e 20 2a 2f  ntinue' call. */
2bbc0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  .  }.}../*.** If
2bbd0 20 70 46 69 6c 65 20 68 6f 6c 64 73 20 61 20 6c   pFile holds a l
2bbe0 6f 63 6b 20 6f 6e 20 61 20 63 6f 6e 63 68 20 66  ock on a conch f
2bbf0 69 6c 65 2c 20 74 68 65 6e 20 72 65 6c 65 61 73  ile, then releas
2bc00 65 20 74 68 61 74 20 6c 6f 63 6b 2e 0a 2a 2f 0a  e that lock..*/.
2bc10 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
2bc20 52 65 6c 65 61 73 65 43 6f 6e 63 68 28 75 6e 69  ReleaseConch(uni
2bc30 78 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20  xFile *pFile){. 
2bc40 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
2bc50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2bc60 53 75 62 72 6f 75 74 69 6e 65 20 72 65 74 75 72  Subroutine retur
2bc70 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 70 72 6f 78  n code */.  prox
2bc80 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  yLockingContext 
2bc90 2a 70 43 74 78 3b 20 20 2f 2a 20 54 68 65 20 6c  *pCtx;  /* The l
2bca0 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 66  ocking context f
2bcb0 6f 72 20 74 68 65 20 70 72 6f 78 79 20 6c 6f 63  or the proxy loc
2bcc0 6b 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20  k */.  unixFile 
2bcd0 2a 63 6f 6e 63 68 46 69 6c 65 3b 20 20 20 20 20  *conchFile;     
2bce0 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
2bcf0 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 2a 2f 0a  e conch file */.
2bd00 0a 20 20 70 43 74 78 20 3d 20 28 70 72 6f 78 79  .  pCtx = (proxy
2bd10 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
2bd20 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43  )pFile->lockingC
2bd30 6f 6e 74 65 78 74 3b 0a 20 20 63 6f 6e 63 68 46  ontext;.  conchF
2bd40 69 6c 65 20 3d 20 70 43 74 78 2d 3e 63 6f 6e 63  ile = pCtx->conc
2bd50 68 46 69 6c 65 3b 0a 20 20 4f 53 54 52 41 43 45  hFile;.  OSTRACE
2bd60 34 28 22 52 45 4c 45 41 53 45 43 4f 4e 43 48 20  4("RELEASECONCH 
2bd70 20 25 64 20 66 6f 72 20 25 73 20 70 69 64 3d 25   %d for %s pid=%
2bd80 64 5c 6e 22 2c 20 63 6f 6e 63 68 46 69 6c 65 2d  d\n", conchFile-
2bd90 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 28  >h,.           (
2bda0 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50  pCtx->lockProxyP
2bdb0 61 74 68 20 3f 20 70 43 74 78 2d 3e 6c 6f 63 6b  ath ? pCtx->lock
2bdc0 50 72 6f 78 79 50 61 74 68 20 3a 20 22 3a 61 75  ProxyPath : ":au
2bdd0 74 6f 3a 22 29 2c 20 0a 20 20 20 20 20 20 20 20  to:"), .        
2bde0 20 20 20 67 65 74 70 69 64 28 29 29 3b 0a 20 20     getpid());.  
2bdf0 69 66 28 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48  if( pCtx->conchH
2be00 65 6c 64 3e 30 20 29 7b 0a 20 20 20 20 72 63 20  eld>0 ){.    rc 
2be10 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65  = conchFile->pMe
2be20 74 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28 28 73  thod->xUnlock((s
2be30 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e  qlite3_file*)con
2be40 63 68 46 69 6c 65 2c 20 4e 4f 5f 4c 4f 43 4b 29  chFile, NO_LOCK)
2be50 3b 0a 20 20 7d 0a 20 20 70 43 74 78 2d 3e 63 6f  ;.  }.  pCtx->co
2be60 6e 63 68 48 65 6c 64 20 3d 20 30 3b 0a 20 20 4f  nchHeld = 0;.  O
2be70 53 54 52 41 43 45 33 28 22 52 45 4c 45 41 53 45  STRACE3("RELEASE
2be80 43 4f 4e 43 48 20 20 25 64 20 25 73 5c 6e 22 2c  CONCH  %d %s\n",
2be90 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 0a 20   conchFile->h,. 
2bea0 20 20 20 20 20 20 20 20 20 20 28 72 63 3d 3d 53            (rc==S
2beb0 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20  QLITE_OK ? "ok" 
2bec0 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20  : "failed"));.  
2bed0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2bee0 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 6e 61  .** Given the na
2bef0 6d 65 20 6f 66 20 61 20 64 61 74 61 62 61 73 65  me of a database
2bf00 20 66 69 6c 65 2c 20 63 6f 6d 70 75 74 65 20 74   file, compute t
2bf10 68 65 20 6e 61 6d 65 20 6f 66 20 69 74 73 20 63  he name of its c
2bf20 6f 6e 63 68 20 66 69 6c 65 2e 0a 2a 2a 20 53 74  onch file..** St
2bf30 6f 72 65 20 74 68 65 20 63 6f 6e 63 68 20 66 69  ore the conch fi
2bf40 6c 65 6e 61 6d 65 20 69 6e 20 6d 65 6d 6f 72 79  lename in memory
2bf50 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73   obtained from s
2bf60 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e  qlite3_malloc().
2bf70 0a 2a 2a 20 4d 61 6b 65 20 2a 70 43 6f 6e 63 68  .** Make *pConch
2bf80 50 61 74 68 20 70 6f 69 6e 74 20 74 6f 20 74 68  Path point to th
2bf90 65 20 6e 65 77 20 6e 61 6d 65 2e 20 20 52 65 74  e new name.  Ret
2bfa0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
2bfb0 20 73 75 63 63 65 73 73 0a 2a 2a 20 6f 72 20 53   success.** or S
2bfc0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 75  QLITE_NOMEM if u
2bfd0 6e 61 62 6c 65 20 74 6f 20 6f 62 74 61 69 6e 20  nable to obtain 
2bfe0 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68  memory..**.** Th
2bff0 65 20 63 61 6c 6c 65 72 20 69 73 20 72 65 73 70  e caller is resp
2c000 6f 6e 73 69 62 6c 65 20 66 6f 72 20 65 6e 73 75  onsible for ensu
2c010 72 69 6e 67 20 74 68 61 74 20 74 68 65 20 61 6c  ring that the al
2c020 6c 6f 63 61 74 65 64 20 6d 65 6d 6f 72 79 0a 2a  located memory.*
2c030 2a 20 73 70 61 63 65 20 69 73 20 65 76 65 6e 74  * space is event
2c040 75 61 6c 6c 79 20 66 72 65 65 64 2e 0a 2a 2a 0a  ually freed..**.
2c050 2a 2a 20 2a 70 43 6f 6e 63 68 50 61 74 68 20 69  ** *pConchPath i
2c060 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 69 66  s set to NULL if
2c070 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61   a memory alloca
2c080 74 69 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  tion error occur
2c090 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
2c0a0 20 70 72 6f 78 79 43 72 65 61 74 65 43 6f 6e 63   proxyCreateConc
2c0b0 68 50 61 74 68 6e 61 6d 65 28 63 68 61 72 20 2a  hPathname(char *
2c0c0 64 62 50 61 74 68 2c 20 63 68 61 72 20 2a 2a 70  dbPath, char **p
2c0d0 43 6f 6e 63 68 50 61 74 68 29 7b 0a 20 20 69 6e  ConchPath){.  in
2c0e0 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
2c0f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
2c100 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
2c110 20 69 6e 74 20 6c 65 6e 20 3d 20 28 69 6e 74 29   int len = (int)
2c120 73 74 72 6c 65 6e 28 64 62 50 61 74 68 29 3b 20  strlen(dbPath); 
2c130 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 64 61 74  /* Length of dat
2c140 61 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 20 2d  abase filename -
2c150 20 64 62 50 61 74 68 20 2a 2f 0a 20 20 63 68 61   dbPath */.  cha
2c160 72 20 2a 63 6f 6e 63 68 50 61 74 68 3b 20 20 20  r *conchPath;   
2c170 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 62 75             /* bu
2c180 66 66 65 72 20 69 6e 20 77 68 69 63 68 20 74 6f  ffer in which to
2c190 20 63 6f 6e 73 74 72 75 63 74 20 63 6f 6e 63 68   construct conch
2c1a0 20 6e 61 6d 65 20 2a 2f 0a 0a 20 20 2f 2a 20 41   name */..  /* A
2c1b0 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f  llocate space fo
2c1c0 72 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65  r the conch file
2c1d0 6e 61 6d 65 20 61 6e 64 20 69 6e 69 74 69 61 6c  name and initial
2c1e0 69 7a 65 20 74 68 65 20 6e 61 6d 65 20 74 6f 0a  ize the name to.
2c1f0 20 20 2a 2a 20 74 68 65 20 6e 61 6d 65 20 6f 66    ** the name of
2c200 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61   the original da
2c210 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 20  tabase file. */ 
2c220 20 0a 20 20 2a 70 43 6f 6e 63 68 50 61 74 68 20   .  *pConchPath 
2c230 3d 20 63 6f 6e 63 68 50 61 74 68 20 3d 20 28 63  = conchPath = (c
2c240 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61  har *)sqlite3_ma
2c250 6c 6c 6f 63 28 6c 65 6e 20 2b 20 38 29 3b 0a 20  lloc(len + 8);. 
2c260 20 69 66 28 20 63 6f 6e 63 68 50 61 74 68 3d 3d   if( conchPath==
2c270 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
2c280 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
2c290 7d 0a 20 20 6d 65 6d 63 70 79 28 63 6f 6e 63 68  }.  memcpy(conch
2c2a0 50 61 74 68 2c 20 64 62 50 61 74 68 2c 20 6c 65  Path, dbPath, le
2c2b0 6e 2b 31 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f  n+1);.  .  /* no
2c2c0 77 20 69 6e 73 65 72 74 20 61 20 22 2e 22 20 62  w insert a "." b
2c2d0 65 66 6f 72 65 20 74 68 65 20 6c 61 73 74 20 2f  efore the last /
2c2e0 20 63 68 61 72 61 63 74 65 72 20 2a 2f 0a 20 20   character */.  
2c2f0 66 6f 72 28 20 69 3d 28 6c 65 6e 2d 31 29 3b 20  for( i=(len-1); 
2c300 69 3e 3d 30 3b 20 69 2d 2d 20 29 7b 0a 20 20 20  i>=0; i-- ){.   
2c310 20 69 66 28 20 63 6f 6e 63 68 50 61 74 68 5b 69   if( conchPath[i
2c320 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20  ]=='/' ){.      
2c330 69 2b 2b 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  i++;.      break
2c340 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 63 6f  ;.    }.  }.  co
2c350 6e 63 68 50 61 74 68 5b 69 5d 3d 27 2e 27 3b 0a  nchPath[i]='.';.
2c360 20 20 77 68 69 6c 65 20 28 20 69 3c 6c 65 6e 20    while ( i<len 
2c370 29 7b 0a 20 20 20 20 63 6f 6e 63 68 50 61 74 68  ){.    conchPath
2c380 5b 69 2b 31 5d 3d 64 62 50 61 74 68 5b 69 5d 3b  [i+1]=dbPath[i];
2c390 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a 0a 20  .    i++;.  }.. 
2c3a0 20 2f 2a 20 61 70 70 65 6e 64 20 74 68 65 20 22   /* append the "
2c3b0 2d 63 6f 6e 63 68 22 20 73 75 66 66 69 78 20 74  -conch" suffix t
2c3c0 6f 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20  o the file */.  
2c3d0 6d 65 6d 63 70 79 28 26 63 6f 6e 63 68 50 61 74  memcpy(&conchPat
2c3e0 68 5b 69 2b 31 5d 2c 20 22 2d 63 6f 6e 63 68 22  h[i+1], "-conch"
2c3f0 2c 20 37 29 3b 0a 20 20 61 73 73 65 72 74 28 20  , 7);.  assert( 
2c400 28 69 6e 74 29 73 74 72 6c 65 6e 28 63 6f 6e 63  (int)strlen(conc
2c410 68 50 61 74 68 29 20 3d 3d 20 6c 65 6e 2b 37 20  hPath) == len+7 
2c420 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  );..  return SQL
2c430 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 20 54  ITE_OK;.}.../* T
2c440 61 6b 65 73 20 61 20 66 75 6c 6c 79 20 63 6f 6e  akes a fully con
2c450 66 69 67 75 72 65 64 20 70 72 6f 78 79 20 6c 6f  figured proxy lo
2c460 63 6b 69 6e 67 2d 73 74 79 6c 65 20 75 6e 69 78  cking-style unix
2c470 20 66 69 6c 65 20 61 6e 64 20 73 77 69 74 63 68   file and switch
2c480 65 73 0a 2a 2a 20 74 68 65 20 6c 6f 63 61 6c 20  es.** the local 
2c490 6c 6f 63 6b 20 66 69 6c 65 20 70 61 74 68 20 0a  lock file path .
2c4a0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 77  */.static int sw
2c4b0 69 74 63 68 4c 6f 63 6b 50 72 6f 78 79 50 61 74  itchLockProxyPat
2c4c0 68 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c  h(unixFile *pFil
2c4d0 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70  e, const char *p
2c4e0 61 74 68 29 20 7b 0a 20 20 70 72 6f 78 79 4c 6f  ath) {.  proxyLo
2c4f0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43  ckingContext *pC
2c500 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69  tx = (proxyLocki
2c510 6e 67 43 6f 6e 74 65 78 74 2a 29 70 46 69 6c 65  ngContext*)pFile
2c520 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
2c530 3b 0a 20 20 63 68 61 72 20 2a 6f 6c 64 50 61 74  ;.  char *oldPat
2c540 68 20 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72  h = pCtx->lockPr
2c550 6f 78 79 50 61 74 68 3b 0a 20 20 69 6e 74 20 72  oxyPath;.  int r
2c560 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
2c570 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63    if( pFile->loc
2c580 6b 74 79 70 65 21 3d 4e 4f 5f 4c 4f 43 4b 20 29  ktype!=NO_LOCK )
2c590 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
2c5a0 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 20 20 0a  ITE_BUSY;.  }  .
2c5b0 0a 20 20 2f 2a 20 6e 6f 74 68 69 6e 67 20 74 6f  .  /* nothing to
2c5c0 20 64 6f 20 69 66 20 74 68 65 20 70 61 74 68 20   do if the path 
2c5d0 69 73 20 4e 55 4c 4c 2c 20 3a 61 75 74 6f 3a 20  is NULL, :auto: 
2c5e0 6f 72 20 6d 61 74 63 68 65 73 20 74 68 65 20 65  or matches the e
2c5f0 78 69 73 74 69 6e 67 20 70 61 74 68 20 2a 2f 0a  xisting path */.
2c600 20 20 69 66 28 20 21 70 61 74 68 20 7c 7c 20 70    if( !path || p
2c610 61 74 68 5b 30 5d 3d 3d 27 5c 30 27 20 7c 7c 20  ath[0]=='\0' || 
2c620 21 73 74 72 63 6d 70 28 70 61 74 68 2c 20 22 3a  !strcmp(path, ":
2c630 61 75 74 6f 3a 22 29 20 7c 7c 0a 20 20 20 20 28  auto:") ||.    (
2c640 6f 6c 64 50 61 74 68 20 26 26 20 21 73 74 72 6e  oldPath && !strn
2c650 63 6d 70 28 6f 6c 64 50 61 74 68 2c 20 70 61 74  cmp(oldPath, pat
2c660 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29 29 20  h, MAXPATHLEN)) 
2c670 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
2c680 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65  LITE_OK;.  }else
2c690 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a  {.    unixFile *
2c6a0 6c 6f 63 6b 50 72 6f 78 79 20 3d 20 70 43 74 78  lockProxy = pCtx
2c6b0 2d 3e 6c 6f 63 6b 50 72 6f 78 79 3b 0a 20 20 20  ->lockProxy;.   
2c6c0 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79   pCtx->lockProxy
2c6d0 3d 4e 55 4c 4c 3b 0a 20 20 20 20 70 43 74 78 2d  =NULL;.    pCtx-
2c6e0 3e 63 6f 6e 63 68 48 65 6c 64 20 3d 20 30 3b 0a  >conchHeld = 0;.
2c6f0 20 20 20 20 69 66 28 20 6c 6f 63 6b 50 72 6f 78      if( lockProx
2c700 79 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20  y!=NULL ){.     
2c710 20 72 63 3d 6c 6f 63 6b 50 72 6f 78 79 2d 3e 70   rc=lockProxy->p
2c720 4d 65 74 68 6f 64 2d 3e 78 43 6c 6f 73 65 28 28  Method->xClose((
2c730 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 6c  sqlite3_file *)l
2c740 6f 63 6b 50 72 6f 78 79 29 3b 0a 20 20 20 20 20  ockProxy);.     
2c750 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
2c760 20 72 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   rc;.      sqlit
2c770 65 33 5f 66 72 65 65 28 6c 6f 63 6b 50 72 6f 78  e3_free(lockProx
2c780 79 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  y);.    }.    sq
2c790 6c 69 74 65 33 5f 66 72 65 65 28 6f 6c 64 50 61  lite3_free(oldPa
2c7a0 74 68 29 3b 0a 20 20 20 20 70 43 74 78 2d 3e 6c  th);.    pCtx->l
2c7b0 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 3d 20 73  ockProxyPath = s
2c7c0 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 30  qlite3DbStrDup(0
2c7d0 2c 20 70 61 74 68 29 3b 0a 20 20 7d 0a 20 20 0a  , path);.  }.  .
2c7e0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2c7f0 2f 2a 0a 2a 2a 20 70 46 69 6c 65 20 69 73 20 61  /*.** pFile is a
2c800 20 66 69 6c 65 20 74 68 61 74 20 68 61 73 20 62   file that has b
2c810 65 65 6e 20 6f 70 65 6e 65 64 20 62 79 20 61 20  een opened by a 
2c820 70 72 69 6f 72 20 78 4f 70 65 6e 20 63 61 6c 6c  prior xOpen call
2c830 2e 20 20 64 62 50 61 74 68 0a 2a 2a 20 69 73 20  .  dbPath.** is 
2c840 61 20 73 74 72 69 6e 67 20 62 75 66 66 65 72 20  a string buffer 
2c850 61 74 20 6c 65 61 73 74 20 4d 41 58 50 41 54 48  at least MAXPATH
2c860 4c 45 4e 2b 31 20 63 68 61 72 61 63 74 65 72 73  LEN+1 characters
2c870 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20   in size..**.** 
2c880 54 68 69 73 20 72 6f 75 74 69 6e 65 20 66 69 6e  This routine fin
2c890 64 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20 61  d the filename a
2c8a0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70  ssociated with p
2c8b0 46 69 6c 65 20 61 6e 64 20 77 72 69 74 65 73 20  File and writes 
2c8c0 69 74 0a 2a 2a 20 69 6e 74 20 64 62 50 61 74 68  it.** int dbPath
2c8d0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2c8e0 70 72 6f 78 79 47 65 74 44 62 50 61 74 68 46 6f  proxyGetDbPathFo
2c8f0 72 55 6e 69 78 46 69 6c 65 28 75 6e 69 78 46 69  rUnixFile(unixFi
2c900 6c 65 20 2a 70 46 69 6c 65 2c 20 63 68 61 72 20  le *pFile, char 
2c910 2a 64 62 50 61 74 68 29 7b 0a 23 69 66 20 64 65  *dbPath){.#if de
2c920 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
2c930 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 4d  .  if( pFile->pM
2c940 65 74 68 6f 64 20 3d 3d 20 26 61 66 70 49 6f 4d  ethod == &afpIoM
2c950 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f 2a  ethods ){.    /*
2c960 20 61 66 70 20 73 74 79 6c 65 20 6b 65 65 70 73   afp style keeps
2c970 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
2c980 74 68 65 20 64 62 20 70 61 74 68 20 69 6e 20 74  the db path in t
2c990 68 65 20 66 69 6c 65 50 61 74 68 20 66 69 65 6c  he filePath fiel
2c9a0 64 20 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  d .    ** of the
2c9b0 20 73 74 72 75 63 74 20 2a 2f 0a 20 20 20 20 61   struct */.    a
2c9c0 73 73 65 72 74 28 20 28 69 6e 74 29 73 74 72 6c  ssert( (int)strl
2c9d0 65 6e 28 28 63 68 61 72 2a 29 70 46 69 6c 65 2d  en((char*)pFile-
2c9e0 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29  >lockingContext)
2c9f0 3c 3d 4d 41 58 50 41 54 48 4c 45 4e 20 29 3b 0a  <=MAXPATHLEN );.
2ca00 20 20 20 20 73 74 72 6c 63 70 79 28 64 62 50 61      strlcpy(dbPa
2ca10 74 68 2c 20 28 28 61 66 70 4c 6f 63 6b 69 6e 67  th, ((afpLocking
2ca20 43 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d  Context *)pFile-
2ca30 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29  >lockingContext)
2ca40 2d 3e 64 62 50 61 74 68 2c 20 4d 41 58 50 41 54  ->dbPath, MAXPAT
2ca50 48 4c 45 4e 29 3b 0a 20 20 7d 20 65 6c 73 65 0a  HLEN);.  } else.
2ca60 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 46 69  #endif.  if( pFi
2ca70 6c 65 2d 3e 70 4d 65 74 68 6f 64 20 3d 3d 20 26  le->pMethod == &
2ca80 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73  dotlockIoMethods
2ca90 20 29 7b 0a 20 20 20 20 2f 2a 20 64 6f 74 20 6c   ){.    /* dot l
2caa0 6f 63 6b 20 73 74 79 6c 65 20 75 73 65 73 20 74  ock style uses t
2cab0 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65  he locking conte
2cac0 78 74 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  xt to store the 
2cad0 64 6f 74 20 6c 6f 63 6b 0a 20 20 20 20 2a 2a 20  dot lock.    ** 
2cae0 66 69 6c 65 20 70 61 74 68 20 2a 2f 0a 20 20 20  file path */.   
2caf0 20 69 6e 74 20 6c 65 6e 20 3d 20 73 74 72 6c 65   int len = strle
2cb00 6e 28 28 63 68 61 72 20 2a 29 70 46 69 6c 65 2d  n((char *)pFile-
2cb10 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29  >lockingContext)
2cb20 20 2d 20 73 74 72 6c 65 6e 28 44 4f 54 4c 4f 43   - strlen(DOTLOC
2cb30 4b 5f 53 55 46 46 49 58 29 3b 0a 20 20 20 20 6d  K_SUFFIX);.    m
2cb40 65 6d 63 70 79 28 64 62 50 61 74 68 2c 20 28 63  emcpy(dbPath, (c
2cb50 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63  har *)pFile->loc
2cb60 6b 69 6e 67 43 6f 6e 74 65 78 74 2c 20 6c 65 6e  kingContext, len
2cb70 20 2b 20 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a   + 1);.  }else{.
2cb80 20 20 20 20 2f 2a 20 61 6c 6c 20 6f 74 68 65 72      /* all other
2cb90 20 73 74 79 6c 65 73 20 75 73 65 20 74 68 65 20   styles use the 
2cba0 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20  locking context 
2cbb0 74 6f 20 73 74 6f 72 65 20 74 68 65 20 64 62 20  to store the db 
2cbc0 66 69 6c 65 20 70 61 74 68 20 2a 2f 0a 20 20 20  file path */.   
2cbd0 20 61 73 73 65 72 74 28 20 73 74 72 6c 65 6e 28   assert( strlen(
2cbe0 28 63 68 61 72 2a 29 70 46 69 6c 65 2d 3e 6c 6f  (char*)pFile->lo
2cbf0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3c 3d 4d  ckingContext)<=M
2cc00 41 58 50 41 54 48 4c 45 4e 20 29 3b 0a 20 20 20  AXPATHLEN );.   
2cc10 20 73 74 72 6c 63 70 79 28 64 62 50 61 74 68 2c   strlcpy(dbPath,
2cc20 20 28 63 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e   (char *)pFile->
2cc30 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2c 20  lockingContext, 
2cc40 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a 20 20 7d  MAXPATHLEN);.  }
2cc50 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
2cc60 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 61  _OK;.}../*.** Ta
2cc70 6b 65 73 20 61 6e 20 61 6c 72 65 61 64 79 20 66  kes an already f
2cc80 69 6c 6c 65 64 20 69 6e 20 75 6e 69 78 20 66 69  illed in unix fi
2cc90 6c 65 20 61 6e 64 20 61 6c 74 65 72 73 20 69 74  le and alters it
2cca0 20 73 6f 20 61 6c 6c 20 66 69 6c 65 20 6c 6f 63   so all file loc
2ccb0 6b 69 6e 67 20 0a 2a 2a 20 77 69 6c 6c 20 62 65  king .** will be
2ccc0 20 70 65 72 66 6f 72 6d 65 64 20 6f 6e 20 74 68   performed on th
2ccd0 65 20 6c 6f 63 61 6c 20 70 72 6f 78 79 20 6c 6f  e local proxy lo
2cce0 63 6b 20 66 69 6c 65 2e 20 20 54 68 65 20 66 6f  ck file.  The fo
2ccf0 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 0a 2a  llowing fields.*
2cd00 2a 20 61 72 65 20 70 72 65 73 65 72 76 65 64 20  * are preserved 
2cd10 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63  in the locking c
2cd20 6f 6e 74 65 78 74 20 73 6f 20 74 68 61 74 20 74  ontext so that t
2cd30 68 65 79 20 63 61 6e 20 62 65 20 72 65 73 74 6f  hey can be resto
2cd40 72 65 64 20 61 6e 64 20 0a 2a 2a 20 74 68 65 20  red and .** the 
2cd50 75 6e 69 78 20 73 74 72 75 63 74 75 72 65 20 70  unix structure p
2cd60 72 6f 70 65 72 6c 79 20 63 6c 65 61 6e 65 64 20  roperly cleaned 
2cd70 75 70 20 61 74 20 63 6c 6f 73 65 20 74 69 6d 65  up at close time
2cd80 3a 0a 2a 2a 20 20 2d 3e 6c 6f 63 6b 69 6e 67 43  :.**  ->lockingC
2cd90 6f 6e 74 65 78 74 0a 2a 2a 20 20 2d 3e 70 4d 65  ontext.**  ->pMe
2cda0 74 68 6f 64 0a 2a 2f 0a 73 74 61 74 69 63 20 69  thod.*/.static i
2cdb0 6e 74 20 70 72 6f 78 79 54 72 61 6e 73 66 6f 72  nt proxyTransfor
2cdc0 6d 55 6e 69 78 46 69 6c 65 28 75 6e 69 78 46 69  mUnixFile(unixFi
2cdd0 6c 65 20 2a 70 46 69 6c 65 2c 20 63 6f 6e 73 74  le *pFile, const
2cde0 20 63 68 61 72 20 2a 70 61 74 68 29 20 7b 0a 20   char *path) {. 
2cdf0 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e   proxyLockingCon
2ce00 74 65 78 74 20 2a 70 43 74 78 3b 0a 20 20 63 68  text *pCtx;.  ch
2ce10 61 72 20 64 62 50 61 74 68 5b 4d 41 58 50 41 54  ar dbPath[MAXPAT
2ce20 48 4c 45 4e 2b 31 5d 3b 20 20 20 20 20 20 20 2f  HLEN+1];       /
2ce30 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  * Name of the da
2ce40 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
2ce50 20 63 68 61 72 20 2a 6c 6f 63 6b 50 61 74 68 3d   char *lockPath=
2ce60 4e 55 4c 4c 3b 0a 20 20 69 6e 74 20 72 63 20 3d  NULL;.  int rc =
2ce70 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 0a 20   SQLITE_OK;.  . 
2ce80 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b   if( pFile->lock
2ce90 74 79 70 65 21 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b  type!=NO_LOCK ){
2cea0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2ceb0 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 20 20 70  TE_BUSY;.  }.  p
2cec0 72 6f 78 79 47 65 74 44 62 50 61 74 68 46 6f 72  roxyGetDbPathFor
2ced0 55 6e 69 78 46 69 6c 65 28 70 46 69 6c 65 2c 20  UnixFile(pFile, 
2cee0 64 62 50 61 74 68 29 3b 0a 20 20 69 66 28 20 21  dbPath);.  if( !
2cef0 70 61 74 68 20 7c 7c 20 70 61 74 68 5b 30 5d 3d  path || path[0]=
2cf00 3d 27 5c 30 27 20 7c 7c 20 21 73 74 72 63 6d 70  ='\0' || !strcmp
2cf10 28 70 61 74 68 2c 20 22 3a 61 75 74 6f 3a 22 29  (path, ":auto:")
2cf20 20 29 7b 0a 20 20 20 20 6c 6f 63 6b 50 61 74 68   ){.    lockPath
2cf30 3d 4e 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a  =NULL;.  }else{.
2cf40 20 20 20 20 6c 6f 63 6b 50 61 74 68 3d 28 63 68      lockPath=(ch
2cf50 61 72 20 2a 29 70 61 74 68 3b 0a 20 20 7d 0a 20  ar *)path;.  }. 
2cf60 20 0a 20 20 4f 53 54 52 41 43 45 34 28 22 54 52   .  OSTRACE4("TR
2cf70 41 4e 53 50 52 4f 58 59 20 20 25 64 20 66 6f 72  ANSPROXY  %d for
2cf80 20 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c 20 70   %s pid=%d\n", p
2cf90 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20  File->h,.       
2cfa0 20 20 20 20 28 6c 6f 63 6b 50 61 74 68 20 3f 20      (lockPath ? 
2cfb0 6c 6f 63 6b 50 61 74 68 20 3a 20 22 3a 61 75 74  lockPath : ":aut
2cfc0 6f 3a 22 29 2c 20 67 65 74 70 69 64 28 29 29 3b  o:"), getpid());
2cfd0 0a 0a 20 20 70 43 74 78 20 3d 20 73 71 6c 69 74  ..  pCtx = sqlit
2cfe0 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  e3_malloc( sizeo
2cff0 66 28 2a 70 43 74 78 29 20 29 3b 0a 20 20 69 66  f(*pCtx) );.  if
2d000 28 20 70 43 74 78 3d 3d 30 20 29 7b 0a 20 20 20  ( pCtx==0 ){.   
2d010 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
2d020 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73  OMEM;.  }.  mems
2d030 65 74 28 70 43 74 78 2c 20 30 2c 20 73 69 7a 65  et(pCtx, 0, size
2d040 6f 66 28 2a 70 43 74 78 29 29 3b 0a 0a 20 20 72  of(*pCtx));..  r
2d050 63 20 3d 20 70 72 6f 78 79 43 72 65 61 74 65 43  c = proxyCreateC
2d060 6f 6e 63 68 50 61 74 68 6e 61 6d 65 28 64 62 50  onchPathname(dbP
2d070 61 74 68 2c 20 26 70 43 74 78 2d 3e 63 6f 6e 63  ath, &pCtx->conc
2d080 68 46 69 6c 65 50 61 74 68 29 3b 0a 20 20 69 66  hFilePath);.  if
2d090 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2d0a0 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 72 6f 78  ){.    rc = prox
2d0b0 79 43 72 65 61 74 65 55 6e 69 78 46 69 6c 65 28  yCreateUnixFile(
2d0c0 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 50  pCtx->conchFileP
2d0d0 61 74 68 2c 20 26 70 43 74 78 2d 3e 63 6f 6e 63  ath, &pCtx->conc
2d0e0 68 46 69 6c 65 2c 20 30 29 3b 0a 20 20 20 20 69  hFile, 0);.    i
2d0f0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 41  f( rc==SQLITE_CA
2d100 4e 54 4f 50 45 4e 20 26 26 20 28 28 70 46 69 6c  NTOPEN && ((pFil
2d110 65 2d 3e 6f 70 65 6e 46 6c 61 67 73 26 4f 5f 52  e->openFlags&O_R
2d120 44 57 52 29 20 3d 3d 20 30 29 20 29 7b 0a 20 20  DWR) == 0) ){.  
2d130 20 20 20 20 2f 2a 20 69 66 20 28 61 29 20 74 68      /* if (a) th
2d140 65 20 6f 70 65 6e 20 66 6c 61 67 73 20 61 72 65  e open flags are
2d150 20 6e 6f 74 20 4f 5f 52 44 57 52 2c 20 28 62 29   not O_RDWR, (b)
2d160 20 74 68 65 20 63 6f 6e 63 68 20 69 73 6e 27 74   the conch isn't
2d170 20 74 68 65 72 65 2c 20 61 6e 64 0a 20 20 20 20   there, and.    
2d180 20 20 2a 2a 20 28 63 29 20 74 68 65 20 66 69 6c    ** (c) the fil
2d190 65 20 73 79 73 74 65 6d 20 69 73 20 72 65 61 64  e system is read
2d1a0 2d 6f 6e 6c 79 2c 20 74 68 65 6e 20 65 6e 61 62  -only, then enab
2d1b0 6c 65 20 6e 6f 2d 6c 6f 63 6b 69 6e 67 20 61 63  le no-locking ac
2d1c0 63 65 73 73 2e 0a 20 20 20 20 20 20 2a 2a 20 55  cess..      ** U
2d1d0 67 68 2c 20 73 69 6e 63 65 20 4f 5f 52 44 4f 4e  gh, since O_RDON
2d1e0 4c 59 3d 3d 30 78 30 30 30 30 20 77 65 20 74 65  LY==0x0000 we te
2d1f0 73 74 20 66 6f 72 20 21 4f 5f 52 44 57 52 20 73  st for !O_RDWR s
2d200 69 6e 63 65 20 75 6e 69 78 4f 70 65 6e 20 61 73  ince unixOpen as
2d210 73 65 72 74 73 0a 20 20 20 20 20 20 2a 2a 20 74  serts.      ** t
2d220 68 61 74 20 6f 70 65 6e 46 6c 61 67 73 20 77 69  hat openFlags wi
2d230 6c 6c 20 68 61 76 65 20 6f 6e 6c 79 20 6f 6e 65  ll have only one
2d240 20 6f 66 20 4f 5f 52 44 4f 4e 4c 59 20 6f 72 20   of O_RDONLY or 
2d250 4f 5f 52 44 57 52 2e 0a 20 20 20 20 20 20 2a 2f  O_RDWR..      */
2d260 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 73 74  .      struct st
2d270 61 74 66 73 20 66 73 49 6e 66 6f 3b 0a 20 20 20  atfs fsInfo;.   
2d280 20 20 20 73 74 72 75 63 74 20 73 74 61 74 20 63     struct stat c
2d290 6f 6e 63 68 49 6e 66 6f 3b 0a 20 20 20 20 20 20  onchInfo;.      
2d2a0 69 6e 74 20 67 6f 4c 6f 63 6b 6c 65 73 73 20 3d  int goLockless =
2d2b0 20 30 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 73   0;..      if( s
2d2c0 74 61 74 28 70 43 74 78 2d 3e 63 6f 6e 63 68 46  tat(pCtx->conchF
2d2d0 69 6c 65 50 61 74 68 2c 20 26 63 6f 6e 63 68 49  ilePath, &conchI
2d2e0 6e 66 6f 29 20 3d 3d 20 2d 31 20 29 20 7b 0a 20  nfo) == -1 ) {. 
2d2f0 20 20 20 20 20 20 20 69 6e 74 20 65 72 72 20 3d         int err =
2d300 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20   errno;.        
2d310 69 66 28 20 28 65 72 72 3d 3d 45 4e 4f 45 4e 54  if( (err==ENOENT
2d320 29 20 26 26 20 28 73 74 61 74 66 73 28 64 62 50  ) && (statfs(dbP
2d330 61 74 68 2c 20 26 66 73 49 6e 66 6f 29 20 21 3d  ath, &fsInfo) !=
2d340 20 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20   -1) ){.        
2d350 20 20 67 6f 4c 6f 63 6b 6c 65 73 73 20 3d 20 28    goLockless = (
2d360 66 73 49 6e 66 6f 2e 66 5f 66 6c 61 67 73 26 4d  fsInfo.f_flags&M
2d370 4e 54 5f 52 44 4f 4e 4c 59 29 20 3d 3d 20 4d 4e  NT_RDONLY) == MN
2d380 54 5f 52 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20  T_RDONLY;.      
2d390 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
2d3a0 20 20 69 66 28 20 67 6f 4c 6f 63 6b 6c 65 73 73    if( goLockless
2d3b0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 74 78   ){.        pCtx
2d3c0 2d 3e 63 6f 6e 63 68 48 65 6c 64 20 3d 20 2d 31  ->conchHeld = -1
2d3d0 3b 20 2f 2a 20 72 65 61 64 20 6f 6e 6c 79 20 46  ; /* read only F
2d3e0 53 2f 20 6c 6f 63 6b 6c 65 73 73 20 2a 2f 0a 20  S/ lockless */. 
2d3f0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
2d400 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
2d410 20 20 20 7d 0a 20 20 7d 20 20 0a 20 20 69 66 28     }.  }  .  if(
2d420 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
2d430 26 20 6c 6f 63 6b 50 61 74 68 20 29 7b 0a 20 20  & lockPath ){.  
2d440 20 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78    pCtx->lockProx
2d450 79 50 61 74 68 20 3d 20 73 71 6c 69 74 65 33 44  yPath = sqlite3D
2d460 62 53 74 72 44 75 70 28 30 2c 20 6c 6f 63 6b 50  bStrDup(0, lockP
2d470 61 74 68 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  ath);.  }..  if(
2d480 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2d490 7b 0a 20 20 20 20 70 43 74 78 2d 3e 64 62 50 61  {.    pCtx->dbPa
2d4a0 74 68 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  th = sqlite3DbSt
2d4b0 72 44 75 70 28 30 2c 20 64 62 50 61 74 68 29 3b  rDup(0, dbPath);
2d4c0 0a 20 20 20 20 69 66 28 20 70 43 74 78 2d 3e 64  .    if( pCtx->d
2d4d0 62 50 61 74 68 3d 3d 4e 55 4c 4c 20 29 7b 0a 20  bPath==NULL ){. 
2d4e0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
2d4f0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20  _NOMEM;.    }.  
2d500 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
2d510 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20  TE_OK ){.    /* 
2d520 61 6c 6c 20 6d 65 6d 6f 72 79 20 69 73 20 61 6c  all memory is al
2d530 6c 6f 63 61 74 65 64 2c 20 70 72 6f 78 79 73 20  located, proxys 
2d540 61 72 65 20 63 72 65 61 74 65 64 20 61 6e 64 20  are created and 
2d550 61 73 73 69 67 6e 65 64 2c 20 0a 20 20 20 20 2a  assigned, .    *
2d560 2a 20 73 77 69 74 63 68 20 74 68 65 20 6c 6f 63  * switch the loc
2d570 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 61 6e 64  king context and
2d580 20 70 4d 65 74 68 6f 64 20 74 68 65 6e 20 72 65   pMethod then re
2d590 74 75 72 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  turn..    */.   
2d5a0 20 70 43 74 78 2d 3e 6f 6c 64 4c 6f 63 6b 69 6e   pCtx->oldLockin
2d5b0 67 43 6f 6e 74 65 78 74 20 3d 20 70 46 69 6c 65  gContext = pFile
2d5c0 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
2d5d0 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63  ;.    pFile->loc
2d5e0 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20 70 43  kingContext = pC
2d5f0 74 78 3b 0a 20 20 20 20 70 43 74 78 2d 3e 70 4f  tx;.    pCtx->pO
2d600 6c 64 4d 65 74 68 6f 64 20 3d 20 70 46 69 6c 65  ldMethod = pFile
2d610 2d 3e 70 4d 65 74 68 6f 64 3b 0a 20 20 20 20 70  ->pMethod;.    p
2d620 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 20 3d 20  File->pMethod = 
2d630 26 70 72 6f 78 79 49 6f 4d 65 74 68 6f 64 73 3b  &proxyIoMethods;
2d640 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66  .  }else{.    if
2d650 28 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c  ( pCtx->conchFil
2d660 65 20 29 7b 20 0a 20 20 20 20 20 20 70 43 74 78  e ){ .      pCtx
2d670 2d 3e 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65  ->conchFile->pMe
2d680 74 68 6f 64 2d 3e 78 43 6c 6f 73 65 28 28 73 71  thod->xClose((sq
2d690 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 70 43 74  lite3_file *)pCt
2d6a0 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 29 3b 0a 20  x->conchFile);. 
2d6b0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
2d6c0 65 28 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c  e(pCtx->conchFil
2d6d0 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  e);.    }.    sq
2d6e0 6c 69 74 65 33 5f 66 72 65 65 28 70 43 74 78 2d  lite3_free(pCtx-
2d6f0 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 29 3b  >lockProxyPath);
2d700 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
2d710 65 28 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c  e(pCtx->conchFil
2d720 65 50 61 74 68 29 3b 20 0a 20 20 20 20 73 71 6c  ePath); .    sql
2d730 69 74 65 33 5f 66 72 65 65 28 70 43 74 78 29 3b  ite3_free(pCtx);
2d740 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 33 28  .  }.  OSTRACE3(
2d750 22 54 52 41 4e 53 50 52 4f 58 59 20 20 25 64 20  "TRANSPROXY  %d 
2d760 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  %s\n", pFile->h,
2d770 0a 20 20 20 20 20 20 20 20 20 20 20 28 72 63 3d  .           (rc=
2d780 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b  =SQLITE_OK ? "ok
2d790 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a  " : "failed"));.
2d7a0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2d7b0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
2d7c0 69 6e 65 20 68 61 6e 64 6c 65 73 20 73 71 6c 69  ine handles sqli
2d7d0 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  te3_file_control
2d7e0 28 29 20 63 61 6c 6c 73 20 74 68 61 74 20 61 72  () calls that ar
2d7f0 65 20 73 70 65 63 69 66 69 63 0a 2a 2a 20 74 6f  e specific.** to
2d800 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 2e 0a   proxy locking..
2d810 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  */.static int pr
2d820 6f 78 79 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 73  oxyFileControl(s
2d830 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
2d840 20 69 6e 74 20 6f 70 2c 20 76 6f 69 64 20 2a 70   int op, void *p
2d850 41 72 67 29 7b 0a 20 20 73 77 69 74 63 68 28 20  Arg){.  switch( 
2d860 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53  op ){.    case S
2d870 51 4c 49 54 45 5f 47 45 54 5f 4c 4f 43 4b 50 52  QLITE_GET_LOCKPR
2d880 4f 58 59 46 49 4c 45 3a 20 7b 0a 20 20 20 20 20  OXYFILE: {.     
2d890 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
2d8a0 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
2d8b0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 46 69 6c  ;.      if( pFil
2d8c0 65 2d 3e 70 4d 65 74 68 6f 64 20 3d 3d 20 26 70  e->pMethod == &p
2d8d0 72 6f 78 79 49 6f 4d 65 74 68 6f 64 73 20 29 7b  roxyIoMethods ){
2d8e0 0a 20 20 20 20 20 20 20 20 70 72 6f 78 79 4c 6f  .        proxyLo
2d8f0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43  ckingContext *pC
2d900 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69  tx = (proxyLocki
2d910 6e 67 43 6f 6e 74 65 78 74 2a 29 70 46 69 6c 65  ngContext*)pFile
2d920 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
2d930 3b 0a 20 20 20 20 20 20 20 20 70 72 6f 78 79 54  ;.        proxyT
2d940 61 6b 65 43 6f 6e 63 68 28 70 46 69 6c 65 29 3b  akeConch(pFile);
2d950 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43 74  .        if( pCt
2d960 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68  x->lockProxyPath
2d970 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 28   ){.          *(
2d980 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 29 70 41  const char **)pA
2d990 72 67 20 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b 50  rg = pCtx->lockP
2d9a0 72 6f 78 79 50 61 74 68 3b 0a 20 20 20 20 20 20  roxyPath;.      
2d9b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2d9c0 20 20 20 2a 28 63 6f 6e 73 74 20 63 68 61 72 20     *(const char 
2d9d0 2a 2a 29 70 41 72 67 20 3d 20 22 3a 61 75 74 6f  **)pArg = ":auto
2d9e0 3a 20 28 6e 6f 74 20 68 65 6c 64 29 22 3b 0a 20  : (not held)";. 
2d9f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2da00 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20   else {.        
2da10 2a 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 29  *(const char **)
2da20 70 41 72 67 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  pArg = NULL;.   
2da30 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72     }.      retur
2da40 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
2da50 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
2da60 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59  TE_SET_LOCKPROXY
2da70 46 49 4c 45 3a 20 7b 0a 20 20 20 20 20 20 75 6e  FILE: {.      un
2da80 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
2da90 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
2daa0 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 53 51       int rc = SQ
2dab0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 69  LITE_OK;.      i
2dac0 6e 74 20 69 73 50 72 6f 78 79 53 74 79 6c 65 20  nt isProxyStyle 
2dad0 3d 20 28 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f  = (pFile->pMetho
2dae0 64 20 3d 3d 20 26 70 72 6f 78 79 49 6f 4d 65 74  d == &proxyIoMet
2daf0 68 6f 64 73 29 3b 0a 20 20 20 20 20 20 69 66 28  hods);.      if(
2db00 20 70 41 72 67 3d 3d 4e 55 4c 4c 20 7c 7c 20 28   pArg==NULL || (
2db10 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 41 72  const char *)pAr
2db20 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  g==0 ){.        
2db30 69 66 28 20 69 73 50 72 6f 78 79 53 74 79 6c 65  if( isProxyStyle
2db40 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
2db50 20 74 75 72 6e 20 6f 66 66 20 70 72 6f 78 79 20   turn off proxy 
2db60 6c 6f 63 6b 69 6e 67 20 2d 20 6e 6f 74 20 73 75  locking - not su
2db70 70 70 6f 72 74 65 64 20 2a 2f 0a 20 20 20 20 20  pported */.     
2db80 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
2db90 5f 45 52 52 4f 52 20 2f 2a 53 51 4c 49 54 45 5f  _ERROR /*SQLITE_
2dba0 50 52 4f 54 4f 43 4f 4c 3f 20 53 51 4c 49 54 45  PROTOCOL? SQLITE
2dbb0 5f 4d 49 53 55 53 45 3f 2a 2f 3b 0a 20 20 20 20  _MISUSE?*/;.    
2dbc0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2dbd0 20 20 20 20 20 2f 2a 20 74 75 72 6e 20 6f 66 66       /* turn off
2dbe0 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 2d   proxy locking -
2dbf0 20 61 6c 72 65 61 64 79 20 6f 66 66 20 2d 20 4e   already off - N
2dc00 4f 4f 50 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  OOP */.         
2dc10 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2dc20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2dc30 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2dc40 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 72 6f 78  const char *prox
2dc50 79 50 61 74 68 20 3d 20 28 63 6f 6e 73 74 20 63  yPath = (const c
2dc60 68 61 72 20 2a 29 70 41 72 67 3b 0a 20 20 20 20  har *)pArg;.    
2dc70 20 20 20 20 69 66 28 20 69 73 50 72 6f 78 79 53      if( isProxyS
2dc80 74 79 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20  tyle ){.        
2dc90 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f    proxyLockingCo
2dca0 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20 0a 20  ntext *pCtx = . 
2dcb0 20 20 20 20 20 20 20 20 20 20 20 28 70 72 6f 78             (prox
2dcc0 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2a  yLockingContext*
2dcd0 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43  )pFile->lockingC
2dce0 6f 6e 74 65 78 74 3b 0a 20 20 20 20 20 20 20 20  ontext;.        
2dcf0 20 20 69 66 28 20 21 73 74 72 63 6d 70 28 70 41    if( !strcmp(pA
2dd00 72 67 2c 20 22 3a 61 75 74 6f 3a 22 29 20 0a 20  rg, ":auto:") . 
2dd10 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 43            || (pC
2dd20 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74  tx->lockProxyPat
2dd30 68 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20  h &&.           
2dd40 20 20 20 20 21 73 74 72 6e 63 6d 70 28 70 43 74      !strncmp(pCt
2dd50 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68  x->lockProxyPath
2dd60 2c 20 70 72 6f 78 79 50 61 74 68 2c 20 4d 41 58  , proxyPath, MAX
2dd70 50 41 54 48 4c 45 4e 29 29 0a 20 20 20 20 20 20  PATHLEN)).      
2dd80 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
2dd90 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
2dda0 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  K;.          }el
2ddb0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
2ddc0 72 63 20 3d 20 73 77 69 74 63 68 4c 6f 63 6b 50  rc = switchLockP
2ddd0 72 6f 78 79 50 61 74 68 28 70 46 69 6c 65 2c 20  roxyPath(pFile, 
2dde0 70 72 6f 78 79 50 61 74 68 29 3b 0a 20 20 20 20  proxyPath);.    
2ddf0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2de00 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
2de10 20 2f 2a 20 74 75 72 6e 20 6f 6e 20 70 72 6f 78   /* turn on prox
2de20 79 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 2a  y file locking *
2de30 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  /.          rc =
2de40 20 70 72 6f 78 79 54 72 61 6e 73 66 6f 72 6d 55   proxyTransformU
2de50 6e 69 78 46 69 6c 65 28 70 46 69 6c 65 2c 20 70  nixFile(pFile, p
2de60 72 6f 78 79 50 61 74 68 29 3b 0a 20 20 20 20 20  roxyPath);.     
2de70 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
2de80 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2de90 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
2dea0 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
2deb0 20 30 20 29 3b 20 20 2f 2a 20 54 68 65 20 63 61   0 );  /* The ca
2dec0 6c 6c 20 61 73 73 75 72 65 73 20 74 68 61 74 20  ll assures that 
2ded0 6f 6e 6c 79 20 76 61 6c 69 64 20 6f 70 63 6f 64  only valid opcod
2dee0 65 73 20 61 72 65 20 73 65 6e 74 20 2a 2f 0a 20  es are sent */. 
2def0 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 4e 4f 54     }.  }.  /*NOT
2df00 52 45 41 43 48 45 44 2a 2f 0a 20 20 72 65 74 75  REACHED*/.  retu
2df10 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
2df20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 69 74 68 69 6e  .}../*.** Within
2df30 20 74 68 69 73 20 64 69 76 69 73 69 6f 6e 20 28   this division (
2df40 74 68 65 20 70 72 6f 78 79 69 6e 67 20 6c 6f 63  the proxying loc
2df50 6b 69 6e 67 20 69 6d 70 6c 65 6d 65 6e 74 61 74  king implementat
2df60 69 6f 6e 29 20 74 68 65 20 70 72 6f 63 65 64 75  ion) the procedu
2df70 72 65 73 0a 2a 2a 20 61 62 6f 76 65 20 74 68 69  res.** above thi
2df80 73 20 70 6f 69 6e 74 20 61 72 65 20 61 6c 6c 20  s point are all 
2df90 75 74 69 6c 69 74 69 65 73 2e 20 20 54 68 65 20  utilities.  The 
2dfa0 6c 6f 63 6b 2d 72 65 6c 61 74 65 64 20 6d 65 74  lock-related met
2dfb0 68 6f 64 73 20 6f 66 20 74 68 65 0a 2a 2a 20 70  hods of the.** p
2dfc0 72 6f 78 79 2d 6c 6f 63 6b 69 6e 67 20 73 71 6c  roxy-locking sql
2dfd0 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 20 6f  ite3_io_method o
2dfe0 62 6a 65 63 74 20 66 6f 6c 6c 6f 77 2e 0a 2a 2f  bject follow..*/
2dff0 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  .../*.** This ro
2e000 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20  utine checks if 
2e010 74 68 65 72 65 20 69 73 20 61 20 52 45 53 45 52  there is a RESER
2e020 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e  VED lock held on
2e030 20 74 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a   the specified.*
2e040 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f  * file by this o
2e050 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63  r any other proc
2e060 65 73 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c  ess. If such a l
2e070 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74  ock is held, set
2e080 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20   *pResOut.** to 
2e090 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65  a non-zero value
2e0a0 20 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65 73   otherwise *pRes
2e0b0 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65  Out is set to ze
2e0c0 72 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20  ro.  The return 
2e0d0 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20  value.** is set 
2e0e0 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c  to SQLITE_OK unl
2e0f0 65 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72  ess an I/O error
2e100 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c   occurs during l
2e110 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f  ock checking..*/
2e120 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
2e130 79 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  yCheckReservedLo
2e140 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
2e150 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75  *id, int *pResOu
2e160 74 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  t) {.  unixFile 
2e170 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
2e180 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20 72 63  le*)id;.  int rc
2e190 20 3d 20 70 72 6f 78 79 54 61 6b 65 43 6f 6e 63   = proxyTakeConc
2e1a0 68 28 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20  h(pFile);.  if( 
2e1b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2e1c0 0a 20 20 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e  .    proxyLockin
2e1d0 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d  gContext *pCtx =
2e1e0 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f   (proxyLockingCo
2e1f0 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c  ntext *)pFile->l
2e200 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20  ockingContext;. 
2e210 20 20 20 69 66 28 20 70 43 74 78 2d 3e 63 6f 6e     if( pCtx->con
2e220 63 68 48 65 6c 64 3e 30 20 29 7b 0a 20 20 20 20  chHeld>0 ){.    
2e230 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 72 6f 78    unixFile *prox
2e240 79 20 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72  y = pCtx->lockPr
2e250 6f 78 79 3b 0a 20 20 20 20 20 20 72 65 74 75 72  oxy;.      retur
2e260 6e 20 70 72 6f 78 79 2d 3e 70 4d 65 74 68 6f 64  n proxy->pMethod
2e270 2d 3e 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  ->xCheckReserved
2e280 4c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69  Lock((sqlite3_fi
2e290 6c 65 2a 29 70 72 6f 78 79 2c 20 70 52 65 73 4f  le*)proxy, pResO
2e2a0 75 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 20  ut);.    }else{ 
2e2b0 2f 2a 20 63 6f 6e 63 68 48 65 6c 64 20 3c 20 30  /* conchHeld < 0
2e2c0 20 69 73 20 6c 6f 63 6b 6c 65 73 73 20 2a 2f 0a   is lockless */.
2e2d0 20 20 20 20 20 20 70 52 65 73 4f 75 74 3d 30 3b        pResOut=0;
2e2e0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
2e2f0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2e300 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77   Lock the file w
2e310 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65  ith the lock spe
2e320 63 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65  cified by parame
2e330 74 65 72 20 6c 6f 63 6b 74 79 70 65 20 2d 20 6f  ter locktype - o
2e340 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c  ne.** of the fol
2e350 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20  lowing:.**.**   
2e360 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43    (1) SHARED_LOC
2e370 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53  K.**     (2) RES
2e380 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  ERVED_LOCK.**   
2e390 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f    (3) PENDING_LO
2e3a0 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58  CK.**     (4) EX
2e3b0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a  CLUSIVE_LOCK.**.
2e3c0 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65  ** Sometimes whe
2e3d0 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65  n requesting one
2e3e0 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64   lock state, add
2e3f0 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61  itional lock sta
2e400 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72  tes.** are inser
2e410 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20  ted in between. 
2e420 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67   The locking mig
2e430 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f  ht fail on one o
2e440 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74  f the later.** t
2e450 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69  ransitions leavi
2e460 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74  ng the lock stat
2e470 65 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d  e different from
2e480 20 77 68 61 74 20 69 74 20 73 74 61 72 74 65 64   what it started
2e490 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68   but.** still sh
2e4a0 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e  ort of its goal.
2e4b0 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
2e4c0 63 68 61 72 74 20 73 68 6f 77 73 20 74 68 65 20  chart shows the 
2e4d0 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73  allowed.** trans
2e4e0 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69  itions and the i
2e4f0 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64  nserted intermed
2e500 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a  iate states:.**.
2e510 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d  **    UNLOCKED -
2e520 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53  > SHARED.**    S
2e530 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45  HARED -> RESERVE
2e540 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d  D.**    SHARED -
2e550 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45  > (PENDING) -> E
2e560 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52  XCLUSIVE.**    R
2e570 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44  ESERVED -> (PEND
2e580 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56  ING) -> EXCLUSIV
2e590 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20  E.**    PENDING 
2e5a0 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a  -> EXCLUSIVE.**.
2e5b0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
2e5c0 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61  will only increa
2e5d0 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20  se a lock.  Use 
2e5e0 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c  the sqlite3OsUnl
2e5f0 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65  ock().** routine
2e600 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b   to lower a lock
2e610 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74  ing level..*/.st
2e620 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 4c 6f  atic int proxyLo
2e630 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
2e640 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70  *id, int locktyp
2e650 65 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  e) {.  unixFile 
2e660 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
2e670 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20 72 63  le*)id;.  int rc
2e680 20 3d 20 70 72 6f 78 79 54 61 6b 65 43 6f 6e 63   = proxyTakeConc
2e690 68 28 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20  h(pFile);.  if( 
2e6a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2e6b0 0a 20 20 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e  .    proxyLockin
2e6c0 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d  gContext *pCtx =
2e6d0 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f   (proxyLockingCo
2e6e0 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c  ntext *)pFile->l
2e6f0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20  ockingContext;. 
2e700 20 20 20 69 66 28 20 70 43 74 78 2d 3e 63 6f 6e     if( pCtx->con
2e710 63 68 48 65 6c 64 3e 30 20 29 7b 0a 20 20 20 20  chHeld>0 ){.    
2e720 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 72 6f 78    unixFile *prox
2e730 79 20 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72  y = pCtx->lockPr
2e740 6f 78 79 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  oxy;.      rc = 
2e750 70 72 6f 78 79 2d 3e 70 4d 65 74 68 6f 64 2d 3e  proxy->pMethod->
2e760 78 4c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66  xLock((sqlite3_f
2e770 69 6c 65 2a 29 70 72 6f 78 79 2c 20 6c 6f 63 6b  ile*)proxy, lock
2e780 74 79 70 65 29 3b 0a 20 20 20 20 20 20 70 46 69  type);.      pFi
2e790 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 70  le->locktype = p
2e7a0 72 6f 78 79 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a  roxy->locktype;.
2e7b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2e7c0 20 2f 2a 20 63 6f 6e 63 68 48 65 6c 64 20 3c 20   /* conchHeld < 
2e7d0 30 20 69 73 20 6c 6f 63 6b 6c 65 73 73 20 2a 2f  0 is lockless */
2e7e0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
2e7f0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
2e800 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b  * Lower the lock
2e810 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c  ing level on fil
2e820 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69  e descriptor pFi
2e830 6c 65 20 74 6f 20 6c 6f 63 6b 74 79 70 65 2e 20  le to locktype. 
2e840 20 6c 6f 63 6b 74 79 70 65 0a 2a 2a 20 6d 75 73   locktype.** mus
2e850 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c  t be either NO_L
2e860 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f  OCK or SHARED_LO
2e870 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  CK..**.** If the
2e880 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
2e890 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  f the file descr
2e8a0 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79  iptor is already
2e8b0 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20   at or below.** 
2e8c0 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
2e8d0 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69  cking level, thi
2e8e0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
2e8f0 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
2e900 69 6e 74 20 70 72 6f 78 79 55 6e 6c 6f 63 6b 28  int proxyUnlock(
2e910 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
2e920 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 20  , int locktype) 
2e930 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  {.  unixFile *pF
2e940 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
2e950 29 69 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  )id;.  int rc = 
2e960 70 72 6f 78 79 54 61 6b 65 43 6f 6e 63 68 28 70  proxyTakeConch(p
2e970 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 72 63 3d  File);.  if( rc=
2e980 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2e990 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f    proxyLockingCo
2e9a0 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20 28 70  ntext *pCtx = (p
2e9b0 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
2e9c0 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b  xt *)pFile->lock
2e9d0 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20  ingContext;.    
2e9e0 69 66 28 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48  if( pCtx->conchH
2e9f0 65 6c 64 3e 30 20 29 7b 0a 20 20 20 20 20 20 75  eld>0 ){.      u
2ea00 6e 69 78 46 69 6c 65 20 2a 70 72 6f 78 79 20 3d  nixFile *proxy =
2ea10 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79   pCtx->lockProxy
2ea20 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 72 6f  ;.      rc = pro
2ea30 78 79 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 55 6e  xy->pMethod->xUn
2ea40 6c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69  lock((sqlite3_fi
2ea50 6c 65 2a 29 70 72 6f 78 79 2c 20 6c 6f 63 6b 74  le*)proxy, lockt
2ea60 79 70 65 29 3b 0a 20 20 20 20 20 20 70 46 69 6c  ype);.      pFil
2ea70 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 70 72  e->locktype = pr
2ea80 6f 78 79 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a 20  oxy->locktype;. 
2ea90 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2eaa0 2f 2a 20 63 6f 6e 63 68 48 65 6c 64 20 3c 20 30  /* conchHeld < 0
2eab0 20 69 73 20 6c 6f 63 6b 6c 65 73 73 20 2a 2f 0a   is lockless */.
2eac0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
2ead0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2eae0 43 6c 6f 73 65 20 61 20 66 69 6c 65 20 74 68 61  Close a file tha
2eaf0 74 20 75 73 65 73 20 70 72 6f 78 79 20 6c 6f 63  t uses proxy loc
2eb00 6b 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ks..*/.static in
2eb10 74 20 70 72 6f 78 79 43 6c 6f 73 65 28 73 71 6c  t proxyClose(sql
2eb20 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b  ite3_file *id) {
2eb30 0a 20 20 69 66 28 20 69 64 20 29 7b 0a 20 20 20  .  if( id ){.   
2eb40 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
2eb50 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
2eb60 3b 0a 20 20 20 20 70 72 6f 78 79 4c 6f 63 6b 69  ;.    proxyLocki
2eb70 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20  ngContext *pCtx 
2eb80 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43  = (proxyLockingC
2eb90 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e  ontext *)pFile->
2eba0 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  lockingContext;.
2ebb0 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 6c 6f      unixFile *lo
2ebc0 63 6b 50 72 6f 78 79 20 3d 20 70 43 74 78 2d 3e  ckProxy = pCtx->
2ebd0 6c 6f 63 6b 50 72 6f 78 79 3b 0a 20 20 20 20 75  lockProxy;.    u
2ebe0 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46 69  nixFile *conchFi
2ebf0 6c 65 20 3d 20 70 43 74 78 2d 3e 63 6f 6e 63 68  le = pCtx->conch
2ec00 46 69 6c 65 3b 0a 20 20 20 20 69 6e 74 20 72 63  File;.    int rc
2ec10 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
2ec20 20 20 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 50    .    if( lockP
2ec30 72 6f 78 79 20 29 7b 0a 20 20 20 20 20 20 72 63  roxy ){.      rc
2ec40 20 3d 20 6c 6f 63 6b 50 72 6f 78 79 2d 3e 70 4d   = lockProxy->pM
2ec50 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28 28  ethod->xUnlock((
2ec60 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 6c 6f  sqlite3_file*)lo
2ec70 63 6b 50 72 6f 78 79 2c 20 4e 4f 5f 4c 4f 43 4b  ckProxy, NO_LOCK
2ec80 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
2ec90 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
2eca0 20 20 20 72 63 20 3d 20 6c 6f 63 6b 50 72 6f 78     rc = lockProx
2ecb0 79 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 43 6c 6f  y->pMethod->xClo
2ecc0 73 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  se((sqlite3_file
2ecd0 2a 29 6c 6f 63 6b 50 72 6f 78 79 29 3b 0a 20 20  *)lockProxy);.  
2ece0 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
2ecf0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 73 71  urn rc;.      sq
2ed00 6c 69 74 65 33 5f 66 72 65 65 28 6c 6f 63 6b 50  lite3_free(lockP
2ed10 72 6f 78 79 29 3b 0a 20 20 20 20 20 20 70 43 74  roxy);.      pCt
2ed20 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 20 3d 20 30  x->lockProxy = 0
2ed30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2ed40 63 6f 6e 63 68 46 69 6c 65 20 29 7b 0a 20 20 20  conchFile ){.   
2ed50 20 20 20 69 66 28 20 70 43 74 78 2d 3e 63 6f 6e     if( pCtx->con
2ed60 63 68 48 65 6c 64 20 29 7b 0a 20 20 20 20 20 20  chHeld ){.      
2ed70 20 20 72 63 20 3d 20 70 72 6f 78 79 52 65 6c 65    rc = proxyRele
2ed80 61 73 65 43 6f 6e 63 68 28 70 46 69 6c 65 29 3b  aseConch(pFile);
2ed90 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
2eda0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
2edb0 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20     }.      rc = 
2edc0 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68  conchFile->pMeth
2edd0 6f 64 2d 3e 78 43 6c 6f 73 65 28 28 73 71 6c 69  od->xClose((sqli
2ede0 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46  te3_file*)conchF
2edf0 69 6c 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ile);.      if( 
2ee00 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
2ee10 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
2ee20 65 65 28 63 6f 6e 63 68 46 69 6c 65 29 3b 0a 20  ee(conchFile);. 
2ee30 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
2ee40 5f 66 72 65 65 28 70 43 74 78 2d 3e 6c 6f 63 6b  _free(pCtx->lock
2ee50 50 72 6f 78 79 50 61 74 68 29 3b 0a 20 20 20 20  ProxyPath);.    
2ee60 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 74  sqlite3_free(pCt
2ee70 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 50 61 74 68  x->conchFilePath
2ee80 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
2ee90 72 65 65 28 70 43 74 78 2d 3e 64 62 50 61 74 68  ree(pCtx->dbPath
2eea0 29 3b 0a 20 20 20 20 2f 2a 20 72 65 73 74 6f 72  );.    /* restor
2eeb0 65 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 6c  e the original l
2eec0 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 61  ocking context a
2eed0 6e 64 20 70 4d 65 74 68 6f 64 20 74 68 65 6e 20  nd pMethod then 
2eee0 63 6c 6f 73 65 20 69 74 20 2a 2f 0a 20 20 20 20  close it */.    
2eef0 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
2ef00 6e 74 65 78 74 20 3d 20 70 43 74 78 2d 3e 6f 6c  ntext = pCtx->ol
2ef10 64 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  dLockingContext;
2ef20 0a 20 20 20 20 70 46 69 6c 65 2d 3e 70 4d 65 74  .    pFile->pMet
2ef30 68 6f 64 20 3d 20 70 43 74 78 2d 3e 70 4f 6c 64  hod = pCtx->pOld
2ef40 4d 65 74 68 6f 64 3b 0a 20 20 20 20 73 71 6c 69  Method;.    sqli
2ef50 74 65 33 5f 66 72 65 65 28 70 43 74 78 29 3b 0a  te3_free(pCtx);.
2ef60 20 20 20 20 72 65 74 75 72 6e 20 70 46 69 6c 65      return pFile
2ef70 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 43 6c 6f 73  ->pMethod->xClos
2ef80 65 28 69 64 29 3b 0a 20 20 7d 0a 20 20 72 65 74  e(id);.  }.  ret
2ef90 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
2efa0 0a 0a 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65  ....#endif /* de
2efb0 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
2efc0 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
2efd0 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
2efe0 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 72 6f  */./*.** The pro
2eff0 78 79 20 6c 6f 63 6b 69 6e 67 20 73 74 79 6c 65  xy locking style
2f000 20 69 73 20 69 6e 74 65 6e 64 65 64 20 66 6f 72   is intended for
2f010 20 75 73 65 20 77 69 74 68 20 41 46 50 20 66 69   use with AFP fi
2f020 6c 65 73 79 73 74 65 6d 73 2e 0a 2a 2a 20 41 6e  lesystems..** An
2f030 64 20 73 69 6e 63 65 20 41 46 50 20 69 73 20 6f  d since AFP is o
2f040 6e 6c 79 20 73 75 70 70 6f 72 74 65 64 20 6f 6e  nly supported on
2f050 20 4d 61 63 4f 53 58 2c 20 74 68 65 20 70 72 6f   MacOSX, the pro
2f060 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20 61 6c  xy locking is al
2f070 73 6f 0a 2a 2a 20 72 65 73 74 72 69 63 74 65 64  so.** restricted
2f080 20 74 6f 20 4d 61 63 4f 53 58 2e 0a 2a 2a 20 0a   to MacOSX..** .
2f090 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
2f0a0 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68  ****** End of th
2f0b0 65 20 70 72 6f 78 79 20 6c 6f 63 6b 20 69 6d 70  e proxy lock imp
2f0c0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a  lementation ****
2f0d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2f0e0 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
2f0f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2f100 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2f110 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2f120 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2f130 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61  */../*.** Initia
2f140 6c 69 7a 65 20 74 68 65 20 6f 70 65 72 61 74 69  lize the operati
2f150 6e 67 20 73 79 73 74 65 6d 20 69 6e 74 65 72 66  ng system interf
2f160 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ace..**.** This 
2f170 72 6f 75 74 69 6e 65 20 72 65 67 69 73 74 65 72  routine register
2f180 73 20 61 6c 6c 20 56 46 53 20 69 6d 70 6c 65 6d  s all VFS implem
2f190 65 6e 74 61 74 69 6f 6e 73 20 66 6f 72 20 75 6e  entations for un
2f1a0 69 78 2d 6c 69 6b 65 20 6f 70 65 72 61 74 69 6e  ix-like operatin
2f1b0 67 0a 2a 2a 20 73 79 73 74 65 6d 73 2e 20 20 54  g.** systems.  T
2f1c0 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 61 6e 64  his routine, and
2f1d0 20 74 68 65 20 73 71 6c 69 74 65 33 5f 6f 73 5f   the sqlite3_os_
2f1e0 65 6e 64 28 29 20 72 6f 75 74 69 6e 65 20 74 68  end() routine th
2f1f0 61 74 20 66 6f 6c 6c 6f 77 73 2c 0a 2a 2a 20 73  at follows,.** s
2f200 68 6f 75 6c 64 20 62 65 20 74 68 65 20 6f 6e 6c  hould be the onl
2f210 79 20 72 6f 75 74 69 6e 65 73 20 69 6e 20 74 68  y routines in th
2f220 69 73 20 66 69 6c 65 20 74 68 61 74 20 61 72 65  is file that are
2f230 20 76 69 73 69 62 6c 65 20 66 72 6f 6d 20 6f 74   visible from ot
2f240 68 65 72 0a 2a 2a 20 66 69 6c 65 73 2e 0a 2a 2a  her.** files..**
2f250 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2f260 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 63 65 20   is called once 
2f270 64 75 72 69 6e 67 20 53 51 4c 69 74 65 20 69 6e  during SQLite in
2f280 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 61 6e 64  itialization and
2f290 20 62 79 20 61 0a 2a 2a 20 73 69 6e 67 6c 65 20   by a.** single 
2f2a0 74 68 72 65 61 64 2e 20 20 54 68 65 20 6d 65 6d  thread.  The mem
2f2b0 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 61  ory allocation a
2f2c0 6e 64 20 6d 75 74 65 78 20 73 75 62 73 79 73 74  nd mutex subsyst
2f2d0 65 6d 73 20 68 61 76 65 20 6e 6f 74 0a 2a 2a 20  ems have not.** 
2f2e0 6e 65 63 65 73 73 61 72 69 6c 79 20 62 65 65 6e  necessarily been
2f2f0 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 77 68 65   initialized whe
2f300 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
2f310 73 20 63 61 6c 6c 65 64 2c 20 61 6e 64 20 73 6f  s called, and so
2f320 20 74 68 65 79 0a 2a 2a 20 73 68 6f 75 6c 64 20   they.** should 
2f330 6e 6f 74 20 62 65 20 75 73 65 64 2e 0a 2a 2f 0a  not be used..*/.
2f340 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 73 5f 69  int sqlite3_os_i
2f350 6e 69 74 28 76 6f 69 64 29 7b 20 0a 20 20 2f 2a  nit(void){ .  /*
2f360 20 0a 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f   .  ** The follo
2f370 77 69 6e 67 20 6d 61 63 72 6f 20 64 65 66 69 6e  wing macro defin
2f380 65 73 20 61 6e 20 69 6e 69 74 69 61 6c 69 7a 65  es an initialize
2f390 72 20 66 6f 72 20 61 6e 20 73 71 6c 69 74 65 33  r for an sqlite3
2f3a0 5f 76 66 73 20 6f 62 6a 65 63 74 2e 0a 20 20 2a  _vfs object..  *
2f3b0 2a 20 54 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  * The name of th
2f3c0 65 20 56 46 53 20 69 73 20 4e 41 4d 45 2e 20 20  e VFS is NAME.  
2f3d0 54 68 65 20 70 41 70 70 44 61 74 61 20 69 73 20  The pAppData is 
2f3e0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 70  a pointer to a p
2f3f0 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 74 6f 20 74  ointer.  ** to t
2f400 68 65 20 22 66 69 6e 64 65 72 22 20 66 75 6e 63  he "finder" func
2f410 74 69 6f 6e 2e 20 20 28 70 41 70 70 44 61 74 61  tion.  (pAppData
2f420 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
2f430 20 61 20 70 6f 69 6e 74 65 72 20 62 65 63 61 75   a pointer becau
2f440 73 65 0a 20 20 2a 2a 20 73 69 6c 6c 79 20 43 39  se.  ** silly C9
2f450 30 20 72 75 6c 65 73 20 70 72 6f 68 69 62 69 74  0 rules prohibit
2f460 20 61 20 76 6f 69 64 2a 20 66 72 6f 6d 20 62 65   a void* from be
2f470 69 6e 67 20 63 61 73 74 20 74 6f 20 61 20 66 75  ing cast to a fu
2f480 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 0a 20  nction pointer. 
2f490 20 2a 2a 20 61 6e 64 20 73 6f 20 77 65 20 68 61   ** and so we ha
2f4a0 76 65 20 74 6f 20 67 6f 20 74 68 72 6f 75 67 68  ve to go through
2f4b0 20 74 68 65 20 69 6e 74 65 72 6d 65 64 69 61 74   the intermediat
2f4c0 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 76 6f  e pointer to avo
2f4d0 69 64 20 70 72 6f 62 6c 65 6d 73 0a 20 20 2a 2a  id problems.  **
2f4e0 20 77 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67 20   when compiling 
2f4f0 77 69 74 68 20 2d 70 65 64 61 6e 74 69 63 2d 65  with -pedantic-e
2f500 72 72 6f 72 73 20 6f 6e 20 47 43 43 2e 29 0a 20  rrors on GCC.). 
2f510 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 46 49 4e   **.  ** The FIN
2f520 44 45 52 20 70 61 72 61 6d 65 74 65 72 20 74 6f  DER parameter to
2f530 20 74 68 69 73 20 6d 61 63 72 6f 20 69 73 20 74   this macro is t
2f540 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 70  he name of the p
2f550 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 0a 20 20  ointer to the.  
2f560 2a 2a 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69  ** finder-functi
2f570 6f 6e 2e 20 20 54 68 65 20 66 69 6e 64 65 72 2d  on.  The finder-
2f580 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
2f590 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
2f5a0 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 5f 69 6f  e.  ** sqlite_io
2f5b0 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20  _methods object 
2f5c0 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20  that implements 
2f5d0 74 68 65 20 64 65 73 69 72 65 64 20 6c 6f 63 6b  the desired lock
2f5e0 69 6e 67 0a 20 20 2a 2a 20 62 65 68 61 76 69 6f  ing.  ** behavio
2f5f0 72 73 2e 20 20 53 65 65 20 74 68 65 20 64 69 76  rs.  See the div
2f600 69 73 69 6f 6e 20 61 62 6f 76 65 20 74 68 61 74  ision above that
2f610 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 49 4f   contains the IO
2f620 4d 45 54 48 4f 44 53 0a 20 20 2a 2a 20 6d 61 63  METHODS.  ** mac
2f630 72 6f 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 20  ro for addition 
2f640 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 66  information on f
2f650 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 73 2e  inder-functions.
2f660 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 6f 73 74 20  .  **.  ** Most 
2f670 66 69 6e 64 65 72 73 20 73 69 6d 70 6c 79 20 72  finders simply r
2f680 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
2f690 74 6f 20 61 20 66 69 78 65 64 20 73 71 6c 69 74  to a fixed sqlit
2f6a0 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 0a 20 20  e3_io_methods.  
2f6b0 2a 2a 20 6f 62 6a 65 63 74 2e 20 20 42 75 74 20  ** object.  But 
2f6c0 74 68 65 20 22 61 75 74 6f 6c 6f 63 6b 49 6f 46  the "autolockIoF
2f6d0 69 6e 64 65 72 22 20 61 76 61 69 6c 61 62 6c 65  inder" available
2f6e0 20 6f 6e 20 4d 61 63 4f 53 58 20 64 6f 65 73 20   on MacOSX does 
2f6f0 61 20 6c 69 74 74 6c 65 0a 20 20 2a 2a 20 6d 6f  a little.  ** mo
2f700 72 65 20 74 68 61 6e 20 74 68 61 74 3b 20 69 74  re than that; it
2f710 20 6c 6f 6f 6b 73 20 61 74 20 74 68 65 20 66 69   looks at the fi
2f720 6c 65 73 79 73 74 65 6d 20 74 79 70 65 20 74 68  lesystem type th
2f730 61 74 20 68 6f 73 74 73 20 74 68 65 20 0a 20 20  at hosts the .  
2f740 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
2f750 20 61 6e 64 20 74 72 69 65 73 20 74 6f 20 63 68   and tries to ch
2f760 6f 6f 73 65 20 61 6e 20 6c 6f 63 6b 69 6e 67 20  oose an locking 
2f770 6d 65 74 68 6f 64 20 61 70 70 72 6f 70 72 69 61  method appropria
2f780 74 65 20 66 6f 72 0a 20 20 2a 2a 20 74 68 61 74  te for.  ** that
2f790 20 66 69 6c 65 73 79 73 74 65 6d 20 74 69 6d 65   filesystem time
2f7a0 2e 0a 20 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65  ..  */.  #define
2f7b0 20 55 4e 49 58 56 46 53 28 56 46 53 4e 41 4d 45   UNIXVFS(VFSNAME
2f7c0 2c 20 46 49 4e 44 45 52 29 20 7b 20 20 20 20 20  , FINDER) {     
2f7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f7e0 20 20 20 5c 0a 20 20 20 20 31 2c 20 20 20 20 20     \.    1,     
2f7f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2f800 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 20 20 20  * iVersion */   
2f810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f820 20 5c 0a 20 20 20 20 73 69 7a 65 6f 66 28 75 6e   \.    sizeof(un
2f830 69 78 46 69 6c 65 29 2c 20 20 20 20 20 2f 2a 20  ixFile),     /* 
2f840 73 7a 4f 73 46 69 6c 65 20 2a 2f 20 20 20 20 20  szOsFile */     
2f850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
2f860 0a 20 20 20 20 4d 41 58 5f 50 41 54 48 4e 41 4d  .    MAX_PATHNAM
2f870 45 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 6d 78  E,         /* mx
2f880 50 61 74 68 6e 61 6d 65 20 2a 2f 20 20 20 20 20  Pathname */     
2f890 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
2f8a0 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20     0,           
2f8b0 20 20 20 20 20 20 20 20 20 2f 2a 20 70 4e 65 78           /* pNex
2f8c0 74 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  t */            
2f8d0 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
2f8e0 20 56 46 53 4e 41 4d 45 2c 20 20 20 20 20 20 20   VFSNAME,       
2f8f0 20 20 20 20 20 20 20 2f 2a 20 7a 4e 61 6d 65 20         /* zName 
2f900 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
2f910 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 28           \.    (
2f920 76 6f 69 64 2a 29 26 46 49 4e 44 45 52 2c 20 20  void*)&FINDER,  
2f930 20 20 20 20 20 2f 2a 20 70 41 70 70 44 61 74 61       /* pAppData
2f940 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
2f950 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69         \.    uni
2f960 78 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20  xOpen,          
2f970 20 20 20 2f 2a 20 78 4f 70 65 6e 20 2a 2f 20 20     /* xOpen */  
2f980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f990 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 44       \.    unixD
2f9a0 65 6c 65 74 65 2c 20 20 20 20 20 20 20 20 20 20  elete,          
2f9b0 20 2f 2a 20 78 44 65 6c 65 74 65 20 2a 2f 20 20   /* xDelete */  
2f9c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f9d0 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 41 63 63     \.    unixAcc
2f9e0 65 73 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ess,           /
2f9f0 2a 20 78 41 63 63 65 73 73 20 2a 2f 20 20 20 20  * xAccess */    
2fa00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fa10 20 5c 0a 20 20 20 20 75 6e 69 78 46 75 6c 6c 50   \.    unixFullP
2fa20 61 74 68 6e 61 6d 65 2c 20 20 20 20 20 2f 2a 20  athname,     /* 
2fa30 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 2a 2f  xFullPathname */
2fa40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
2fa50 0a 20 20 20 20 75 6e 69 78 44 6c 4f 70 65 6e 2c  .    unixDlOpen,
2fa60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44             /* xD
2fa70 6c 4f 70 65 6e 20 2a 2f 20 20 20 20 20 20 20 20  lOpen */        
2fa80 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
2fa90 20 20 20 75 6e 69 78 44 6c 45 72 72 6f 72 2c 20     unixDlError, 
2faa0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 45           /* xDlE
2fab0 72 72 6f 72 20 2a 2f 20 20 20 20 20 20 20 20 20  rror */         
2fac0 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
2fad0 20 75 6e 69 78 44 6c 53 79 6d 2c 20 20 20 20 20   unixDlSym,     
2fae0 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 53 79 6d         /* xDlSym
2faf0 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
2fb00 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75           \.    u
2fb10 6e 69 78 44 6c 43 6c 6f 73 65 2c 20 20 20 20 20  nixDlClose,     
2fb20 20 20 20 20 20 2f 2a 20 78 44 6c 43 6c 6f 73 65       /* xDlClose
2fb30 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
2fb40 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69         \.    uni
2fb50 78 52 61 6e 64 6f 6d 6e 65 73 73 2c 20 20 20 20  xRandomness,    
2fb60 20 20 20 2f 2a 20 78 52 61 6e 64 6f 6d 6e 65 73     /* xRandomnes
2fb70 73 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  s */            
2fb80 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 53       \.    unixS
2fb90 6c 65 65 70 2c 20 20 20 20 20 20 20 20 20 20 20  leep,           
2fba0 20 2f 2a 20 78 53 6c 65 65 70 20 2a 2f 20 20 20   /* xSleep */   
2fbb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fbc0 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 43 75 72     \.    unixCur
2fbd0 72 65 6e 74 54 69 6d 65 2c 20 20 20 20 20 20 2f  rentTime,      /
2fbe0 2a 20 78 43 75 72 72 65 6e 74 54 69 6d 65 20 2a  * xCurrentTime *
2fbf0 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
2fc00 20 5c 0a 20 20 20 20 75 6e 69 78 47 65 74 4c 61   \.    unixGetLa
2fc10 73 74 45 72 72 6f 72 20 20 20 20 20 20 2f 2a 20  stError      /* 
2fc20 78 47 65 74 4c 61 73 74 45 72 72 6f 72 20 2a 2f  xGetLastError */
2fc30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
2fc40 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
2fc50 41 6c 6c 20 64 65 66 61 75 6c 74 20 56 46 53 65  All default VFSe
2fc60 73 20 66 6f 72 20 75 6e 69 78 20 61 72 65 20 63  s for unix are c
2fc70 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20  ontained in the 
2fc80 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 72 61 79 2e  following array.
2fc90 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20  .  **.  ** Note 
2fca0 74 68 61 74 20 74 68 65 20 73 71 6c 69 74 65 33  that the sqlite3
2fcb0 5f 76 66 73 2e 70 4e 65 78 74 20 66 69 65 6c 64  _vfs.pNext field
2fcc0 20 6f 66 20 74 68 65 20 56 46 53 20 6f 62 6a 65   of the VFS obje
2fcd0 63 74 20 69 73 20 6d 6f 64 69 66 69 65 64 0a 20  ct is modified. 
2fce0 20 2a 2a 20 62 79 20 74 68 65 20 53 51 4c 69 74   ** by the SQLit
2fcf0 65 20 63 6f 72 65 20 77 68 65 6e 20 74 68 65 20  e core when the 
2fd00 56 46 53 20 69 73 20 72 65 67 69 73 74 65 72 65  VFS is registere
2fd10 64 2e 20 20 53 6f 20 74 68 65 20 66 6f 6c 6c 6f  d.  So the follo
2fd20 77 69 6e 67 0a 20 20 2a 2a 20 61 72 72 61 79 20  wing.  ** array 
2fd30 63 61 6e 6e 6f 74 20 62 65 20 63 6f 6e 73 74 2e  cannot be const.
2fd40 0a 20 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 73  .  */.  static s
2fd50 71 6c 69 74 65 33 5f 76 66 73 20 61 56 66 73 5b  qlite3_vfs aVfs[
2fd60 5d 20 3d 20 7b 0a 23 69 66 20 53 51 4c 49 54 45  ] = {.#if SQLITE
2fd70 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
2fd80 53 54 59 4c 45 20 26 26 20 28 4f 53 5f 56 58 57  STYLE && (OS_VXW
2fd90 4f 52 4b 53 20 7c 7c 20 64 65 66 69 6e 65 64 28  ORKS || defined(
2fda0 5f 5f 41 50 50 4c 45 5f 5f 29 29 0a 20 20 20 20  __APPLE__)).    
2fdb0 55 4e 49 58 56 46 53 28 22 75 6e 69 78 22 2c 20  UNIXVFS("unix", 
2fdc0 20 20 20 20 20 20 20 20 20 61 75 74 6f 6c 6f 63           autoloc
2fdd0 6b 49 6f 46 69 6e 64 65 72 20 29 2c 0a 23 65 6c  kIoFinder ),.#el
2fde0 73 65 0a 20 20 20 20 55 4e 49 58 56 46 53 28 22  se.    UNIXVFS("
2fdf0 75 6e 69 78 22 2c 20 20 20 20 20 20 20 20 20 20  unix",          
2fe00 70 6f 73 69 78 49 6f 46 69 6e 64 65 72 20 29 2c  posixIoFinder ),
2fe10 0a 23 65 6e 64 69 66 0a 20 20 20 20 55 4e 49 58  .#endif.    UNIX
2fe20 56 46 53 28 22 75 6e 69 78 2d 6e 6f 6e 65 22 2c  VFS("unix-none",
2fe30 20 20 20 20 20 6e 6f 6c 6f 63 6b 49 6f 46 69 6e       nolockIoFin
2fe40 64 65 72 20 29 2c 0a 20 20 20 20 55 4e 49 58 56  der ),.    UNIXV
2fe50 46 53 28 22 75 6e 69 78 2d 64 6f 74 66 69 6c 65  FS("unix-dotfile
2fe60 22 2c 20 20 64 6f 74 6c 6f 63 6b 49 6f 46 69 6e  ",  dotlockIoFin
2fe70 64 65 72 20 29 2c 0a 23 69 66 20 4f 53 5f 56 58  der ),.#if OS_VX
2fe80 57 4f 52 4b 53 0a 20 20 20 20 55 4e 49 58 56 46  WORKS.    UNIXVF
2fe90 53 28 22 75 6e 69 78 2d 6e 61 6d 65 64 73 65 6d  S("unix-namedsem
2fea0 22 2c 20 73 65 6d 49 6f 46 69 6e 64 65 72 20 29  ", semIoFinder )
2feb0 2c 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  ,.#endif.#if SQL
2fec0 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
2fed0 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20 55 4e 49  NG_STYLE.    UNI
2fee0 58 56 46 53 28 22 75 6e 69 78 2d 70 6f 73 69 78  XVFS("unix-posix
2fef0 22 2c 20 20 20 20 70 6f 73 69 78 49 6f 46 69 6e  ",    posixIoFin
2ff00 64 65 72 20 29 2c 0a 23 69 66 20 21 4f 53 5f 56  der ),.#if !OS_V
2ff10 58 57 4f 52 4b 53 0a 20 20 20 20 55 4e 49 58 56  XWORKS.    UNIXV
2ff20 46 53 28 22 75 6e 69 78 2d 66 6c 6f 63 6b 22 2c  FS("unix-flock",
2ff30 20 20 20 20 66 6c 6f 63 6b 49 6f 46 69 6e 64 65      flockIoFinde
2ff40 72 20 29 2c 0a 23 65 6e 64 69 66 0a 23 65 6e 64  r ),.#endif.#end
2ff50 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e  if.#if SQLITE_EN
2ff60 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
2ff70 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f  LE && defined(__
2ff80 41 50 50 4c 45 5f 5f 29 0a 20 20 20 20 55 4e 49  APPLE__).    UNI
2ff90 58 56 46 53 28 22 75 6e 69 78 2d 61 66 70 22 2c  XVFS("unix-afp",
2ffa0 20 20 20 20 20 20 61 66 70 49 6f 46 69 6e 64 65        afpIoFinde
2ffb0 72 20 29 2c 0a 20 20 20 20 55 4e 49 58 56 46 53  r ),.    UNIXVFS
2ffc0 28 22 75 6e 69 78 2d 6e 66 73 22 2c 20 20 20 20  ("unix-nfs",    
2ffd0 20 20 6e 66 73 49 6f 46 69 6e 64 65 72 20 29 2c    nfsIoFinder ),
2ffe0 0a 20 20 20 20 55 4e 49 58 56 46 53 28 22 75 6e  .    UNIXVFS("un
2fff0 69 78 2d 70 72 6f 78 79 22 2c 20 20 20 20 70 72  ix-proxy",    pr
30000 6f 78 79 49 6f 46 69 6e 64 65 72 20 29 2c 0a 23  oxyIoFinder ),.#
30010 65 6e 64 69 66 0a 20 20 7d 3b 0a 20 20 75 6e 73  endif.  };.  uns
30020 69 67 6e 65 64 20 69 6e 74 20 69 3b 20 20 20 20  igned int i;    
30030 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
30040 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 2f 2a 20 52  unter */..  /* R
30050 65 67 69 73 74 65 72 20 61 6c 6c 20 56 46 53 65  egister all VFSe
30060 73 20 64 65 66 69 6e 65 64 20 69 6e 20 74 68 65  s defined in the
30070 20 61 56 66 73 5b 5d 20 61 72 72 61 79 20 2a 2f   aVfs[] array */
30080 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 28 73  .  for(i=0; i<(s
30090 69 7a 65 6f 66 28 61 56 66 73 29 2f 73 69 7a 65  izeof(aVfs)/size
300a0 6f 66 28 73 71 6c 69 74 65 33 5f 76 66 73 29 29  of(sqlite3_vfs))
300b0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
300c0 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72  te3_vfs_register
300d0 28 26 61 56 66 73 5b 69 5d 2c 20 69 3d 3d 30 29  (&aVfs[i], i==0)
300e0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
300f0 51 4c 49 54 45 5f 4f 4b 3b 20 0a 7d 0a 0a 2f 2a  QLITE_OK; .}../*
30100 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74 68 65  .** Shutdown the
30110 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
30120 6d 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2a 0a  m interface..**.
30130 2a 2a 20 53 6f 6d 65 20 6f 70 65 72 61 74 69 6e  ** Some operatin
30140 67 20 73 79 73 74 65 6d 73 20 6d 69 67 68 74 20  g systems might 
30150 6e 65 65 64 20 74 6f 20 64 6f 20 73 6f 6d 65 20  need to do some 
30160 63 6c 65 61 6e 75 70 20 69 6e 20 74 68 69 73 20  cleanup in this 
30170 72 6f 75 74 69 6e 65 2c 0a 2a 2a 20 74 6f 20 72  routine,.** to r
30180 65 6c 65 61 73 65 20 64 79 6e 61 6d 69 63 61 6c  elease dynamical
30190 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 6f 62 6a  ly allocated obj
301a0 65 63 74 73 2e 20 20 42 75 74 20 6e 6f 74 20 6f  ects.  But not o
301b0 6e 20 75 6e 69 78 2e 0a 2a 2a 20 54 68 69 73 20  n unix..** This 
301c0 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
301d0 6f 70 20 66 6f 72 20 75 6e 69 78 2e 0a 2a 2f 0a  op for unix..*/.
301e0 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 73 5f 65  int sqlite3_os_e
301f0 6e 64 28 76 6f 69 64 29 7b 20 0a 20 20 72 65 74  nd(void){ .  ret
30200 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 0a  urn SQLITE_OK; .
30210 7d 0a 20 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  }. .#endif /* SQ
30220 4c 49 54 45 5f 4f 53 5f 55 4e 49 58 20 2a 2f 0a  LITE_OS_UNIX */.