/ Hex Artifact Content
Login

Artifact 52b10971479bb77c0c1ed334f0a73cd87b972ee0:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 4d 61 79 20 32  /*.** 2004 May 2
0010: 32 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  2.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
0180: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74   file contains t
0190: 68 65 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74  he VFS implement
01a0: 61 74 69 6f 6e 20 66 6f 72 20 75 6e 69 78 2d 6c  ation for unix-l
01b0: 69 6b 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  ike operating sy
01c0: 73 74 65 6d 73 0a 2a 2a 20 69 6e 63 6c 75 64 65  stems.** include
01d0: 20 4c 69 6e 75 78 2c 20 4d 61 63 4f 53 58 2c 20   Linux, MacOSX, 
01e0: 2a 42 53 44 2c 20 51 4e 58 2c 20 56 78 57 6f 72  *BSD, QNX, VxWor
01f0: 6b 73 2c 20 41 49 58 2c 20 48 50 55 58 2c 20 61  ks, AIX, HPUX, a
0200: 6e 64 20 6f 74 68 65 72 73 2e 0a 2a 2a 0a 2a 2a  nd others..**.**
0210: 20 54 68 65 72 65 20 61 72 65 20 61 63 74 75 61   There are actua
0220: 6c 6c 79 20 73 65 76 65 72 61 6c 20 64 69 66 66  lly several diff
0230: 65 72 65 6e 74 20 56 46 53 20 69 6d 70 6c 65 6d  erent VFS implem
0240: 65 6e 74 61 74 69 6f 6e 73 20 69 6e 20 74 68 69  entations in thi
0250: 73 20 66 69 6c 65 2e 0a 2a 2a 20 54 68 65 20 64  s file..** The d
0260: 69 66 66 65 72 65 6e 63 65 73 20 61 72 65 20 69  ifferences are i
0270: 6e 20 74 68 65 20 77 61 79 20 74 68 61 74 20 66  n the way that f
0280: 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20 64  ile locking is d
0290: 6f 6e 65 2e 20 20 54 68 65 20 64 65 66 61 75 6c  one.  The defaul
02a0: 74 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74  t.** implementat
02b0: 69 6f 6e 20 75 73 65 73 20 50 6f 73 69 78 20 41  ion uses Posix A
02c0: 64 76 69 73 6f 72 79 20 4c 6f 63 6b 73 2e 20 20  dvisory Locks.  
02d0: 41 6c 74 65 72 6e 61 74 69 76 65 20 69 6d 70 6c  Alternative impl
02e0: 65 6d 65 6e 74 61 74 69 6f 6e 73 0a 2a 2a 20 75  ementations.** u
02f0: 73 65 20 66 6c 6f 63 6b 28 29 2c 20 64 6f 74 2d  se flock(), dot-
0300: 66 69 6c 65 73 2c 20 76 61 72 69 6f 75 73 20 70  files, various p
0310: 72 6f 70 72 69 65 74 61 72 79 20 6c 6f 63 6b 69  roprietary locki
0320: 6e 67 20 73 63 68 65 6d 61 73 2c 20 6f 72 20 73  ng schemas, or s
0330: 69 6d 70 6c 79 0a 2a 2a 20 73 6b 69 70 20 6c 6f  imply.** skip lo
0340: 63 6b 69 6e 67 20 61 6c 6c 20 74 6f 67 65 74 68  cking all togeth
0350: 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73  er..**.** This s
0360: 6f 75 72 63 65 20 66 69 6c 65 20 69 73 20 6f 72  ource file is or
0370: 67 61 6e 69 7a 65 64 20 69 6e 74 6f 20 64 69 76  ganized into div
0380: 69 73 69 6f 6e 73 20 77 68 65 72 65 20 74 68 65  isions where the
0390: 20 6c 6f 67 69 63 20 66 6f 72 20 76 61 72 69 6f   logic for vario
03a0: 75 73 0a 2a 2a 20 73 75 62 66 75 6e 63 74 69 6f  us.** subfunctio
03b0: 6e 73 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20  ns is contained 
03c0: 77 69 74 68 69 6e 20 74 68 65 20 61 70 70 72 6f  within the appro
03d0: 70 72 69 61 74 65 20 64 69 76 69 73 69 6f 6e 2e  priate division.
03e0: 20 20 50 4c 45 41 53 45 0a 2a 2a 20 4b 45 45 50    PLEASE.** KEEP
03f0: 20 54 48 45 20 53 54 52 55 43 54 55 52 45 20 4f   THE STRUCTURE O
0400: 46 20 54 48 49 53 20 46 49 4c 45 20 49 4e 54 41  F THIS FILE INTA
0410: 43 54 2e 20 20 4e 65 77 20 63 6f 64 65 20 73 68  CT.  New code sh
0420: 6f 75 6c 64 20 62 65 20 70 6c 61 63 65 64 0a 2a  ould be placed.*
0430: 2a 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74  * in the correct
0440: 20 64 69 76 69 73 69 6f 6e 20 61 6e 64 20 73 68   division and sh
0450: 6f 75 6c 64 20 62 65 20 63 6c 65 61 72 6c 79 20  ould be clearly 
0460: 6c 61 62 65 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  labeled..**.** T
0470: 68 65 20 6c 61 79 6f 75 74 20 6f 66 20 64 69 76  he layout of div
0480: 69 73 69 6f 6e 73 20 69 73 20 61 73 20 66 6f 6c  isions is as fol
0490: 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  lows:.**.**   * 
04a0: 20 47 65 6e 65 72 61 6c 2d 70 75 72 70 6f 73 65   General-purpose
04b0: 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 20 61 6e   declarations an
04c0: 64 20 75 74 69 6c 69 74 79 20 66 75 6e 63 74 69  d utility functi
04d0: 6f 6e 73 2e 0a 2a 2a 20 20 20 2a 20 20 55 6e 69  ons..**   *  Uni
04e0: 71 75 65 20 66 69 6c 65 20 49 44 20 6c 6f 67 69  que file ID logi
04f0: 63 20 75 73 65 64 20 62 79 20 56 78 57 6f 72 6b  c used by VxWork
0500: 73 2e 0a 2a 2a 20 20 20 2a 20 20 56 61 72 69 6f  s..**   *  Vario
0510: 75 73 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69  us locking primi
0520: 74 69 76 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  tive implementat
0530: 69 6f 6e 73 20 28 61 6c 6c 20 65 78 63 65 70 74  ions (all except
0540: 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 29 3a   proxy locking):
0550: 0a 2a 2a 20 20 20 20 20 20 2b 20 66 6f 72 20 50  .**      + for P
0560: 6f 73 69 78 20 41 64 76 69 73 6f 72 79 20 4c 6f  osix Advisory Lo
0570: 63 6b 73 0a 2a 2a 20 20 20 20 20 20 2b 20 66 6f  cks.**      + fo
0580: 72 20 6e 6f 2d 6f 70 20 6c 6f 63 6b 73 0a 2a 2a  r no-op locks.**
0590: 20 20 20 20 20 20 2b 20 66 6f 72 20 64 6f 74 2d        + for dot-
05a0: 66 69 6c 65 20 6c 6f 63 6b 73 0a 2a 2a 20 20 20  file locks.**   
05b0: 20 20 20 2b 20 66 6f 72 20 66 6c 6f 63 6b 28 29     + for flock()
05c0: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   locking.**     
05d0: 20 2b 20 66 6f 72 20 6e 61 6d 65 64 20 73 65 6d   + for named sem
05e0: 61 70 68 6f 72 65 20 6c 6f 63 6b 73 20 28 56 78  aphore locks (Vx
05f0: 57 6f 72 6b 73 20 6f 6e 6c 79 29 0a 2a 2a 20 20  Works only).**  
0600: 20 20 20 20 2b 20 66 6f 72 20 41 46 50 20 66 69      + for AFP fi
0610: 6c 65 73 79 73 74 65 6d 20 6c 6f 63 6b 73 20 28  lesystem locks (
0620: 4d 61 63 4f 53 58 20 6f 6e 6c 79 29 0a 2a 2a 20  MacOSX only).** 
0630: 20 20 2a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c    *  sqlite3_fil
0640: 65 20 6d 65 74 68 6f 64 73 20 6e 6f 74 20 61 73  e methods not as
0650: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 6c 6f  sociated with lo
0660: 63 6b 69 6e 67 2e 0a 2a 2a 20 20 20 2a 20 20 44  cking..**   *  D
0670: 65 66 69 6e 69 74 69 6f 6e 73 20 6f 66 20 73 71  efinitions of sq
0680: 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
0690: 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 61 6c 6c   objects for all
06a0: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   locking.**     
06b0: 20 6d 65 74 68 6f 64 73 20 70 6c 75 73 20 22 66   methods plus "f
06c0: 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 73  inder" functions
06d0: 20 66 6f 72 20 65 61 63 68 20 6c 6f 63 6b 69 6e   for each lockin
06e0: 67 20 6d 65 74 68 6f 64 2e 0a 2a 2a 20 20 20 2a  g method..**   *
06f0: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65    sqlite3_vfs me
0700: 74 68 6f 64 20 69 6d 70 6c 65 6d 65 6e 74 61 74  thod implementat
0710: 69 6f 6e 73 2e 0a 2a 2a 20 20 20 2a 20 20 4c 6f  ions..**   *  Lo
0720: 63 6b 69 6e 67 20 70 72 69 6d 69 74 69 76 65 73  cking primitives
0730: 20 66 6f 72 20 74 68 65 20 70 72 6f 78 79 20 75   for the proxy u
0740: 62 65 72 2d 6c 6f 63 6b 69 6e 67 2d 6d 65 74 68  ber-locking-meth
0750: 6f 64 2e 20 28 4d 61 63 4f 53 58 20 6f 6e 6c 79  od. (MacOSX only
0760: 29 0a 2a 2a 20 20 20 2a 20 20 44 65 66 69 6e 69  ).**   *  Defini
0770: 74 69 6f 6e 73 20 6f 66 20 73 71 6c 69 74 65 33  tions of sqlite3
0780: 5f 76 66 73 20 6f 62 6a 65 63 74 73 20 66 6f 72  _vfs objects for
0790: 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6d 65 74   all locking met
07a0: 68 6f 64 73 0a 2a 2a 20 20 20 20 20 20 70 6c 75  hods.**      plu
07b0: 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  s implementation
07c0: 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 6f 73 5f  s of sqlite3_os_
07d0: 69 6e 69 74 28 29 20 61 6e 64 20 73 71 6c 69 74  init() and sqlit
07e0: 65 33 5f 6f 73 5f 65 6e 64 28 29 2e 0a 2a 2f 0a  e3_os_end()..*/.
07f0: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0800: 49 6e 74 2e 68 22 0a 23 69 66 20 53 51 4c 49 54  Int.h".#if SQLIT
0810: 45 5f 4f 53 5f 55 4e 49 58 20 20 20 20 20 20 20  E_OS_UNIX       
0820: 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 66         /* This f
0830: 69 6c 65 20 69 73 20 75 73 65 64 20 6f 6e 20 75  ile is used on u
0840: 6e 69 78 20 6f 6e 6c 79 20 2a 2f 0a 0a 2f 2a 0a  nix only */../*.
0850: 2a 2a 20 54 68 65 72 65 20 61 72 65 20 76 61 72  ** There are var
0860: 69 6f 75 73 20 6d 65 74 68 6f 64 73 20 66 6f 72  ious methods for
0870: 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 75 73   file locking us
0880: 65 64 20 66 6f 72 20 63 6f 6e 63 75 72 72 65 6e  ed for concurren
0890: 63 79 0a 2a 2a 20 63 6f 6e 74 72 6f 6c 3a 0a 2a  cy.** control:.*
08a0: 2a 0a 2a 2a 20 20 20 31 2e 20 50 4f 53 49 58 20  *.**   1. POSIX 
08b0: 6c 6f 63 6b 69 6e 67 20 28 74 68 65 20 64 65 66  locking (the def
08c0: 61 75 6c 74 29 2c 0a 2a 2a 20 20 20 32 2e 20 4e  ault),.**   2. N
08d0: 6f 20 6c 6f 63 6b 69 6e 67 2c 0a 2a 2a 20 20 20  o locking,.**   
08e0: 33 2e 20 44 6f 74 2d 66 69 6c 65 20 6c 6f 63 6b  3. Dot-file lock
08f0: 69 6e 67 2c 0a 2a 2a 20 20 20 34 2e 20 66 6c 6f  ing,.**   4. flo
0900: 63 6b 28 29 20 6c 6f 63 6b 69 6e 67 2c 0a 2a 2a  ck() locking,.**
0910: 20 20 20 35 2e 20 41 46 50 20 6c 6f 63 6b 69 6e     5. AFP lockin
0920: 67 20 28 4f 53 58 20 6f 6e 6c 79 29 2c 0a 2a 2a  g (OSX only),.**
0930: 20 20 20 36 2e 20 4e 61 6d 65 64 20 50 4f 53 49     6. Named POSI
0940: 58 20 73 65 6d 61 70 68 6f 72 65 73 20 28 56 58  X semaphores (VX
0950: 57 6f 72 6b 73 20 6f 6e 6c 79 29 2c 0a 2a 2a 20  Works only),.** 
0960: 20 20 37 2e 20 70 72 6f 78 79 20 6c 6f 63 6b 69    7. proxy locki
0970: 6e 67 2e 20 28 4f 53 58 20 6f 6e 6c 79 29 0a 2a  ng. (OSX only).*
0980: 2a 0a 2a 2a 20 53 74 79 6c 65 73 20 34 2c 20 35  *.** Styles 4, 5
0990: 2c 20 61 6e 64 20 37 20 61 72 65 20 6f 6e 6c 79  , and 7 are only
09a0: 20 61 76 61 69 6c 61 62 6c 65 20 6f 66 20 53 51   available of SQ
09b0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
09c0: 49 4e 47 5f 53 54 59 4c 45 0a 2a 2a 20 69 73 20  ING_STYLE.** is 
09d0: 64 65 66 69 6e 65 64 20 74 6f 20 31 2e 20 20 54  defined to 1.  T
09e0: 68 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  he SQLITE_ENABLE
09f0: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 61  _LOCKING_STYLE a
0a00: 6c 73 6f 20 65 6e 61 62 6c 65 73 20 61 75 74 6f  lso enables auto
0a10: 6d 61 74 69 63 0a 2a 2a 20 73 65 6c 65 63 74 69  matic.** selecti
0a20: 6f 6e 20 6f 66 20 74 68 65 20 61 70 70 72 6f 70  on of the approp
0a30: 72 69 61 74 65 20 6c 6f 63 6b 69 6e 67 20 73 74  riate locking st
0a40: 79 6c 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65  yle based on the
0a50: 20 66 69 6c 65 73 79 73 74 65 6d 0a 2a 2a 20 77   filesystem.** w
0a60: 68 65 72 65 20 74 68 65 20 64 61 74 61 62 61 73  here the databas
0a70: 65 20 69 73 20 6c 6f 63 61 74 65 64 2e 20 20 0a  e is located.  .
0a80: 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
0a90: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
0aa0: 43 4b 49 4e 47 5f 53 54 59 4c 45 29 0a 23 20 20  CKING_STYLE).#  
0ab0: 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
0ac0: 4c 45 5f 5f 29 0a 23 20 20 20 20 64 65 66 69 6e  LE__).#    defin
0ad0: 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  e SQLITE_ENABLE_
0ae0: 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 31 0a  LOCKING_STYLE 1.
0af0: 23 20 20 65 6c 73 65 0a 23 20 20 20 20 64 65 66  #  else.#    def
0b00: 69 6e 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ine SQLITE_ENABL
0b10: 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
0b20: 30 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69  0.#  endif.#endi
0b30: 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65 20  f../*.** Define 
0b40: 74 68 65 20 4f 53 5f 56 58 57 4f 52 4b 53 20 70  the OS_VXWORKS p
0b50: 72 65 2d 70 72 6f 63 65 73 73 6f 72 20 6d 61 63  re-processor mac
0b60: 72 6f 20 74 6f 20 31 20 69 66 20 62 75 69 6c 64  ro to 1 if build
0b70: 69 6e 67 20 6f 6e 20 0a 2a 2a 20 76 78 77 6f 72  ing on .** vxwor
0b80: 6b 73 2c 20 6f 72 20 30 20 6f 74 68 65 72 77 69  ks, or 0 otherwi
0b90: 73 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4f  se..*/.#ifndef O
0ba0: 53 5f 56 58 57 4f 52 4b 53 0a 23 20 20 69 66 20  S_VXWORKS.#  if 
0bb0: 64 65 66 69 6e 65 64 28 5f 5f 52 54 50 5f 5f 29  defined(__RTP__)
0bc0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 57 52 53   || defined(_WRS
0bd0: 5f 4b 45 52 4e 45 4c 29 0a 23 20 20 20 20 64 65  _KERNEL).#    de
0be0: 66 69 6e 65 20 4f 53 5f 56 58 57 4f 52 4b 53 20  fine OS_VXWORKS 
0bf0: 31 0a 23 20 20 65 6c 73 65 0a 23 20 20 20 20 64  1.#  else.#    d
0c00: 65 66 69 6e 65 20 4f 53 5f 56 58 57 4f 52 4b 53  efine OS_VXWORKS
0c10: 20 30 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64   0.#  endif.#end
0c20: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20  if../*.** These 
0c30: 23 64 65 66 69 6e 65 73 20 73 68 6f 75 6c 64 20  #defines should 
0c40: 65 6e 61 62 6c 65 20 3e 32 47 42 20 66 69 6c 65  enable >2GB file
0c50: 20 73 75 70 70 6f 72 74 20 6f 6e 20 50 6f 73 69   support on Posi
0c60: 78 20 69 66 20 74 68 65 0a 2a 2a 20 75 6e 64 65  x if the.** unde
0c70: 72 6c 79 69 6e 67 20 6f 70 65 72 61 74 69 6e 67  rlying operating
0c80: 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 73   system supports
0c90: 20 69 74 2e 20 20 49 66 20 74 68 65 20 4f 53 20   it.  If the OS 
0ca0: 6c 61 63 6b 73 0a 2a 2a 20 6c 61 72 67 65 20 66  lacks.** large f
0cb0: 69 6c 65 20 73 75 70 70 6f 72 74 2c 20 74 68 65  ile support, the
0cc0: 73 65 20 73 68 6f 75 6c 64 20 62 65 20 6e 6f 2d  se should be no-
0cd0: 6f 70 73 2e 0a 2a 2a 0a 2a 2a 20 4c 61 72 67 65  ops..**.** Large
0ce0: 20 66 69 6c 65 20 73 75 70 70 6f 72 74 20 63 61   file support ca
0cf0: 6e 20 62 65 20 64 69 73 61 62 6c 65 64 20 75 73  n be disabled us
0d00: 69 6e 67 20 74 68 65 20 2d 44 53 51 4c 49 54 45  ing the -DSQLITE
0d10: 5f 44 49 53 41 42 4c 45 5f 4c 46 53 20 73 77 69  _DISABLE_LFS swi
0d20: 74 63 68 0a 2a 2a 20 6f 6e 20 74 68 65 20 63 6f  tch.** on the co
0d30: 6d 70 69 6c 65 72 20 63 6f 6d 6d 61 6e 64 20 6c  mpiler command l
0d40: 69 6e 65 2e 20 20 54 68 69 73 20 69 73 20 6e 65  ine.  This is ne
0d50: 63 65 73 73 61 72 79 20 69 66 20 79 6f 75 20 61  cessary if you a
0d60: 72 65 20 63 6f 6d 70 69 6c 69 6e 67 0a 2a 2a 20  re compiling.** 
0d70: 6f 6e 20 61 20 72 65 63 65 6e 74 20 6d 61 63 68  on a recent mach
0d80: 69 6e 65 20 28 65 78 3a 20 52 65 64 48 61 74 20  ine (ex: RedHat 
0d90: 37 2e 32 29 20 62 75 74 20 79 6f 75 20 77 61 6e  7.2) but you wan
0da0: 74 20 79 6f 75 72 20 63 6f 64 65 20 74 6f 20 77  t your code to w
0db0: 6f 72 6b 0a 2a 2a 20 6f 6e 20 61 6e 20 6f 6c 64  ork.** on an old
0dc0: 65 72 20 6d 61 63 68 69 6e 65 20 28 65 78 3a 20  er machine (ex: 
0dd0: 52 65 64 48 61 74 20 36 2e 30 29 2e 20 20 49 66  RedHat 6.0).  If
0de0: 20 79 6f 75 20 63 6f 6d 70 69 6c 65 20 6f 6e 20   you compile on 
0df0: 52 65 64 48 61 74 20 37 2e 32 0a 2a 2a 20 77 69  RedHat 7.2.** wi
0e00: 74 68 6f 75 74 20 74 68 69 73 20 6f 70 74 69 6f  thout this optio
0e10: 6e 2c 20 4c 46 53 20 69 73 20 65 6e 61 62 6c 65  n, LFS is enable
0e20: 2e 20 20 42 75 74 20 4c 46 53 20 64 6f 65 73 20  .  But LFS does 
0e30: 6e 6f 74 20 65 78 69 73 74 20 69 6e 20 74 68 65  not exist in the
0e40: 20 6b 65 72 6e 65 6c 0a 2a 2a 20 69 6e 20 52 65   kernel.** in Re
0e50: 64 48 61 74 20 36 2e 30 2c 20 73 6f 20 74 68 65  dHat 6.0, so the
0e60: 20 63 6f 64 65 20 77 6f 6e 27 74 20 77 6f 72 6b   code won't work
0e70: 2e 20 20 48 65 6e 63 65 2c 20 66 6f 72 20 6d 61  .  Hence, for ma
0e80: 78 69 6d 75 6d 20 62 69 6e 61 72 79 0a 2a 2a 20  ximum binary.** 
0e90: 70 6f 72 74 61 62 69 6c 69 74 79 20 79 6f 75 20  portability you 
0ea0: 73 68 6f 75 6c 64 20 6f 6d 69 74 20 4c 46 53 2e  should omit LFS.
0eb0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 65 76 69  .**.** The previ
0ec0: 6f 75 73 20 70 61 72 61 67 72 61 70 68 20 77 61  ous paragraph wa
0ed0: 73 20 77 72 69 74 74 65 6e 20 69 6e 20 32 30 30  s written in 200
0ee0: 35 2e 20 20 28 54 68 69 73 20 70 61 72 61 67 72  5.  (This paragr
0ef0: 61 70 68 20 69 73 20 77 72 69 74 74 65 6e 0a 2a  aph is written.*
0f00: 2a 20 6f 6e 20 32 30 30 38 2d 31 31 2d 32 38 2e  * on 2008-11-28.
0f10: 29 20 54 68 65 73 65 20 64 61 79 73 2c 20 61 6c  ) These days, al
0f20: 6c 20 4c 69 6e 75 78 20 6b 65 72 6e 65 6c 73 20  l Linux kernels 
0f30: 73 75 70 70 6f 72 74 20 6c 61 72 67 65 20 66 69  support large fi
0f40: 6c 65 73 2c 20 73 6f 0a 2a 2a 20 79 6f 75 20 73  les, so.** you s
0f50: 68 6f 75 6c 64 20 70 72 6f 62 61 62 6c 79 20 6c  hould probably l
0f60: 65 61 76 65 20 4c 46 53 20 65 6e 61 62 6c 65 64  eave LFS enabled
0f70: 2e 20 20 42 75 74 20 73 6f 6d 65 20 65 6d 62 65  .  But some embe
0f80: 64 64 65 64 20 70 6c 61 74 66 6f 72 6d 73 20 6d  dded platforms m
0f90: 69 67 68 74 0a 2a 2a 20 6c 61 63 6b 20 4c 46 53  ight.** lack LFS
0fa0: 20 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 74   in which case t
0fb0: 68 65 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c  he SQLITE_DISABL
0fc0: 45 5f 4c 46 53 20 6d 61 63 72 6f 20 6d 69 67 68  E_LFS macro migh
0fd0: 74 20 73 74 69 6c 6c 20 62 65 20 75 73 65 66 75  t still be usefu
0fe0: 6c 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  l..*/.#ifndef SQ
0ff0: 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 4c 46 53  LITE_DISABLE_LFS
1000: 0a 23 20 64 65 66 69 6e 65 20 5f 4c 41 52 47 45  .# define _LARGE
1010: 5f 46 49 4c 45 20 20 20 20 20 20 20 31 0a 23 20  _FILE       1.# 
1020: 69 66 6e 64 65 66 20 5f 46 49 4c 45 5f 4f 46 46  ifndef _FILE_OFF
1030: 53 45 54 5f 42 49 54 53 0a 23 20 20 20 64 65 66  SET_BITS.#   def
1040: 69 6e 65 20 5f 46 49 4c 45 5f 4f 46 46 53 45 54  ine _FILE_OFFSET
1050: 5f 42 49 54 53 20 36 34 0a 23 20 65 6e 64 69 66  _BITS 64.# endif
1060: 0a 23 20 64 65 66 69 6e 65 20 5f 4c 41 52 47 45  .# define _LARGE
1070: 46 49 4c 45 5f 53 4f 55 52 43 45 20 31 0a 23 65  FILE_SOURCE 1.#e
1080: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 73 74 61 6e  ndif../*.** stan
1090: 64 61 72 64 20 69 6e 63 6c 75 64 65 20 66 69 6c  dard include fil
10a0: 65 73 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20  es..*/.#include 
10b0: 3c 73 79 73 2f 74 79 70 65 73 2e 68 3e 0a 23 69  <sys/types.h>.#i
10c0: 6e 63 6c 75 64 65 20 3c 73 79 73 2f 73 74 61 74  nclude <sys/stat
10d0: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 66 63  .h>.#include <fc
10e0: 6e 74 6c 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  ntl.h>.#include 
10f0: 3c 75 6e 69 73 74 64 2e 68 3e 0a 23 69 6e 63 6c  <unistd.h>.#incl
1100: 75 64 65 20 3c 74 69 6d 65 2e 68 3e 0a 23 69 6e  ude <time.h>.#in
1110: 63 6c 75 64 65 20 3c 73 79 73 2f 74 69 6d 65 2e  clude <sys/time.
1120: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 65 72 72  h>.#include <err
1130: 6e 6f 2e 68 3e 0a 0a 23 69 66 20 53 51 4c 49 54  no.h>..#if SQLIT
1140: 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
1150: 5f 53 54 59 4c 45 0a 23 20 69 6e 63 6c 75 64 65  _STYLE.# include
1160: 20 3c 73 79 73 2f 69 6f 63 74 6c 2e 68 3e 0a 23   <sys/ioctl.h>.#
1170: 20 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 23   if OS_VXWORKS.#
1180: 20 20 69 6e 63 6c 75 64 65 20 3c 73 65 6d 61 70    include <semap
1190: 68 6f 72 65 2e 68 3e 0a 23 20 20 69 6e 63 6c 75  hore.h>.#  inclu
11a0: 64 65 20 3c 6c 69 6d 69 74 73 2e 68 3e 0a 23 20  de <limits.h>.# 
11b0: 65 6c 73 65 0a 23 20 20 69 6e 63 6c 75 64 65 20  else.#  include 
11c0: 3c 73 79 73 2f 66 69 6c 65 2e 68 3e 0a 23 20 20  <sys/file.h>.#  
11d0: 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 70 61 72  include <sys/par
11e0: 61 6d 2e 68 3e 0a 23 20 20 69 6e 63 6c 75 64 65  am.h>.#  include
11f0: 20 3c 73 79 73 2f 6d 6f 75 6e 74 2e 68 3e 0a 23   <sys/mount.h>.#
1200: 20 65 6e 64 69 66 0a 23 65 6e 64 69 66 20 2f 2a   endif.#endif /*
1210: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
1220: 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a  OCKING_STYLE */.
1230: 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65 20 61 72 65  ./*.** If we are
1240: 20 74 6f 20 62 65 20 74 68 72 65 61 64 2d 73 61   to be thread-sa
1250: 66 65 2c 20 69 6e 63 6c 75 64 65 20 74 68 65 20  fe, include the 
1260: 70 74 68 72 65 61 64 73 20 68 65 61 64 65 72 20  pthreads header 
1270: 61 6e 64 20 64 65 66 69 6e 65 0a 2a 2a 20 74 68  and define.** th
1280: 65 20 53 51 4c 49 54 45 5f 55 4e 49 58 5f 54 48  e SQLITE_UNIX_TH
1290: 52 45 41 44 53 20 6d 61 63 72 6f 2e 0a 2a 2f 0a  READS macro..*/.
12a0: 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41  #if SQLITE_THREA
12b0: 44 53 41 46 45 0a 23 20 69 6e 63 6c 75 64 65 20  DSAFE.# include 
12c0: 3c 70 74 68 72 65 61 64 2e 68 3e 0a 23 20 64 65  <pthread.h>.# de
12d0: 66 69 6e 65 20 53 51 4c 49 54 45 5f 55 4e 49 58  fine SQLITE_UNIX
12e0: 5f 54 48 52 45 41 44 53 20 31 0a 23 65 6e 64 69  _THREADS 1.#endi
12f0: 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 61 75 6c 74  f../*.** Default
1300: 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 77 68 65   permissions whe
1310: 6e 20 63 72 65 61 74 69 6e 67 20 61 20 6e 65 77  n creating a new
1320: 20 66 69 6c 65 0a 2a 2f 0a 23 69 66 6e 64 65 66   file.*/.#ifndef
1330: 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
1340: 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53  FILE_PERMISSIONS
1350: 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45  .# define SQLITE
1360: 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45  _DEFAULT_FILE_PE
1370: 52 4d 49 53 53 49 4f 4e 53 20 30 36 34 34 0a 23  RMISSIONS 0644.#
1380: 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 2a 20 44 65  endif../*. ** De
1390: 66 61 75 6c 74 20 70 65 72 6d 69 73 73 69 6f 6e  fault permission
13a0: 73 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20  s when creating 
13b0: 61 75 74 6f 20 70 72 6f 78 79 20 64 69 72 0a 20  auto proxy dir. 
13c0: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
13d0: 45 5f 44 45 46 41 55 4c 54 5f 50 52 4f 58 59 44  E_DEFAULT_PROXYD
13e0: 49 52 5f 50 45 52 4d 49 53 53 49 4f 4e 53 0a 23  IR_PERMISSIONS.#
13f0: 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 44   define SQLITE_D
1400: 45 46 41 55 4c 54 5f 50 52 4f 58 59 44 49 52 5f  EFAULT_PROXYDIR_
1410: 50 45 52 4d 49 53 53 49 4f 4e 53 20 30 37 35 35  PERMISSIONS 0755
1420: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d  .#endif../*.** M
1430: 61 78 69 6d 75 6d 20 73 75 70 70 6f 72 74 65 64  aximum supported
1440: 20 70 61 74 68 2d 6c 65 6e 67 74 68 2e 0a 2a 2f   path-length..*/
1450: 0a 23 64 65 66 69 6e 65 20 4d 41 58 5f 50 41 54  .#define MAX_PAT
1460: 48 4e 41 4d 45 20 35 31 32 0a 0a 2f 2a 0a 2a 2a  HNAME 512../*.**
1470: 20 4f 6e 6c 79 20 73 65 74 20 74 68 65 20 6c 61   Only set the la
1480: 73 74 45 72 72 6e 6f 20 69 66 20 74 68 65 20 65  stErrno if the e
1490: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 61 20 72  rror code is a r
14a0: 65 61 6c 20 65 72 72 6f 72 20 61 6e 64 20 6e 6f  eal error and no
14b0: 74 20 0a 2a 2a 20 61 20 6e 6f 72 6d 61 6c 20 65  t .** a normal e
14c0: 78 70 65 63 74 65 64 20 72 65 74 75 72 6e 20 63  xpected return c
14d0: 6f 64 65 20 6f 66 20 53 51 4c 49 54 45 5f 42 55  ode of SQLITE_BU
14e0: 53 59 20 6f 72 20 53 51 4c 49 54 45 5f 4f 4b 0a  SY or SQLITE_OK.
14f0: 2a 2f 0a 23 64 65 66 69 6e 65 20 49 53 5f 4c 4f  */.#define IS_LO
1500: 43 4b 5f 45 52 52 4f 52 28 78 29 20 20 28 28 78  CK_ERROR(x)  ((x
1510: 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 29 20 26   != SQLITE_OK) &
1520: 26 20 28 78 20 21 3d 20 53 51 4c 49 54 45 5f 42  & (x != SQLITE_B
1530: 55 53 59 29 29 0a 0a 0a 2f 2a 0a 2a 2a 20 53 6f  USY)).../*.** So
1540: 6d 65 74 69 6d 65 73 2c 20 61 66 74 65 72 20 61  metimes, after a
1550: 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 69 73 20   file handle is 
1560: 63 6c 6f 73 65 64 20 62 79 20 53 51 4c 69 74 65  closed by SQLite
1570: 2c 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  , the file descr
1580: 69 70 74 6f 72 0a 2a 2a 20 63 61 6e 6e 6f 74 20  iptor.** cannot 
1590: 62 65 20 63 6c 6f 73 65 64 20 69 6d 6d 65 64 69  be closed immedi
15a0: 61 74 65 6c 79 2e 20 49 6e 20 74 68 65 73 65 20  ately. In these 
15b0: 63 61 73 65 73 2c 20 69 6e 73 74 61 6e 63 65 73  cases, instances
15c0: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
15d0: 67 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 61  g.** structure a
15e0: 72 65 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65  re used to store
15f0: 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
1600: 70 74 6f 72 20 77 68 69 6c 65 20 77 61 69 74 69  ptor while waiti
1610: 6e 67 20 66 6f 72 20 61 6e 0a 2a 2a 20 6f 70 70  ng for an.** opp
1620: 6f 72 74 75 6e 69 74 79 20 74 6f 20 65 69 74 68  ortunity to eith
1630: 65 72 20 63 6c 6f 73 65 20 6f 72 20 72 65 75 73  er close or reus
1640: 65 20 69 74 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  e it..*/.typedef
1650: 20 73 74 72 75 63 74 20 55 6e 69 78 55 6e 75 73   struct UnixUnus
1660: 65 64 46 64 20 55 6e 69 78 55 6e 75 73 65 64 46  edFd UnixUnusedF
1670: 64 3b 0a 73 74 72 75 63 74 20 55 6e 69 78 55 6e  d;.struct UnixUn
1680: 75 73 65 64 46 64 20 7b 0a 20 20 69 6e 74 20 66  usedFd {.  int f
1690: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
16a0: 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73       /* File des
16b0: 63 72 69 70 74 6f 72 20 74 6f 20 63 6c 6f 73 65  criptor to close
16c0: 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 3b   */.  int flags;
16d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16e0: 2f 2a 20 46 6c 61 67 73 20 74 68 69 73 20 66 69  /* Flags this fi
16f0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 77 61  le descriptor wa
1700: 73 20 6f 70 65 6e 65 64 20 77 69 74 68 20 2a 2f  s opened with */
1710: 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20  .  UnixUnusedFd 
1720: 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 2f 2a 20  *pNext;      /* 
1730: 4e 65 78 74 20 75 6e 75 73 65 64 20 66 69 6c 65  Next unused file
1740: 20 64 65 73 63 72 69 70 74 6f 72 20 6f 6e 20 73   descriptor on s
1750: 61 6d 65 20 66 69 6c 65 20 2a 2f 0a 7d 3b 0a 0a  ame file */.};..
1760: 2f 2a 0a 2a 2a 20 54 68 65 20 75 6e 69 78 46 69  /*.** The unixFi
1770: 6c 65 20 73 74 72 75 63 74 75 72 65 20 69 73 20  le structure is 
1780: 73 75 62 63 6c 61 73 73 20 6f 66 20 73 71 6c 69  subclass of sqli
1790: 74 65 33 5f 66 69 6c 65 20 73 70 65 63 69 66 69  te3_file specifi
17a0: 63 20 74 6f 20 74 68 65 20 75 6e 69 78 0a 2a 2a  c to the unix.**
17b0: 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74 61 74   VFS implementat
17c0: 69 6f 6e 73 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  ions..*/.typedef
17d0: 20 73 74 72 75 63 74 20 75 6e 69 78 46 69 6c 65   struct unixFile
17e0: 20 75 6e 69 78 46 69 6c 65 3b 0a 73 74 72 75 63   unixFile;.struc
17f0: 74 20 75 6e 69 78 46 69 6c 65 20 7b 0a 20 20 73  t unixFile {.  s
1800: 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
1810: 73 20 63 6f 6e 73 74 20 2a 70 4d 65 74 68 6f 64  s const *pMethod
1820: 3b 20 20 2f 2a 20 41 6c 77 61 79 73 20 74 68 65  ;  /* Always the
1830: 20 66 69 72 73 74 20 65 6e 74 72 79 20 2a 2f 0a   first entry */.
1840: 20 20 73 74 72 75 63 74 20 75 6e 69 78 4f 70 65    struct unixOpe
1850: 6e 43 6e 74 20 2a 70 4f 70 65 6e 3b 20 20 20 20  nCnt *pOpen;    
1860: 20 20 20 2f 2a 20 49 6e 66 6f 20 61 62 6f 75 74     /* Info about
1870: 20 61 6c 6c 20 6f 70 65 6e 20 66 64 27 73 20 6f   all open fd's o
1880: 6e 20 74 68 69 73 20 69 6e 6f 64 65 20 2a 2f 0a  n this inode */.
1890: 20 20 73 74 72 75 63 74 20 75 6e 69 78 4c 6f 63    struct unixLoc
18a0: 6b 49 6e 66 6f 20 2a 70 4c 6f 63 6b 3b 20 20 20  kInfo *pLock;   
18b0: 20 20 20 2f 2a 20 49 6e 66 6f 20 61 62 6f 75 74     /* Info about
18c0: 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 69 73 20 69   locks on this i
18d0: 6e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 68 3b  node */.  int h;
18e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1900: 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
1910: 72 20 2a 2f 0a 20 20 69 6e 74 20 64 69 72 66 64  r */.  int dirfd
1920: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1930: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20          /* File 
1940: 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20 74  descriptor for t
1950: 68 65 20 64 69 72 65 63 74 6f 72 79 20 2a 2f 0a  he directory */.
1960: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
1970: 6c 6f 63 6b 74 79 70 65 3b 20 20 20 20 20 20 20  locktype;       
1980: 20 20 20 2f 2a 20 54 68 65 20 74 79 70 65 20 6f     /* The type o
1990: 66 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74  f lock held on t
19a0: 68 69 73 20 66 64 20 2a 2f 0a 20 20 69 6e 74 20  his fd */.  int 
19b0: 6c 61 73 74 45 72 72 6e 6f 3b 20 20 20 20 20 20  lastErrno;      
19c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19d0: 54 68 65 20 75 6e 69 78 20 65 72 72 6e 6f 20 66  The unix errno f
19e0: 72 6f 6d 20 74 68 65 20 6c 61 73 74 20 49 2f 4f  rom the last I/O
19f0: 20 65 72 72 6f 72 20 2a 2f 0a 20 20 76 6f 69 64   error */.  void
1a00: 20 2a 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74   *lockingContext
1a10: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
1a20: 4c 6f 63 6b 69 6e 67 20 73 74 79 6c 65 20 73 70  Locking style sp
1a30: 65 63 69 66 69 63 20 73 74 61 74 65 20 2a 2f 0a  ecific state */.
1a40: 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a    UnixUnusedFd *
1a50: 70 55 6e 75 73 65 64 3b 20 20 20 20 20 20 20 20  pUnused;        
1a60: 20 20 20 2f 2a 20 50 72 65 2d 61 6c 6c 6f 63 61     /* Pre-alloca
1a70: 74 65 64 20 55 6e 69 78 55 6e 75 73 65 64 46 64  ted UnixUnusedFd
1a80: 20 2a 2f 0a 20 20 69 6e 74 20 66 69 6c 65 46 6c   */.  int fileFl
1a90: 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
1aa0: 20 20 20 20 20 20 20 2f 2a 20 4d 69 73 63 65 6c         /* Miscel
1ab0: 6c 61 6e 6f 75 73 20 66 6c 61 67 73 20 2a 2f 0a  lanous flags */.
1ac0: 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  #if SQLITE_ENABL
1ad0: 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
1ae0: 20 20 69 6e 74 20 6f 70 65 6e 46 6c 61 67 73 3b    int openFlags;
1af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b00: 20 20 20 2f 2a 20 54 68 65 20 66 6c 61 67 73 20     /* The flags 
1b10: 73 70 65 63 69 66 69 65 64 20 61 74 20 6f 70 65  specified at ope
1b20: 6e 28 29 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69  n() */.#endif.#i
1b30: 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53  f SQLITE_THREADS
1b40: 41 46 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f  AFE && defined(_
1b50: 5f 6c 69 6e 75 78 5f 5f 29 0a 20 20 70 74 68 72  _linux__).  pthr
1b60: 65 61 64 5f 74 20 74 69 64 3b 20 20 20 20 20 20  ead_t tid;      
1b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b80: 54 68 65 20 74 68 72 65 61 64 20 74 68 61 74 20  The thread that 
1b90: 22 6f 77 6e 73 22 20 74 68 69 73 20 75 6e 69 78  "owns" this unix
1ba0: 46 69 6c 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 23  File */.#endif.#
1bb0: 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  if OS_VXWORKS.  
1bc0: 69 6e 74 20 69 73 44 65 6c 65 74 65 3b 20 20 20  int isDelete;   
1bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1be0: 20 2f 2a 20 44 65 6c 65 74 65 20 6f 6e 20 63 6c   /* Delete on cl
1bf0: 6f 73 65 20 69 66 20 74 72 75 65 20 2a 2f 0a 20  ose if true */. 
1c00: 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46   struct vxworksF
1c10: 69 6c 65 49 64 20 2a 70 49 64 3b 20 20 20 20 20  ileId *pId;     
1c20: 20 20 2f 2a 20 55 6e 69 71 75 65 20 66 69 6c 65    /* Unique file
1c30: 20 49 44 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69   ID */.#endif.#i
1c40: 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 2f  fndef NDEBUG.  /
1c50: 2a 20 54 68 65 20 6e 65 78 74 20 67 72 6f 75 70  * The next group
1c60: 20 6f 66 20 76 61 72 69 61 62 6c 65 73 20 61 72   of variables ar
1c70: 65 20 75 73 65 64 20 74 6f 20 74 72 61 63 6b 20  e used to track 
1c80: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
1c90: 68 65 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  he.  ** transact
1ca0: 69 6f 6e 20 63 6f 75 6e 74 65 72 20 69 6e 20 62  ion counter in b
1cb0: 79 74 65 73 20 32 34 2d 32 37 20 6f 66 20 64 61  ytes 24-27 of da
1cc0: 74 61 62 61 73 65 20 66 69 6c 65 73 20 61 72 65  tabase files are
1cd0: 20 75 70 64 61 74 65 64 0a 20 20 2a 2a 20 77 68   updated.  ** wh
1ce0: 65 6e 65 76 65 72 20 61 6e 79 20 70 61 72 74 20  enever any part 
1cf0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1d00: 63 68 61 6e 67 65 73 2e 20 20 41 6e 20 61 73 73  changes.  An ass
1d10: 65 72 74 69 6f 6e 20 66 61 75 6c 74 20 77 69 6c  ertion fault wil
1d20: 6c 0a 20 20 2a 2a 20 6f 63 63 75 72 20 69 66 20  l.  ** occur if 
1d30: 61 20 66 69 6c 65 20 69 73 20 75 70 64 61 74 65  a file is update
1d40: 64 20 77 69 74 68 6f 75 74 20 61 6c 73 6f 20 75  d without also u
1d50: 70 64 61 74 69 6e 67 20 74 68 65 20 74 72 61 6e  pdating the tran
1d60: 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 63 6f 75  saction.  ** cou
1d70: 6e 74 65 72 2e 20 20 54 68 69 73 20 74 65 73 74  nter.  This test
1d80: 20 69 73 20 6d 61 64 65 20 74 6f 20 61 76 6f 69   is made to avoi
1d90: 64 20 6e 65 77 20 70 72 6f 62 6c 65 6d 73 20 73  d new problems s
1da0: 69 6d 69 6c 61 72 20 74 6f 20 74 68 65 0a 20 20  imilar to the.  
1db0: 2a 2a 20 6f 6e 65 20 64 65 73 63 72 69 62 65 64  ** one described
1dc0: 20 62 79 20 74 69 63 6b 65 74 20 23 33 35 38 34   by ticket #3584
1dd0: 2e 20 0a 20 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  . .  */.  unsign
1de0: 65 64 20 63 68 61 72 20 74 72 61 6e 73 43 6e 74  ed char transCnt
1df0: 72 43 68 6e 67 3b 20 20 20 2f 2a 20 54 72 75 65  rChng;   /* True
1e00: 20 69 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   if the transact
1e10: 69 6f 6e 20 63 6f 75 6e 74 65 72 20 63 68 61 6e  ion counter chan
1e20: 67 65 64 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ged */.  unsigne
1e30: 64 20 63 68 61 72 20 64 62 55 70 64 61 74 65 3b  d char dbUpdate;
1e40: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1e50: 69 66 20 61 6e 79 20 70 61 72 74 20 6f 66 20 64  if any part of d
1e60: 61 74 61 62 61 73 65 20 66 69 6c 65 20 63 68 61  atabase file cha
1e70: 6e 67 65 64 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  nged */.  unsign
1e80: 65 64 20 63 68 61 72 20 69 6e 4e 6f 72 6d 61 6c  ed char inNormal
1e90: 57 72 69 74 65 3b 20 20 20 2f 2a 20 54 72 75 65  Write;   /* True
1ea0: 20 69 66 20 69 6e 20 61 20 6e 6f 72 6d 61 6c 20   if in a normal 
1eb0: 77 72 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 20  write operation 
1ec0: 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  */.#endif.#ifdef
1ed0: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 2f   SQLITE_TEST.  /
1ee0: 2a 20 49 6e 20 74 65 73 74 20 6d 6f 64 65 2c 20  * In test mode, 
1ef0: 69 6e 63 72 65 61 73 65 20 74 68 65 20 73 69 7a  increase the siz
1f00: 65 20 6f 66 20 74 68 69 73 20 73 74 72 75 63 74  e of this struct
1f10: 75 72 65 20 61 20 62 69 74 20 73 6f 20 74 68 61  ure a bit so tha
1f20: 74 20 0a 20 20 2a 2a 20 69 74 20 69 73 20 6c 61  t .  ** it is la
1f30: 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 73 74  rger than the st
1f40: 72 75 63 74 20 43 72 61 73 68 46 69 6c 65 20 64  ruct CrashFile d
1f50: 65 66 69 6e 65 64 20 69 6e 20 74 65 73 74 36 2e  efined in test6.
1f60: 63 2e 0a 20 20 2a 2f 0a 20 20 63 68 61 72 20 61  c..  */.  char a
1f70: 50 61 64 64 69 6e 67 5b 33 32 5d 3b 0a 23 65 6e  Padding[32];.#en
1f80: 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68  dif.};../*.** Th
1f90: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72  e following macr
1fa0: 6f 73 20 64 65 66 69 6e 65 20 62 69 74 73 20 69  os define bits i
1fb0: 6e 20 75 6e 69 78 46 69 6c 65 2e 66 69 6c 65 46  n unixFile.fileF
1fc0: 6c 61 67 73 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  lags.*/.#define 
1fd0: 53 51 4c 49 54 45 5f 57 48 4f 4c 45 5f 46 49 4c  SQLITE_WHOLE_FIL
1fe0: 45 5f 4c 4f 43 4b 49 4e 47 20 20 30 78 30 30 30  E_LOCKING  0x000
1ff0: 31 20 20 20 2f 2a 20 55 73 65 20 77 68 6f 6c 65  1   /* Use whole
2000: 2d 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 2a 2f  -file locking */
2010: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 6c 75 64 65 20  ../*.** Include 
2020: 63 6f 64 65 20 74 68 61 74 20 69 73 20 63 6f 6d  code that is com
2030: 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6f 73 5f 2a 2e  mon to all os_*.
2040: 63 20 66 69 6c 65 73 0a 2a 2f 0a 23 69 6e 63 6c  c files.*/.#incl
2050: 75 64 65 20 22 6f 73 5f 63 6f 6d 6d 6f 6e 2e 68  ude "os_common.h
2060: 22 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65 20  "../*.** Define 
2070: 76 61 72 69 6f 75 73 20 6d 61 63 72 6f 73 20 74  various macros t
2080: 68 61 74 20 61 72 65 20 6d 69 73 73 69 6e 67 20  hat are missing 
2090: 66 72 6f 6d 20 73 6f 6d 65 20 73 79 73 74 65 6d  from some system
20a0: 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4f 5f  s..*/.#ifndef O_
20b0: 4c 41 52 47 45 46 49 4c 45 0a 23 20 64 65 66 69  LARGEFILE.# defi
20c0: 6e 65 20 4f 5f 4c 41 52 47 45 46 49 4c 45 20 30  ne O_LARGEFILE 0
20d0: 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53  .#endif.#ifdef S
20e0: 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 4c 46  QLITE_DISABLE_LF
20f0: 53 0a 23 20 75 6e 64 65 66 20 4f 5f 4c 41 52 47  S.# undef O_LARG
2100: 45 46 49 4c 45 0a 23 20 64 65 66 69 6e 65 20 4f  EFILE.# define O
2110: 5f 4c 41 52 47 45 46 49 4c 45 20 30 0a 23 65 6e  _LARGEFILE 0.#en
2120: 64 69 66 0a 23 69 66 6e 64 65 66 20 4f 5f 4e 4f  dif.#ifndef O_NO
2130: 46 4f 4c 4c 4f 57 0a 23 20 64 65 66 69 6e 65 20  FOLLOW.# define 
2140: 4f 5f 4e 4f 46 4f 4c 4c 4f 57 20 30 0a 23 65 6e  O_NOFOLLOW 0.#en
2150: 64 69 66 0a 23 69 66 6e 64 65 66 20 4f 5f 42 49  dif.#ifndef O_BI
2160: 4e 41 52 59 0a 23 20 64 65 66 69 6e 65 20 4f 5f  NARY.# define O_
2170: 42 49 4e 41 52 59 20 30 0a 23 65 6e 64 69 66 0a  BINARY 0.#endif.
2180: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 44 4a 47 50 50  ./*.** The DJGPP
2190: 20 63 6f 6d 70 69 6c 65 72 20 65 6e 76 69 72 6f   compiler enviro
21a0: 6e 6d 65 6e 74 20 6c 6f 6f 6b 73 20 6d 6f 73 74  nment looks most
21b0: 6c 79 20 6c 69 6b 65 20 55 6e 69 78 2c 20 62 75  ly like Unix, bu
21c0: 74 20 69 74 0a 2a 2a 20 6c 61 63 6b 73 20 74 68  t it.** lacks th
21d0: 65 20 66 63 6e 74 6c 28 29 20 73 79 73 74 65 6d  e fcntl() system
21e0: 20 63 61 6c 6c 2e 20 20 53 6f 20 72 65 64 65 66   call.  So redef
21f0: 69 6e 65 20 66 63 6e 74 6c 28 29 20 74 6f 20 62  ine fcntl() to b
2200: 65 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 74  e something.** t
2210: 68 61 74 20 61 6c 77 61 79 73 20 73 75 63 63 65  hat always succe
2220: 65 64 73 2e 20 20 54 68 69 73 20 6d 65 61 6e 73  eds.  This means
2230: 20 74 68 61 74 20 6c 6f 63 6b 69 6e 67 20 64 6f   that locking do
2240: 65 73 20 6e 6f 74 20 6f 63 63 75 72 20 75 6e 64  es not occur und
2250: 65 72 0a 2a 2a 20 44 4a 47 50 50 2e 20 20 42 75  er.** DJGPP.  Bu
2260: 74 20 69 74 20 69 73 20 44 4f 53 20 2d 20 77 68  t it is DOS - wh
2270: 61 74 20 64 69 64 20 79 6f 75 20 65 78 70 65 63  at did you expec
2280: 74 3f 0a 2a 2f 0a 23 69 66 64 65 66 20 5f 5f 44  t?.*/.#ifdef __D
2290: 4a 47 50 50 5f 5f 0a 23 20 64 65 66 69 6e 65 20  JGPP__.# define 
22a0: 66 63 6e 74 6c 28 41 2c 42 2c 43 29 20 30 0a 23  fcntl(A,B,C) 0.#
22b0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
22c0: 20 74 68 72 65 61 64 69 64 20 6d 61 63 72 6f 20   threadid macro 
22d0: 72 65 73 6f 6c 76 65 73 20 74 6f 20 74 68 65 20  resolves to the 
22e0: 74 68 72 65 61 64 2d 69 64 20 6f 72 20 74 6f 20  thread-id or to 
22f0: 30 2e 20 20 55 73 65 64 20 66 6f 72 0a 2a 2a 20  0.  Used for.** 
2300: 74 65 73 74 69 6e 67 20 61 6e 64 20 64 65 62 75  testing and debu
2310: 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23  gging only..*/.#
2320: 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44  if SQLITE_THREAD
2330: 53 41 46 45 0a 23 64 65 66 69 6e 65 20 74 68 72  SAFE.#define thr
2340: 65 61 64 69 64 20 70 74 68 72 65 61 64 5f 73 65  eadid pthread_se
2350: 6c 66 28 29 0a 23 65 6c 73 65 0a 23 64 65 66 69  lf().#else.#defi
2360: 6e 65 20 74 68 72 65 61 64 69 64 20 30 0a 23 65  ne threadid 0.#e
2370: 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 48 65 6c  ndif.../*.** Hel
2380: 70 65 72 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f  per functions to
2390: 20 6f 62 74 61 69 6e 20 61 6e 64 20 72 65 6c 69   obtain and reli
23a0: 6e 71 75 69 73 68 20 74 68 65 20 67 6c 6f 62 61  nquish the globa
23b0: 6c 20 6d 75 74 65 78 2e 20 54 68 65 0a 2a 2a 20  l mutex. The.** 
23c0: 67 6c 6f 62 61 6c 20 6d 75 74 65 78 20 69 73 20  global mutex is 
23d0: 75 73 65 64 20 74 6f 20 70 72 6f 74 65 63 74 20  used to protect 
23e0: 74 68 65 20 75 6e 69 78 4f 70 65 6e 43 6e 74 2c  the unixOpenCnt,
23f0: 20 75 6e 69 78 4c 6f 63 6b 49 6e 66 6f 20 61 6e   unixLockInfo an
2400: 64 0a 2a 2a 20 76 78 77 6f 72 6b 73 46 69 6c 65  d.** vxworksFile
2410: 49 64 20 6f 62 6a 65 63 74 73 20 75 73 65 64 20  Id objects used 
2420: 62 79 20 74 68 69 73 20 66 69 6c 65 2c 20 61 6c  by this file, al
2430: 6c 20 6f 66 20 77 68 69 63 68 20 6d 61 79 20 62  l of which may b
2440: 65 20 0a 2a 2a 20 73 68 61 72 65 64 20 62 79 20  e .** shared by 
2450: 6d 75 6c 74 69 70 6c 65 20 74 68 72 65 61 64 73  multiple threads
2460: 2e 0a 2a 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e  ..**.** Function
2470: 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29   unixMutexHeld()
2480: 20 69 73 20 75 73 65 64 20 74 6f 20 61 73 73 65   is used to asse
2490: 72 74 28 29 20 74 68 61 74 20 74 68 65 20 67 6c  rt() that the gl
24a0: 6f 62 61 6c 20 6d 75 74 65 78 20 0a 2a 2a 20 69  obal mutex .** i
24b0: 73 20 68 65 6c 64 20 77 68 65 6e 20 72 65 71 75  s held when requ
24c0: 69 72 65 64 2e 20 54 68 69 73 20 66 75 6e 63 74  ired. This funct
24d0: 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64  ion is only used
24e0: 20 61 73 20 70 61 72 74 20 6f 66 20 61 73 73 65   as part of asse
24f0: 72 74 28 29 20 0a 2a 2a 20 73 74 61 74 65 6d 65  rt() .** stateme
2500: 6e 74 73 2e 20 65 2e 67 2e 0a 2a 2a 0a 2a 2a 20  nts. e.g..**.** 
2510: 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
2520: 28 29 0a 2a 2a 20 20 20 20 20 61 73 73 65 72 74  ().**     assert
2530: 28 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28  ( unixMutexHeld(
2540: 29 20 29 3b 0a 2a 2a 20 20 20 75 6e 69 78 45 6e  ) );.**   unixEn
2550: 74 65 72 4c 65 61 76 65 28 29 0a 2a 2f 0a 73 74  terLeave().*/.st
2560: 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 45 6e  atic void unixEn
2570: 74 65 72 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a  terMutex(void){.
2580: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
2590: 65 6e 74 65 72 28 73 71 6c 69 74 65 33 4d 75 74  enter(sqlite3Mut
25a0: 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  exAlloc(SQLITE_M
25b0: 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54  UTEX_STATIC_MAST
25c0: 45 52 29 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76  ER));.}.static v
25d0: 6f 69 64 20 75 6e 69 78 4c 65 61 76 65 4d 75 74  oid unixLeaveMut
25e0: 65 78 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69  ex(void){.  sqli
25f0: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
2600: 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
2610: 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
2620: 54 41 54 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a  TATIC_MASTER));.
2630: 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
2640: 44 45 42 55 47 0a 73 74 61 74 69 63 20 69 6e 74  DEBUG.static int
2650: 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 76   unixMutexHeld(v
2660: 6f 69 64 29 20 7b 0a 20 20 72 65 74 75 72 6e 20  oid) {.  return 
2670: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
2680: 6c 64 28 73 71 6c 69 74 65 33 4d 75 74 65 78 41  ld(sqlite3MutexA
2690: 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
26a0: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29  X_STATIC_MASTER)
26b0: 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23 69  );.}.#endif...#i
26c0: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
26d0: 47 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66  G./*.** Helper f
26e0: 75 6e 63 74 69 6f 6e 20 66 6f 72 20 70 72 69 6e  unction for prin
26f0: 74 69 6e 67 20 6f 75 74 20 74 72 61 63 65 20 69  ting out trace i
2700: 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20  nformation from 
2710: 64 65 62 75 67 67 69 6e 67 0a 2a 2a 20 62 69 6e  debugging.** bin
2720: 61 72 69 65 73 2e 20 54 68 69 73 20 72 65 74 75  aries. This retu
2730: 72 6e 73 20 74 68 65 20 73 74 72 69 6e 67 20 72  rns the string r
2740: 65 70 72 65 73 65 74 61 74 69 6f 6e 20 6f 66 20  epresetation of 
2750: 74 68 65 20 73 75 70 70 6c 69 65 64 0a 2a 2a 20  the supplied.** 
2760: 69 6e 74 65 67 65 72 20 6c 6f 63 6b 2d 74 79 70  integer lock-typ
2770: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  e..*/.static con
2780: 73 74 20 63 68 61 72 20 2a 6c 6f 63 6b 74 79 70  st char *locktyp
2790: 65 4e 61 6d 65 28 69 6e 74 20 6c 6f 63 6b 74 79  eName(int lockty
27a0: 70 65 29 7b 0a 20 20 73 77 69 74 63 68 28 20 6c  pe){.  switch( l
27b0: 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 63  ocktype ){.    c
27c0: 61 73 65 20 4e 4f 5f 4c 4f 43 4b 3a 20 72 65 74  ase NO_LOCK: ret
27d0: 75 72 6e 20 22 4e 4f 4e 45 22 3b 0a 20 20 20 20  urn "NONE";.    
27e0: 63 61 73 65 20 53 48 41 52 45 44 5f 4c 4f 43 4b  case SHARED_LOCK
27f0: 3a 20 72 65 74 75 72 6e 20 22 53 48 41 52 45 44  : return "SHARED
2800: 22 3b 0a 20 20 20 20 63 61 73 65 20 52 45 53 45  ";.    case RESE
2810: 52 56 45 44 5f 4c 4f 43 4b 3a 20 72 65 74 75 72  RVED_LOCK: retur
2820: 6e 20 22 52 45 53 45 52 56 45 44 22 3b 0a 20 20  n "RESERVED";.  
2830: 20 20 63 61 73 65 20 50 45 4e 44 49 4e 47 5f 4c    case PENDING_L
2840: 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 50 45 4e  OCK: return "PEN
2850: 44 49 4e 47 22 3b 0a 20 20 20 20 63 61 73 65 20  DING";.    case 
2860: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3a 20  EXCLUSIVE_LOCK: 
2870: 72 65 74 75 72 6e 20 22 45 58 43 4c 55 53 49 56  return "EXCLUSIV
2880: 45 22 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  E";.  }.  return
2890: 20 22 45 52 52 4f 52 22 3b 0a 7d 0a 23 65 6e 64   "ERROR";.}.#end
28a0: 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  if..#ifdef SQLIT
28b0: 45 5f 4c 4f 43 4b 5f 54 52 41 43 45 0a 2f 2a 0a  E_LOCK_TRACE./*.
28c0: 2a 2a 20 50 72 69 6e 74 20 6f 75 74 20 69 6e 66  ** Print out inf
28d0: 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 61  ormation about a
28e0: 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6f 70 65 72 61  ll locking opera
28f0: 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  tions..**.** Thi
2900: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
2910: 64 20 66 6f 72 20 74 72 6f 75 62 6c 65 73 68 6f  d for troublesho
2920: 6f 74 69 6e 67 20 6c 6f 63 6b 73 20 6f 6e 20 6d  oting locks on m
2930: 75 6c 74 69 74 68 72 65 61 64 65 64 0a 2a 2a 20  ultithreaded.** 
2940: 70 6c 61 74 66 6f 72 6d 73 2e 20 20 45 6e 61 62  platforms.  Enab
2950: 6c 65 20 62 79 20 63 6f 6d 70 69 6c 69 6e 67 20  le by compiling 
2960: 77 69 74 68 20 74 68 65 20 2d 44 53 51 4c 49 54  with the -DSQLIT
2970: 45 5f 4c 4f 43 4b 5f 54 52 41 43 45 0a 2a 2a 20  E_LOCK_TRACE.** 
2980: 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 6f 70 74  command-line opt
2990: 69 6f 6e 20 6f 6e 20 74 68 65 20 63 6f 6d 70 69  ion on the compi
29a0: 6c 65 72 2e 20 20 54 68 69 73 20 63 6f 64 65 20  ler.  This code 
29b0: 69 73 20 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a 20 74  is normally.** t
29c0: 75 72 6e 65 64 20 6f 66 66 2e 0a 2a 2f 0a 73 74  urned off..*/.st
29d0: 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b 54 72 61  atic int lockTra
29e0: 63 65 28 69 6e 74 20 66 64 2c 20 69 6e 74 20 6f  ce(int fd, int o
29f0: 70 2c 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20  p, struct flock 
2a00: 2a 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4f 70  *p){.  char *zOp
2a10: 4e 61 6d 65 2c 20 2a 7a 54 79 70 65 3b 0a 20 20  Name, *zType;.  
2a20: 69 6e 74 20 73 3b 0a 20 20 69 6e 74 20 73 61 76  int s;.  int sav
2a30: 65 64 45 72 72 6e 6f 3b 0a 20 20 69 66 28 20 6f  edErrno;.  if( o
2a40: 70 3d 3d 46 5f 47 45 54 4c 4b 20 29 7b 0a 20 20  p==F_GETLK ){.  
2a50: 20 20 7a 4f 70 4e 61 6d 65 20 3d 20 22 47 45 54    zOpName = "GET
2a60: 4c 4b 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  LK";.  }else if(
2a70: 20 6f 70 3d 3d 46 5f 53 45 54 4c 4b 20 29 7b 0a   op==F_SETLK ){.
2a80: 20 20 20 20 7a 4f 70 4e 61 6d 65 20 3d 20 22 53      zOpName = "S
2a90: 45 54 4c 4b 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ETLK";.  }else{.
2aa0: 20 20 20 20 73 20 3d 20 66 63 6e 74 6c 28 66 64      s = fcntl(fd
2ab0: 2c 20 6f 70 2c 20 70 29 3b 0a 20 20 20 20 73 71  , op, p);.    sq
2ac0: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
2ad0: 28 22 66 63 6e 74 6c 20 75 6e 6b 6e 6f 77 6e 20  ("fcntl unknown 
2ae0: 25 64 20 25 64 20 25 64 5c 6e 22 2c 20 66 64 2c  %d %d %d\n", fd,
2af0: 20 6f 70 2c 20 73 29 3b 0a 20 20 20 20 72 65 74   op, s);.    ret
2b00: 75 72 6e 20 73 3b 0a 20 20 7d 0a 20 20 69 66 28  urn s;.  }.  if(
2b10: 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44   p->l_type==F_RD
2b20: 4c 43 4b 20 29 7b 0a 20 20 20 20 7a 54 79 70 65  LCK ){.    zType
2b30: 20 3d 20 22 52 44 4c 43 4b 22 3b 0a 20 20 7d 65   = "RDLCK";.  }e
2b40: 6c 73 65 20 69 66 28 20 70 2d 3e 6c 5f 74 79 70  lse if( p->l_typ
2b50: 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 7b 0a 20 20  e==F_WRLCK ){.  
2b60: 20 20 7a 54 79 70 65 20 3d 20 22 57 52 4c 43 4b    zType = "WRLCK
2b70: 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  ";.  }else if( p
2b80: 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 55 4e 4c 43  ->l_type==F_UNLC
2b90: 4b 20 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d  K ){.    zType =
2ba0: 20 22 55 4e 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73   "UNLCK";.  }els
2bb0: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 30  e{.    assert( 0
2bc0: 20 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   );.  }.  assert
2bd0: 28 20 70 2d 3e 6c 5f 77 68 65 6e 63 65 3d 3d 53  ( p->l_whence==S
2be0: 45 45 4b 5f 53 45 54 20 29 3b 0a 20 20 73 20 3d  EEK_SET );.  s =
2bf0: 20 66 63 6e 74 6c 28 66 64 2c 20 6f 70 2c 20 70   fcntl(fd, op, p
2c00: 29 3b 0a 20 20 73 61 76 65 64 45 72 72 6e 6f 20  );.  savedErrno 
2c10: 3d 20 65 72 72 6e 6f 3b 0a 20 20 73 71 6c 69 74  = errno;.  sqlit
2c20: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 66  e3DebugPrintf("f
2c30: 63 6e 74 6c 20 25 64 20 25 64 20 25 73 20 25 73  cntl %d %d %s %s
2c40: 20 25 64 20 25 64 20 25 64 20 25 64 5c 6e 22 2c   %d %d %d %d\n",
2c50: 0a 20 20 20 20 20 74 68 72 65 61 64 69 64 2c 20  .     threadid, 
2c60: 66 64 2c 20 7a 4f 70 4e 61 6d 65 2c 20 7a 54 79  fd, zOpName, zTy
2c70: 70 65 2c 20 28 69 6e 74 29 70 2d 3e 6c 5f 73 74  pe, (int)p->l_st
2c80: 61 72 74 2c 20 28 69 6e 74 29 70 2d 3e 6c 5f 6c  art, (int)p->l_l
2c90: 65 6e 2c 0a 20 20 20 20 20 28 69 6e 74 29 70 2d  en,.     (int)p-
2ca0: 3e 6c 5f 70 69 64 2c 20 73 29 3b 0a 20 20 69 66  >l_pid, s);.  if
2cb0: 28 20 73 3d 3d 28 2d 31 29 20 26 26 20 6f 70 3d  ( s==(-1) && op=
2cc0: 3d 46 5f 53 45 54 4c 4b 20 26 26 20 28 70 2d 3e  =F_SETLK && (p->
2cd0: 6c 5f 74 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20  l_type==F_RDLCK 
2ce0: 7c 7c 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f  || p->l_type==F_
2cf0: 57 52 4c 43 4b 29 20 29 7b 0a 20 20 20 20 73 74  WRLCK) ){.    st
2d00: 72 75 63 74 20 66 6c 6f 63 6b 20 6c 32 3b 0a 20  ruct flock l2;. 
2d10: 20 20 20 6c 32 20 3d 20 2a 70 3b 0a 20 20 20 20     l2 = *p;.    
2d20: 66 63 6e 74 6c 28 66 64 2c 20 46 5f 47 45 54 4c  fcntl(fd, F_GETL
2d30: 4b 2c 20 26 6c 32 29 3b 0a 20 20 20 20 69 66 28  K, &l2);.    if(
2d40: 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44   l2.l_type==F_RD
2d50: 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 7a 54 79  LCK ){.      zTy
2d60: 70 65 20 3d 20 22 52 44 4c 43 4b 22 3b 0a 20 20  pe = "RDLCK";.  
2d70: 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 32 2e 6c    }else if( l2.l
2d80: 5f 74 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29  _type==F_WRLCK )
2d90: 7b 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20  {.      zType = 
2da0: 22 57 52 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c  "WRLCK";.    }el
2db0: 73 65 20 69 66 28 20 6c 32 2e 6c 5f 74 79 70 65  se if( l2.l_type
2dc0: 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20  ==F_UNLCK ){.   
2dd0: 20 20 20 7a 54 79 70 65 20 3d 20 22 55 4e 4c 43     zType = "UNLC
2de0: 4b 22 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  K";.    }else{. 
2df0: 20 20 20 20 20 61 73 73 65 72 74 28 20 30 20 29       assert( 0 )
2e00: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
2e10: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
2e20: 66 63 6e 74 6c 2d 66 61 69 6c 75 72 65 2d 72 65  fcntl-failure-re
2e30: 61 73 6f 6e 3a 20 25 73 20 25 64 20 25 64 20 25  ason: %s %d %d %
2e40: 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 7a 54 79  d\n",.       zTy
2e50: 70 65 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f 73 74  pe, (int)l2.l_st
2e60: 61 72 74 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f 6c  art, (int)l2.l_l
2e70: 65 6e 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f 70 69  en, (int)l2.l_pi
2e80: 64 29 3b 0a 20 20 7d 0a 20 20 65 72 72 6e 6f 20  d);.  }.  errno 
2e90: 3d 20 73 61 76 65 64 45 72 72 6e 6f 3b 0a 20 20  = savedErrno;.  
2ea0: 72 65 74 75 72 6e 20 73 3b 0a 7d 0a 23 64 65 66  return s;.}.#def
2eb0: 69 6e 65 20 66 63 6e 74 6c 20 6c 6f 63 6b 54 72  ine fcntl lockTr
2ec0: 61 63 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ace.#endif /* SQ
2ed0: 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52 41 43 45 20  LITE_LOCK_TRACE 
2ee0: 2a 2f 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  */..../*.** This
2ef0: 20 72 6f 75 74 69 6e 65 20 74 72 61 6e 73 6c 61   routine transla
2f00: 74 65 73 20 61 20 73 74 61 6e 64 61 72 64 20 50  tes a standard P
2f10: 4f 53 49 58 20 65 72 72 6e 6f 20 63 6f 64 65 20  OSIX errno code 
2f20: 69 6e 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a  into something.*
2f30: 2a 20 75 73 65 66 75 6c 20 74 6f 20 74 68 65 20  * useful to the 
2f40: 63 6c 69 65 6e 74 73 20 6f 66 20 74 68 65 20 73  clients of the s
2f50: 71 6c 69 74 65 33 20 66 75 6e 63 74 69 6f 6e 73  qlite3 functions
2f60: 2e 20 20 53 70 65 63 69 66 69 63 61 6c 6c 79 2c  .  Specifically,
2f70: 20 69 74 20 69 73 0a 2a 2a 20 69 6e 74 65 6e 64   it is.** intend
2f80: 65 64 20 74 6f 20 74 72 61 6e 73 6c 61 74 65 20  ed to translate 
2f90: 61 20 76 61 72 69 65 74 79 20 6f 66 20 22 74 72  a variety of "tr
2fa0: 79 20 61 67 61 69 6e 22 20 65 72 72 6f 72 73 20  y again" errors 
2fb0: 69 6e 74 6f 20 53 51 4c 49 54 45 5f 42 55 53 59  into SQLITE_BUSY
2fc0: 0a 2a 2a 20 61 6e 64 20 61 20 76 61 72 69 65 74  .** and a variet
2fd0: 79 20 6f 66 20 22 70 6c 65 61 73 65 20 63 6c 6f  y of "please clo
2fe0: 73 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  se the file desc
2ff0: 72 69 70 74 6f 72 20 4e 4f 57 22 20 65 72 72 6f  riptor NOW" erro
3000: 72 73 20 69 6e 74 6f 20 0a 2a 2a 20 53 51 4c 49  rs into .** SQLI
3010: 54 45 5f 49 4f 45 52 52 0a 2a 2a 20 0a 2a 2a 20  TE_IOERR.** .** 
3020: 45 72 72 6f 72 73 20 64 75 72 69 6e 67 20 69 6e  Errors during in
3030: 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20  itialization of 
3040: 6c 6f 63 6b 73 2c 20 6f 72 20 66 69 6c 65 20 73  locks, or file s
3050: 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20 66 6f  ystem support fo
3060: 72 20 6c 6f 63 6b 73 2c 0a 2a 2a 20 73 68 6f 75  r locks,.** shou
3070: 6c 64 20 68 61 6e 64 6c 65 20 45 4e 4f 4c 43 4b  ld handle ENOLCK
3080: 2c 20 45 4e 4f 54 53 55 50 2c 20 45 4f 50 4e 4f  , ENOTSUP, EOPNO
3090: 54 53 55 50 50 20 73 65 70 61 72 61 74 65 6c 79  TSUPP separately
30a0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
30b0: 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
30c0: 6f 73 69 78 45 72 72 6f 72 28 69 6e 74 20 70 6f  osixError(int po
30d0: 73 69 78 45 72 72 6f 72 2c 20 69 6e 74 20 73 71  sixError, int sq
30e0: 6c 69 74 65 49 4f 45 72 72 29 20 7b 0a 20 20 73  liteIOErr) {.  s
30f0: 77 69 74 63 68 20 28 70 6f 73 69 78 45 72 72 6f  witch (posixErro
3100: 72 29 20 7b 0a 20 20 63 61 73 65 20 30 3a 20 0a  r) {.  case 0: .
3110: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
3120: 45 5f 4f 4b 3b 0a 20 20 20 20 0a 20 20 63 61 73  E_OK;.    .  cas
3130: 65 20 45 41 47 41 49 4e 3a 0a 20 20 63 61 73 65  e EAGAIN:.  case
3140: 20 45 54 49 4d 45 44 4f 55 54 3a 0a 20 20 63 61   ETIMEDOUT:.  ca
3150: 73 65 20 45 42 55 53 59 3a 0a 20 20 63 61 73 65  se EBUSY:.  case
3160: 20 45 49 4e 54 52 3a 0a 20 20 63 61 73 65 20 45   EINTR:.  case E
3170: 4e 4f 4c 43 4b 3a 20 20 0a 20 20 20 20 2f 2a 20  NOLCK:  .    /* 
3180: 72 61 6e 64 6f 6d 20 4e 46 53 20 72 65 74 72 79  random NFS retry
3190: 20 65 72 72 6f 72 2c 20 75 6e 6c 65 73 73 20 64   error, unless d
31a0: 75 72 69 6e 67 20 66 69 6c 65 20 73 79 73 74 65  uring file syste
31b0: 6d 20 73 75 70 70 6f 72 74 20 0a 20 20 20 20 20  m support .     
31c0: 2a 20 69 6e 74 72 6f 73 70 65 63 74 69 6f 6e 2c  * introspection,
31d0: 20 69 6e 20 77 68 69 63 68 20 69 74 20 61 63 74   in which it act
31e0: 75 61 6c 6c 79 20 6d 65 61 6e 73 20 77 68 61 74  ually means what
31f0: 20 69 74 20 73 61 79 73 20 2a 2f 0a 20 20 20 20   it says */.    
3200: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
3210: 53 59 3b 0a 20 20 20 20 0a 20 20 63 61 73 65 20  SY;.    .  case 
3220: 45 41 43 43 45 53 3a 20 0a 20 20 20 20 2f 2a 20  EACCES: .    /* 
3230: 45 41 43 43 45 53 20 69 73 20 6c 69 6b 65 20 45  EACCES is like E
3240: 41 47 41 49 4e 20 64 75 72 69 6e 67 20 6c 6f 63  AGAIN during loc
3250: 6b 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73 2c  king operations,
3260: 20 62 75 74 20 6e 6f 74 20 61 6e 79 20 6f 74 68   but not any oth
3270: 65 72 20 74 69 6d 65 2a 2f 0a 20 20 20 20 69 66  er time*/.    if
3280: 28 20 28 73 71 6c 69 74 65 49 4f 45 72 72 20 3d  ( (sqliteIOErr =
3290: 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c  = SQLITE_IOERR_L
32a0: 4f 43 4b 29 20 7c 7c 20 0a 09 28 73 71 6c 69 74  OCK) || ..(sqlit
32b0: 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49 54 45  eIOErr == SQLITE
32c0: 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 20 7c  _IOERR_UNLOCK) |
32d0: 7c 20 0a 09 28 73 71 6c 69 74 65 49 4f 45 72 72  | ..(sqliteIOErr
32e0: 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52   == SQLITE_IOERR
32f0: 5f 52 44 4c 4f 43 4b 29 20 7c 7c 0a 09 28 73 71  _RDLOCK) ||..(sq
3300: 6c 69 74 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c  liteIOErr == SQL
3310: 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52  ITE_IOERR_CHECKR
3320: 45 53 45 52 56 45 44 4c 4f 43 4b 29 20 29 7b 0a  ESERVEDLOCK) ){.
3330: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
3340: 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a  ITE_BUSY;.    }.
3350: 20 20 20 20 2f 2a 20 65 6c 73 65 20 66 61 6c 6c      /* else fall
3360: 20 74 68 72 6f 75 67 68 20 2a 2f 0a 20 20 63 61   through */.  ca
3370: 73 65 20 45 50 45 52 4d 3a 20 0a 20 20 20 20 72  se EPERM: .    r
3380: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52  eturn SQLITE_PER
3390: 4d 3b 0a 20 20 20 20 0a 20 20 63 61 73 65 20 45  M;.    .  case E
33a0: 44 45 41 44 4c 4b 3a 0a 20 20 20 20 72 65 74 75  DEADLK:.    retu
33b0: 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
33c0: 42 4c 4f 43 4b 45 44 3b 0a 20 20 20 20 0a 23 69  BLOCKED;.    .#i
33d0: 66 20 45 4f 50 4e 4f 54 53 55 50 50 21 3d 45 4e  f EOPNOTSUPP!=EN
33e0: 4f 54 53 55 50 0a 20 20 63 61 73 65 20 45 4f 50  OTSUP.  case EOP
33f0: 4e 4f 54 53 55 50 50 3a 20 0a 20 20 20 20 2f 2a  NOTSUPP: .    /*
3400: 20 73 6f 6d 65 74 68 69 6e 67 20 77 65 6e 74 20   something went 
3410: 74 65 72 72 69 62 6c 79 20 61 77 72 79 2c 20 75  terribly awry, u
3420: 6e 6c 65 73 73 20 64 75 72 69 6e 67 20 66 69 6c  nless during fil
3430: 65 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74  e system support
3440: 20 0a 20 20 20 20 20 2a 20 69 6e 74 72 6f 73 70   .     * introsp
3450: 65 63 74 69 6f 6e 2c 20 69 6e 20 77 68 69 63 68  ection, in which
3460: 20 69 74 20 61 63 74 75 61 6c 6c 79 20 6d 65 61   it actually mea
3470: 6e 73 20 77 68 61 74 20 69 74 20 73 61 79 73 20  ns what it says 
3480: 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  */.#endif.#ifdef
3490: 20 45 4e 4f 54 53 55 50 0a 20 20 63 61 73 65 20   ENOTSUP.  case 
34a0: 45 4e 4f 54 53 55 50 3a 20 0a 20 20 20 20 2f 2a  ENOTSUP: .    /*
34b0: 20 69 6e 76 61 6c 69 64 20 66 64 2c 20 75 6e 6c   invalid fd, unl
34c0: 65 73 73 20 64 75 72 69 6e 67 20 66 69 6c 65 20  ess during file 
34d0: 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20 69  system support i
34e0: 6e 74 72 6f 73 70 65 63 74 69 6f 6e 2c 20 69 6e  ntrospection, in
34f0: 20 77 68 69 63 68 20 0a 20 20 20 20 20 2a 20 69   which .     * i
3500: 74 20 61 63 74 75 61 6c 6c 79 20 6d 65 61 6e 73  t actually means
3510: 20 77 68 61 74 20 69 74 20 73 61 79 73 20 2a 2f   what it says */
3520: 0a 23 65 6e 64 69 66 0a 20 20 63 61 73 65 20 45  .#endif.  case E
3530: 49 4f 3a 0a 20 20 63 61 73 65 20 45 42 41 44 46  IO:.  case EBADF
3540: 3a 0a 20 20 63 61 73 65 20 45 49 4e 56 41 4c 3a  :.  case EINVAL:
3550: 0a 20 20 63 61 73 65 20 45 4e 4f 54 43 4f 4e 4e  .  case ENOTCONN
3560: 3a 0a 20 20 63 61 73 65 20 45 4e 4f 44 45 56 3a  :.  case ENODEV:
3570: 0a 20 20 63 61 73 65 20 45 4e 58 49 4f 3a 0a 20  .  case ENXIO:. 
3580: 20 63 61 73 65 20 45 4e 4f 45 4e 54 3a 0a 20 20   case ENOENT:.  
3590: 63 61 73 65 20 45 53 54 41 4c 45 3a 0a 20 20 63  case ESTALE:.  c
35a0: 61 73 65 20 45 4e 4f 53 59 53 3a 0a 20 20 20 20  ase ENOSYS:.    
35b0: 2f 2a 20 74 68 65 73 65 20 73 68 6f 75 6c 64 20  /* these should 
35c0: 66 6f 72 63 65 20 74 68 65 20 63 6c 69 65 6e 74  force the client
35d0: 20 74 6f 20 63 6c 6f 73 65 20 74 68 65 20 66 69   to close the fi
35e0: 6c 65 20 61 6e 64 20 72 65 63 6f 6e 6e 65 63 74  le and reconnect
35f0: 20 2a 2f 0a 20 20 20 20 0a 20 20 64 65 66 61 75   */.    .  defau
3600: 6c 74 3a 20 0a 20 20 20 20 72 65 74 75 72 6e 20  lt: .    return 
3610: 73 71 6c 69 74 65 49 4f 45 72 72 3b 0a 20 20 7d  sqliteIOErr;.  }
3620: 0a 7d 0a 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  .}..../*********
3630: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3640: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3650: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3660: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3670: 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
3680: 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 55  ******** Begin U
3690: 6e 69 71 75 65 20 46 69 6c 65 20 49 44 20 55 74  nique File ID Ut
36a0: 69 6c 69 74 79 20 55 73 65 64 20 42 79 20 56 78  ility Used By Vx
36b0: 57 6f 72 6b 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  Works **********
36c0: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4f 6e 20 6d  *****.**.** On m
36d0: 6f 73 74 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  ost versions of 
36e0: 75 6e 69 78 2c 20 77 65 20 63 61 6e 20 67 65 74  unix, we can get
36f0: 20 61 20 75 6e 69 71 75 65 20 49 44 20 66 6f 72   a unique ID for
3700: 20 61 20 66 69 6c 65 20 62 79 20 63 6f 6e 63 61   a file by conca
3710: 74 65 6e 61 74 69 6e 67 0a 2a 2a 20 74 68 65 20  tenating.** the 
3720: 64 65 76 69 63 65 20 6e 75 6d 62 65 72 20 61 6e  device number an
3730: 64 20 74 68 65 20 69 6e 6f 64 65 20 6e 75 6d 62  d the inode numb
3740: 65 72 2e 20 20 42 75 74 20 74 68 69 73 20 64 6f  er.  But this do
3750: 65 73 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 56  es not work on V
3760: 78 57 6f 72 6b 73 2e 0a 2a 2a 20 4f 6e 20 56 78  xWorks..** On Vx
3770: 57 6f 72 6b 73 2c 20 61 20 75 6e 69 71 75 65 20  Works, a unique 
3780: 66 69 6c 65 20 69 64 20 6d 75 73 74 20 62 65 20  file id must be 
3790: 62 61 73 65 64 20 6f 6e 20 74 68 65 20 63 61 6e  based on the can
37a0: 6f 6e 69 63 61 6c 20 66 69 6c 65 6e 61 6d 65 2e  onical filename.
37b0: 0a 2a 2a 0a 2a 2a 20 41 20 70 6f 69 6e 74 65 72  .**.** A pointer
37c0: 20 74 6f 20 61 6e 20 69 6e 73 74 61 6e 63 65 20   to an instance 
37d0: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
37e0: 20 73 74 72 75 63 74 75 72 65 20 63 61 6e 20 62   structure can b
37f0: 65 20 75 73 65 64 20 61 73 20 61 0a 2a 2a 20 75  e used as a.** u
3800: 6e 69 71 75 65 20 66 69 6c 65 20 49 44 20 69 6e  nique file ID in
3810: 20 56 78 57 6f 72 6b 73 2e 20 20 45 61 63 68 20   VxWorks.  Each 
3820: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73  instance of this
3830: 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61   structure conta
3840: 69 6e 73 0a 2a 2a 20 61 20 63 6f 70 79 20 6f 66  ins.** a copy of
3850: 20 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c 20 66   the canonical f
3860: 69 6c 65 6e 61 6d 65 2e 20 20 54 68 65 72 65 20  ilename.  There 
3870: 69 73 20 61 6c 73 6f 20 61 20 72 65 66 65 72 65  is also a refere
3880: 6e 63 65 20 63 6f 75 6e 74 2e 20 20 0a 2a 2a 20  nce count.  .** 
3890: 54 68 65 20 73 74 72 75 63 74 75 72 65 20 69 73  The structure is
38a0: 20 72 65 63 6c 61 69 6d 65 64 20 77 68 65 6e 20   reclaimed when 
38b0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 6f  the number of po
38c0: 69 6e 74 65 72 73 20 74 6f 20 69 74 20 64 72 6f  inters to it dro
38d0: 70 73 20 74 6f 0a 2a 2a 20 7a 65 72 6f 2e 0a 2a  ps to.** zero..*
38e0: 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20 6e  *.** There are n
38f0: 65 76 65 72 20 76 65 72 79 20 6d 61 6e 79 20 66  ever very many f
3900: 69 6c 65 73 20 6f 70 65 6e 20 61 74 20 6f 6e 65  iles open at one
3910: 20 74 69 6d 65 20 61 6e 64 20 6c 6f 6f 6b 75 70   time and lookup
3920: 73 20 61 72 65 20 6e 6f 74 0a 2a 2a 20 61 20 70  s are not.** a p
3930: 65 72 66 6f 72 6d 61 6e 63 65 2d 63 72 69 74 69  erformance-criti
3940: 63 61 6c 20 70 61 74 68 2c 20 73 6f 20 69 74 20  cal path, so it 
3950: 69 73 20 73 75 66 66 69 63 69 65 6e 74 20 74 6f  is sufficient to
3960: 20 70 75 74 20 74 68 65 73 65 0a 2a 2a 20 73 74   put these.** st
3970: 72 75 63 74 75 72 65 73 20 6f 6e 20 61 20 6c 69  ructures on a li
3980: 6e 6b 65 64 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74  nked list..*/.st
3990: 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65  ruct vxworksFile
39a0: 49 64 20 7b 0a 20 20 73 74 72 75 63 74 20 76 78  Id {.  struct vx
39b0: 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 4e 65  worksFileId *pNe
39c0: 78 74 3b 20 20 2f 2a 20 4e 65 78 74 20 69 6e 20  xt;  /* Next in 
39d0: 61 20 6c 69 73 74 20 6f 66 20 74 68 65 6d 20 61  a list of them a
39e0: 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66  ll */.  int nRef
39f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3a00: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
3a10: 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  of references to
3a20: 20 74 68 69 73 20 6f 6e 65 20 2a 2f 0a 20 20 69   this one */.  i
3a30: 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20  nt nName;       
3a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3a50: 4c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 7a 43  Length of the zC
3a60: 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 5b 5d 20 73  anonicalName[] s
3a70: 74 72 69 6e 67 20 2a 2f 0a 20 20 63 68 61 72 20  tring */.  char 
3a80: 2a 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 3b  *zCanonicalName;
3a90: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61 6e 6f           /* Cano
3aa0: 6e 69 63 61 6c 20 66 69 6c 65 6e 61 6d 65 20 2a  nical filename *
3ab0: 2f 0a 7d 3b 0a 0a 23 69 66 20 4f 53 5f 56 58 57  /.};..#if OS_VXW
3ac0: 4f 52 4b 53 0a 2f 2a 20 0a 2a 2a 20 41 6c 6c 20  ORKS./* .** All 
3ad0: 75 6e 69 71 75 65 20 66 69 6c 65 6e 61 6d 65 73  unique filenames
3ae0: 20 61 72 65 20 68 65 6c 64 20 6f 6e 20 61 20 6c   are held on a l
3af0: 69 6e 6b 65 64 20 6c 69 73 74 20 68 65 61 64 65  inked list heade
3b00: 64 20 62 79 20 74 68 69 73 0a 2a 2a 20 76 61 72  d by this.** var
3b10: 69 61 62 6c 65 3a 0a 2a 2f 0a 73 74 61 74 69 63  iable:.*/.static
3b20: 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46   struct vxworksF
3b30: 69 6c 65 49 64 20 2a 76 78 77 6f 72 6b 73 46 69  ileId *vxworksFi
3b40: 6c 65 4c 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a 0a  leList = 0;../*.
3b50: 2a 2a 20 53 69 6d 70 6c 69 66 79 20 61 20 66 69  ** Simplify a fi
3b60: 6c 65 6e 61 6d 65 20 69 6e 74 6f 20 69 74 73 20  lename into its 
3b70: 63 61 6e 6f 6e 69 63 61 6c 20 66 6f 72 6d 0a 2a  canonical form.*
3b80: 2a 20 62 79 20 6d 61 6b 69 6e 67 20 74 68 65 20  * by making the 
3b90: 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 6e 67 65  following change
3ba0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 2a 20 72 65 6d 6f  s:.**.**  * remo
3bb0: 76 69 6e 67 20 61 6e 79 20 74 72 61 69 6c 69 6e  ving any trailin
3bc0: 67 20 61 6e 64 20 64 75 70 6c 69 63 61 74 65 20  g and duplicate 
3bd0: 2f 0a 2a 2a 20 20 2a 20 63 6f 6e 76 65 72 74 20  /.**  * convert 
3be0: 2f 2e 2f 20 69 6e 74 6f 20 6a 75 73 74 20 2f 0a  /./ into just /.
3bf0: 2a 2a 20 20 2a 20 63 6f 6e 76 65 72 74 20 2f 41  **  * convert /A
3c00: 2f 2e 2e 2f 20 77 68 65 72 65 20 41 20 69 73 20  /../ where A is 
3c10: 61 6e 79 20 73 69 6d 70 6c 65 20 6e 61 6d 65 20  any simple name 
3c20: 69 6e 74 6f 20 6a 75 73 74 20 2f 0a 2a 2a 0a 2a  into just /.**.*
3c30: 2a 20 43 68 61 6e 67 65 73 20 61 72 65 20 6d 61  * Changes are ma
3c40: 64 65 20 69 6e 2d 70 6c 61 63 65 2e 20 20 52 65  de in-place.  Re
3c50: 74 75 72 6e 20 74 68 65 20 6e 65 77 20 6e 61 6d  turn the new nam
3c60: 65 20 6c 65 6e 67 74 68 2e 0a 2a 2a 0a 2a 2a 20  e length..**.** 
3c70: 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c  The original fil
3c80: 65 6e 61 6d 65 20 69 73 20 69 6e 20 7a 5b 30 2e  ename is in z[0.
3c90: 2e 6e 2d 31 5d 2e 20 20 52 65 74 75 72 6e 20 74  .n-1].  Return t
3ca0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  he number of.** 
3cb0: 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 74 68  characters in th
3cc0: 65 20 73 69 6d 70 6c 69 66 69 65 64 20 6e 61 6d  e simplified nam
3cd0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
3ce0: 20 76 78 77 6f 72 6b 73 53 69 6d 70 6c 69 66 79   vxworksSimplify
3cf0: 4e 61 6d 65 28 63 68 61 72 20 2a 7a 2c 20 69 6e  Name(char *z, in
3d00: 74 20 6e 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a  t n){.  int i, j
3d10: 3b 0a 20 20 77 68 69 6c 65 28 20 6e 3e 31 20 26  ;.  while( n>1 &
3d20: 26 20 7a 5b 6e 2d 31 5d 3d 3d 27 2f 27 20 29 7b  & z[n-1]=='/' ){
3d30: 20 6e 2d 2d 3b 20 7d 0a 20 20 66 6f 72 28 69 3d   n--; }.  for(i=
3d40: 6a 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a  j=0; i<n; i++){.
3d50: 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 2f      if( z[i]=='/
3d60: 27 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 7a  ' ){.      if( z
3d70: 5b 69 2b 31 5d 3d 3d 27 2f 27 20 29 20 63 6f 6e  [i+1]=='/' ) con
3d80: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28  tinue;.      if(
3d90: 20 7a 5b 69 2b 31 5d 3d 3d 27 2e 27 20 26 26 20   z[i+1]=='.' && 
3da0: 69 2b 32 3c 6e 20 26 26 20 7a 5b 69 2b 32 5d 3d  i+2<n && z[i+2]=
3db0: 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='/' ){.        
3dc0: 69 20 2b 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  i += 1;.        
3dd0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
3de0: 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2b  }.      if( z[i+
3df0: 31 5d 3d 3d 27 2e 27 20 26 26 20 69 2b 33 3c 6e  1]=='.' && i+3<n
3e00: 20 26 26 20 7a 5b 69 2b 32 5d 3d 3d 27 2e 27 20   && z[i+2]=='.' 
3e10: 26 26 20 7a 5b 69 2b 33 5d 3d 3d 27 2f 27 20 29  && z[i+3]=='/' )
3e20: 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  {.        while(
3e30: 20 6a 3e 30 20 26 26 20 7a 5b 6a 2d 31 5d 21 3d   j>0 && z[j-1]!=
3e40: 27 2f 27 20 29 7b 20 6a 2d 2d 3b 20 7d 0a 20 20  '/' ){ j--; }.  
3e50: 20 20 20 20 20 20 69 66 28 20 6a 3e 30 20 29 7b        if( j>0 ){
3e60: 20 6a 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 20 20   j--; }.        
3e70: 69 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 20 20  i += 2;.        
3e80: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
3e90: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 5b 6a 2b  }.    }.    z[j+
3ea0: 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a 20 20 7d 0a 20  +] = z[i];.  }. 
3eb0: 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20 72 65 74   z[j] = 0;.  ret
3ec0: 75 72 6e 20 6a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn j;.}../*.** 
3ed0: 46 69 6e 64 20 61 20 75 6e 69 71 75 65 20 66 69  Find a unique fi
3ee0: 6c 65 20 49 44 20 66 6f 72 20 74 68 65 20 67 69  le ID for the gi
3ef0: 76 65 6e 20 61 62 73 6f 6c 75 74 65 20 70 61 74  ven absolute pat
3f00: 68 6e 61 6d 65 2e 20 20 52 65 74 75 72 6e 0a 2a  hname.  Return.*
3f10: 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  * a pointer to t
3f20: 68 65 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64  he vxworksFileId
3f30: 20 6f 62 6a 65 63 74 2e 20 20 54 68 69 73 20 70   object.  This p
3f40: 6f 69 6e 74 65 72 20 69 73 20 74 68 65 20 75 6e  ointer is the un
3f50: 69 71 75 65 0a 2a 2a 20 66 69 6c 65 20 49 44 2e  ique.** file ID.
3f60: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 52 65 66 20  .**.** The nRef 
3f70: 66 69 65 6c 64 20 6f 66 20 74 68 65 20 76 78 77  field of the vxw
3f80: 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65 63  orksFileId objec
3f90: 74 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64  t is incremented
3fa0: 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20 6f   before.** the o
3fb0: 62 6a 65 63 74 20 69 73 20 72 65 74 75 72 6e 65  bject is returne
3fc0: 64 2e 20 20 41 20 6e 65 77 20 76 78 77 6f 72 6b  d.  A new vxwork
3fd0: 73 46 69 6c 65 49 64 20 6f 62 6a 65 63 74 20 69  sFileId object i
3fe0: 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64  s created.** and
3ff0: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 67 6c   added to the gl
4000: 6f 62 61 6c 20 6c 69 73 74 20 69 66 20 6e 65 63  obal list if nec
4010: 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66  essary..**.** If
4020: 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61   a memory alloca
4030: 74 69 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  tion error occur
4040: 73 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a  s, return NULL..
4050: 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74  */.static struct
4060: 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a   vxworksFileId *
4070: 76 78 77 6f 72 6b 73 46 69 6e 64 46 69 6c 65 49  vxworksFindFileI
4080: 64 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41  d(const char *zA
4090: 62 73 6f 6c 75 74 65 4e 61 6d 65 29 7b 0a 20 20  bsoluteName){.  
40a0: 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69  struct vxworksFi
40b0: 6c 65 49 64 20 2a 70 4e 65 77 3b 20 20 20 20 20  leId *pNew;     
40c0: 20 20 20 20 2f 2a 20 73 65 61 72 63 68 20 6b 65      /* search ke
40d0: 79 20 61 6e 64 20 6e 65 77 20 66 69 6c 65 20 49  y and new file I
40e0: 44 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 76 78  D */.  struct vx
40f0: 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 43 61  worksFileId *pCa
4100: 6e 64 69 64 61 74 65 3b 20 20 20 2f 2a 20 46 6f  ndidate;   /* Fo
4110: 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 65  r looping over e
4120: 78 69 73 74 69 6e 67 20 66 69 6c 65 20 49 44 73  xisting file IDs
4130: 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20   */.  int n;    
4140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4150: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e            /* Len
4160: 67 74 68 20 6f 66 20 7a 41 62 73 6f 6c 75 74 65  gth of zAbsolute
4170: 4e 61 6d 65 20 73 74 72 69 6e 67 20 2a 2f 0a 0a  Name string */..
4180: 20 20 61 73 73 65 72 74 28 20 7a 41 62 73 6f 6c    assert( zAbsol
4190: 75 74 65 4e 61 6d 65 5b 30 5d 3d 3d 27 2f 27 20  uteName[0]=='/' 
41a0: 29 3b 0a 20 20 6e 20 3d 20 28 69 6e 74 29 73 74  );.  n = (int)st
41b0: 72 6c 65 6e 28 7a 41 62 73 6f 6c 75 74 65 4e 61  rlen(zAbsoluteNa
41c0: 6d 65 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71  me);.  pNew = sq
41d0: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69  lite3_malloc( si
41e0: 7a 65 6f 66 28 2a 70 4e 65 77 29 20 2b 20 28 6e  zeof(*pNew) + (n
41f0: 2b 31 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65  +1) );.  if( pNe
4200: 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  w==0 ) return 0;
4210: 0a 20 20 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69  .  pNew->zCanoni
4220: 63 61 6c 4e 61 6d 65 20 3d 20 28 63 68 61 72 2a  calName = (char*
4230: 29 26 70 4e 65 77 5b 31 5d 3b 0a 20 20 6d 65 6d  )&pNew[1];.  mem
4240: 63 70 79 28 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e  cpy(pNew->zCanon
4250: 69 63 61 6c 4e 61 6d 65 2c 20 7a 41 62 73 6f 6c  icalName, zAbsol
4260: 75 74 65 4e 61 6d 65 2c 20 6e 2b 31 29 3b 0a 20  uteName, n+1);. 
4270: 20 6e 20 3d 20 76 78 77 6f 72 6b 73 53 69 6d 70   n = vxworksSimp
4280: 6c 69 66 79 4e 61 6d 65 28 70 4e 65 77 2d 3e 7a  lifyName(pNew->z
4290: 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20 6e  CanonicalName, n
42a0: 29 3b 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68 20  );..  /* Search 
42b0: 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e 67 20  for an existing 
42c0: 65 6e 74 72 79 20 74 68 61 74 20 6d 61 74 63 68  entry that match
42d0: 69 6e 67 20 74 68 65 20 63 61 6e 6f 6e 69 63 61  ing the canonica
42e0: 6c 20 6e 61 6d 65 2e 0a 20 20 2a 2a 20 49 66 20  l name..  ** If 
42f0: 66 6f 75 6e 64 2c 20 69 6e 63 72 65 6d 65 6e 74  found, increment
4300: 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63   the reference c
4310: 6f 75 6e 74 20 61 6e 64 20 72 65 74 75 72 6e 20  ount and return 
4320: 61 20 70 6f 69 6e 74 65 72 20 74 6f 0a 20 20 2a  a pointer to.  *
4330: 2a 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 66  * the existing f
4340: 69 6c 65 20 49 44 2e 0a 20 20 2a 2f 0a 20 20 75  ile ID..  */.  u
4350: 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
4360: 0a 20 20 66 6f 72 28 70 43 61 6e 64 69 64 61 74  .  for(pCandidat
4370: 65 3d 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73  e=vxworksFileLis
4380: 74 3b 20 70 43 61 6e 64 69 64 61 74 65 3b 20 70  t; pCandidate; p
4390: 43 61 6e 64 69 64 61 74 65 3d 70 43 61 6e 64 69  Candidate=pCandi
43a0: 64 61 74 65 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  date->pNext){.  
43b0: 20 20 69 66 28 20 70 43 61 6e 64 69 64 61 74 65    if( pCandidate
43c0: 2d 3e 6e 4e 61 6d 65 3d 3d 6e 20 0a 20 20 20 20  ->nName==n .    
43d0: 20 26 26 20 6d 65 6d 63 6d 70 28 70 43 61 6e 64   && memcmp(pCand
43e0: 69 64 61 74 65 2d 3e 7a 43 61 6e 6f 6e 69 63 61  idate->zCanonica
43f0: 6c 4e 61 6d 65 2c 20 70 4e 65 77 2d 3e 7a 43 61  lName, pNew->zCa
4400: 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20 6e 29 3d  nonicalName, n)=
4410: 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  =0.    ){.      
4420: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e   sqlite3_free(pN
4430: 65 77 29 3b 0a 20 20 20 20 20 20 20 70 43 61 6e  ew);.       pCan
4440: 64 69 64 61 74 65 2d 3e 6e 52 65 66 2b 2b 3b 0a  didate->nRef++;.
4450: 20 20 20 20 20 20 20 75 6e 69 78 4c 65 61 76 65         unixLeave
4460: 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 20 20 20  Mutex();.       
4470: 72 65 74 75 72 6e 20 70 43 61 6e 64 69 64 61 74  return pCandidat
4480: 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  e;.    }.  }..  
4490: 2f 2a 20 4e 6f 20 6d 61 74 63 68 20 77 61 73 20  /* No match was 
44a0: 66 6f 75 6e 64 2e 20 20 57 65 20 77 69 6c 6c 20  found.  We will 
44b0: 6d 61 6b 65 20 61 20 6e 65 77 20 66 69 6c 65 20  make a new file 
44c0: 49 44 20 2a 2f 0a 20 20 70 4e 65 77 2d 3e 6e 52  ID */.  pNew->nR
44d0: 65 66 20 3d 20 31 3b 0a 20 20 70 4e 65 77 2d 3e  ef = 1;.  pNew->
44e0: 6e 4e 61 6d 65 20 3d 20 6e 3b 0a 20 20 70 4e 65  nName = n;.  pNe
44f0: 77 2d 3e 70 4e 65 78 74 20 3d 20 76 78 77 6f 72  w->pNext = vxwor
4500: 6b 73 46 69 6c 65 4c 69 73 74 3b 0a 20 20 76 78  ksFileList;.  vx
4510: 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74 20 3d 20  worksFileList = 
4520: 70 4e 65 77 3b 0a 20 20 75 6e 69 78 4c 65 61 76  pNew;.  unixLeav
4530: 65 4d 75 74 65 78 28 29 3b 0a 20 20 72 65 74 75  eMutex();.  retu
4540: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pNew;.}../*.*
4550: 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20  * Decrement the 
4560: 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
4570: 6f 6e 20 61 20 76 78 77 6f 72 6b 73 46 69 6c 65  on a vxworksFile
4580: 49 64 20 6f 62 6a 65 63 74 2e 20 20 46 72 65 65  Id object.  Free
4590: 0a 2a 2a 20 74 68 65 20 6f 62 6a 65 63 74 20 77  .** the object w
45a0: 68 65 6e 20 74 68 65 20 72 65 66 65 72 65 6e 63  hen the referenc
45b0: 65 20 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20  e count reaches 
45c0: 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  zero..*/.static 
45d0: 76 6f 69 64 20 76 78 77 6f 72 6b 73 52 65 6c 65  void vxworksRele
45e0: 61 73 65 46 69 6c 65 49 64 28 73 74 72 75 63 74  aseFileId(struct
45f0: 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a   vxworksFileId *
4600: 70 49 64 29 7b 0a 20 20 75 6e 69 78 45 6e 74 65  pId){.  unixEnte
4610: 72 4d 75 74 65 78 28 29 3b 0a 20 20 61 73 73 65  rMutex();.  asse
4620: 72 74 28 20 70 49 64 2d 3e 6e 52 65 66 3e 30 20  rt( pId->nRef>0 
4630: 29 3b 0a 20 20 70 49 64 2d 3e 6e 52 65 66 2d 2d  );.  pId->nRef--
4640: 3b 0a 20 20 69 66 28 20 70 49 64 2d 3e 6e 52 65  ;.  if( pId->nRe
4650: 66 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 72 75  f==0 ){.    stru
4660: 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64  ct vxworksFileId
4670: 20 2a 2a 70 70 3b 0a 20 20 20 20 66 6f 72 28 70   **pp;.    for(p
4680: 70 3d 26 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69  p=&vxworksFileLi
4690: 73 74 3b 20 2a 70 70 20 26 26 20 2a 70 70 21 3d  st; *pp && *pp!=
46a0: 70 49 64 3b 20 70 70 20 3d 20 26 28 28 2a 70 70  pId; pp = &((*pp
46b0: 29 2d 3e 70 4e 65 78 74 29 29 7b 7d 0a 20 20 20  )->pNext)){}.   
46c0: 20 61 73 73 65 72 74 28 20 2a 70 70 3d 3d 70 49   assert( *pp==pI
46d0: 64 20 29 3b 0a 20 20 20 20 2a 70 70 20 3d 20 70  d );.    *pp = p
46e0: 49 64 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 73  Id->pNext;.    s
46f0: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49 64 29  qlite3_free(pId)
4700: 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 4c 65 61 76  ;.  }.  unixLeav
4710: 65 4d 75 74 65 78 28 29 3b 0a 7d 0a 23 65 6e 64  eMutex();.}.#end
4720: 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53  if /* OS_VXWORKS
4730: 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   */./***********
4740: 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 55 6e 69 71  **** End of Uniq
4750: 75 65 20 46 69 6c 65 20 49 44 20 55 74 69 6c 69  ue File ID Utili
4760: 74 79 20 55 73 65 64 20 42 79 20 56 78 57 6f 72  ty Used By VxWor
4770: 6b 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ks *************
4780: 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
4790: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
47a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
47b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
47c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
47d0: 2a 2a 2f 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  **/.../*********
47e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
47f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4800: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4810: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4820: 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
4830: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4840: 2a 20 50 6f 73 69 78 20 41 64 76 69 73 6f 72 79  * Posix Advisory
4850: 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a   Locking *******
4860: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4870: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 50 4f 53 49  *****.**.** POSI
4880: 58 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73  X advisory locks
4890: 20 61 72 65 20 62 72 6f 6b 65 6e 20 62 79 20 64   are broken by d
48a0: 65 73 69 67 6e 2e 20 20 41 4e 53 49 20 53 54 44  esign.  ANSI STD
48b0: 20 31 30 30 33 2e 31 20 28 31 39 39 36 29 0a 2a   1003.1 (1996).*
48c0: 2a 20 73 65 63 74 69 6f 6e 20 36 2e 35 2e 32 2e  * section 6.5.2.
48d0: 32 20 6c 69 6e 65 73 20 34 38 33 20 74 68 72 6f  2 lines 483 thro
48e0: 75 67 68 20 34 39 30 20 73 70 65 63 69 66 79 20  ugh 490 specify 
48f0: 74 68 61 74 20 77 68 65 6e 20 61 20 70 72 6f 63  that when a proc
4900: 65 73 73 0a 2a 2a 20 73 65 74 73 20 6f 72 20 63  ess.** sets or c
4910: 6c 65 61 72 73 20 61 20 6c 6f 63 6b 2c 20 74 68  lears a lock, th
4920: 61 74 20 6f 70 65 72 61 74 69 6f 6e 20 6f 76 65  at operation ove
4930: 72 72 69 64 65 73 20 61 6e 79 20 70 72 69 6f 72  rrides any prior
4940: 20 6c 6f 63 6b 73 20 73 65 74 0a 2a 2a 20 62 79   locks set.** by
4950: 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73   the same proces
4960: 73 2e 20 20 49 74 20 64 6f 65 73 20 6e 6f 74 20  s.  It does not 
4970: 65 78 70 6c 69 63 69 74 6c 79 20 73 61 79 20 73  explicitly say s
4980: 6f 2c 20 62 75 74 20 74 68 69 73 20 69 6d 70 6c  o, but this impl
4990: 69 65 73 0a 2a 2a 20 74 68 61 74 20 69 74 20 6f  ies.** that it o
49a0: 76 65 72 72 69 64 65 73 20 6c 6f 63 6b 73 20 73  verrides locks s
49b0: 65 74 20 62 79 20 74 68 65 20 73 61 6d 65 20 70  et by the same p
49c0: 72 6f 63 65 73 73 20 75 73 69 6e 67 20 61 20 64  rocess using a d
49d0: 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66 69 6c 65  ifferent.** file
49e0: 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 43 6f   descriptor.  Co
49f0: 6e 73 69 64 65 72 20 74 68 69 73 20 74 65 73 74  nsider this test
4a00: 20 63 61 73 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   case:.**.**    
4a10: 20 20 20 69 6e 74 20 66 64 31 20 3d 20 6f 70 65     int fd1 = ope
4a20: 6e 28 22 2e 2f 66 69 6c 65 31 22 2c 20 4f 5f 52  n("./file1", O_R
4a30: 44 57 52 7c 4f 5f 43 52 45 41 54 2c 20 30 36 34  DWR|O_CREAT, 064
4a40: 34 29 3b 0a 2a 2a 20 20 20 20 20 20 20 69 6e 74  4);.**       int
4a50: 20 66 64 32 20 3d 20 6f 70 65 6e 28 22 2e 2f 66   fd2 = open("./f
4a60: 69 6c 65 32 22 2c 20 4f 5f 52 44 57 52 7c 4f 5f  ile2", O_RDWR|O_
4a70: 43 52 45 41 54 2c 20 30 36 34 34 29 3b 0a 2a 2a  CREAT, 0644);.**
4a80: 0a 2a 2a 20 53 75 70 70 6f 73 65 20 2e 2f 66 69  .** Suppose ./fi
4a90: 6c 65 31 20 61 6e 64 20 2e 2f 66 69 6c 65 32 20  le1 and ./file2 
4aa0: 61 72 65 20 72 65 61 6c 6c 79 20 74 68 65 20 73  are really the s
4ab0: 61 6d 65 20 66 69 6c 65 20 28 62 65 63 61 75 73  ame file (becaus
4ac0: 65 0a 2a 2a 20 6f 6e 65 20 69 73 20 61 20 68 61  e.** one is a ha
4ad0: 72 64 20 6f 72 20 73 79 6d 62 6f 6c 69 63 20 6c  rd or symbolic l
4ae0: 69 6e 6b 20 74 6f 20 74 68 65 20 6f 74 68 65 72  ink to the other
4af0: 29 20 74 68 65 6e 20 69 66 20 79 6f 75 20 73 65  ) then if you se
4b00: 74 0a 2a 2a 20 61 6e 20 65 78 63 6c 75 73 69 76  t.** an exclusiv
4b10: 65 20 6c 6f 63 6b 20 6f 6e 20 66 64 31 2c 20 74  e lock on fd1, t
4b20: 68 65 6e 20 74 72 79 20 74 6f 20 67 65 74 20 61  hen try to get a
4b30: 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
4b40: 0a 2a 2a 20 6f 6e 20 66 64 32 2c 20 69 74 20 77  .** on fd2, it w
4b50: 6f 72 6b 73 2e 20 20 49 20 77 6f 75 6c 64 20 68  orks.  I would h
4b60: 61 76 65 20 65 78 70 65 63 74 65 64 20 74 68 65  ave expected the
4b70: 20 73 65 63 6f 6e 64 20 6c 6f 63 6b 20 74 6f 0a   second lock to.
4b80: 2a 2a 20 66 61 69 6c 20 73 69 6e 63 65 20 74 68  ** fail since th
4b90: 65 72 65 20 77 61 73 20 61 6c 72 65 61 64 79 20  ere was already 
4ba0: 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69  a lock on the fi
4bb0: 6c 65 20 64 75 65 20 74 6f 20 66 64 31 2e 0a 2a  le due to fd1..*
4bc0: 2a 20 42 75 74 20 6e 6f 74 20 73 6f 2e 20 20 53  * But not so.  S
4bd0: 69 6e 63 65 20 62 6f 74 68 20 6c 6f 63 6b 73 20  ince both locks 
4be0: 63 61 6d 65 20 66 72 6f 6d 20 74 68 65 20 73 61  came from the sa
4bf0: 6d 65 20 70 72 6f 63 65 73 73 2c 20 74 68 65 0a  me process, the.
4c00: 2a 2a 20 73 65 63 6f 6e 64 20 6f 76 65 72 72 69  ** second overri
4c10: 64 65 73 20 74 68 65 20 66 69 72 73 74 2c 20 65  des the first, e
4c20: 76 65 6e 20 74 68 6f 75 67 68 20 74 68 65 79 20  ven though they 
4c30: 77 65 72 65 20 6f 6e 20 64 69 66 66 65 72 65 6e  were on differen
4c40: 74 0a 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69  t.** file descri
4c50: 70 74 6f 72 73 20 6f 70 65 6e 65 64 20 6f 6e 20  ptors opened on 
4c60: 64 69 66 66 65 72 65 6e 74 20 66 69 6c 65 20 6e  different file n
4c70: 61 6d 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ames..**.** This
4c80: 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 63   means that we c
4c90: 61 6e 6e 6f 74 20 75 73 65 20 50 4f 53 49 58 20  annot use POSIX 
4ca0: 6c 6f 63 6b 73 20 74 6f 20 73 79 6e 63 68 72 6f  locks to synchro
4cb0: 6e 69 7a 65 20 66 69 6c 65 20 61 63 63 65 73 73  nize file access
4cc0: 0a 2a 2a 20 61 6d 6f 6e 67 20 63 6f 6d 70 65 74  .** among compet
4cd0: 69 6e 67 20 74 68 72 65 61 64 73 20 6f 66 20 74  ing threads of t
4ce0: 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 2e  he same process.
4cf0: 20 20 50 4f 53 49 58 20 6c 6f 63 6b 73 20 77 69    POSIX locks wi
4d00: 6c 6c 20 77 6f 72 6b 20 66 69 6e 65 0a 2a 2a 20  ll work fine.** 
4d10: 74 6f 20 73 79 6e 63 68 72 6f 6e 69 7a 65 20 61  to synchronize a
4d20: 63 63 65 73 73 20 66 6f 72 20 74 68 72 65 61 64  ccess for thread
4d30: 73 20 69 6e 20 73 65 70 61 72 61 74 65 20 70 72  s in separate pr
4d40: 6f 63 65 73 73 65 73 2c 20 62 75 74 20 6e 6f 74  ocesses, but not
4d50: 0a 2a 2a 20 74 68 72 65 61 64 73 20 77 69 74 68  .** threads with
4d60: 69 6e 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63  in the same proc
4d70: 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 77 6f  ess..**.** To wo
4d80: 72 6b 20 61 72 6f 75 6e 64 20 74 68 65 20 70 72  rk around the pr
4d90: 6f 62 6c 65 6d 2c 20 53 51 4c 69 74 65 20 68 61  oblem, SQLite ha
4da0: 73 20 74 6f 20 6d 61 6e 61 67 65 20 66 69 6c 65  s to manage file
4db0: 20 6c 6f 63 6b 73 20 69 6e 74 65 72 6e 61 6c 6c   locks internall
4dc0: 79 0a 2a 2a 20 6f 6e 20 69 74 73 20 6f 77 6e 2e  y.** on its own.
4dd0: 20 20 57 68 65 6e 65 76 65 72 20 61 20 6e 65 77    Whenever a new
4de0: 20 64 61 74 61 62 61 73 65 20 69 73 20 6f 70 65   database is ope
4df0: 6e 65 64 2c 20 77 65 20 68 61 76 65 20 74 6f 20  ned, we have to 
4e00: 66 69 6e 64 20 74 68 65 0a 2a 2a 20 73 70 65 63  find the.** spec
4e10: 69 66 69 63 20 69 6e 6f 64 65 20 6f 66 20 74 68  ific inode of th
4e20: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
4e30: 28 74 68 65 20 69 6e 6f 64 65 20 69 73 20 64 65  (the inode is de
4e40: 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 0a  termined by the.
4e50: 2a 2a 20 73 74 5f 64 65 76 20 61 6e 64 20 73 74  ** st_dev and st
4e60: 5f 69 6e 6f 20 66 69 65 6c 64 73 20 6f 66 20 74  _ino fields of t
4e70: 68 65 20 73 74 61 74 20 73 74 72 75 63 74 75 72  he stat structur
4e80: 65 20 74 68 61 74 20 66 73 74 61 74 28 29 20 66  e that fstat() f
4e90: 69 6c 6c 73 20 69 6e 29 0a 2a 2a 20 61 6e 64 20  ills in).** and 
4ea0: 63 68 65 63 6b 20 66 6f 72 20 6c 6f 63 6b 73 20  check for locks 
4eb0: 61 6c 72 65 61 64 79 20 65 78 69 73 74 69 6e 67  already existing
4ec0: 20 6f 6e 20 74 68 61 74 20 69 6e 6f 64 65 2e 20   on that inode. 
4ed0: 20 57 68 65 6e 20 6c 6f 63 6b 73 20 61 72 65 0a   When locks are.
4ee0: 2a 2a 20 63 72 65 61 74 65 64 20 6f 72 20 72 65  ** created or re
4ef0: 6d 6f 76 65 64 2c 20 77 65 20 68 61 76 65 20 74  moved, we have t
4f00: 6f 20 6c 6f 6f 6b 20 61 74 20 6f 75 72 20 6f 77  o look at our ow
4f10: 6e 20 69 6e 74 65 72 6e 61 6c 20 72 65 63 6f 72  n internal recor
4f20: 64 20 6f 66 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b  d of the.** lock
4f30: 73 20 74 6f 20 73 65 65 20 69 66 20 61 6e 6f 74  s to see if anot
4f40: 68 65 72 20 74 68 72 65 61 64 20 68 61 73 20 70  her thread has p
4f50: 72 65 76 69 6f 75 73 6c 79 20 73 65 74 20 61 20  reviously set a 
4f60: 6c 6f 63 6b 20 6f 6e 20 74 68 61 74 20 73 61 6d  lock on that sam
4f70: 65 0a 2a 2a 20 69 6e 6f 64 65 2e 0a 2a 2a 0a 2a  e.** inode..**.*
4f80: 2a 20 28 41 73 69 64 65 3a 20 54 68 65 20 75 73  * (Aside: The us
4f90: 65 20 6f 66 20 69 6e 6f 64 65 20 6e 75 6d 62 65  e of inode numbe
4fa0: 72 73 20 61 73 20 75 6e 69 71 75 65 20 49 44 73  rs as unique IDs
4fb0: 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 6f   does not work o
4fc0: 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a 20 46 6f  n VxWorks..** Fo
4fd0: 72 20 56 78 57 6f 72 6b 73 2c 20 77 65 20 68 61  r VxWorks, we ha
4fe0: 76 65 20 74 6f 20 75 73 65 20 74 68 65 20 61 6c  ve to use the al
4ff0: 74 65 72 6e 61 74 69 76 65 20 75 6e 69 71 75 65  ternative unique
5000: 20 49 44 20 73 79 73 74 65 6d 20 62 61 73 65 64   ID system based
5010: 20 6f 6e 0a 2a 2a 20 63 61 6e 6f 6e 69 63 61 6c   on.** canonical
5020: 20 66 69 6c 65 6e 61 6d 65 20 61 6e 64 20 69 6d   filename and im
5030: 70 6c 65 6d 65 6e 74 65 64 20 69 6e 20 74 68 65  plemented in the
5040: 20 70 72 65 76 69 6f 75 73 20 64 69 76 69 73 69   previous divisi
5050: 6f 6e 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  on.).**.** The s
5060: 71 6c 69 74 65 33 5f 66 69 6c 65 20 73 74 72 75  qlite3_file stru
5070: 63 74 75 72 65 20 66 6f 72 20 50 4f 53 49 58 20  cture for POSIX 
5080: 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6a 75 73  is no longer jus
5090: 74 20 61 6e 20 69 6e 74 65 67 65 72 20 66 69 6c  t an integer fil
50a0: 65 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 2e  e.** descriptor.
50b0: 20 20 49 74 20 69 73 20 6e 6f 77 20 61 20 73 74    It is now a st
50c0: 72 75 63 74 75 72 65 20 74 68 61 74 20 68 6f 6c  ructure that hol
50d0: 64 73 20 74 68 65 20 69 6e 74 65 67 65 72 20 66  ds the integer f
50e0: 69 6c 65 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f  ile.** descripto
50f0: 72 20 61 6e 64 20 61 20 70 6f 69 6e 74 65 72 20  r and a pointer 
5100: 74 6f 20 61 20 73 74 72 75 63 74 75 72 65 20 74  to a structure t
5110: 68 61 74 20 64 65 73 63 72 69 62 65 73 20 74 68  hat describes th
5120: 65 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a 20 6c 6f  e internal.** lo
5130: 63 6b 73 20 6f 6e 20 74 68 65 20 63 6f 72 72 65  cks on the corre
5140: 73 70 6f 6e 64 69 6e 67 20 69 6e 6f 64 65 2e 20  sponding inode. 
5150: 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 6c 6f   There is one lo
5160: 63 6b 69 6e 67 20 73 74 72 75 63 74 75 72 65 0a  cking structure.
5170: 2a 2a 20 70 65 72 20 69 6e 6f 64 65 2c 20 73 6f  ** per inode, so
5180: 20 69 66 20 74 68 65 20 73 61 6d 65 20 69 6e 6f   if the same ino
5190: 64 65 20 69 73 20 6f 70 65 6e 65 64 20 74 77 69  de is opened twi
51a0: 63 65 2c 20 62 6f 74 68 20 75 6e 69 78 46 69 6c  ce, both unixFil
51b0: 65 20 73 74 72 75 63 74 75 72 65 73 0a 2a 2a 20  e structures.** 
51c0: 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 73 61 6d  point to the sam
51d0: 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63 74  e locking struct
51e0: 75 72 65 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e  ure.  The lockin
51f0: 67 20 73 74 72 75 63 74 75 72 65 20 6b 65 65 70  g structure keep
5200: 73 0a 2a 2a 20 61 20 72 65 66 65 72 65 6e 63 65  s.** a reference
5210: 20 63 6f 75 6e 74 20 28 73 6f 20 77 65 20 77 69   count (so we wi
5220: 6c 6c 20 6b 6e 6f 77 20 77 68 65 6e 20 74 6f 20  ll know when to 
5230: 64 65 6c 65 74 65 20 69 74 29 20 61 6e 64 20 61  delete it) and a
5240: 20 22 63 6e 74 22 0a 2a 2a 20 66 69 65 6c 64 20   "cnt".** field 
5250: 74 68 61 74 20 74 65 6c 6c 73 20 75 73 20 69 74  that tells us it
5260: 73 20 69 6e 74 65 72 6e 61 6c 20 6c 6f 63 6b 20  s internal lock 
5270: 73 74 61 74 75 73 2e 20 20 63 6e 74 3d 3d 30 20  status.  cnt==0 
5280: 6d 65 61 6e 73 20 74 68 65 0a 2a 2a 20 66 69 6c  means the.** fil
5290: 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 2e 20 20  e is unlocked.  
52a0: 63 6e 74 3d 3d 2d 31 20 6d 65 61 6e 73 20 74 68  cnt==-1 means th
52b0: 65 20 66 69 6c 65 20 68 61 73 20 61 6e 20 65 78  e file has an ex
52c0: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e 0a 2a 2a  clusive lock..**
52d0: 20 63 6e 74 3e 30 20 6d 65 61 6e 73 20 74 68 65   cnt>0 means the
52e0: 72 65 20 61 72 65 20 63 6e 74 20 73 68 61 72 65  re are cnt share
52f0: 64 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 20 66  d locks on the f
5300: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 61  ile..**.** Any a
5310: 74 74 65 6d 70 74 20 74 6f 20 6c 6f 63 6b 20 6f  ttempt to lock o
5320: 72 20 75 6e 6c 6f 63 6b 20 61 20 66 69 6c 65 20  r unlock a file 
5330: 66 69 72 73 74 20 63 68 65 63 6b 73 20 74 68 65  first checks the
5340: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73 74 72 75   locking.** stru
5350: 63 74 75 72 65 2e 20 20 54 68 65 20 66 63 6e 74  cture.  The fcnt
5360: 6c 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  l() system call 
5370: 69 73 20 6f 6e 6c 79 20 69 6e 76 6f 6b 65 64 20  is only invoked 
5380: 74 6f 20 73 65 74 20 61 20 0a 2a 2a 20 50 4f 53  to set a .** POS
5390: 49 58 20 6c 6f 63 6b 20 69 66 20 74 68 65 20 69  IX lock if the i
53a0: 6e 74 65 72 6e 61 6c 20 6c 6f 63 6b 20 73 74 72  nternal lock str
53b0: 75 63 74 75 72 65 20 74 72 61 6e 73 69 74 69 6f  ucture transitio
53c0: 6e 73 20 62 65 74 77 65 65 6e 0a 2a 2a 20 61 20  ns between.** a 
53d0: 6c 6f 63 6b 65 64 20 61 6e 64 20 61 6e 20 75 6e  locked and an un
53e0: 6c 6f 63 6b 65 64 20 73 74 61 74 65 2e 0a 2a 2a  locked state..**
53f0: 0a 2a 2a 20 42 75 74 20 77 61 69 74 3a 20 20 74  .** But wait:  t
5400: 68 65 72 65 20 61 72 65 20 79 65 74 20 6d 6f 72  here are yet mor
5410: 65 20 70 72 6f 62 6c 65 6d 73 20 77 69 74 68 20  e problems with 
5420: 50 4f 53 49 58 20 61 64 76 69 73 6f 72 79 20 6c  POSIX advisory l
5430: 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 79  ocks..**.** If y
5440: 6f 75 20 63 6c 6f 73 65 20 61 20 66 69 6c 65 20  ou close a file 
5450: 64 65 73 63 72 69 70 74 6f 72 20 74 68 61 74 20  descriptor that 
5460: 70 6f 69 6e 74 73 20 74 6f 20 61 20 66 69 6c 65  points to a file
5470: 20 74 68 61 74 20 68 61 73 20 6c 6f 63 6b 73 2c   that has locks,
5480: 0a 2a 2a 20 61 6c 6c 20 6c 6f 63 6b 73 20 6f 6e  .** all locks on
5490: 20 74 68 61 74 20 66 69 6c 65 20 74 68 61 74 20   that file that 
54a0: 61 72 65 20 6f 77 6e 65 64 20 62 79 20 74 68 65  are owned by the
54b0: 20 63 75 72 72 65 6e 74 20 70 72 6f 63 65 73 73   current process
54c0: 20 61 72 65 0a 2a 2a 20 72 65 6c 65 61 73 65 64   are.** released
54d0: 2e 20 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e  .  To work aroun
54e0: 64 20 74 68 69 73 20 70 72 6f 62 6c 65 6d 2c 20  d this problem, 
54f0: 65 61 63 68 20 75 6e 69 78 46 69 6c 65 20 73 74  each unixFile st
5500: 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73  ructure contains
5510: 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  .** a pointer to
5520: 20 61 6e 20 75 6e 69 78 4f 70 65 6e 43 6e 74 20   an unixOpenCnt 
5530: 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65 72  structure.  Ther
5540: 65 20 69 73 20 6f 6e 65 20 75 6e 69 78 4f 70 65  e is one unixOpe
5550: 6e 43 6e 74 20 73 74 72 75 63 74 75 72 65 0a 2a  nCnt structure.*
5560: 2a 20 70 65 72 20 6f 70 65 6e 20 69 6e 6f 64 65  * per open inode
5570: 2c 20 77 68 69 63 68 20 6d 65 61 6e 73 20 74 68  , which means th
5580: 61 74 20 6d 75 6c 74 69 70 6c 65 20 75 6e 69 78  at multiple unix
5590: 46 69 6c 65 20 63 61 6e 20 70 6f 69 6e 74 20 74  File can point t
55a0: 6f 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 75 6e  o a single.** un
55b0: 69 78 4f 70 65 6e 43 6e 74 2e 20 20 57 68 65 6e  ixOpenCnt.  When
55c0: 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d   an attempt is m
55d0: 61 64 65 20 74 6f 20 63 6c 6f 73 65 20 61 6e 20  ade to close an 
55e0: 75 6e 69 78 46 69 6c 65 2c 20 69 66 20 74 68 65  unixFile, if the
55f0: 72 65 20 61 72 65 0a 2a 2a 20 6f 74 68 65 72 20  re are.** other 
5600: 75 6e 69 78 46 69 6c 65 20 6f 70 65 6e 20 6f 6e  unixFile open on
5610: 20 74 68 65 20 73 61 6d 65 20 69 6e 6f 64 65 20   the same inode 
5620: 74 68 61 74 20 61 72 65 20 68 6f 6c 64 69 6e 67  that are holding
5630: 20 6c 6f 63 6b 73 2c 20 74 68 65 20 63 61 6c 6c   locks, the call
5640: 0a 2a 2a 20 74 6f 20 63 6c 6f 73 65 28 29 20 74  .** to close() t
5650: 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
5660: 6f 72 20 69 73 20 64 65 66 65 72 72 65 64 20 75  or is deferred u
5670: 6e 74 69 6c 20 61 6c 6c 20 6f 66 20 74 68 65 20  ntil all of the 
5680: 6c 6f 63 6b 73 20 63 6c 65 61 72 2e 0a 2a 2a 20  locks clear..** 
5690: 54 68 65 20 75 6e 69 78 4f 70 65 6e 43 6e 74 20  The unixOpenCnt 
56a0: 73 74 72 75 63 74 75 72 65 20 6b 65 65 70 73 20  structure keeps 
56b0: 61 20 6c 69 73 74 20 6f 66 20 66 69 6c 65 20 64  a list of file d
56c0: 65 73 63 72 69 70 74 6f 72 73 20 74 68 61 74 20  escriptors that 
56d0: 6e 65 65 64 20 74 6f 0a 2a 2a 20 62 65 20 63 6c  need to.** be cl
56e0: 6f 73 65 64 20 61 6e 64 20 74 68 61 74 20 6c 69  osed and that li
56f0: 73 74 20 69 73 20 77 61 6c 6b 65 64 20 28 61 6e  st is walked (an
5700: 64 20 63 6c 65 61 72 65 64 29 20 77 68 65 6e 20  d cleared) when 
5710: 74 68 65 20 6c 61 73 74 20 6c 6f 63 6b 0a 2a 2a  the last lock.**
5720: 20 63 6c 65 61 72 73 2e 0a 2a 2a 0a 2a 2a 20 59   clears..**.** Y
5730: 65 74 20 61 6e 6f 74 68 65 72 20 70 72 6f 62 6c  et another probl
5740: 65 6d 3a 20 20 4c 69 6e 75 78 54 68 72 65 61 64  em:  LinuxThread
5750: 73 20 64 6f 20 6e 6f 74 20 70 6c 61 79 20 77 65  s do not play we
5760: 6c 6c 20 77 69 74 68 20 70 6f 73 69 78 20 6c 6f  ll with posix lo
5770: 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 4d 61 6e 79 20  cks..**.** Many 
5780: 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 73 20 6f  older versions o
5790: 66 20 6c 69 6e 75 78 20 75 73 65 20 74 68 65 20  f linux use the 
57a0: 4c 69 6e 75 78 54 68 72 65 61 64 73 20 6c 69 62  LinuxThreads lib
57b0: 72 61 72 79 20 77 68 69 63 68 20 69 73 0a 2a 2a  rary which is.**
57c0: 20 6e 6f 74 20 70 6f 73 69 78 20 63 6f 6d 70 6c   not posix compl
57d0: 69 61 6e 74 2e 20 20 55 6e 64 65 72 20 4c 69 6e  iant.  Under Lin
57e0: 75 78 54 68 72 65 61 64 73 2c 20 61 20 6c 6f 63  uxThreads, a loc
57f0: 6b 20 63 72 65 61 74 65 64 20 62 79 20 74 68 72  k created by thr
5800: 65 61 64 0a 2a 2a 20 41 20 63 61 6e 6e 6f 74 20  ead.** A cannot 
5810: 62 65 20 6d 6f 64 69 66 69 65 64 20 6f 72 20 6f  be modified or o
5820: 76 65 72 72 69 64 64 65 6e 20 62 79 20 61 20 64  verridden by a d
5830: 69 66 66 65 72 65 6e 74 20 74 68 72 65 61 64 20  ifferent thread 
5840: 42 2e 0a 2a 2a 20 4f 6e 6c 79 20 74 68 72 65 61  B..** Only threa
5850: 64 20 41 20 63 61 6e 20 6d 6f 64 69 66 79 20 74  d A can modify t
5860: 68 65 20 6c 6f 63 6b 2e 20 20 4c 6f 63 6b 69 6e  he lock.  Lockin
5870: 67 20 62 65 68 61 76 69 6f 72 20 69 73 20 63 6f  g behavior is co
5880: 72 72 65 63 74 0a 2a 2a 20 69 66 20 74 68 65 20  rrect.** if the 
5890: 61 70 70 6c 69 61 74 69 6f 6e 20 75 73 65 73 20  appliation uses 
58a0: 74 68 65 20 6e 65 77 65 72 20 4e 61 74 69 76 65  the newer Native
58b0: 20 50 6f 73 69 78 20 54 68 72 65 61 64 20 4c 69   Posix Thread Li
58c0: 62 72 61 72 79 20 28 4e 50 54 4c 29 0a 2a 2a 20  brary (NPTL).** 
58d0: 6f 6e 20 6c 69 6e 75 78 20 2d 20 77 69 74 68 20  on linux - with 
58e0: 4e 50 54 4c 20 61 20 6c 6f 63 6b 20 63 72 65 61  NPTL a lock crea
58f0: 74 65 64 20 62 79 20 74 68 72 65 61 64 20 41 20  ted by thread A 
5900: 63 61 6e 20 6f 76 65 72 72 69 64 65 20 6c 6f 63  can override loc
5910: 6b 73 0a 2a 2a 20 69 6e 20 74 68 72 65 61 64 20  ks.** in thread 
5920: 42 2e 20 20 42 75 74 20 74 68 65 72 65 20 69 73  B.  But there is
5930: 20 6e 6f 20 77 61 79 20 74 6f 20 6b 6e 6f 77 20   no way to know 
5940: 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  at compile-time 
5950: 77 68 69 63 68 0a 2a 2a 20 74 68 72 65 61 64 69  which.** threadi
5960: 6e 67 20 6c 69 62 72 61 72 79 20 69 73 20 62 65  ng library is be
5970: 69 6e 67 20 75 73 65 64 2e 20 20 53 6f 20 74 68  ing used.  So th
5980: 65 72 65 20 69 73 20 6e 6f 20 77 61 79 20 74 6f  ere is no way to
5990: 20 6b 6e 6f 77 20 61 74 0a 2a 2a 20 63 6f 6d 70   know at.** comp
59a0: 69 6c 65 2d 74 69 6d 65 20 77 68 65 74 68 65 72  ile-time whether
59b0: 20 6f 72 20 6e 6f 74 20 74 68 72 65 61 64 20 41   or not thread A
59c0: 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20 6c 6f   can override lo
59d0: 63 6b 73 20 6f 6e 20 74 68 72 65 61 64 20 42 2e  cks on thread B.
59e0: 0a 2a 2a 20 57 65 20 68 61 76 65 20 74 6f 20 64  .** We have to d
59f0: 6f 20 61 20 72 75 6e 2d 74 69 6d 65 20 63 68 65  o a run-time che
5a00: 63 6b 20 74 6f 20 64 69 73 63 6f 76 65 72 20 74  ck to discover t
5a10: 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20 74  he behavior of t
5a20: 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 70 72  he.** current pr
5a30: 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20  ocess..**.** On 
5a40: 73 79 73 74 65 6d 73 20 77 68 65 72 65 20 74 68  systems where th
5a50: 72 65 61 64 20 41 20 69 73 20 75 6e 61 62 6c 65  read A is unable
5a60: 20 74 6f 20 6d 6f 64 69 66 79 20 6c 6f 63 6b 73   to modify locks
5a70: 20 63 72 65 61 74 65 64 20 62 79 0a 2a 2a 20 74   created by.** t
5a80: 68 72 65 61 64 20 42 2c 20 77 65 20 68 61 76 65  hread B, we have
5a90: 20 74 6f 20 6b 65 65 70 20 74 72 61 63 6b 20 6f   to keep track o
5aa0: 66 20 77 68 69 63 68 20 74 68 72 65 61 64 20 63  f which thread c
5ab0: 72 65 61 74 65 64 20 65 61 63 68 0a 2a 2a 20 6c  reated each.** l
5ac0: 6f 63 6b 2e 20 20 48 65 6e 63 65 20 74 68 65 72  ock.  Hence ther
5ad0: 65 20 69 73 20 61 6e 20 65 78 74 72 61 20 66 69  e is an extra fi
5ae0: 65 6c 64 20 69 6e 20 74 68 65 20 6b 65 79 20 74  eld in the key t
5af0: 6f 20 74 68 65 20 75 6e 69 78 4c 6f 63 6b 49 6e  o the unixLockIn
5b00: 66 6f 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20  fo.** structure 
5b10: 74 6f 20 72 65 63 6f 72 64 20 74 68 69 73 20 69  to record this i
5b20: 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 41 6e 64  nformation.  And
5b30: 20 6f 6e 20 74 68 6f 73 65 20 73 79 73 74 65 6d   on those system
5b40: 73 20 69 74 0a 2a 2a 20 69 73 20 69 6c 6c 65 67  s it.** is illeg
5b50: 61 6c 20 74 6f 20 62 65 67 69 6e 20 61 20 74 72  al to begin a tr
5b60: 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 6f 6e 65  ansaction in one
5b70: 20 74 68 72 65 61 64 20 61 6e 64 20 66 69 6e 69   thread and fini
5b80: 73 68 20 69 74 0a 2a 2a 20 69 6e 20 61 6e 6f 74  sh it.** in anot
5b90: 68 65 72 2e 20 20 46 6f 72 20 74 68 69 73 20 6c  her.  For this l
5ba0: 61 74 74 65 72 20 72 65 73 74 72 69 63 74 69 6f  atter restrictio
5bb0: 6e 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77  n, there is no w
5bc0: 6f 72 6b 2d 61 72 6f 75 6e 64 2e 0a 2a 2a 20 49  ork-around..** I
5bd0: 74 20 69 73 20 61 20 6c 69 6d 69 74 61 74 69 6f  t is a limitatio
5be0: 6e 20 6f 66 20 4c 69 6e 75 78 54 68 72 65 61 64  n of LinuxThread
5bf0: 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  s..*/../*.** Set
5c00: 20 6f 72 20 63 68 65 63 6b 20 74 68 65 20 75 6e   or check the un
5c10: 69 78 46 69 6c 65 2e 74 69 64 20 66 69 65 6c 64  ixFile.tid field
5c20: 2e 20 20 54 68 69 73 20 66 69 65 6c 64 20 69 73  .  This field is
5c30: 20 73 65 74 20 77 68 65 6e 20 61 6e 20 75 6e 69   set when an uni
5c40: 78 46 69 6c 65 0a 2a 2a 20 69 73 20 66 69 72 73  xFile.** is firs
5c50: 74 20 6f 70 65 6e 65 64 2e 20 20 41 6c 6c 20 73  t opened.  All s
5c60: 75 62 73 65 71 75 65 6e 74 20 75 73 65 73 20 6f  ubsequent uses o
5c70: 66 20 74 68 65 20 75 6e 69 78 46 69 6c 65 20 76  f the unixFile v
5c80: 65 72 69 66 79 20 74 68 61 74 20 74 68 65 0a 2a  erify that the.*
5c90: 2a 20 73 61 6d 65 20 74 68 72 65 61 64 20 69 73  * same thread is
5ca0: 20 6f 70 65 72 61 74 69 6e 67 20 6f 6e 20 74 68   operating on th
5cb0: 65 20 75 6e 69 78 46 69 6c 65 2e 20 20 53 6f 6d  e unixFile.  Som
5cc0: 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  e operating syst
5cd0: 65 6d 73 20 64 6f 0a 2a 2a 20 6e 6f 74 20 61 6c  ems do.** not al
5ce0: 6c 6f 77 20 6c 6f 63 6b 73 20 74 6f 20 62 65 20  low locks to be 
5cf0: 6f 76 65 72 72 69 64 64 65 6e 20 62 79 20 6f 74  overridden by ot
5d00: 68 65 72 20 74 68 72 65 61 64 73 20 61 6e 64 20  her threads and 
5d10: 74 68 61 74 20 72 65 73 74 72 69 63 74 69 6f 6e  that restriction
5d20: 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 61 74 20 73  .** means that s
5d30: 71 6c 69 74 65 33 2a 20 64 61 74 61 62 61 73 65  qlite3* database
5d40: 20 68 61 6e 64 6c 65 73 20 63 61 6e 6e 6f 74 20   handles cannot 
5d50: 62 65 20 6d 6f 76 65 64 20 66 72 6f 6d 20 6f 6e  be moved from on
5d60: 65 20 74 68 72 65 61 64 0a 2a 2a 20 74 6f 20 61  e thread.** to a
5d70: 6e 6f 74 68 65 72 20 77 68 69 6c 65 20 6c 6f 63  nother while loc
5d80: 6b 73 20 61 72 65 20 68 65 6c 64 2e 0a 2a 2a 0a  ks are held..**.
5d90: 2a 2a 20 56 65 72 73 69 6f 6e 20 33 2e 33 2e 31  ** Version 3.3.1
5da0: 20 28 32 30 30 36 2d 30 31 2d 31 35 29 3a 20 20   (2006-01-15):  
5db0: 75 6e 69 78 46 69 6c 65 20 63 61 6e 20 62 65 20  unixFile can be 
5dc0: 6d 6f 76 65 64 20 66 72 6f 6d 20 6f 6e 65 20 74  moved from one t
5dd0: 68 72 65 61 64 20 74 6f 0a 2a 2a 20 61 6e 6f 74  hread to.** anot
5de0: 68 65 72 20 61 73 20 6c 6f 6e 67 20 61 73 20 77  her as long as w
5df0: 65 20 61 72 65 20 72 75 6e 6e 69 6e 67 20 6f 6e  e are running on
5e00: 20 61 20 73 79 73 74 65 6d 20 74 68 61 74 20 73   a system that s
5e10: 75 70 70 6f 72 74 73 20 74 68 72 65 61 64 73 0a  upports threads.
5e20: 2a 2a 20 6f 76 65 72 72 69 64 69 6e 67 20 65 61  ** overriding ea
5e30: 63 68 20 6f 74 68 65 72 73 20 6c 6f 63 6b 73 20  ch others locks 
5e40: 28 77 68 69 63 68 20 69 73 20 6e 6f 77 20 74 68  (which is now th
5e50: 65 20 6d 6f 73 74 20 63 6f 6d 6d 6f 6e 20 62 65  e most common be
5e60: 68 61 76 69 6f 72 29 0a 2a 2a 20 6f 72 20 69 66  havior).** or if
5e70: 20 6e 6f 20 6c 6f 63 6b 73 20 61 72 65 20 68 65   no locks are he
5e80: 6c 64 2e 20 20 42 75 74 20 74 68 65 20 75 6e 69  ld.  But the uni
5e90: 78 46 69 6c 65 2e 70 4c 6f 63 6b 20 66 69 65 6c  xFile.pLock fiel
5ea0: 64 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 2a 2a  d needs to be.**
5eb0: 20 72 65 63 6f 6d 70 75 74 65 64 20 62 65 63 61   recomputed beca
5ec0: 75 73 65 20 69 74 73 20 6b 65 79 20 69 6e 63 6c  use its key incl
5ed0: 75 64 65 73 20 74 68 65 20 74 68 72 65 61 64 2d  udes the thread-
5ee0: 69 64 2e 20 20 53 65 65 20 74 68 65 20 0a 2a 2a  id.  See the .**
5ef0: 20 74 72 61 6e 73 66 65 72 4f 77 6e 65 72 73 68   transferOwnersh
5f00: 69 70 28 29 20 66 75 6e 63 74 69 6f 6e 20 62 65  ip() function be
5f10: 6c 6f 77 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  low for addition
5f20: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a  al information.*
5f30: 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52  /.#if SQLITE_THR
5f40: 45 41 44 53 41 46 45 20 26 26 20 64 65 66 69 6e  EADSAFE && defin
5f50: 65 64 28 5f 5f 6c 69 6e 75 78 5f 5f 29 0a 23 20  ed(__linux__).# 
5f60: 64 65 66 69 6e 65 20 53 45 54 5f 54 48 52 45 41  define SET_THREA
5f70: 44 49 44 28 58 29 20 20 20 28 58 29 2d 3e 74 69  DID(X)   (X)->ti
5f80: 64 20 3d 20 70 74 68 72 65 61 64 5f 73 65 6c 66  d = pthread_self
5f90: 28 29 0a 23 20 64 65 66 69 6e 65 20 43 48 45 43  ().# define CHEC
5fa0: 4b 5f 54 48 52 45 41 44 49 44 28 58 29 20 28 74  K_THREADID(X) (t
5fb0: 68 72 65 61 64 73 4f 76 65 72 72 69 64 65 45 61  hreadsOverrideEa
5fc0: 63 68 4f 74 68 65 72 73 4c 6f 63 6b 73 3d 3d 30  chOthersLocks==0
5fd0: 20 26 26 20 5c 0a 20 20 20 20 20 20 20 20 20 20   && \.          
5fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ff0: 20 20 21 70 74 68 72 65 61 64 5f 65 71 75 61 6c    !pthread_equal
6000: 28 28 58 29 2d 3e 74 69 64 2c 20 70 74 68 72 65  ((X)->tid, pthre
6010: 61 64 5f 73 65 6c 66 28 29 29 29 0a 23 65 6c 73  ad_self())).#els
6020: 65 0a 23 20 64 65 66 69 6e 65 20 53 45 54 5f 54  e.# define SET_T
6030: 48 52 45 41 44 49 44 28 58 29 0a 23 20 64 65 66  HREADID(X).# def
6040: 69 6e 65 20 43 48 45 43 4b 5f 54 48 52 45 41 44  ine CHECK_THREAD
6050: 49 44 28 58 29 20 30 0a 23 65 6e 64 69 66 0a 0a  ID(X) 0.#endif..
6060: 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63  /*.** An instanc
6070: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
6080: 6e 67 20 73 74 72 75 63 74 75 72 65 20 73 65 72  ng structure ser
6090: 76 65 73 20 61 73 20 74 68 65 20 6b 65 79 20 75  ves as the key u
60a0: 73 65 64 0a 2a 2a 20 74 6f 20 6c 6f 63 61 74 65  sed.** to locate
60b0: 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 75 6e   a particular un
60c0: 69 78 4f 70 65 6e 43 6e 74 20 73 74 72 75 63 74  ixOpenCnt struct
60d0: 75 72 65 20 67 69 76 65 6e 20 69 74 73 20 69 6e  ure given its in
60e0: 6f 64 65 2e 20 20 54 68 69 73 0a 2a 2a 20 69 73  ode.  This.** is
60f0: 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65   the same as the
6100: 20 75 6e 69 78 4c 6f 63 6b 4b 65 79 20 65 78 63   unixLockKey exc
6110: 65 70 74 20 74 68 61 74 20 74 68 65 20 74 68 72  ept that the thr
6120: 65 61 64 20 49 44 20 69 73 20 6f 6d 69 74 74 65  ead ID is omitte
6130: 64 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 75 6e 69  d..*/.struct uni
6140: 78 46 69 6c 65 49 64 20 7b 0a 20 20 64 65 76 5f  xFileId {.  dev_
6150: 74 20 64 65 76 3b 20 20 20 20 20 20 20 20 20 20  t dev;          
6160: 20 20 20 20 20 20 20 20 2f 2a 20 44 65 76 69 63          /* Devic
6170: 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 23 69 66 20  e number */.#if 
6180: 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74 72  OS_VXWORKS.  str
6190: 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49  uct vxworksFileI
61a0: 64 20 2a 70 49 64 3b 20 20 2f 2a 20 55 6e 69 71  d *pId;  /* Uniq
61b0: 75 65 20 66 69 6c 65 20 49 44 20 66 6f 72 20 76  ue file ID for v
61c0: 78 77 6f 72 6b 73 2e 20 2a 2f 0a 23 65 6c 73 65  xworks. */.#else
61d0: 0a 20 20 69 6e 6f 5f 74 20 69 6e 6f 3b 20 20 20  .  ino_t ino;   
61e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
61f0: 2a 20 49 6e 6f 64 65 20 6e 75 6d 62 65 72 20 2a  * Inode number *
6200: 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a  /.#endif.};../*.
6210: 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f  ** An instance o
6220: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
6230: 73 74 72 75 63 74 75 72 65 20 73 65 72 76 65 73  structure serves
6240: 20 61 73 20 74 68 65 20 6b 65 79 20 75 73 65 64   as the key used
6250: 0a 2a 2a 20 74 6f 20 6c 6f 63 61 74 65 20 61 20  .** to locate a 
6260: 70 61 72 74 69 63 75 6c 61 72 20 75 6e 69 78 4c  particular unixL
6270: 6f 63 6b 49 6e 66 6f 20 73 74 72 75 63 74 75 72  ockInfo structur
6280: 65 20 67 69 76 65 6e 20 69 74 73 20 69 6e 6f 64  e given its inod
6290: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 72 65  e..**.** If thre
62a0: 61 64 73 20 63 61 6e 6e 6f 74 20 6f 76 65 72 72  ads cannot overr
62b0: 69 64 65 20 65 61 63 68 20 6f 74 68 65 72 73 20  ide each others 
62c0: 6c 6f 63 6b 73 20 28 4c 69 6e 75 78 54 68 72 65  locks (LinuxThre
62d0: 61 64 73 29 2c 20 74 68 65 6e 20 77 65 0a 2a 2a  ads), then we.**
62e0: 20 73 65 74 20 74 68 65 20 75 6e 69 78 4c 6f 63   set the unixLoc
62f0: 6b 4b 65 79 2e 74 69 64 20 66 69 65 6c 64 20 74  kKey.tid field t
6300: 6f 20 74 68 65 20 74 68 72 65 61 64 20 49 44 2e  o the thread ID.
6310: 20 20 49 66 20 74 68 72 65 61 64 73 20 63 61 6e    If threads can
6320: 20 6f 76 65 72 72 69 64 65 0a 2a 2a 20 65 61 63   override.** eac
6330: 68 20 6f 74 68 65 72 73 20 6c 6f 63 6b 73 20 28  h others locks (
6340: 50 6f 73 69 78 20 61 6e 64 20 4e 50 54 4c 29 20  Posix and NPTL) 
6350: 74 68 65 6e 20 74 69 64 20 69 73 20 61 6c 77 61  then tid is alwa
6360: 79 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 0a  ys set to zero..
6370: 2a 2a 20 74 69 64 20 69 73 20 6f 6d 69 74 74 65  ** tid is omitte
6380: 64 20 69 66 20 77 65 20 63 6f 6d 70 69 6c 65 20  d if we compile 
6390: 77 69 74 68 6f 75 74 20 74 68 72 65 61 64 69 6e  without threadin
63a0: 67 20 73 75 70 70 6f 72 74 20 6f 72 20 6f 6e 20  g support or on 
63b0: 61 6e 20 4f 53 0a 2a 2a 20 6f 74 68 65 72 20 74  an OS.** other t
63c0: 68 61 6e 20 6c 69 6e 75 78 2e 0a 2a 2f 0a 73 74  han linux..*/.st
63d0: 72 75 63 74 20 75 6e 69 78 4c 6f 63 6b 4b 65 79  ruct unixLockKey
63e0: 20 7b 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78   {.  struct unix
63f0: 46 69 6c 65 49 64 20 66 69 64 3b 20 20 2f 2a 20  FileId fid;  /* 
6400: 55 6e 69 71 75 65 20 69 64 65 6e 74 69 66 69 65  Unique identifie
6410: 72 20 66 6f 72 20 74 68 65 20 66 69 6c 65 20 2a  r for the file *
6420: 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52  /.#if SQLITE_THR
6430: 45 41 44 53 41 46 45 20 26 26 20 64 65 66 69 6e  EADSAFE && defin
6440: 65 64 28 5f 5f 6c 69 6e 75 78 5f 5f 29 0a 20 20  ed(__linux__).  
6450: 70 74 68 72 65 61 64 5f 74 20 74 69 64 3b 20 20  pthread_t tid;  
6460: 2f 2a 20 54 68 72 65 61 64 20 49 44 20 6f 66 20  /* Thread ID of 
6470: 6c 6f 63 6b 20 6f 77 6e 65 72 2e 20 5a 65 72 6f  lock owner. Zero
6480: 20 69 66 20 6e 6f 74 20 75 73 69 6e 67 20 4c 69   if not using Li
6490: 6e 75 78 54 68 72 65 61 64 73 20 2a 2f 0a 23 65  nuxThreads */.#e
64a0: 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  ndif.};../*.** A
64b0: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
64c0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
64d0: 63 74 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74  cture is allocat
64e0: 65 64 20 66 6f 72 20 65 61 63 68 20 6f 70 65 6e  ed for each open
64f0: 0a 2a 2a 20 69 6e 6f 64 65 2e 20 20 4f 72 2c 20  .** inode.  Or, 
6500: 6f 6e 20 4c 69 6e 75 78 54 68 72 65 61 64 73 2c  on LinuxThreads,
6510: 20 74 68 65 72 65 20 69 73 20 6f 6e 65 20 6f 66   there is one of
6520: 20 74 68 65 73 65 20 73 74 72 75 63 74 75 72 65   these structure
6530: 73 20 66 6f 72 0a 2a 2a 20 65 61 63 68 20 69 6e  s for.** each in
6540: 6f 64 65 20 6f 70 65 6e 65 64 20 62 79 20 65 61  ode opened by ea
6550: 63 68 20 74 68 72 65 61 64 2e 0a 2a 2a 0a 2a 2a  ch thread..**.**
6560: 20 41 20 73 69 6e 67 6c 65 20 69 6e 6f 64 65 20   A single inode 
6570: 63 61 6e 20 68 61 76 65 20 6d 75 6c 74 69 70 6c  can have multipl
6580: 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
6590: 72 73 2c 20 73 6f 20 65 61 63 68 20 75 6e 69 78  rs, so each unix
65a0: 46 69 6c 65 0a 2a 2a 20 73 74 72 75 63 74 75 72  File.** structur
65b0: 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69  e contains a poi
65c0: 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e 73 74 61  nter to an insta
65d0: 6e 63 65 20 6f 66 20 74 68 69 73 20 6f 62 6a 65  nce of this obje
65e0: 63 74 20 61 6e 64 20 74 68 69 73 0a 2a 2a 20 6f  ct and this.** o
65f0: 62 6a 65 63 74 20 6b 65 65 70 73 20 61 20 63 6f  bject keeps a co
6600: 75 6e 74 20 6f 66 20 74 68 65 20 6e 75 6d 62 65  unt of the numbe
6610: 72 20 6f 66 20 75 6e 69 78 46 69 6c 65 20 70 6f  r of unixFile po
6620: 69 6e 74 69 6e 67 20 74 6f 20 69 74 2e 0a 2a 2f  inting to it..*/
6630: 0a 73 74 72 75 63 74 20 75 6e 69 78 4c 6f 63 6b  .struct unixLock
6640: 49 6e 66 6f 20 7b 0a 20 20 73 74 72 75 63 74 20  Info {.  struct 
6650: 75 6e 69 78 4c 6f 63 6b 4b 65 79 20 6c 6f 63 6b  unixLockKey lock
6660: 4b 65 79 3b 20 20 20 20 20 2f 2a 20 54 68 65 20  Key;     /* The 
6670: 6c 6f 6f 6b 75 70 20 6b 65 79 20 2a 2f 0a 20 20  lookup key */.  
6680: 69 6e 74 20 63 6e 74 3b 20 20 20 20 20 20 20 20  int cnt;        
6690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
66a0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 53 48 41  /* Number of SHA
66b0: 52 45 44 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a  RED locks held *
66c0: 2f 0a 20 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65  /.  int locktype
66d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
66e0: 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 53 48      /* One of SH
66f0: 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45 53 45 52  ARED_LOCK, RESER
6700: 56 45 44 5f 4c 4f 43 4b 20 65 74 63 2e 20 2a 2f  VED_LOCK etc. */
6710: 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20  .  int nRef;    
6720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6730: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
6740: 70 6f 69 6e 74 65 72 73 20 74 6f 20 74 68 69 73  pointers to this
6750: 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20   structure */.  
6760: 73 74 72 75 63 74 20 75 6e 69 78 4c 6f 63 6b 49  struct unixLockI
6770: 6e 66 6f 20 2a 70 4e 65 78 74 3b 20 20 20 20 20  nfo *pNext;     
6780: 2f 2a 20 4c 69 73 74 20 6f 66 20 61 6c 6c 20 75  /* List of all u
6790: 6e 69 78 4c 6f 63 6b 49 6e 66 6f 20 6f 62 6a 65  nixLockInfo obje
67a0: 63 74 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  cts */.  struct 
67b0: 75 6e 69 78 4c 6f 63 6b 49 6e 66 6f 20 2a 70 50  unixLockInfo *pP
67c0: 72 65 76 3b 20 20 20 20 20 2f 2a 20 20 20 20 2e  rev;     /*    .
67d0: 2e 2e 2e 20 64 6f 75 62 6c 79 20 6c 69 6e 6b 65  ... doubly linke
67e0: 64 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  d */.};../*.** A
67f0: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
6800: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
6810: 63 74 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74  cture is allocat
6820: 65 64 20 66 6f 72 20 65 61 63 68 20 6f 70 65 6e  ed for each open
6830: 0a 2a 2a 20 69 6e 6f 64 65 2e 20 20 54 68 69 73  .** inode.  This
6840: 20 73 74 72 75 63 74 75 72 65 20 6b 65 65 70 73   structure keeps
6850: 20 74 72 61 63 6b 20 6f 66 20 74 68 65 20 6e 75   track of the nu
6860: 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73 20 6f 6e  mber of locks on
6870: 20 74 68 61 74 0a 2a 2a 20 69 6e 6f 64 65 2e 20   that.** inode. 
6880: 20 49 66 20 61 20 63 6c 6f 73 65 20 69 73 20 61   If a close is a
6890: 74 74 65 6d 70 74 65 64 20 61 67 61 69 6e 73 74  ttempted against
68a0: 20 61 6e 20 69 6e 6f 64 65 20 74 68 61 74 20 69   an inode that i
68b0: 73 20 68 6f 6c 64 69 6e 67 0a 2a 2a 20 6c 6f 63  s holding.** loc
68c0: 6b 73 2c 20 74 68 65 20 63 6c 6f 73 65 20 69 73  ks, the close is
68d0: 20 64 65 66 65 72 72 65 64 20 75 6e 74 69 6c 20   deferred until 
68e0: 61 6c 6c 20 6c 6f 63 6b 73 20 63 6c 65 61 72 20  all locks clear 
68f0: 62 79 20 61 64 64 69 6e 67 20 74 68 65 0a 2a 2a  by adding the.**
6900: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
6910: 20 74 6f 20 62 65 20 63 6c 6f 73 65 64 20 74 6f   to be closed to
6920: 20 74 68 65 20 70 65 6e 64 69 6e 67 20 6c 69 73   the pending lis
6930: 74 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 20  t..**.** TODO:  
6940: 43 6f 6e 73 69 64 65 72 20 63 68 61 6e 67 69 6e  Consider changin
6950: 67 20 74 68 69 73 20 73 6f 20 74 68 61 74 20 74  g this so that t
6960: 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 61 20 73  here is only a s
6970: 69 6e 67 6c 65 20 66 69 6c 65 0a 2a 2a 20 64 65  ingle file.** de
6980: 73 63 72 69 70 74 6f 72 20 66 6f 72 20 65 61 63  scriptor for eac
6990: 68 20 6f 70 65 6e 20 66 69 6c 65 2c 20 65 76 65  h open file, eve
69a0: 6e 20 77 68 65 6e 20 69 74 20 69 73 20 6f 70 65  n when it is ope
69b0: 6e 65 64 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d  ned multiple tim
69c0: 65 73 2e 0a 2a 2a 20 54 68 65 20 63 6c 6f 73 65  es..** The close
69d0: 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 77  () system call w
69e0: 6f 75 6c 64 20 6f 6e 6c 79 20 6f 63 63 75 72 20  ould only occur 
69f0: 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20 64 61  when the last da
6a00: 74 61 62 61 73 65 0a 2a 2a 20 75 73 69 6e 67 20  tabase.** using 
6a10: 74 68 65 20 66 69 6c 65 20 63 6c 6f 73 65 73 2e  the file closes.
6a20: 0a 2a 2f 0a 73 74 72 75 63 74 20 75 6e 69 78 4f  .*/.struct unixO
6a30: 70 65 6e 43 6e 74 20 7b 0a 20 20 73 74 72 75 63  penCnt {.  struc
6a40: 74 20 75 6e 69 78 46 69 6c 65 49 64 20 66 69 6c  t unixFileId fil
6a50: 65 49 64 3b 20 20 20 2f 2a 20 54 68 65 20 6c 6f  eId;   /* The lo
6a60: 6f 6b 75 70 20 6b 65 79 20 2a 2f 0a 20 20 69 6e  okup key */.  in
6a70: 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20  t nRef;         
6a80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
6a90: 62 65 72 20 6f 66 20 70 6f 69 6e 74 65 72 73 20  ber of pointers 
6aa0: 74 6f 20 74 68 69 73 20 73 74 72 75 63 74 75 72  to this structur
6ab0: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f 63 6b  e */.  int nLock
6ac0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
6ad0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
6ae0: 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b  outstanding lock
6af0: 73 20 2a 2f 0a 20 20 55 6e 69 78 55 6e 75 73 65  s */.  UnixUnuse
6b00: 64 46 64 20 2a 70 55 6e 75 73 65 64 3b 20 20 20  dFd *pUnused;   
6b10: 20 20 20 2f 2a 20 55 6e 75 73 65 64 20 66 69 6c     /* Unused fil
6b20: 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 74 6f  e descriptors to
6b30: 20 63 6c 6f 73 65 20 2a 2f 0a 23 69 66 20 4f 53   close */.#if OS
6b40: 5f 56 58 57 4f 52 4b 53 0a 20 20 73 65 6d 5f 74  _VXWORKS.  sem_t
6b50: 20 2a 70 53 65 6d 3b 20 20 20 20 20 20 20 20 20   *pSem;         
6b60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
6b70: 61 6d 65 64 20 50 4f 53 49 58 20 73 65 6d 61 70  amed POSIX semap
6b80: 68 6f 72 65 20 2a 2f 0a 20 20 63 68 61 72 20 61  hore */.  char a
6b90: 53 65 6d 4e 61 6d 65 5b 4d 41 58 5f 50 41 54 48  SemName[MAX_PATH
6ba0: 4e 41 4d 45 2b 32 5d 3b 20 20 20 2f 2a 20 4e 61  NAME+2];   /* Na
6bb0: 6d 65 20 6f 66 20 74 68 61 74 20 73 65 6d 61 70  me of that semap
6bc0: 68 6f 72 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 20  hore */.#endif. 
6bd0: 20 73 74 72 75 63 74 20 75 6e 69 78 4f 70 65 6e   struct unixOpen
6be0: 43 6e 74 20 2a 70 4e 65 78 74 2c 20 2a 70 50 72  Cnt *pNext, *pPr
6bf0: 65 76 3b 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66  ev;   /* List of
6c00: 20 61 6c 6c 20 75 6e 69 78 4f 70 65 6e 43 6e 74   all unixOpenCnt
6c10: 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 7d 3b 0a 0a   objects */.};..
6c20: 2f 2a 0a 2a 2a 20 4c 69 73 74 73 20 6f 66 20 61  /*.** Lists of a
6c30: 6c 6c 20 75 6e 69 78 4c 6f 63 6b 49 6e 66 6f 20  ll unixLockInfo 
6c40: 61 6e 64 20 75 6e 69 78 4f 70 65 6e 43 6e 74 20  and unixOpenCnt 
6c50: 6f 62 6a 65 63 74 73 2e 20 20 54 68 65 73 65 20  objects.  These 
6c60: 75 73 65 64 20 74 6f 20 62 65 20 68 61 73 68 0a  used to be hash.
6c70: 2a 2a 20 74 61 62 6c 65 73 2e 20 20 42 75 74 20  ** tables.  But 
6c80: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f 62  the number of ob
6c90: 6a 65 63 74 73 20 69 73 20 72 61 72 65 6c 79 20  jects is rarely 
6ca0: 6d 6f 72 65 20 74 68 61 6e 20 61 20 64 6f 7a 65  more than a doze
6cb0: 6e 20 61 6e 64 0a 2a 2a 20 6e 65 76 65 72 20 65  n and.** never e
6cc0: 78 63 65 65 64 73 20 61 20 66 65 77 20 74 68 6f  xceeds a few tho
6cd0: 75 73 61 6e 64 2e 20 20 41 6e 64 20 6c 6f 6f 6b  usand.  And look
6ce0: 75 70 20 69 73 20 6e 6f 74 20 6f 6e 20 61 20 63  up is not on a c
6cf0: 72 69 74 69 63 61 6c 0a 2a 2a 20 70 61 74 68 20  ritical.** path 
6d00: 73 6f 20 61 20 73 69 6d 70 6c 65 20 6c 69 6e 6b  so a simple link
6d10: 65 64 20 6c 69 73 74 20 77 69 6c 6c 20 73 75 66  ed list will suf
6d20: 66 69 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  fice..*/.static 
6d30: 73 74 72 75 63 74 20 75 6e 69 78 4c 6f 63 6b 49  struct unixLockI
6d40: 6e 66 6f 20 2a 6c 6f 63 6b 4c 69 73 74 20 3d 20  nfo *lockList = 
6d50: 30 3b 0a 73 74 61 74 69 63 20 73 74 72 75 63 74  0;.static struct
6d60: 20 75 6e 69 78 4f 70 65 6e 43 6e 74 20 2a 6f 70   unixOpenCnt *op
6d70: 65 6e 4c 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a 0a  enList = 0;../*.
6d80: 2a 2a 20 54 68 69 73 20 76 61 72 69 61 62 6c 65  ** This variable
6d90: 20 72 65 6d 65 6d 62 65 72 73 20 77 68 65 74 68   remembers wheth
6da0: 65 72 20 6f 72 20 6e 6f 74 20 74 68 72 65 61 64  er or not thread
6db0: 73 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20 65  s can override e
6dc0: 61 63 68 20 6f 74 68 65 72 73 0a 2a 2a 20 6c 6f  ach others.** lo
6dd0: 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 30 3a  cks..**.**    0:
6de0: 20 20 4e 6f 2e 20 20 54 68 72 65 61 64 73 20 63    No.  Threads c
6df0: 61 6e 6e 6f 74 20 6f 76 65 72 72 69 64 65 20 65  annot override e
6e00: 61 63 68 20 6f 74 68 65 72 73 20 6c 6f 63 6b 73  ach others locks
6e10: 2e 20 20 28 4c 69 6e 75 78 54 68 72 65 61 64 73  .  (LinuxThreads
6e20: 29 0a 2a 2a 20 20 20 20 31 3a 20 20 59 65 73 2e  ).**    1:  Yes.
6e30: 20 20 54 68 72 65 61 64 73 20 63 61 6e 20 6f 76    Threads can ov
6e40: 65 72 72 69 64 65 20 65 61 63 68 20 6f 74 68 65  erride each othe
6e50: 72 73 20 6c 6f 63 6b 73 2e 20 20 28 50 6f 73 69  rs locks.  (Posi
6e60: 78 20 26 20 4e 4c 50 54 29 0a 2a 2a 20 20 20 2d  x & NLPT).**   -
6e70: 31 3a 20 20 57 65 20 64 6f 6e 27 74 20 6b 6e 6f  1:  We don't kno
6e80: 77 20 79 65 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20  w yet..**.** On 
6e90: 73 6f 6d 65 20 73 79 73 74 65 6d 73 2c 20 77 65  some systems, we
6ea0: 20 6b 6e 6f 77 20 61 74 20 63 6f 6d 70 69 6c 65   know at compile
6eb0: 2d 74 69 6d 65 20 69 66 20 74 68 72 65 61 64 73  -time if threads
6ec0: 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20 65 61   can override ea
6ed0: 63 68 0a 2a 2a 20 6f 74 68 65 72 73 20 6c 6f 63  ch.** others loc
6ee0: 6b 73 2e 20 20 4f 6e 20 74 68 6f 73 65 20 73 79  ks.  On those sy
6ef0: 73 74 65 6d 73 2c 20 74 68 65 20 53 51 4c 49 54  stems, the SQLIT
6f00: 45 5f 54 48 52 45 41 44 5f 4f 56 45 52 52 49 44  E_THREAD_OVERRID
6f10: 45 5f 4c 4f 43 4b 20 6d 61 63 72 6f 0a 2a 2a 20  E_LOCK macro.** 
6f20: 77 69 6c 6c 20 62 65 20 73 65 74 20 61 70 70 72  will be set appr
6f30: 6f 70 72 69 61 74 65 6c 79 2e 20 20 4f 6e 20 6f  opriately.  On o
6f40: 74 68 65 72 20 73 79 73 74 65 6d 73 2c 20 77 65  ther systems, we
6f50: 20 68 61 76 65 20 74 6f 20 63 68 65 63 6b 20 61   have to check a
6f60: 74 0a 2a 2a 20 72 75 6e 74 69 6d 65 2e 20 20 4f  t.** runtime.  O
6f70: 6e 20 74 68 65 73 65 20 6c 61 74 74 65 72 20 73  n these latter s
6f80: 79 73 74 65 6d 73 2c 20 53 51 4c 54 49 45 5f 54  ystems, SQLTIE_T
6f90: 48 52 45 41 44 5f 4f 56 45 52 52 49 44 45 5f 4c  HREAD_OVERRIDE_L
6fa0: 4f 43 4b 20 69 73 0a 2a 2a 20 75 6e 64 65 66 69  OCK is.** undefi
6fb0: 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ned..**.** This 
6fc0: 76 61 72 69 61 62 6c 65 20 6e 6f 72 6d 61 6c 6c  variable normall
6fd0: 79 20 68 61 73 20 66 69 6c 65 20 73 63 6f 70 65  y has file scope
6fe0: 20 6f 6e 6c 79 2e 20 20 42 75 74 20 64 75 72 69   only.  But duri
6ff0: 6e 67 20 74 65 73 74 69 6e 67 2c 20 77 65 20 6d  ng testing, we m
7000: 61 6b 65 0a 2a 2a 20 69 74 20 61 20 67 6c 6f 62  ake.** it a glob
7010: 61 6c 20 73 6f 20 74 68 61 74 20 74 68 65 20 74  al so that the t
7020: 65 73 74 20 63 6f 64 65 20 63 61 6e 20 63 68 61  est code can cha
7030: 6e 67 65 20 69 74 73 20 76 61 6c 75 65 20 69 6e  nge its value in
7040: 20 6f 72 64 65 72 20 74 6f 20 76 65 72 69 66 79   order to verify
7050: 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 72 69 67  .** that the rig
7060: 68 74 20 73 74 75 66 66 20 68 61 70 70 65 6e 73  ht stuff happens
7070: 20 69 6e 20 65 69 74 68 65 72 20 63 61 73 65 2e   in either case.
7080: 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 54  .*/.#if SQLITE_T
7090: 48 52 45 41 44 53 41 46 45 20 26 26 20 64 65 66  HREADSAFE && def
70a0: 69 6e 65 64 28 5f 5f 6c 69 6e 75 78 5f 5f 29 0a  ined(__linux__).
70b0: 23 20 20 69 66 6e 64 65 66 20 53 51 4c 49 54 45  #  ifndef SQLITE
70c0: 5f 54 48 52 45 41 44 5f 4f 56 45 52 52 49 44 45  _THREAD_OVERRIDE
70d0: 5f 4c 4f 43 4b 0a 23 20 20 20 20 64 65 66 69 6e  _LOCK.#    defin
70e0: 65 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 5f  e SQLITE_THREAD_
70f0: 4f 56 45 52 52 49 44 45 5f 4c 4f 43 4b 20 2d 31  OVERRIDE_LOCK -1
7100: 0a 23 20 20 65 6e 64 69 66 0a 23 20 20 69 66 64  .#  endif.#  ifd
7110: 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69  ef SQLITE_TEST.i
7120: 6e 74 20 74 68 72 65 61 64 73 4f 76 65 72 72 69  nt threadsOverri
7130: 64 65 45 61 63 68 4f 74 68 65 72 73 4c 6f 63 6b  deEachOthersLock
7140: 73 20 3d 20 53 51 4c 49 54 45 5f 54 48 52 45 41  s = SQLITE_THREA
7150: 44 5f 4f 56 45 52 52 49 44 45 5f 4c 4f 43 4b 3b  D_OVERRIDE_LOCK;
7160: 0a 23 20 20 65 6c 73 65 0a 73 74 61 74 69 63 20  .#  else.static 
7170: 69 6e 74 20 74 68 72 65 61 64 73 4f 76 65 72 72  int threadsOverr
7180: 69 64 65 45 61 63 68 4f 74 68 65 72 73 4c 6f 63  ideEachOthersLoc
7190: 6b 73 20 3d 20 53 51 4c 49 54 45 5f 54 48 52 45  ks = SQLITE_THRE
71a0: 41 44 5f 4f 56 45 52 52 49 44 45 5f 4c 4f 43 4b  AD_OVERRIDE_LOCK
71b0: 3b 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69  ;.#  endif.#endi
71c0: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 73 74  f../*.** This st
71d0: 72 75 63 74 75 72 65 20 68 6f 6c 64 73 20 69 6e  ructure holds in
71e0: 66 6f 72 6d 61 74 69 6f 6e 20 70 61 73 73 65 64  formation passed
71f0: 20 69 6e 74 6f 20 69 6e 64 69 76 69 64 75 61 6c   into individual
7200: 20 74 65 73 74 0a 2a 2a 20 74 68 72 65 61 64 73   test.** threads
7210: 20 62 79 20 74 68 65 20 74 65 73 74 54 68 72 65   by the testThre
7220: 61 64 4c 6f 63 6b 69 6e 67 42 65 68 61 76 69 6f  adLockingBehavio
7230: 72 28 29 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a  r() routine..*/.
7240: 73 74 72 75 63 74 20 74 68 72 65 61 64 54 65 73  struct threadTes
7250: 74 44 61 74 61 20 7b 0a 20 20 69 6e 74 20 66 64  tData {.  int fd
7260: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7270: 20 2f 2a 20 46 69 6c 65 20 74 6f 20 62 65 20 6c   /* File to be l
7280: 6f 63 6b 65 64 20 2a 2f 0a 20 20 73 74 72 75 63  ocked */.  struc
7290: 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 20 20 20  t flock lock;   
72a0: 20 20 2f 2a 20 54 68 65 20 6c 6f 63 6b 69 6e 67    /* The locking
72b0: 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20   operation */.  
72c0: 69 6e 74 20 72 65 73 75 6c 74 3b 20 20 20 20 20  int result;     
72d0: 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
72e0: 20 6f 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   of the locking 
72f0: 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 7d 3b 0a  operation */.};.
7300: 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45  .#if SQLITE_THRE
7310: 41 44 53 41 46 45 20 26 26 20 64 65 66 69 6e 65  ADSAFE && define
7320: 64 28 5f 5f 6c 69 6e 75 78 5f 5f 29 0a 2f 2a 0a  d(__linux__)./*.
7330: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
7340: 20 69 73 20 75 73 65 64 20 61 73 20 74 68 65 20   is used as the 
7350: 6d 61 69 6e 20 72 6f 75 74 69 6e 65 20 66 6f 72  main routine for
7360: 20 61 20 74 68 72 65 61 64 20 6c 61 75 6e 63 68   a thread launch
7370: 65 64 20 62 79 0a 2a 2a 20 74 65 73 74 54 68 72  ed by.** testThr
7380: 65 61 64 4c 6f 63 6b 69 6e 67 42 65 68 61 76 69  eadLockingBehavi
7390: 6f 72 28 29 2e 20 49 74 20 74 65 73 74 73 20 77  or(). It tests w
73a0: 68 65 74 68 65 72 20 74 68 65 20 73 68 61 72 65  hether the share
73b0: 64 2d 6c 6f 63 6b 20 6f 62 74 61 69 6e 65 64 0a  d-lock obtained.
73c0: 2a 2a 20 62 79 20 74 68 65 20 6d 61 69 6e 20 74  ** by the main t
73d0: 68 72 65 61 64 20 69 6e 20 74 65 73 74 54 68 72  hread in testThr
73e0: 65 61 64 4c 6f 63 6b 69 6e 67 42 65 68 61 76 69  eadLockingBehavi
73f0: 6f 72 28 29 20 63 6f 6e 66 6c 69 63 74 73 20 77  or() conflicts w
7400: 69 74 68 20 61 0a 2a 2a 20 68 79 70 6f 74 68 65  ith a.** hypothe
7410: 74 69 63 61 6c 20 77 72 69 74 65 2d 6c 6f 63 6b  tical write-lock
7420: 20 6f 62 74 61 69 6e 65 64 20 62 79 20 74 68 69   obtained by thi
7430: 73 20 74 68 72 65 61 64 20 6f 6e 20 74 68 65 20  s thread on the 
7440: 73 61 6d 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  same file..**.**
7450: 20 54 68 65 20 77 72 69 74 65 2d 6c 6f 63 6b 20   The write-lock 
7460: 69 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20  is not actually 
7470: 61 63 71 75 69 72 65 64 2c 20 61 73 20 74 68 69  acquired, as thi
7480: 73 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  s is not possibl
7490: 65 20 69 66 20 0a 2a 2a 20 74 68 65 20 66 69 6c  e if .** the fil
74a0: 65 20 69 73 20 6f 70 65 6e 20 69 6e 20 72 65 61  e is open in rea
74b0: 64 2d 6f 6e 6c 79 20 6d 6f 64 65 20 28 73 65 65  d-only mode (see
74c0: 20 74 69 63 6b 65 74 20 23 33 34 37 32 29 2e 0a   ticket #3472)..
74d0: 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20  */ .static void 
74e0: 2a 74 68 72 65 61 64 4c 6f 63 6b 69 6e 67 54 65  *threadLockingTe
74f0: 73 74 28 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a  st(void *pArg){.
7500: 20 20 73 74 72 75 63 74 20 74 68 72 65 61 64 54    struct threadT
7510: 65 73 74 44 61 74 61 20 2a 70 44 61 74 61 20 3d  estData *pData =
7520: 20 28 73 74 72 75 63 74 20 74 68 72 65 61 64 54   (struct threadT
7530: 65 73 74 44 61 74 61 2a 29 70 41 72 67 3b 0a 20  estData*)pArg;. 
7540: 20 70 44 61 74 61 2d 3e 72 65 73 75 6c 74 20 3d   pData->result =
7550: 20 66 63 6e 74 6c 28 70 44 61 74 61 2d 3e 66 64   fcntl(pData->fd
7560: 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 70 44 61 74  , F_GETLK, &pDat
7570: 61 2d 3e 6c 6f 63 6b 29 3b 0a 20 20 72 65 74 75  a->lock);.  retu
7580: 72 6e 20 70 41 72 67 3b 0a 7d 0a 23 65 6e 64 69  rn pArg;.}.#endi
7590: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 54 48 52 45  f /* SQLITE_THRE
75a0: 41 44 53 41 46 45 20 26 26 20 64 65 66 69 6e 65  ADSAFE && define
75b0: 64 28 5f 5f 6c 69 6e 75 78 5f 5f 29 20 2a 2f 0a  d(__linux__) */.
75c0: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52  ..#if SQLITE_THR
75d0: 45 41 44 53 41 46 45 20 26 26 20 64 65 66 69 6e  EADSAFE && defin
75e0: 65 64 28 5f 5f 6c 69 6e 75 78 5f 5f 29 0a 2f 2a  ed(__linux__)./*
75f0: 0a 2a 2a 20 54 68 69 73 20 70 72 6f 63 65 64 75  .** This procedu
7600: 72 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20 64  re attempts to d
7610: 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72  etermine whether
7620: 20 6f 72 20 6e 6f 74 20 74 68 72 65 61 64 73 0a   or not threads.
7630: 2a 2a 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20  ** can override 
7640: 65 61 63 68 20 6f 74 68 65 72 73 20 6c 6f 63 6b  each others lock
7650: 73 20 74 68 65 6e 20 73 65 74 73 20 74 68 65 20  s then sets the 
7660: 0a 2a 2a 20 74 68 72 65 61 64 73 4f 76 65 72 72  .** threadsOverr
7670: 69 64 65 45 61 63 68 4f 74 68 65 72 73 4c 6f 63  ideEachOthersLoc
7680: 6b 73 20 76 61 72 69 61 62 6c 65 20 61 70 70 72  ks variable appr
7690: 6f 70 72 69 61 74 65 6c 79 2e 0a 2a 2f 0a 73 74  opriately..*/.st
76a0: 61 74 69 63 20 76 6f 69 64 20 74 65 73 74 54 68  atic void testTh
76b0: 72 65 61 64 4c 6f 63 6b 69 6e 67 42 65 68 61 76  readLockingBehav
76c0: 69 6f 72 28 69 6e 74 20 66 64 5f 6f 72 69 67 29  ior(int fd_orig)
76d0: 7b 0a 20 20 69 6e 74 20 66 64 3b 0a 20 20 69 6e  {.  int fd;.  in
76e0: 74 20 72 63 3b 0a 20 20 73 74 72 75 63 74 20 74  t rc;.  struct t
76f0: 68 72 65 61 64 54 65 73 74 44 61 74 61 20 64 3b  hreadTestData d;
7700: 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20  .  struct flock 
7710: 6c 3b 0a 20 20 70 74 68 72 65 61 64 5f 74 20 74  l;.  pthread_t t
7720: 3b 0a 0a 20 20 66 64 20 3d 20 64 75 70 28 66 64  ;..  fd = dup(fd
7730: 5f 6f 72 69 67 29 3b 0a 20 20 69 66 28 20 66 64  _orig);.  if( fd
7740: 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 6d  <0 ) return;.  m
7750: 65 6d 73 65 74 28 26 6c 2c 20 30 2c 20 73 69 7a  emset(&l, 0, siz
7760: 65 6f 66 28 6c 29 29 3b 0a 20 20 6c 2e 6c 5f 74  eof(l));.  l.l_t
7770: 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20  ype = F_RDLCK;. 
7780: 20 6c 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20   l.l_len = 1;.  
7790: 6c 2e 6c 5f 73 74 61 72 74 20 3d 20 30 3b 0a 20  l.l_start = 0;. 
77a0: 20 6c 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45   l.l_whence = SE
77b0: 45 4b 5f 53 45 54 3b 0a 20 20 72 63 20 3d 20 66  EK_SET;.  rc = f
77c0: 63 6e 74 6c 28 66 64 5f 6f 72 69 67 2c 20 46 5f  cntl(fd_orig, F_
77d0: 53 45 54 4c 4b 2c 20 26 6c 29 3b 0a 20 20 69 66  SETLK, &l);.  if
77e0: 28 20 72 63 21 3d 30 20 29 20 72 65 74 75 72 6e  ( rc!=0 ) return
77f0: 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 2c 20 30  ;.  memset(&d, 0
7800: 2c 20 73 69 7a 65 6f 66 28 64 29 29 3b 0a 20 20  , sizeof(d));.  
7810: 64 2e 66 64 20 3d 20 66 64 3b 0a 20 20 64 2e 6c  d.fd = fd;.  d.l
7820: 6f 63 6b 20 3d 20 6c 3b 0a 20 20 64 2e 6c 6f 63  ock = l;.  d.loc
7830: 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57 52 4c  k.l_type = F_WRL
7840: 43 4b 3b 0a 20 20 69 66 28 20 70 74 68 72 65 61  CK;.  if( pthrea
7850: 64 5f 63 72 65 61 74 65 28 26 74 2c 20 30 2c 20  d_create(&t, 0, 
7860: 74 68 72 65 61 64 4c 6f 63 6b 69 6e 67 54 65 73  threadLockingTes
7870: 74 2c 20 26 64 29 3d 3d 30 20 29 7b 0a 20 20 20  t, &d)==0 ){.   
7880: 20 70 74 68 72 65 61 64 5f 6a 6f 69 6e 28 74 2c   pthread_join(t,
7890: 20 30 29 3b 0a 20 20 7d 0a 20 20 63 6c 6f 73 65   0);.  }.  close
78a0: 28 66 64 29 3b 0a 20 20 69 66 28 20 64 2e 72 65  (fd);.  if( d.re
78b0: 73 75 6c 74 21 3d 30 20 29 20 72 65 74 75 72 6e  sult!=0 ) return
78c0: 3b 0a 20 20 74 68 72 65 61 64 73 4f 76 65 72 72  ;.  threadsOverr
78d0: 69 64 65 45 61 63 68 4f 74 68 65 72 73 4c 6f 63  ideEachOthersLoc
78e0: 6b 73 20 3d 20 28 64 2e 6c 6f 63 6b 2e 6c 5f 74  ks = (d.lock.l_t
78f0: 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 29 3b 0a 7d  ype==F_UNLCK);.}
7900: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
7910: 45 5f 54 48 52 45 41 44 53 41 46 45 20 26 26 20  E_THREADSAFE && 
7920: 64 65 66 69 6e 65 64 28 5f 5f 6c 69 6e 75 78 5f  defined(__linux_
7930: 5f 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c  _) */../*.** Rel
7940: 65 61 73 65 20 61 20 75 6e 69 78 4c 6f 63 6b 49  ease a unixLockI
7950: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 70 72  nfo structure pr
7960: 65 76 69 6f 75 73 6c 79 20 61 6c 6c 6f 63 61 74  eviously allocat
7970: 65 64 20 62 79 20 66 69 6e 64 4c 6f 63 6b 49 6e  ed by findLockIn
7980: 66 6f 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  fo()..**.** The 
7990: 6d 75 74 65 78 20 65 6e 74 65 72 65 64 20 75 73  mutex entered us
79a0: 69 6e 67 20 74 68 65 20 75 6e 69 78 45 6e 74 65  ing the unixEnte
79b0: 72 4d 75 74 65 78 28 29 20 66 75 6e 63 74 69 6f  rMutex() functio
79c0: 6e 20 6d 75 73 74 20 62 65 20 68 65 6c 64 0a 2a  n must be held.*
79d0: 2a 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  * when this func
79e0: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a  tion is called..
79f0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
7a00: 65 6c 65 61 73 65 4c 6f 63 6b 49 6e 66 6f 28 73  eleaseLockInfo(s
7a10: 74 72 75 63 74 20 75 6e 69 78 4c 6f 63 6b 49 6e  truct unixLockIn
7a20: 66 6f 20 2a 70 4c 6f 63 6b 29 7b 0a 20 20 61 73  fo *pLock){.  as
7a30: 73 65 72 74 28 20 75 6e 69 78 4d 75 74 65 78 48  sert( unixMutexH
7a40: 65 6c 64 28 29 20 29 3b 0a 20 20 69 66 28 20 70  eld() );.  if( p
7a50: 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70 4c 6f 63  Lock ){.    pLoc
7a60: 6b 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 69  k->nRef--;.    i
7a70: 66 28 20 70 4c 6f 63 6b 2d 3e 6e 52 65 66 3d 3d  f( pLock->nRef==
7a80: 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  0 ){.      if( p
7a90: 4c 6f 63 6b 2d 3e 70 50 72 65 76 20 29 7b 0a 20  Lock->pPrev ){. 
7aa0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
7ab0: 4c 6f 63 6b 2d 3e 70 50 72 65 76 2d 3e 70 4e 65  Lock->pPrev->pNe
7ac0: 78 74 3d 3d 70 4c 6f 63 6b 20 29 3b 0a 20 20 20  xt==pLock );.   
7ad0: 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 70 50 72 65       pLock->pPre
7ae0: 76 2d 3e 70 4e 65 78 74 20 3d 20 70 4c 6f 63 6b  v->pNext = pLock
7af0: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  ->pNext;.      }
7b00: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73  else{.        as
7b10: 73 65 72 74 28 20 6c 6f 63 6b 4c 69 73 74 3d 3d  sert( lockList==
7b20: 70 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 20 20 20  pLock );.       
7b30: 20 6c 6f 63 6b 4c 69 73 74 20 3d 20 70 4c 6f 63   lockList = pLoc
7b40: 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  k->pNext;.      
7b50: 7d 0a 20 20 20 20 20 20 69 66 28 20 70 4c 6f 63  }.      if( pLoc
7b60: 6b 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20  k->pNext ){.    
7b70: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63      assert( pLoc
7b80: 6b 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 3d  k->pNext->pPrev=
7b90: 3d 70 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 20 20  =pLock );.      
7ba0: 20 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 2d 3e    pLock->pNext->
7bb0: 70 50 72 65 76 20 3d 20 70 4c 6f 63 6b 2d 3e 70  pPrev = pLock->p
7bc0: 50 72 65 76 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Prev;.      }.  
7bd0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
7be0: 28 70 4c 6f 63 6b 29 3b 0a 20 20 20 20 7d 0a 20  (pLock);.    }. 
7bf0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65   }.}../*.** Rele
7c00: 61 73 65 20 61 20 75 6e 69 78 4f 70 65 6e 43 6e  ase a unixOpenCn
7c10: 74 20 73 74 72 75 63 74 75 72 65 20 70 72 65 76  t structure prev
7c20: 69 6f 75 73 6c 79 20 61 6c 6c 6f 63 61 74 65 64  iously allocated
7c30: 20 62 79 20 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f   by findLockInfo
7c40: 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 75  ()..**.** The mu
7c50: 74 65 78 20 65 6e 74 65 72 65 64 20 75 73 69 6e  tex entered usin
7c60: 67 20 74 68 65 20 75 6e 69 78 45 6e 74 65 72 4d  g the unixEnterM
7c70: 75 74 65 78 28 29 20 66 75 6e 63 74 69 6f 6e 20  utex() function 
7c80: 6d 75 73 74 20 62 65 20 68 65 6c 64 0a 2a 2a 20  must be held.** 
7c90: 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
7ca0: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f  on is called..*/
7cb0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c  .static void rel
7cc0: 65 61 73 65 4f 70 65 6e 43 6e 74 28 73 74 72 75  easeOpenCnt(stru
7cd0: 63 74 20 75 6e 69 78 4f 70 65 6e 43 6e 74 20 2a  ct unixOpenCnt *
7ce0: 70 4f 70 65 6e 29 7b 0a 20 20 61 73 73 65 72 74  pOpen){.  assert
7cf0: 28 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28  ( unixMutexHeld(
7d00: 29 20 29 3b 0a 20 20 69 66 28 20 70 4f 70 65 6e  ) );.  if( pOpen
7d10: 20 29 7b 0a 20 20 20 20 70 4f 70 65 6e 2d 3e 6e   ){.    pOpen->n
7d20: 52 65 66 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70  Ref--;.    if( p
7d30: 4f 70 65 6e 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b  Open->nRef==0 ){
7d40: 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70 65 6e  .      if( pOpen
7d50: 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20 20  ->pPrev ){.     
7d60: 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 65 6e     assert( pOpen
7d70: 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 3d 3d  ->pPrev->pNext==
7d80: 70 4f 70 65 6e 20 29 3b 0a 20 20 20 20 20 20 20  pOpen );.       
7d90: 20 70 4f 70 65 6e 2d 3e 70 50 72 65 76 2d 3e 70   pOpen->pPrev->p
7da0: 4e 65 78 74 20 3d 20 70 4f 70 65 6e 2d 3e 70 4e  Next = pOpen->pN
7db0: 65 78 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ext;.      }else
7dc0: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
7dd0: 28 20 6f 70 65 6e 4c 69 73 74 3d 3d 70 4f 70 65  ( openList==pOpe
7de0: 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 6f 70 65  n );.        ope
7df0: 6e 4c 69 73 74 20 3d 20 70 4f 70 65 6e 2d 3e 70  nList = pOpen->p
7e00: 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Next;.      }.  
7e10: 20 20 20 20 69 66 28 20 70 4f 70 65 6e 2d 3e 70      if( pOpen->p
7e20: 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Next ){.        
7e30: 61 73 73 65 72 74 28 20 70 4f 70 65 6e 2d 3e 70  assert( pOpen->p
7e40: 4e 65 78 74 2d 3e 70 50 72 65 76 3d 3d 70 4f 70  Next->pPrev==pOp
7e50: 65 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4f  en );.        pO
7e60: 70 65 6e 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65  pen->pNext->pPre
7e70: 76 20 3d 20 70 4f 70 65 6e 2d 3e 70 50 72 65 76  v = pOpen->pPrev
7e80: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
7e90: 61 73 73 65 72 74 28 20 21 70 4f 70 65 6e 2d 3e  assert( !pOpen->
7ea0: 70 55 6e 75 73 65 64 20 29 3b 0a 20 20 20 20 20  pUnused );.     
7eb0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4f   sqlite3_free(pO
7ec0: 70 65 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  pen);.    }.  }.
7ed0: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61  }../*.** Given a
7ee0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
7ef0: 2c 20 6c 6f 63 61 74 65 20 75 6e 69 78 4c 6f 63  , locate unixLoc
7f00: 6b 49 6e 66 6f 20 61 6e 64 20 75 6e 69 78 4f 70  kInfo and unixOp
7f10: 65 6e 43 6e 74 20 73 74 72 75 63 74 75 72 65 73  enCnt structures
7f20: 20 74 68 61 74 0a 2a 2a 20 64 65 73 63 72 69 62   that.** describ
7f30: 65 73 20 74 68 61 74 20 66 69 6c 65 20 64 65 73  es that file des
7f40: 63 72 69 70 74 6f 72 2e 20 20 43 72 65 61 74 65  criptor.  Create
7f50: 20 6e 65 77 20 6f 6e 65 73 20 69 66 20 6e 65 63   new ones if nec
7f60: 65 73 73 61 72 79 2e 20 20 54 68 65 0a 2a 2a 20  essary.  The.** 
7f70: 72 65 74 75 72 6e 20 76 61 6c 75 65 73 20 6d 69  return values mi
7f80: 67 68 74 20 62 65 20 75 6e 69 6e 69 74 69 61 6c  ght be uninitial
7f90: 69 7a 65 64 20 69 66 20 61 6e 20 65 72 72 6f 72  ized if an error
7fa0: 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54   occurs..**.** T
7fb0: 68 65 20 6d 75 74 65 78 20 65 6e 74 65 72 65 64  he mutex entered
7fc0: 20 75 73 69 6e 67 20 74 68 65 20 75 6e 69 78 45   using the unixE
7fd0: 6e 74 65 72 4d 75 74 65 78 28 29 20 66 75 6e 63  nterMutex() func
7fe0: 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 68 65 6c  tion must be hel
7ff0: 64 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73 20 66  d.** when this f
8000: 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
8010: 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  d..**.** Return 
8020: 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65  an appropriate e
8030: 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74  rror code..*/.st
8040: 61 74 69 63 20 69 6e 74 20 66 69 6e 64 4c 6f 63  atic int findLoc
8050: 6b 49 6e 66 6f 28 0a 20 20 75 6e 69 78 46 69 6c  kInfo(.  unixFil
8060: 65 20 2a 70 46 69 6c 65 2c 20 20 20 20 20 20 20  e *pFile,       
8070: 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 69 78 20          /* Unix 
8080: 66 69 6c 65 20 77 69 74 68 20 66 69 6c 65 20 64  file with file d
8090: 65 73 63 20 75 73 65 64 20 69 6e 20 74 68 65 20  esc used in the 
80a0: 6b 65 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  key */.  struct 
80b0: 75 6e 69 78 4c 6f 63 6b 49 6e 66 6f 20 2a 2a 70  unixLockInfo **p
80c0: 70 4c 6f 63 6b 2c 20 20 2f 2a 20 52 65 74 75 72  pLock,  /* Retur
80d0: 6e 20 74 68 65 20 75 6e 69 78 4c 6f 63 6b 49 6e  n the unixLockIn
80e0: 66 6f 20 73 74 72 75 63 74 75 72 65 20 68 65 72  fo structure her
80f0: 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 75 6e  e */.  struct un
8100: 69 78 4f 70 65 6e 43 6e 74 20 2a 2a 70 70 4f 70  ixOpenCnt **ppOp
8110: 65 6e 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20  en    /* Return 
8120: 74 68 65 20 75 6e 69 78 4f 70 65 6e 43 6e 74 20  the unixOpenCnt 
8130: 73 74 72 75 63 74 75 72 65 20 68 65 72 65 20 2a  structure here *
8140: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  /.){.  int rc;  
8150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8160: 20 20 20 20 20 20 2f 2a 20 53 79 73 74 65 6d 20        /* System 
8170: 63 61 6c 6c 20 72 65 74 75 72 6e 20 63 6f 64 65  call return code
8180: 20 2a 2f 0a 20 20 69 6e 74 20 66 64 3b 20 20 20   */.  int fd;   
8190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
81a0: 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65       /* The file
81b0: 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20   descriptor for 
81c0: 70 46 69 6c 65 20 2a 2f 0a 20 20 73 74 72 75 63  pFile */.  struc
81d0: 74 20 75 6e 69 78 4c 6f 63 6b 4b 65 79 20 6c 6f  t unixLockKey lo
81e0: 63 6b 4b 65 79 3b 20 20 20 20 2f 2a 20 4c 6f 6f  ckKey;    /* Loo
81f0: 6b 75 70 20 6b 65 79 20 66 6f 72 20 74 68 65 20  kup key for the 
8200: 75 6e 69 78 4c 6f 63 6b 49 6e 66 6f 20 73 74 72  unixLockInfo str
8210: 75 63 74 75 72 65 20 2a 2f 0a 20 20 73 74 72 75  ucture */.  stru
8220: 63 74 20 75 6e 69 78 46 69 6c 65 49 64 20 66 69  ct unixFileId fi
8230: 6c 65 49 64 3b 20 20 20 20 20 20 2f 2a 20 4c 6f  leId;      /* Lo
8240: 6f 6b 75 70 20 6b 65 79 20 66 6f 72 20 74 68 65  okup key for the
8250: 20 75 6e 69 78 4f 70 65 6e 43 6e 74 20 73 74 72   unixOpenCnt str
8260: 75 63 74 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  uct */.  struct 
8270: 73 74 61 74 20 73 74 61 74 62 75 66 3b 20 20 20  stat statbuf;   
8280: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 77 2d 6c          /* Low-l
8290: 65 76 65 6c 20 66 69 6c 65 20 69 6e 66 6f 72 6d  evel file inform
82a0: 61 74 69 6f 6e 20 2a 2f 0a 20 20 73 74 72 75 63  ation */.  struc
82b0: 74 20 75 6e 69 78 4c 6f 63 6b 49 6e 66 6f 20 2a  t unixLockInfo *
82c0: 70 4c 6f 63 6b 20 3d 20 30 3b 2f 2a 20 43 61 6e  pLock = 0;/* Can
82d0: 64 69 64 61 74 65 20 75 6e 69 78 4c 6f 63 6b 49  didate unixLockI
82e0: 6e 66 6f 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  nfo object */.  
82f0: 73 74 72 75 63 74 20 75 6e 69 78 4f 70 65 6e 43  struct unixOpenC
8300: 6e 74 20 2a 70 4f 70 65 6e 3b 20 20 20 20 20 2f  nt *pOpen;     /
8310: 2a 20 43 61 6e 64 69 64 61 74 65 20 75 6e 69 78  * Candidate unix
8320: 4f 70 65 6e 43 6e 74 20 6f 62 6a 65 63 74 20 2a  OpenCnt object *
8330: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 75 6e 69  /..  assert( uni
8340: 78 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a  xMutexHeld() );.
8350: 0a 20 20 2f 2a 20 47 65 74 20 6c 6f 77 2d 6c 65  .  /* Get low-le
8360: 76 65 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  vel information 
8370: 61 62 6f 75 74 20 74 68 65 20 66 69 6c 65 20 74  about the file t
8380: 68 61 74 20 77 65 20 63 61 6e 20 75 73 65 64 20  hat we can used 
8390: 74 6f 0a 20 20 2a 2a 20 63 72 65 61 74 65 20 61  to.  ** create a
83a0: 20 75 6e 69 71 75 65 20 6e 61 6d 65 20 66 6f 72   unique name for
83b0: 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a   the file..  */.
83c0: 20 20 66 64 20 3d 20 70 46 69 6c 65 2d 3e 68 3b    fd = pFile->h;
83d0: 0a 20 20 72 63 20 3d 20 66 73 74 61 74 28 66 64  .  rc = fstat(fd
83e0: 2c 20 26 73 74 61 74 62 75 66 29 3b 0a 20 20 69  , &statbuf);.  i
83f0: 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20  f( rc!=0 ){.    
8400: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
8410: 20 3d 20 65 72 72 6e 6f 3b 0a 23 69 66 64 65 66   = errno;.#ifdef
8420: 20 45 4f 56 45 52 46 4c 4f 57 0a 20 20 20 20 69   EOVERFLOW.    i
8430: 66 28 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72  f( pFile->lastEr
8440: 72 6e 6f 3d 3d 45 4f 56 45 52 46 4c 4f 57 20 29  rno==EOVERFLOW )
8450: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
8460: 4f 4c 46 53 3b 0a 23 65 6e 64 69 66 0a 20 20 20  OLFS;.#endif.   
8470: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
8480: 4f 45 52 52 3b 0a 20 20 7d 0a 0a 23 69 66 64 65  OERR;.  }..#ifde
8490: 66 20 5f 5f 41 50 50 4c 45 5f 5f 0a 20 20 2f 2a  f __APPLE__.  /*
84a0: 20 4f 6e 20 4f 53 20 58 20 6f 6e 20 61 6e 20 6d   On OS X on an m
84b0: 73 64 6f 73 20 66 69 6c 65 73 79 73 74 65 6d 2c  sdos filesystem,
84c0: 20 74 68 65 20 69 6e 6f 64 65 20 6e 75 6d 62 65   the inode numbe
84d0: 72 20 69 73 20 72 65 70 6f 72 74 65 64 0a 20 20  r is reported.  
84e0: 2a 2a 20 69 6e 63 6f 72 72 65 63 74 6c 79 20 66  ** incorrectly f
84f0: 6f 72 20 7a 65 72 6f 2d 73 69 7a 65 20 66 69 6c  or zero-size fil
8500: 65 73 2e 20 20 53 65 65 20 74 69 63 6b 65 74 20  es.  See ticket 
8510: 23 33 32 36 30 2e 20 20 54 6f 20 77 6f 72 6b 0a  #3260.  To work.
8520: 20 20 2a 2a 20 61 72 6f 75 6e 64 20 74 68 69 73    ** around this
8530: 20 70 72 6f 62 6c 65 6d 20 28 77 65 20 63 6f 6e   problem (we con
8540: 73 69 64 65 72 20 69 74 20 61 20 62 75 67 20 69  sider it a bug i
8550: 6e 20 4f 53 20 58 2c 20 6e 6f 74 20 53 51 4c 69  n OS X, not SQLi
8560: 74 65 29 0a 20 20 2a 2a 20 77 65 20 61 6c 77 61  te).  ** we alwa
8570: 79 73 20 69 6e 63 72 65 61 73 65 20 74 68 65 20  ys increase the 
8580: 66 69 6c 65 20 73 69 7a 65 20 74 6f 20 31 20 62  file size to 1 b
8590: 79 20 77 72 69 74 69 6e 67 20 61 20 73 69 6e 67  y writing a sing
85a0: 6c 65 20 62 79 74 65 0a 20 20 2a 2a 20 70 72 69  le byte.  ** pri
85b0: 6f 72 20 74 6f 20 61 63 63 65 73 73 69 6e 67 20  or to accessing 
85c0: 74 68 65 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72  the inode number
85d0: 2e 20 20 54 68 65 20 6f 6e 65 20 62 79 74 65 20  .  The one byte 
85e0: 77 72 69 74 74 65 6e 20 69 73 0a 20 20 2a 2a 20  written is.  ** 
85f0: 61 6e 20 41 53 43 49 49 20 27 53 27 20 63 68 61  an ASCII 'S' cha
8600: 72 61 63 74 65 72 20 77 68 69 63 68 20 61 6c 73  racter which als
8610: 6f 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20  o happens to be 
8620: 74 68 65 20 66 69 72 73 74 20 62 79 74 65 0a 20  the first byte. 
8630: 20 2a 2a 20 69 6e 20 74 68 65 20 68 65 61 64 65   ** in the heade
8640: 72 20 6f 66 20 65 76 65 72 79 20 53 51 4c 69 74  r of every SQLit
8650: 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 6e 20  e database.  In 
8660: 74 68 69 73 20 77 61 79 2c 20 69 66 20 74 68 65  this way, if the
8670: 72 65 0a 20 20 2a 2a 20 69 73 20 61 20 72 61 63  re.  ** is a rac
8680: 65 20 63 6f 6e 64 69 74 69 6f 6e 20 73 75 63 68  e condition such
8690: 20 74 68 61 74 20 61 6e 6f 74 68 65 72 20 74 68   that another th
86a0: 72 65 61 64 20 68 61 73 20 61 6c 72 65 61 64 79  read has already
86b0: 20 70 6f 70 75 6c 61 74 65 64 0a 20 20 2a 2a 20   populated.  ** 
86c0: 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f  the first page o
86d0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20  f the database, 
86e0: 6e 6f 20 64 61 6d 61 67 65 20 69 73 20 64 6f 6e  no damage is don
86f0: 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 74  e..  */.  if( st
8700: 61 74 62 75 66 2e 73 74 5f 73 69 7a 65 3d 3d 30  atbuf.st_size==0
8710: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 77 72 69   ){.    rc = wri
8720: 74 65 28 66 64 2c 20 22 53 22 2c 20 31 29 3b 0a  te(fd, "S", 1);.
8730: 20 20 20 20 69 66 28 20 72 63 21 3d 31 20 29 7b      if( rc!=1 ){
8740: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
8750: 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20  LITE_IOERR;.    
8760: 7d 0a 20 20 20 20 72 63 20 3d 20 66 73 74 61 74  }.    rc = fstat
8770: 28 66 64 2c 20 26 73 74 61 74 62 75 66 29 3b 0a  (fd, &statbuf);.
8780: 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b      if( rc!=0 ){
8790: 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  .      pFile->la
87a0: 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b  stErrno = errno;
87b0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
87c0: 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20  LITE_IOERR;.    
87d0: 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
87e0: 6d 65 6d 73 65 74 28 26 6c 6f 63 6b 4b 65 79 2c  memset(&lockKey,
87f0: 20 30 2c 20 73 69 7a 65 6f 66 28 6c 6f 63 6b 4b   0, sizeof(lockK
8800: 65 79 29 29 3b 0a 20 20 6c 6f 63 6b 4b 65 79 2e  ey));.  lockKey.
8810: 66 69 64 2e 64 65 76 20 3d 20 73 74 61 74 62 75  fid.dev = statbu
8820: 66 2e 73 74 5f 64 65 76 3b 0a 23 69 66 20 4f 53  f.st_dev;.#if OS
8830: 5f 56 58 57 4f 52 4b 53 0a 20 20 6c 6f 63 6b 4b  _VXWORKS.  lockK
8840: 65 79 2e 66 69 64 2e 70 49 64 20 3d 20 70 46 69  ey.fid.pId = pFi
8850: 6c 65 2d 3e 70 49 64 3b 0a 23 65 6c 73 65 0a 20  le->pId;.#else. 
8860: 20 6c 6f 63 6b 4b 65 79 2e 66 69 64 2e 69 6e 6f   lockKey.fid.ino
8870: 20 3d 20 73 74 61 74 62 75 66 2e 73 74 5f 69 6e   = statbuf.st_in
8880: 6f 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51  o;.#endif.#if SQ
8890: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 20  LITE_THREADSAFE 
88a0: 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 6c 69 6e  && defined(__lin
88b0: 75 78 5f 5f 29 0a 20 20 69 66 28 20 74 68 72 65  ux__).  if( thre
88c0: 61 64 73 4f 76 65 72 72 69 64 65 45 61 63 68 4f  adsOverrideEachO
88d0: 74 68 65 72 73 4c 6f 63 6b 73 3c 30 20 29 7b 0a  thersLocks<0 ){.
88e0: 20 20 20 20 74 65 73 74 54 68 72 65 61 64 4c 6f      testThreadLo
88f0: 63 6b 69 6e 67 42 65 68 61 76 69 6f 72 28 66 64  ckingBehavior(fd
8900: 29 3b 0a 20 20 7d 0a 20 20 6c 6f 63 6b 4b 65 79  );.  }.  lockKey
8910: 2e 74 69 64 20 3d 20 74 68 72 65 61 64 73 4f 76  .tid = threadsOv
8920: 65 72 72 69 64 65 45 61 63 68 4f 74 68 65 72 73  errideEachOthers
8930: 4c 6f 63 6b 73 20 3f 20 30 20 3a 20 70 74 68 72  Locks ? 0 : pthr
8940: 65 61 64 5f 73 65 6c 66 28 29 3b 0a 23 65 6e 64  ead_self();.#end
8950: 69 66 0a 20 20 66 69 6c 65 49 64 20 3d 20 6c 6f  if.  fileId = lo
8960: 63 6b 4b 65 79 2e 66 69 64 3b 0a 20 20 69 66 28  ckKey.fid;.  if(
8970: 20 70 70 4c 6f 63 6b 21 3d 30 20 29 7b 0a 20 20   ppLock!=0 ){.  
8980: 20 20 70 4c 6f 63 6b 20 3d 20 6c 6f 63 6b 4c 69    pLock = lockLi
8990: 73 74 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70  st;.    while( p
89a0: 4c 6f 63 6b 20 26 26 20 6d 65 6d 63 6d 70 28 26  Lock && memcmp(&
89b0: 6c 6f 63 6b 4b 65 79 2c 20 26 70 4c 6f 63 6b 2d  lockKey, &pLock-
89c0: 3e 6c 6f 63 6b 4b 65 79 2c 20 73 69 7a 65 6f 66  >lockKey, sizeof
89d0: 28 6c 6f 63 6b 4b 65 79 29 29 20 29 7b 0a 20 20  (lockKey)) ){.  
89e0: 20 20 20 20 70 4c 6f 63 6b 20 3d 20 70 4c 6f 63      pLock = pLoc
89f0: 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a  k->pNext;.    }.
8a00: 20 20 20 20 69 66 28 20 70 4c 6f 63 6b 3d 3d 30      if( pLock==0
8a10: 20 29 7b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 20   ){.      pLock 
8a20: 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
8a30: 28 20 73 69 7a 65 6f 66 28 2a 70 4c 6f 63 6b 29  ( sizeof(*pLock)
8a40: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c   );.      if( pL
8a50: 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ock==0 ){.      
8a60: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
8a70: 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  MEM;.        got
8a80: 6f 20 65 78 69 74 5f 66 69 6e 64 6c 6f 63 6b 69  o exit_findlocki
8a90: 6e 66 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nfo;.      }.   
8aa0: 20 20 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 4b 65     pLock->lockKe
8ab0: 79 20 3d 20 6c 6f 63 6b 4b 65 79 3b 0a 20 20 20  y = lockKey;.   
8ac0: 20 20 20 70 4c 6f 63 6b 2d 3e 6e 52 65 66 20 3d     pLock->nRef =
8ad0: 20 31 3b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 2d   1;.      pLock-
8ae0: 3e 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  >cnt = 0;.      
8af0: 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 20  pLock->locktype 
8b00: 3d 20 30 3b 0a 20 20 20 20 20 20 70 4c 6f 63 6b  = 0;.      pLock
8b10: 2d 3e 70 4e 65 78 74 20 3d 20 6c 6f 63 6b 4c 69  ->pNext = lockLi
8b20: 73 74 3b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 2d  st;.      pLock-
8b30: 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20  >pPrev = 0;.    
8b40: 20 20 69 66 28 20 6c 6f 63 6b 4c 69 73 74 20 29    if( lockList )
8b50: 20 6c 6f 63 6b 4c 69 73 74 2d 3e 70 50 72 65 76   lockList->pPrev
8b60: 20 3d 20 70 4c 6f 63 6b 3b 0a 20 20 20 20 20 20   = pLock;.      
8b70: 6c 6f 63 6b 4c 69 73 74 20 3d 20 70 4c 6f 63 6b  lockList = pLock
8b80: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
8b90: 20 20 20 70 4c 6f 63 6b 2d 3e 6e 52 65 66 2b 2b     pLock->nRef++
8ba0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 70 4c  ;.    }.    *ppL
8bb0: 6f 63 6b 20 3d 20 70 4c 6f 63 6b 3b 0a 20 20 7d  ock = pLock;.  }
8bc0: 0a 20 20 69 66 28 20 70 70 4f 70 65 6e 21 3d 30  .  if( ppOpen!=0
8bd0: 20 29 7b 0a 20 20 20 20 70 4f 70 65 6e 20 3d 20   ){.    pOpen = 
8be0: 6f 70 65 6e 4c 69 73 74 3b 0a 20 20 20 20 77 68  openList;.    wh
8bf0: 69 6c 65 28 20 70 4f 70 65 6e 20 26 26 20 6d 65  ile( pOpen && me
8c00: 6d 63 6d 70 28 26 66 69 6c 65 49 64 2c 20 26 70  mcmp(&fileId, &p
8c10: 4f 70 65 6e 2d 3e 66 69 6c 65 49 64 2c 20 73 69  Open->fileId, si
8c20: 7a 65 6f 66 28 66 69 6c 65 49 64 29 29 20 29 7b  zeof(fileId)) ){
8c30: 0a 20 20 20 20 20 20 70 4f 70 65 6e 20 3d 20 70  .      pOpen = p
8c40: 4f 70 65 6e 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  Open->pNext;.   
8c50: 20 7d 0a 20 20 20 20 69 66 28 20 70 4f 70 65 6e   }.    if( pOpen
8c60: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4f 70  ==0 ){.      pOp
8c70: 65 6e 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  en = sqlite3_mal
8c80: 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 4f 70  loc( sizeof(*pOp
8c90: 65 6e 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28  en) );.      if(
8ca0: 20 70 4f 70 65 6e 3d 3d 30 20 29 7b 0a 20 20 20   pOpen==0 ){.   
8cb0: 20 20 20 20 20 72 65 6c 65 61 73 65 4c 6f 63 6b       releaseLock
8cc0: 49 6e 66 6f 28 70 4c 6f 63 6b 29 3b 0a 20 20 20  Info(pLock);.   
8cd0: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
8ce0: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20  _NOMEM;.        
8cf0: 67 6f 74 6f 20 65 78 69 74 5f 66 69 6e 64 6c 6f  goto exit_findlo
8d00: 63 6b 69 6e 66 6f 3b 0a 20 20 20 20 20 20 7d 0a  ckinfo;.      }.
8d10: 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 4f 70        memset(pOp
8d20: 65 6e 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70  en, 0, sizeof(*p
8d30: 4f 70 65 6e 29 29 3b 0a 20 20 20 20 20 20 70 4f  Open));.      pO
8d40: 70 65 6e 2d 3e 66 69 6c 65 49 64 20 3d 20 66 69  pen->fileId = fi
8d50: 6c 65 49 64 3b 0a 20 20 20 20 20 20 70 4f 70 65  leId;.      pOpe
8d60: 6e 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20  n->nRef = 1;.   
8d70: 20 20 20 70 4f 70 65 6e 2d 3e 70 4e 65 78 74 20     pOpen->pNext 
8d80: 3d 20 6f 70 65 6e 4c 69 73 74 3b 0a 20 20 20 20  = openList;.    
8d90: 20 20 69 66 28 20 6f 70 65 6e 4c 69 73 74 20 29    if( openList )
8da0: 20 6f 70 65 6e 4c 69 73 74 2d 3e 70 50 72 65 76   openList->pPrev
8db0: 20 3d 20 70 4f 70 65 6e 3b 0a 20 20 20 20 20 20   = pOpen;.      
8dc0: 6f 70 65 6e 4c 69 73 74 20 3d 20 70 4f 70 65 6e  openList = pOpen
8dd0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
8de0: 20 20 20 70 4f 70 65 6e 2d 3e 6e 52 65 66 2b 2b     pOpen->nRef++
8df0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 70 4f  ;.    }.    *ppO
8e00: 70 65 6e 20 3d 20 70 4f 70 65 6e 3b 0a 20 20 7d  pen = pOpen;.  }
8e10: 0a 0a 65 78 69 74 5f 66 69 6e 64 6c 6f 63 6b 69  ..exit_findlocki
8e20: 6e 66 6f 3a 0a 20 20 72 65 74 75 72 6e 20 72 63  nfo:.  return rc
8e30: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65  ;.}../*.** If we
8e40: 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 69   are currently i
8e50: 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20 74 68  n a different th
8e60: 72 65 61 64 20 74 68 61 6e 20 74 68 65 20 74 68  read than the th
8e70: 72 65 61 64 20 74 68 61 74 20 74 68 65 0a 2a 2a  read that the.**
8e80: 20 75 6e 69 78 46 69 6c 65 20 61 72 67 75 6d 65   unixFile argume
8e90: 6e 74 20 62 65 6c 6f 6e 67 73 20 74 6f 2c 20 74  nt belongs to, t
8ea0: 68 65 6e 20 74 72 61 6e 73 66 65 72 20 6f 77 6e  hen transfer own
8eb0: 65 72 73 68 69 70 20 6f 66 20 74 68 65 20 75 6e  ership of the un
8ec0: 69 78 46 69 6c 65 0a 2a 2a 20 6f 76 65 72 20 74  ixFile.** over t
8ed0: 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 68  o the current th
8ee0: 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 75 6e  read..**.** A un
8ef0: 69 78 46 69 6c 65 20 69 73 20 6f 6e 6c 79 20 6f  ixFile is only o
8f00: 77 6e 65 64 20 62 79 20 61 20 74 68 72 65 61 64  wned by a thread
8f10: 20 6f 6e 20 73 79 73 74 65 6d 73 20 74 68 61 74   on systems that
8f20: 20 75 73 65 20 4c 69 6e 75 78 54 68 72 65 61 64   use LinuxThread
8f30: 73 2e 0a 2a 2a 0a 2a 2a 20 4f 77 6e 65 72 73 68  s..**.** Ownersh
8f40: 69 70 20 74 72 61 6e 73 66 65 72 20 69 73 20 6f  ip transfer is o
8f50: 6e 6c 79 20 61 6c 6c 6f 77 65 64 20 69 66 20 74  nly allowed if t
8f60: 68 65 20 75 6e 69 78 46 69 6c 65 20 69 73 20 63  he unixFile is c
8f70: 75 72 72 65 6e 74 6c 79 20 75 6e 6c 6f 63 6b 65  urrently unlocke
8f80: 64 2e 0a 2a 2a 20 49 66 20 74 68 65 20 75 6e 69  d..** If the uni
8f90: 78 46 69 6c 65 20 69 73 20 6c 6f 63 6b 65 64 20  xFile is locked 
8fa0: 61 6e 64 20 61 6e 20 6f 77 6e 65 72 73 68 69 70  and an ownership
8fb0: 20 69 73 20 77 72 6f 6e 67 2c 20 74 68 65 6e 20   is wrong, then 
8fc0: 72 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45  return.** SQLITE
8fd0: 5f 4d 49 53 55 53 45 2e 20 20 53 51 4c 49 54 45  _MISUSE.  SQLITE
8fe0: 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
8ff0: 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f  if everything wo
9000: 72 6b 73 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49  rks..*/.#if SQLI
9010: 54 45 5f 54 48 52 45 41 44 53 41 46 45 20 26 26  TE_THREADSAFE &&
9020: 20 64 65 66 69 6e 65 64 28 5f 5f 6c 69 6e 75 78   defined(__linux
9030: 5f 5f 29 0a 73 74 61 74 69 63 20 69 6e 74 20 74  __).static int t
9040: 72 61 6e 73 66 65 72 4f 77 6e 65 72 73 68 69 70  ransferOwnership
9050: 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65  (unixFile *pFile
9060: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 70  ){.  int rc;.  p
9070: 74 68 72 65 61 64 5f 74 20 68 53 65 6c 66 3b 0a  thread_t hSelf;.
9080: 20 20 69 66 28 20 74 68 72 65 61 64 73 4f 76 65    if( threadsOve
9090: 72 72 69 64 65 45 61 63 68 4f 74 68 65 72 73 4c  rrideEachOthersL
90a0: 6f 63 6b 73 20 29 7b 0a 20 20 20 20 2f 2a 20 4f  ocks ){.    /* O
90b0: 77 6e 65 72 73 68 69 70 20 74 72 61 6e 73 66 65  wnership transfe
90c0: 72 73 20 6e 6f 74 20 6e 65 65 64 65 64 20 6f 6e  rs not needed on
90d0: 20 74 68 69 73 20 73 79 73 74 65 6d 20 2a 2f 0a   this system */.
90e0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
90f0: 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 68 53 65 6c  E_OK;.  }.  hSel
9100: 66 20 3d 20 70 74 68 72 65 61 64 5f 73 65 6c 66  f = pthread_self
9110: 28 29 3b 0a 20 20 69 66 28 20 70 74 68 72 65 61  ();.  if( pthrea
9120: 64 5f 65 71 75 61 6c 28 70 46 69 6c 65 2d 3e 74  d_equal(pFile->t
9130: 69 64 2c 20 68 53 65 6c 66 29 20 29 7b 0a 20 20  id, hSelf) ){.  
9140: 20 20 2f 2a 20 57 65 20 61 72 65 20 73 74 69 6c    /* We are stil
9150: 6c 20 69 6e 20 74 68 65 20 73 61 6d 65 20 74 68  l in the same th
9160: 72 65 61 64 20 2a 2f 0a 20 20 20 20 4f 53 54 52  read */.    OSTR
9170: 41 43 45 31 28 22 4e 6f 2d 74 72 61 6e 73 66 65  ACE1("No-transfe
9180: 72 2c 20 73 61 6d 65 20 74 68 72 65 61 64 5c 6e  r, same thread\n
9190: 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ");.    return S
91a0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
91b0: 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  if( pFile->lockt
91c0: 79 70 65 21 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a  ype!=NO_LOCK ){.
91d0: 20 20 20 20 2f 2a 20 57 65 20 63 61 6e 6e 6f 74      /* We cannot
91e0: 20 63 68 61 6e 67 65 20 6f 77 6e 65 72 73 68 69   change ownershi
91f0: 70 20 77 68 69 6c 65 20 77 65 20 61 72 65 20 68  p while we are h
9200: 6f 6c 64 69 6e 67 20 61 20 6c 6f 63 6b 21 20 2a  olding a lock! *
9210: 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  /.    return SQL
9220: 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20 7d 0a  ITE_MISUSE;.  }.
9230: 20 20 4f 53 54 52 41 43 45 34 28 22 54 72 61 6e    OSTRACE4("Tran
9240: 73 66 65 72 20 6f 77 6e 65 72 73 68 69 70 20 6f  sfer ownership o
9250: 66 20 25 64 20 66 72 6f 6d 20 25 64 20 74 6f 20  f %d from %d to 
9260: 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
9270: 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70 46 69     pFile->h, pFi
9280: 6c 65 2d 3e 74 69 64 2c 20 68 53 65 6c 66 29 3b  le->tid, hSelf);
9290: 0a 20 20 70 46 69 6c 65 2d 3e 74 69 64 20 3d 20  .  pFile->tid = 
92a0: 68 53 65 6c 66 3b 0a 20 20 69 66 20 28 70 46 69  hSelf;.  if (pFi
92b0: 6c 65 2d 3e 70 4c 6f 63 6b 20 21 3d 20 4e 55 4c  le->pLock != NUL
92c0: 4c 29 20 7b 0a 20 20 20 20 72 65 6c 65 61 73 65  L) {.    release
92d0: 4c 6f 63 6b 49 6e 66 6f 28 70 46 69 6c 65 2d 3e  LockInfo(pFile->
92e0: 70 4c 6f 63 6b 29 3b 0a 20 20 20 20 72 63 20 3d  pLock);.    rc =
92f0: 20 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28 70 46   findLockInfo(pF
9300: 69 6c 65 2c 20 26 70 46 69 6c 65 2d 3e 70 4c 6f  ile, &pFile->pLo
9310: 63 6b 2c 20 30 29 3b 0a 20 20 20 20 4f 53 54 52  ck, 0);.    OSTR
9320: 41 43 45 35 28 22 4c 4f 43 4b 20 20 20 20 25 64  ACE5("LOCK    %d
9330: 20 69 73 20 6e 6f 77 20 25 73 28 25 73 2c 25 64   is now %s(%s,%d
9340: 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a  )\n", pFile->h,.
9350: 20 20 20 20 20 20 20 20 20 20 20 6c 6f 63 6b 74             lockt
9360: 79 70 65 4e 61 6d 65 28 70 46 69 6c 65 2d 3e 6c  ypeName(pFile->l
9370: 6f 63 6b 74 79 70 65 29 2c 0a 20 20 20 20 20 20  ocktype),.      
9380: 20 20 20 20 20 6c 6f 63 6b 74 79 70 65 4e 61 6d       locktypeNam
9390: 65 28 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 2d 3e  e(pFile->pLock->
93a0: 6c 6f 63 6b 74 79 70 65 29 2c 20 70 46 69 6c 65  locktype), pFile
93b0: 2d 3e 70 4c 6f 63 6b 2d 3e 63 6e 74 29 3b 0a 20  ->pLock->cnt);. 
93c0: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
93d0: 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 72 65 74  } else {.    ret
93e0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
93f0: 20 7d 0a 7d 0a 23 65 6c 73 65 20 20 2f 2a 20 69   }.}.#else  /* i
9400: 66 20 6e 6f 74 20 53 51 4c 49 54 45 5f 54 48 52  f not SQLITE_THR
9410: 45 41 44 53 41 46 45 20 2a 2f 0a 20 20 2f 2a 20  EADSAFE */.  /* 
9420: 4f 6e 20 73 69 6e 67 6c 65 2d 74 68 72 65 61 64  On single-thread
9430: 65 64 20 62 75 69 6c 64 73 2c 20 6f 77 6e 65 72  ed builds, owner
9440: 73 68 69 70 20 74 72 61 6e 73 66 65 72 20 69 73  ship transfer is
9450: 20 61 20 6e 6f 2d 6f 70 20 2a 2f 0a 23 20 64 65   a no-op */.# de
9460: 66 69 6e 65 20 74 72 61 6e 73 66 65 72 4f 77 6e  fine transferOwn
9470: 65 72 73 68 69 70 28 58 29 20 53 51 4c 49 54 45  ership(X) SQLITE
9480: 5f 4f 4b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  _OK.#endif /* SQ
9490: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 20  LITE_THREADSAFE 
94a0: 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  */.../*.** This 
94b0: 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69  routine checks i
94c0: 66 20 74 68 65 72 65 20 69 73 20 61 20 52 45 53  f there is a RES
94d0: 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20  ERVED lock held 
94e0: 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64  on the specified
94f0: 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73  .** file by this
9500: 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72   or any other pr
9510: 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68 20 61  ocess. If such a
9520: 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 73   lock is held, s
9530: 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74  et *pResOut.** t
9540: 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c  o a non-zero val
9550: 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70 52  ue otherwise *pR
9560: 65 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20  esOut is set to 
9570: 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75 72  zero.  The retur
9580: 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65  n value.** is se
9590: 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75  t to SQLITE_OK u
95a0: 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72 72  nless an I/O err
95b0: 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  or occurs during
95c0: 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a   lock checking..
95d0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
95e0: 69 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  ixCheckReservedL
95f0: 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
9600: 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f   *id, int *pResO
9610: 75 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ut){.  int rc = 
9620: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
9630: 20 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20   reserved = 0;. 
9640: 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
9650: 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
9660: 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  ;..  SimulateIOE
9670: 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c  rror( return SQL
9680: 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52  ITE_IOERR_CHECKR
9690: 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a  ESERVEDLOCK; );.
96a0: 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
96b0: 20 29 3b 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d   );.  unixEnterM
96c0: 75 74 65 78 28 29 3b 20 2f 2a 20 42 65 63 61 75  utex(); /* Becau
96d0: 73 65 20 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 20  se pFile->pLock 
96e0: 69 73 20 73 68 61 72 65 64 20 61 63 72 6f 73 73  is shared across
96f0: 20 74 68 72 65 61 64 73 20 2a 2f 0a 0a 20 20 2f   threads */..  /
9700: 2a 20 43 68 65 63 6b 20 69 66 20 61 20 74 68 72  * Check if a thr
9710: 65 61 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63  ead in this proc
9720: 65 73 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61  ess holds such a
9730: 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70   lock */.  if( p
9740: 46 69 6c 65 2d 3e 70 4c 6f 63 6b 2d 3e 6c 6f 63  File->pLock->loc
9750: 6b 74 79 70 65 3e 53 48 41 52 45 44 5f 4c 4f 43  ktype>SHARED_LOC
9760: 4b 20 29 7b 0a 20 20 20 20 72 65 73 65 72 76 65  K ){.    reserve
9770: 64 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  d = 1;.  }..  /*
9780: 20 4f 74 68 65 72 77 69 73 65 20 73 65 65 20 69   Otherwise see i
9790: 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f  f some other pro
97a0: 63 65 73 73 20 68 6f 6c 64 73 20 69 74 2e 0a 20  cess holds it.. 
97b0: 20 2a 2f 0a 23 69 66 6e 64 65 66 20 5f 5f 44 4a   */.#ifndef __DJ
97c0: 47 50 50 5f 5f 0a 20 20 69 66 28 20 21 72 65 73  GPP__.  if( !res
97d0: 65 72 76 65 64 20 29 7b 0a 20 20 20 20 73 74 72  erved ){.    str
97e0: 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a  uct flock lock;.
97f0: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63      lock.l_whenc
9800: 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20  e = SEEK_SET;.  
9810: 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
9820: 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 3b 0a   RESERVED_BYTE;.
9830: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d      lock.l_len =
9840: 20 31 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74   1;.    lock.l_t
9850: 79 70 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20  ype = F_WRLCK;. 
9860: 20 20 20 69 66 20 28 2d 31 20 3d 3d 20 66 63 6e     if (-1 == fcn
9870: 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 47  tl(pFile->h, F_G
9880: 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 29 20 7b 0a  ETLK, &lock)) {.
9890: 20 20 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f        int tErrno
98a0: 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
98b0: 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72  rc = sqliteError
98c0: 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74  FromPosixError(t
98d0: 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f  Errno, SQLITE_IO
98e0: 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45  ERR_CHECKRESERVE
98f0: 44 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 70 46  DLOCK);.      pF
9900: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
9910: 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 20 65   tErrno;.    } e
9920: 6c 73 65 20 69 66 28 20 6c 6f 63 6b 2e 6c 5f 74  lse if( lock.l_t
9930: 79 70 65 21 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a  ype!=F_UNLCK ){.
9940: 20 20 20 20 20 20 72 65 73 65 72 76 65 64 20 3d        reserved =
9950: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65   1;.    }.  }.#e
9960: 6e 64 69 66 0a 20 20 0a 20 20 75 6e 69 78 4c 65  ndif.  .  unixLe
9970: 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53  aveMutex();.  OS
9980: 54 52 41 43 45 34 28 22 54 45 53 54 20 57 52 2d  TRACE4("TEST WR-
9990: 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 5c 6e 22  LOCK %d %d %d\n"
99a0: 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20  , pFile->h, rc, 
99b0: 72 65 73 65 72 76 65 64 29 3b 0a 0a 20 20 2a 70  reserved);..  *p
99c0: 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72 76 65  ResOut = reserve
99d0: 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  d;.  return rc;.
99e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 65 72 66 6f 72 6d  }../*.** Perform
99f0: 20 61 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20   a file locking 
9a00: 6f 70 65 72 61 74 69 6f 6e 20 6f 6e 20 61 20 72  operation on a r
9a10: 61 6e 67 65 20 6f 66 20 62 79 74 65 73 20 69 6e  ange of bytes in
9a20: 20 61 20 66 69 6c 65 2e 0a 2a 2a 20 54 68 65 20   a file..** The 
9a30: 22 6f 70 22 20 70 61 72 61 6d 65 74 65 72 20 73  "op" parameter s
9a40: 68 6f 75 6c 64 20 62 65 20 6f 6e 65 20 6f 66 20  hould be one of 
9a50: 46 5f 52 44 4c 43 4b 2c 20 46 5f 57 52 4c 43 4b  F_RDLCK, F_WRLCK
9a60: 2c 20 6f 72 20 46 5f 55 4e 4c 43 4b 2e 0a 2a 2a  , or F_UNLCK..**
9a70: 20 52 65 74 75 72 6e 20 30 20 6f 6e 20 73 75 63   Return 0 on suc
9a80: 63 65 73 73 20 6f 72 20 2d 31 20 66 6f 72 20 66  cess or -1 for f
9a90: 61 69 6c 75 72 65 2e 20 20 4f 6e 20 66 61 69 6c  ailure.  On fail
9aa0: 75 72 65 2c 20 77 72 69 74 65 20 74 68 65 20 65  ure, write the e
9ab0: 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 69 6e 74  rror.** code int
9ac0: 6f 20 2a 70 45 72 72 63 6f 64 65 2e 0a 2a 2a 0a  o *pErrcode..**.
9ad0: 2a 2a 20 49 66 20 74 68 65 20 53 51 4c 49 54 45  ** If the SQLITE
9ae0: 5f 57 48 4f 4c 45 5f 46 49 4c 45 5f 4c 4f 43 4b  _WHOLE_FILE_LOCK
9af0: 49 4e 47 20 62 69 74 20 69 73 20 63 6c 65 61 72  ING bit is clear
9b00: 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 6c 6f 63 6b  , then only lock
9b10: 0a 2a 2a 20 74 68 65 20 72 61 6e 67 65 20 6f 66  .** the range of
9b20: 20 62 79 74 65 73 20 6f 6e 20 74 68 65 20 6c 6f   bytes on the lo
9b30: 63 6b 69 6e 67 20 70 61 67 65 20 62 65 74 77 65  cking page betwe
9b40: 65 6e 20 53 48 41 52 45 44 5f 46 49 52 53 54 20  en SHARED_FIRST 
9b50: 61 6e 64 0a 2a 2a 20 53 48 41 52 45 44 5f 53 49  and.** SHARED_SI
9b60: 5a 45 2e 20 20 49 66 20 53 51 4c 49 54 45 5f 57  ZE.  If SQLITE_W
9b70: 48 4f 4c 45 5f 46 49 4c 45 5f 4c 4f 43 4b 49 4e  HOLE_FILE_LOCKIN
9b80: 47 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 6c  G is set, then l
9b90: 6f 63 6b 20 61 6c 6c 0a 2a 2a 20 62 79 74 65 73  ock all.** bytes
9ba0: 20 66 72 6f 6d 20 30 20 75 70 20 74 6f 20 62 75   from 0 up to bu
9bb0: 74 20 6e 6f 74 20 69 6e 63 6c 75 64 69 6e 67 20  t not including 
9bc0: 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 61 6e  PENDING_BYTE, an
9bd0: 64 20 61 6c 6c 20 62 79 74 65 73 0a 2a 2a 20 74  d all bytes.** t
9be0: 68 61 74 20 66 6f 6c 6c 6f 77 20 53 48 41 52 45  hat follow SHARE
9bf0: 44 5f 46 49 52 53 54 2e 0a 2a 2a 0a 2a 2a 20 49  D_FIRST..**.** I
9c00: 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 6f  n other words, o
9c10: 66 20 53 51 4c 49 54 45 5f 57 48 4f 4c 45 5f 46  f SQLITE_WHOLE_F
9c20: 49 4c 45 5f 4c 4f 43 4b 49 4e 47 20 69 66 20 66  ILE_LOCKING if f
9c30: 61 6c 73 65 20 28 74 68 65 20 68 69 73 74 6f 72  alse (the histor
9c40: 69 63 61 6c 0a 2a 2a 20 64 65 66 61 75 6c 74 20  ical.** default 
9c50: 63 61 73 65 29 20 74 68 65 6e 20 6f 6e 6c 79 20  case) then only 
9c60: 6c 6f 63 6b 20 61 20 73 6d 61 6c 6c 20 72 61 6e  lock a small ran
9c70: 67 65 20 6f 66 20 62 79 74 65 73 20 66 72 6f 6d  ge of bytes from
9c80: 20 53 48 41 52 45 44 5f 46 49 52 53 54 0a 2a 2a   SHARED_FIRST.**
9c90: 20 74 68 72 6f 75 67 68 20 53 48 41 52 45 44 5f   through SHARED_
9ca0: 46 49 52 53 54 2b 53 48 41 52 45 44 5f 53 49 5a  FIRST+SHARED_SIZ
9cb0: 45 2d 31 2e 20 20 42 75 74 20 69 66 20 53 51 4c  E-1.  But if SQL
9cc0: 49 54 45 5f 57 48 4f 4c 45 5f 46 49 4c 45 5f 4c  ITE_WHOLE_FILE_L
9cd0: 4f 43 4b 49 4e 47 20 69 73 0a 2a 2a 20 74 72 75  OCKING is.** tru
9ce0: 65 20 74 68 65 6e 20 6c 6f 63 6b 20 65 76 65 72  e then lock ever
9cf0: 79 20 62 79 74 65 20 69 6e 20 74 68 65 20 66 69  y byte in the fi
9d00: 6c 65 20 65 78 63 65 70 74 20 66 6f 72 20 50 45  le except for PE
9d10: 4e 44 49 4e 47 5f 42 59 54 45 20 61 6e 64 0a 2a  NDING_BYTE and.*
9d20: 2a 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2e  * RESERVED_BYTE.
9d30: 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 57 48  .**.** SQLITE_WH
9d40: 4f 4c 45 5f 46 49 4c 45 5f 4c 4f 43 4b 49 4e 47  OLE_FILE_LOCKING
9d50: 3d 74 72 75 65 20 6f 76 65 72 6c 61 70 73 20 53  =true overlaps S
9d60: 51 4c 49 54 45 5f 57 48 4f 4c 45 5f 46 49 4c 45  QLITE_WHOLE_FILE
9d70: 5f 4c 4f 43 4b 49 4e 47 3d 66 61 6c 73 65 0a 2a  _LOCKING=false.*
9d80: 2a 20 61 6e 64 20 73 6f 20 74 68 65 20 6c 6f 63  * and so the loc
9d90: 6b 69 6e 67 20 73 63 68 65 6d 65 73 20 61 72 65  king schemes are
9da0: 20 63 6f 6d 70 61 74 69 62 6c 65 2e 20 20 4f 6e   compatible.  On
9db0: 65 20 74 79 70 65 20 6f 66 20 6c 6f 63 6b 20 77  e type of lock w
9dc0: 69 6c 6c 0a 2a 2a 20 65 66 66 65 63 74 69 76 65  ill.** effective
9dd0: 6c 79 20 65 78 63 6c 75 64 65 20 74 68 65 20 6f  ly exclude the o
9de0: 74 68 65 72 20 74 79 70 65 2e 20 20 54 68 65 20  ther type.  The 
9df0: 72 65 61 73 6f 6e 20 66 6f 72 20 75 73 69 6e 67  reason for using
9e00: 20 74 68 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 57   the.** SQLITE_W
9e10: 48 4f 4c 45 5f 46 49 4c 45 5f 4c 4f 43 4b 49 4e  HOLE_FILE_LOCKIN
9e20: 47 3d 74 72 75 65 20 69 73 20 74 68 61 74 20 62  G=true is that b
9e30: 79 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68 65  y indicating the
9e40: 20 66 75 6c 6c 20 72 61 6e 67 65 0a 2a 2a 20 6f   full range.** o
9e50: 66 20 62 79 74 65 73 20 74 6f 20 62 65 20 72 65  f bytes to be re
9e60: 61 64 20 6f 72 20 77 72 69 74 74 65 6e 2c 20 77  ad or written, w
9e70: 65 20 67 69 76 65 20 68 69 6e 74 73 20 74 6f 20  e give hints to 
9e80: 4e 46 53 20 74 6f 20 68 65 6c 70 20 69 74 0a 2a  NFS to help it.*
9e90: 2a 20 6d 61 69 6e 74 61 69 6e 20 63 61 63 68 65  * maintain cache
9ea0: 20 63 6f 68 65 72 65 6e 63 79 2e 20 20 4f 6e 20   coherency.  On 
9eb0: 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20  the other hand, 
9ec0: 77 68 6f 6c 65 20 66 69 6c 65 20 6c 6f 63 6b 69  whole file locki
9ed0: 6e 67 0a 2a 2a 20 69 73 20 73 6c 6f 77 65 72 2c  ng.** is slower,
9ee0: 20 73 6f 20 77 65 20 64 6f 6e 27 74 20 77 61 6e   so we don't wan
9ef0: 74 20 74 6f 20 75 73 65 20 69 74 20 65 78 63 65  t to use it exce
9f00: 70 74 20 66 6f 72 20 4e 46 53 2e 0a 2a 2f 0a 73  pt for NFS..*/.s
9f10: 74 61 74 69 63 20 69 6e 74 20 72 61 6e 67 65 4c  tatic int rangeL
9f20: 6f 63 6b 28 75 6e 69 78 46 69 6c 65 20 2a 70 46  ock(unixFile *pF
9f30: 69 6c 65 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74  ile, int op, int
9f40: 20 2a 70 45 72 72 63 6f 64 65 29 7b 0a 20 20 73   *pErrcode){.  s
9f50: 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b  truct flock lock
9f60: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 6c 6f  ;.  int rc;.  lo
9f70: 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 6f 70 3b 0a  ck.l_type = op;.
9f80: 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
9f90: 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20   SHARED_FIRST;. 
9fa0: 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d   lock.l_whence =
9fb0: 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 69 66 28   SEEK_SET;.  if(
9fc0: 20 28 70 46 69 6c 65 2d 3e 66 69 6c 65 46 6c 61   (pFile->fileFla
9fd0: 67 73 20 26 20 53 51 4c 49 54 45 5f 57 48 4f 4c  gs & SQLITE_WHOL
9fe0: 45 5f 46 49 4c 45 5f 4c 4f 43 4b 49 4e 47 29 3d  E_FILE_LOCKING)=
9ff0: 3d 30 20 29 7b 0a 20 20 20 20 6c 6f 63 6b 2e 6c  =0 ){.    lock.l
a000: 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49  _len = SHARED_SI
a010: 5a 45 3b 0a 20 20 20 20 72 63 20 3d 20 66 63 6e  ZE;.    rc = fcn
a020: 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53  tl(pFile->h, F_S
a030: 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3b 0a 20 20  ETLK, &lock);.  
a040: 20 20 2a 70 45 72 72 63 6f 64 65 20 3d 20 65 72    *pErrcode = er
a050: 72 6e 6f 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  rno;.  }else{.  
a060: 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 30    lock.l_len = 0
a070: 3b 0a 20 20 20 20 72 63 20 3d 20 66 63 6e 74 6c  ;.    rc = fcntl
a080: 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54  (pFile->h, F_SET
a090: 4c 4b 2c 20 26 6c 6f 63 6b 29 3b 0a 20 20 20 20  LK, &lock);.    
a0a0: 2a 70 45 72 72 63 6f 64 65 20 3d 20 65 72 72 6e  *pErrcode = errn
a0b0: 6f 3b 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52  o;.    if( NEVER
a0c0: 28 6f 70 3d 3d 46 5f 55 4e 4c 43 4b 29 20 7c 7c  (op==F_UNLCK) ||
a0d0: 20 72 63 21 3d 28 2d 31 29 20 29 7b 0a 20 20 20   rc!=(-1) ){.   
a0e0: 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20     lock.l_start 
a0f0: 3d 20 30 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e  = 0;.      lock.
a100: 6c 5f 6c 65 6e 20 3d 20 50 45 4e 44 49 4e 47 5f  l_len = PENDING_
a110: 42 59 54 45 3b 0a 20 20 20 20 20 20 72 63 20 3d  BYTE;.      rc =
a120: 20 66 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c   fcntl(pFile->h,
a130: 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29   F_SETLK, &lock)
a140: 3b 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57 41  ;.      if( ALWA
a150: 59 53 28 6f 70 21 3d 46 5f 55 4e 4c 43 4b 29 20  YS(op!=F_UNLCK) 
a160: 26 26 20 72 63 3d 3d 28 2d 31 29 20 29 7b 0a 20  && rc==(-1) ){. 
a170: 20 20 20 20 20 20 20 2a 70 45 72 72 63 6f 64 65         *pErrcode
a180: 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
a190: 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20    lock.l_type = 
a1a0: 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 20 20 20  F_UNLCK;.       
a1b0: 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
a1c0: 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20  SHARED_FIRST;.  
a1d0: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e        lock.l_len
a1e0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 66 63   = 0;.        fc
a1f0: 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f  ntl(pFile->h, F_
a200: 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3b 0a 20  SETLK, &lock);. 
a210: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
a220: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
a230: 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20  ./*.** Lock the 
a240: 66 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f  file with the lo
a250: 63 6b 20 73 70 65 63 69 66 69 65 64 20 62 79 20  ck specified by 
a260: 70 61 72 61 6d 65 74 65 72 20 6c 6f 63 6b 74 79  parameter lockty
a270: 70 65 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74  pe - one.** of t
a280: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a  he following:.**
a290: 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41 52  .**     (1) SHAR
a2a0: 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  ED_LOCK.**     (
a2b0: 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  2) RESERVED_LOCK
a2c0: 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44  .**     (3) PEND
a2d0: 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  ING_LOCK.**     
a2e0: 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  (4) EXCLUSIVE_LO
a2f0: 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d  CK.**.** Sometim
a300: 65 73 20 77 68 65 6e 20 72 65 71 75 65 73 74 69  es when requesti
a310: 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74  ng one lock stat
a320: 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f  e, additional lo
a330: 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65  ck states.** are
a340: 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74   inserted in bet
a350: 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69  ween.  The locki
a360: 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e  ng might fail on
a370: 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65   one of the late
a380: 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73  r.** transitions
a390: 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63   leaving the loc
a3a0: 6b 20 73 74 61 74 65 20 64 69 66 66 65 72 65 6e  k state differen
a3b0: 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73  t from what it s
a3c0: 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74  tarted but.** st
a3d0: 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73  ill short of its
a3e0: 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c   goal.  The foll
a3f0: 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77  owing chart show
a400: 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a  s the allowed.**
a410: 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64   transitions and
a420: 20 74 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e   the inserted in
a430: 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65  termediate state
a440: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f  s:.**.**    UNLO
a450: 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a  CKED -> SHARED.*
a460: 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52  *    SHARED -> R
a470: 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48  ESERVED.**    SH
a480: 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47  ARED -> (PENDING
a490: 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  ) -> EXCLUSIVE.*
a4a0: 2a 20 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e  *    RESERVED ->
a4b0: 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58   (PENDING) -> EX
a4c0: 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45  CLUSIVE.**    PE
a4d0: 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49  NDING -> EXCLUSI
a4e0: 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  VE.**.** This ro
a4f0: 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20  utine will only 
a500: 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e  increase a lock.
a510: 20 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65    Use the sqlite
a520: 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72  3OsUnlock().** r
a530: 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20  outine to lower 
a540: 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e  a locking level.
a550: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
a560: 6e 69 78 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  nixLock(sqlite3_
a570: 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f  file *id, int lo
a580: 63 6b 74 79 70 65 29 7b 0a 20 20 2f 2a 20 54 68  cktype){.  /* Th
a590: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 64 65 73 63  e following desc
a5a0: 72 69 62 65 73 20 74 68 65 20 69 6d 70 6c 65 6d  ribes the implem
a5b0: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
a5c0: 76 61 72 69 6f 75 73 20 6c 6f 63 6b 73 20 61 6e  various locks an
a5d0: 64 0a 20 20 2a 2a 20 6c 6f 63 6b 20 74 72 61 6e  d.  ** lock tran
a5e0: 73 69 74 69 6f 6e 73 20 69 6e 20 74 65 72 6d 73  sitions in terms
a5f0: 20 6f 66 20 74 68 65 20 50 4f 53 49 58 20 61 64   of the POSIX ad
a600: 76 69 73 6f 72 79 20 73 68 61 72 65 64 20 61 6e  visory shared an
a610: 64 20 65 78 63 6c 75 73 69 76 65 0a 20 20 2a 2a  d exclusive.  **
a620: 20 6c 6f 63 6b 20 70 72 69 6d 69 74 69 76 65 73   lock primitives
a630: 20 28 63 61 6c 6c 65 64 20 72 65 61 64 2d 6c 6f   (called read-lo
a640: 63 6b 73 20 61 6e 64 20 77 72 69 74 65 2d 6c 6f  cks and write-lo
a650: 63 6b 73 20 62 65 6c 6f 77 2c 20 74 6f 20 61 76  cks below, to av
a660: 6f 69 64 0a 20 20 2a 2a 20 63 6f 6e 66 75 73 69  oid.  ** confusi
a670: 6f 6e 20 77 69 74 68 20 53 51 4c 69 74 65 20 6c  on with SQLite l
a680: 6f 63 6b 20 6e 61 6d 65 73 29 2e 20 54 68 65 20  ock names). The 
a690: 61 6c 67 6f 72 69 74 68 6d 73 20 61 72 65 20 63  algorithms are c
a6a0: 6f 6d 70 6c 69 63 61 74 65 64 0a 20 20 2a 2a 20  omplicated.  ** 
a6b0: 73 6c 69 67 68 74 6c 79 20 69 6e 20 6f 72 64 65  slightly in orde
a6c0: 72 20 74 6f 20 62 65 20 63 6f 6d 70 61 74 69 62  r to be compatib
a6d0: 6c 65 20 77 69 74 68 20 77 69 6e 64 6f 77 73 20  le with windows 
a6e0: 73 79 73 74 65 6d 73 20 73 69 6d 75 6c 74 61 6e  systems simultan
a6f0: 65 6f 75 73 6c 79 0a 20 20 2a 2a 20 61 63 63 65  eously.  ** acce
a700: 73 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20 64  ssing the same d
a710: 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69 6e  atabase file, in
a720: 20 63 61 73 65 20 74 68 61 74 20 69 73 20 65 76   case that is ev
a730: 65 72 20 72 65 71 75 69 72 65 64 2e 0a 20 20 2a  er required..  *
a740: 2a 0a 20 20 2a 2a 20 53 79 6d 62 6f 6c 73 20 64  *.  ** Symbols d
a750: 65 66 69 6e 65 64 20 69 6e 20 6f 73 2e 68 20 69  efined in os.h i
a760: 6e 64 65 6e 74 69 66 79 20 74 68 65 20 27 70 65  ndentify the 'pe
a770: 6e 64 69 6e 67 20 62 79 74 65 27 20 61 6e 64 20  nding byte' and 
a780: 74 68 65 20 27 72 65 73 65 72 76 65 64 0a 20 20  the 'reserved.  
a790: 2a 2a 20 62 79 74 65 27 2c 20 65 61 63 68 20 73  ** byte', each s
a7a0: 69 6e 67 6c 65 20 62 79 74 65 73 20 61 74 20 77  ingle bytes at w
a7b0: 65 6c 6c 20 6b 6e 6f 77 6e 20 6f 66 66 73 65 74  ell known offset
a7c0: 73 2c 20 61 6e 64 20 74 68 65 20 27 73 68 61 72  s, and the 'shar
a7d0: 65 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e  ed byte.  ** ran
a7e0: 67 65 27 2c 20 61 20 72 61 6e 67 65 20 6f 66 20  ge', a range of 
a7f0: 35 31 30 20 62 79 74 65 73 20 61 74 20 61 20 77  510 bytes at a w
a800: 65 6c 6c 20 6b 6e 6f 77 6e 20 6f 66 66 73 65 74  ell known offset
a810: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 6f 20 6f  ..  **.  ** To o
a820: 62 74 61 69 6e 20 61 20 53 48 41 52 45 44 20 6c  btain a SHARED l
a830: 6f 63 6b 2c 20 61 20 72 65 61 64 2d 6c 6f 63 6b  ock, a read-lock
a840: 20 69 73 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20   is obtained on 
a850: 74 68 65 20 27 70 65 6e 64 69 6e 67 0a 20 20 2a  the 'pending.  *
a860: 2a 20 62 79 74 65 27 2e 20 20 49 66 20 74 68 69  * byte'.  If thi
a870: 73 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c  s is successful,
a880: 20 61 20 72 61 6e 64 6f 6d 20 62 79 74 65 20 66   a random byte f
a890: 72 6f 6d 20 74 68 65 20 27 73 68 61 72 65 64 20  rom the 'shared 
a8a0: 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27  byte.  ** range'
a8b0: 20 69 73 20 72 65 61 64 2d 6c 6f 63 6b 65 64 20   is read-locked 
a8c0: 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20  and the lock on 
a8d0: 74 68 65 20 27 70 65 6e 64 69 6e 67 20 62 79 74  the 'pending byt
a8e0: 65 27 20 72 65 6c 65 61 73 65 64 2e 0a 20 20 2a  e' released..  *
a8f0: 2a 0a 20 20 2a 2a 20 41 20 70 72 6f 63 65 73 73  *.  ** A process
a900: 20 6d 61 79 20 6f 6e 6c 79 20 6f 62 74 61 69 6e   may only obtain
a910: 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
a920: 20 61 66 74 65 72 20 69 74 20 68 61 73 20 61 20   after it has a 
a930: 53 48 41 52 45 44 20 6c 6f 63 6b 2e 0a 20 20 2a  SHARED lock..  *
a940: 2a 20 41 20 52 45 53 45 52 56 45 44 20 6c 6f 63  * A RESERVED loc
a950: 6b 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64  k is implemented
a960: 20 62 79 20 67 72 61 62 62 69 6e 67 20 61 20 77   by grabbing a w
a970: 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65  rite-lock on the
a980: 0a 20 20 2a 2a 20 27 72 65 73 65 72 76 65 64 20  .  ** 'reserved 
a990: 62 79 74 65 27 2e 20 0a 20 20 2a 2a 0a 20 20 2a  byte'. .  **.  *
a9a0: 2a 20 41 20 70 72 6f 63 65 73 73 20 6d 61 79 20  * A process may 
a9b0: 6f 6e 6c 79 20 6f 62 74 61 69 6e 20 61 20 50 45  only obtain a PE
a9c0: 4e 44 49 4e 47 20 6c 6f 63 6b 20 61 66 74 65 72  NDING lock after
a9d0: 20 69 74 20 68 61 73 20 6f 62 74 61 69 6e 65 64   it has obtained
a9e0: 20 61 0a 20 20 2a 2a 20 53 48 41 52 45 44 20 6c   a.  ** SHARED l
a9f0: 6f 63 6b 2e 20 41 20 50 45 4e 44 49 4e 47 20 6c  ock. A PENDING l
aa00: 6f 63 6b 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74  ock is implement
aa10: 65 64 20 62 79 20 6f 62 74 61 69 6e 69 6e 67 20  ed by obtaining 
aa20: 61 20 77 72 69 74 65 2d 6c 6f 63 6b 0a 20 20 2a  a write-lock.  *
aa30: 2a 20 6f 6e 20 74 68 65 20 27 70 65 6e 64 69 6e  * on the 'pendin
aa40: 67 20 62 79 74 65 27 2e 20 54 68 69 73 20 65 6e  g byte'. This en
aa50: 73 75 72 65 73 20 74 68 61 74 20 6e 6f 20 6e 65  sures that no ne
aa60: 77 20 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 63  w SHARED locks c
aa70: 61 6e 20 62 65 0a 20 20 2a 2a 20 6f 62 74 61 69  an be.  ** obtai
aa80: 6e 65 64 2c 20 62 75 74 20 65 78 69 73 74 69 6e  ned, but existin
aa90: 67 20 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 61  g SHARED locks a
aaa0: 72 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20 70 65  re allowed to pe
aab0: 72 73 69 73 74 2e 20 41 20 70 72 6f 63 65 73 73  rsist. A process
aac0: 0a 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 68  .  ** does not h
aad0: 61 76 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 20  ave to obtain a 
aae0: 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e  RESERVED lock on
aaf0: 20 74 68 65 20 77 61 79 20 74 6f 20 61 20 50 45   the way to a PE
ab00: 4e 44 49 4e 47 20 6c 6f 63 6b 2e 0a 20 20 2a 2a  NDING lock..  **
ab10: 20 54 68 69 73 20 70 72 6f 70 65 72 74 79 20 69   This property i
ab20: 73 20 75 73 65 64 20 62 79 20 74 68 65 20 61 6c  s used by the al
ab30: 67 6f 72 69 74 68 6d 20 66 6f 72 20 72 6f 6c 6c  gorithm for roll
ab40: 69 6e 67 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e  ing back a journ
ab50: 61 6c 20 66 69 6c 65 0a 20 20 2a 2a 20 61 66 74  al file.  ** aft
ab60: 65 72 20 61 20 63 72 61 73 68 2e 0a 20 20 2a 2a  er a crash..  **
ab70: 0a 20 20 2a 2a 20 41 6e 20 45 58 43 4c 55 53 49  .  ** An EXCLUSI
ab80: 56 45 20 6c 6f 63 6b 2c 20 6f 62 74 61 69 6e 65  VE lock, obtaine
ab90: 64 20 61 66 74 65 72 20 61 20 50 45 4e 44 49 4e  d after a PENDIN
aba0: 47 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20  G lock is held, 
abb0: 69 73 0a 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e  is.  ** implemen
abc0: 74 65 64 20 62 79 20 6f 62 74 61 69 6e 69 6e 67  ted by obtaining
abd0: 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e   a write-lock on
abe0: 20 74 68 65 20 65 6e 74 69 72 65 20 27 73 68 61   the entire 'sha
abf0: 72 65 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61  red byte.  ** ra
ac00: 6e 67 65 27 2e 20 53 69 6e 63 65 20 61 6c 6c 20  nge'. Since all 
ac10: 6f 74 68 65 72 20 6c 6f 63 6b 73 20 72 65 71 75  other locks requ
ac20: 69 72 65 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  ire a read-lock 
ac30: 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 62 79  on one of the by
ac40: 74 65 73 0a 20 20 2a 2a 20 77 69 74 68 69 6e 20  tes.  ** within 
ac50: 74 68 69 73 20 72 61 6e 67 65 2c 20 74 68 69 73  this range, this
ac60: 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 6e 6f   ensures that no
ac70: 20 6f 74 68 65 72 20 6c 6f 63 6b 73 20 61 72 65   other locks are
ac80: 20 68 65 6c 64 20 6f 6e 20 74 68 65 0a 20 20 2a   held on the.  *
ac90: 2a 20 64 61 74 61 62 61 73 65 2e 20 0a 20 20 2a  * database. .  *
aca0: 2a 0a 20 20 2a 2a 20 54 68 65 20 72 65 61 73 6f  *.  ** The reaso
acb0: 6e 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20  n a single byte 
acc0: 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 20 69  cannot be used i
acd0: 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20 27 73  nstead of the 's
ace0: 68 61 72 65 64 20 62 79 74 65 0a 20 20 2a 2a 20  hared byte.  ** 
acf0: 72 61 6e 67 65 27 20 69 73 20 74 68 61 74 20 73  range' is that s
ad00: 6f 6d 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  ome versions of 
ad10: 77 69 6e 64 6f 77 73 20 64 6f 20 6e 6f 74 20 73  windows do not s
ad20: 75 70 70 6f 72 74 20 72 65 61 64 2d 6c 6f 63 6b  upport read-lock
ad30: 73 2e 20 42 79 0a 20 20 2a 2a 20 6c 6f 63 6b 69  s. By.  ** locki
ad40: 6e 67 20 61 20 72 61 6e 64 6f 6d 20 62 79 74 65  ng a random byte
ad50: 20 66 72 6f 6d 20 61 20 72 61 6e 67 65 2c 20 63   from a range, c
ad60: 6f 6e 63 75 72 72 65 6e 74 20 53 48 41 52 45 44  oncurrent SHARED
ad70: 20 6c 6f 63 6b 73 20 6d 61 79 20 65 78 69 73 74   locks may exist
ad80: 0a 20 20 2a 2a 20 65 76 65 6e 20 69 66 20 74 68  .  ** even if th
ad90: 65 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69 74  e locking primit
ada0: 69 76 65 20 75 73 65 64 20 69 73 20 61 6c 77 61  ive used is alwa
adb0: 79 73 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 2e  ys a write-lock.
adc0: 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  .  */.  int rc =
add0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e   SQLITE_OK;.  un
ade0: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
adf0: 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
ae00: 20 73 74 72 75 63 74 20 75 6e 69 78 4c 6f 63 6b   struct unixLock
ae10: 49 6e 66 6f 20 2a 70 4c 6f 63 6b 20 3d 20 70 46  Info *pLock = pF
ae20: 69 6c 65 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 73 74  ile->pLock;.  st
ae30: 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b  ruct flock lock;
ae40: 0a 20 20 69 6e 74 20 73 3b 0a 20 20 69 6e 74 20  .  int s;.  int 
ae50: 74 45 72 72 6e 6f 3b 0a 0a 20 20 61 73 73 65 72  tErrno;..  asser
ae60: 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53  t( pFile );.  OS
ae70: 54 52 41 43 45 37 28 22 4c 4f 43 4b 20 20 20 20  TRACE7("LOCK    
ae80: 25 64 20 25 73 20 77 61 73 20 25 73 28 25 73 2c  %d %s was %s(%s,
ae90: 25 64 29 20 70 69 64 3d 25 64 5c 6e 22 2c 20 70  %d) pid=%d\n", p
aea0: 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 6c  File->h,.      l
aeb0: 6f 63 6b 74 79 70 65 4e 61 6d 65 28 6c 6f 63 6b  ocktypeName(lock
aec0: 74 79 70 65 29 2c 20 6c 6f 63 6b 74 79 70 65 4e  type), locktypeN
aed0: 61 6d 65 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  ame(pFile->lockt
aee0: 79 70 65 29 2c 0a 20 20 20 20 20 20 6c 6f 63 6b  ype),.      lock
aef0: 74 79 70 65 4e 61 6d 65 28 70 4c 6f 63 6b 2d 3e  typeName(pLock->
af00: 6c 6f 63 6b 74 79 70 65 29 2c 20 70 4c 6f 63 6b  locktype), pLock
af10: 2d 3e 63 6e 74 20 2c 20 67 65 74 70 69 64 28 29  ->cnt , getpid()
af20: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  );..  /* If ther
af30: 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 6c  e is already a l
af40: 6f 63 6b 20 6f 66 20 74 68 69 73 20 74 79 70 65  ock of this type
af50: 20 6f 72 20 6d 6f 72 65 20 72 65 73 74 72 69 63   or more restric
af60: 74 69 76 65 20 6f 6e 20 74 68 65 0a 20 20 2a 2a  tive on the.  **
af70: 20 75 6e 69 78 46 69 6c 65 2c 20 64 6f 20 6e 6f   unixFile, do no
af80: 74 68 69 6e 67 2e 20 44 6f 6e 27 74 20 75 73 65  thing. Don't use
af90: 20 74 68 65 20 65 6e 64 5f 6c 6f 63 6b 3a 20 65   the end_lock: e
afa0: 78 69 74 20 70 61 74 68 2c 20 61 73 0a 20 20 2a  xit path, as.  *
afb0: 2a 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78  * unixEnterMutex
afc0: 28 29 20 68 61 73 6e 27 74 20 62 65 65 6e 20 63  () hasn't been c
afd0: 61 6c 6c 65 64 20 79 65 74 2e 0a 20 20 2a 2f 0a  alled yet..  */.
afe0: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63    if( pFile->loc
aff0: 6b 74 79 70 65 3e 3d 6c 6f 63 6b 74 79 70 65 20  ktype>=locktype 
b000: 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 33 28  ){.    OSTRACE3(
b010: 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 6f  "LOCK    %d %s o
b020: 6b 20 28 61 6c 72 65 61 64 79 20 68 65 6c 64 29  k (already held)
b030: 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20  \n", pFile->h,. 
b040: 20 20 20 20 20 20 20 20 20 20 20 6c 6f 63 6b 74             lockt
b050: 79 70 65 4e 61 6d 65 28 6c 6f 63 6b 74 79 70 65  ypeName(locktype
b060: 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ));.    return S
b070: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
b080: 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68   /* Make sure th
b090: 65 20 6c 6f 63 6b 69 6e 67 20 73 65 71 75 65 6e  e locking sequen
b0a0: 63 65 20 69 73 20 63 6f 72 72 65 63 74 2e 0a 20  ce is correct.. 
b0b0: 20 2a 2a 20 20 28 31 29 20 57 65 20 6e 65 76 65   **  (1) We neve
b0c0: 72 20 6d 6f 76 65 20 66 72 6f 6d 20 75 6e 6c 6f  r move from unlo
b0d0: 63 6b 65 64 20 74 6f 20 61 6e 79 74 68 69 6e 67  cked to anything
b0e0: 20 68 69 67 68 65 72 20 74 68 61 6e 20 73 68 61   higher than sha
b0f0: 72 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20  red lock..  **  
b100: 28 32 29 20 53 51 4c 69 74 65 20 6e 65 76 65 72  (2) SQLite never
b110: 20 65 78 70 6c 69 63 69 74 6c 79 20 72 65 71 75   explicitly requ
b120: 65 73 74 73 20 61 20 70 65 6e 64 69 67 20 6c 6f  ests a pendig lo
b130: 63 6b 2e 0a 20 20 2a 2a 20 20 28 33 29 20 41 20  ck..  **  (3) A 
b140: 73 68 61 72 65 64 20 6c 6f 63 6b 20 69 73 20 61  shared lock is a
b150: 6c 77 61 79 73 20 68 65 6c 64 20 77 68 65 6e 20  lways held when 
b160: 61 20 72 65 73 65 72 76 65 20 6c 6f 63 6b 20 69  a reserve lock i
b170: 73 20 72 65 71 75 65 73 74 65 64 2e 0a 20 20 2a  s requested..  *
b180: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  /.  assert( pFil
b190: 65 2d 3e 6c 6f 63 6b 74 79 70 65 21 3d 4e 4f 5f  e->locktype!=NO_
b1a0: 4c 4f 43 4b 20 7c 7c 20 6c 6f 63 6b 74 79 70 65  LOCK || locktype
b1b0: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  ==SHARED_LOCK );
b1c0: 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74  .  assert( lockt
b1d0: 79 70 65 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43  ype!=PENDING_LOC
b1e0: 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6c  K );.  assert( l
b1f0: 6f 63 6b 74 79 70 65 21 3d 52 45 53 45 52 56 45  ocktype!=RESERVE
b200: 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c 65 2d  D_LOCK || pFile-
b210: 3e 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45  >locktype==SHARE
b220: 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20  D_LOCK );..  /* 
b230: 54 68 69 73 20 6d 75 74 65 78 20 69 73 20 6e 65  This mutex is ne
b240: 65 64 65 64 20 62 65 63 61 75 73 65 20 70 46 69  eded because pFi
b250: 6c 65 2d 3e 70 4c 6f 63 6b 20 69 73 20 73 68 61  le->pLock is sha
b260: 72 65 64 20 61 63 72 6f 73 73 20 74 68 72 65 61  red across threa
b270: 64 73 0a 20 20 2a 2f 0a 20 20 75 6e 69 78 45 6e  ds.  */.  unixEn
b280: 74 65 72 4d 75 74 65 78 28 29 3b 0a 0a 20 20 2f  terMutex();..  /
b290: 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
b2a0: 63 75 72 72 65 6e 74 20 74 68 72 65 61 64 20 6f  current thread o
b2b0: 77 6e 73 20 74 68 65 20 70 46 69 6c 65 2e 0a 20  wns the pFile.. 
b2c0: 20 2a 2f 0a 20 20 72 63 20 3d 20 74 72 61 6e 73   */.  rc = trans
b2d0: 66 65 72 4f 77 6e 65 72 73 68 69 70 28 70 46 69  ferOwnership(pFi
b2e0: 6c 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  le);.  if( rc!=S
b2f0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
b300: 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
b310: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
b320: 0a 20 20 7d 0a 20 20 70 4c 6f 63 6b 20 3d 20 70  .  }.  pLock = p
b330: 46 69 6c 65 2d 3e 70 4c 6f 63 6b 3b 0a 0a 20 20  File->pLock;..  
b340: 2f 2a 20 49 66 20 73 6f 6d 65 20 74 68 72 65 61  /* If some threa
b350: 64 20 75 73 69 6e 67 20 74 68 69 73 20 50 49 44  d using this PID
b360: 20 68 61 73 20 61 20 6c 6f 63 6b 20 76 69 61 20   has a lock via 
b370: 61 20 64 69 66 66 65 72 65 6e 74 20 75 6e 69 78  a different unix
b380: 46 69 6c 65 2a 0a 20 20 2a 2a 20 68 61 6e 64 6c  File*.  ** handl
b390: 65 20 74 68 61 74 20 70 72 65 63 6c 75 64 65 73  e that precludes
b3a0: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
b3b0: 6f 63 6b 2c 20 72 65 74 75 72 6e 20 42 55 53 59  ock, return BUSY
b3c0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 46  ..  */.  if( (pF
b3d0: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 21 3d 70  ile->locktype!=p
b3e0: 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 20 26  Lock->locktype &
b3f0: 26 20 0a 20 20 20 20 20 20 20 20 20 20 28 70 4c  & .          (pL
b400: 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 50  ock->locktype>=P
b410: 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 7c 7c 20 6c  ENDING_LOCK || l
b420: 6f 63 6b 74 79 70 65 3e 53 48 41 52 45 44 5f 4c  ocktype>SHARED_L
b430: 4f 43 4b 29 29 0a 20 20 29 7b 0a 20 20 20 20 72  OCK)).  ){.    r
b440: 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
b450: 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f  .    goto end_lo
b460: 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  ck;.  }..  /* If
b470: 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69   a SHARED lock i
b480: 73 20 72 65 71 75 65 73 74 65 64 2c 20 61 6e 64  s requested, and
b490: 20 73 6f 6d 65 20 74 68 72 65 61 64 20 75 73 69   some thread usi
b4a0: 6e 67 20 74 68 69 73 20 50 49 44 20 61 6c 72 65  ng this PID alre
b4b0: 61 64 79 0a 20 20 2a 2a 20 68 61 73 20 61 20 53  ady.  ** has a S
b4c0: 48 41 52 45 44 20 6f 72 20 52 45 53 45 52 56 45  HARED or RESERVE
b4d0: 44 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 69 6e 63  D lock, then inc
b4e0: 72 65 6d 65 6e 74 20 72 65 66 65 72 65 6e 63 65  rement reference
b4f0: 20 63 6f 75 6e 74 73 20 61 6e 64 0a 20 20 2a 2a   counts and.  **
b500: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
b510: 4b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f  K..  */.  if( lo
b520: 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c  cktype==SHARED_L
b530: 4f 43 4b 20 26 26 20 0a 20 20 20 20 20 20 28 70  OCK && .      (p
b540: 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d  Lock->locktype==
b550: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70  SHARED_LOCK || p
b560: 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d  Lock->locktype==
b570: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 20 29  RESERVED_LOCK) )
b580: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6c 6f  {.    assert( lo
b590: 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c  cktype==SHARED_L
b5a0: 4f 43 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72  OCK );.    asser
b5b0: 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  t( pFile->lockty
b5c0: 70 65 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  pe==0 );.    ass
b5d0: 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 63 6e 74 3e  ert( pLock->cnt>
b5e0: 30 20 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  0 );.    pFile->
b5f0: 6c 6f 63 6b 74 79 70 65 20 3d 20 53 48 41 52 45  locktype = SHARE
b600: 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 4c 6f 63  D_LOCK;.    pLoc
b610: 6b 2d 3e 63 6e 74 2b 2b 3b 0a 20 20 20 20 70 46  k->cnt++;.    pF
b620: 69 6c 65 2d 3e 70 4f 70 65 6e 2d 3e 6e 4c 6f 63  ile->pOpen->nLoc
b630: 6b 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  k++;.    goto en
b640: 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 0a 20 20  d_lock;.  }...  
b650: 2f 2a 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63  /* A PENDING loc
b660: 6b 20 69 73 20 6e 65 65 64 65 64 20 62 65 66 6f  k is needed befo
b670: 72 65 20 61 63 71 75 69 72 69 6e 67 20 61 20 53  re acquiring a S
b680: 48 41 52 45 44 20 6c 6f 63 6b 20 61 6e 64 20 62  HARED lock and b
b690: 65 66 6f 72 65 0a 20 20 2a 2a 20 61 63 71 75 69  efore.  ** acqui
b6a0: 72 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56  ring an EXCLUSIV
b6b0: 45 20 6c 6f 63 6b 2e 20 20 46 6f 72 20 74 68 65  E lock.  For the
b6c0: 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68   SHARED lock, th
b6d0: 65 20 50 45 4e 44 49 4e 47 20 77 69 6c 6c 0a 20  e PENDING will. 
b6e0: 20 2a 2a 20 62 65 20 72 65 6c 65 61 73 65 64 2e   ** be released.
b6f0: 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b 2e 6c 5f 6c  .  */.  lock.l_l
b700: 65 6e 20 3d 20 31 4c 3b 0a 20 20 6c 6f 63 6b 2e  en = 1L;.  lock.
b710: 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f  l_whence = SEEK_
b720: 53 45 54 3b 0a 20 20 69 66 28 20 6c 6f 63 6b 74  SET;.  if( lockt
b730: 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype==SHARED_LOCK
b740: 20 0a 20 20 20 20 20 20 7c 7c 20 28 6c 6f 63 6b   .      || (lock
b750: 74 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f  type==EXCLUSIVE_
b760: 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e 6c  LOCK && pFile->l
b770: 6f 63 6b 74 79 70 65 3c 50 45 4e 44 49 4e 47 5f  ocktype<PENDING_
b780: 4c 4f 43 4b 29 0a 20 20 29 7b 0a 20 20 20 20 6c  LOCK).  ){.    l
b790: 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 28 6c 6f  ock.l_type = (lo
b7a0: 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c  cktype==SHARED_L
b7b0: 4f 43 4b 3f 46 5f 52 44 4c 43 4b 3a 46 5f 57 52  OCK?F_RDLCK:F_WR
b7c0: 4c 43 4b 29 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c  LCK);.    lock.l
b7d0: 5f 73 74 61 72 74 20 3d 20 50 45 4e 44 49 4e 47  _start = PENDING
b7e0: 5f 42 59 54 45 3b 0a 20 20 20 20 73 20 3d 20 66  _BYTE;.    s = f
b7f0: 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46  cntl(pFile->h, F
b800: 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3b 0a  _SETLK, &lock);.
b810: 20 20 20 20 69 66 28 20 73 3d 3d 28 2d 31 29 20      if( s==(-1) 
b820: 29 7b 0a 20 20 20 20 20 20 74 45 72 72 6e 6f 20  ){.      tErrno 
b830: 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72  = errno;.      r
b840: 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  c = sqliteErrorF
b850: 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
b860: 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45  rrno, SQLITE_IOE
b870: 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  RR_LOCK);.      
b880: 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  if( IS_LOCK_ERRO
b890: 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20  R(rc) ){.       
b8a0: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
b8b0: 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20  o = tErrno;.    
b8c0: 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65    }.      goto e
b8d0: 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20  nd_lock;.    }. 
b8e0: 20 7d 0a 0a 0a 20 20 2f 2a 20 49 66 20 63 6f 6e   }...  /* If con
b8f0: 74 72 6f 6c 20 67 65 74 73 20 74 6f 20 74 68 69  trol gets to thi
b900: 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 61 63  s point, then ac
b910: 74 75 61 6c 6c 79 20 67 6f 20 61 68 65 61 64 20  tually go ahead 
b920: 61 6e 64 20 6d 61 6b 65 0a 20 20 2a 2a 20 6f 70  and make.  ** op
b930: 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 63  erating system c
b940: 61 6c 6c 73 20 66 6f 72 20 74 68 65 20 73 70 65  alls for the spe
b950: 63 69 66 69 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a  cified lock..  *
b960: 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65  /.  if( locktype
b970: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b  ==SHARED_LOCK ){
b980: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f  .    assert( pLo
b990: 63 6b 2d 3e 63 6e 74 3d 3d 30 20 29 3b 0a 20 20  ck->cnt==0 );.  
b9a0: 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d    assert( pLock-
b9b0: 3e 6c 6f 63 6b 74 79 70 65 3d 3d 30 20 29 3b 0a  >locktype==0 );.
b9c0: 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 67 65 74 20  .    /* Now get 
b9d0: 74 68 65 20 72 65 61 64 2d 6c 6f 63 6b 20 2a 2f  the read-lock */
b9e0: 0a 20 20 20 20 73 20 3d 20 72 61 6e 67 65 4c 6f  .    s = rangeLo
b9f0: 63 6b 28 70 46 69 6c 65 2c 20 46 5f 52 44 4c 43  ck(pFile, F_RDLC
ba00: 4b 2c 20 26 74 45 72 72 6e 6f 29 3b 0a 0a 20 20  K, &tErrno);..  
ba10: 20 20 2f 2a 20 44 72 6f 70 20 74 68 65 20 74 65    /* Drop the te
ba20: 6d 70 6f 72 61 72 79 20 50 45 4e 44 49 4e 47 20  mporary PENDING 
ba30: 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c 6f 63 6b  lock */.    lock
ba40: 2e 6c 5f 73 74 61 72 74 20 3d 20 50 45 4e 44 49  .l_start = PENDI
ba50: 4e 47 5f 42 59 54 45 3b 0a 20 20 20 20 6c 6f 63  NG_BYTE;.    loc
ba60: 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 20 20  k.l_len = 1L;.  
ba70: 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20    lock.l_type = 
ba80: 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 69 66 28  F_UNLCK;.    if(
ba90: 20 66 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c   fcntl(pFile->h,
baa0: 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29   F_SETLK, &lock)
bab0: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  !=0 ){.      if(
bac0: 20 73 20 21 3d 20 2d 31 20 29 7b 0a 20 20 20 20   s != -1 ){.    
bad0: 20 20 20 20 2f 2a 20 54 68 69 73 20 63 6f 75 6c      /* This coul
bae0: 64 20 68 61 70 70 65 6e 20 77 69 74 68 20 61 20  d happen with a 
baf0: 6e 65 74 77 6f 72 6b 20 6d 6f 75 6e 74 20 2a 2f  network mount */
bb00: 0a 20 20 20 20 20 20 20 20 74 45 72 72 6e 6f 20  .        tErrno 
bb10: 3d 20 65 72 72 6e 6f 3b 20 0a 20 20 20 20 20 20  = errno; .      
bb20: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72    rc = sqliteErr
bb30: 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72  orFromPosixError
bb40: 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f  (tErrno, SQLITE_
bb50: 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 20 0a  IOERR_UNLOCK); .
bb60: 20 20 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c          if( IS_L
bb70: 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b  OCK_ERROR(rc) ){
bb80: 0a 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65  .          pFile
bb90: 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45  ->lastErrno = tE
bba0: 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 7d 0a  rrno;.        }.
bbb0: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
bbc0: 5f 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  _lock;.      }. 
bbd0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 3d 3d     }.    if( s==
bbe0: 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 72 63  (-1) ){.      rc
bbf0: 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
bc00: 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
bc10: 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
bc20: 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69  R_LOCK);.      i
bc30: 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
bc40: 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20  (rc) ){.        
bc50: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
bc60: 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20   = tErrno;.     
bc70: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
bc80: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74      pFile->lockt
bc90: 79 70 65 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43  ype = SHARED_LOC
bca0: 4b 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  K;.      pFile->
bcb0: 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a  pOpen->nLock++;.
bcc0: 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 63 6e 74        pLock->cnt
bcd0: 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65   = 1;.    }.  }e
bce0: 6c 73 65 20 69 66 28 20 6c 6f 63 6b 74 79 70 65  lse if( locktype
bcf0: 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
bd00: 20 26 26 20 70 4c 6f 63 6b 2d 3e 63 6e 74 3e 31   && pLock->cnt>1
bd10: 20 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20 61 72   ){.    /* We ar
bd20: 65 20 74 72 79 69 6e 67 20 66 6f 72 20 61 6e 20  e trying for an 
bd30: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 62  exclusive lock b
bd40: 75 74 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61  ut another threa
bd50: 64 20 69 6e 20 74 68 69 73 0a 20 20 20 20 2a 2a  d in this.    **
bd60: 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 69 73   same process is
bd70: 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61   still holding a
bd80: 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f   shared lock. */
bd90: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
bda0: 5f 42 55 53 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _BUSY;.  }else{.
bdb0: 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65      /* The reque
bdc0: 73 74 20 77 61 73 20 66 6f 72 20 61 20 52 45 53  st was for a RES
bdd0: 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49  ERVED or EXCLUSI
bde0: 56 45 20 6c 6f 63 6b 2e 20 20 49 74 20 69 73 0a  VE lock.  It is.
bdf0: 20 20 20 20 2a 2a 20 61 73 73 75 6d 65 64 20 74      ** assumed t
be00: 68 61 74 20 74 68 65 72 65 20 69 73 20 61 20 53  hat there is a S
be10: 48 41 52 45 44 20 6f 72 20 67 72 65 61 74 65 72  HARED or greater
be20: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c   lock on the fil
be30: 65 0a 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79  e.    ** already
be40: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
be50: 65 72 74 28 20 30 21 3d 70 46 69 6c 65 2d 3e 6c  ert( 0!=pFile->l
be60: 6f 63 6b 74 79 70 65 20 29 3b 0a 20 20 20 20 6c  ocktype );.    l
be70: 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57  ock.l_type = F_W
be80: 52 4c 43 4b 3b 0a 20 20 20 20 73 77 69 74 63 68  RLCK;.    switch
be90: 28 20 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20  ( locktype ){.  
bea0: 20 20 20 20 63 61 73 65 20 52 45 53 45 52 56 45      case RESERVE
beb0: 44 5f 4c 4f 43 4b 3a 0a 20 20 20 20 20 20 20 20  D_LOCK:.        
bec0: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 52  lock.l_start = R
bed0: 45 53 45 52 56 45 44 5f 42 59 54 45 3b 0a 20 20  ESERVED_BYTE;.  
bee0: 20 20 20 20 20 20 73 20 3d 20 66 63 6e 74 6c 28        s = fcntl(
bef0: 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c  pFile->h, F_SETL
bf00: 4b 2c 20 26 6c 6f 63 6b 29 3b 0a 20 20 20 20 20  K, &lock);.     
bf10: 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e     tErrno = errn
bf20: 6f 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  o;.        break
bf30: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 45 58 43  ;.      case EXC
bf40: 4c 55 53 49 56 45 5f 4c 4f 43 4b 3a 0a 20 20 20  LUSIVE_LOCK:.   
bf50: 20 20 20 20 20 73 20 3d 20 72 61 6e 67 65 4c 6f       s = rangeLo
bf60: 63 6b 28 70 46 69 6c 65 2c 20 46 5f 57 52 4c 43  ck(pFile, F_WRLC
bf70: 4b 2c 20 26 74 45 72 72 6e 6f 29 3b 0a 20 20 20  K, &tErrno);.   
bf80: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
bf90: 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
bfa0: 20 20 20 61 73 73 65 72 74 28 30 29 3b 0a 20 20     assert(0);.  
bfb0: 20 20 7d 0a 20 20 20 20 69 66 28 20 73 3d 3d 28    }.    if( s==(
bfc0: 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20  -1) ){.      rc 
bfd0: 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  = sqliteErrorFro
bfe0: 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72  mPosixError(tErr
bff0: 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  no, SQLITE_IOERR
c000: 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66  _LOCK);.      if
c010: 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  ( IS_LOCK_ERROR(
c020: 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  rc) ){.        p
c030: 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
c040: 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20  = tErrno;.      
c050: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 0a  }.    }.  }.  ..
c060: 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
c070: 20 2f 2a 20 53 65 74 20 75 70 20 74 68 65 20 74   /* Set up the t
c080: 72 61 6e 73 61 63 74 69 6f 6e 2d 63 6f 75 6e 74  ransaction-count
c090: 65 72 20 63 68 61 6e 67 65 20 63 68 65 63 6b 69  er change checki
c0a0: 6e 67 20 66 6c 61 67 73 20 77 68 65 6e 0a 20 20  ng flags when.  
c0b0: 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 69 6e 67  ** transitioning
c0c0: 20 66 72 6f 6d 20 61 20 53 48 41 52 45 44 20 74   from a SHARED t
c0d0: 6f 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  o a RESERVED loc
c0e0: 6b 2e 20 20 54 68 65 20 63 68 61 6e 67 65 0a 20  k.  The change. 
c0f0: 20 2a 2a 20 66 72 6f 6d 20 53 48 41 52 45 44 20   ** from SHARED 
c100: 74 6f 20 52 45 53 45 52 56 45 44 20 6d 61 72 6b  to RESERVED mark
c110: 73 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  s the beginning 
c120: 6f 66 20 61 20 6e 6f 72 6d 61 6c 0a 20 20 2a 2a  of a normal.  **
c130: 20 77 72 69 74 65 20 6f 70 65 72 61 74 69 6f 6e   write operation
c140: 20 28 6e 6f 74 20 61 20 68 6f 74 20 6a 6f 75 72   (not a hot jour
c150: 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 29 2e 0a 20  nal rollback).. 
c160: 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   */.  if( rc==SQ
c170: 4c 49 54 45 5f 4f 4b 0a 20 20 20 26 26 20 70 46  LITE_OK.   && pF
c180: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3c 3d 53  ile->locktype<=S
c190: 48 41 52 45 44 5f 4c 4f 43 4b 0a 20 20 20 26 26  HARED_LOCK.   &&
c1a0: 20 6c 6f 63 6b 74 79 70 65 3d 3d 52 45 53 45 52   locktype==RESER
c1b0: 56 45 44 5f 4c 4f 43 4b 0a 20 20 29 7b 0a 20 20  VED_LOCK.  ){.  
c1c0: 20 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e    pFile->transCn
c1d0: 74 72 43 68 6e 67 20 3d 20 30 3b 0a 20 20 20 20  trChng = 0;.    
c1e0: 70 46 69 6c 65 2d 3e 64 62 55 70 64 61 74 65 20  pFile->dbUpdate 
c1f0: 3d 20 30 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  = 0;.    pFile->
c200: 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 3d 20  inNormalWrite = 
c210: 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 0a  1;.  }.#endif...
c220: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
c230: 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  _OK ){.    pFile
c240: 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63  ->locktype = loc
c250: 6b 74 79 70 65 3b 0a 20 20 20 20 70 4c 6f 63 6b  ktype;.    pLock
c260: 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63  ->locktype = loc
c270: 6b 74 79 70 65 3b 0a 20 20 7d 65 6c 73 65 20 69  ktype;.  }else i
c280: 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43  f( locktype==EXC
c290: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20  LUSIVE_LOCK ){. 
c2a0: 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79     pFile->lockty
c2b0: 70 65 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43  pe = PENDING_LOC
c2c0: 4b 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 6c 6f  K;.    pLock->lo
c2d0: 63 6b 74 79 70 65 20 3d 20 50 45 4e 44 49 4e 47  cktype = PENDING
c2e0: 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a 0a 65 6e 64 5f  _LOCK;.  }..end_
c2f0: 6c 6f 63 6b 3a 0a 20 20 75 6e 69 78 4c 65 61 76  lock:.  unixLeav
c300: 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53 54 52  eMutex();.  OSTR
c310: 41 43 45 34 28 22 4c 4f 43 4b 20 20 20 20 25 64  ACE4("LOCK    %d
c320: 20 25 73 20 25 73 5c 6e 22 2c 20 70 46 69 6c 65   %s %s\n", pFile
c330: 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70 65 4e 61 6d  ->h, locktypeNam
c340: 65 28 6c 6f 63 6b 74 79 70 65 29 2c 20 0a 20 20  e(locktype), .  
c350: 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f      rc==SQLITE_O
c360: 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c  K ? "ok" : "fail
c370: 65 64 22 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ed");.  return r
c380: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  c;.}../*.** Clos
c390: 65 20 61 6c 6c 20 66 69 6c 65 20 64 65 73 63 72  e all file descr
c3a0: 69 70 74 6f 72 73 20 61 63 63 75 6d 75 61 74 65  iptors accumuate
c3b0: 64 20 69 6e 20 74 68 65 20 75 6e 69 78 4f 70 65  d in the unixOpe
c3c0: 6e 43 6e 74 2d 3e 70 55 6e 75 73 65 64 20 6c 69  nCnt->pUnused li
c3d0: 73 74 2e 0a 2a 2a 20 49 66 20 61 6c 6c 20 73 75  st..** If all su
c3e0: 63 68 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ch file descript
c3f0: 6f 72 73 20 61 72 65 20 63 6c 6f 73 65 64 20 77  ors are closed w
c400: 69 74 68 6f 75 74 20 65 72 72 6f 72 2c 20 74 68  ithout error, th
c410: 65 20 6c 69 73 74 20 69 73 0a 2a 2a 20 63 6c 65  e list is.** cle
c420: 61 72 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f  ared and SQLITE_
c430: 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  OK returned..**.
c440: 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  ** Otherwise, if
c450: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
c460: 2c 20 74 68 65 6e 20 73 75 63 63 65 73 73 66 75  , then successfu
c470: 6c 6c 79 20 63 6c 6f 73 65 64 20 66 69 6c 65 20  lly closed file 
c480: 64 65 73 63 72 69 70 74 6f 72 0a 2a 2a 20 65 6e  descriptor.** en
c490: 74 72 69 65 73 20 61 72 65 20 72 65 6d 6f 76 65  tries are remove
c4a0: 64 20 66 72 6f 6d 20 74 68 65 20 6c 69 73 74 2c  d from the list,
c4b0: 20 61 6e 64 20 53 51 4c 49 54 45 5f 49 4f 45 52   and SQLITE_IOER
c4c0: 52 5f 43 4c 4f 53 45 20 72 65 74 75 72 6e 65 64  R_CLOSE returned
c4d0: 2e 20 0a 2a 2a 20 6e 6f 74 20 64 65 6c 65 74 65  . .** not delete
c4e0: 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 49 4f 45  d and SQLITE_IOE
c4f0: 52 52 5f 43 4c 4f 53 45 20 72 65 74 75 72 6e 65  RR_CLOSE returne
c500: 64 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 69 6e  d..*/ .static in
c510: 74 20 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64  t closePendingFd
c520: 73 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c  s(unixFile *pFil
c530: 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  e){.  int rc = S
c540: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73 74 72 75  QLITE_OK;.  stru
c550: 63 74 20 75 6e 69 78 4f 70 65 6e 43 6e 74 20 2a  ct unixOpenCnt *
c560: 70 4f 70 65 6e 20 3d 20 70 46 69 6c 65 2d 3e 70  pOpen = pFile->p
c570: 4f 70 65 6e 3b 0a 20 20 55 6e 69 78 55 6e 75 73  Open;.  UnixUnus
c580: 65 64 46 64 20 2a 70 45 72 72 6f 72 20 3d 20 30  edFd *pError = 0
c590: 3b 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64  ;.  UnixUnusedFd
c5a0: 20 2a 70 3b 0a 20 20 55 6e 69 78 55 6e 75 73 65   *p;.  UnixUnuse
c5b0: 64 46 64 20 2a 70 4e 65 78 74 3b 0a 20 20 66 6f  dFd *pNext;.  fo
c5c0: 72 28 70 3d 70 4f 70 65 6e 2d 3e 70 55 6e 75 73  r(p=pOpen->pUnus
c5d0: 65 64 3b 20 70 3b 20 70 3d 70 4e 65 78 74 29 7b  ed; p; p=pNext){
c5e0: 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e  .    pNext = p->
c5f0: 70 4e 65 78 74 3b 0a 20 20 20 20 69 66 28 20 63  pNext;.    if( c
c600: 6c 6f 73 65 28 70 2d 3e 66 64 29 20 29 7b 0a 20  lose(p->fd) ){. 
c610: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
c620: 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
c630: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
c640: 5f 49 4f 45 52 52 5f 43 4c 4f 53 45 3b 0a 20 20  _IOERR_CLOSE;.  
c650: 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70      p->pNext = p
c660: 45 72 72 6f 72 3b 0a 20 20 20 20 20 20 70 45 72  Error;.      pEr
c670: 72 6f 72 20 3d 20 70 3b 0a 20 20 20 20 7d 65 6c  ror = p;.    }el
c680: 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
c690: 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 7d  3_free(p);.    }
c6a0: 0a 20 20 7d 0a 20 20 70 4f 70 65 6e 2d 3e 70 55  .  }.  pOpen->pU
c6b0: 6e 75 73 65 64 20 3d 20 70 45 72 72 6f 72 3b 0a  nused = pError;.
c6c0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
c6d0: 2f 2a 0a 2a 2a 20 41 64 64 20 74 68 65 20 66 69  /*.** Add the fi
c6e0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 75 73  le descriptor us
c6f0: 65 64 20 62 79 20 66 69 6c 65 20 68 61 6e 64 6c  ed by file handl
c700: 65 20 70 46 69 6c 65 20 74 6f 20 74 68 65 20 63  e pFile to the c
c710: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20  orresponding.** 
c720: 70 55 6e 75 73 65 64 20 6c 69 73 74 2e 0a 2a 2f  pUnused list..*/
c730: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74  .static void set
c740: 50 65 6e 64 69 6e 67 46 64 28 75 6e 69 78 46 69  PendingFd(unixFi
c750: 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 73 74  le *pFile){.  st
c760: 72 75 63 74 20 75 6e 69 78 4f 70 65 6e 43 6e 74  ruct unixOpenCnt
c770: 20 2a 70 4f 70 65 6e 20 3d 20 70 46 69 6c 65 2d   *pOpen = pFile-
c780: 3e 70 4f 70 65 6e 3b 0a 20 20 55 6e 69 78 55 6e  >pOpen;.  UnixUn
c790: 75 73 65 64 46 64 20 2a 70 20 3d 20 70 46 69 6c  usedFd *p = pFil
c7a0: 65 2d 3e 70 55 6e 75 73 65 64 3b 0a 20 20 70 2d  e->pUnused;.  p-
c7b0: 3e 70 4e 65 78 74 20 3d 20 70 4f 70 65 6e 2d 3e  >pNext = pOpen->
c7c0: 70 55 6e 75 73 65 64 3b 0a 20 20 70 4f 70 65 6e  pUnused;.  pOpen
c7d0: 2d 3e 70 55 6e 75 73 65 64 20 3d 20 70 3b 0a 20  ->pUnused = p;. 
c7e0: 20 70 46 69 6c 65 2d 3e 68 20 3d 20 2d 31 3b 0a   pFile->h = -1;.
c7f0: 20 20 70 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64    pFile->pUnused
c800: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c   = 0;.}../*.** L
c810: 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67  ower the locking
c820: 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64   level on file d
c830: 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20  escriptor pFile 
c840: 74 6f 20 6c 6f 63 6b 74 79 70 65 2e 20 20 6c 6f  to locktype.  lo
c850: 63 6b 74 79 70 65 0a 2a 2a 20 6d 75 73 74 20 62  cktype.** must b
c860: 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b  e either NO_LOCK
c870: 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e   or SHARED_LOCK.
c880: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f  .**.** If the lo
c890: 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74  cking level of t
c8a0: 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
c8b0: 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74  or is already at
c8c0: 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65   or below.** the
c8d0: 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69   requested locki
c8e0: 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72  ng level, this r
c8f0: 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
c900: 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  p..*/.static int
c910: 20 75 6e 69 78 55 6e 6c 6f 63 6b 28 73 71 6c 69   unixUnlock(sqli
c920: 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
c930: 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 75  t locktype){.  u
c940: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
c950: 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 20   (unixFile*)id; 
c960: 2f 2a 20 54 68 65 20 6f 70 65 6e 20 66 69 6c 65  /* The open file
c970: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 75 6e 69   */.  struct uni
c980: 78 4c 6f 63 6b 49 6e 66 6f 20 2a 70 4c 6f 63 6b  xLockInfo *pLock
c990: 3b 20 20 20 20 20 20 2f 2a 20 53 74 72 75 63 74  ;      /* Struct
c9a0: 75 72 65 20 64 65 73 63 72 69 62 69 6e 67 20 63  ure describing c
c9b0: 75 72 72 65 6e 74 20 6c 6f 63 6b 20 73 74 61 74  urrent lock stat
c9c0: 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 66 6c  e */.  struct fl
c9d0: 6f 63 6b 20 6c 6f 63 6b 3b 20 20 20 20 20 20 20  ock lock;       
c9e0: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72          /* Infor
c9f0: 6d 61 74 69 6f 6e 20 70 61 73 73 65 64 20 69 6e  mation passed in
ca00: 74 6f 20 66 63 6e 74 6c 28 29 20 2a 2f 0a 20 20  to fcntl() */.  
ca10: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
ca20: 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
ca30: 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
ca40: 66 72 6f 6d 20 74 68 69 73 20 69 6e 74 65 72 66  from this interf
ca50: 61 63 65 20 2a 2f 0a 20 20 69 6e 74 20 68 3b 20  ace */.  int h; 
ca60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
ca80: 20 75 6e 64 65 72 6c 79 69 6e 67 20 66 69 6c 65   underlying file
ca90: 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20   descriptor */. 
caa0: 20 69 6e 74 20 74 45 72 72 6e 6f 3b 20 20 20 20   int tErrno;    
cab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cac0: 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65 20    /* Error code 
cad0: 66 72 6f 6d 20 73 79 73 74 65 6d 20 63 61 6c 6c  from system call
cae0: 20 65 72 72 6f 72 73 20 2a 2f 0a 0a 20 20 61 73   errors */..  as
caf0: 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
cb00: 20 4f 53 54 52 41 43 45 37 28 22 55 4e 4c 4f 43   OSTRACE7("UNLOC
cb10: 4b 20 20 25 64 20 25 64 20 77 61 73 20 25 64 28  K  %d %d was %d(
cb20: 25 64 2c 25 64 29 20 70 69 64 3d 25 64 5c 6e 22  %d,%d) pid=%d\n"
cb30: 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b  , pFile->h, lock
cb40: 74 79 70 65 2c 0a 20 20 20 20 20 20 70 46 69 6c  type,.      pFil
cb50: 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 70 46 69  e->locktype, pFi
cb60: 6c 65 2d 3e 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74  le->pLock->lockt
cb70: 79 70 65 2c 20 70 46 69 6c 65 2d 3e 70 4c 6f 63  ype, pFile->pLoc
cb80: 6b 2d 3e 63 6e 74 2c 20 67 65 74 70 69 64 28 29  k->cnt, getpid()
cb90: 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6c 6f  );..  assert( lo
cba0: 63 6b 74 79 70 65 3c 3d 53 48 41 52 45 44 5f 4c  cktype<=SHARED_L
cbb0: 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70 46 69  OCK );.  if( pFi
cbc0: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3c 3d 6c 6f  le->locktype<=lo
cbd0: 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 72 65  cktype ){.    re
cbe0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
cbf0: 20 20 7d 0a 20 20 69 66 28 20 43 48 45 43 4b 5f    }.  if( CHECK_
cc00: 54 48 52 45 41 44 49 44 28 70 46 69 6c 65 29 20  THREADID(pFile) 
cc10: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
cc20: 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20 7d  LITE_MISUSE;.  }
cc30: 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  .  unixEnterMute
cc40: 78 28 29 3b 0a 20 20 68 20 3d 20 70 46 69 6c 65  x();.  h = pFile
cc50: 2d 3e 68 3b 0a 20 20 70 4c 6f 63 6b 20 3d 20 70  ->h;.  pLock = p
cc60: 46 69 6c 65 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 61  File->pLock;.  a
cc70: 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 63 6e  ssert( pLock->cn
cc80: 74 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 46  t!=0 );.  if( pF
cc90: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 53 48  ile->locktype>SH
cca0: 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
ccb0: 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e   assert( pLock->
ccc0: 6c 6f 63 6b 74 79 70 65 3d 3d 70 46 69 6c 65 2d  locktype==pFile-
ccd0: 3e 6c 6f 63 6b 74 79 70 65 20 29 3b 0a 20 20 20  >locktype );.   
cce0: 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
ccf0: 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 53  Benign(1);.    S
cd00: 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
cd10: 68 3d 28 2d 31 29 20 29 0a 20 20 20 20 53 69 6d  h=(-1) ).    Sim
cd20: 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69  ulateIOErrorBeni
cd30: 67 6e 28 30 29 3b 0a 0a 23 69 66 6e 64 65 66 20  gn(0);..#ifndef 
cd40: 4e 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 57 68  NDEBUG.    /* Wh
cd50: 65 6e 20 72 65 64 75 63 69 6e 67 20 61 20 6c 6f  en reducing a lo
cd60: 63 6b 20 73 75 63 68 20 74 68 61 74 20 6f 74 68  ck such that oth
cd70: 65 72 20 70 72 6f 63 65 73 73 65 73 20 63 61 6e  er processes can
cd80: 20 73 74 61 72 74 0a 20 20 20 20 2a 2a 20 72 65   start.    ** re
cd90: 61 64 69 6e 67 20 74 68 65 20 64 61 74 61 62 61  ading the databa
cda0: 73 65 20 66 69 6c 65 20 61 67 61 69 6e 2c 20 6d  se file again, m
cdb0: 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68  ake sure that th
cdc0: 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63  e.    ** transac
cdd0: 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 77 61 73  tion counter was
cde0: 20 75 70 64 61 74 65 64 20 69 66 20 61 6e 79 20   updated if any 
cdf0: 70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61  part of the data
ce00: 62 61 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65  base.    ** file
ce10: 20 63 68 61 6e 67 65 64 2e 20 20 49 66 20 74 68   changed.  If th
ce20: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f  e transaction co
ce30: 75 6e 74 65 72 20 69 73 20 6e 6f 74 20 75 70 64  unter is not upd
ce40: 61 74 65 64 2c 0a 20 20 20 20 2a 2a 20 6f 74 68  ated,.    ** oth
ce50: 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74  er connections t
ce60: 6f 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20  o the same file 
ce70: 6d 69 67 68 74 20 6e 6f 74 20 72 65 61 6c 69 7a  might not realiz
ce80: 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 74 68  e that.    ** th
ce90: 65 20 66 69 6c 65 20 68 61 73 20 63 68 61 6e 67  e file has chang
cea0: 65 64 20 61 6e 64 20 68 65 6e 63 65 20 6d 69 67  ed and hence mig
ceb0: 68 74 20 6e 6f 74 20 6b 6e 6f 77 20 74 6f 20 66  ht not know to f
cec0: 6c 75 73 68 20 74 68 65 69 72 0a 20 20 20 20 2a  lush their.    *
ced0: 2a 20 63 61 63 68 65 2e 20 20 54 68 65 20 75 73  * cache.  The us
cee0: 65 20 6f 66 20 61 20 73 74 61 6c 65 20 63 61 63  e of a stale cac
cef0: 68 65 20 63 61 6e 20 6c 65 61 64 20 74 6f 20 64  he can lead to d
cf00: 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
cf10: 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  on..    */.    a
cf20: 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 69 6e  ssert( pFile->in
cf30: 4e 6f 72 6d 61 6c 57 72 69 74 65 3d 3d 30 0a 20  NormalWrite==0. 
cf40: 20 20 20 20 20 20 20 20 7c 7c 20 70 46 69 6c 65          || pFile
cf50: 2d 3e 64 62 55 70 64 61 74 65 3d 3d 30 0a 20 20  ->dbUpdate==0.  
cf60: 20 20 20 20 20 20 20 7c 7c 20 70 46 69 6c 65 2d         || pFile-
cf70: 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 3d 3d  >transCntrChng==
cf80: 31 20 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  1 );.    pFile->
cf90: 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 3d 20  inNormalWrite = 
cfa0: 30 3b 0a 23 65 6e 64 69 66 0a 0a 0a 20 20 20 20  0;.#endif...    
cfb0: 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48  if( locktype==SH
cfc0: 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
cfd0: 20 20 20 69 66 28 20 72 61 6e 67 65 4c 6f 63 6b     if( rangeLock
cfe0: 28 70 46 69 6c 65 2c 20 46 5f 52 44 4c 43 4b 2c  (pFile, F_RDLCK,
cff0: 20 26 74 45 72 72 6e 6f 29 3d 3d 28 2d 31 29 20   &tErrno)==(-1) 
d000: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
d010: 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
d020: 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
d030: 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52  , SQLITE_IOERR_R
d040: 44 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20  DLOCK);.        
d050: 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  if( IS_LOCK_ERRO
d060: 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20  R(rc) ){.       
d070: 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
d080: 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20  rno = tErrno;.  
d090: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
d0a0: 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b  goto end_unlock;
d0b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
d0c0: 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d     lock.l_type =
d0d0: 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 6c 6f   F_UNLCK;.    lo
d0e0: 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45  ck.l_whence = SE
d0f0: 45 4b 5f 53 45 54 3b 0a 20 20 20 20 6c 6f 63 6b  EK_SET;.    lock
d100: 2e 6c 5f 73 74 61 72 74 20 3d 20 50 45 4e 44 49  .l_start = PENDI
d110: 4e 47 5f 42 59 54 45 3b 0a 20 20 20 20 6c 6f 63  NG_BYTE;.    loc
d120: 6b 2e 6c 5f 6c 65 6e 20 3d 20 32 4c 3b 20 20 61  k.l_len = 2L;  a
d130: 73 73 65 72 74 28 20 50 45 4e 44 49 4e 47 5f 42  ssert( PENDING_B
d140: 59 54 45 2b 31 3d 3d 52 45 53 45 52 56 45 44 5f  YTE+1==RESERVED_
d150: 42 59 54 45 20 29 3b 0a 20 20 20 20 69 66 28 20  BYTE );.    if( 
d160: 66 63 6e 74 6c 28 68 2c 20 46 5f 53 45 54 4c 4b  fcntl(h, F_SETLK
d170: 2c 20 26 6c 6f 63 6b 29 21 3d 28 2d 31 29 20 29  , &lock)!=(-1) )
d180: 7b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 6c  {.      pLock->l
d190: 6f 63 6b 74 79 70 65 20 3d 20 53 48 41 52 45 44  ocktype = SHARED
d1a0: 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73 65  _LOCK;.    }else
d1b0: 7b 0a 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d  {.      tErrno =
d1c0: 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63   errno;.      rc
d1d0: 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
d1e0: 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
d1f0: 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
d200: 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  R_UNLOCK);.     
d210: 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
d220: 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20  OR(rc) ){.      
d230: 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
d240: 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20  no = tErrno;.   
d250: 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20     }.      goto 
d260: 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20  end_unlock;.    
d270: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6c 6f 63 6b  }.  }.  if( lock
d280: 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b  type==NO_LOCK ){
d290: 0a 20 20 20 20 73 74 72 75 63 74 20 75 6e 69 78  .    struct unix
d2a0: 4f 70 65 6e 43 6e 74 20 2a 70 4f 70 65 6e 3b 0a  OpenCnt *pOpen;.
d2b0: 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e  .    /* Decremen
d2c0: 74 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63  t the shared loc
d2d0: 6b 20 63 6f 75 6e 74 65 72 2e 20 20 52 65 6c 65  k counter.  Rele
d2e0: 61 73 65 20 74 68 65 20 6c 6f 63 6b 20 75 73 69  ase the lock usi
d2f0: 6e 67 20 61 6e 0a 20 20 20 20 2a 2a 20 4f 53 20  ng an.    ** OS 
d300: 63 61 6c 6c 20 6f 6e 6c 79 20 77 68 65 6e 20 61  call only when a
d310: 6c 6c 20 74 68 72 65 61 64 73 20 69 6e 20 74 68  ll threads in th
d320: 69 73 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20  is same process 
d330: 68 61 76 65 20 72 65 6c 65 61 73 65 64 0a 20 20  have released.  
d340: 20 20 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 0a 20    ** the lock.. 
d350: 20 20 20 2a 2f 0a 20 20 20 20 70 4c 6f 63 6b 2d     */.    pLock-
d360: 3e 63 6e 74 2d 2d 3b 0a 20 20 20 20 69 66 28 20  >cnt--;.    if( 
d370: 70 4c 6f 63 6b 2d 3e 63 6e 74 3d 3d 30 20 29 7b  pLock->cnt==0 ){
d380: 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79  .      lock.l_ty
d390: 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20  pe = F_UNLCK;.  
d3a0: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63      lock.l_whenc
d3b0: 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20  e = SEEK_SET;.  
d3c0: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74      lock.l_start
d3d0: 20 3d 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20   = lock.l_len = 
d3e0: 30 4c 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61  0L;.      Simula
d3f0: 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28  teIOErrorBenign(
d400: 31 29 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61  1);.      Simula
d410: 74 65 49 4f 45 72 72 6f 72 28 20 68 3d 28 2d 31  teIOError( h=(-1
d420: 29 20 29 0a 20 20 20 20 20 20 53 69 6d 75 6c 61  ) ).      Simula
d430: 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28  teIOErrorBenign(
d440: 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 66 63  0);.      if( fc
d450: 6e 74 6c 28 68 2c 20 46 5f 53 45 54 4c 4b 2c 20  ntl(h, F_SETLK, 
d460: 26 6c 6f 63 6b 29 21 3d 28 2d 31 29 20 29 7b 0a  &lock)!=(-1) ){.
d470: 20 20 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 6c          pLock->l
d480: 6f 63 6b 74 79 70 65 20 3d 20 4e 4f 5f 4c 4f 43  ocktype = NO_LOC
d490: 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  K;.      }else{.
d4a0: 20 20 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d          tErrno =
d4b0: 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20   errno;.        
d4c0: 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72  rc = sqliteError
d4d0: 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74  FromPosixError(t
d4e0: 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f  Errno, SQLITE_IO
d4f0: 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20  ERR_UNLOCK);.   
d500: 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b       if( IS_LOCK
d510: 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20  _ERROR(rc) ){.  
d520: 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c          pFile->l
d530: 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e  astErrno = tErrn
d540: 6f 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  o;.        }.   
d550: 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b       pLock->lock
d560: 74 79 70 65 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a  type = NO_LOCK;.
d570: 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c          pFile->l
d580: 6f 63 6b 74 79 70 65 20 3d 20 4e 4f 5f 4c 4f 43  ocktype = NO_LOC
d590: 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  K;.      }.    }
d5a0: 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65  ..    /* Decreme
d5b0: 6e 74 20 74 68 65 20 63 6f 75 6e 74 20 6f 66 20  nt the count of 
d5c0: 6c 6f 63 6b 73 20 61 67 61 69 6e 73 74 20 74 68  locks against th
d5d0: 69 73 20 73 61 6d 65 20 66 69 6c 65 2e 20 20 57  is same file.  W
d5e0: 68 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 63  hen the.    ** c
d5f0: 6f 75 6e 74 20 72 65 61 63 68 65 73 20 7a 65 72  ount reaches zer
d600: 6f 2c 20 63 6c 6f 73 65 20 61 6e 79 20 6f 74 68  o, close any oth
d610: 65 72 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  er file descript
d620: 6f 72 73 20 77 68 6f 73 65 20 63 6c 6f 73 65 0a  ors whose close.
d630: 20 20 20 20 2a 2a 20 77 61 73 20 64 65 66 65 72      ** was defer
d640: 72 65 64 20 62 65 63 61 75 73 65 20 6f 66 20 6f  red because of o
d650: 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73  utstanding locks
d660: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 4f 70  ..    */.    pOp
d670: 65 6e 20 3d 20 70 46 69 6c 65 2d 3e 70 4f 70 65  en = pFile->pOpe
d680: 6e 3b 0a 20 20 20 20 70 4f 70 65 6e 2d 3e 6e 4c  n;.    pOpen->nL
d690: 6f 63 6b 2d 2d 3b 0a 20 20 20 20 61 73 73 65 72  ock--;.    asser
d6a0: 74 28 20 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 3e  t( pOpen->nLock>
d6b0: 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4f  =0 );.    if( pO
d6c0: 70 65 6e 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 29 7b  pen->nLock==0 ){
d6d0: 0a 20 20 20 20 20 20 69 6e 74 20 72 63 32 20 3d  .      int rc2 =
d6e0: 20 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64 73   closePendingFds
d6f0: 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 69  (pFile);.      i
d700: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
d710: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
d720: 20 72 63 32 3b 0a 20 20 20 20 20 20 7d 0a 20 20   rc2;.      }.  
d730: 20 20 7d 0a 20 20 7d 0a 09 0a 65 6e 64 5f 75 6e    }.  }...end_un
d740: 6c 6f 63 6b 3a 0a 20 20 75 6e 69 78 4c 65 61 76  lock:.  unixLeav
d750: 65 4d 75 74 65 78 28 29 3b 0a 20 20 69 66 28 20  eMutex();.  if( 
d760: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc==SQLITE_OK ) 
d770: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20  pFile->locktype 
d780: 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 72 65  = locktype;.  re
d790: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
d7a0: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
d7b0: 70 65 72 66 6f 72 6d 73 20 74 68 65 20 70 61 72  performs the par
d7c0: 74 73 20 6f 66 20 74 68 65 20 22 63 6c 6f 73 65  ts of the "close
d7d0: 20 66 69 6c 65 22 20 6f 70 65 72 61 74 69 6f 6e   file" operation
d7e0: 20 0a 2a 2a 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61   .** common to a
d7f0: 6c 6c 20 6c 6f 63 6b 69 6e 67 20 73 63 68 65 6d  ll locking schem
d800: 65 73 2e 20 49 74 20 63 6c 6f 73 65 73 20 74 68  es. It closes th
d810: 65 20 64 69 72 65 63 74 6f 72 79 20 61 6e 64 20  e directory and 
d820: 66 69 6c 65 0a 2a 2a 20 68 61 6e 64 6c 65 73 2c  file.** handles,
d830: 20 69 66 20 74 68 65 79 20 61 72 65 20 76 61 6c   if they are val
d840: 69 64 2c 20 61 6e 64 20 73 65 74 73 20 61 6c 6c  id, and sets all
d850: 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 75   fields of the u
d860: 6e 69 78 46 69 6c 65 0a 2a 2a 20 73 74 72 75 63  nixFile.** struc
d870: 74 75 72 65 20 74 6f 20 30 2e 0a 2a 2a 0a 2a 2a  ture to 0..**.**
d880: 20 49 74 20 69 73 20 2a 6e 6f 74 2a 20 6e 65 63   It is *not* nec
d890: 65 73 73 61 72 79 20 74 6f 20 68 6f 6c 64 20 74  essary to hold t
d8a0: 68 65 20 6d 75 74 65 78 20 77 68 65 6e 20 74 68  he mutex when th
d8b0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
d8c0: 6c 6c 65 64 2c 0a 2a 2a 20 65 76 65 6e 20 6f 6e  lled,.** even on
d8d0: 20 56 78 57 6f 72 6b 73 2e 20 20 41 20 6d 75 74   VxWorks.  A mut
d8e0: 65 78 20 77 69 6c 6c 20 62 65 20 61 63 71 75 69  ex will be acqui
d8f0: 72 65 64 20 6f 6e 20 56 78 57 6f 72 6b 73 20 62  red on VxWorks b
d900: 79 20 74 68 65 0a 2a 2a 20 76 78 77 6f 72 6b 73  y the.** vxworks
d910: 52 65 6c 65 61 73 65 46 69 6c 65 49 64 28 29 20  ReleaseFileId() 
d920: 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74  routine..*/.stat
d930: 69 63 20 69 6e 74 20 63 6c 6f 73 65 55 6e 69 78  ic int closeUnix
d940: 46 69 6c 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  File(sqlite3_fil
d950: 65 20 2a 69 64 29 7b 0a 20 20 75 6e 69 78 46 69  e *id){.  unixFi
d960: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
d970: 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 66 28  xFile*)id;.  if(
d980: 20 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 69 66   pFile ){.    if
d990: 28 20 70 46 69 6c 65 2d 3e 64 69 72 66 64 3e 3d  ( pFile->dirfd>=
d9a0: 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 65  0 ){.      int e
d9b0: 72 72 20 3d 20 63 6c 6f 73 65 28 70 46 69 6c 65  rr = close(pFile
d9c0: 2d 3e 64 69 72 66 64 29 3b 0a 20 20 20 20 20 20  ->dirfd);.      
d9d0: 69 66 28 20 65 72 72 20 29 7b 0a 20 20 20 20 20  if( err ){.     
d9e0: 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
d9f0: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
da00: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
da10: 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f 43 4c 4f  TE_IOERR_DIR_CLO
da20: 53 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  SE;.      }else{
da30: 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  .        pFile->
da40: 64 69 72 66 64 3d 2d 31 3b 0a 20 20 20 20 20 20  dirfd=-1;.      
da50: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
da60: 70 46 69 6c 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20  pFile->h>=0 ){. 
da70: 20 20 20 20 20 69 6e 74 20 65 72 72 20 3d 20 63       int err = c
da80: 6c 6f 73 65 28 70 46 69 6c 65 2d 3e 68 29 3b 0a  lose(pFile->h);.
da90: 20 20 20 20 20 20 69 66 28 20 65 72 72 20 29 7b        if( err ){
daa0: 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  .        pFile->
dab0: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  lastErrno = errn
dac0: 6f 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  o;.        retur
dad0: 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43  n SQLITE_IOERR_C
dae0: 4c 4f 53 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20  LOSE;.      }.  
daf0: 20 20 7d 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52    }.#if OS_VXWOR
db00: 4b 53 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65  KS.    if( pFile
db10: 2d 3e 70 49 64 20 29 7b 0a 20 20 20 20 20 20 69  ->pId ){.      i
db20: 66 28 20 70 46 69 6c 65 2d 3e 69 73 44 65 6c 65  f( pFile->isDele
db30: 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 75 6e  te ){.        un
db40: 6c 69 6e 6b 28 70 46 69 6c 65 2d 3e 70 49 64 2d  link(pFile->pId-
db50: 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 29  >zCanonicalName)
db60: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
db70: 76 78 77 6f 72 6b 73 52 65 6c 65 61 73 65 46 69  vxworksReleaseFi
db80: 6c 65 49 64 28 70 46 69 6c 65 2d 3e 70 49 64 29  leId(pFile->pId)
db90: 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 70  ;.      pFile->p
dba0: 49 64 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 23 65  Id = 0;.    }.#e
dbb0: 6e 64 69 66 0a 20 20 20 20 4f 53 54 52 41 43 45  ndif.    OSTRACE
dbc0: 32 28 22 43 4c 4f 53 45 20 20 20 25 2d 33 64 5c  2("CLOSE   %-3d\
dbd0: 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 3b 0a 20  n", pFile->h);. 
dbe0: 20 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2d     OpenCounter(-
dbf0: 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  1);.    sqlite3_
dc00: 66 72 65 65 28 70 46 69 6c 65 2d 3e 70 55 6e 75  free(pFile->pUnu
dc10: 73 65 64 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74  sed);.    memset
dc20: 28 70 46 69 6c 65 2c 20 30 2c 20 73 69 7a 65 6f  (pFile, 0, sizeo
dc30: 66 28 75 6e 69 78 46 69 6c 65 29 29 3b 0a 20 20  f(unixFile));.  
dc40: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
dc50: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
dc60: 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a  lose a file..*/.
dc70: 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 43  static int unixC
dc80: 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  lose(sqlite3_fil
dc90: 65 20 2a 69 64 29 7b 0a 20 20 69 6e 74 20 72 63  e *id){.  int rc
dca0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
dcb0: 69 66 28 20 69 64 20 29 7b 0a 20 20 20 20 75 6e  if( id ){.    un
dcc0: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
dcd0: 28 75 6e 69 78 46 69 6c 65 20 2a 29 69 64 3b 0a  (unixFile *)id;.
dce0: 20 20 20 20 75 6e 69 78 55 6e 6c 6f 63 6b 28 69      unixUnlock(i
dcf0: 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20  d, NO_LOCK);.   
dd00: 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
dd10: 29 3b 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65  );.    if( pFile
dd20: 2d 3e 70 4f 70 65 6e 20 26 26 20 70 46 69 6c 65  ->pOpen && pFile
dd30: 2d 3e 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 20 29  ->pOpen->nLock )
dd40: 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
dd50: 65 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64  ere are outstand
dd60: 69 6e 67 20 6c 6f 63 6b 73 2c 20 64 6f 20 6e 6f  ing locks, do no
dd70: 74 20 61 63 74 75 61 6c 6c 79 20 63 6c 6f 73 65  t actually close
dd80: 20 74 68 65 20 66 69 6c 65 20 6a 75 73 74 0a 20   the file just. 
dd90: 20 20 20 20 20 2a 2a 20 79 65 74 20 62 65 63 61       ** yet beca
dda0: 75 73 65 20 74 68 61 74 20 77 6f 75 6c 64 20 63  use that would c
ddb0: 6c 65 61 72 20 74 68 6f 73 65 20 6c 6f 63 6b 73  lear those locks
ddc0: 2e 20 20 49 6e 73 74 65 61 64 2c 20 61 64 64 20  .  Instead, add 
ddd0: 74 68 65 20 66 69 6c 65 0a 20 20 20 20 20 20 2a  the file.      *
dde0: 2a 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20  * descriptor to 
ddf0: 70 4f 70 65 6e 2d 3e 70 55 6e 75 73 65 64 20 6c  pOpen->pUnused l
de00: 69 73 74 2e 20 20 49 74 20 77 69 6c 6c 20 62 65  ist.  It will be
de10: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63   automatically c
de20: 6c 6f 73 65 64 20 0a 20 20 20 20 20 20 2a 2a 20  losed .      ** 
de30: 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20 6c 6f  when the last lo
de40: 63 6b 20 69 73 20 63 6c 65 61 72 65 64 2e 0a 20  ck is cleared.. 
de50: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 65       */.      se
de60: 74 50 65 6e 64 69 6e 67 46 64 28 70 46 69 6c 65  tPendingFd(pFile
de70: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6c  );.    }.    rel
de80: 65 61 73 65 4c 6f 63 6b 49 6e 66 6f 28 70 46 69  easeLockInfo(pFi
de90: 6c 65 2d 3e 70 4c 6f 63 6b 29 3b 0a 20 20 20 20  le->pLock);.    
dea0: 72 65 6c 65 61 73 65 4f 70 65 6e 43 6e 74 28 70  releaseOpenCnt(p
deb0: 46 69 6c 65 2d 3e 70 4f 70 65 6e 29 3b 0a 20 20  File->pOpen);.  
dec0: 20 20 72 63 20 3d 20 63 6c 6f 73 65 55 6e 69 78    rc = closeUnix
ded0: 46 69 6c 65 28 69 64 29 3b 0a 20 20 20 20 75 6e  File(id);.    un
dee0: 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
def0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
df00: 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .}../***********
df10: 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 70  *** End of the p
df20: 6f 73 69 78 20 61 64 76 69 73 6f 72 79 20 6c 6f  osix advisory lo
df30: 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ck implementatio
df40: 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  n **************
df50: 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
df60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
df70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
df80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
df90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
dfa0: 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **/../**********
dfb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
dfc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
dfd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
dfe0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
dff0: 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
e000: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e010: 2a 2a 2a 20 4e 6f 2d 6f 70 20 4c 6f 63 6b 69 6e  *** No-op Lockin
e020: 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  g **************
e030: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e040: 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4f 66 20 74 68  ****.**.** Of th
e050: 65 20 76 61 72 69 6f 75 73 20 6c 6f 63 6b 69 6e  e various lockin
e060: 67 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  g implementation
e070: 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 74 68 69  s available, thi
e080: 73 20 69 73 20 62 79 20 66 61 72 20 74 68 65 0a  s is by far the.
e090: 2a 2a 20 73 69 6d 70 6c 65 73 74 3a 20 20 6c 6f  ** simplest:  lo
e0a0: 63 6b 69 6e 67 20 69 73 20 69 67 6e 6f 72 65 64  cking is ignored
e0b0: 2e 20 20 4e 6f 20 61 74 74 65 6d 70 74 20 69 73  .  No attempt is
e0c0: 20 6d 61 64 65 20 74 6f 20 6c 6f 63 6b 20 74 68   made to lock th
e0d0: 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69  e database.** fi
e0e0: 6c 65 20 66 6f 72 20 72 65 61 64 69 6e 67 20 6f  le for reading o
e0f0: 72 20 77 72 69 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a  r writing..**.**
e100: 20 54 68 69 73 20 6c 6f 63 6b 69 6e 67 20 6d 6f   This locking mo
e110: 64 65 20 69 73 20 61 70 70 72 6f 70 72 69 61 74  de is appropriat
e120: 65 20 66 6f 72 20 75 73 65 20 6f 6e 20 72 65 61  e for use on rea
e130: 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 73  d-only databases
e140: 0a 2a 2a 20 28 65 78 3a 20 64 61 74 61 62 61 73  .** (ex: databas
e150: 65 73 20 74 68 61 74 20 61 72 65 20 62 75 72 6e  es that are burn
e160: 65 64 20 69 6e 74 6f 20 43 44 2d 52 4f 4d 2c 20  ed into CD-ROM, 
e170: 66 6f 72 20 65 78 61 6d 70 6c 65 2e 29 20 20 49  for example.)  I
e180: 74 20 63 61 6e 0a 2a 2a 20 61 6c 73 6f 20 62 65  t can.** also be
e190: 20 75 73 65 64 20 69 66 20 74 68 65 20 61 70 70   used if the app
e1a0: 6c 69 63 61 74 69 6f 6e 20 65 6d 70 6c 6f 79 73  lication employs
e1b0: 20 73 6f 6d 65 20 65 78 74 65 72 6e 61 6c 20 6d   some external m
e1c0: 65 63 68 61 6e 69 73 6d 20 74 6f 0a 2a 2a 20 70  echanism to.** p
e1d0: 72 65 76 65 6e 74 20 73 69 6d 75 6c 74 61 6e 65  revent simultane
e1e0: 6f 75 73 20 61 63 63 65 73 73 20 6f 66 20 74 68  ous access of th
e1f0: 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20  e same database 
e200: 62 79 20 74 77 6f 20 6f 72 20 6d 6f 72 65 0a 2a  by two or more.*
e210: 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * database conne
e220: 63 74 69 6f 6e 73 2e 20 20 42 75 74 20 74 68 65  ctions.  But the
e230: 72 65 20 69 73 20 61 20 73 65 72 69 6f 75 73 20  re is a serious 
e240: 72 69 73 6b 20 6f 66 20 64 61 74 61 62 61 73 65  risk of database
e250: 0a 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20 69  .** corruption i
e260: 66 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20 6d  f this locking m
e270: 6f 64 65 20 69 73 20 75 73 65 64 20 69 6e 20 73  ode is used in s
e280: 69 74 75 61 74 69 6f 6e 73 20 77 68 65 72 65 20  ituations where 
e290: 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 64 61 74 61  multiple.** data
e2a0: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  base connections
e2b0: 20 61 72 65 20 61 63 63 65 73 73 69 6e 67 20 74   are accessing t
e2c0: 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65  he same database
e2d0: 20 66 69 6c 65 20 61 74 20 74 68 65 20 73 61 6d   file at the sam
e2e0: 65 0a 2a 2a 20 74 69 6d 65 20 61 6e 64 20 6f 6e  e.** time and on
e2f0: 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 6f  e or more of tho
e300: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61  se connections a
e310: 72 65 20 77 72 69 74 69 6e 67 2e 0a 2a 2f 0a 0a  re writing..*/..
e320: 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63  static int noloc
e330: 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  kCheckReservedLo
e340: 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
e350: 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 2a 70  *NotUsed, int *p
e360: 52 65 73 4f 75 74 29 7b 0a 20 20 55 4e 55 53 45  ResOut){.  UNUSE
e370: 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
e380: 73 65 64 29 3b 0a 20 20 2a 70 52 65 73 4f 75 74  sed);.  *pResOut
e390: 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 53   = 0;.  return S
e3a0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 73 74 61 74  QLITE_OK;.}.stat
e3b0: 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 4c 6f 63  ic int nolockLoc
e3c0: 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
e3d0: 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 4e 6f 74  NotUsed, int Not
e3e0: 55 73 65 64 32 29 7b 0a 20 20 55 4e 55 53 45 44  Used2){.  UNUSED
e3f0: 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55  _PARAMETER2(NotU
e400: 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a  sed, NotUsed2);.
e410: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
e420: 4f 4b 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74  OK;.}.static int
e430: 20 6e 6f 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71   nolockUnlock(sq
e440: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55  lite3_file *NotU
e450: 73 65 64 2c 20 69 6e 74 20 4e 6f 74 55 73 65 64  sed, int NotUsed
e460: 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  2){.  UNUSED_PAR
e470: 41 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c  AMETER2(NotUsed,
e480: 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 72 65   NotUsed2);.  re
e490: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
e4a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 74  }../*.** Close t
e4b0: 68 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  he file..*/.stat
e4c0: 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 43 6c 6f  ic int nolockClo
e4d0: 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  se(sqlite3_file 
e4e0: 2a 69 64 29 20 7b 0a 20 20 72 65 74 75 72 6e 20  *id) {.  return 
e4f0: 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64  closeUnixFile(id
e500: 29 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  );.}../*********
e510: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f  ********** End o
e520: 66 20 74 68 65 20 6e 6f 2d 6f 70 20 6c 6f 63 6b  f the no-op lock
e530: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
e540: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e550: 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
e560: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e570: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e580: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e590: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e5a0: 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  ****/../********
e5b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e5c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e5d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e5e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e5f0: 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
e600: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e610: 20 42 65 67 69 6e 20 64 6f 74 2d 66 69 6c 65 20   Begin dot-file 
e620: 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a  Locking ********
e630: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e640: 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65  ******.**.** The
e650: 20 64 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67   dotfile locking
e660: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
e670: 75 73 65 73 20 74 68 65 20 65 78 69 73 74 61 6e  uses the existan
e680: 63 65 20 6f 66 20 73 65 70 61 72 61 74 65 20 6c  ce of separate l
e690: 6f 63 6b 0a 2a 2a 20 66 69 6c 65 73 20 69 6e 20  ock.** files in 
e6a0: 6f 72 64 65 72 20 74 6f 20 63 6f 6e 74 72 6f 6c  order to control
e6b0: 20 61 63 63 65 73 73 20 74 6f 20 74 68 65 20 64   access to the d
e6c0: 61 74 61 62 61 73 65 2e 20 20 54 68 69 73 20 77  atabase.  This w
e6d0: 6f 72 6b 73 20 6f 6e 20 6a 75 73 74 0a 2a 2a 20  orks on just.** 
e6e0: 61 62 6f 75 74 20 65 76 65 72 79 20 66 69 6c 65  about every file
e6f0: 73 79 73 74 65 6d 20 69 6d 61 67 69 6e 61 62 6c  system imaginabl
e700: 65 2e 20 20 42 75 74 20 74 68 65 72 65 20 61 72  e.  But there ar
e710: 65 20 73 65 72 69 6f 75 73 20 64 6f 77 6e 73 69  e serious downsi
e720: 64 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31  des:.**.**    (1
e730: 29 20 20 54 68 65 72 65 20 69 73 20 7a 65 72 6f  )  There is zero
e740: 20 63 6f 6e 63 75 72 72 65 6e 63 79 2e 20 20 41   concurrency.  A
e750: 20 73 69 6e 67 6c 65 20 72 65 61 64 65 72 20 62   single reader b
e760: 6c 6f 63 6b 73 20 61 6c 6c 20 6f 74 68 65 72 0a  locks all other.
e770: 2a 2a 20 20 20 20 20 20 20 20 20 63 6f 6e 6e 65  **         conne
e780: 63 74 69 6f 6e 73 20 66 72 6f 6d 20 72 65 61 64  ctions from read
e790: 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74  ing or writing t
e7a0: 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a  he database..**.
e7b0: 2a 2a 20 20 20 20 28 32 29 20 20 41 6e 20 61 70  **    (2)  An ap
e7c0: 70 6c 69 63 61 74 69 6f 6e 20 63 72 61 73 68 20  plication crash 
e7d0: 6f 72 20 70 6f 77 65 72 20 6c 6f 73 73 20 63 61  or power loss ca
e7e0: 6e 20 6c 65 61 76 65 20 73 74 61 6c 65 20 6c 6f  n leave stale lo
e7f0: 63 6b 20 66 69 6c 65 73 0a 2a 2a 20 20 20 20 20  ck files.**     
e800: 20 20 20 20 73 69 74 74 69 6e 67 20 61 72 6f 75      sitting arou
e810: 6e 64 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20  nd that need to 
e820: 62 65 20 63 6c 65 61 72 65 64 20 6d 61 6e 75 61  be cleared manua
e830: 6c 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4e 65 76 65 72  lly..**.** Never
e840: 74 68 65 6c 65 73 73 2c 20 61 20 64 6f 74 6c 6f  theless, a dotlo
e850: 63 6b 20 69 73 20 61 6e 20 61 70 70 72 6f 70 72  ck is an appropr
e860: 69 61 74 65 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64  iate locking mod
e870: 65 20 66 6f 72 20 75 73 65 20 69 66 20 6e 6f 0a  e for use if no.
e880: 2a 2a 20 6f 74 68 65 72 20 6c 6f 63 6b 69 6e 67  ** other locking
e890: 20 73 74 72 61 74 65 67 79 20 69 73 20 61 76 61   strategy is ava
e8a0: 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 44 6f  ilable..**.** Do
e8b0: 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 77 6f  tfile locking wo
e8c0: 72 6b 73 20 62 79 20 63 72 65 61 74 69 6e 67 20  rks by creating 
e8d0: 61 20 66 69 6c 65 20 69 6e 20 74 68 65 20 73 61  a file in the sa
e8e0: 6d 65 20 64 69 72 65 63 74 6f 72 79 20 61 73 20  me directory as 
e8f0: 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
e900: 61 6e 64 20 77 69 74 68 20 74 68 65 20 73 61 6d  and with the sam
e910: 65 20 6e 61 6d 65 20 62 75 74 20 77 69 74 68 20  e name but with 
e920: 61 20 22 2e 6c 6f 63 6b 22 20 65 78 74 65 6e 73  a ".lock" extens
e930: 69 6f 6e 20 61 64 64 65 64 2e 0a 2a 2a 20 54 68  ion added..** Th
e940: 65 20 65 78 69 73 74 61 6e 63 65 20 6f 66 20 61  e existance of a
e950: 20 6c 6f 63 6b 20 66 69 6c 65 20 69 6d 70 6c 69   lock file impli
e960: 65 73 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  es an EXCLUSIVE 
e970: 6c 6f 63 6b 2e 20 20 41 6c 6c 20 6f 74 68 65 72  lock.  All other
e980: 20 6c 6f 63 6b 0a 2a 2a 20 74 79 70 65 73 20 28   lock.** types (
e990: 53 48 41 52 45 44 2c 20 52 45 53 45 52 56 45 44  SHARED, RESERVED
e9a0: 2c 20 50 45 4e 44 49 4e 47 29 20 61 72 65 20 6d  , PENDING) are m
e9b0: 61 70 70 65 64 20 69 6e 74 6f 20 45 58 43 4c 55  apped into EXCLU
e9c0: 53 49 56 45 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  SIVE..*/../*.** 
e9d0: 54 68 65 20 66 69 6c 65 20 73 75 66 66 69 78 20  The file suffix 
e9e0: 61 64 64 65 64 20 74 6f 20 74 68 65 20 64 61 74  added to the dat
e9f0: 61 20 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 20  a base filename 
ea00: 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 72 65 61  in order to crea
ea10: 74 65 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 20 66  te the.** lock f
ea20: 69 6c 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ile..*/.#define 
ea30: 44 4f 54 4c 4f 43 4b 5f 53 55 46 46 49 58 20 22  DOTLOCK_SUFFIX "
ea40: 2e 6c 6f 63 6b 22 0a 0a 2f 2a 0a 2a 2a 20 54 68  .lock"../*.** Th
ea50: 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b  is routine check
ea60: 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20  s if there is a 
ea70: 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65  RESERVED lock he
ea80: 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66  ld on the specif
ea90: 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74  ied.** file by t
eaa0: 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72  his or any other
eab0: 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63   process. If suc
eac0: 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  h a lock is held
ead0: 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a  , set *pResOut.*
eae0: 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20  * to a non-zero 
eaf0: 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20  value otherwise 
eb00: 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65 74 20  *pResOut is set 
eb10: 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65  to zero.  The re
eb20: 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73  turn value.** is
eb30: 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f   set to SQLITE_O
eb40: 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20  K unless an I/O 
eb50: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72  error occurs dur
eb60: 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e  ing lock checkin
eb70: 67 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 64 6f 74 66  g..**.** In dotf
eb80: 69 6c 65 20 6c 6f 63 6b 69 6e 67 2c 20 65 69 74  ile locking, eit
eb90: 68 65 72 20 61 20 6c 6f 63 6b 20 65 78 69 73 74  her a lock exist
eba0: 73 20 6f 72 20 69 74 20 64 6f 65 73 20 6e 6f 74  s or it does not
ebb0: 2e 20 20 53 6f 20 69 6e 20 74 68 69 73 0a 2a 2a  .  So in this.**
ebc0: 20 76 61 72 69 61 74 69 6f 6e 20 6f 66 20 43 68   variation of Ch
ebd0: 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28  eckReservedLock(
ebe0: 29 2c 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73  ), *pResOut is s
ebf0: 65 74 20 74 6f 20 74 72 75 65 20 69 66 20 61 6e  et to true if an
ec00: 79 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20 68 65 6c  y lock.** is hel
ec10: 64 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 61 6e  d on the file an
ec20: 64 20 66 61 6c 73 65 20 69 66 20 74 68 65 20 66  d false if the f
ec30: 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 2e  ile is unlocked.
ec40: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
ec50: 6f 74 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72  otlockCheckReser
ec60: 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  vedLock(sqlite3_
ec70: 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70  file *id, int *p
ec80: 52 65 73 4f 75 74 29 20 7b 0a 20 20 69 6e 74 20  ResOut) {.  int 
ec90: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
eca0: 20 20 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d    int reserved =
ecb0: 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a   0;.  unixFile *
ecc0: 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
ecd0: 65 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61  e*)id;..  Simula
ece0: 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72  teIOError( retur
ecf0: 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43  n SQLITE_IOERR_C
ed00: 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b  HECKRESERVEDLOCK
ed10: 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73 65 72 74  ; );.  .  assert
ed20: 28 20 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a  ( pFile );..  /*
ed30: 20 43 68 65 63 6b 20 69 66 20 61 20 74 68 72 65   Check if a thre
ed40: 61 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65  ad in this proce
ed50: 73 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20  ss holds such a 
ed60: 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46  lock */.  if( pF
ed70: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 53 48  ile->locktype>SH
ed80: 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
ed90: 20 2f 2a 20 45 69 74 68 65 72 20 74 68 69 73 20   /* Either this 
eda0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 72 20 73 6f  connection or so
edb0: 6d 65 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74  me other connect
edc0: 69 6f 6e 20 69 6e 20 74 68 65 20 73 61 6d 65 20  ion in the same 
edd0: 70 72 6f 63 65 73 73 0a 20 20 20 20 2a 2a 20 68  process.    ** h
ede0: 6f 6c 64 73 20 61 20 6c 6f 63 6b 20 6f 6e 20 74  olds a lock on t
edf0: 68 65 20 66 69 6c 65 2e 20 20 4e 6f 20 6e 65 65  he file.  No nee
ee00: 64 20 74 6f 20 63 68 65 63 6b 20 66 75 72 74 68  d to check furth
ee10: 65 72 2e 20 2a 2f 0a 20 20 20 20 72 65 73 65 72  er. */.    reser
ee20: 76 65 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  ved = 1;.  }else
ee30: 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 63  {.    /* The loc
ee40: 6b 20 69 73 20 68 65 6c 64 20 69 66 20 61 6e 64  k is held if and
ee50: 20 6f 6e 6c 79 20 69 66 20 74 68 65 20 6c 6f 63   only if the loc
ee60: 6b 66 69 6c 65 20 65 78 69 73 74 73 20 2a 2f 0a  kfile exists */.
ee70: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
ee80: 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63 6f 6e  zLockFile = (con
ee90: 73 74 20 63 68 61 72 2a 29 70 46 69 6c 65 2d 3e  st char*)pFile->
eea0: 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  lockingContext;.
eeb0: 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 61      reserved = a
eec0: 63 63 65 73 73 28 7a 4c 6f 63 6b 46 69 6c 65 2c  ccess(zLockFile,
eed0: 20 30 29 3d 3d 30 3b 0a 20 20 7d 0a 20 20 4f 53   0)==0;.  }.  OS
eee0: 54 52 41 43 45 34 28 22 54 45 53 54 20 57 52 2d  TRACE4("TEST WR-
eef0: 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 5c 6e 22  LOCK %d %d %d\n"
ef00: 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20  , pFile->h, rc, 
ef10: 72 65 73 65 72 76 65 64 29 3b 0a 20 20 2a 70 52  reserved);.  *pR
ef20: 65 73 4f 75 74 20 3d 20 72 65 73 65 72 76 65 64  esOut = reserved
ef30: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
ef40: 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65  ../*.** Lock the
ef50: 20 66 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c   file with the l
ef60: 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20 62 79  ock specified by
ef70: 20 70 61 72 61 6d 65 74 65 72 20 6c 6f 63 6b 74   parameter lockt
ef80: 79 70 65 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20  ype - one.** of 
ef90: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a  the following:.*
efa0: 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41  *.**     (1) SHA
efb0: 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  RED_LOCK.**     
efc0: 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  (2) RESERVED_LOC
efd0: 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e  K.**     (3) PEN
efe0: 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  DING_LOCK.**    
eff0: 20 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c   (4) EXCLUSIVE_L
f000: 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69  OCK.**.** Someti
f010: 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65 73 74  mes when request
f020: 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61  ing one lock sta
f030: 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c  te, additional l
f040: 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72  ock states.** ar
f050: 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65  e inserted in be
f060: 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b  tween.  The lock
f070: 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f  ing might fail o
f080: 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74  n one of the lat
f090: 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  er.** transition
f0a0: 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f  s leaving the lo
f0b0: 63 6b 20 73 74 61 74 65 20 64 69 66 66 65 72 65  ck state differe
f0c0: 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20  nt from what it 
f0d0: 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73  started but.** s
f0e0: 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74  till short of it
f0f0: 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c  s goal.  The fol
f100: 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f  lowing chart sho
f110: 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a  ws the allowed.*
f120: 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e  * transitions an
f130: 64 20 74 68 65 20 69 6e 73 65 72 74 65 64 20 69  d the inserted i
f140: 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74  ntermediate stat
f150: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c  es:.**.**    UNL
f160: 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a  OCKED -> SHARED.
f170: 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20  **    SHARED -> 
f180: 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53  RESERVED.**    S
f190: 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e  HARED -> (PENDIN
f1a0: 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  G) -> EXCLUSIVE.
f1b0: 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44 20 2d  **    RESERVED -
f1c0: 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45  > (PENDING) -> E
f1d0: 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50  XCLUSIVE.**    P
f1e0: 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53  ENDING -> EXCLUS
f1f0: 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  IVE.**.** This r
f200: 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79  outine will only
f210: 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b   increase a lock
f220: 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c 69 74  .  Use the sqlit
f230: 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20  e3OsUnlock().** 
f240: 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72  routine to lower
f250: 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c   a locking level
f260: 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 20 64 6f 74  ..**.** With dot
f270: 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2c 20 77 65  file locking, we
f280: 20 72 65 61 6c 6c 79 20 6f 6e 6c 79 20 73 75 70   really only sup
f290: 70 6f 72 74 20 73 74 61 74 65 20 28 34 29 3a 20  port state (4): 
f2a0: 45 58 43 4c 55 53 49 56 45 2e 0a 2a 2a 20 42 75  EXCLUSIVE..** Bu
f2b0: 74 20 77 65 20 74 72 61 63 6b 20 74 68 65 20 6f  t we track the o
f2c0: 74 68 65 72 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  ther locking lev
f2d0: 65 6c 73 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a  els internally..
f2e0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f  */.static int do
f2f0: 74 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69 74 65  tlockLock(sqlite
f300: 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
f310: 6c 6f 63 6b 74 79 70 65 29 20 7b 0a 20 20 75 6e  locktype) {.  un
f320: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
f330: 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
f340: 20 69 6e 74 20 66 64 3b 0a 20 20 63 68 61 72 20   int fd;.  char 
f350: 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63 68  *zLockFile = (ch
f360: 61 72 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ar *)pFile->lock
f370: 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 69 6e  ingContext;.  in
f380: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
f390: 3b 0a 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 68  ;...  /* If we h
f3a0: 61 76 65 20 61 6e 79 20 6c 6f 63 6b 2c 20 74 68  ave any lock, th
f3b0: 65 6e 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65  en the lock file
f3c0: 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 2e   already exists.
f3d0: 20 20 41 6c 6c 20 77 65 20 68 61 76 65 0a 20 20    All we have.  
f3e0: 2a 2a 20 74 6f 20 64 6f 20 69 73 20 61 64 6a 75  ** to do is adju
f3f0: 73 74 20 6f 75 72 20 69 6e 74 65 72 6e 61 6c 20  st our internal 
f400: 72 65 63 6f 72 64 20 6f 66 20 74 68 65 20 6c 6f  record of the lo
f410: 63 6b 20 6c 65 76 65 6c 2e 0a 20 20 2a 2f 0a 20  ck level..  */. 
f420: 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b   if( pFile->lock
f430: 74 79 70 65 20 3e 20 4e 4f 5f 4c 4f 43 4b 20 29  type > NO_LOCK )
f440: 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63  {.    pFile->loc
f450: 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65  ktype = locktype
f460: 3b 0a 23 69 66 20 21 4f 53 5f 56 58 57 4f 52 4b  ;.#if !OS_VXWORK
f470: 53 0a 20 20 20 20 2f 2a 20 41 6c 77 61 79 73 20  S.    /* Always 
f480: 75 70 64 61 74 65 20 74 68 65 20 74 69 6d 65 73  update the times
f490: 74 61 6d 70 20 6f 6e 20 74 68 65 20 6f 6c 64 20  tamp on the old 
f4a0: 66 69 6c 65 20 2a 2f 0a 20 20 20 20 75 74 69 6d  file */.    utim
f4b0: 65 73 28 7a 4c 6f 63 6b 46 69 6c 65 2c 20 4e 55  es(zLockFile, NU
f4c0: 4c 4c 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  LL);.#endif.    
f4d0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
f4e0: 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 67 72  ;.  }.  .  /* gr
f4f0: 61 62 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  ab an exclusive 
f500: 6c 6f 63 6b 20 2a 2f 0a 20 20 66 64 20 3d 20 6f  lock */.  fd = o
f510: 70 65 6e 28 7a 4c 6f 63 6b 46 69 6c 65 2c 4f 5f  pen(zLockFile,O_
f520: 52 44 4f 4e 4c 59 7c 4f 5f 43 52 45 41 54 7c 4f  RDONLY|O_CREAT|O
f530: 5f 45 58 43 4c 2c 30 36 30 30 29 3b 0a 20 20 69  _EXCL,0600);.  i
f540: 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 2f  f( fd<0 ){.    /
f550: 2a 20 66 61 69 6c 65 64 20 74 6f 20 6f 70 65 6e  * failed to open
f560: 2f 63 72 65 61 74 65 20 74 68 65 20 66 69 6c 65  /create the file
f570: 2c 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 6d  , someone else m
f580: 61 79 20 68 61 76 65 20 73 74 6f 6c 65 6e 20 74  ay have stolen t
f590: 68 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 69  he lock */.    i
f5a0: 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  nt tErrno = errn
f5b0: 6f 3b 0a 20 20 20 20 69 66 28 20 45 45 58 49 53  o;.    if( EEXIS
f5c0: 54 20 3d 3d 20 74 45 72 72 6e 6f 20 29 7b 0a 20  T == tErrno ){. 
f5d0: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
f5e0: 5f 42 55 53 59 3b 0a 20 20 20 20 7d 20 65 6c 73  _BUSY;.    } els
f5f0: 65 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  e {.      rc = s
f600: 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
f610: 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c  sixError(tErrno,
f620: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f   SQLITE_IOERR_LO
f630: 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 49  CK);.      if( I
f640: 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29  S_LOCK_ERROR(rc)
f650: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c   ){.        pFil
f660: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74  e->lastErrno = t
f670: 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20  Errno;.      }. 
f680: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
f690: 72 63 3b 0a 20 20 7d 20 0a 20 20 69 66 28 20 63  rc;.  } .  if( c
f6a0: 6c 6f 73 65 28 66 64 29 20 29 7b 0a 20 20 20 20  lose(fd) ){.    
f6b0: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
f6c0: 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 72 63   = errno;.    rc
f6d0: 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
f6e0: 43 4c 4f 53 45 3b 0a 20 20 7d 0a 20 20 0a 20 20  CLOSE;.  }.  .  
f6f0: 2f 2a 20 67 6f 74 20 69 74 2c 20 73 65 74 20 74  /* got it, set t
f700: 68 65 20 74 79 70 65 20 61 6e 64 20 72 65 74 75  he type and retu
f710: 72 6e 20 6f 6b 20 2a 2f 0a 20 20 70 46 69 6c 65  rn ok */.  pFile
f720: 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63  ->locktype = loc
f730: 6b 74 79 70 65 3b 0a 20 20 72 65 74 75 72 6e 20  ktype;.  return 
f740: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77  rc;.}../*.** Low
f750: 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  er the locking l
f760: 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73  evel on file des
f770: 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f  criptor pFile to
f780: 20 6c 6f 63 6b 74 79 70 65 2e 20 20 6c 6f 63 6b   locktype.  lock
f790: 74 79 70 65 0a 2a 2a 20 6d 75 73 74 20 62 65 20  type.** must be 
f7a0: 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f  either NO_LOCK o
f7b0: 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a  r SHARED_LOCK..*
f7c0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b  *.** If the lock
f7d0: 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65  ing level of the
f7e0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
f7f0: 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f   is already at o
f800: 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72  r below.** the r
f810: 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67  equested locking
f820: 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75   level, this rou
f830: 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
f840: 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 65 20  .**.** When the 
f850: 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 72 65  locking level re
f860: 61 63 68 65 73 20 4e 4f 5f 4c 4f 43 4b 2c 20 64  aches NO_LOCK, d
f870: 65 6c 65 74 65 20 74 68 65 20 6c 6f 63 6b 20 66  elete the lock f
f880: 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
f890: 6e 74 20 64 6f 74 6c 6f 63 6b 55 6e 6c 6f 63 6b  nt dotlockUnlock
f8a0: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
f8b0: 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29  d, int locktype)
f8c0: 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70   {.  unixFile *p
f8d0: 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
f8e0: 2a 29 69 64 3b 0a 20 20 63 68 61 72 20 2a 7a 4c  *)id;.  char *zL
f8f0: 6f 63 6b 46 69 6c 65 20 3d 20 28 63 68 61 72 20  ockFile = (char 
f900: 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  *)pFile->locking
f910: 43 6f 6e 74 65 78 74 3b 0a 0a 20 20 61 73 73 65  Context;..  asse
f920: 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f  rt( pFile );.  O
f930: 53 54 52 41 43 45 35 28 22 55 4e 4c 4f 43 4b 20  STRACE5("UNLOCK 
f940: 20 25 64 20 25 64 20 77 61 73 20 25 64 20 70 69   %d %d was %d pi
f950: 64 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  d=%d\n", pFile->
f960: 68 2c 20 6c 6f 63 6b 74 79 70 65 2c 0a 09 20 20  h, locktype,..  
f970: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
f980: 2c 20 67 65 74 70 69 64 28 29 29 3b 0a 20 20 61  , getpid());.  a
f990: 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 3c  ssert( locktype<
f9a0: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
f9b0: 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66    .  /* no-op if
f9c0: 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 20 20 69   possible */.  i
f9d0: 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  f( pFile->lockty
f9e0: 70 65 3d 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a  pe==locktype ){.
f9f0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
fa00: 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  E_OK;.  }..  /* 
fa10: 54 6f 20 64 6f 77 6e 67 72 61 64 65 20 74 6f 20  To downgrade to 
fa20: 73 68 61 72 65 64 2c 20 73 69 6d 70 6c 79 20 75  shared, simply u
fa30: 70 64 61 74 65 20 6f 75 72 20 69 6e 74 65 72 6e  pdate our intern
fa40: 61 6c 20 6e 6f 74 69 6f 6e 20 6f 66 20 74 68 65  al notion of the
fa50: 0a 20 20 2a 2a 20 6c 6f 63 6b 20 73 74 61 74 65  .  ** lock state
fa60: 2e 20 20 4e 6f 20 6e 65 65 64 20 74 6f 20 6d 65  .  No need to me
fa70: 73 73 20 77 69 74 68 20 74 68 65 20 66 69 6c 65  ss with the file
fa80: 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20   on disk..  */. 
fa90: 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53   if( locktype==S
faa0: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  HARED_LOCK ){.  
fab0: 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70    pFile->locktyp
fac0: 65 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b  e = SHARED_LOCK;
fad0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
fae0: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20  TE_OK;.  }.  .  
faf0: 2f 2a 20 54 6f 20 66 75 6c 6c 79 20 75 6e 6c 6f  /* To fully unlo
fb00: 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  ck the database,
fb10: 20 64 65 6c 65 74 65 20 74 68 65 20 6c 6f 63 6b   delete the lock
fb20: 20 66 69 6c 65 20 2a 2f 0a 20 20 61 73 73 65 72   file */.  asser
fb30: 74 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f  t( locktype==NO_
fb40: 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 75 6e  LOCK );.  if( un
fb50: 6c 69 6e 6b 28 7a 4c 6f 63 6b 46 69 6c 65 29 20  link(zLockFile) 
fb60: 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20  ){.    int rc = 
fb70: 30 3b 0a 20 20 20 20 69 6e 74 20 74 45 72 72 6e  0;.    int tErrn
fb80: 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 69  o = errno;.    i
fb90: 66 28 20 45 4e 4f 45 4e 54 20 21 3d 20 74 45 72  f( ENOENT != tEr
fba0: 72 6e 6f 20 29 7b 0a 20 20 20 20 20 20 72 63 20  rno ){.      rc 
fbb0: 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  = sqliteErrorFro
fbc0: 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72  mPosixError(tErr
fbd0: 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  no, SQLITE_IOERR
fbe0: 5f 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20 7d 0a  _UNLOCK);.    }.
fbf0: 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
fc00: 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20  ERROR(rc) ){.   
fc10: 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
fc20: 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20  rno = tErrno;.  
fc30: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72    }.    return r
fc40: 63 3b 20 0a 20 20 7d 0a 20 20 70 46 69 6c 65 2d  c; .  }.  pFile-
fc50: 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 4e 4f 5f 4c  >locktype = NO_L
fc60: 4f 43 4b 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  OCK;.  return SQ
fc70: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
fc80: 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 20  * Close a file. 
fc90: 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6c   Make sure the l
fca0: 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 72 65 6c  ock has been rel
fcb0: 65 61 73 65 64 20 62 65 66 6f 72 65 20 63 6c 6f  eased before clo
fcc0: 73 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  sing..*/.static 
fcd0: 69 6e 74 20 64 6f 74 6c 6f 63 6b 43 6c 6f 73 65  int dotlockClose
fce0: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
fcf0: 64 29 20 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  d) {.  int rc;. 
fd00: 20 69 66 28 20 69 64 20 29 7b 0a 20 20 20 20 75   if( id ){.    u
fd10: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
fd20: 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
fd30: 20 20 20 20 64 6f 74 6c 6f 63 6b 55 6e 6c 6f 63      dotlockUnloc
fd40: 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a  k(id, NO_LOCK);.
fd50: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
fd60: 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43  (pFile->lockingC
fd70: 6f 6e 74 65 78 74 29 3b 0a 20 20 7d 0a 20 20 72  ontext);.  }.  r
fd80: 63 20 3d 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c  c = closeUnixFil
fd90: 65 28 69 64 29 3b 0a 20 20 72 65 74 75 72 6e 20  e(id);.  return 
fda0: 72 63 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  rc;.}./*********
fdb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66  ********* End of
fdc0: 20 74 68 65 20 64 6f 74 2d 66 69 6c 65 20 6c 6f   the dot-file lo
fdd0: 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ck implementatio
fde0: 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  n **************
fdf0: 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
fe00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fe10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fe20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fe30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fe40: 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  ****/../********
fe50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fe60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fe70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fe80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fe90: 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
fea0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
feb0: 2a 20 42 65 67 69 6e 20 66 6c 6f 63 6b 20 4c 6f  * Begin flock Lo
fec0: 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  cking **********
fed0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fee0: 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 55 73 65  ******.**.** Use
fef0: 20 74 68 65 20 66 6c 6f 63 6b 28 29 20 73 79 73   the flock() sys
ff00: 74 65 6d 20 63 61 6c 6c 20 74 6f 20 64 6f 20 66  tem call to do f
ff10: 69 6c 65 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2a 0a  ile locking..**.
ff20: 2a 2a 20 66 6c 6f 63 6b 28 29 20 6c 6f 63 6b 69  ** flock() locki
ff30: 6e 67 20 69 73 20 6c 69 6b 65 20 64 6f 74 2d 66  ng is like dot-f
ff40: 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 6e 20 74  ile locking in t
ff50: 68 61 74 20 74 68 65 20 76 61 72 69 6f 75 73 0a  hat the various.
ff60: 2a 2a 20 66 69 6e 65 2d 67 72 61 69 6e 20 6c 6f  ** fine-grain lo
ff70: 63 6b 69 6e 67 20 6c 65 76 65 6c 73 20 73 75 70  cking levels sup
ff80: 70 6f 72 74 65 64 20 62 79 20 53 51 4c 69 74 65  ported by SQLite
ff90: 20 61 72 65 20 63 6f 6c 6c 61 70 73 65 64 20 69   are collapsed i
ffa0: 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20  nto.** a single 
ffb0: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e 20  exclusive lock. 
ffc0: 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
ffd0: 20 53 48 41 52 45 44 2c 20 52 45 53 45 52 56 45   SHARED, RESERVE
ffe0: 44 2c 20 61 6e 64 0a 2a 2a 20 50 45 4e 44 49 4e  D, and.** PENDIN
fff0: 47 20 6c 6f 63 6b 73 20 61 72 65 20 74 68 65 20  G locks are the 
10000 73 61 6d 65 20 74 68 69 6e 67 20 61 73 20 61 6e  same thing as an
10010 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
10020 20 20 53 51 4c 69 74 65 0a 2a 2a 20 73 74 69 6c    SQLite.** stil
10030 6c 20 77 6f 72 6b 73 20 77 68 65 6e 20 79 6f 75  l works when you
10040 20 64 6f 20 74 68 69 73 2c 20 62 75 74 20 63 6f   do this, but co
10050 6e 63 75 72 72 65 6e 63 79 20 69 73 20 72 65 64  ncurrency is red
10060 75 63 65 64 20 73 69 6e 63 65 0a 2a 2a 20 6f 6e  uced since.** on
10070 6c 79 20 61 20 73 69 6e 67 6c 65 20 70 72 6f 63  ly a single proc
10080 65 73 73 20 63 61 6e 20 62 65 20 72 65 61 64 69  ess can be readi
10090 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ng the database 
100a0 61 74 20 61 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a  at a time..**.**
100b0 20 4f 6d 69 74 20 74 68 69 73 20 73 65 63 74 69   Omit this secti
100c0 6f 6e 20 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  on if SQLITE_ENA
100d0 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
100e0 45 20 69 73 20 74 75 72 6e 65 64 20 6f 66 66 20  E is turned off 
100f0 6f 72 20 69 66 0a 2a 2a 20 63 6f 6d 70 69 6c 69  or if.** compili
10100 6e 67 20 66 6f 72 20 56 58 57 4f 52 4b 53 2e 0a  ng for VXWORKS..
10110 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e  */.#if SQLITE_EN
10120 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
10130 4c 45 20 26 26 20 21 4f 53 5f 56 58 57 4f 52 4b  LE && !OS_VXWORK
10140 53 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  S../*.** This ro
10150 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20  utine checks if 
10160 74 68 65 72 65 20 69 73 20 61 20 52 45 53 45 52  there is a RESER
10170 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e  VED lock held on
10180 20 74 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a   the specified.*
10190 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f  * file by this o
101a0 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63  r any other proc
101b0 65 73 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c  ess. If such a l
101c0 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74  ock is held, set
101d0 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20   *pResOut.** to 
101e0 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65  a non-zero value
101f0 20 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65 73   otherwise *pRes
10200 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65  Out is set to ze
10210 72 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20  ro.  The return 
10220 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20  value.** is set 
10230 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c  to SQLITE_OK unl
10240 65 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72  ess an I/O error
10250 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c   occurs during l
10260 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f  ock checking..*/
10270 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c 6f 63  .static int floc
10280 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  kCheckReservedLo
10290 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
102a0 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75  *id, int *pResOu
102b0 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
102c0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
102d0 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20  reserved = 0;.  
102e0 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
102f0 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
10300 0a 20 20 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  .  .  SimulateIO
10310 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51  Error( return SQ
10320 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b  LITE_IOERR_CHECK
10330 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b  RESERVEDLOCK; );
10340 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 70 46  .  .  assert( pF
10350 69 6c 65 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 43  ile );.  .  /* C
10360 68 65 63 6b 20 69 66 20 61 20 74 68 72 65 61 64  heck if a thread
10370 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73   in this process
10380 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c 6f   holds such a lo
10390 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  ck */.  if( pFil
103a0 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 53 48 41 52  e->locktype>SHAR
103b0 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72  ED_LOCK ){.    r
103c0 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d  eserved = 1;.  }
103d0 0a 20 20 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69  .  .  /* Otherwi
103e0 73 65 20 73 65 65 20 69 66 20 73 6f 6d 65 20 6f  se see if some o
103f0 74 68 65 72 20 70 72 6f 63 65 73 73 20 68 6f 6c  ther process hol
10400 64 73 20 69 74 2e 20 2a 2f 0a 20 20 69 66 28 20  ds it. */.  if( 
10410 21 72 65 73 65 72 76 65 64 20 29 7b 0a 20 20 20  !reserved ){.   
10420 20 2f 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 67   /* attempt to g
10430 65 74 20 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 20  et the lock */. 
10440 20 20 20 69 6e 74 20 6c 72 63 20 3d 20 66 6c 6f     int lrc = flo
10450 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43  ck(pFile->h, LOC
10460 4b 5f 45 58 20 7c 20 4c 4f 43 4b 5f 4e 42 29 3b  K_EX | LOCK_NB);
10470 0a 20 20 20 20 69 66 28 20 21 6c 72 63 20 29 7b  .    if( !lrc ){
10480 0a 20 20 20 20 20 20 2f 2a 20 67 6f 74 20 74 68  .      /* got th
10490 65 20 6c 6f 63 6b 2c 20 75 6e 6c 6f 63 6b 20 69  e lock, unlock i
104a0 74 20 2a 2f 0a 20 20 20 20 20 20 6c 72 63 20 3d  t */.      lrc =
104b0 20 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c   flock(pFile->h,
104c0 20 4c 4f 43 4b 5f 55 4e 29 3b 0a 20 20 20 20 20   LOCK_UN);.     
104d0 20 69 66 20 28 20 6c 72 63 20 29 20 7b 0a 20 20   if ( lrc ) {.  
104e0 20 20 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f        int tErrno
104f0 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
10500 20 20 2f 2a 20 75 6e 6c 6f 63 6b 20 66 61 69 6c    /* unlock fail
10510 65 64 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72  ed with an error
10520 20 2a 2f 0a 20 20 20 20 20 20 20 20 6c 72 63 20   */.        lrc 
10530 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  = sqliteErrorFro
10540 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72  mPosixError(tErr
10550 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  no, SQLITE_IOERR
10560 5f 55 4e 4c 4f 43 4b 29 3b 20 0a 20 20 20 20 20  _UNLOCK); .     
10570 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
10580 52 52 4f 52 28 6c 72 63 29 20 29 7b 0a 20 20 20  RROR(lrc) ){.   
10590 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61         pFile->la
105a0 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f  stErrno = tErrno
105b0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
105c0 20 6c 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a   lrc;.        }.
105d0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c        }.    } el
105e0 73 65 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 74  se {.      int t
105f0 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
10600 20 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20       reserved = 
10610 31 3b 0a 20 20 20 20 20 20 2f 2a 20 73 6f 6d 65  1;.      /* some
10620 6f 6e 65 20 65 6c 73 65 20 6d 69 67 68 74 20 68  one else might h
10630 61 76 65 20 69 74 20 72 65 73 65 72 76 65 64 20  ave it reserved 
10640 2a 2f 0a 20 20 20 20 20 20 6c 72 63 20 3d 20 73  */.      lrc = s
10650 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
10660 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c  sixError(tErrno,
10670 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f   SQLITE_IOERR_LO
10680 43 4b 29 3b 20 0a 20 20 20 20 20 20 69 66 28 20  CK); .      if( 
10690 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72  IS_LOCK_ERROR(lr
106a0 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46  c) ){.        pF
106b0 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
106c0 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20   tErrno;.       
106d0 20 72 63 20 3d 20 6c 72 63 3b 0a 20 20 20 20 20   rc = lrc;.     
106e0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 4f   }.    }.  }.  O
106f0 53 54 52 41 43 45 34 28 22 54 45 53 54 20 57 52  STRACE4("TEST WR
10700 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 5c 6e  -LOCK %d %d %d\n
10710 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c  ", pFile->h, rc,
10720 20 72 65 73 65 72 76 65 64 29 3b 0a 0a 23 69 66   reserved);..#if
10730 64 65 66 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52  def SQLITE_IGNOR
10740 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52  E_FLOCK_LOCK_ERR
10750 4f 52 53 0a 20 20 69 66 28 20 28 72 63 20 26 20  ORS.  if( (rc & 
10760 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 20 3d 3d  SQLITE_IOERR) ==
10770 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b   SQLITE_IOERR ){
10780 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
10790 5f 4f 4b 3b 0a 20 20 20 20 72 65 73 65 72 76 65  _OK;.    reserve
107a0 64 3d 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20  d=1;.  }.#endif 
107b0 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45  /* SQLITE_IGNORE
107c0 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f  _FLOCK_LOCK_ERRO
107d0 52 53 20 2a 2f 0a 20 20 2a 70 52 65 73 4f 75 74  RS */.  *pResOut
107e0 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20 20 72   = reserved;.  r
107f0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
10800 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65  ** Lock the file
10810 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73   with the lock s
10820 70 65 63 69 66 69 65 64 20 62 79 20 70 61 72 61  pecified by para
10830 6d 65 74 65 72 20 6c 6f 63 6b 74 79 70 65 20 2d  meter locktype -
10840 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66   one.** of the f
10850 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20  ollowing:.**.** 
10860 20 20 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c      (1) SHARED_L
10870 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52  OCK.**     (2) R
10880 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20  ESERVED_LOCK.** 
10890 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f      (3) PENDING_
108a0 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20  LOCK.**     (4) 
108b0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a  EXCLUSIVE_LOCK.*
108c0 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77  *.** Sometimes w
108d0 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f  hen requesting o
108e0 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61  ne lock state, a
108f0 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73  dditional lock s
10900 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73  tates.** are ins
10910 65 72 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e  erted in between
10920 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d  .  The locking m
10930 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65  ight fail on one
10940 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a   of the later.**
10950 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61   transitions lea
10960 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74  ving the lock st
10970 61 74 65 20 64 69 66 66 65 72 65 6e 74 20 66 72  ate different fr
10980 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61 72 74  om what it start
10990 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20  ed but.** still 
109a0 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61  short of its goa
109b0 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  l.  The followin
109c0 67 20 63 68 61 72 74 20 73 68 6f 77 73 20 74 68  g chart shows th
109d0 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61  e allowed.** tra
109e0 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65  nsitions and the
109f0 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d   inserted interm
10a00 65 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a  ediate states:.*
10a10 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44  *.**    UNLOCKED
10a20 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20   -> SHARED.**   
10a30 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52   SHARED -> RESER
10a40 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44  VED.**    SHARED
10a50 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e   -> (PENDING) ->
10a60 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20   EXCLUSIVE.**   
10a70 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45   RESERVED -> (PE
10a80 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53  NDING) -> EXCLUS
10a90 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e  IVE.**    PENDIN
10aa0 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  G -> EXCLUSIVE.*
10ab0 2a 0a 2a 2a 20 66 6c 6f 63 6b 28 29 20 6f 6e 6c  *.** flock() onl
10ac0 79 20 72 65 61 6c 6c 79 20 73 75 70 70 6f 72 74  y really support
10ad0 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73   EXCLUSIVE locks
10ae0 2e 20 20 57 65 20 74 72 61 63 6b 20 69 6e 74 65  .  We track inte
10af0 72 6d 65 64 69 61 74 65 0a 2a 2a 20 6c 6f 63 6b  rmediate.** lock
10b00 20 73 74 61 74 65 73 20 69 6e 20 74 68 65 20 73   states in the s
10b10 71 6c 69 74 65 33 5f 66 69 6c 65 20 73 74 72 75  qlite3_file stru
10b20 63 74 75 72 65 2c 20 62 75 74 20 61 6c 6c 20 6c  cture, but all l
10b30 6f 63 6b 73 20 53 48 41 52 45 44 20 6f 72 0a 2a  ocks SHARED or.*
10b40 2a 20 61 62 6f 76 65 20 61 72 65 20 72 65 61 6c  * above are real
10b50 6c 79 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  ly EXCLUSIVE loc
10b60 6b 73 20 61 6e 64 20 65 78 63 6c 75 64 65 20 61  ks and exclude a
10b70 6c 6c 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  ll other process
10b80 65 73 20 66 72 6f 6d 0a 2a 2a 20 61 63 63 65 73  es from.** acces
10b90 73 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  s the file..**.*
10ba0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
10bb0 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73  ill only increas
10bc0 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74  e a lock.  Use t
10bd0 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f  he sqlite3OsUnlo
10be0 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  ck().** routine 
10bf0 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69  to lower a locki
10c00 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61  ng level..*/.sta
10c10 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b 4c 6f 63  tic int flockLoc
10c20 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
10c30 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65  id, int locktype
10c40 29 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  ) {.  int rc = S
10c50 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78  QLITE_OK;.  unix
10c60 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
10c70 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20  nixFile*)id;..  
10c80 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
10c90 0a 0a 20 20 2f 2a 20 69 66 20 77 65 20 61 6c 72  ..  /* if we alr
10ca0 65 61 64 79 20 68 61 76 65 20 61 20 6c 6f 63 6b  eady have a lock
10cb0 2c 20 69 74 20 69 73 20 65 78 63 6c 75 73 69 76  , it is exclusiv
10cc0 65 2e 20 20 0a 20 20 2a 2a 20 4a 75 73 74 20 61  e.  .  ** Just a
10cd0 64 6a 75 73 74 20 6c 65 76 65 6c 20 61 6e 64 20  djust level and 
10ce0 70 75 6e 74 20 6f 6e 20 6f 75 74 74 61 20 68 65  punt on outta he
10cf0 72 65 2e 20 2a 2f 0a 20 20 69 66 20 28 70 46 69  re. */.  if (pFi
10d00 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3e 20 4e  le->locktype > N
10d10 4f 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46  O_LOCK) {.    pF
10d20 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20  ile->locktype = 
10d30 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20 72 65  locktype;.    re
10d40 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
10d50 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 67 72 61 62    }.  .  /* grab
10d60 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
10d70 63 6b 20 2a 2f 0a 20 20 0a 20 20 69 66 20 28 66  ck */.  .  if (f
10d80 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c  lock(pFile->h, L
10d90 4f 43 4b 5f 45 58 20 7c 20 4c 4f 43 4b 5f 4e 42  OCK_EX | LOCK_NB
10da0 29 29 20 7b 0a 20 20 20 20 69 6e 74 20 74 45 72  )) {.    int tEr
10db0 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
10dc0 20 2f 2a 20 64 69 64 6e 27 74 20 67 65 74 2c 20   /* didn't get, 
10dd0 6d 75 73 74 20 62 65 20 62 75 73 79 20 2a 2f 0a  must be busy */.
10de0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45      rc = sqliteE
10df0 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
10e00 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54  or(tErrno, SQLIT
10e10 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20  E_IOERR_LOCK);. 
10e20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
10e30 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20  RROR(rc) ){.    
10e40 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
10e50 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20  no = tErrno;.   
10e60 20 7d 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20   }.  } else {.  
10e70 20 20 2f 2a 20 67 6f 74 20 69 74 2c 20 73 65 74    /* got it, set
10e80 20 74 68 65 20 74 79 70 65 20 61 6e 64 20 72 65   the type and re
10e90 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20 20 20 70  turn ok */.    p
10ea0 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d  File->locktype =
10eb0 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 7d 0a 20   locktype;.  }. 
10ec0 20 4f 53 54 52 41 43 45 34 28 22 4c 4f 43 4b 20   OSTRACE4("LOCK 
10ed0 20 20 20 25 64 20 25 73 20 25 73 5c 6e 22 2c 20     %d %s %s\n", 
10ee0 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79  pFile->h, lockty
10ef0 70 65 4e 61 6d 65 28 6c 6f 63 6b 74 79 70 65 29  peName(locktype)
10f00 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 72 63  , .           rc
10f10 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f  ==SQLITE_OK ? "o
10f20 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 3b 0a  k" : "failed");.
10f30 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 49 47  #ifdef SQLITE_IG
10f40 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f  NORE_FLOCK_LOCK_
10f50 45 52 52 4f 52 53 0a 20 20 69 66 28 20 28 72 63  ERRORS.  if( (rc
10f60 20 26 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29   & SQLITE_IOERR)
10f70 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52   == SQLITE_IOERR
10f80 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
10f90 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 23 65  ITE_BUSY;.  }.#e
10fa0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49  ndif /* SQLITE_I
10fb0 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b  GNORE_FLOCK_LOCK
10fc0 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20 72 65 74  _ERRORS */.  ret
10fd0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
10fe0 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b  * Lower the lock
10ff0 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c  ing level on fil
11000 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69  e descriptor pFi
11010 6c 65 20 74 6f 20 6c 6f 63 6b 74 79 70 65 2e 20  le to locktype. 
11020 20 6c 6f 63 6b 74 79 70 65 0a 2a 2a 20 6d 75 73   locktype.** mus
11030 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c  t be either NO_L
11040 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f  OCK or SHARED_LO
11050 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  CK..**.** If the
11060 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
11070 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  f the file descr
11080 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79  iptor is already
11090 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20   at or below.** 
110a0 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
110b0 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69  cking level, thi
110c0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
110d0 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
110e0 69 6e 74 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 28  int flockUnlock(
110f0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
11100 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 20  , int locktype) 
11110 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  {.  unixFile *pF
11120 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
11130 29 69 64 3b 0a 20 20 0a 20 20 61 73 73 65 72 74  )id;.  .  assert
11140 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54  ( pFile );.  OST
11150 52 41 43 45 35 28 22 55 4e 4c 4f 43 4b 20 20 25  RACE5("UNLOCK  %
11160 64 20 25 64 20 77 61 73 20 25 64 20 70 69 64 3d  d %d was %d pid=
11170 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  %d\n", pFile->h,
11180 20 6c 6f 63 6b 74 79 70 65 2c 0a 20 20 20 20 20   locktype,.     
11190 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63        pFile->loc
111a0 6b 74 79 70 65 2c 20 67 65 74 70 69 64 28 29 29  ktype, getpid())
111b0 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b  ;.  assert( lock
111c0 74 79 70 65 3c 3d 53 48 41 52 45 44 5f 4c 4f 43  type<=SHARED_LOC
111d0 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d  K );.  .  /* no-
111e0 6f 70 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a  op if possible *
111f0 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c  /.  if( pFile->l
11200 6f 63 6b 74 79 70 65 3d 3d 6c 6f 63 6b 74 79 70  ocktype==locktyp
11210 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
11220 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
11230 20 0a 20 20 2f 2a 20 73 68 61 72 65 64 20 63 61   .  /* shared ca
11240 6e 20 6a 75 73 74 20 62 65 20 73 65 74 20 62 65  n just be set be
11250 63 61 75 73 65 20 77 65 20 61 6c 77 61 79 73 20  cause we always 
11260 68 61 76 65 20 61 6e 20 65 78 63 6c 75 73 69 76  have an exclusiv
11270 65 20 2a 2f 0a 20 20 69 66 20 28 6c 6f 63 6b 74  e */.  if (lockt
11280 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype==SHARED_LOCK
11290 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c  ) {.    pFile->l
112a0 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79  ocktype = lockty
112b0 70 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  pe;.    return S
112c0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
112d0 0a 20 20 2f 2a 20 6e 6f 2c 20 72 65 61 6c 6c 79  .  /* no, really
112e0 2c 20 75 6e 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 69  , unlock. */.  i
112f0 6e 74 20 72 63 20 3d 20 66 6c 6f 63 6b 28 70 46  nt rc = flock(pF
11300 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 55 4e 29  ile->h, LOCK_UN)
11310 3b 0a 20 20 69 66 20 28 72 63 29 20 7b 0a 20 20  ;.  if (rc) {.  
11320 20 20 69 6e 74 20 72 2c 20 74 45 72 72 6e 6f 20    int r, tErrno 
11330 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 72 20 3d  = errno;.    r =
11340 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d   sqliteErrorFrom
11350 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e  PosixError(tErrn
11360 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  o, SQLITE_IOERR_
11370 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28  UNLOCK);.    if(
11380 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72   IS_LOCK_ERROR(r
11390 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  ) ){.      pFile
113a0 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45  ->lastErrno = tE
113b0 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 23 69 66 64  rrno;.    }.#ifd
113c0 65 66 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45  ef SQLITE_IGNORE
113d0 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f  _FLOCK_LOCK_ERRO
113e0 52 53 0a 20 20 20 20 69 66 28 20 28 72 20 26 20  RS.    if( (r & 
113f0 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 20 3d 3d  SQLITE_IOERR) ==
11400 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b   SQLITE_IOERR ){
11410 0a 20 20 20 20 20 20 72 20 3d 20 53 51 4c 49 54  .      r = SQLIT
11420 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a 23 65  E_BUSY;.    }.#e
11430 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49  ndif /* SQLITE_I
11440 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b  GNORE_FLOCK_LOCK
11450 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20 20 20 0a  _ERRORS */.    .
11460 20 20 20 20 72 65 74 75 72 6e 20 72 3b 0a 20 20      return r;.  
11470 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 70 46 69  } else {.    pFi
11480 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 4e  le->locktype = N
11490 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 72 65 74 75  O_LOCK;.    retu
114a0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
114b0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  }.}../*.** Close
114c0 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74   a file..*/.stat
114d0 69 63 20 69 6e 74 20 66 6c 6f 63 6b 43 6c 6f 73  ic int flockClos
114e0 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
114f0 69 64 29 20 7b 0a 20 20 69 66 28 20 69 64 20 29  id) {.  if( id )
11500 7b 0a 20 20 20 20 66 6c 6f 63 6b 55 6e 6c 6f 63  {.    flockUnloc
11510 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a  k(id, NO_LOCK);.
11520 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 6c 6f    }.  return clo
11530 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a  seUnixFile(id);.
11540 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  }..#endif /* SQL
11550 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
11560 4e 47 5f 53 54 59 4c 45 20 26 26 20 21 4f 53 5f  NG_STYLE && !OS_
11570 56 58 57 4f 52 4b 20 2a 2f 0a 0a 2f 2a 2a 2a 2a  VXWORK */../****
11580 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
11590 45 6e 64 20 6f 66 20 74 68 65 20 66 6c 6f 63 6b  End of the flock
115a0 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61   lock implementa
115b0 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  tion ***********
115c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
115d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
115e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
115f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11610 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a  *********/../***
11620 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11630 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11640 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11650 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11660 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
11670 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11680 2a 2a 2a 2a 20 42 65 67 69 6e 20 4e 61 6d 65 64  **** Begin Named
11690 20 53 65 6d 61 70 68 6f 72 65 20 4c 6f 63 6b 69   Semaphore Locki
116a0 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ng *************
116b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a  ***********.**.*
116c0 2a 20 4e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72  * Named semaphor
116d0 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6f 6e 6c  e locking is onl
116e0 79 20 73 75 70 70 6f 72 74 65 64 20 6f 6e 20 56  y supported on V
116f0 78 57 6f 72 6b 73 2e 0a 2a 2a 0a 2a 2a 20 53 65  xWorks..**.** Se
11700 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 20  maphore locking 
11710 69 73 20 6c 69 6b 65 20 64 6f 74 2d 6c 6f 63 6b  is like dot-lock
11720 20 61 6e 64 20 66 6c 6f 63 6b 20 69 6e 20 74 68   and flock in th
11730 61 74 20 69 74 20 72 65 61 6c 6c 79 20 6f 6e 6c  at it really onl
11740 79 0a 2a 2a 20 73 75 70 70 6f 72 74 73 20 45 58  y.** supports EX
11750 43 4c 55 53 49 56 45 20 6c 6f 63 6b 69 6e 67 2e  CLUSIVE locking.
11760 20 20 4f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20    Only a single 
11770 70 72 6f 63 65 73 73 20 63 61 6e 20 72 65 61 64  process can read
11780 20 6f 72 20 77 72 69 74 65 0a 2a 2a 20 74 68 65   or write.** the
11790 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
117a0 74 20 61 20 74 69 6d 65 2e 20 20 54 68 69 73 20  t a time.  This 
117b0 72 65 64 75 63 65 73 20 70 6f 74 65 6e 74 69 61  reduces potentia
117c0 6c 20 63 6f 6e 63 75 72 72 65 6e 63 79 2c 20 62  l concurrency, b
117d0 75 74 0a 2a 2a 20 6d 61 6b 65 73 20 74 68 65 20  ut.** makes the 
117e0 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74  lock implementat
117f0 69 6f 6e 20 6d 75 63 68 20 65 61 73 69 65 72 2e  ion much easier.
11800 0a 2a 2f 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52  .*/.#if OS_VXWOR
11810 4b 53 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  KS../*.** This r
11820 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66  outine checks if
11830 20 74 68 65 72 65 20 69 73 20 61 20 52 45 53 45   there is a RESE
11840 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f  RVED lock held o
11850 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64 0a  n the specified.
11860 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73 20  ** file by this 
11870 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f  or any other pro
11880 63 65 73 73 2e 20 49 66 20 73 75 63 68 20 61 20  cess. If such a 
11890 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65  lock is held, se
118a0 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f  t *pResOut.** to
118b0 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75   a non-zero valu
118c0 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65  e otherwise *pRe
118d0 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a  sOut is set to z
118e0 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e  ero.  The return
118f0 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74   value.** is set
11900 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e   to SQLITE_OK un
11910 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f  less an I/O erro
11920 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20  r occurs during 
11930 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a  lock checking..*
11940 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6d  /.static int sem
11950 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
11960 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
11970 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74  id, int *pResOut
11980 29 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  ) {.  int rc = S
11990 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
119a0 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20  reserved = 0;.  
119b0 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
119c0 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
119d0 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ..  SimulateIOEr
119e0 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
119f0 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45  TE_IOERR_CHECKRE
11a00 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20  SERVEDLOCK; );. 
11a10 20 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c   .  assert( pFil
11a20 65 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  e );..  /* Check
11a30 20 69 66 20 61 20 74 68 72 65 61 64 20 69 6e 20   if a thread in 
11a40 74 68 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c  this process hol
11a50 64 73 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a  ds such a lock *
11a60 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c  /.  if( pFile->l
11a70 6f 63 6b 74 79 70 65 3e 53 48 41 52 45 44 5f 4c  ocktype>SHARED_L
11a80 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 73 65 72  OCK ){.    reser
11a90 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a  ved = 1;.  }.  .
11aa0 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 20 73    /* Otherwise s
11ab0 65 65 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72  ee if some other
11ac0 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 69   process holds i
11ad0 74 2e 20 2a 2f 0a 20 20 69 66 28 20 21 72 65 73  t. */.  if( !res
11ae0 65 72 76 65 64 20 29 7b 0a 20 20 20 20 73 65 6d  erved ){.    sem
11af0 5f 74 20 2a 70 53 65 6d 20 3d 20 70 46 69 6c 65  _t *pSem = pFile
11b00 2d 3e 70 4f 70 65 6e 2d 3e 70 53 65 6d 3b 0a 20  ->pOpen->pSem;. 
11b10 20 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73     struct stat s
11b20 74 61 74 42 75 66 3b 0a 0a 20 20 20 20 69 66 28  tatBuf;..    if(
11b30 20 73 65 6d 5f 74 72 79 77 61 69 74 28 70 53 65   sem_trywait(pSe
11b40 6d 29 3d 3d 2d 31 20 29 7b 0a 20 20 20 20 20 20  m)==-1 ){.      
11b50 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72  int tErrno = err
11b60 6e 6f 3b 0a 20 20 20 20 20 20 69 66 28 20 45 41  no;.      if( EA
11b70 47 41 49 4e 20 21 3d 20 74 45 72 72 6e 6f 20 29  GAIN != tErrno )
11b80 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
11b90 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
11ba0 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c  sixError(tErrno,
11bb0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48   SQLITE_IOERR_CH
11bc0 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 29  ECKRESERVEDLOCK)
11bd0 3b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d  ;.        pFile-
11be0 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72  >lastErrno = tEr
11bf0 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 20 65 6c 73  rno;.      } els
11c00 65 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 73  e {.        /* s
11c10 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 68 61 73 20  omeone else has 
11c20 74 68 65 20 6c 6f 63 6b 20 77 68 65 6e 20 77 65  the lock when we
11c30 20 61 72 65 20 69 6e 20 4e 4f 5f 4c 4f 43 4b 20   are in NO_LOCK 
11c40 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 73 65 72  */.        reser
11c50 76 65 64 20 3d 20 28 70 46 69 6c 65 2d 3e 6c 6f  ved = (pFile->lo
11c60 63 6b 74 79 70 65 20 3c 20 53 48 41 52 45 44 5f  cktype < SHARED_
11c70 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20  LOCK);.      }. 
11c80 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
11c90 2f 2a 20 77 65 20 63 6f 75 6c 64 20 68 61 76 65  /* we could have
11ca0 20 69 74 20 69 66 20 77 65 20 77 61 6e 74 20 69   it if we want i
11cb0 74 20 2a 2f 0a 20 20 20 20 20 20 73 65 6d 5f 70  t */.      sem_p
11cc0 6f 73 74 28 70 53 65 6d 29 3b 0a 20 20 20 20 7d  ost(pSem);.    }
11cd0 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 34 28  .  }.  OSTRACE4(
11ce0 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64  "TEST WR-LOCK %d
11cf0 20 25 64 20 25 64 5c 6e 22 2c 20 70 46 69 6c 65   %d %d\n", pFile
11d00 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72 76 65  ->h, rc, reserve
11d10 64 29 3b 0a 0a 20 20 2a 70 52 65 73 4f 75 74 20  d);..  *pResOut 
11d20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20 20 72 65  = reserved;.  re
11d30 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
11d40 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20  * Lock the file 
11d50 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70  with the lock sp
11d60 65 63 69 66 69 65 64 20 62 79 20 70 61 72 61 6d  ecified by param
11d70 65 74 65 72 20 6c 6f 63 6b 74 79 70 65 20 2d 20  eter locktype - 
11d80 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f  one.** of the fo
11d90 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
11da0 20 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f     (1) SHARED_LO
11db0 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45  CK.**     (2) RE
11dc0 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20  SERVED_LOCK.**  
11dd0 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c     (3) PENDING_L
11de0 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45  OCK.**     (4) E
11df0 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a  XCLUSIVE_LOCK.**
11e00 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68  .** Sometimes wh
11e10 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e  en requesting on
11e20 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64  e lock state, ad
11e30 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74  ditional lock st
11e40 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65  ates.** are inse
11e50 72 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e  rted in between.
11e60 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69    The locking mi
11e70 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20  ght fail on one 
11e80 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20  of the later.** 
11e90 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76  transitions leav
11ea0 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61  ing the lock sta
11eb0 74 65 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f  te different fro
11ec0 6d 20 77 68 61 74 20 69 74 20 73 74 61 72 74 65  m what it starte
11ed0 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73  d but.** still s
11ee0 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c  hort of its goal
11ef0 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  The following
11f00 20 63 68 61 72 74 20 73 68 6f 77 73 20 74 68 65   chart shows the
11f10 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e   allowed.** tran
11f20 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20  sitions and the 
11f30 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65  inserted interme
11f40 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a  diate states:.**
11f50 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20  .**    UNLOCKED 
11f60 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20  -> SHARED.**    
11f70 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56  SHARED -> RESERV
11f80 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20  ED.**    SHARED 
11f90 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20  -> (PENDING) -> 
11fa0 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20  EXCLUSIVE.**    
11fb0 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e  RESERVED -> (PEN
11fc0 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49  DING) -> EXCLUSI
11fd0 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47  VE.**    PENDING
11fe0 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
11ff0 0a 2a 2a 20 53 65 6d 61 70 68 6f 72 65 20 6c 6f  .** Semaphore lo
12000 63 6b 73 20 6f 6e 6c 79 20 72 65 61 6c 6c 79 20  cks only really 
12010 73 75 70 70 6f 72 74 20 45 58 43 4c 55 53 49 56  support EXCLUSIV
12020 45 20 6c 6f 63 6b 73 2e 20 20 57 65 20 74 72 61  E locks.  We tra
12030 63 6b 20 69 6e 74 65 72 6d 65 64 69 61 74 65 0a  ck intermediate.
12040 2a 2a 20 6c 6f 63 6b 20 73 74 61 74 65 73 20 69  ** lock states i
12050 6e 20 74 68 65 20 73 71 6c 69 74 65 33 5f 66 69  n the sqlite3_fi
12060 6c 65 20 73 74 72 75 63 74 75 72 65 2c 20 62 75  le structure, bu
12070 74 20 61 6c 6c 20 6c 6f 63 6b 73 20 53 48 41 52  t all locks SHAR
12080 45 44 20 6f 72 0a 2a 2a 20 61 62 6f 76 65 20 61  ED or.** above a
12090 72 65 20 72 65 61 6c 6c 79 20 45 58 43 4c 55 53  re really EXCLUS
120a0 49 56 45 20 6c 6f 63 6b 73 20 61 6e 64 20 65 78  IVE locks and ex
120b0 63 6c 75 64 65 20 61 6c 6c 20 6f 74 68 65 72 20  clude all other 
120c0 70 72 6f 63 65 73 73 65 73 20 66 72 6f 6d 0a 2a  processes from.*
120d0 2a 20 61 63 63 65 73 73 20 74 68 65 20 66 69 6c  * access the fil
120e0 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
120f0 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20  utine will only 
12100 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e  increase a lock.
12110 20 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65    Use the sqlite
12120 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72  3OsUnlock().** r
12130 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20  outine to lower 
12140 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e  a locking level.
12150 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
12160 65 6d 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  emLock(sqlite3_f
12170 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63  ile *id, int loc
12180 6b 74 79 70 65 29 20 7b 0a 20 20 75 6e 69 78 46  ktype) {.  unixF
12190 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
121a0 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e  ixFile*)id;.  in
121b0 74 20 66 64 3b 0a 20 20 73 65 6d 5f 74 20 2a 70  t fd;.  sem_t *p
121c0 53 65 6d 20 3d 20 70 46 69 6c 65 2d 3e 70 4f 70  Sem = pFile->pOp
121d0 65 6e 2d 3e 70 53 65 6d 3b 0a 20 20 69 6e 74 20  en->pSem;.  int 
121e0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
121f0 0a 20 20 2f 2a 20 69 66 20 77 65 20 61 6c 72 65  .  /* if we alre
12200 61 64 79 20 68 61 76 65 20 61 20 6c 6f 63 6b 2c  ady have a lock,
12210 20 69 74 20 69 73 20 65 78 63 6c 75 73 69 76 65   it is exclusive
12220 2e 20 20 0a 20 20 2a 2a 20 4a 75 73 74 20 61 64  .  .  ** Just ad
12230 6a 75 73 74 20 6c 65 76 65 6c 20 61 6e 64 20 70  just level and p
12240 75 6e 74 20 6f 6e 20 6f 75 74 74 61 20 68 65 72  unt on outta her
12250 65 2e 20 2a 2f 0a 20 20 69 66 20 28 70 46 69 6c  e. */.  if (pFil
12260 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3e 20 4e 4f  e->locktype > NO
12270 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46 69  _LOCK) {.    pFi
12280 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c  le->locktype = l
12290 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20 72 63 20  ocktype;.    rc 
122a0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
122b0 20 67 6f 74 6f 20 73 65 6d 5f 65 6e 64 5f 6c 6f   goto sem_end_lo
122c0 63 6b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  ck;.  }.  .  /* 
122d0 6c 6f 63 6b 20 73 65 6d 61 70 68 6f 72 65 20 6e  lock semaphore n
122e0 6f 77 20 62 75 74 20 62 61 69 6c 20 6f 75 74 20  ow but bail out 
122f0 77 68 65 6e 20 61 6c 72 65 61 64 79 20 6c 6f 63  when already loc
12300 6b 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 73 65  ked. */.  if( se
12310 6d 5f 74 72 79 77 61 69 74 28 70 53 65 6d 29 3d  m_trywait(pSem)=
12320 3d 2d 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  =-1 ){.    rc = 
12330 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
12340 20 67 6f 74 6f 20 73 65 6d 5f 65 6e 64 5f 6c 6f   goto sem_end_lo
12350 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 67 6f  ck;.  }..  /* go
12360 74 20 69 74 2c 20 73 65 74 20 74 68 65 20 74 79  t it, set the ty
12370 70 65 20 61 6e 64 20 72 65 74 75 72 6e 20 6f 6b  pe and return ok
12380 20 2a 2f 0a 20 20 70 46 69 6c 65 2d 3e 6c 6f 63   */.  pFile->loc
12390 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65  ktype = locktype
123a0 3b 0a 0a 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b  ;.. sem_end_lock
123b0 3a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  :.  return rc;.}
123c0 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68  ../*.** Lower th
123d0 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
123e0 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  on file descript
123f0 6f 72 20 70 46 69 6c 65 20 74 6f 20 6c 6f 63 6b  or pFile to lock
12400 74 79 70 65 2e 20 20 6c 6f 63 6b 74 79 70 65 0a  type.  locktype.
12410 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65  ** must be eithe
12420 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41  r NO_LOCK or SHA
12430 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20  RED_LOCK..**.** 
12440 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  If the locking l
12450 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65  evel of the file
12460 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61   descriptor is a
12470 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c  lready at or bel
12480 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73  ow.** the reques
12490 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  ted locking leve
124a0 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  l, this routine 
124b0 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
124c0 74 61 74 69 63 20 69 6e 74 20 73 65 6d 55 6e 6c  tatic int semUnl
124d0 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
124e0 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79   *id, int lockty
124f0 70 65 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65  pe) {.  unixFile
12500 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
12510 69 6c 65 2a 29 69 64 3b 0a 20 20 73 65 6d 5f 74  ile*)id;.  sem_t
12520 20 2a 70 53 65 6d 20 3d 20 70 46 69 6c 65 2d 3e   *pSem = pFile->
12530 70 4f 70 65 6e 2d 3e 70 53 65 6d 3b 0a 0a 20 20  pOpen->pSem;..  
12540 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
12550 0a 20 20 61 73 73 65 72 74 28 20 70 53 65 6d 20  .  assert( pSem 
12560 29 3b 0a 20 20 4f 53 54 52 41 43 45 35 28 22 55  );.  OSTRACE5("U
12570 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73  NLOCK  %d %d was
12580 20 25 64 20 70 69 64 3d 25 64 5c 6e 22 2c 20 70   %d pid=%d\n", p
12590 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70  File->h, locktyp
125a0 65 2c 0a 09 20 20 20 70 46 69 6c 65 2d 3e 6c 6f  e,..   pFile->lo
125b0 63 6b 74 79 70 65 2c 20 67 65 74 70 69 64 28 29  cktype, getpid()
125c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63  );.  assert( loc
125d0 6b 74 79 70 65 3c 3d 53 48 41 52 45 44 5f 4c 4f  ktype<=SHARED_LO
125e0 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f  CK );.  .  /* no
125f0 2d 6f 70 20 69 66 20 70 6f 73 73 69 62 6c 65 20  -op if possible 
12600 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
12610 6c 6f 63 6b 74 79 70 65 3d 3d 6c 6f 63 6b 74 79  locktype==lockty
12620 70 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  pe ){.    return
12630 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
12640 20 20 0a 20 20 2f 2a 20 73 68 61 72 65 64 20 63    .  /* shared c
12650 61 6e 20 6a 75 73 74 20 62 65 20 73 65 74 20 62  an just be set b
12660 65 63 61 75 73 65 20 77 65 20 61 6c 77 61 79 73  ecause we always
12670 20 68 61 76 65 20 61 6e 20 65 78 63 6c 75 73 69   have an exclusi
12680 76 65 20 2a 2f 0a 20 20 69 66 20 28 6c 6f 63 6b  ve */.  if (lock
12690 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  type==SHARED_LOC
126a0 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  K) {.    pFile->
126b0 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74  locktype = lockt
126c0 79 70 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ype;.    return 
126d0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
126e0 20 0a 20 20 2f 2a 20 6e 6f 2c 20 72 65 61 6c 6c   .  /* no, reall
126f0 79 20 75 6e 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 69  y unlock. */.  i
12700 66 20 28 20 73 65 6d 5f 70 6f 73 74 28 70 53 65  f ( sem_post(pSe
12710 6d 29 3d 3d 2d 31 20 29 20 7b 0a 20 20 20 20 69  m)==-1 ) {.    i
12720 6e 74 20 72 63 2c 20 74 45 72 72 6e 6f 20 3d 20  nt rc, tErrno = 
12730 65 72 72 6e 6f 3b 0a 20 20 20 20 72 63 20 3d 20  errno;.    rc = 
12740 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
12750 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
12760 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  , SQLITE_IOERR_U
12770 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20  NLOCK);.    if( 
12780 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63  IS_LOCK_ERROR(rc
12790 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  ) ){.      pFile
127a0 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45  ->lastErrno = tE
127b0 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rrno;.    }.    
127c0 72 65 74 75 72 6e 20 72 63 3b 20 0a 20 20 7d 0a  return rc; .  }.
127d0 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70    pFile->locktyp
127e0 65 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 72  e = NO_LOCK;.  r
127f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
12800 0a 7d 0a 0a 2f 2a 0a 20 2a 2a 20 43 6c 6f 73 65  .}../*. ** Close
12810 20 61 20 66 69 6c 65 2e 0a 20 2a 2f 0a 73 74 61   a file.. */.sta
12820 74 69 63 20 69 6e 74 20 73 65 6d 43 6c 6f 73 65  tic int semClose
12830 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
12840 64 29 20 7b 0a 20 20 69 66 28 20 69 64 20 29 7b  d) {.  if( id ){
12850 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  .    unixFile *p
12860 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
12870 2a 29 69 64 3b 0a 20 20 20 20 73 65 6d 55 6e 6c  *)id;.    semUnl
12880 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29  ock(id, NO_LOCK)
12890 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46  ;.    assert( pF
128a0 69 6c 65 20 29 3b 0a 20 20 20 20 75 6e 69 78 45  ile );.    unixE
128b0 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20  nterMutex();.   
128c0 20 72 65 6c 65 61 73 65 4c 6f 63 6b 49 6e 66 6f   releaseLockInfo
128d0 28 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 29 3b 0a  (pFile->pLock);.
128e0 20 20 20 20 72 65 6c 65 61 73 65 4f 70 65 6e 43      releaseOpenC
128f0 6e 74 28 70 46 69 6c 65 2d 3e 70 4f 70 65 6e 29  nt(pFile->pOpen)
12900 3b 0a 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d  ;.    unixLeaveM
12910 75 74 65 78 28 29 3b 0a 20 20 20 20 63 6c 6f 73  utex();.    clos
12920 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 20  eUnixFile(id);. 
12930 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
12940 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64 69 66  TE_OK;.}..#endif
12950 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20 2a   /* OS_VXWORKS *
12960 2f 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65 64 20 73 65  /./*.** Named se
12970 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 20  maphore locking 
12980 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c  is only availabl
12990 65 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a  e on VxWorks..**
129a0 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
129b0 20 45 6e 64 20 6f 66 20 74 68 65 20 6e 61 6d 65   End of the name
129c0 64 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b  d semaphore lock
129d0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
129e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
129f0 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
12a00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12a10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12a20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12a30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
12a40 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .../************
12a50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12a60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12a70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12a80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12a90 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
12aa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42  ************** B
12ab0 65 67 69 6e 20 41 46 50 20 4c 6f 63 6b 69 6e 67  egin AFP Locking
12ac0 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
12ad0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12ae0 2a 2a 0a 2a 2a 0a 2a 2a 20 41 46 50 20 69 73 20  **.**.** AFP is 
12af0 74 68 65 20 41 70 70 6c 65 20 46 69 6c 69 6e 67  the Apple Filing
12b00 20 50 72 6f 74 6f 63 6f 6c 2e 20 20 41 46 50 20   Protocol.  AFP 
12b10 69 73 20 61 20 6e 65 74 77 6f 72 6b 20 66 69 6c  is a network fil
12b20 65 73 79 73 74 65 6d 20 66 6f 75 6e 64 0a 2a 2a  esystem found.**
12b30 20 6f 6e 20 41 70 70 6c 65 20 4d 61 63 69 6e 74   on Apple Macint
12b40 6f 73 68 20 63 6f 6d 70 75 74 65 72 73 20 2d 20  osh computers - 
12b50 62 6f 74 68 20 4f 53 39 20 61 6e 64 20 4f 53 58  both OS9 and OSX
12b60 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 72 64 2d 70 61  ..**.** Third-pa
12b70 72 74 79 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  rty implementati
12b80 6f 6e 73 20 6f 66 20 41 46 50 20 61 72 65 20 61  ons of AFP are a
12b90 76 61 69 6c 61 62 6c 65 2e 20 20 42 75 74 20 74  vailable.  But t
12ba0 68 69 73 20 63 6f 64 65 20 68 65 72 65 0a 2a 2a  his code here.**
12bb0 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 6f 6e 20 4f   only works on O
12bc0 53 58 2e 0a 2a 2f 0a 0a 23 69 66 20 64 65 66 69  SX..*/..#if defi
12bd0 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26  ned(__APPLE__) &
12be0 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  & SQLITE_ENABLE_
12bf0 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a  LOCKING_STYLE./*
12c00 0a 2a 2a 20 54 68 65 20 61 66 70 4c 6f 63 6b 69  .** The afpLocki
12c10 6e 67 43 6f 6e 74 65 78 74 20 73 74 72 75 63 74  ngContext struct
12c20 75 72 65 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c  ure contains all
12c30 20 61 66 70 20 6c 6f 63 6b 20 73 70 65 63 69 66   afp lock specif
12c40 69 63 20 73 74 61 74 65 0a 2a 2f 0a 74 79 70 65  ic state.*/.type
12c50 64 65 66 20 73 74 72 75 63 74 20 61 66 70 4c 6f  def struct afpLo
12c60 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 61 66 70  ckingContext afp
12c70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  LockingContext;.
12c80 73 74 72 75 63 74 20 61 66 70 4c 6f 63 6b 69 6e  struct afpLockin
12c90 67 43 6f 6e 74 65 78 74 20 7b 0a 20 20 75 6e 73  gContext {.  uns
12ca0 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20  igned long long 
12cb0 73 68 61 72 65 64 42 79 74 65 3b 0a 20 20 63 6f  sharedByte;.  co
12cc0 6e 73 74 20 63 68 61 72 20 2a 64 62 50 61 74 68  nst char *dbPath
12cd0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
12ce0 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f 70 65   Name of the ope
12cf0 6e 20 66 69 6c 65 20 2a 2f 0a 7d 3b 0a 0a 73 74  n file */.};..st
12d00 72 75 63 74 20 42 79 74 65 52 61 6e 67 65 4c 6f  ruct ByteRangeLo
12d10 63 6b 50 42 32 0a 7b 0a 20 20 75 6e 73 69 67 6e  ckPB2.{.  unsign
12d20 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6f 66 66  ed long long off
12d30 73 65 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 6f  set;        /* o
12d40 66 66 73 65 74 20 74 6f 20 66 69 72 73 74 20 62  ffset to first b
12d50 79 74 65 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20  yte to lock */. 
12d60 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c   unsigned long l
12d70 6f 6e 67 20 6c 65 6e 67 74 68 3b 20 20 20 20 20  ong length;     
12d80 20 20 20 2f 2a 20 6e 62 72 20 6f 66 20 62 79 74     /* nbr of byt
12d90 65 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20  es to lock */.  
12da0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f  unsigned long lo
12db0 6e 67 20 72 65 74 52 61 6e 67 65 53 74 61 72 74  ng retRangeStart
12dc0 3b 20 2f 2a 20 6e 62 72 20 6f 66 20 31 73 74 20  ; /* nbr of 1st 
12dd0 62 79 74 65 20 6c 6f 63 6b 65 64 20 69 66 20 73  byte locked if s
12de0 75 63 63 65 73 73 66 75 6c 20 2a 2f 0a 20 20 75  uccessful */.  u
12df0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 75 6e 4c  nsigned char unL
12e00 6f 63 6b 46 6c 61 67 3b 20 20 20 20 20 20 20 20  ockFlag;        
12e10 20 2f 2a 20 31 20 3d 20 75 6e 6c 6f 63 6b 2c 20   /* 1 = unlock, 
12e20 30 20 3d 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e  0 = lock */.  un
12e30 73 69 67 6e 65 64 20 63 68 61 72 20 73 74 61 72  signed char star
12e40 74 45 6e 64 46 6c 61 67 3b 20 20 20 20 20 20 20  tEndFlag;       
12e50 2f 2a 20 31 3d 72 65 6c 20 74 6f 20 65 6e 64 20  /* 1=rel to end 
12e60 6f 66 20 66 6f 72 6b 2c 20 30 3d 72 65 6c 20 74  of fork, 0=rel t
12e70 6f 20 73 74 61 72 74 20 2a 2f 0a 20 20 69 6e 74  o start */.  int
12e80 20 66 64 3b 20 20 20 20 20 20 20 20 20 20 20 20   fd;            
12e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12ea0 2a 20 66 69 6c 65 20 64 65 73 63 20 74 6f 20 61  * file desc to a
12eb0 73 73 6f 63 20 74 68 69 73 20 6c 6f 63 6b 20 77  ssoc this lock w
12ec0 69 74 68 20 2a 2f 0a 7d 3b 0a 0a 23 64 65 66 69  ith */.};..#defi
12ed0 6e 65 20 61 66 70 66 73 42 79 74 65 52 61 6e 67  ne afpfsByteRang
12ee0 65 4c 6f 63 6b 32 46 53 43 54 4c 20 20 20 20 20  eLock2FSCTL     
12ef0 20 20 20 5f 49 4f 57 52 28 27 7a 27 2c 20 32 33     _IOWR('z', 23
12f00 2c 20 73 74 72 75 63 74 20 42 79 74 65 52 61 6e  , struct ByteRan
12f10 67 65 4c 6f 63 6b 50 42 32 29 0a 0a 2f 2a 0a 2a  geLockPB2)../*.*
12f20 2a 20 54 68 69 73 20 69 73 20 61 20 75 74 69 6c  * This is a util
12f30 69 74 79 20 66 6f 72 20 73 65 74 74 69 6e 67 20  ity for setting 
12f40 6f 72 20 63 6c 65 61 72 69 6e 67 20 61 20 62 69  or clearing a bi
12f50 74 2d 72 61 6e 67 65 20 6c 6f 63 6b 20 6f 6e 20  t-range lock on 
12f60 61 6e 0a 2a 2a 20 41 46 50 20 66 69 6c 65 73 79  an.** AFP filesy
12f70 73 74 65 6d 2e 0a 2a 2a 20 0a 2a 2a 20 52 65 74  stem..** .** Ret
12f80 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
12f90 20 73 75 63 63 65 73 73 2c 20 53 51 4c 49 54 45   success, SQLITE
12fa0 5f 42 55 53 59 20 6f 6e 20 66 61 69 6c 75 72 65  _BUSY on failure
12fb0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
12fc0 61 66 70 53 65 74 4c 6f 63 6b 28 0a 20 20 63 6f  afpSetLock(.  co
12fd0 6e 73 74 20 63 68 61 72 20 2a 70 61 74 68 2c 20  nst char *path, 
12fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12ff0 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65  Name of the file
13000 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20 6f 72   to be locked or
13010 20 75 6e 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75   unlocked */.  u
13020 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20  nixFile *pFile, 
13030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13040 20 4f 70 65 6e 20 66 69 6c 65 20 64 65 73 63 72   Open file descr
13050 69 70 74 6f 72 20 6f 6e 20 70 61 74 68 20 2a 2f  iptor on path */
13060 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  .  unsigned long
13070 20 6c 6f 6e 67 20 6f 66 66 73 65 74 2c 20 20 20   long offset,   
13080 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20    /* First byte 
13090 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20 2a 2f 0a  to be locked */.
130a0 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20    unsigned long 
130b0 6c 6f 6e 67 20 6c 65 6e 67 74 68 2c 20 20 20 20  long length,    
130c0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
130d0 74 65 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20  tes to lock */. 
130e0 20 69 6e 74 20 73 65 74 4c 6f 63 6b 46 6c 61 67   int setLockFlag
130f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13100 2f 2a 20 54 72 75 65 20 74 6f 20 73 65 74 20 6c  /* True to set l
13110 6f 63 6b 2e 20 20 46 61 6c 73 65 20 74 6f 20 63  ock.  False to c
13120 6c 65 61 72 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a  lear lock */.){.
13130 20 20 73 74 72 75 63 74 20 42 79 74 65 52 61 6e    struct ByteRan
13140 67 65 4c 6f 63 6b 50 42 32 20 70 62 3b 0a 20 20  geLockPB2 pb;.  
13150 69 6e 74 20 65 72 72 3b 0a 20 20 0a 20 20 70 62  int err;.  .  pb
13160 2e 75 6e 4c 6f 63 6b 46 6c 61 67 20 3d 20 73 65  .unLockFlag = se
13170 74 4c 6f 63 6b 46 6c 61 67 20 3f 20 30 20 3a 20  tLockFlag ? 0 : 
13180 31 3b 0a 20 20 70 62 2e 73 74 61 72 74 45 6e 64  1;.  pb.startEnd
13190 46 6c 61 67 20 3d 20 30 3b 0a 20 20 70 62 2e 6f  Flag = 0;.  pb.o
131a0 66 66 73 65 74 20 3d 20 6f 66 66 73 65 74 3b 0a  ffset = offset;.
131b0 20 20 70 62 2e 6c 65 6e 67 74 68 20 3d 20 6c 65    pb.length = le
131c0 6e 67 74 68 3b 20 0a 20 20 70 62 2e 66 64 20 3d  ngth; .  pb.fd =
131d0 20 70 46 69 6c 65 2d 3e 68 3b 0a 20 20 0a 20 20   pFile->h;.  .  
131e0 4f 53 54 52 41 43 45 36 28 22 41 46 50 53 45 54  OSTRACE6("AFPSET
131f0 4c 4f 43 4b 20 5b 25 73 5d 20 66 6f 72 20 25 64  LOCK [%s] for %d
13200 25 73 20 69 6e 20 72 61 6e 67 65 20 25 6c 6c 78  %s in range %llx
13210 3a 25 6c 6c 78 5c 6e 22 2c 20 0a 20 20 20 20 28  :%llx\n", .    (
13220 73 65 74 4c 6f 63 6b 46 6c 61 67 3f 22 4f 4e 22  setLockFlag?"ON"
13230 3a 22 4f 46 46 22 29 2c 20 70 46 69 6c 65 2d 3e  :"OFF"), pFile->
13240 68 2c 20 28 70 62 2e 66 64 3d 3d 2d 31 3f 22 5b  h, (pb.fd==-1?"[
13250 74 65 73 74 76 61 6c 2d 31 5d 22 3a 22 22 29 2c  testval-1]":""),
13260 0a 20 20 20 20 6f 66 66 73 65 74 2c 20 6c 65 6e  .    offset, len
13270 67 74 68 29 3b 0a 20 20 65 72 72 20 3d 20 66 73  gth);.  err = fs
13280 63 74 6c 28 70 61 74 68 2c 20 61 66 70 66 73 42  ctl(path, afpfsB
13290 79 74 65 52 61 6e 67 65 4c 6f 63 6b 32 46 53 43  yteRangeLock2FSC
132a0 54 4c 2c 20 26 70 62 2c 20 30 29 3b 0a 20 20 69  TL, &pb, 0);.  i
132b0 66 20 28 20 65 72 72 3d 3d 2d 31 20 29 20 7b 0a  f ( err==-1 ) {.
132c0 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
132d0 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72  int tErrno = err
132e0 6e 6f 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 34  no;.    OSTRACE4
132f0 28 22 41 46 50 53 45 54 4c 4f 43 4b 20 66 61 69  ("AFPSETLOCK fai
13300 6c 65 64 20 74 6f 20 66 73 63 74 6c 28 29 20 27  led to fsctl() '
13310 25 73 27 20 25 64 20 25 73 5c 6e 22 2c 0a 20 20  %s' %d %s\n",.  
13320 20 20 20 20 20 20 20 20 20 20 20 70 61 74 68 2c             path,
13330 20 74 45 72 72 6e 6f 2c 20 73 74 72 65 72 72 6f   tErrno, strerro
13340 72 28 74 45 72 72 6e 6f 29 29 3b 0a 23 69 66 64  r(tErrno));.#ifd
13350 65 66 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45  ef SQLITE_IGNORE
13360 5f 41 46 50 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53  _AFP_LOCK_ERRORS
13370 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
13380 5f 42 55 53 59 3b 0a 23 65 6c 73 65 0a 20 20 20  _BUSY;.#else.   
13390 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f   rc = sqliteErro
133a0 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28  rFromPosixError(
133b0 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20  tErrno,.        
133c0 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 4c              setL
133d0 6f 63 6b 46 6c 61 67 20 3f 20 53 51 4c 49 54 45  ockFlag ? SQLITE
133e0 5f 49 4f 45 52 52 5f 4c 4f 43 4b 20 3a 20 53 51  _IOERR_LOCK : SQ
133f0 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43  LITE_IOERR_UNLOC
13400 4b 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  K);.#endif /* SQ
13410 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 41 46 50 5f  LITE_IGNORE_AFP_
13420 4c 4f 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a 20  LOCK_ERRORS */. 
13430 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
13440 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20  RROR(rc) ){.    
13450 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
13460 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20  no = tErrno;.   
13470 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63   }.    return rc
13480 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20  ;.  } else {.   
13490 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
134a0 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  K;.  }.}../*.** 
134b0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65  This routine che
134c0 63 6b 73 20 69 66 20 74 68 65 72 65 20 69 73 20  cks if there is 
134d0 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
134e0 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63  held on the spec
134f0 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79  ified.** file by
13500 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68   this or any oth
13510 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73  er process. If s
13520 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65  uch a lock is he
13530 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74  ld, set *pResOut
13540 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72  .** to a non-zer
13550 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73  o value otherwis
13560 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65  e *pResOut is se
13570 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20  t to zero.  The 
13580 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20  return value.** 
13590 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45  is set to SQLITE
135a0 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f  _OK unless an I/
135b0 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64  O error occurs d
135c0 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b  uring lock check
135d0 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ing..*/.static i
135e0 6e 74 20 61 66 70 43 68 65 63 6b 52 65 73 65 72  nt afpCheckReser
135f0 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  vedLock(sqlite3_
13600 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70  file *id, int *p
13610 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72  ResOut){.  int r
13620 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
13630 20 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d 20   int reserved = 
13640 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  0;.  unixFile *p
13650 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
13660 2a 29 69 64 3b 0a 20 20 0a 20 20 53 69 6d 75 6c  *)id;.  .  Simul
13670 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75  ateIOError( retu
13680 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
13690 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43  CHECKRESERVEDLOC
136a0 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73 65 72  K; );.  .  asser
136b0 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 61 66  t( pFile );.  af
136c0 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  pLockingContext 
136d0 2a 63 6f 6e 74 65 78 74 20 3d 20 28 61 66 70 4c  *context = (afpL
136e0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29  ockingContext *)
136f0 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43   pFile->lockingC
13700 6f 6e 74 65 78 74 3b 0a 20 20 0a 20 20 2f 2a 20  ontext;.  .  /* 
13710 43 68 65 63 6b 20 69 66 20 61 20 74 68 72 65 61  Check if a threa
13720 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73  d in this proces
13730 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c  s holds such a l
13740 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ock */.  if( pFi
13750 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 53 48 41  le->locktype>SHA
13760 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RED_LOCK ){.    
13770 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20  reserved = 1;.  
13780 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74 68 65 72 77  }.  .  /* Otherw
13790 69 73 65 20 73 65 65 20 69 66 20 73 6f 6d 65 20  ise see if some 
137a0 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 68 6f  other process ho
137b0 6c 64 73 20 69 74 2e 0a 20 20 20 2a 2f 0a 20 20  lds it..   */.  
137c0 69 66 28 20 21 72 65 73 65 72 76 65 64 20 29 7b  if( !reserved ){
137d0 0a 20 20 20 20 2f 2a 20 6c 6f 63 6b 20 74 68 65  .    /* lock the
137e0 20 52 45 53 45 52 56 45 44 20 62 79 74 65 20 2a   RESERVED byte *
137f0 2f 0a 20 20 20 20 69 6e 74 20 6c 72 63 20 3d 20  /.    int lrc = 
13800 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  afpSetLock(conte
13810 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  xt->dbPath, pFil
13820 65 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45  e, RESERVED_BYTE
13830 2c 20 31 2c 31 29 3b 20 20 0a 20 20 20 20 69 66  , 1,1);  .    if
13840 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 6c 72 63  ( SQLITE_OK==lrc
13850 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 69 66 20   ){.      /* if 
13860 77 65 20 73 75 63 63 65 65 64 65 64 20 69 6e 20  we succeeded in 
13870 74 61 6b 69 6e 67 20 74 68 65 20 72 65 73 65 72  taking the reser
13880 76 65 64 20 6c 6f 63 6b 2c 20 75 6e 6c 6f 63 6b  ved lock, unlock
13890 20 69 74 20 74 6f 20 72 65 73 74 6f 72 65 0a 20   it to restore. 
138a0 20 20 20 20 20 2a 2a 20 74 68 65 20 6f 72 69 67       ** the orig
138b0 69 6e 61 6c 20 73 74 61 74 65 20 2a 2f 0a 20 20  inal state */.  
138c0 20 20 20 20 6c 72 63 20 3d 20 61 66 70 53 65 74      lrc = afpSet
138d0 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62  Lock(context->db
138e0 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 52 45 53  Path, pFile, RES
138f0 45 52 56 45 44 5f 42 59 54 45 2c 20 31 2c 20 30  ERVED_BYTE, 1, 0
13900 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  );.    } else {.
13910 20 20 20 20 20 20 2f 2a 20 69 66 20 77 65 20 66        /* if we f
13920 61 69 6c 65 64 20 74 6f 20 67 65 74 20 74 68 65  ailed to get the
13930 20 6c 6f 63 6b 20 74 68 65 6e 20 73 6f 6d 65 6f   lock then someo
13940 6e 65 20 65 6c 73 65 20 6d 75 73 74 20 68 61 76  ne else must hav
13950 65 20 69 74 20 2a 2f 0a 20 20 20 20 20 20 72 65  e it */.      re
13960 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 20 20  served = 1;.    
13970 7d 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43  }.    if( IS_LOC
13980 4b 5f 45 52 52 4f 52 28 6c 72 63 29 20 29 7b 0a  K_ERROR(lrc) ){.
13990 20 20 20 20 20 20 72 63 3d 6c 72 63 3b 0a 20 20        rc=lrc;.  
139a0 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 4f 53 54    }.  }.  .  OST
139b0 52 41 43 45 34 28 22 54 45 53 54 20 57 52 2d 4c  RACE4("TEST WR-L
139c0 4f 43 4b 20 25 64 20 25 64 20 25 64 5c 6e 22 2c  OCK %d %d %d\n",
139d0 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72   pFile->h, rc, r
139e0 65 73 65 72 76 65 64 29 3b 0a 20 20 0a 20 20 2a  eserved);.  .  *
139f0 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72 76  pResOut = reserv
13a00 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ed;.  return rc;
13a10 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74  .}../*.** Lock t
13a20 68 65 20 66 69 6c 65 20 77 69 74 68 20 74 68 65  he file with the
13a30 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20   lock specified 
13a40 62 79 20 70 61 72 61 6d 65 74 65 72 20 6c 6f 63  by parameter loc
13a50 6b 74 79 70 65 20 2d 20 6f 6e 65 0a 2a 2a 20 6f  ktype - one.** o
13a60 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  f the following:
13a70 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53  .**.**     (1) S
13a80 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  HARED_LOCK.**   
13a90 20 20 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c    (2) RESERVED_L
13aa0 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50  OCK.**     (3) P
13ab0 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20  ENDING_LOCK.**  
13ac0 20 20 20 28 34 29 20 45 58 43 4c 55 53 49 56 45     (4) EXCLUSIVE
13ad0 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65  _LOCK.**.** Some
13ae0 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65  times when reque
13af0 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73  sting one lock s
13b00 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c  tate, additional
13b10 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20   lock states.** 
13b20 61 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20  are inserted in 
13b30 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f  between.  The lo
13b40 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c  cking might fail
13b50 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c   on one of the l
13b60 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69  ater.** transiti
13b70 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20  ons leaving the 
13b80 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66 65  lock state diffe
13b90 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69  rent from what i
13ba0 74 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a  t started but.**
13bb0 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20   still short of 
13bc0 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66  its goal.  The f
13bd0 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73  ollowing chart s
13be0 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64  hows the allowed
13bf0 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  .** transitions 
13c00 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65 64  and the inserted
13c10 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74   intermediate st
13c20 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55  ates:.**.**    U
13c30 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45  NLOCKED -> SHARE
13c40 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d  D.**    SHARED -
13c50 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20  > RESERVED.**   
13c60 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44   SHARED -> (PEND
13c70 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56  ING) -> EXCLUSIV
13c80 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44  E.**    RESERVED
13c90 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e   -> (PENDING) ->
13ca0 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20   EXCLUSIVE.**   
13cb0 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c   PENDING -> EXCL
13cc0 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73  USIVE.**.** This
13cd0 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e   routine will on
13ce0 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f  ly increase a lo
13cf0 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c  ck.  Use the sql
13d00 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a  ite3OsUnlock().*
13d10 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77  * routine to low
13d20 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  er a locking lev
13d30 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  el..*/.static in
13d40 74 20 61 66 70 4c 6f 63 6b 28 73 71 6c 69 74 65  t afpLock(sqlite
13d50 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
13d60 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74  locktype){.  int
13d70 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
13d80 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
13d90 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
13da0 69 64 3b 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67  id;.  afpLocking
13db0 43 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  Context *context
13dc0 20 3d 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f   = (afpLockingCo
13dd0 6e 74 65 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e  ntext *) pFile->
13de0 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  lockingContext;.
13df0 20 20 0a 20 20 61 73 73 65 72 74 28 20 70 46 69    .  assert( pFi
13e00 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 35  le );.  OSTRACE5
13e10 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20  ("LOCK    %d %s 
13e20 77 61 73 20 25 73 20 70 69 64 3d 25 64 5c 6e 22  was %s pid=%d\n"
13e30 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20  , pFile->h,.    
13e40 20 20 20 20 20 6c 6f 63 6b 74 79 70 65 4e 61 6d       locktypeNam
13e50 65 28 6c 6f 63 6b 74 79 70 65 29 2c 20 6c 6f 63  e(locktype), loc
13e60 6b 74 79 70 65 4e 61 6d 65 28 70 46 69 6c 65 2d  ktypeName(pFile-
13e70 3e 6c 6f 63 6b 74 79 70 65 29 2c 20 67 65 74 70  >locktype), getp
13e80 69 64 28 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  id());..  /* If 
13e90 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79  there is already
13ea0 20 61 20 6c 6f 63 6b 20 6f 66 20 74 68 69 73 20   a lock of this 
13eb0 74 79 70 65 20 6f 72 20 6d 6f 72 65 20 72 65 73  type or more res
13ec0 74 72 69 63 74 69 76 65 20 6f 6e 20 74 68 65 0a  trictive on the.
13ed0 20 20 2a 2a 20 75 6e 69 78 46 69 6c 65 2c 20 64    ** unixFile, d
13ee0 6f 20 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e 27 74  o nothing. Don't
13ef0 20 75 73 65 20 74 68 65 20 61 66 70 5f 65 6e 64   use the afp_end
13f00 5f 6c 6f 63 6b 3a 20 65 78 69 74 20 70 61 74 68  _lock: exit path
13f10 2c 20 61 73 0a 20 20 2a 2a 20 75 6e 69 78 45 6e  , as.  ** unixEn
13f20 74 65 72 4d 75 74 65 78 28 29 20 68 61 73 6e 27  terMutex() hasn'
13f30 74 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 79 65  t been called ye
13f40 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46  t..  */.  if( pF
13f50 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 6c  ile->locktype>=l
13f60 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 4f  ocktype ){.    O
13f70 53 54 52 41 43 45 33 28 22 4c 4f 43 4b 20 20 20  STRACE3("LOCK   
13f80 20 25 64 20 25 73 20 6f 6b 20 28 61 6c 72 65 61   %d %s ok (alrea
13f90 64 79 20 68 65 6c 64 29 5c 6e 22 2c 20 70 46 69  dy held)\n", pFi
13fa0 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20  le->h,.         
13fb0 20 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28 6c    locktypeName(l
13fc0 6f 63 6b 74 79 70 65 29 29 3b 0a 20 20 20 20 72  ocktype));.    r
13fd0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
13fe0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  .  }..  /* Make 
13ff0 73 75 72 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67  sure the locking
14000 20 73 65 71 75 65 6e 63 65 20 69 73 20 63 6f 72   sequence is cor
14010 72 65 63 74 0a 20 20 2a 2f 0a 20 20 61 73 73 65  rect.  */.  asse
14020 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  rt( pFile->lockt
14030 79 70 65 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20  ype!=NO_LOCK || 
14040 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44  locktype==SHARED
14050 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
14060 74 28 20 6c 6f 63 6b 74 79 70 65 21 3d 50 45 4e  t( locktype!=PEN
14070 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61  DING_LOCK );.  a
14080 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 21  ssert( locktype!
14090 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c  =RESERVED_LOCK |
140a0 7c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  | pFile->locktyp
140b0 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  e==SHARED_LOCK )
140c0 3b 0a 20 20 0a 20 20 2f 2a 20 54 68 69 73 20 6d  ;.  .  /* This m
140d0 75 74 65 78 20 69 73 20 6e 65 65 64 65 64 20 62  utex is needed b
140e0 65 63 61 75 73 65 20 70 46 69 6c 65 2d 3e 70 4c  ecause pFile->pL
140f0 6f 63 6b 20 69 73 20 73 68 61 72 65 64 20 61 63  ock is shared ac
14100 72 6f 73 73 20 74 68 72 65 61 64 73 0a 20 20 2a  ross threads.  *
14110 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74  /.  unixEnterMut
14120 65 78 28 29 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65  ex();..  /* Make
14130 20 73 75 72 65 20 74 68 65 20 63 75 72 72 65 6e   sure the curren
14140 74 20 74 68 72 65 61 64 20 6f 77 6e 73 20 74 68  t thread owns th
14150 65 20 70 46 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20  e pFile..  */.  
14160 72 63 20 3d 20 74 72 61 6e 73 66 65 72 4f 77 6e  rc = transferOwn
14170 65 72 73 68 69 70 28 70 46 69 6c 65 29 3b 0a 20  ership(pFile);. 
14180 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
14190 4f 4b 20 29 7b 0a 20 20 20 20 75 6e 69 78 4c 65  OK ){.    unixLe
141a0 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 20 20  aveMutex();.    
141b0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
141c0 20 20 20 0a 20 20 2f 2a 20 41 20 50 45 4e 44 49     .  /* A PENDI
141d0 4e 47 20 6c 6f 63 6b 20 69 73 20 6e 65 65 64 65  NG lock is neede
141e0 64 20 62 65 66 6f 72 65 20 61 63 71 75 69 72 69  d before acquiri
141f0 6e 67 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b  ng a SHARED lock
14200 20 61 6e 64 20 62 65 66 6f 72 65 0a 20 20 2a 2a   and before.  **
14210 20 61 63 71 75 69 72 69 6e 67 20 61 6e 20 45 58   acquiring an EX
14220 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 46  CLUSIVE lock.  F
14230 6f 72 20 74 68 65 20 53 48 41 52 45 44 20 6c 6f  or the SHARED lo
14240 63 6b 2c 20 74 68 65 20 50 45 4e 44 49 4e 47 20  ck, the PENDING 
14250 77 69 6c 6c 0a 20 20 2a 2a 20 62 65 20 72 65 6c  will.  ** be rel
14260 65 61 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  eased..  */.  if
14270 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52  ( locktype==SHAR
14280 45 44 5f 4c 4f 43 4b 20 0a 20 20 20 20 20 20 7c  ED_LOCK .      |
14290 7c 20 28 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43  | (locktype==EXC
142a0 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70  LUSIVE_LOCK && p
142b0 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3c 50  File->locktype<P
142c0 45 4e 44 49 4e 47 5f 4c 4f 43 4b 29 0a 20 20 29  ENDING_LOCK).  )
142d0 7b 0a 20 20 20 20 69 6e 74 20 66 61 69 6c 65 64  {.    int failed
142e0 3b 0a 20 20 20 20 66 61 69 6c 65 64 20 3d 20 61  ;.    failed = a
142f0 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78  fpSetLock(contex
14300 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65  t->dbPath, pFile
14310 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20  , PENDING_BYTE, 
14320 31 2c 20 31 29 3b 0a 20 20 20 20 69 66 20 28 66  1, 1);.    if (f
14330 61 69 6c 65 64 29 20 7b 0a 20 20 20 20 20 20 72  ailed) {.      r
14340 63 20 3d 20 66 61 69 6c 65 64 3b 0a 20 20 20 20  c = failed;.    
14350 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c    goto afp_end_l
14360 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ock;.    }.  }. 
14370 20 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f   .  /* If contro
14380 6c 20 67 65 74 73 20 74 6f 20 74 68 69 73 20 70  l gets to this p
14390 6f 69 6e 74 2c 20 74 68 65 6e 20 61 63 74 75 61  oint, then actua
143a0 6c 6c 79 20 67 6f 20 61 68 65 61 64 20 61 6e 64  lly go ahead and
143b0 20 6d 61 6b 65 0a 20 20 2a 2a 20 6f 70 65 72 61   make.  ** opera
143c0 74 69 6e 67 20 73 79 73 74 65 6d 20 63 61 6c 6c  ting system call
143d0 73 20 66 6f 72 20 74 68 65 20 73 70 65 63 69 66  s for the specif
143e0 69 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20  ied lock..  */. 
143f0 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53   if( locktype==S
14400 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  HARED_LOCK ){.  
14410 20 20 69 6e 74 20 6c 6b 2c 20 6c 72 63 31 2c 20    int lk, lrc1, 
14420 6c 72 63 32 2c 20 6c 72 63 31 45 72 72 6e 6f 3b  lrc2, lrc1Errno;
14430 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 4e 6f 77  .    .    /* Now
14440 20 67 65 74 20 74 68 65 20 72 65 61 64 2d 6c 6f   get the read-lo
14450 63 6b 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 2a  ck SHARED_LOCK *
14460 2f 0a 20 20 20 20 2f 2a 20 6e 6f 74 65 20 74 68  /.    /* note th
14470 61 74 20 74 68 65 20 71 75 61 6c 69 74 79 20 6f  at the quality o
14480 66 20 74 68 65 20 72 61 6e 64 6f 6d 6e 65 73 73  f the randomness
14490 20 64 6f 65 73 6e 27 74 20 6d 61 74 74 65 72 20   doesn't matter 
144a0 74 68 61 74 20 6d 75 63 68 20 2a 2f 0a 20 20 20  that much */.   
144b0 20 6c 6b 20 3d 20 72 61 6e 64 6f 6d 28 29 3b 20   lk = random(); 
144c0 0a 20 20 20 20 63 6f 6e 74 65 78 74 2d 3e 73 68  .    context->sh
144d0 61 72 65 64 42 79 74 65 20 3d 20 28 6c 6b 20 26  aredByte = (lk &
144e0 20 30 78 37 66 66 66 66 66 66 66 29 25 28 53 48   0x7fffffff)%(SH
144f0 41 52 45 44 5f 53 49 5a 45 20 2d 20 31 29 3b 0a  ARED_SIZE - 1);.
14500 20 20 20 20 6c 72 63 31 20 3d 20 61 66 70 53 65      lrc1 = afpSe
14510 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64  tLock(context->d
14520 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 0a 20  bPath, pFile, . 
14530 20 20 20 20 20 20 20 20 20 53 48 41 52 45 44 5f           SHARED_
14540 46 49 52 53 54 2b 63 6f 6e 74 65 78 74 2d 3e 73  FIRST+context->s
14550 68 61 72 65 64 42 79 74 65 2c 20 31 2c 20 31 29  haredByte, 1, 1)
14560 3b 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43  ;.    if( IS_LOC
14570 4b 5f 45 52 52 4f 52 28 6c 72 63 31 29 20 29 7b  K_ERROR(lrc1) ){
14580 0a 20 20 20 20 20 20 6c 72 63 31 45 72 72 6e 6f  .      lrc1Errno
14590 20 3d 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72   = pFile->lastEr
145a0 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f  rno;.    }.    /
145b0 2a 20 44 72 6f 70 20 74 68 65 20 74 65 6d 70 6f  * Drop the tempo
145c0 72 61 72 79 20 50 45 4e 44 49 4e 47 20 6c 6f 63  rary PENDING loc
145d0 6b 20 2a 2f 0a 20 20 20 20 6c 72 63 32 20 3d 20  k */.    lrc2 = 
145e0 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  afpSetLock(conte
145f0 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  xt->dbPath, pFil
14600 65 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c  e, PENDING_BYTE,
14610 20 31 2c 20 30 29 3b 0a 20 20 20 20 0a 20 20 20   1, 0);.    .   
14620 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
14630 4f 52 28 6c 72 63 31 29 20 29 20 7b 0a 20 20 20  OR(lrc1) ) {.   
14640 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
14650 72 6e 6f 20 3d 20 6c 72 63 31 45 72 72 6e 6f 3b  rno = lrc1Errno;
14660 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63 31  .      rc = lrc1
14670 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70  ;.      goto afp
14680 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d  _end_lock;.    }
14690 20 65 6c 73 65 20 69 66 28 20 49 53 5f 4c 4f 43   else if( IS_LOC
146a0 4b 5f 45 52 52 4f 52 28 6c 72 63 32 29 20 29 7b  K_ERROR(lrc2) ){
146b0 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63 32  .      rc = lrc2
146c0 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70  ;.      goto afp
146d0 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d  _end_lock;.    }
146e0 20 65 6c 73 65 20 69 66 28 20 6c 72 63 31 20 21   else if( lrc1 !
146f0 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 29 20 7b 0a  = SQLITE_OK ) {.
14700 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63 31 3b        rc = lrc1;
14710 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  .    } else {.  
14720 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74      pFile->lockt
14730 79 70 65 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43  ype = SHARED_LOC
14740 4b 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  K;.      pFile->
14750 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a  pOpen->nLock++;.
14760 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
14770 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73     /* The reques
14780 74 20 77 61 73 20 66 6f 72 20 61 20 52 45 53 45  t was for a RESE
14790 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56  RVED or EXCLUSIV
147a0 45 20 6c 6f 63 6b 2e 20 20 49 74 20 69 73 0a 20  E lock.  It is. 
147b0 20 20 20 2a 2a 20 61 73 73 75 6d 65 64 20 74 68     ** assumed th
147c0 61 74 20 74 68 65 72 65 20 69 73 20 61 20 53 48  at there is a SH
147d0 41 52 45 44 20 6f 72 20 67 72 65 61 74 65 72 20  ARED or greater 
147e0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65  lock on the file
147f0 0a 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79 2e  .    ** already.
14800 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20  .    */.    int 
14810 66 61 69 6c 65 64 20 3d 20 30 3b 0a 20 20 20 20  failed = 0;.    
14820 61 73 73 65 72 74 28 20 30 21 3d 70 46 69 6c 65  assert( 0!=pFile
14830 2d 3e 6c 6f 63 6b 74 79 70 65 20 29 3b 0a 20 20  ->locktype );.  
14840 20 20 69 66 20 28 6c 6f 63 6b 74 79 70 65 20 3e    if (locktype >
14850 3d 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  = RESERVED_LOCK 
14860 26 26 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  && pFile->lockty
14870 70 65 20 3c 20 52 45 53 45 52 56 45 44 5f 4c 4f  pe < RESERVED_LO
14880 43 4b 29 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a  CK) {.        /*
14890 20 41 63 71 75 69 72 65 20 61 20 52 45 53 45 52   Acquire a RESER
148a0 56 45 44 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20  VED lock */.    
148b0 20 20 20 20 66 61 69 6c 65 64 20 3d 20 61 66 70      failed = afp
148c0 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d  SetLock(context-
148d0 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20  >dbPath, pFile, 
148e0 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 31  RESERVED_BYTE, 1
148f0 2c 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ,1);.    }.    i
14900 66 20 28 21 66 61 69 6c 65 64 20 26 26 20 6c 6f  f (!failed && lo
14910 63 6b 74 79 70 65 20 3d 3d 20 45 58 43 4c 55 53  cktype == EXCLUS
14920 49 56 45 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20  IVE_LOCK) {.    
14930 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61 6e 20    /* Acquire an 
14940 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 2a  EXCLUSIVE lock *
14950 2f 0a 20 20 20 20 20 20 20 20 0a 20 20 20 20 20  /.        .     
14960 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 73   /* Remove the s
14970 68 61 72 65 64 20 6c 6f 63 6b 20 62 65 66 6f 72  hared lock befor
14980 65 20 74 72 79 69 6e 67 20 74 68 65 20 72 61 6e  e trying the ran
14990 67 65 2e 20 20 77 65 27 6c 6c 20 6e 65 65 64 20  ge.  we'll need 
149a0 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 72 65 65  to .      ** ree
149b0 73 74 61 62 6c 69 73 68 20 74 68 65 20 73 68 61  stablish the sha
149c0 72 65 64 20 6c 6f 63 6b 20 69 66 20 77 65 20 63  red lock if we c
149d0 61 6e 27 74 20 67 65 74 20 74 68 65 20 20 61 66  an't get the  af
149e0 70 55 6e 6c 6f 63 6b 0a 20 20 20 20 20 20 2a 2f  pUnlock.      */
149f0 0a 20 20 20 20 20 20 69 66 28 20 21 28 66 61 69  .      if( !(fai
14a00 6c 65 64 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b  led = afpSetLock
14a10 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
14a20 2c 20 70 46 69 6c 65 2c 20 53 48 41 52 45 44 5f  , pFile, SHARED_
14a30 46 49 52 53 54 20 2b 0a 20 20 20 20 20 20 20 20  FIRST +.        
14a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a50 20 63 6f 6e 74 65 78 74 2d 3e 73 68 61 72 65 64   context->shared
14a60 42 79 74 65 2c 20 31 2c 20 30 29 29 20 29 7b 0a  Byte, 1, 0)) ){.
14a70 20 20 20 20 20 20 20 20 69 6e 74 20 66 61 69 6c          int fail
14a80 65 64 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  ed2 = SQLITE_OK;
14a90 0a 20 20 20 20 20 20 20 20 2f 2a 20 6e 6f 77 20  .        /* now 
14aa0 61 74 74 65 6d 6d 70 74 20 74 6f 20 67 65 74 20  attemmpt to get 
14ab0 74 68 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f  the exclusive lo
14ac0 63 6b 20 72 61 6e 67 65 20 2a 2f 0a 20 20 20 20  ck range */.    
14ad0 20 20 20 20 66 61 69 6c 65 64 20 3d 20 61 66 70      failed = afp
14ae0 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d  SetLock(context-
14af0 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20  >dbPath, pFile, 
14b00 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20 0a 20  SHARED_FIRST, . 
14b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 48                SH
14b30 41 52 45 44 5f 53 49 5a 45 2c 20 31 29 3b 0a 20  ARED_SIZE, 1);. 
14b40 20 20 20 20 20 20 20 69 66 28 20 66 61 69 6c 65         if( faile
14b50 64 20 26 26 20 28 66 61 69 6c 65 64 32 20 3d 20  d && (failed2 = 
14b60 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  afpSetLock(conte
14b70 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  xt->dbPath, pFil
14b80 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  e, .            
14b90 20 20 20 20 20 20 20 20 20 20 20 53 48 41 52 45             SHARE
14ba0 44 5f 46 49 52 53 54 20 2b 20 63 6f 6e 74 65 78  D_FIRST + contex
14bb0 74 2d 3e 73 68 61 72 65 64 42 79 74 65 2c 20 31  t->sharedByte, 1
14bc0 2c 20 31 29 29 20 29 7b 0a 20 20 20 20 20 20 20  , 1)) ){.       
14bd0 20 20 20 2f 2a 20 43 61 6e 27 74 20 72 65 65 73     /* Can't rees
14be0 74 61 62 6c 69 73 68 20 74 68 65 20 73 68 61 72  tablish the shar
14bf0 65 64 20 6c 6f 63 6b 2e 20 20 53 71 6c 69 74 65  ed lock.  Sqlite
14c00 20 63 61 6e 27 74 20 64 65 61 6c 2c 20 74 68 69   can't deal, thi
14c10 73 20 69 73 0a 20 20 20 20 20 20 20 20 20 20 2a  s is.          *
14c20 2a 20 61 20 63 72 69 74 69 63 61 6c 20 49 2f 4f  * a critical I/O
14c30 20 65 72 72 6f 72 0a 20 20 20 20 20 20 20 20 20   error.         
14c40 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63   */.          rc
14c50 20 3d 20 28 28 66 61 69 6c 65 64 20 26 20 53 51   = ((failed & SQ
14c60 4c 49 54 45 5f 49 4f 45 52 52 29 20 3d 3d 20 53  LITE_IOERR) == S
14c70 51 4c 49 54 45 5f 49 4f 45 52 52 29 20 3f 20 66  QLITE_IOERR) ? f
14c80 61 69 6c 65 64 32 20 3a 20 0a 20 20 20 20 20 20  ailed2 : .      
14c90 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
14ca0 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20  IOERR_LOCK;.    
14cb0 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65        goto afp_e
14cc0 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20  nd_lock;.       
14cd0 20 7d 20 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   } .      }else{
14ce0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 66 61  .        rc = fa
14cf0 69 6c 65 64 3b 20 0a 20 20 20 20 20 20 7d 0a 20  iled; .      }. 
14d00 20 20 20 7d 0a 20 20 20 20 69 66 28 20 66 61 69     }.    if( fai
14d10 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 72 63 20  led ){.      rc 
14d20 3d 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  = failed;.    }.
14d30 20 20 7d 0a 20 20 0a 20 20 69 66 28 20 72 63 3d    }.  .  if( rc=
14d40 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
14d50 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70    pFile->locktyp
14d60 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20  e = locktype;.  
14d70 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b 74 79  }else if( lockty
14d80 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  pe==EXCLUSIVE_LO
14d90 43 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  CK ){.    pFile-
14da0 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 50 45 4e 44  >locktype = PEND
14db0 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a 20 20  ING_LOCK;.  }.  
14dc0 0a 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3a 0a 20  .afp_end_lock:. 
14dd0 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
14de0 29 3b 0a 20 20 4f 53 54 52 41 43 45 34 28 22 4c  );.  OSTRACE4("L
14df0 4f 43 4b 20 20 20 20 25 64 20 25 73 20 25 73 5c  OCK    %d %s %s\
14e00 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f  n", pFile->h, lo
14e10 63 6b 74 79 70 65 4e 61 6d 65 28 6c 6f 63 6b 74  cktypeName(lockt
14e20 79 70 65 29 2c 20 0a 20 20 20 20 20 20 20 20 20  ype), .         
14e30 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20  rc==SQLITE_OK ? 
14e40 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29  "ok" : "failed")
14e50 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
14e60 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68  ../*.** Lower th
14e70 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
14e80 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  on file descript
14e90 6f 72 20 70 46 69 6c 65 20 74 6f 20 6c 6f 63 6b  or pFile to lock
14ea0 74 79 70 65 2e 20 20 6c 6f 63 6b 74 79 70 65 0a  type.  locktype.
14eb0 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65  ** must be eithe
14ec0 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41  r NO_LOCK or SHA
14ed0 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20  RED_LOCK..**.** 
14ee0 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  If the locking l
14ef0 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65  evel of the file
14f00 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61   descriptor is a
14f10 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c  lready at or bel
14f20 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73  ow.** the reques
14f30 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  ted locking leve
14f40 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  l, this routine 
14f50 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
14f60 74 61 74 69 63 20 69 6e 74 20 61 66 70 55 6e 6c  tatic int afpUnl
14f70 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
14f80 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79   *id, int lockty
14f90 70 65 29 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d  pe) {.  int rc =
14fa0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e   SQLITE_OK;.  un
14fb0 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
14fc0 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
14fd0 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65   afpLockingConte
14fe0 78 74 20 2a 70 43 74 78 20 3d 20 28 61 66 70 4c  xt *pCtx = (afpL
14ff0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29  ockingContext *)
15000 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43   pFile->lockingC
15010 6f 6e 74 65 78 74 3b 0a 0a 20 20 61 73 73 65 72  ontext;..  asser
15020 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53  t( pFile );.  OS
15030 54 52 41 43 45 35 28 22 55 4e 4c 4f 43 4b 20 20  TRACE5("UNLOCK  
15040 25 64 20 25 64 20 77 61 73 20 25 64 20 70 69 64  %d %d was %d pid
15050 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  =%d\n", pFile->h
15060 2c 20 6c 6f 63 6b 74 79 70 65 2c 0a 20 20 20 20  , locktype,.    
15070 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b       pFile->lock
15080 74 79 70 65 2c 20 67 65 74 70 69 64 28 29 29 3b  type, getpid());
15090 0a 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b  ..  assert( lock
150a0 74 79 70 65 3c 3d 53 48 41 52 45 44 5f 4c 4f 43  type<=SHARED_LOC
150b0 4b 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65  K );.  if( pFile
150c0 2d 3e 6c 6f 63 6b 74 79 70 65 3c 3d 6c 6f 63 6b  ->locktype<=lock
150d0 74 79 70 65 20 29 7b 0a 20 20 20 20 72 65 74 75  type ){.    retu
150e0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
150f0 7d 0a 20 20 69 66 28 20 43 48 45 43 4b 5f 54 48  }.  if( CHECK_TH
15100 52 45 41 44 49 44 28 70 46 69 6c 65 29 20 29 7b  READID(pFile) ){
15110 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
15120 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20 7d 0a 20  TE_MISUSE;.  }. 
15130 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
15140 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  );.  if( pFile->
15150 6c 6f 63 6b 74 79 70 65 3e 53 48 41 52 45 44 5f  locktype>SHARED_
15160 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 0a 20 20 20  LOCK ){.    .   
15170 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b   if( pFile->lock
15180 74 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f  type==EXCLUSIVE_
15190 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  LOCK ){.      rc
151a0 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 70 43   = afpSetLock(pC
151b0 74 78 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  tx->dbPath, pFil
151c0 65 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c  e, SHARED_FIRST,
151d0 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 29   SHARED_SIZE, 0)
151e0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
151f0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6c 6f 63  SQLITE_OK && loc
15200 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f  ktype==SHARED_LO
15210 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  CK ){.        /*
15220 20 6f 6e 6c 79 20 72 65 2d 65 73 74 61 62 6c 69   only re-establi
15230 73 68 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f  sh the shared lo
15240 63 6b 20 69 66 20 6e 65 63 65 73 73 61 72 79 20  ck if necessary 
15250 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 73  */.        int s
15260 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 20 3d 20  haredLockByte = 
15270 53 48 41 52 45 44 5f 46 49 52 53 54 2b 70 43 74  SHARED_FIRST+pCt
15280 78 2d 3e 73 68 61 72 65 64 42 79 74 65 3b 0a 20  x->sharedByte;. 
15290 20 20 20 20 20 20 20 72 63 20 3d 20 61 66 70 53         rc = afpS
152a0 65 74 4c 6f 63 6b 28 70 43 74 78 2d 3e 64 62 50  etLock(pCtx->dbP
152b0 61 74 68 2c 20 70 46 69 6c 65 2c 20 73 68 61 72  ath, pFile, shar
152c0 65 64 4c 6f 63 6b 42 79 74 65 2c 20 31 2c 20 31  edLockByte, 1, 1
152d0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
152e0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
152f0 49 54 45 5f 4f 4b 20 26 26 20 70 46 69 6c 65 2d  ITE_OK && pFile-
15300 3e 6c 6f 63 6b 74 79 70 65 3e 3d 50 45 4e 44 49  >locktype>=PENDI
15310 4e 47 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20  NG_LOCK ){.     
15320 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b   rc = afpSetLock
15330 28 70 43 74 78 2d 3e 64 62 50 61 74 68 2c 20 70  (pCtx->dbPath, p
15340 46 69 6c 65 2c 20 50 45 4e 44 49 4e 47 5f 42 59  File, PENDING_BY
15350 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d  TE, 1, 0);.    }
15360 20 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51   .    if( rc==SQ
15370 4c 49 54 45 5f 4f 4b 20 26 26 20 70 46 69 6c 65  LITE_OK && pFile
15380 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 52 45 53 45  ->locktype>=RESE
15390 52 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  RVED_LOCK ){.   
153a0 20 20 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f     rc = afpSetLo
153b0 63 6b 28 70 43 74 78 2d 3e 64 62 50 61 74 68 2c  ck(pCtx->dbPath,
153c0 20 70 46 69 6c 65 2c 20 52 45 53 45 52 56 45 44   pFile, RESERVED
153d0 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20  _BYTE, 1, 0);.  
153e0 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
153f0 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43  locktype==NO_LOC
15400 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 63 6c 65 61  K ){.    /* clea
15410 72 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63  r the shared loc
15420 6b 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 68 61  k */.    int sha
15430 72 65 64 4c 6f 63 6b 42 79 74 65 20 3d 20 53 48  redLockByte = SH
15440 41 52 45 44 5f 46 49 52 53 54 2b 70 43 74 78 2d  ARED_FIRST+pCtx-
15450 3e 73 68 61 72 65 64 42 79 74 65 3b 0a 20 20 20  >sharedByte;.   
15460 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b   rc = afpSetLock
15470 28 70 43 74 78 2d 3e 64 62 50 61 74 68 2c 20 70  (pCtx->dbPath, p
15480 46 69 6c 65 2c 20 73 68 61 72 65 64 4c 6f 63 6b  File, sharedLock
15490 42 79 74 65 2c 20 31 2c 20 30 29 3b 0a 20 20 7d  Byte, 1, 0);.  }
154a0 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
154b0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
154c0 20 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f   locktype==NO_LO
154d0 43 4b 20 29 7b 0a 20 20 20 20 20 20 73 74 72 75  CK ){.      stru
154e0 63 74 20 75 6e 69 78 4f 70 65 6e 43 6e 74 20 2a  ct unixOpenCnt *
154f0 70 4f 70 65 6e 20 3d 20 70 46 69 6c 65 2d 3e 70  pOpen = pFile->p
15500 4f 70 65 6e 3b 0a 20 20 20 20 20 20 70 4f 70 65  Open;.      pOpe
15510 6e 2d 3e 6e 4c 6f 63 6b 2d 2d 3b 0a 20 20 20 20  n->nLock--;.    
15520 20 20 61 73 73 65 72 74 28 20 70 4f 70 65 6e 2d    assert( pOpen-
15530 3e 6e 4c 6f 63 6b 3e 3d 30 20 29 3b 0a 20 20 20  >nLock>=0 );.   
15540 20 20 20 69 66 28 20 70 4f 70 65 6e 2d 3e 6e 4c     if( pOpen->nL
15550 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ock==0 ){.      
15560 20 20 72 63 20 3d 20 63 6c 6f 73 65 50 65 6e 64    rc = closePend
15570 69 6e 67 46 64 73 28 70 46 69 6c 65 29 3b 0a 20  ingFds(pFile);. 
15580 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
15590 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65  .  unixLeaveMute
155a0 78 28 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  x();.  if( rc==S
155b0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
155c0 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20  pFile->locktype 
155d0 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 7d 0a  = locktype;.  }.
155e0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
155f0 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69  /*.** Close a fi
15600 6c 65 20 26 20 63 6c 65 61 6e 75 70 20 41 46 50  le & cleanup AFP
15610 20 73 70 65 63 69 66 69 63 20 6c 6f 63 6b 69 6e   specific lockin
15620 67 20 63 6f 6e 74 65 78 74 20 0a 2a 2f 0a 73 74  g context .*/.st
15630 61 74 69 63 20 69 6e 74 20 61 66 70 43 6c 6f 73  atic int afpClos
15640 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
15650 69 64 29 20 7b 0a 20 20 69 66 28 20 69 64 20 29  id) {.  if( id )
15660 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a  {.    unixFile *
15670 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
15680 65 2a 29 69 64 3b 0a 20 20 20 20 61 66 70 55 6e  e*)id;.    afpUn
15690 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b  lock(id, NO_LOCK
156a0 29 3b 0a 20 20 20 20 75 6e 69 78 45 6e 74 65 72  );.    unixEnter
156b0 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 69 66 28  Mutex();.    if(
156c0 20 70 46 69 6c 65 2d 3e 70 4f 70 65 6e 20 26 26   pFile->pOpen &&
156d0 20 70 46 69 6c 65 2d 3e 70 4f 70 65 6e 2d 3e 6e   pFile->pOpen->n
156e0 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Lock ){.      /*
156f0 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6f 75   If there are ou
15700 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 2c  tstanding locks,
15710 20 64 6f 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79   do not actually
15720 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20   close the file 
15730 6a 75 73 74 0a 20 20 20 20 20 20 2a 2a 20 79 65  just.      ** ye
15740 74 20 62 65 63 61 75 73 65 20 74 68 61 74 20 77  t because that w
15750 6f 75 6c 64 20 63 6c 65 61 72 20 74 68 6f 73 65  ould clear those
15760 20 6c 6f 63 6b 73 2e 20 20 49 6e 73 74 65 61 64   locks.  Instead
15770 2c 20 61 64 64 20 74 68 65 20 66 69 6c 65 0a 20  , add the file. 
15780 20 20 20 20 20 2a 2a 20 64 65 73 63 72 69 70 74       ** descript
15790 6f 72 20 74 6f 20 70 4f 70 65 6e 2d 3e 61 50 65  or to pOpen->aPe
157a0 6e 64 69 6e 67 2e 20 20 49 74 20 77 69 6c 6c 20  nding.  It will 
157b0 62 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  be automatically
157c0 20 63 6c 6f 73 65 64 20 77 68 65 6e 0a 20 20 20   closed when.   
157d0 20 20 20 2a 2a 20 74 68 65 20 6c 61 73 74 20 6c     ** the last l
157e0 6f 63 6b 20 69 73 20 63 6c 65 61 72 65 64 2e 0a  ock is cleared..
157f0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
15800 65 74 50 65 6e 64 69 6e 67 46 64 28 70 46 69 6c  etPendingFd(pFil
15810 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  e);.    }.    re
15820 6c 65 61 73 65 4f 70 65 6e 43 6e 74 28 70 46 69  leaseOpenCnt(pFi
15830 6c 65 2d 3e 70 4f 70 65 6e 29 3b 0a 20 20 20 20  le->pOpen);.    
15840 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 46 69  sqlite3_free(pFi
15850 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
15860 78 74 29 3b 0a 20 20 20 20 63 6c 6f 73 65 55 6e  xt);.    closeUn
15870 69 78 46 69 6c 65 28 69 64 29 3b 0a 20 20 20 20  ixFile(id);.    
15880 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
15890 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
158a0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e  QLITE_OK;.}..#en
158b0 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f  dif /* defined(_
158c0 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c  _APPLE__) && SQL
158d0 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
158e0 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 2f 2a 0a 2a  NG_STYLE */./*.*
158f0 2a 20 54 68 65 20 63 6f 64 65 20 61 62 6f 76 65  * The code above
15900 20 69 73 20 74 68 65 20 41 46 50 20 6c 6f 63 6b   is the AFP lock
15910 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e   implementation.
15920 20 20 54 68 65 20 63 6f 64 65 20 69 73 20 73 70    The code is sp
15930 65 63 69 66 69 63 0a 2a 2a 20 74 6f 20 4d 61 63  ecific.** to Mac
15940 4f 53 58 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74  OSX and does not
15950 20 77 6f 72 6b 20 6f 6e 20 6f 74 68 65 72 20 75   work on other u
15960 6e 69 78 20 70 6c 61 74 66 6f 72 6d 73 2e 20 20  nix platforms.  
15970 4e 6f 20 61 6c 74 65 72 6e 61 74 69 76 65 0a 2a  No alternative.*
15980 2a 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 20  * is available. 
15990 20 49 66 20 79 6f 75 20 64 6f 6e 27 74 20 63 6f   If you don't co
159a0 6d 70 69 6c 65 20 66 6f 72 20 61 20 6d 61 63 2c  mpile for a mac,
159b0 20 74 68 65 6e 20 74 68 65 20 22 75 6e 69 78 2d   then the "unix-
159c0 61 66 70 22 0a 2a 2a 20 56 46 53 20 69 73 20 6e  afp".** VFS is n
159d0 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a  ot available..**
159e0 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
159f0 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68  ****** End of th
15a00 65 20 41 46 50 20 6c 6f 63 6b 20 69 6d 70 6c 65  e AFP lock imple
15a10 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a  mentation ******
15a20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15a30 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
15a40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15a50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15a60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15a70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
15a80 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .../************
15a90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15aa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15ab0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15ac0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15ad0 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
15ae0 2a 2a 2a 20 4e 6f 6e 2d 6c 6f 63 6b 69 6e 67 20  *** Non-locking 
15af0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 6d 65 74  sqlite3_file met
15b00 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  hods ***********
15b10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15b20 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 78  **.**.** The nex
15b30 74 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74 61  t division conta
15b40 69 6e 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ins implementati
15b50 6f 6e 73 20 66 6f 72 20 61 6c 6c 20 6d 65 74 68  ons for all meth
15b60 6f 64 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20 73  ods of the .** s
15b70 71 6c 69 74 65 33 5f 66 69 6c 65 20 6f 62 6a 65  qlite3_file obje
15b80 63 74 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68  ct other than th
15b90 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64  e locking method
15ba0 73 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 0a  s.  The locking.
15bb0 2a 2a 20 6d 65 74 68 6f 64 73 20 77 65 72 65 20  ** methods were 
15bc0 64 65 66 69 6e 65 64 20 69 6e 20 64 69 76 69 73  defined in divis
15bd0 69 6f 6e 73 20 61 62 6f 76 65 20 28 6f 6e 65 20  ions above (one 
15be0 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 20 70  locking method p
15bf0 65 72 0a 2a 2a 20 64 69 76 69 73 69 6f 6e 29 2e  er.** division).
15c00 20 20 54 68 6f 73 65 20 6d 65 74 68 6f 64 73 20    Those methods 
15c10 74 68 61 74 20 61 72 65 20 63 6f 6d 6d 6f 6e 20  that are common 
15c20 74 6f 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6d  to all locking m
15c30 6f 64 65 73 0a 2a 2a 20 61 72 65 20 67 61 74 68  odes.** are gath
15c40 65 72 20 74 6f 67 65 74 68 65 72 20 69 6e 74 6f  er together into
15c50 20 74 68 69 73 20 64 69 76 69 73 69 6f 6e 2e 0a   this division..
15c60 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74  */../*.** Seek t
15c70 6f 20 74 68 65 20 6f 66 66 73 65 74 20 70 61 73  o the offset pas
15c80 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
15c90 64 20 61 72 67 75 6d 65 6e 74 2c 20 74 68 65 6e  d argument, then
15ca0 20 72 65 61 64 20 63 6e 74 20 0a 2a 2a 20 62 79   read cnt .** by
15cb0 74 65 73 20 69 6e 74 6f 20 70 42 75 66 2e 20 52  tes into pBuf. R
15cc0 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
15cd0 20 6f 66 20 62 79 74 65 73 20 61 63 74 75 61 6c   of bytes actual
15ce0 6c 79 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 4e  ly read..**.** N
15cf0 42 3a 20 20 49 66 20 79 6f 75 20 64 65 66 69 6e  B:  If you defin
15d00 65 20 55 53 45 5f 50 52 45 41 44 20 6f 72 20 55  e USE_PREAD or U
15d10 53 45 5f 50 52 45 41 44 36 34 2c 20 74 68 65 6e  SE_PREAD64, then
15d20 20 69 74 20 6d 69 67 68 74 20 61 6c 73 6f 0a 2a   it might also.*
15d30 2a 20 62 65 20 6e 65 63 65 73 73 61 72 79 20 74  * be necessary t
15d40 6f 20 64 65 66 69 6e 65 20 5f 58 4f 50 45 4e 5f  o define _XOPEN_
15d50 53 4f 55 52 43 45 20 74 6f 20 62 65 20 35 30 30  SOURCE to be 500
15d60 2e 20 20 54 68 69 73 20 76 61 72 69 65 73 20 66  .  This varies f
15d70 72 6f 6d 0a 2a 2a 20 6f 6e 65 20 73 79 73 74 65  rom.** one syste
15d80 6d 20 74 6f 20 61 6e 6f 74 68 65 72 2e 20 20 53  m to another.  S
15d90 69 6e 63 65 20 53 51 4c 69 74 65 20 64 6f 65 73  ince SQLite does
15da0 20 6e 6f 74 20 64 65 66 69 6e 65 20 55 53 45 5f   not define USE_
15db0 50 52 45 41 44 0a 2a 2a 20 61 6e 79 20 61 6e 79  PREAD.** any any
15dc0 20 66 6f 72 6d 20 62 79 20 64 65 66 61 75 6c 74   form by default
15dd0 2c 20 77 65 20 77 69 6c 6c 20 6e 6f 74 20 61 74  , we will not at
15de0 74 65 6d 70 74 20 74 6f 20 64 65 66 69 6e 65 20  tempt to define 
15df0 5f 58 4f 50 45 4e 5f 53 4f 55 52 43 45 2e 0a 2a  _XOPEN_SOURCE..*
15e00 2a 20 53 65 65 20 74 69 63 6b 65 74 73 20 23 32  * See tickets #2
15e10 37 34 31 20 61 6e 64 20 23 32 36 38 31 2e 0a 2a  741 and #2681..*
15e20 2a 0a 2a 2a 20 54 6f 20 61 76 6f 69 64 20 73 74  *.** To avoid st
15e30 6f 6d 70 69 6e 67 20 74 68 65 20 65 72 72 6e 6f  omping the errno
15e40 20 76 61 6c 75 65 20 6f 6e 20 61 20 66 61 69 6c   value on a fail
15e50 65 64 20 72 65 61 64 20 74 68 65 20 6c 61 73 74  ed read the last
15e60 45 72 72 6e 6f 20 76 61 6c 75 65 0a 2a 2a 20 69  Errno value.** i
15e70 73 20 73 65 74 20 62 65 66 6f 72 65 20 72 65 74  s set before ret
15e80 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  urning..*/.stati
15e90 63 20 69 6e 74 20 73 65 65 6b 41 6e 64 52 65 61  c int seekAndRea
15ea0 64 28 75 6e 69 78 46 69 6c 65 20 2a 69 64 2c 20  d(unixFile *id, 
15eb0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66  sqlite3_int64 of
15ec0 66 73 65 74 2c 20 76 6f 69 64 20 2a 70 42 75 66  fset, void *pBuf
15ed0 2c 20 69 6e 74 20 63 6e 74 29 7b 0a 20 20 69 6e  , int cnt){.  in
15ee0 74 20 67 6f 74 3b 0a 20 20 69 36 34 20 6e 65 77  t got;.  i64 new
15ef0 4f 66 66 73 65 74 3b 0a 20 20 54 49 4d 45 52 5f  Offset;.  TIMER_
15f00 53 54 41 52 54 3b 0a 23 69 66 20 64 65 66 69 6e  START;.#if defin
15f10 65 64 28 55 53 45 5f 50 52 45 41 44 29 0a 20 20  ed(USE_PREAD).  
15f20 67 6f 74 20 3d 20 70 72 65 61 64 28 69 64 2d 3e  got = pread(id->
15f30 68 2c 20 70 42 75 66 2c 20 63 6e 74 2c 20 6f 66  h, pBuf, cnt, of
15f40 66 73 65 74 29 3b 0a 20 20 53 69 6d 75 6c 61 74  fset);.  Simulat
15f50 65 49 4f 45 72 72 6f 72 28 20 67 6f 74 20 3d 20  eIOError( got = 
15f60 2d 31 20 29 3b 0a 23 65 6c 69 66 20 64 65 66 69  -1 );.#elif defi
15f70 6e 65 64 28 55 53 45 5f 50 52 45 41 44 36 34 29  ned(USE_PREAD64)
15f80 0a 20 20 67 6f 74 20 3d 20 70 72 65 61 64 36 34  .  got = pread64
15f90 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e  (id->h, pBuf, cn
15fa0 74 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 53 69  t, offset);.  Si
15fb0 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 67  mulateIOError( g
15fc0 6f 74 20 3d 20 2d 31 20 29 3b 0a 23 65 6c 73 65  ot = -1 );.#else
15fd0 0a 20 20 6e 65 77 4f 66 66 73 65 74 20 3d 20 6c  .  newOffset = l
15fe0 73 65 65 6b 28 69 64 2d 3e 68 2c 20 6f 66 66 73  seek(id->h, offs
15ff0 65 74 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20  et, SEEK_SET);. 
16000 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
16010 28 20 6e 65 77 4f 66 66 73 65 74 2d 2d 20 29 3b  ( newOffset-- );
16020 0a 20 20 69 66 28 20 6e 65 77 4f 66 66 73 65 74  .  if( newOffset
16030 21 3d 6f 66 66 73 65 74 20 29 7b 0a 20 20 20 20  !=offset ){.    
16040 69 66 28 20 6e 65 77 4f 66 66 73 65 74 20 3d 3d  if( newOffset ==
16050 20 2d 31 20 29 7b 0a 20 20 20 20 20 20 28 28 75   -1 ){.      ((u
16060 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61  nixFile*)id)->la
16070 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b  stErrno = errno;
16080 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
16090 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64    ((unixFile*)id
160a0 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30  )->lastErrno = 0
160b0 3b 09 09 09 0a 20 20 20 20 7d 0a 20 20 20 20 72  ;....    }.    r
160c0 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20 20  eturn -1;.  }.  
160d0 67 6f 74 20 3d 20 72 65 61 64 28 69 64 2d 3e 68  got = read(id->h
160e0 2c 20 70 42 75 66 2c 20 63 6e 74 29 3b 0a 23 65  , pBuf, cnt);.#e
160f0 6e 64 69 66 0a 20 20 54 49 4d 45 52 5f 45 4e 44  ndif.  TIMER_END
16100 3b 0a 20 20 69 66 28 20 67 6f 74 3c 30 20 29 7b  ;.  if( got<0 ){
16110 0a 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a  .    ((unixFile*
16120 29 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  )id)->lastErrno 
16130 3d 20 65 72 72 6e 6f 3b 0a 20 20 7d 0a 20 20 4f  = errno;.  }.  O
16140 53 54 52 41 43 45 35 28 22 52 45 41 44 20 20 20  STRACE5("READ   
16150 20 25 2d 33 64 20 25 35 64 20 25 37 6c 6c 64 20   %-3d %5d %7lld 
16160 25 6c 6c 75 5c 6e 22 2c 20 69 64 2d 3e 68 2c 20  %llu\n", id->h, 
16170 67 6f 74 2c 20 6f 66 66 73 65 74 2c 20 54 49 4d  got, offset, TIM
16180 45 52 5f 45 4c 41 50 53 45 44 29 3b 0a 20 20 72  ER_ELAPSED);.  r
16190 65 74 75 72 6e 20 67 6f 74 3b 0a 7d 0a 0a 2f 2a  eturn got;.}../*
161a0 0a 2a 2a 20 52 65 61 64 20 64 61 74 61 20 66 72  .** Read data fr
161b0 6f 6d 20 61 20 66 69 6c 65 20 69 6e 74 6f 20 61  om a file into a
161c0 20 62 75 66 66 65 72 2e 20 20 52 65 74 75 72 6e   buffer.  Return
161d0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 61 6c   SQLITE_OK if al
161e0 6c 0a 2a 2a 20 62 79 74 65 73 20 77 65 72 65 20  l.** bytes were 
161f0 72 65 61 64 20 73 75 63 63 65 73 73 66 75 6c 6c  read successfull
16200 79 20 61 6e 64 20 53 51 4c 49 54 45 5f 49 4f 45  y and SQLITE_IOE
16210 52 52 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67  RR if anything g
16220 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 0a 2a 2f  oes.** wrong..*/
16230 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
16240 52 65 61 64 28 0a 20 20 73 71 6c 69 74 65 33 5f  Read(.  sqlite3_
16250 66 69 6c 65 20 2a 69 64 2c 20 0a 20 20 76 6f 69  file *id, .  voi
16260 64 20 2a 70 42 75 66 2c 20 0a 20 20 69 6e 74 20  d *pBuf, .  int 
16270 61 6d 74 2c 0a 20 20 73 71 6c 69 74 65 33 5f 69  amt,.  sqlite3_i
16280 6e 74 36 34 20 6f 66 66 73 65 74 0a 29 7b 0a 20  nt64 offset.){. 
16290 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
162a0 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 69   = (unixFile *)i
162b0 64 3b 0a 20 20 69 6e 74 20 67 6f 74 3b 0a 20 20  d;.  int got;.  
162c0 61 73 73 65 72 74 28 20 69 64 20 29 3b 0a 0a 20  assert( id );.. 
162d0 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
162e0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28   database file (
162f0 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 2c 20 6d  not a journal, m
16300 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6f 72  aster-journal or
16310 20 74 65 6d 70 0a 20 20 2a 2a 20 66 69 6c 65 29   temp.  ** file)
16320 2c 20 74 68 65 20 62 79 74 65 73 20 69 6e 20 74  , the bytes in t
16330 68 65 20 6c 6f 63 6b 69 6e 67 20 72 61 6e 67 65  he locking range
16340 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 62 65   should never be
16350 20 72 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e   read or written
16360 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  . */.  assert( p
16370 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64 3d 3d 30  File->pUnused==0
16380 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66 66 73 65  .       || offse
16390 74 3e 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 2b  t>=PENDING_BYTE+
163a0 35 31 32 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66  512.       || of
163b0 66 73 65 74 2b 61 6d 74 3c 3d 50 45 4e 44 49 4e  fset+amt<=PENDIN
163c0 47 5f 42 59 54 45 20 0a 20 20 29 3b 0a 0a 20 20  G_BYTE .  );..  
163d0 67 6f 74 20 3d 20 73 65 65 6b 41 6e 64 52 65 61  got = seekAndRea
163e0 64 28 70 46 69 6c 65 2c 20 6f 66 66 73 65 74 2c  d(pFile, offset,
163f0 20 70 42 75 66 2c 20 61 6d 74 29 3b 0a 20 20 69   pBuf, amt);.  i
16400 66 28 20 67 6f 74 3d 3d 61 6d 74 20 29 7b 0a 20  f( got==amt ){. 
16410 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
16420 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  _OK;.  }else if(
16430 20 67 6f 74 3c 30 20 29 7b 0a 20 20 20 20 2f 2a   got<0 ){.    /*
16440 20 6c 61 73 74 45 72 72 6e 6f 20 73 65 74 20 62   lastErrno set b
16450 79 20 73 65 65 6b 41 6e 64 52 65 61 64 20 2a 2f  y seekAndRead */
16460 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
16470 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 3b 0a 20  TE_IOERR_READ;. 
16480 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46 69 6c   }else{.    pFil
16490 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30  e->lastErrno = 0
164a0 3b 20 2f 2a 20 6e 6f 74 20 61 20 73 79 73 74 65  ; /* not a syste
164b0 6d 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 2f  m error */.    /
164c0 2a 20 55 6e 72 65 61 64 20 70 61 72 74 73 20 6f  * Unread parts o
164d0 66 20 74 68 65 20 62 75 66 66 65 72 20 6d 75 73  f the buffer mus
164e0 74 20 62 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64  t be zero-filled
164f0 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26   */.    memset(&
16500 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b 67 6f  ((char*)pBuf)[go
16510 74 5d 2c 20 30 2c 20 61 6d 74 2d 67 6f 74 29 3b  t], 0, amt-got);
16520 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
16530 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52  TE_IOERR_SHORT_R
16540 45 41 44 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  EAD;.  }.}../*.*
16550 2a 20 53 65 65 6b 20 74 6f 20 74 68 65 20 6f 66  * Seek to the of
16560 66 73 65 74 20 69 6e 20 69 64 2d 3e 6f 66 66 73  fset in id->offs
16570 65 74 20 74 68 65 6e 20 72 65 61 64 20 63 6e 74  et then read cnt
16580 20 62 79 74 65 73 20 69 6e 74 6f 20 70 42 75 66   bytes into pBuf
16590 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  ..** Return the 
165a0 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
165b0 61 63 74 75 61 6c 6c 79 20 72 65 61 64 2e 20 20  actually read.  
165c0 55 70 64 61 74 65 20 74 68 65 20 6f 66 66 73 65  Update the offse
165d0 74 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 76 6f 69  t..**.** To avoi
165e0 64 20 73 74 6f 6d 70 69 6e 67 20 74 68 65 20 65  d stomping the e
165f0 72 72 6e 6f 20 76 61 6c 75 65 20 6f 6e 20 61 20  rrno value on a 
16600 66 61 69 6c 65 64 20 77 72 69 74 65 20 74 68 65  failed write the
16610 20 6c 61 73 74 45 72 72 6e 6f 20 76 61 6c 75 65   lastErrno value
16620 0a 2a 2a 20 69 73 20 73 65 74 20 62 65 66 6f 72  .** is set befor
16630 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a  e returning..*/.
16640 73 74 61 74 69 63 20 69 6e 74 20 73 65 65 6b 41  static int seekA
16650 6e 64 57 72 69 74 65 28 75 6e 69 78 46 69 6c 65  ndWrite(unixFile
16660 20 2a 69 64 2c 20 69 36 34 20 6f 66 66 73 65 74   *id, i64 offset
16670 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42  , const void *pB
16680 75 66 2c 20 69 6e 74 20 63 6e 74 29 7b 0a 20 20  uf, int cnt){.  
16690 69 6e 74 20 67 6f 74 3b 0a 20 20 69 36 34 20 6e  int got;.  i64 n
166a0 65 77 4f 66 66 73 65 74 3b 0a 20 20 54 49 4d 45  ewOffset;.  TIME
166b0 52 5f 53 54 41 52 54 3b 0a 23 69 66 20 64 65 66  R_START;.#if def
166c0 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29 0a  ined(USE_PREAD).
166d0 20 20 67 6f 74 20 3d 20 70 77 72 69 74 65 28 69    got = pwrite(i
166e0 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 2c  d->h, pBuf, cnt,
166f0 20 6f 66 66 73 65 74 29 3b 0a 23 65 6c 69 66 20   offset);.#elif 
16700 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41  defined(USE_PREA
16710 44 36 34 29 0a 20 20 67 6f 74 20 3d 20 70 77 72  D64).  got = pwr
16720 69 74 65 36 34 28 69 64 2d 3e 68 2c 20 70 42 75  ite64(id->h, pBu
16730 66 2c 20 63 6e 74 2c 20 6f 66 66 73 65 74 29 3b  f, cnt, offset);
16740 0a 23 65 6c 73 65 0a 20 20 6e 65 77 4f 66 66 73  .#else.  newOffs
16750 65 74 20 3d 20 6c 73 65 65 6b 28 69 64 2d 3e 68  et = lseek(id->h
16760 2c 20 6f 66 66 73 65 74 2c 20 53 45 45 4b 5f 53  , offset, SEEK_S
16770 45 54 29 3b 0a 20 20 69 66 28 20 6e 65 77 4f 66  ET);.  if( newOf
16780 66 73 65 74 21 3d 6f 66 66 73 65 74 20 29 7b 0a  fset!=offset ){.
16790 20 20 20 20 69 66 28 20 6e 65 77 4f 66 66 73 65      if( newOffse
167a0 74 20 3d 3d 20 2d 31 20 29 7b 0a 20 20 20 20 20  t == -1 ){.     
167b0 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29   ((unixFile*)id)
167c0 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72  ->lastErrno = er
167d0 72 6e 6f 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  rno;.    }else{.
167e0 20 20 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65        ((unixFile
167f0 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f  *)id)->lastErrno
16800 20 3d 20 30 3b 09 09 09 0a 20 20 20 20 7d 0a 20   = 0;....    }. 
16810 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20     return -1;.  
16820 7d 0a 20 20 67 6f 74 20 3d 20 77 72 69 74 65 28  }.  got = write(
16830 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74  id->h, pBuf, cnt
16840 29 3b 0a 23 65 6e 64 69 66 0a 20 20 54 49 4d 45  );.#endif.  TIME
16850 52 5f 45 4e 44 3b 0a 20 20 69 66 28 20 67 6f 74  R_END;.  if( got
16860 3c 30 20 29 7b 0a 20 20 20 20 28 28 75 6e 69 78  <0 ){.    ((unix
16870 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45  File*)id)->lastE
16880 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
16890 7d 0a 0a 20 20 4f 53 54 52 41 43 45 35 28 22 57  }..  OSTRACE5("W
168a0 52 49 54 45 20 20 20 25 2d 33 64 20 25 35 64 20  RITE   %-3d %5d 
168b0 25 37 6c 6c 64 20 25 6c 6c 75 5c 6e 22 2c 20 69  %7lld %llu\n", i
168c0 64 2d 3e 68 2c 20 67 6f 74 2c 20 6f 66 66 73 65  d->h, got, offse
168d0 74 2c 20 54 49 4d 45 52 5f 45 4c 41 50 53 45 44  t, TIMER_ELAPSED
168e0 29 3b 0a 20 20 72 65 74 75 72 6e 20 67 6f 74 3b  );.  return got;
168f0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  .}.../*.** Write
16900 20 64 61 74 61 20 66 72 6f 6d 20 61 20 62 75 66   data from a buf
16910 66 65 72 20 69 6e 74 6f 20 61 20 66 69 6c 65 2e  fer into a file.
16920 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
16930 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 0a 2a 2a  OK on success.**
16940 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 65   or some other e
16950 72 72 6f 72 20 63 6f 64 65 20 6f 6e 20 66 61 69  rror code on fai
16960 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lure..*/.static 
16970 69 6e 74 20 75 6e 69 78 57 72 69 74 65 28 0a 20  int unixWrite(. 
16980 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69   sqlite3_file *i
16990 64 2c 20 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64  d, .  const void
169a0 20 2a 70 42 75 66 2c 20 0a 20 20 69 6e 74 20 61   *pBuf, .  int a
169b0 6d 74 2c 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  mt,.  sqlite3_in
169c0 74 36 34 20 6f 66 66 73 65 74 20 0a 29 7b 0a 20  t64 offset .){. 
169d0 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
169e0 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
169f0 3b 0a 20 20 69 6e 74 20 77 72 6f 74 65 20 3d 20  ;.  int wrote = 
16a00 30 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 20  0;.  assert( id 
16a10 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 6d 74  );.  assert( amt
16a20 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  >0 );..  /* If t
16a30 68 69 73 20 69 73 20 61 20 64 61 74 61 62 61 73  his is a databas
16a40 65 20 66 69 6c 65 20 28 6e 6f 74 20 61 20 6a 6f  e file (not a jo
16a50 75 72 6e 61 6c 2c 20 6d 61 73 74 65 72 2d 6a 6f  urnal, master-jo
16a60 75 72 6e 61 6c 20 6f 72 20 74 65 6d 70 0a 20 20  urnal or temp.  
16a70 2a 2a 20 66 69 6c 65 29 2c 20 74 68 65 20 62 79  ** file), the by
16a80 74 65 73 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69  tes in the locki
16a90 6e 67 20 72 61 6e 67 65 20 73 68 6f 75 6c 64 20  ng range should 
16aa0 6e 65 76 65 72 20 62 65 20 72 65 61 64 20 6f 72  never be read or
16ab0 20 77 72 69 74 74 65 6e 2e 20 2a 2f 0a 20 20 61   written. */.  a
16ac0 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 70 55  ssert( pFile->pU
16ad0 6e 75 73 65 64 3d 3d 30 0a 20 20 20 20 20 20 20  nused==0.       
16ae0 7c 7c 20 6f 66 66 73 65 74 3e 3d 50 45 4e 44 49  || offset>=PENDI
16af0 4e 47 5f 42 59 54 45 2b 35 31 32 0a 20 20 20 20  NG_BYTE+512.    
16b00 20 20 20 7c 7c 20 6f 66 66 73 65 74 2b 61 6d 74     || offset+amt
16b10 3c 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 0a  <=PENDING_BYTE .
16b20 20 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 4e 44    );..#ifndef ND
16b30 45 42 55 47 0a 20 20 2f 2a 20 49 66 20 77 65 20  EBUG.  /* If we 
16b40 61 72 65 20 64 6f 69 6e 67 20 61 20 6e 6f 72 6d  are doing a norm
16b50 61 6c 20 77 72 69 74 65 20 74 6f 20 61 20 64 61  al write to a da
16b60 74 61 62 61 73 65 20 66 69 6c 65 20 28 61 73 20  tabase file (as 
16b70 6f 70 70 6f 73 65 64 20 74 6f 0a 20 20 2a 2a 20  opposed to.  ** 
16b80 64 6f 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72  doing a hot-jour
16b90 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20  nal rollback or 
16ba0 61 20 77 72 69 74 65 20 74 6f 20 73 6f 6d 65 20  a write to some 
16bb0 66 69 6c 65 20 6f 74 68 65 72 20 74 68 61 6e 20  file other than 
16bc0 61 0a 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20 64 61  a.  ** normal da
16bd0 74 61 62 61 73 65 20 66 69 6c 65 29 20 74 68 65  tabase file) the
16be0 6e 20 72 65 63 6f 72 64 20 74 68 65 20 66 61 63  n record the fac
16bf0 74 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62  t that the datab
16c00 61 73 65 0a 20 20 2a 2a 20 68 61 73 20 63 68 61  ase.  ** has cha
16c10 6e 67 65 64 2e 20 20 49 66 20 74 68 65 20 74 72  nged.  If the tr
16c20 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65  ansaction counte
16c30 72 20 69 73 20 6d 6f 64 69 66 69 65 64 2c 20 72  r is modified, r
16c40 65 63 6f 72 64 20 74 68 61 74 0a 20 20 2a 2a 20  ecord that.  ** 
16c50 66 61 63 74 20 74 6f 6f 2e 0a 20 20 2a 2f 0a 20  fact too..  */. 
16c60 20 69 66 28 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f   if( pFile->inNo
16c70 72 6d 61 6c 57 72 69 74 65 20 29 7b 0a 20 20 20  rmalWrite ){.   
16c80 20 70 46 69 6c 65 2d 3e 64 62 55 70 64 61 74 65   pFile->dbUpdate
16c90 20 3d 20 31 3b 20 20 2f 2a 20 54 68 65 20 64 61   = 1;  /* The da
16ca0 74 61 62 61 73 65 20 68 61 73 20 62 65 65 6e 20  tabase has been 
16cb0 6d 6f 64 69 66 69 65 64 20 2a 2f 0a 20 20 20 20  modified */.    
16cc0 69 66 28 20 6f 66 66 73 65 74 3c 3d 32 34 20 26  if( offset<=24 &
16cd0 26 20 6f 66 66 73 65 74 2b 61 6d 74 3e 3d 32 37  & offset+amt>=27
16ce0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63   ){.      int rc
16cf0 3b 0a 20 20 20 20 20 20 63 68 61 72 20 6f 6c 64  ;.      char old
16d00 43 6e 74 72 5b 34 5d 3b 0a 20 20 20 20 20 20 53  Cntr[4];.      S
16d10 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65  imulateIOErrorBe
16d20 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 72  nign(1);.      r
16d30 63 20 3d 20 73 65 65 6b 41 6e 64 52 65 61 64 28  c = seekAndRead(
16d40 70 46 69 6c 65 2c 20 32 34 2c 20 6f 6c 64 43 6e  pFile, 24, oldCn
16d50 74 72 2c 20 34 29 3b 0a 20 20 20 20 20 20 53 69  tr, 4);.      Si
16d60 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
16d70 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 69 66  ign(0);.      if
16d80 28 20 72 63 21 3d 34 20 7c 7c 20 6d 65 6d 63 6d  ( rc!=4 || memcm
16d90 70 28 6f 6c 64 43 6e 74 72 2c 20 26 28 28 63 68  p(oldCntr, &((ch
16da0 61 72 2a 29 70 42 75 66 29 5b 32 34 2d 6f 66 66  ar*)pBuf)[24-off
16db0 73 65 74 5d 2c 20 34 29 21 3d 30 20 29 7b 0a 20  set], 4)!=0 ){. 
16dc0 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 74 72         pFile->tr
16dd0 61 6e 73 43 6e 74 72 43 68 6e 67 20 3d 20 31 3b  ansCntrChng = 1;
16de0 20 20 2f 2a 20 54 68 65 20 74 72 61 6e 73 61 63    /* The transac
16df0 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 68 61 73  tion counter has
16e00 20 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20 20 20   changed */.    
16e10 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65    }.    }.  }.#e
16e20 6e 64 69 66 0a 0a 20 20 77 68 69 6c 65 28 20 61  ndif..  while( a
16e30 6d 74 3e 30 20 26 26 20 28 77 72 6f 74 65 20 3d  mt>0 && (wrote =
16e40 20 73 65 65 6b 41 6e 64 57 72 69 74 65 28 70 46   seekAndWrite(pF
16e50 69 6c 65 2c 20 6f 66 66 73 65 74 2c 20 70 42 75  ile, offset, pBu
16e60 66 2c 20 61 6d 74 29 29 3e 30 20 29 7b 0a 20 20  f, amt))>0 ){.  
16e70 20 20 61 6d 74 20 2d 3d 20 77 72 6f 74 65 3b 0a    amt -= wrote;.
16e80 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 77 72      offset += wr
16e90 6f 74 65 3b 0a 20 20 20 20 70 42 75 66 20 3d 20  ote;.    pBuf = 
16ea0 26 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b 77  &((char*)pBuf)[w
16eb0 72 6f 74 65 5d 3b 0a 20 20 7d 0a 20 20 53 69 6d  rote];.  }.  Sim
16ec0 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 28 20 77  ulateIOError(( w
16ed0 72 6f 74 65 3d 28 2d 31 29 2c 20 61 6d 74 3d 31  rote=(-1), amt=1
16ee0 20 29 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 44   ));.  SimulateD
16ef0 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28 28 20 77  iskfullError(( w
16f00 72 6f 74 65 3d 30 2c 20 61 6d 74 3d 31 20 29 29  rote=0, amt=1 ))
16f10 3b 0a 20 20 69 66 28 20 61 6d 74 3e 30 20 29 7b  ;.  if( amt>0 ){
16f20 0a 20 20 20 20 69 66 28 20 77 72 6f 74 65 3c 30  .    if( wrote<0
16f30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6c 61 73   ){.      /* las
16f40 74 45 72 72 6e 6f 20 73 65 74 20 62 79 20 73 65  tErrno set by se
16f50 65 6b 41 6e 64 57 72 69 74 65 20 2a 2f 0a 20 20  ekAndWrite */.  
16f60 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
16f70 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b 0a 20  E_IOERR_WRITE;. 
16f80 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
16f90 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
16fa0 20 3d 20 30 3b 20 2f 2a 20 6e 6f 74 20 61 20 73   = 0; /* not a s
16fb0 79 73 74 65 6d 20 65 72 72 6f 72 20 2a 2f 0a 20  ystem error */. 
16fc0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
16fd0 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20  TE_FULL;.    }. 
16fe0 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
16ff0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66  TE_OK;.}..#ifdef
17000 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a   SQLITE_TEST./*.
17010 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d  ** Count the num
17020 62 65 72 20 6f 66 20 66 75 6c 6c 73 79 6e 63 73  ber of fullsyncs
17030 20 61 6e 64 20 6e 6f 72 6d 61 6c 20 73 79 6e 63   and normal sync
17040 73 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64  s.  This is used
17050 20 74 6f 20 74 65 73 74 0a 2a 2a 20 74 68 61 74   to test.** that
17060 20 73 79 6e 63 73 20 61 6e 64 20 66 75 6c 6c 73   syncs and fulls
17070 79 6e 63 73 20 61 72 65 20 6f 63 63 75 72 72 69  yncs are occurri
17080 6e 67 20 61 74 20 74 68 65 20 72 69 67 68 74 20  ng at the right 
17090 74 69 6d 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  times..*/.int sq
170a0 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74  lite3_sync_count
170b0 20 3d 20 30 3b 0a 69 6e 74 20 73 71 6c 69 74 65   = 0;.int sqlite
170c0 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74  3_fullsync_count
170d0 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a   = 0;.#endif../*
170e0 0a 2a 2a 20 57 65 20 64 6f 20 6e 6f 74 20 74 72  .** We do not tr
170f0 75 73 74 20 73 79 73 74 65 6d 73 20 74 6f 20 70  ust systems to p
17100 72 6f 76 69 64 65 20 61 20 77 6f 72 6b 69 6e 67  rovide a working
17110 20 66 64 61 74 61 73 79 6e 63 28 29 2e 20 20 53   fdatasync().  S
17120 6f 6d 65 20 64 6f 2e 0a 2a 2a 20 4f 74 68 65 72  ome do..** Other
17130 73 20 64 6f 20 6e 6f 2e 20 20 54 6f 20 62 65 20  s do no.  To be 
17140 73 61 66 65 2c 20 77 65 20 77 69 6c 6c 20 73 74  safe, we will st
17150 69 63 6b 20 77 69 74 68 20 74 68 65 20 28 73 6c  ick with the (sl
17160 6f 77 65 72 29 20 66 73 79 6e 63 28 29 2e 0a 2a  ower) fsync()..*
17170 2a 20 49 66 20 79 6f 75 20 6b 6e 6f 77 20 74 68  * If you know th
17180 61 74 20 79 6f 75 72 20 73 79 73 74 65 6d 20 64  at your system d
17190 6f 65 73 20 73 75 70 70 6f 72 74 20 66 64 61 74  oes support fdat
171a0 61 73 79 6e 63 28 29 20 63 6f 72 72 65 63 74 6c  async() correctl
171b0 79 2c 0a 2a 2a 20 74 68 65 6e 20 73 69 6d 70 6c  y,.** then simpl
171c0 79 20 63 6f 6d 70 69 6c 65 20 77 69 74 68 20 2d  y compile with -
171d0 44 66 64 61 74 61 73 79 6e 63 3d 66 64 61 74 61  Dfdatasync=fdata
171e0 73 79 6e 63 0a 2a 2f 0a 23 69 66 20 21 64 65 66  sync.*/.#if !def
171f0 69 6e 65 64 28 66 64 61 74 61 73 79 6e 63 29 20  ined(fdatasync) 
17200 26 26 20 21 64 65 66 69 6e 65 64 28 5f 5f 6c 69  && !defined(__li
17210 6e 75 78 5f 5f 29 0a 23 20 64 65 66 69 6e 65 20  nux__).# define 
17220 66 64 61 74 61 73 79 6e 63 20 66 73 79 6e 63 0a  fdatasync fsync.
17230 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65  #endif../*.** De
17240 66 69 6e 65 20 48 41 56 45 5f 46 55 4c 4c 46 53  fine HAVE_FULLFS
17250 59 4e 43 20 74 6f 20 30 20 6f 72 20 31 20 64 65  YNC to 0 or 1 de
17260 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 68  pending on wheth
17270 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20 74 68 65  er or not.** the
17280 20 46 5f 46 55 4c 4c 46 53 59 4e 43 20 6d 61 63   F_FULLFSYNC mac
17290 72 6f 20 69 73 20 64 65 66 69 6e 65 64 2e 20 20  ro is defined.  
172a0 46 5f 46 55 4c 4c 46 53 59 4e 43 20 69 73 20 63  F_FULLFSYNC is c
172b0 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 6f 6e 6c 79  urrently.** only
172c0 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 4d 61   available on Ma
172d0 63 20 4f 53 20 58 2e 20 20 42 75 74 20 74 68 61  c OS X.  But tha
172e0 74 20 63 6f 75 6c 64 20 63 68 61 6e 67 65 2e 0a  t could change..
172f0 2a 2f 0a 23 69 66 64 65 66 20 46 5f 46 55 4c 4c  */.#ifdef F_FULL
17300 46 53 59 4e 43 0a 23 20 64 65 66 69 6e 65 20 48  FSYNC.# define H
17310 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 31 0a  AVE_FULLFSYNC 1.
17320 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 48  #else.# define H
17330 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 30 0a  AVE_FULLFSYNC 0.
17340 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54  #endif.../*.** T
17350 68 65 20 66 73 79 6e 63 28 29 20 73 79 73 74 65  he fsync() syste
17360 6d 20 63 61 6c 6c 20 64 6f 65 73 20 6e 6f 74 20  m call does not 
17370 77 6f 72 6b 20 61 73 20 61 64 76 65 72 74 69 73  work as advertis
17380 65 64 20 6f 6e 20 6d 61 6e 79 0a 2a 2a 20 75 6e  ed on many.** un
17390 69 78 20 73 79 73 74 65 6d 73 2e 20 20 54 68 65  ix systems.  The
173a0 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 72 6f 63 65   following proce
173b0 64 75 72 65 20 69 73 20 61 6e 20 61 74 74 65 6d  dure is an attem
173c0 70 74 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20 69 74  pt to make.** it
173d0 20 77 6f 72 6b 20 62 65 74 74 65 72 2e 0a 2a 2a   work better..**
173e0 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 4e  .** The SQLITE_N
173f0 4f 5f 53 59 4e 43 20 6d 61 63 72 6f 20 64 69 73  O_SYNC macro dis
17400 61 62 6c 65 73 20 61 6c 6c 20 66 73 79 6e 63 28  ables all fsync(
17410 29 73 2e 20 20 54 68 69 73 20 69 73 20 75 73 65  )s.  This is use
17420 66 75 6c 0a 2a 2a 20 66 6f 72 20 74 65 73 74 69  ful.** for testi
17430 6e 67 20 77 68 65 6e 20 77 65 20 77 61 6e 74 20  ng when we want 
17440 74 6f 20 72 75 6e 20 74 68 72 6f 75 67 68 20 74  to run through t
17450 68 65 20 74 65 73 74 20 73 75 69 74 65 20 71 75  he test suite qu
17460 69 63 6b 6c 79 2e 0a 2a 2a 20 59 6f 75 20 61 72  ickly..** You ar
17470 65 20 73 74 72 6f 6e 67 6c 79 20 61 64 76 69 73  e strongly advis
17480 65 64 20 2a 6e 6f 74 2a 20 74 6f 20 64 65 70 6c  ed *not* to depl
17490 6f 79 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4e  oy with SQLITE_N
174a0 4f 5f 53 59 4e 43 0a 2a 2a 20 65 6e 61 62 6c 65  O_SYNC.** enable
174b0 64 2c 20 68 6f 77 65 76 65 72 2c 20 73 69 6e 63  d, however, sinc
174c0 65 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4e 4f  e with SQLITE_NO
174d0 5f 53 59 4e 43 20 65 6e 61 62 6c 65 64 2c 20 61  _SYNC enabled, a
174e0 6e 20 4f 53 20 63 72 61 73 68 0a 2a 2a 20 6f 72  n OS crash.** or
174f0 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 77   power failure w
17500 69 6c 6c 20 6c 69 6b 65 6c 79 20 63 6f 72 72 75  ill likely corru
17510 70 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  pt the database 
17520 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69  file..**.** SQLi
17530 74 65 20 73 65 74 73 20 74 68 65 20 64 61 74 61  te sets the data
17540 4f 6e 6c 79 20 66 6c 61 67 20 69 66 20 74 68 65  Only flag if the
17550 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c   size of the fil
17560 65 20 69 73 20 75 6e 63 68 61 6e 67 65 64 2e 0a  e is unchanged..
17570 2a 2a 20 54 68 65 20 69 64 65 61 20 62 65 68 69  ** The idea behi
17580 6e 64 20 64 61 74 61 4f 6e 6c 79 20 69 73 20 74  nd dataOnly is t
17590 68 61 74 20 69 74 20 73 68 6f 75 6c 64 20 6f 6e  hat it should on
175a0 6c 79 20 77 72 69 74 65 20 74 68 65 20 66 69 6c  ly write the fil
175b0 65 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20 74 6f 20  e content.** to 
175c0 64 69 73 6b 2c 20 6e 6f 74 20 74 68 65 20 69 6e  disk, not the in
175d0 6f 64 65 2e 20 20 57 65 20 6f 6e 6c 79 20 73 65  ode.  We only se
175e0 74 20 64 61 74 61 4f 6e 6c 79 20 69 66 20 74 68  t dataOnly if th
175f0 65 20 66 69 6c 65 20 73 69 7a 65 20 69 73 20 0a  e file size is .
17600 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20 73 69 6e  ** unchanged sin
17610 63 65 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65  ce the file size
17620 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   is part of the 
17630 69 6e 6f 64 65 2e 20 20 48 6f 77 65 76 65 72 2c  inode.  However,
17640 20 0a 2a 2a 20 54 65 64 20 54 73 27 6f 20 74 65   .** Ted Ts'o te
17650 6c 6c 73 20 75 73 20 74 68 61 74 20 66 64 61 74  lls us that fdat
17660 61 73 79 6e 63 28 29 20 77 69 6c 6c 20 61 6c 73  async() will als
17670 6f 20 77 72 69 74 65 20 74 68 65 20 69 6e 6f 64  o write the inod
17680 65 20 69 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65  e if the.** file
17690 20 73 69 7a 65 20 68 61 73 20 63 68 61 6e 67 65   size has change
176a0 64 2e 20 20 54 68 65 20 6f 6e 6c 79 20 72 65 61  d.  The only rea
176b0 6c 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74  l difference bet
176c0 77 65 65 6e 20 66 64 61 74 61 73 79 6e 63 28 29  ween fdatasync()
176d0 0a 2a 2a 20 61 6e 64 20 66 73 79 6e 63 28 29 2c  .** and fsync(),
176e0 20 54 65 64 20 74 65 6c 6c 73 20 75 73 2c 20 69   Ted tells us, i
176f0 73 20 74 68 61 74 20 66 64 61 74 61 73 79 6e 63  s that fdatasync
17700 28 29 20 77 69 6c 6c 20 6e 6f 74 20 66 6c 75 73  () will not flus
17710 68 20 74 68 65 0a 2a 2a 20 69 6e 6f 64 65 20 69  h the.** inode i
17720 66 20 74 68 65 20 6d 74 69 6d 65 20 6f 72 20 6f  f the mtime or o
17730 77 6e 65 72 20 6f 72 20 6f 74 68 65 72 20 69 6e  wner or other in
17740 6f 64 65 20 61 74 74 72 69 62 75 74 65 73 20 68  ode attributes h
17750 61 76 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 20  ave changed..** 
17760 57 65 20 6f 6e 6c 79 20 63 61 72 65 20 61 62 6f  We only care abo
17770 75 74 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65  ut the file size
17780 2c 20 6e 6f 74 20 74 68 65 20 6f 74 68 65 72 20  , not the other 
17790 66 69 6c 65 20 61 74 74 72 69 62 75 74 65 73 2c  file attributes,
177a0 20 73 6f 0a 2a 2a 20 61 73 20 66 61 72 20 61 73   so.** as far as
177b0 20 53 51 4c 69 74 65 20 69 73 20 63 6f 6e 63 65   SQLite is conce
177c0 72 6e 65 64 2c 20 61 6e 20 66 64 61 74 61 73 79  rned, an fdatasy
177d0 6e 63 28 29 20 69 73 20 61 6c 77 61 79 73 20 61  nc() is always a
177e0 64 65 71 75 61 74 65 2e 0a 2a 2a 20 53 6f 2c 20  dequate..** So, 
177f0 77 65 20 61 6c 77 61 79 73 20 75 73 65 20 66 64  we always use fd
17800 61 74 61 73 79 6e 63 28 29 20 69 66 20 69 74 20  atasync() if it 
17810 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 72 65  is available, re
17820 67 61 72 64 6c 65 73 73 20 6f 66 0a 2a 2a 20 74  gardless of.** t
17830 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
17840 64 61 74 61 4f 6e 6c 79 20 66 6c 61 67 2e 0a 2a  dataOnly flag..*
17850 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 75 6c  /.static int ful
17860 6c 5f 66 73 79 6e 63 28 69 6e 74 20 66 64 2c 20  l_fsync(int fd, 
17870 69 6e 74 20 66 75 6c 6c 53 79 6e 63 2c 20 69 6e  int fullSync, in
17880 74 20 64 61 74 61 4f 6e 6c 79 29 7b 0a 20 20 69  t dataOnly){.  i
17890 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 54 68 65  nt rc;..  /* The
178a0 20 66 6f 6c 6c 6f 77 69 6e 67 20 22 69 66 64 65   following "ifde
178b0 66 2f 65 6c 69 66 2f 65 6c 73 65 2f 22 20 62 6c  f/elif/else/" bl
178c0 6f 63 6b 20 68 61 73 20 74 68 65 20 73 61 6d 65  ock has the same
178d0 20 73 74 72 75 63 74 75 72 65 20 61 73 0a 20 20   structure as.  
178e0 2a 2a 20 74 68 65 20 6f 6e 65 20 62 65 6c 6f 77  ** the one below
178f0 2e 20 49 74 20 69 73 20 72 65 70 6c 69 63 61 74  . It is replicat
17900 65 64 20 68 65 72 65 20 73 6f 6c 65 6c 79 20 74  ed here solely t
17910 6f 20 61 76 6f 69 64 20 63 6c 75 74 74 65 72 69  o avoid clutteri
17920 6e 67 20 0a 20 20 2a 2a 20 75 70 20 74 68 65 20  ng .  ** up the 
17930 72 65 61 6c 20 63 6f 64 65 20 77 69 74 68 20 74  real code with t
17940 68 65 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  he UNUSED_PARAME
17950 54 45 52 28 29 20 6d 61 63 72 6f 73 2e 0a 20 20  TER() macros..  
17960 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
17970 5f 4e 4f 5f 53 59 4e 43 0a 20 20 55 4e 55 53 45  _NO_SYNC.  UNUSE
17980 44 5f 50 41 52 41 4d 45 54 45 52 28 66 64 29 3b  D_PARAMETER(fd);
17990 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
179a0 54 45 52 28 66 75 6c 6c 53 79 6e 63 29 3b 0a 20  TER(fullSync);. 
179b0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
179c0 52 28 64 61 74 61 4f 6e 6c 79 29 3b 0a 23 65 6c  R(dataOnly);.#el
179d0 69 66 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e  if HAVE_FULLFSYN
179e0 43 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  C.  UNUSED_PARAM
179f0 45 54 45 52 28 64 61 74 61 4f 6e 6c 79 29 3b 0a  ETER(dataOnly);.
17a00 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50  #else.  UNUSED_P
17a10 41 52 41 4d 45 54 45 52 28 66 75 6c 6c 53 79 6e  ARAMETER(fullSyn
17a20 63 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  c);.  UNUSED_PAR
17a30 41 4d 45 54 45 52 28 64 61 74 61 4f 6e 6c 79 29  AMETER(dataOnly)
17a40 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52  ;.#endif..  /* R
17a50 65 63 6f 72 64 20 74 68 65 20 6e 75 6d 62 65 72  ecord the number
17a60 20 6f 66 20 74 69 6d 65 73 20 74 68 61 74 20 77   of times that w
17a70 65 20 64 6f 20 61 20 6e 6f 72 6d 61 6c 20 66 73  e do a normal fs
17a80 79 6e 63 28 29 20 61 6e 64 20 0a 20 20 2a 2a 20  ync() and .  ** 
17a90 46 55 4c 4c 53 59 4e 43 2e 20 20 54 68 69 73 20  FULLSYNC.  This 
17aa0 69 73 20 75 73 65 64 20 64 75 72 69 6e 67 20 74  is used during t
17ab0 65 73 74 69 6e 67 20 74 6f 20 76 65 72 69 66 79  esting to verify
17ac0 20 74 68 61 74 20 74 68 69 73 20 70 72 6f 63 65   that this proce
17ad0 64 75 72 65 0a 20 20 2a 2a 20 67 65 74 73 20 63  dure.  ** gets c
17ae0 61 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 63  alled with the c
17af0 6f 72 72 65 63 74 20 61 72 67 75 6d 65 6e 74 73  orrect arguments
17b00 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ..  */.#ifdef SQ
17b10 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 66 28 20  LITE_TEST.  if( 
17b20 66 75 6c 6c 53 79 6e 63 20 29 20 73 71 6c 69 74  fullSync ) sqlit
17b30 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e  e3_fullsync_coun
17b40 74 2b 2b 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  t++;.  sqlite3_s
17b50 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e  ync_count++;.#en
17b60 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20  dif..  /* If we 
17b70 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 74 68  compiled with th
17b80 65 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43  e SQLITE_NO_SYNC
17b90 20 66 6c 61 67 2c 20 74 68 65 6e 20 73 79 6e 63   flag, then sync
17ba0 69 6e 67 20 69 73 20 61 0a 20 20 2a 2a 20 6e 6f  ing is a.  ** no
17bb0 2d 6f 70 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20  -op.  */.#ifdef 
17bc0 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20  SQLITE_NO_SYNC. 
17bd0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
17be0 0a 23 65 6c 69 66 20 48 41 56 45 5f 46 55 4c 4c  .#elif HAVE_FULL
17bf0 46 53 59 4e 43 0a 20 20 69 66 28 20 66 75 6c 6c  FSYNC.  if( full
17c00 53 79 6e 63 20 29 7b 0a 20 20 20 20 72 63 20 3d  Sync ){.    rc =
17c10 20 66 63 6e 74 6c 28 66 64 2c 20 46 5f 46 55 4c   fcntl(fd, F_FUL
17c20 4c 46 53 59 4e 43 2c 20 30 29 3b 0a 20 20 7d 65  LFSYNC, 0);.  }e
17c30 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 31 3b  lse{.    rc = 1;
17c40 0a 20 20 7d 0a 20 20 2f 2a 20 49 66 20 74 68 65  .  }.  /* If the
17c50 20 46 55 4c 4c 46 53 59 4e 43 20 66 61 69 6c 65   FULLFSYNC faile
17c60 64 2c 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20  d, fall back to 
17c70 61 74 74 65 6d 70 74 69 6e 67 20 61 6e 20 66 73  attempting an fs
17c80 79 6e 63 28 29 2e 0a 20 20 2a 2a 20 49 74 20 73  ync()..  ** It s
17c90 68 6f 75 6c 64 6e 27 74 20 62 65 20 70 6f 73 73  houldn't be poss
17ca0 69 62 6c 65 20 66 6f 72 20 66 75 6c 6c 66 73 79  ible for fullfsy
17cb0 6e 63 20 74 6f 20 66 61 69 6c 20 6f 6e 20 74 68  nc to fail on th
17cc0 65 20 6c 6f 63 61 6c 20 0a 20 20 2a 2a 20 66 69  e local .  ** fi
17cd0 6c 65 20 73 79 73 74 65 6d 20 28 6f 6e 20 4f 53  le system (on OS
17ce0 58 29 2c 20 73 6f 20 66 61 69 6c 75 72 65 20 69  X), so failure i
17cf0 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 46 55  ndicates that FU
17d00 4c 4c 46 53 59 4e 43 0a 20 20 2a 2a 20 69 73 6e  LLFSYNC.  ** isn
17d10 27 74 20 73 75 70 70 6f 72 74 65 64 20 66 6f 72  't supported for
17d20 20 74 68 69 73 20 66 69 6c 65 20 73 79 73 74 65   this file syste
17d30 6d 2e 20 53 6f 2c 20 61 74 74 65 6d 70 74 20 61  m. So, attempt a
17d40 6e 20 66 73 79 6e 63 20 0a 20 20 2a 2a 20 61 6e  n fsync .  ** an
17d50 64 20 28 66 6f 72 20 6e 6f 77 29 20 69 67 6e 6f  d (for now) igno
17d60 72 65 20 74 68 65 20 6f 76 65 72 68 65 61 64 20  re the overhead 
17d70 6f 66 20 61 20 73 75 70 65 72 66 6c 75 6f 75 73  of a superfluous
17d80 20 66 63 6e 74 6c 20 63 61 6c 6c 2e 20 20 0a 20   fcntl call.  . 
17d90 20 2a 2a 20 49 74 27 64 20 62 65 20 62 65 74 74   ** It'd be bett
17da0 65 72 20 74 6f 20 64 65 74 65 63 74 20 66 75 6c  er to detect ful
17db0 6c 66 73 79 6e 63 20 73 75 70 70 6f 72 74 20 6f  lfsync support o
17dc0 6e 63 65 20 61 6e 64 20 61 76 6f 69 64 20 0a 20  nce and avoid . 
17dd0 20 2a 2a 20 74 68 65 20 66 63 6e 74 6c 20 63 61   ** the fcntl ca
17de0 6c 6c 20 65 76 65 72 79 20 74 69 6d 65 20 73 79  ll every time sy
17df0 6e 63 20 69 73 20 63 61 6c 6c 65 64 2e 0a 20 20  nc is called..  
17e00 2a 2f 0a 20 20 69 66 28 20 72 63 20 29 20 72 63  */.  if( rc ) rc
17e10 20 3d 20 66 73 79 6e 63 28 66 64 29 3b 0a 0a 23   = fsync(fd);..#
17e20 65 6c 73 65 20 0a 20 20 72 63 20 3d 20 66 64 61  else .  rc = fda
17e30 74 61 73 79 6e 63 28 66 64 29 3b 0a 23 69 66 20  tasync(fd);.#if 
17e40 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 69 66 28  OS_VXWORKS.  if(
17e50 20 72 63 3d 3d 2d 31 20 26 26 20 65 72 72 6e 6f   rc==-1 && errno
17e60 3d 3d 45 4e 4f 54 53 55 50 20 29 7b 0a 20 20 20  ==ENOTSUP ){.   
17e70 20 72 63 20 3d 20 66 73 79 6e 63 28 66 64 29 3b   rc = fsync(fd);
17e80 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 4f  .  }.#endif /* O
17e90 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 23 65 6e  S_VXWORKS */.#en
17ea0 64 69 66 20 2f 2a 20 69 66 64 65 66 20 53 51 4c  dif /* ifdef SQL
17eb0 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 65 6c 69 66  ITE_NO_SYNC elif
17ec0 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20   HAVE_FULLFSYNC 
17ed0 2a 2f 0a 0a 20 20 69 66 28 20 4f 53 5f 56 58 57  */..  if( OS_VXW
17ee0 4f 52 4b 53 20 26 26 20 72 63 21 3d 20 2d 31 20  ORKS && rc!= -1 
17ef0 29 7b 0a 20 20 20 20 72 63 20 3d 20 30 3b 0a 20  ){.    rc = 0;. 
17f00 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
17f10 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75  }../*.** Make su
17f20 72 65 20 61 6c 6c 20 77 72 69 74 65 73 20 74 6f  re all writes to
17f30 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 66 69   a particular fi
17f40 6c 65 20 61 72 65 20 63 6f 6d 6d 69 74 74 65 64  le are committed
17f50 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20   to disk..**.** 
17f60 49 66 20 64 61 74 61 4f 6e 6c 79 3d 3d 30 20 74  If dataOnly==0 t
17f70 68 65 6e 20 62 6f 74 68 20 74 68 65 20 66 69 6c  hen both the fil
17f80 65 20 69 74 73 65 6c 66 20 61 6e 64 20 69 74 73  e itself and its
17f90 20 6d 65 74 61 64 61 74 61 20 28 66 69 6c 65 0a   metadata (file.
17fa0 2a 2a 20 73 69 7a 65 2c 20 61 63 63 65 73 73 20  ** size, access 
17fb0 74 69 6d 65 2c 20 65 74 63 29 20 61 72 65 20 73  time, etc) are s
17fc0 79 6e 63 65 64 2e 20 20 49 66 20 64 61 74 61 4f  ynced.  If dataO
17fd0 6e 6c 79 21 3d 30 20 74 68 65 6e 20 6f 6e 6c 79  nly!=0 then only
17fe0 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 64 61 74   the.** file dat
17ff0 61 20 69 73 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a  a is synced..**.
18000 2a 2a 20 55 6e 64 65 72 20 55 6e 69 78 2c 20 61  ** Under Unix, a
18010 6c 73 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68  lso make sure th
18020 61 74 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  at the directory
18030 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 66   entry for the f
18040 69 6c 65 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20  ile.** has been 
18050 63 72 65 61 74 65 64 20 62 79 20 66 73 79 6e 63  created by fsync
18060 2d 69 6e 67 20 74 68 65 20 64 69 72 65 63 74 6f  -ing the directo
18070 72 79 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ry that contains
18080 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 20 49 66   the file..** If
18090 20 77 65 20 64 6f 20 6e 6f 74 20 64 6f 20 74 68   we do not do th
180a0 69 73 20 61 6e 64 20 77 65 20 65 6e 63 6f 75 6e  is and we encoun
180b0 74 65 72 20 61 20 70 6f 77 65 72 20 66 61 69 6c  ter a power fail
180c0 75 72 65 2c 20 74 68 65 20 64 69 72 65 63 74 6f  ure, the directo
180d0 72 79 0a 2a 2a 20 65 6e 74 72 79 20 66 6f 72 20  ry.** entry for 
180e0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68  the journal migh
180f0 74 20 6e 6f 74 20 65 78 69 73 74 20 61 66 74 65  t not exist afte
18100 72 20 77 65 20 72 65 62 6f 6f 74 2e 20 20 54 68  r we reboot.  Th
18110 65 20 6e 65 78 74 0a 2a 2a 20 53 51 4c 69 74 65  e next.** SQLite
18120 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 66   to access the f
18130 69 6c 65 20 77 69 6c 6c 20 6e 6f 74 20 6b 6e 6f  ile will not kno
18140 77 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e  w that the journ
18150 61 6c 20 65 78 69 73 74 73 20 28 62 65 63 61 75  al exists (becau
18160 73 65 0a 2a 2a 20 74 68 65 20 64 69 72 65 63 74  se.** the direct
18170 6f 72 79 20 65 6e 74 72 79 20 66 6f 72 20 74 68  ory entry for th
18180 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 6e 65  e journal was ne
18190 76 65 72 20 63 72 65 61 74 65 64 29 20 61 6e 64  ver created) and
181a0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
181b0 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 72 6f 6c  .** will not rol
181c0 6c 20 62 61 63 6b 20 2d 20 70 6f 73 73 69 62 6c  l back - possibl
181d0 79 20 6c 65 61 64 69 6e 67 20 74 6f 20 64 61 74  y leading to dat
181e0 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
181f0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
18200 75 6e 69 78 53 79 6e 63 28 73 71 6c 69 74 65 33  unixSync(sqlite3
18210 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 66  _file *id, int f
18220 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b  lags){.  int rc;
18230 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
18240 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
18250 69 64 3b 0a 0a 20 20 69 6e 74 20 69 73 44 61 74  id;..  int isDat
18260 61 4f 6e 6c 79 20 3d 20 28 66 6c 61 67 73 26 53  aOnly = (flags&S
18270 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f  QLITE_SYNC_DATAO
18280 4e 4c 59 29 3b 0a 20 20 69 6e 74 20 69 73 46 75  NLY);.  int isFu
18290 6c 6c 73 79 6e 63 20 3d 20 28 66 6c 61 67 73 26  llsync = (flags&
182a0 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59  0x0F)==SQLITE_SY
182b0 4e 43 5f 46 55 4c 4c 3b 0a 0a 20 20 2f 2a 20 43  NC_FULL;..  /* C
182c0 68 65 63 6b 20 74 68 61 74 20 6f 6e 65 20 6f 66  heck that one of
182d0 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52   SQLITE_SYNC_NOR
182e0 4d 41 4c 20 6f 72 20 46 55 4c 4c 20 77 61 73 20  MAL or FULL was 
182f0 70 61 73 73 65 64 20 2a 2f 0a 20 20 61 73 73 65  passed */.  asse
18300 72 74 28 28 66 6c 61 67 73 26 30 78 30 46 29 3d  rt((flags&0x0F)=
18310 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52  =SQLITE_SYNC_NOR
18320 4d 41 4c 0a 20 20 20 20 20 20 7c 7c 20 28 66 6c  MAL.      || (fl
18330 61 67 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54  ags&0x0F)==SQLIT
18340 45 5f 53 59 4e 43 5f 46 55 4c 4c 0a 20 20 29 3b  E_SYNC_FULL.  );
18350 0a 0a 20 20 2f 2a 20 55 6e 69 78 20 63 61 6e 6e  ..  /* Unix cann
18360 6f 74 2c 20 62 75 74 20 73 6f 6d 65 20 73 79 73  ot, but some sys
18370 74 65 6d 73 20 6d 61 79 20 72 65 74 75 72 6e 20  tems may return 
18380 53 51 4c 49 54 45 5f 46 55 4c 4c 20 66 72 6f 6d  SQLITE_FULL from
18390 20 68 65 72 65 2e 20 54 68 69 73 0a 20 20 2a 2a   here. This.  **
183a0 20 6c 69 6e 65 20 69 73 20 74 6f 20 74 65 73 74   line is to test
183b0 20 74 68 61 74 20 64 6f 69 6e 67 20 73 6f 20 64   that doing so d
183c0 6f 65 73 20 6e 6f 74 20 63 61 75 73 65 20 61 6e  oes not cause an
183d0 79 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 2a 2f  y problems..  */
183e0 0a 20 20 53 69 6d 75 6c 61 74 65 44 69 73 6b 66  .  SimulateDiskf
183f0 75 6c 6c 45 72 72 6f 72 28 20 72 65 74 75 72 6e  ullError( return
18400 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 3b 0a   SQLITE_FULL );.
18410 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
18420 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 32 28 22   );.  OSTRACE2("
18430 53 59 4e 43 20 20 20 20 25 2d 33 64 5c 6e 22 2c  SYNC    %-3d\n",
18440 20 70 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 72 63   pFile->h);.  rc
18450 20 3d 20 66 75 6c 6c 5f 66 73 79 6e 63 28 70 46   = full_fsync(pF
18460 69 6c 65 2d 3e 68 2c 20 69 73 46 75 6c 6c 73 79  ile->h, isFullsy
18470 6e 63 2c 20 69 73 44 61 74 61 4f 6e 6c 79 29 3b  nc, isDataOnly);
18480 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
18490 6f 72 28 20 72 63 3d 31 20 29 3b 0a 20 20 69 66  or( rc=1 );.  if
184a0 28 20 72 63 20 29 7b 0a 20 20 20 20 70 46 69 6c  ( rc ){.    pFil
184b0 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65  e->lastErrno = e
184c0 72 72 6e 6f 3b 0a 20 20 20 20 72 65 74 75 72 6e  rrno;.    return
184d0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53   SQLITE_IOERR_FS
184e0 59 4e 43 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  YNC;.  }.  if( p
184f0 46 69 6c 65 2d 3e 64 69 72 66 64 3e 3d 30 20 29  File->dirfd>=0 )
18500 7b 0a 20 20 20 20 69 6e 74 20 65 72 72 3b 0a 20  {.    int err;. 
18510 20 20 20 4f 53 54 52 41 43 45 34 28 22 44 49 52     OSTRACE4("DIR
18520 53 59 4e 43 20 25 2d 33 64 20 28 68 61 76 65 5f  SYNC %-3d (have_
18530 66 75 6c 6c 66 73 79 6e 63 3d 25 64 20 66 75 6c  fullfsync=%d ful
18540 6c 73 79 6e 63 3d 25 64 29 5c 6e 22 2c 20 70 46  lsync=%d)\n", pF
18550 69 6c 65 2d 3e 64 69 72 66 64 2c 0a 20 20 20 20  ile->dirfd,.    
18560 20 20 20 20 20 20 20 20 48 41 56 45 5f 46 55 4c          HAVE_FUL
18570 4c 46 53 59 4e 43 2c 20 69 73 46 75 6c 6c 73 79  LFSYNC, isFullsy
18580 6e 63 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  nc);.#ifndef SQL
18590 49 54 45 5f 44 49 53 41 42 4c 45 5f 44 49 52 53  ITE_DISABLE_DIRS
185a0 59 4e 43 0a 20 20 20 20 2f 2a 20 54 68 65 20 64  YNC.    /* The d
185b0 69 72 65 63 74 6f 72 79 20 73 79 6e 63 20 69 73  irectory sync is
185c0 20 6f 6e 6c 79 20 61 74 74 65 6d 70 74 65 64 20   only attempted 
185d0 69 66 20 66 75 6c 6c 5f 66 73 79 6e 63 20 69 73  if full_fsync is
185e0 0a 20 20 20 20 2a 2a 20 74 75 72 6e 65 64 20 6f  .    ** turned o
185f0 66 66 20 6f 72 20 75 6e 61 76 61 69 6c 61 62 6c  ff or unavailabl
18600 65 2e 20 20 49 66 20 61 20 66 75 6c 6c 5f 66 73  e.  If a full_fs
18610 79 6e 63 20 6f 63 63 75 72 72 65 64 20 61 62 6f  ync occurred abo
18620 76 65 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20  ve,.    ** then 
18630 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 73 79  the directory sy
18640 6e 63 20 69 73 20 73 75 70 65 72 66 6c 75 6f 75  nc is superfluou
18650 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  s..    */.    if
18660 28 20 28 21 48 41 56 45 5f 46 55 4c 4c 46 53 59  ( (!HAVE_FULLFSY
18670 4e 43 20 7c 7c 20 21 69 73 46 75 6c 6c 73 79 6e  NC || !isFullsyn
18680 63 29 20 26 26 20 66 75 6c 6c 5f 66 73 79 6e 63  c) && full_fsync
18690 28 70 46 69 6c 65 2d 3e 64 69 72 66 64 2c 30 2c  (pFile->dirfd,0,
186a0 30 29 20 29 7b 0a 20 20 20 20 20 20 20 2f 2a 0a  0) ){.       /*.
186b0 20 20 20 20 20 20 20 2a 2a 20 57 65 20 68 61 76         ** We hav
186c0 65 20 72 65 63 65 69 76 65 64 20 6d 75 6c 74 69  e received multi
186d0 70 6c 65 20 72 65 70 6f 72 74 73 20 6f 66 20 66  ple reports of f
186e0 73 79 6e 63 28 29 20 72 65 74 75 72 6e 69 6e 67  sync() returning
186f0 0a 20 20 20 20 20 20 20 2a 2a 20 65 72 72 6f 72  .       ** error
18700 73 20 77 68 65 6e 20 61 70 70 6c 69 65 64 20 74  s when applied t
18710 6f 20 64 69 72 65 63 74 6f 72 69 65 73 20 6f 6e  o directories on
18720 20 63 65 72 74 61 69 6e 20 66 69 6c 65 20 73 79   certain file sy
18730 73 74 65 6d 73 2e 0a 20 20 20 20 20 20 20 2a 2a  stems..       **
18740 20 41 20 66 61 69 6c 65 64 20 64 69 72 65 63 74   A failed direct
18750 6f 72 79 20 73 79 6e 63 20 69 73 20 6e 6f 74 20  ory sync is not 
18760 61 20 62 69 67 20 64 65 61 6c 2e 20 20 53 6f 20  a big deal.  So 
18770 69 74 20 73 65 65 6d 73 0a 20 20 20 20 20 20 20  it seems.       
18780 2a 2a 20 62 65 74 74 65 72 20 74 6f 20 69 67 6e  ** better to ign
18790 6f 72 65 20 74 68 65 20 65 72 72 6f 72 2e 20 20  ore the error.  
187a0 54 69 63 6b 65 74 20 23 31 36 35 37 0a 20 20 20  Ticket #1657.   
187b0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 2f 2a      */.       /*
187c0 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
187d0 6f 20 3d 20 65 72 72 6e 6f 3b 20 2a 2f 0a 20 20  o = errno; */.  
187e0 20 20 20 20 20 2f 2a 20 72 65 74 75 72 6e 20 53       /* return S
187f0 51 4c 49 54 45 5f 49 4f 45 52 52 3b 20 2a 2f 0a  QLITE_IOERR; */.
18800 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
18810 20 65 72 72 20 3d 20 63 6c 6f 73 65 28 70 46 69   err = close(pFi
18820 6c 65 2d 3e 64 69 72 66 64 29 3b 20 2f 2a 20 4f  le->dirfd); /* O
18830 6e 6c 79 20 6e 65 65 64 20 74 6f 20 73 79 6e 63  nly need to sync
18840 20 6f 6e 63 65 2c 20 73 6f 20 63 6c 6f 73 65 20   once, so close 
18850 74 68 65 20 2a 2f 0a 20 20 20 20 69 66 28 20 65  the */.    if( e
18860 72 72 3d 3d 30 20 29 7b 20 20 20 20 20 20 20 20  rr==0 ){        
18870 20 20 20 20 20 20 2f 2a 20 64 69 72 65 63 74 6f        /* directo
18880 72 79 20 77 68 65 6e 20 77 65 20 61 72 65 20 64  ry when we are d
18890 6f 6e 65 20 2a 2f 0a 20 20 20 20 20 20 70 46 69  one */.      pFi
188a0 6c 65 2d 3e 64 69 72 66 64 20 3d 20 2d 31 3b 0a  le->dirfd = -1;.
188b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
188c0 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
188d0 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
188e0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
188f0 52 52 5f 44 49 52 5f 43 4c 4f 53 45 3b 0a 20 20  RR_DIR_CLOSE;.  
18900 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
18910 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72   rc;.}../*.** Tr
18920 75 6e 63 61 74 65 20 61 6e 20 6f 70 65 6e 20 66  uncate an open f
18930 69 6c 65 20 74 6f 20 61 20 73 70 65 63 69 66 69  ile to a specifi
18940 65 64 20 73 69 7a 65 0a 2a 2f 0a 73 74 61 74 69  ed size.*/.stati
18950 63 20 69 6e 74 20 75 6e 69 78 54 72 75 6e 63 61  c int unixTrunca
18960 74 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  te(sqlite3_file 
18970 2a 69 64 2c 20 69 36 34 20 6e 42 79 74 65 29 7b  *id, i64 nByte){
18980 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73  .  int rc;.  ass
18990 65 72 74 28 20 69 64 20 29 3b 0a 20 20 53 69 6d  ert( id );.  Sim
189a0 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65  ulateIOError( re
189b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
189c0 52 5f 54 52 55 4e 43 41 54 45 20 29 3b 0a 20 20  R_TRUNCATE );.  
189d0 72 63 20 3d 20 66 74 72 75 6e 63 61 74 65 28 28  rc = ftruncate((
189e0 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e  (unixFile*)id)->
189f0 68 2c 20 28 6f 66 66 5f 74 29 6e 42 79 74 65 29  h, (off_t)nByte)
18a00 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
18a10 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64    ((unixFile*)id
18a20 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65  )->lastErrno = e
18a30 72 72 6e 6f 3b 0a 20 20 20 20 72 65 74 75 72 6e  rrno;.    return
18a40 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52   SQLITE_IOERR_TR
18a50 55 4e 43 41 54 45 3b 0a 20 20 7d 65 6c 73 65 7b  UNCATE;.  }else{
18a60 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
18a70 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  TE_OK;.  }.}../*
18a80 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68  .** Determine th
18a90 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f  e current size o
18aa0 66 20 61 20 66 69 6c 65 20 69 6e 20 62 79 74 65  f a file in byte
18ab0 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  s.*/.static int 
18ac0 75 6e 69 78 46 69 6c 65 53 69 7a 65 28 73 71 6c  unixFileSize(sql
18ad0 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
18ae0 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20 69 6e  64 *pSize){.  in
18af0 74 20 72 63 3b 0a 20 20 73 74 72 75 63 74 20 73  t rc;.  struct s
18b00 74 61 74 20 62 75 66 3b 0a 20 20 61 73 73 65 72  tat buf;.  asser
18b10 74 28 20 69 64 20 29 3b 0a 20 20 72 63 20 3d 20  t( id );.  rc = 
18b20 66 73 74 61 74 28 28 28 75 6e 69 78 46 69 6c 65  fstat(((unixFile
18b30 2a 29 69 64 29 2d 3e 68 2c 20 26 62 75 66 29 3b  *)id)->h, &buf);
18b40 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
18b50 6f 72 28 20 72 63 3d 31 20 29 3b 0a 20 20 69 66  or( rc=1 );.  if
18b60 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 28  ( rc!=0 ){.    (
18b70 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e  (unixFile*)id)->
18b80 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  lastErrno = errn
18b90 6f 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  o;.    return SQ
18ba0 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54  LITE_IOERR_FSTAT
18bb0 3b 0a 20 20 7d 0a 20 20 2a 70 53 69 7a 65 20 3d  ;.  }.  *pSize =
18bc0 20 62 75 66 2e 73 74 5f 73 69 7a 65 3b 0a 0a 20   buf.st_size;.. 
18bd0 20 2f 2a 20 57 68 65 6e 20 6f 70 65 6e 69 6e 67   /* When opening
18be0 20 61 20 7a 65 72 6f 2d 73 69 7a 65 20 64 61 74   a zero-size dat
18bf0 61 62 61 73 65 2c 20 74 68 65 20 66 69 6e 64 4c  abase, the findL
18c00 6f 63 6b 49 6e 66 6f 28 29 20 70 72 6f 63 65 64  ockInfo() proced
18c10 75 72 65 0a 20 20 2a 2a 20 77 72 69 74 65 73 20  ure.  ** writes 
18c20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20 69 6e  a single byte in
18c30 74 6f 20 74 68 61 74 20 66 69 6c 65 20 69 6e 20  to that file in 
18c40 6f 72 64 65 72 20 74 6f 20 77 6f 72 6b 20 61 72  order to work ar
18c50 6f 75 6e 64 20 61 20 62 75 67 0a 20 20 2a 2a 20  ound a bug.  ** 
18c60 69 6e 20 74 68 65 20 4f 53 2d 58 20 6d 73 64 6f  in the OS-X msdo
18c70 73 20 66 69 6c 65 73 79 73 74 65 6d 2e 20 20 49  s filesystem.  I
18c80 6e 20 6f 72 64 65 72 20 74 6f 20 61 76 6f 69 64  n order to avoid
18c90 20 70 72 6f 62 6c 65 6d 73 20 77 69 74 68 20 75   problems with u
18ca0 70 70 65 72 0a 20 20 2a 2a 20 6c 61 79 65 72 73  pper.  ** layers
18cb0 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65 70  , we need to rep
18cc0 6f 72 74 20 74 68 69 73 20 66 69 6c 65 20 73 69  ort this file si
18cd0 7a 65 20 61 73 20 7a 65 72 6f 20 65 76 65 6e 20  ze as zero even 
18ce0 74 68 6f 75 67 68 20 69 74 20 69 73 0a 20 20 2a  though it is.  *
18cf0 2a 20 72 65 61 6c 6c 79 20 31 2e 20 20 20 54 69  * really 1.   Ti
18d00 63 6b 65 74 20 23 33 32 36 30 2e 0a 20 20 2a 2f  cket #3260..  */
18d10 0a 20 20 69 66 28 20 2a 70 53 69 7a 65 3d 3d 31  .  if( *pSize==1
18d20 20 29 20 2a 70 53 69 7a 65 20 3d 20 30 3b 0a 0a   ) *pSize = 0;..
18d30 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
18d40 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49  _OK;.}..#if SQLI
18d50 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
18d60 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e  G_STYLE && defin
18d70 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 2f 2a  ed(__APPLE__)./*
18d80 0a 2a 2a 20 48 61 6e 64 6c 65 72 20 66 6f 72 20  .** Handler for 
18d90 70 72 6f 78 79 2d 6c 6f 63 6b 69 6e 67 20 66 69  proxy-locking fi
18da0 6c 65 2d 63 6f 6e 74 72 6f 6c 20 76 65 72 62 73  le-control verbs
18db0 2e 20 20 44 65 66 69 6e 65 64 20 62 65 6c 6f 77  .  Defined below
18dc0 20 69 6e 20 74 68 65 0a 2a 2a 20 70 72 6f 78 79   in the.** proxy
18dd0 69 6e 67 20 6c 6f 63 6b 69 6e 67 20 64 69 76 69  ing locking divi
18de0 73 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  sion..*/.static 
18df0 69 6e 74 20 70 72 6f 78 79 46 69 6c 65 43 6f 6e  int proxyFileCon
18e00 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c  trol(sqlite3_fil
18e10 65 2a 2c 69 6e 74 2c 76 6f 69 64 2a 29 3b 0a 23  e*,int,void*);.#
18e20 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6e  endif.../*.** In
18e30 66 6f 72 6d 61 74 69 6f 6e 20 61 6e 64 20 63 6f  formation and co
18e40 6e 74 72 6f 6c 20 6f 66 20 61 6e 20 6f 70 65 6e  ntrol of an open
18e50 20 66 69 6c 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f   file handle..*/
18e60 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
18e70 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 73 71 6c 69  FileControl(sqli
18e80 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
18e90 74 20 6f 70 2c 20 76 6f 69 64 20 2a 70 41 72 67  t op, void *pArg
18ea0 29 7b 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20  ){.  switch( op 
18eb0 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  ){.    case SQLI
18ec0 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b 53 54 41  TE_FCNTL_LOCKSTA
18ed0 54 45 3a 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e  TE: {.      *(in
18ee0 74 2a 29 70 41 72 67 20 3d 20 28 28 75 6e 69 78  t*)pArg = ((unix
18ef0 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 6f 63 6b 74  File*)id)->lockt
18f00 79 70 65 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ype;.      retur
18f10 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
18f20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
18f30 54 45 5f 4c 41 53 54 5f 45 52 52 4e 4f 3a 20 7b  TE_LAST_ERRNO: {
18f40 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a 29 70 41  .      *(int*)pA
18f50 72 67 20 3d 20 28 28 75 6e 69 78 46 69 6c 65 2a  rg = ((unixFile*
18f60 29 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b  )id)->lastErrno;
18f70 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
18f80 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 23  LITE_OK;.    }.#
18f90 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
18fa0 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 63    /* The pager c
18fb0 61 6c 6c 73 20 74 68 69 73 20 6d 65 74 68 6f 64  alls this method
18fc0 20 74 6f 20 73 69 67 6e 61 6c 20 74 68 61 74 20   to signal that 
18fd0 69 74 20 68 61 73 20 64 6f 6e 65 0a 20 20 20 20  it has done.    
18fe0 2a 2a 20 61 20 72 6f 6c 6c 62 61 63 6b 20 61 6e  ** a rollback an
18ff0 64 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62  d that the datab
19000 61 73 65 20 69 73 20 74 68 65 72 65 66 6f 72 65  ase is therefore
19010 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 0a 20   unchanged and. 
19020 20 20 20 2a 2a 20 69 74 20 68 65 6e 63 65 20 69     ** it hence i
19030 74 20 69 73 20 4f 4b 20 66 6f 72 20 74 68 65 20  t is OK for the 
19040 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 68 61 6e  transaction chan
19050 67 65 20 63 6f 75 6e 74 65 72 20 74 6f 20 62 65  ge counter to be
19060 0a 20 20 20 20 2a 2a 20 75 6e 63 68 61 6e 67 65  .    ** unchange
19070 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  d..    */.    ca
19080 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
19090 44 42 5f 55 4e 43 48 41 4e 47 45 44 3a 20 7b 0a  DB_UNCHANGED: {.
190a0 20 20 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65        ((unixFile
190b0 2a 29 69 64 29 2d 3e 64 62 55 70 64 61 74 65 20  *)id)->dbUpdate 
190c0 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72  = 0;.      retur
190d0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
190e0 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51   }.#endif.#if SQ
190f0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
19100 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66  ING_STYLE && def
19110 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a  ined(__APPLE__).
19120 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
19130 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c  SET_LOCKPROXYFIL
19140 45 3a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  E:.    case SQLI
19150 54 45 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f 58 59  TE_GET_LOCKPROXY
19160 46 49 4c 45 3a 20 7b 0a 20 20 20 20 20 20 72 65  FILE: {.      re
19170 74 75 72 6e 20 70 72 6f 78 79 46 69 6c 65 43 6f  turn proxyFileCo
19180 6e 74 72 6f 6c 28 69 64 2c 6f 70 2c 70 41 72 67  ntrol(id,op,pArg
19190 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20  );.    }.#endif 
191a0 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
191b0 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26  _LOCKING_STYLE &
191c0 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  & defined(__APPL
191d0 45 5f 5f 29 20 2a 2f 0a 20 20 7d 0a 20 20 72 65  E__) */.  }.  re
191e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
191f0 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  R;.}../*.** Retu
19200 72 6e 20 74 68 65 20 73 65 63 74 6f 72 20 73 69  rn the sector si
19210 7a 65 20 69 6e 20 62 79 74 65 73 20 6f 66 20 74  ze in bytes of t
19220 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 62 6c  he underlying bl
19230 6f 63 6b 20 64 65 76 69 63 65 20 66 6f 72 0a 2a  ock device for.*
19240 2a 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  * the specified 
19250 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20 61 6c  file. This is al
19260 6d 6f 73 74 20 61 6c 77 61 79 73 20 35 31 32 20  most always 512 
19270 62 79 74 65 73 2c 20 62 75 74 20 6d 61 79 20 62  bytes, but may b
19280 65 0a 2a 2a 20 6c 61 72 67 65 72 20 66 6f 72 20  e.** larger for 
19290 73 6f 6d 65 20 64 65 76 69 63 65 73 2e 0a 2a 2a  some devices..**
192a0 0a 2a 2a 20 53 51 4c 69 74 65 20 63 6f 64 65 20  .** SQLite code 
192b0 61 73 73 75 6d 65 73 20 74 68 69 73 20 66 75 6e  assumes this fun
192c0 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 66 61 69  ction cannot fai
192d0 6c 2e 20 49 74 20 61 6c 73 6f 20 61 73 73 75 6d  l. It also assum
192e0 65 73 20 74 68 61 74 0a 2a 2a 20 69 66 20 74 77  es that.** if tw
192f0 6f 20 66 69 6c 65 73 20 61 72 65 20 63 72 65 61  o files are crea
19300 74 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20  ted in the same 
19310 66 69 6c 65 2d 73 79 73 74 65 6d 20 64 69 72 65  file-system dire
19320 63 74 6f 72 79 20 28 69 2e 65 2e 0a 2a 2a 20 61  ctory (i.e..** a
19330 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 69 74   database and it
19340 73 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20  s journal file) 
19350 74 68 61 74 20 74 68 65 20 73 65 63 74 6f 72 20  that the sector 
19360 73 69 7a 65 20 77 69 6c 6c 20 62 65 20 74 68 65  size will be the
19370 0a 2a 2a 20 73 61 6d 65 20 66 6f 72 20 62 6f 74  .** same for bot
19380 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  h..*/.static int
19390 20 75 6e 69 78 53 65 63 74 6f 72 53 69 7a 65 28   unixSectorSize(
193a0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f  sqlite3_file *No
193b0 74 55 73 65 64 29 7b 0a 20 20 55 4e 55 53 45 44  tUsed){.  UNUSED
193c0 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
193d0 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ed);.  return SQ
193e0 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 53 45 43  LITE_DEFAULT_SEC
193f0 54 4f 52 5f 53 49 5a 45 3b 0a 7d 0a 0a 2f 2a 0a  TOR_SIZE;.}../*.
19400 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64 65  ** Return the de
19410 76 69 63 65 20 63 68 61 72 61 63 74 65 72 69 73  vice characteris
19420 74 69 63 73 20 66 6f 72 20 74 68 65 20 66 69 6c  tics for the fil
19430 65 2e 20 54 68 69 73 20 69 73 20 61 6c 77 61 79  e. This is alway
19440 73 20 30 20 66 6f 72 20 75 6e 69 78 2e 0a 2a 2f  s 0 for unix..*/
19450 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
19460 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
19470 73 74 69 63 73 28 73 71 6c 69 74 65 33 5f 66 69  stics(sqlite3_fi
19480 6c 65 20 2a 4e 6f 74 55 73 65 64 29 7b 0a 20 20  le *NotUsed){.  
19490 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
194a0 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74  (NotUsed);.  ret
194b0 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
194c0 48 65 72 65 20 65 6e 64 73 20 74 68 65 20 69 6d  Here ends the im
194d0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
194e0 61 6c 6c 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  all sqlite3_file
194f0 20 6d 65 74 68 6f 64 73 2e 0a 2a 2a 0a 2a 2a 2a   methods..**.***
19500 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19510 2a 2a 2a 20 45 6e 64 20 73 71 6c 69 74 65 33 5f  *** End sqlite3_
19520 66 69 6c 65 20 4d 65 74 68 6f 64 73 20 2a 2a 2a  file Methods ***
19530 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19540 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
19550 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19560 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19570 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19580 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19590 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a  ***********/../*
195a0 0a 2a 2a 20 54 68 69 73 20 64 69 76 69 73 69 6f  .** This divisio
195b0 6e 20 63 6f 6e 74 61 69 6e 73 20 64 65 66 69 6e  n contains defin
195c0 69 74 69 6f 6e 73 20 6f 66 20 73 71 6c 69 74 65  itions of sqlite
195d0 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a  3_io_methods obj
195e0 65 63 74 73 20 74 68 61 74 0a 2a 2a 20 69 6d 70  ects that.** imp
195f0 6c 65 6d 65 6e 74 20 76 61 72 69 6f 75 73 20 66  lement various f
19600 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61  ile locking stra
19610 74 65 67 69 65 73 2e 20 20 49 74 20 61 6c 73 6f  tegies.  It also
19620 20 63 6f 6e 74 61 69 6e 73 20 64 65 66 69 6e 69   contains defini
19630 74 69 6f 6e 73 0a 2a 2a 20 6f 66 20 22 66 69 6e  tions.** of "fin
19640 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 73 2e 20  der" functions. 
19650 20 41 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69   A finder-functi
19660 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 6c 6f  on is used to lo
19670 63 61 74 65 20 74 68 65 20 61 70 70 72 6f 70 72  cate the appropr
19680 69 61 74 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f  iate.** sqlite3_
19690 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63  io_methods objec
196a0 74 20 66 6f 72 20 61 20 70 61 72 74 69 63 75 6c  t for a particul
196b0 61 72 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ar database file
196c0 2e 20 20 54 68 65 20 70 41 70 70 44 61 74 61 0a  .  The pAppData.
196d0 2a 2a 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  ** field of the 
196e0 73 71 6c 69 74 65 33 5f 76 66 73 20 56 46 53 20  sqlite3_vfs VFS 
196f0 6f 62 6a 65 63 74 73 20 61 72 65 20 69 6e 69 74  objects are init
19700 69 61 6c 69 7a 65 64 20 74 6f 20 62 65 20 70 6f  ialized to be po
19710 69 6e 74 65 72 73 20 74 6f 0a 2a 2a 20 74 68 65  inters to.** the
19720 20 63 6f 72 72 65 63 74 20 66 69 6e 64 65 72 2d   correct finder-
19730 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 74 68 61  function for tha
19740 74 20 56 46 53 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 73  t VFS..**.** Mos
19750 74 20 66 69 6e 64 65 72 20 66 75 6e 63 74 69 6f  t finder functio
19760 6e 73 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  ns return a poin
19770 74 65 72 20 74 6f 20 61 20 66 69 78 65 64 20 73  ter to a fixed s
19780 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
19790 73 0a 2a 2a 20 6f 62 6a 65 63 74 2e 20 20 54 68  s.** object.  Th
197a0 65 20 6f 6e 6c 79 20 69 6e 74 65 72 65 73 74 69  e only interesti
197b0 6e 67 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69  ng finder-functi
197c0 6f 6e 20 69 73 20 61 75 74 6f 6c 6f 63 6b 49 6f  on is autolockIo
197d0 46 69 6e 64 65 72 2c 20 77 68 69 63 68 0a 2a 2a  Finder, which.**
197e0 20 6c 6f 6f 6b 73 20 61 74 20 74 68 65 20 66 69   looks at the fi
197f0 6c 65 73 79 73 74 65 6d 20 74 79 70 65 20 61 6e  lesystem type an
19800 64 20 74 72 69 65 73 20 74 6f 20 67 75 65 73 73  d tries to guess
19810 20 74 68 65 20 62 65 73 74 20 6c 6f 63 6b 69 6e   the best lockin
19820 67 0a 2a 2a 20 73 74 72 61 74 65 67 79 20 66 72  g.** strategy fr
19830 6f 6d 20 74 68 61 74 2e 0a 2a 2a 0a 2a 2a 20 46  om that..**.** F
19840 6f 72 20 66 69 6e 64 65 72 2d 66 75 6e 74 69 6f  or finder-funtio
19850 6e 20 46 2c 20 74 77 6f 20 6f 62 6a 65 63 74 73  n F, two objects
19860 20 61 72 65 20 63 72 65 61 74 65 64 3a 0a 2a 2a   are created:.**
19870 0a 2a 2a 20 20 20 20 28 31 29 20 54 68 65 20 72  .**    (1) The r
19880 65 61 6c 20 66 69 6e 64 65 72 2d 66 75 6e 63 74  eal finder-funct
19890 69 6f 6e 20 6e 61 6d 65 64 20 22 46 49 6d 70 74  ion named "FImpt
198a0 28 29 22 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32  ()"..**.**    (2
198b0 29 20 41 20 63 6f 6e 73 74 61 6e 74 20 70 6f 69  ) A constant poi
198c0 6e 74 65 72 20 74 6f 20 74 68 69 73 20 66 75 6e  nter to this fun
198d0 63 74 69 6f 6e 20 6e 61 6d 65 64 20 6a 75 73 74  ction named just
198e0 20 22 46 22 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 41   "F"..**.**.** A
198f0 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
19900 46 20 70 6f 69 6e 74 65 72 20 69 73 20 75 73 65  F pointer is use
19910 64 20 61 73 20 74 68 65 20 70 41 70 70 44 61 74  d as the pAppDat
19920 61 20 76 61 6c 75 65 20 66 6f 72 20 56 46 53 0a  a value for VFS.
19930 2a 2a 20 6f 62 6a 65 63 74 73 2e 20 20 57 65 20  ** objects.  We 
19940 68 61 76 65 20 74 6f 20 64 6f 20 74 68 69 73 20  have to do this 
19950 69 6e 73 74 65 61 64 20 6f 66 20 6c 65 74 74 69  instead of letti
19960 6e 67 20 70 41 70 70 44 61 74 61 20 70 6f 69 6e  ng pAppData poin
19970 74 0a 2a 2a 20 64 69 72 65 63 74 6c 79 20 61 74  t.** directly at
19980 20 74 68 65 20 66 69 6e 64 65 72 2d 66 75 6e 63   the finder-func
19990 74 69 6f 6e 20 73 69 6e 63 65 20 43 39 30 20 72  tion since C90 r
199a0 75 6c 65 73 20 70 72 65 76 65 6e 74 20 61 20 76  ules prevent a v
199b0 6f 69 64 2a 0a 2a 2a 20 66 72 6f 6d 20 62 65 20  oid*.** from be 
199c0 63 61 73 74 20 69 6e 74 6f 20 61 20 66 75 6e 63  cast into a func
199d0 74 69 6f 6e 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a  tion pointer..**
199e0 0a 2a 2a 0a 2a 2a 20 45 61 63 68 20 69 6e 73 74  .**.** Each inst
199f0 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6d 61 63  ance of this mac
19a00 72 6f 20 67 65 6e 65 72 61 74 65 73 20 74 77 6f  ro generates two
19a10 20 6f 62 6a 65 63 74 73 3a 0a 2a 2a 0a 2a 2a 20   objects:.**.** 
19a20 20 20 2a 20 20 41 20 63 6f 6e 73 74 61 6e 74 20    *  A constant 
19a30 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
19a40 64 73 20 6f 62 6a 65 63 74 20 63 61 6c 6c 20 4d  ds object call M
19a50 45 54 48 4f 44 20 74 68 61 74 20 68 61 73 20 6c  ETHOD that has l
19a60 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20 6d  ocking.**      m
19a70 65 74 68 6f 64 73 20 43 4c 4f 53 45 2c 20 4c 4f  ethods CLOSE, LO
19a80 43 4b 2c 20 55 4e 4c 4f 43 4b 2c 20 43 4b 52 45  CK, UNLOCK, CKRE
19a90 53 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a  SLOCK..**.**   *
19aa0 20 20 41 6e 20 49 2f 4f 20 6d 65 74 68 6f 64 20    An I/O method 
19ab0 66 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20  finder function 
19ac0 63 61 6c 6c 65 64 20 46 49 4e 44 45 52 20 74 68  called FINDER th
19ad0 61 74 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69  at returns a poi
19ae0 6e 74 65 72 0a 2a 2a 20 20 20 20 20 20 74 6f 20  nter.**      to 
19af0 74 68 65 20 4d 45 54 48 4f 44 20 6f 62 6a 65 63  the METHOD objec
19b00 74 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75  t in the previou
19b10 73 20 62 75 6c 6c 65 74 2e 0a 2a 2f 0a 23 64 65  s bullet..*/.#de
19b20 66 69 6e 65 20 49 4f 4d 45 54 48 4f 44 53 28 46  fine IOMETHODS(F
19b30 49 4e 44 45 52 2c 20 4d 45 54 48 4f 44 2c 20 43  INDER, METHOD, C
19b40 4c 4f 53 45 2c 20 4c 4f 43 4b 2c 20 55 4e 4c 4f  LOSE, LOCK, UNLO
19b50 43 4b 2c 20 43 4b 4c 4f 43 4b 29 20 20 20 20 20  CK, CKLOCK)     
19b60 20 20 20 20 20 20 20 20 20 20 5c 0a 73 74 61 74            \.stat
19b70 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ic const sqlite3
19b80 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 4d 45 54 48  _io_methods METH
19b90 4f 44 20 3d 20 7b 20 20 20 20 20 20 20 20 20 20  OD = {          
19ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19bb0 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 31 2c           \.   1,
19bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19bd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65            /* iVe
19be0 72 73 69 6f 6e 20 2a 2f 20 20 20 20 20 20 20 20  rsion */        
19bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19c00 20 20 20 20 20 20 20 20 5c 0a 20 20 20 43 4c 4f          \.   CLO
19c10 53 45 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  SE,             
19c20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f           /* xClo
19c30 73 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  se */           
19c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19c50 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78         \.   unix
19c60 52 65 61 64 2c 20 20 20 20 20 20 20 20 20 20 20  Read,           
19c70 20 20 20 20 20 20 20 20 2f 2a 20 78 52 65 61 64          /* xRead
19c80 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
19c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19ca0 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 57        \.   unixW
19cb0 72 69 74 65 2c 20 20 20 20 20 20 20 20 20 20 20  rite,           
19cc0 20 20 20 20 20 20 20 2f 2a 20 78 57 72 69 74 65         /* xWrite
19cd0 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
19ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19cf0 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 54 72       \.   unixTr
19d00 75 6e 63 61 74 65 2c 20 20 20 20 20 20 20 20 20  uncate,         
19d10 20 20 20 20 20 20 2f 2a 20 78 54 72 75 6e 63 61        /* xTrunca
19d20 74 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  te */           
19d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19d40 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 79 6e      \.   unixSyn
19d50 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
19d60 20 20 20 20 20 2f 2a 20 78 53 79 6e 63 20 2a 2f       /* xSync */
19d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19d90 20 20 20 5c 0a 20 20 20 75 6e 69 78 46 69 6c 65     \.   unixFile
19da0 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20  Size,           
19db0 20 20 20 20 2f 2a 20 78 46 69 6c 65 53 69 7a 65      /* xFileSize
19dc0 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
19dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19de0 20 20 5c 0a 20 20 20 4c 4f 43 4b 2c 20 20 20 20    \.   LOCK,    
19df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19e00 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 2a 2f 20 20     /* xLock */  
19e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19e30 20 5c 0a 20 20 20 55 4e 4c 4f 43 4b 2c 20 20 20   \.   UNLOCK,   
19e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19e50 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 2a 2f 20    /* xUnlock */ 
19e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19e80 5c 0a 20 20 20 43 4b 4c 4f 43 4b 2c 20 20 20 20  \.   CKLOCK,    
19e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19ea0 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76   /* xCheckReserv
19eb0 65 64 4c 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20  edLock */       
19ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
19ed0 0a 20 20 20 75 6e 69 78 46 69 6c 65 43 6f 6e 74  .   unixFileCont
19ee0 72 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  rol,            
19ef0 2f 2a 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 20  /* xFileControl 
19f00 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
19f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
19f20 20 20 20 75 6e 69 78 53 65 63 74 6f 72 53 69 7a     unixSectorSiz
19f30 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e,             /
19f40 2a 20 78 53 65 63 74 6f 72 53 69 7a 65 20 2a 2f  * xSectorSize */
19f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19f60 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
19f70 20 20 75 6e 69 78 44 65 76 69 63 65 43 68 61 72    unixDeviceChar
19f80 61 63 74 65 72 69 73 74 69 63 73 20 20 20 2f 2a  acteristics   /*
19f90 20 78 44 65 76 69 63 65 43 61 70 61 62 69 6c 69   xDeviceCapabili
19fa0 74 69 65 73 20 2a 2f 20 20 20 20 20 20 20 20 20  ties */         
19fb0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 7d 3b              \.};
19fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a000 20 20 20 20 20 20 20 20 20 20 20 5c 0a 73 74 61             \.sta
1a010 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  tic const sqlite
1a020 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 46 49  3_io_methods *FI
1a030 4e 44 45 52 23 23 49 6d 70 6c 28 63 6f 6e 73 74  NDER##Impl(const
1a040 20 63 68 61 72 20 2a 7a 2c 20 75 6e 69 78 46 69   char *z, unixFi
1a050 6c 65 20 2a 70 29 7b 20 20 20 5c 0a 20 20 55 4e  le *p){   \.  UN
1a060 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 7a  USED_PARAMETER(z
1a070 29 3b 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  ); UNUSED_PARAME
1a080 54 45 52 28 70 29 3b 20 20 20 20 20 20 20 20 20  TER(p);         
1a090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a0a0 20 20 20 20 20 20 20 20 20 5c 0a 20 20 72 65 74           \.  ret
1a0b0 75 72 6e 20 26 4d 45 54 48 4f 44 3b 20 20 20 20  urn &METHOD;    
1a0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a0d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a0e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a0f0 20 20 20 20 20 20 20 20 5c 0a 7d 20 20 20 20 20          \.}     
1a100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a140 20 20 20 20 20 20 20 5c 0a 73 74 61 74 69 63 20         \.static 
1a150 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f  const sqlite3_io
1a160 5f 6d 65 74 68 6f 64 73 20 2a 28 2a 63 6f 6e 73  _methods *(*cons
1a170 74 20 46 49 4e 44 45 52 29 28 63 6f 6e 73 74 20  t FINDER)(const 
1a180 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65 20 2a  char*,unixFile *
1a190 70 29 20 20 20 20 5c 0a 20 20 20 20 3d 20 46 49  p)    \.    = FI
1a1a0 4e 44 45 52 23 23 49 6d 70 6c 3b 0a 0a 2f 2a 0a  NDER##Impl;../*.
1a1b0 2a 2a 20 48 65 72 65 20 61 72 65 20 61 6c 6c 20  ** Here are all 
1a1c0 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69  of the sqlite3_i
1a1d0 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74  o_methods object
1a1e0 73 20 66 6f 72 20 65 61 63 68 20 6f 66 20 74 68  s for each of th
1a1f0 65 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 73 74 72  e.** locking str
1a200 61 74 65 67 69 65 73 2e 20 20 46 75 6e 63 74 69  ategies.  Functi
1a210 6f 6e 73 20 74 68 61 74 20 72 65 74 75 72 6e 20  ons that return 
1a220 70 6f 69 6e 74 65 72 73 20 74 6f 20 74 68 65 73  pointers to thes
1a230 65 20 6d 65 74 68 6f 64 73 0a 2a 2a 20 61 72 65  e methods.** are
1a240 20 61 6c 73 6f 20 63 72 65 61 74 65 64 2e 0a 2a   also created..*
1a250 2f 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 70  /.IOMETHODS(.  p
1a260 6f 73 69 78 49 6f 46 69 6e 64 65 72 2c 20 20 20  osixIoFinder,   
1a270 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64           /* Find
1a280 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  er function name
1a290 20 2a 2f 0a 20 20 70 6f 73 69 78 49 6f 4d 65 74   */.  posixIoMet
1a2a0 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20 20  hods,           
1a2b0 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  /* sqlite3_io_me
1a2c0 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d  thods object nam
1a2d0 65 20 2a 2f 0a 20 20 75 6e 69 78 43 6c 6f 73 65  e */.  unixClose
1a2e0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1a2f0 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f   /* xClose metho
1a300 64 20 2a 2f 0a 20 20 75 6e 69 78 4c 6f 63 6b 2c  d */.  unixLock,
1a310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a320 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64   /* xLock method
1a330 20 2a 2f 0a 20 20 75 6e 69 78 55 6e 6c 6f 63 6b   */.  unixUnlock
1a340 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1a350 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f  /* xUnlock metho
1a360 64 20 2a 2f 0a 20 20 75 6e 69 78 43 68 65 63 6b  d */.  unixCheck
1a370 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 20 20 20  ReservedLock    
1a380 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76   /* xCheckReserv
1a390 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f  edLock method */
1a3a0 0a 29 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20  .).IOMETHODS(.  
1a3b0 6e 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20  nolockIoFinder, 
1a3c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e            /* Fin
1a3d0 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  der function nam
1a3e0 65 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 49 6f 4d  e */.  nolockIoM
1a3f0 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20  ethods,         
1a400 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d   /* sqlite3_io_m
1a410 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61  ethods object na
1a420 6d 65 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 43 6c  me */.  nolockCl
1a430 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ose,            
1a440 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68    /* xClose meth
1a450 6f 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 4c 6f  od */.  nolockLo
1a460 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
1a470 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f    /* xLock metho
1a480 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 55 6e 6c  d */.  nolockUnl
1a490 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
1a4a0 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68   /* xUnlock meth
1a4b0 6f 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 43 68  od */.  nolockCh
1a4c0 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20  eckReservedLock 
1a4d0 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72    /* xCheckReser
1a4e0 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  vedLock method *
1a4f0 2f 0a 29 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20  /.).IOMETHODS(. 
1a500 20 64 6f 74 6c 6f 63 6b 49 6f 46 69 6e 64 65 72   dotlockIoFinder
1a510 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  ,          /* Fi
1a520 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61  nder function na
1a530 6d 65 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 49  me */.  dotlockI
1a540 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20  oMethods,       
1a550 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f    /* sqlite3_io_
1a560 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e  methods object n
1a570 61 6d 65 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b  ame */.  dotlock
1a580 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20  Close,          
1a590 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74     /* xClose met
1a5a0 68 6f 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b  hod */.  dotlock
1a5b0 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Lock,           
1a5c0 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68     /* xLock meth
1a5d0 6f 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 55  od */.  dotlockU
1a5e0 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  nlock,          
1a5f0 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74    /* xUnlock met
1a600 68 6f 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b  hod */.  dotlock
1a610 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
1a620 6b 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65  k  /* xCheckRese
1a630 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  rvedLock method 
1a640 2a 2f 0a 29 0a 0a 23 69 66 20 53 51 4c 49 54 45  */.)..#if SQLITE
1a650 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
1a660 53 54 59 4c 45 20 26 26 20 21 4f 53 5f 56 58 57  STYLE && !OS_VXW
1a670 4f 52 4b 53 0a 49 4f 4d 45 54 48 4f 44 53 28 0a  ORKS.IOMETHODS(.
1a680 20 20 66 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c    flockIoFinder,
1a690 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1a6a0 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e  inder function n
1a6b0 61 6d 65 20 2a 2f 0a 20 20 66 6c 6f 63 6b 49 6f  ame */.  flockIo
1a6c0 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20  Methods,        
1a6d0 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f     /* sqlite3_io
1a6e0 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20  _methods object 
1a6f0 6e 61 6d 65 20 2a 2f 0a 20 20 66 6c 6f 63 6b 43  name */.  flockC
1a700 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  lose,           
1a710 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65      /* xClose me
1a720 74 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b 4c  thod */.  flockL
1a730 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
1a740 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74      /* xLock met
1a750 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b 55 6e  hod */.  flockUn
1a760 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  lock,           
1a770 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65     /* xUnlock me
1a780 74 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b 43  thod */.  flockC
1a790 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
1a7a0 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73      /* xCheckRes
1a7b0 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64  ervedLock method
1a7c0 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 23 69   */.).#endif..#i
1a7d0 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 49 4f 4d  f OS_VXWORKS.IOM
1a7e0 45 54 48 4f 44 53 28 0a 20 20 73 65 6d 49 6f 46  ETHODS(.  semIoF
1a7f0 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20  inder,          
1a800 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75      /* Finder fu
1a810 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20  nction name */. 
1a820 20 73 65 6d 49 6f 4d 65 74 68 6f 64 73 2c 20 20   semIoMethods,  
1a830 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71             /* sq
1a840 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
1a850 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a   object name */.
1a860 20 20 73 65 6d 43 6c 6f 73 65 2c 20 20 20 20 20    semClose,     
1a870 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
1a880 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a  Close method */.
1a890 20 20 73 65 6d 4c 6f 63 6b 2c 20 20 20 20 20 20    semLock,      
1a8a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
1a8b0 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  Lock method */. 
1a8c0 20 73 65 6d 55 6e 6c 6f 63 6b 2c 20 20 20 20 20   semUnlock,     
1a8d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55             /* xU
1a8e0 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  nlock method */.
1a8f0 20 20 73 65 6d 43 68 65 63 6b 52 65 73 65 72 76    semCheckReserv
1a900 65 64 4c 6f 63 6b 20 20 20 20 20 20 2f 2a 20 78  edLock      /* x
1a910 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
1a920 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65  k method */.).#e
1a930 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e 65  ndif..#if define
1a940 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20  d(__APPLE__) && 
1a950 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
1a960 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 49 4f 4d 45  CKING_STYLE.IOME
1a970 54 48 4f 44 53 28 0a 20 20 61 66 70 49 6f 46 69  THODS(.  afpIoFi
1a980 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  nder,           
1a990 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e     /* Finder fun
1a9a0 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  ction name */.  
1a9b0 61 66 70 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20  afpIoMethods,   
1a9c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c            /* sql
1a9d0 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
1a9e0 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20  object name */. 
1a9f0 20 61 66 70 43 6c 6f 73 65 2c 20 20 20 20 20 20   afpClose,      
1aa00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
1aa10 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lose method */. 
1aa20 20 61 66 70 4c 6f 63 6b 2c 20 20 20 20 20 20 20   afpLock,       
1aa30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c             /* xL
1aa40 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
1aa50 61 66 70 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20  afpUnlock,      
1aa60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e            /* xUn
1aa70 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lock method */. 
1aa80 20 61 66 70 43 68 65 63 6b 52 65 73 65 72 76 65   afpCheckReserve
1aa90 64 4c 6f 63 6b 20 20 20 20 20 20 2f 2a 20 78 43  dLock      /* xC
1aaa0 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
1aab0 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e   method */.).#en
1aac0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 22  dif../*.** The "
1aad0 57 68 6f 6c 65 20 46 69 6c 65 20 4c 6f 63 6b 69  Whole File Locki
1aae0 6e 67 22 20 66 69 6e 64 65 72 20 72 65 74 75 72  ng" finder retur
1aaf0 6e 73 20 74 68 65 20 73 61 6d 65 20 73 65 74 20  ns the same set 
1ab00 6f 66 20 6d 65 74 68 6f 64 73 20 61 73 0a 2a 2a  of methods as.**
1ab10 20 74 68 65 20 70 6f 73 69 78 20 6c 6f 63 6b 69   the posix locki
1ab20 6e 67 20 66 69 6e 64 65 72 2e 20 20 42 75 74 20  ng finder.  But 
1ab30 69 74 20 61 6c 73 6f 20 73 65 74 73 20 74 68 65  it also sets the
1ab40 20 53 51 4c 49 54 45 5f 57 48 4f 4c 45 5f 46 49   SQLITE_WHOLE_FI
1ab50 4c 45 5f 4c 4f 43 4b 49 4e 47 0a 2a 2a 20 66 6c  LE_LOCKING.** fl
1ab60 61 67 20 74 6f 20 66 6f 72 63 65 20 74 68 65 20  ag to force the 
1ab70 70 6f 73 69 78 20 61 64 76 69 73 6f 72 79 20 6c  posix advisory l
1ab80 6f 63 6b 73 20 74 6f 20 63 6f 76 65 72 20 74 68  ocks to cover th
1ab90 65 20 77 68 6f 6c 65 20 66 69 6c 65 20 69 6e 73  e whole file ins
1aba0 74 65 61 64 0a 2a 2a 20 6f 66 20 6a 75 73 74 20  tead.** of just 
1abb0 61 20 73 6d 61 6c 6c 20 73 70 61 6e 20 6f 66 20  a small span of 
1abc0 62 79 74 65 73 20 6e 65 61 72 20 74 68 65 20 31  bytes near the 1
1abd0 47 69 42 20 62 6f 75 6e 64 61 72 79 2e 20 20 57  GiB boundary.  W
1abe0 68 6f 6c 65 20 46 69 6c 65 20 4c 6f 63 6b 69 6e  hole File Lockin
1abf0 67 0a 2a 2a 20 69 73 20 75 73 65 66 75 6c 20 6f  g.** is useful o
1ac00 6e 20 4e 46 53 2d 6d 6f 75 6e 74 65 64 20 66 69  n NFS-mounted fi
1ac10 6c 65 73 20 73 69 6e 63 65 20 69 74 20 68 65 6c  les since it hel
1ac20 70 73 20 4e 46 53 20 74 6f 20 6d 61 69 6e 74 61  ps NFS to mainta
1ac30 69 6e 20 63 61 63 68 65 0a 2a 2a 20 63 6f 68 65  in cache.** cohe
1ac40 72 65 6e 63 79 2e 20 20 42 75 74 20 69 74 20 69  rency.  But it i
1ac50 73 20 61 20 64 65 74 72 69 6d 65 6e 74 20 74 6f  s a detriment to
1ac60 20 6f 74 68 65 72 20 66 69 6c 65 73 79 73 74 65   other filesyste
1ac70 6d 73 20 73 69 6e 63 65 20 69 74 20 72 75 6e 73  ms since it runs
1ac80 0a 2a 2a 20 73 6c 6f 77 65 72 2e 0a 2a 2f 0a 73  .** slower..*/.s
1ac90 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69  tatic const sqli
1aca0 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a  te3_io_methods *
1acb0 70 6f 73 69 78 57 66 6c 49 6f 46 69 6e 64 65 72  posixWflIoFinder
1acc0 49 6d 70 6c 28 63 6f 6e 73 74 20 63 68 61 72 2a  Impl(const char*
1acd0 7a 2c 20 75 6e 69 78 46 69 6c 65 2a 70 29 7b 0a  z, unixFile*p){.
1ace0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
1acf0 45 52 28 7a 29 3b 0a 20 20 70 2d 3e 66 69 6c 65  ER(z);.  p->file
1ad00 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 57  Flags = SQLITE_W
1ad10 48 4f 4c 45 5f 46 49 4c 45 5f 4c 4f 43 4b 49 4e  HOLE_FILE_LOCKIN
1ad20 47 3b 0a 20 20 72 65 74 75 72 6e 20 26 70 6f 73  G;.  return &pos
1ad30 69 78 49 6f 4d 65 74 68 6f 64 73 3b 0a 7d 0a 73  ixIoMethods;.}.s
1ad40 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69  tatic const sqli
1ad50 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 0a  te3_io_methods .
1ad60 20 20 2a 28 2a 63 6f 6e 73 74 20 70 6f 73 69 78    *(*const posix
1ad70 57 66 6c 49 6f 46 69 6e 64 65 72 29 28 63 6f 6e  WflIoFinder)(con
1ad80 73 74 20 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c  st char*,unixFil
1ad90 65 20 2a 70 29 20 3d 20 70 6f 73 69 78 57 66 6c  e *p) = posixWfl
1ada0 49 6f 46 69 6e 64 65 72 49 6d 70 6c 3b 0a 0a 2f  IoFinderImpl;../
1adb0 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79 20 6c  *.** The proxy l
1adc0 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 20 69 73  ocking method is
1add0 20 61 20 22 73 75 70 65 72 2d 6d 65 74 68 6f 64   a "super-method
1ade0 22 20 69 6e 20 74 68 65 20 73 65 6e 73 65 20 74  " in the sense t
1adf0 68 61 74 20 69 74 0a 2a 2a 20 6f 70 65 6e 73 20  hat it.** opens 
1ae00 73 65 63 6f 6e 64 61 72 79 20 66 69 6c 65 20 64  secondary file d
1ae10 65 73 63 72 69 70 74 6f 72 73 20 66 6f 72 20 74  escriptors for t
1ae20 68 65 20 63 6f 6e 63 68 20 61 6e 64 20 6c 6f 63  he conch and loc
1ae30 6b 20 66 69 6c 65 73 20 61 6e 64 0a 2a 2a 20 69  k files and.** i
1ae40 74 20 75 73 65 73 20 70 72 6f 78 79 2c 20 64 6f  t uses proxy, do
1ae50 74 2d 66 69 6c 65 2c 20 41 46 50 2c 20 61 6e 64  t-file, AFP, and
1ae60 20 66 6c 6f 63 6b 28 29 20 6c 6f 63 6b 69 6e 67   flock() locking
1ae70 20 6d 65 74 68 6f 64 73 20 6f 6e 20 74 68 6f 73   methods on thos
1ae80 65 0a 2a 2a 20 73 65 63 6f 6e 64 61 72 79 20 66  e.** secondary f
1ae90 69 6c 65 73 2e 20 20 46 6f 72 20 74 68 69 73 20  iles.  For this 
1aea0 72 65 61 73 6f 6e 2c 20 74 68 65 20 64 69 76 69  reason, the divi
1aeb0 73 69 6f 6e 20 74 68 61 74 20 69 6d 70 6c 65 6d  sion that implem
1aec0 65 6e 74 73 0a 2a 2a 20 70 72 6f 78 79 20 6c 6f  ents.** proxy lo
1aed0 63 6b 69 6e 67 20 69 73 20 6c 6f 63 61 74 65 64  cking is located
1aee0 20 6d 75 63 68 20 66 75 72 74 68 65 72 20 64 6f   much further do
1aef0 77 6e 20 69 6e 20 74 68 65 20 66 69 6c 65 2e 20  wn in the file. 
1af00 20 42 75 74 20 77 65 20 6e 65 65 64 0a 2a 2a 20   But we need.** 
1af10 74 6f 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20  to go ahead and 
1af20 64 65 66 69 6e 65 20 74 68 65 20 73 71 6c 69 74  define the sqlit
1af30 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 61 6e  e3_io_methods an
1af40 64 20 66 69 6e 64 65 72 20 66 75 6e 63 74 69 6f  d finder functio
1af50 6e 0a 2a 2a 20 66 6f 72 20 70 72 6f 78 79 20 6c  n.** for proxy l
1af60 6f 63 6b 69 6e 67 20 68 65 72 65 2e 20 20 53 6f  ocking here.  So
1af70 20 77 65 20 66 6f 72 77 61 72 64 20 64 65 63 6c   we forward decl
1af80 61 72 65 20 74 68 65 20 49 2f 4f 20 6d 65 74 68  are the I/O meth
1af90 6f 64 73 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69  ods..*/.#if defi
1afa0 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26  ned(__APPLE__) &
1afb0 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  & SQLITE_ENABLE_
1afc0 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 73 74  LOCKING_STYLE.st
1afd0 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43 6c  atic int proxyCl
1afe0 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ose(sqlite3_file
1aff0 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 70  *);.static int p
1b000 72 6f 78 79 4c 6f 63 6b 28 73 71 6c 69 74 65 33  roxyLock(sqlite3
1b010 5f 66 69 6c 65 2a 2c 20 69 6e 74 29 3b 0a 73 74  _file*, int);.st
1b020 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 55 6e  atic int proxyUn
1b030 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  lock(sqlite3_fil
1b040 65 2a 2c 20 69 6e 74 29 3b 0a 73 74 61 74 69 63  e*, int);.static
1b050 20 69 6e 74 20 70 72 6f 78 79 43 68 65 63 6b 52   int proxyCheckR
1b060 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69  eservedLock(sqli
1b070 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 2a 29  te3_file*, int*)
1b080 3b 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 70  ;.IOMETHODS(.  p
1b090 72 6f 78 79 49 6f 46 69 6e 64 65 72 2c 20 20 20  roxyIoFinder,   
1b0a0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64           /* Find
1b0b0 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  er function name
1b0c0 20 2a 2f 0a 20 20 70 72 6f 78 79 49 6f 4d 65 74   */.  proxyIoMet
1b0d0 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20 20  hods,           
1b0e0 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  /* sqlite3_io_me
1b0f0 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d  thods object nam
1b100 65 20 2a 2f 0a 20 20 70 72 6f 78 79 43 6c 6f 73  e */.  proxyClos
1b110 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
1b120 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f   /* xClose metho
1b130 64 20 2a 2f 0a 20 20 70 72 6f 78 79 4c 6f 63 6b  d */.  proxyLock
1b140 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1b150 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64   /* xLock method
1b160 20 2a 2f 0a 20 20 70 72 6f 78 79 55 6e 6c 6f 63   */.  proxyUnloc
1b170 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
1b180 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f  /* xUnlock metho
1b190 64 20 2a 2f 0a 20 20 70 72 6f 78 79 43 68 65 63  d */.  proxyChec
1b1a0 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 20 20  kReservedLock   
1b1b0 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76   /* xCheckReserv
1b1c0 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f  edLock method */
1b1d0 0a 29 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66 20  .).#endif...#if 
1b1e0 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
1b1f0 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  _) && SQLITE_ENA
1b200 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
1b210 45 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 22 66  E./* .** This "f
1b220 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 20  inder" function 
1b230 61 74 74 65 6d 70 74 73 20 74 6f 20 64 65 74 65  attempts to dete
1b240 72 6d 69 6e 65 20 74 68 65 20 62 65 73 74 20 6c  rmine the best l
1b250 6f 63 6b 69 6e 67 20 73 74 72 61 74 65 67 79 20  ocking strategy 
1b260 0a 2a 2a 20 66 6f 72 20 74 68 65 20 64 61 74 61  .** for the data
1b270 62 61 73 65 20 66 69 6c 65 20 22 66 69 6c 65 50  base file "fileP
1b280 61 74 68 22 2e 20 20 49 74 20 74 68 65 6e 20 72  ath".  It then r
1b290 65 74 75 72 6e 73 20 74 68 65 20 73 71 6c 69 74  eturns the sqlit
1b2a0 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 0a 2a 2a  e3_io_methods.**
1b2b0 20 6f 62 6a 65 63 74 20 74 68 61 74 20 69 6d 70   object that imp
1b2c0 6c 65 6d 65 6e 74 73 20 74 68 61 74 20 73 74 72  lements that str
1b2d0 61 74 65 67 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ategy..**.** Thi
1b2e0 73 20 69 73 20 66 6f 72 20 4d 61 63 4f 53 58 20  s is for MacOSX 
1b2f0 6f 6e 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  only..*/.static 
1b300 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f  const sqlite3_io
1b310 5f 6d 65 74 68 6f 64 73 20 2a 61 75 74 6f 6c 6f  _methods *autolo
1b320 63 6b 49 6f 46 69 6e 64 65 72 49 6d 70 6c 28 0a  ckIoFinderImpl(.
1b330 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 69    const char *fi
1b340 6c 65 50 61 74 68 2c 20 20 20 20 2f 2a 20 6e 61  lePath,    /* na
1b350 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
1b360 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69  se file */.  uni
1b370 78 46 69 6c 65 20 2a 70 4e 65 77 20 20 20 20 20  xFile *pNew     
1b380 20 20 20 20 20 20 2f 2a 20 6f 70 65 6e 20 66 69        /* open fi
1b390 6c 65 20 6f 62 6a 65 63 74 20 66 6f 72 20 74 68  le object for th
1b3a0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1b3b0 2a 2f 0a 29 7b 0a 20 20 73 74 61 74 69 63 20 63  */.){.  static c
1b3c0 6f 6e 73 74 20 73 74 72 75 63 74 20 4d 61 70 70  onst struct Mapp
1b3d0 69 6e 67 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20  ing {.    const 
1b3e0 63 68 61 72 20 2a 7a 46 69 6c 65 73 79 73 74 65  char *zFilesyste
1b3f0 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
1b400 2f 2a 20 46 69 6c 65 73 79 73 74 65 6d 20 74 79  /* Filesystem ty
1b410 70 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 63  pe name */.    c
1b420 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f  onst sqlite3_io_
1b430 6d 65 74 68 6f 64 73 20 2a 70 4d 65 74 68 6f 64  methods *pMethod
1b440 73 3b 20 20 20 2f 2a 20 41 70 70 72 6f 70 72 69  s;   /* Appropri
1b450 61 74 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68  ate locking meth
1b460 6f 64 20 2a 2f 0a 20 20 7d 20 61 4d 61 70 5b 5d  od */.  } aMap[]
1b470 20 3d 20 7b 0a 20 20 20 20 7b 20 22 68 66 73 22   = {.    { "hfs"
1b480 2c 20 20 20 20 26 70 6f 73 69 78 49 6f 4d 65 74  ,    &posixIoMet
1b490 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20 22 75  hods },.    { "u
1b4a0 66 73 22 2c 20 20 20 20 26 70 6f 73 69 78 49 6f  fs",    &posixIo
1b4b0 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b  Methods },.    {
1b4c0 20 22 61 66 70 66 73 22 2c 20 20 26 61 66 70 49   "afpfs",  &afpI
1b4d0 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 23 69 66 64  oMethods },.#ifd
1b4e0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
1b4f0 5f 41 46 50 5f 4c 4f 43 4b 49 4e 47 5f 53 4d 42  _AFP_LOCKING_SMB
1b500 0a 20 20 20 20 7b 20 22 73 6d 62 66 73 22 2c 20  .    { "smbfs", 
1b510 20 26 61 66 70 49 6f 4d 65 74 68 6f 64 73 20 7d   &afpIoMethods }
1b520 2c 0a 23 65 6c 73 65 0a 20 20 20 20 7b 20 22 73  ,.#else.    { "s
1b530 6d 62 66 73 22 2c 20 20 26 66 6c 6f 63 6b 49 6f  mbfs",  &flockIo
1b540 4d 65 74 68 6f 64 73 20 7d 2c 0a 23 65 6e 64 69  Methods },.#endi
1b550 66 0a 20 20 20 20 7b 20 22 77 65 62 64 61 76 22  f.    { "webdav"
1b560 2c 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f  , &nolockIoMetho
1b570 64 73 20 7d 2c 0a 20 20 20 20 7b 20 30 2c 20 30  ds },.    { 0, 0
1b580 20 7d 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b   }.  };.  int i;
1b590 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 66 73  .  struct statfs
1b5a0 20 66 73 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63   fsInfo;.  struc
1b5b0 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 49 6e 66 6f  t flock lockInfo
1b5c0 3b 0a 0a 20 20 69 66 28 20 21 66 69 6c 65 50 61  ;..  if( !filePa
1b5d0 74 68 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  th ){.    /* If 
1b5e0 66 69 6c 65 50 61 74 68 3d 3d 4e 55 4c 4c 20 74  filePath==NULL t
1b5f0 68 61 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65  hat means we are
1b600 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20   dealing with a 
1b610 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 0a 20  transient file. 
1b620 20 20 20 2a 2a 20 74 68 61 74 20 64 6f 65 73 20     ** that does 
1b630 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 6c  not need to be l
1b640 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20 20 20 72 65  ocked. */.    re
1b650 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65  turn &nolockIoMe
1b660 74 68 6f 64 73 3b 0a 20 20 7d 0a 20 20 69 66 28  thods;.  }.  if(
1b670 20 73 74 61 74 66 73 28 66 69 6c 65 50 61 74 68   statfs(filePath
1b680 2c 20 26 66 73 49 6e 66 6f 29 20 21 3d 20 2d 31  , &fsInfo) != -1
1b690 20 29 7b 0a 20 20 20 20 69 66 28 20 66 73 49 6e   ){.    if( fsIn
1b6a0 66 6f 2e 66 5f 66 6c 61 67 73 20 26 20 4d 4e 54  fo.f_flags & MNT
1b6b0 5f 52 44 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20  _RDONLY ){.     
1b6c0 20 72 65 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49   return &nolockI
1b6d0 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20 7d 0a  oMethods;.    }.
1b6e0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 61 4d 61      for(i=0; aMa
1b6f0 70 5b 69 5d 2e 7a 46 69 6c 65 73 79 73 74 65 6d  p[i].zFilesystem
1b700 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
1b710 28 20 73 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e  ( strcmp(fsInfo.
1b720 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20 61 4d  f_fstypename, aM
1b730 61 70 5b 69 5d 2e 7a 46 69 6c 65 73 79 73 74 65  ap[i].zFilesyste
1b740 6d 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  m)==0 ){.       
1b750 20 72 65 74 75 72 6e 20 61 4d 61 70 5b 69 5d 2e   return aMap[i].
1b760 70 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20 20 20  pMethods;.      
1b770 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
1b780 2a 20 44 65 66 61 75 6c 74 20 63 61 73 65 2e 20  * Default case. 
1b790 48 61 6e 64 6c 65 73 2c 20 61 6d 6f 6e 67 73 74  Handles, amongst
1b7a0 20 6f 74 68 65 72 73 2c 20 22 6e 66 73 22 2e 0a   others, "nfs"..
1b7b0 20 20 2a 2a 20 54 65 73 74 20 62 79 74 65 2d 72    ** Test byte-r
1b7c0 61 6e 67 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20  ange lock using 
1b7d0 66 63 6e 74 6c 28 29 2e 20 49 66 20 74 68 65 20  fcntl(). If the 
1b7e0 63 61 6c 6c 20 73 75 63 63 65 65 64 73 2c 20 0a  call succeeds, .
1b7f0 20 20 2a 2a 20 61 73 73 75 6d 65 20 74 68 61 74    ** assume that
1b800 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
1b810 20 73 75 70 70 6f 72 74 73 20 50 4f 53 49 58 20   supports POSIX 
1b820 73 74 79 6c 65 20 6c 6f 63 6b 73 2e 20 0a 20 20  style locks. .  
1b830 2a 2f 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f  */.  lockInfo.l_
1b840 6c 65 6e 20 3d 20 31 3b 0a 20 20 6c 6f 63 6b 49  len = 1;.  lockI
1b850 6e 66 6f 2e 6c 5f 73 74 61 72 74 20 3d 20 30 3b  nfo.l_start = 0;
1b860 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 77 68  .  lockInfo.l_wh
1b870 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b  ence = SEEK_SET;
1b880 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 74 79  .  lockInfo.l_ty
1b890 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20  pe = F_RDLCK;.  
1b8a0 69 66 28 20 66 63 6e 74 6c 28 70 4e 65 77 2d 3e  if( fcntl(pNew->
1b8b0 68 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63  h, F_GETLK, &loc
1b8c0 6b 49 6e 66 6f 29 21 3d 2d 31 20 29 20 7b 0a 20  kInfo)!=-1 ) {. 
1b8d0 20 20 20 70 4e 65 77 2d 3e 66 69 6c 65 46 6c 61     pNew->fileFla
1b8e0 67 73 20 3d 20 53 51 4c 49 54 45 5f 57 48 4f 4c  gs = SQLITE_WHOL
1b8f0 45 5f 46 49 4c 45 5f 4c 4f 43 4b 49 4e 47 3b 0a  E_FILE_LOCKING;.
1b900 20 20 20 20 72 65 74 75 72 6e 20 26 70 6f 73 69      return &posi
1b910 78 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 65  xIoMethods;.  }e
1b920 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  lse{.    return 
1b930 26 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64  &dotlockIoMethod
1b940 73 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20  s;.  }.}.static 
1b950 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f  const sqlite3_io
1b960 5f 6d 65 74 68 6f 64 73 20 0a 20 20 2a 28 2a 63  _methods .  *(*c
1b970 6f 6e 73 74 20 61 75 74 6f 6c 6f 63 6b 49 6f 46  onst autolockIoF
1b980 69 6e 64 65 72 29 28 63 6f 6e 73 74 20 63 68 61  inder)(const cha
1b990 72 2a 2c 75 6e 69 78 46 69 6c 65 2a 29 20 3d 20  r*,unixFile*) = 
1b9a0 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72  autolockIoFinder
1b9b0 49 6d 70 6c 3b 0a 0a 23 65 6e 64 69 66 20 2f 2a  Impl;..#endif /*
1b9c0 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
1b9d0 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  __) && SQLITE_EN
1b9e0 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
1b9f0 4c 45 20 2a 2f 0a 0a 23 69 66 20 4f 53 5f 56 58  LE */..#if OS_VX
1ba00 57 4f 52 4b 53 20 26 26 20 53 51 4c 49 54 45 5f  WORKS && SQLITE_
1ba10 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
1ba20 54 59 4c 45 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73  TYLE./* .** This
1ba30 20 22 66 69 6e 64 65 72 22 20 66 75 6e 63 74 69   "finder" functi
1ba40 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20 64  on attempts to d
1ba50 65 74 65 72 6d 69 6e 65 20 74 68 65 20 62 65 73  etermine the bes
1ba60 74 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74 65  t locking strate
1ba70 67 79 20 0a 2a 2a 20 66 6f 72 20 74 68 65 20 64  gy .** for the d
1ba80 61 74 61 62 61 73 65 20 66 69 6c 65 20 22 66 69  atabase file "fi
1ba90 6c 65 50 61 74 68 22 2e 20 20 49 74 20 74 68 65  lePath".  It the
1baa0 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 73 71  n returns the sq
1bab0 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
1bac0 0a 2a 2a 20 6f 62 6a 65 63 74 20 74 68 61 74 20  .** object that 
1bad0 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 61 74 20  implements that 
1bae0 73 74 72 61 74 65 67 79 2e 0a 2a 2a 0a 2a 2a 20  strategy..**.** 
1baf0 54 68 69 73 20 69 73 20 66 6f 72 20 56 58 57 6f  This is for VXWo
1bb00 72 6b 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73 74 61  rks only..*/.sta
1bb10 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  tic const sqlite
1bb20 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 61 75  3_io_methods *au
1bb30 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 49 6d  tolockIoFinderIm
1bb40 70 6c 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  pl(.  const char
1bb50 20 2a 66 69 6c 65 50 61 74 68 2c 20 20 20 20 2f   *filePath,    /
1bb60 2a 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  * name of the da
1bb70 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
1bb80 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e 65 77 20   unixFile *pNew 
1bb90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65            /* the
1bba0 20 6f 70 65 6e 20 66 69 6c 65 20 6f 62 6a 65 63   open file objec
1bbb0 74 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74  t */.){.  struct
1bbc0 20 66 6c 6f 63 6b 20 6c 6f 63 6b 49 6e 66 6f 3b   flock lockInfo;
1bbd0 0a 0a 20 20 69 66 28 20 21 66 69 6c 65 50 61 74  ..  if( !filePat
1bbe0 68 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 66  h ){.    /* If f
1bbf0 69 6c 65 50 61 74 68 3d 3d 4e 55 4c 4c 20 74 68  ilePath==NULL th
1bc00 61 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20  at means we are 
1bc10 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20 74  dealing with a t
1bc20 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 0a 20 20  ransient file.  
1bc30 20 20 2a 2a 20 74 68 61 74 20 64 6f 65 73 20 6e    ** that does n
1bc40 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 6c 6f  ot need to be lo
1bc50 63 6b 65 64 2e 20 2a 2f 0a 20 20 20 20 72 65 74  cked. */.    ret
1bc60 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74  urn &nolockIoMet
1bc70 68 6f 64 73 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  hods;.  }..  /* 
1bc80 54 65 73 74 20 69 66 20 66 63 6e 74 6c 28 29 20  Test if fcntl() 
1bc90 69 73 20 73 75 70 70 6f 72 74 65 64 20 61 6e 64  is supported and
1bca0 20 75 73 65 20 50 4f 53 49 58 20 73 74 79 6c 65   use POSIX style
1bcb0 20 6c 6f 63 6b 73 2e 0a 20 20 2a 2a 20 4f 74 68   locks..  ** Oth
1bcc0 65 72 77 69 73 65 20 66 61 6c 6c 20 62 61 63 6b  erwise fall back
1bcd0 20 74 6f 20 74 68 65 20 6e 61 6d 65 64 20 73 65   to the named se
1bce0 6d 61 70 68 6f 72 65 20 6d 65 74 68 6f 64 2e 0a  maphore method..
1bcf0 20 20 2a 2f 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e    */.  lockInfo.
1bd00 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20 6c 6f 63  l_len = 1;.  loc
1bd10 6b 49 6e 66 6f 2e 6c 5f 73 74 61 72 74 20 3d 20  kInfo.l_start = 
1bd20 30 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f  0;.  lockInfo.l_
1bd30 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45  whence = SEEK_SE
1bd40 54 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f  T;.  lockInfo.l_
1bd50 74 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a  type = F_RDLCK;.
1bd60 20 20 69 66 28 20 66 63 6e 74 6c 28 70 4e 65 77    if( fcntl(pNew
1bd70 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c  ->h, F_GETLK, &l
1bd80 6f 63 6b 49 6e 66 6f 29 21 3d 2d 31 20 29 20 7b  ockInfo)!=-1 ) {
1bd90 0a 20 20 20 20 72 65 74 75 72 6e 20 26 70 6f 73  .    return &pos
1bda0 69 78 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d  ixIoMethods;.  }
1bdb0 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
1bdc0 20 26 73 65 6d 49 6f 4d 65 74 68 6f 64 73 3b 0a   &semIoMethods;.
1bdd0 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 63 6f 6e    }.}.static con
1bde0 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  st sqlite3_io_me
1bdf0 74 68 6f 64 73 20 0a 20 20 2a 28 2a 63 6f 6e 73  thods .  *(*cons
1be00 74 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64  t autolockIoFind
1be10 65 72 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c  er)(const char*,
1be20 75 6e 69 78 46 69 6c 65 2a 29 20 3d 20 61 75 74  unixFile*) = aut
1be30 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 49 6d 70  olockIoFinderImp
1be40 6c 3b 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53  l;..#endif /* OS
1be50 5f 56 58 57 4f 52 4b 53 20 26 26 20 53 51 4c 49  _VXWORKS && SQLI
1be60 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
1be70 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a  G_STYLE */../*.*
1be80 2a 20 41 6e 20 61 62 73 74 72 61 63 74 20 74 79  * An abstract ty
1be90 70 65 20 66 6f 72 20 61 20 70 6f 69 6e 74 65 72  pe for a pointer
1bea0 20 74 6f 20 61 20 49 4f 20 6d 65 74 68 6f 64 20   to a IO method 
1beb0 66 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 3a  finder function:
1bec0 0a 2a 2f 0a 74 79 70 65 64 65 66 20 63 6f 6e 73  .*/.typedef cons
1bed0 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  t sqlite3_io_met
1bee0 68 6f 64 73 20 2a 28 2a 66 69 6e 64 65 72 5f 74  hods *(*finder_t
1bef0 79 70 65 29 28 63 6f 6e 73 74 20 63 68 61 72 2a  ype)(const char*
1bf00 2c 75 6e 69 78 46 69 6c 65 2a 29 3b 0a 0a 0a 2f  ,unixFile*);.../
1bf10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1bf20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1bf30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1bf40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1bf50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
1bf60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1bf70 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 73 71 6c 69 74 65  ********* sqlite
1bf80 33 5f 76 66 73 20 6d 65 74 68 6f 64 73 20 2a 2a  3_vfs methods **
1bf90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1bfa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a  **********.**.**
1bfb0 20 54 68 69 73 20 64 69 76 69 73 69 6f 6e 20 63   This division c
1bfc0 6f 6e 74 61 69 6e 73 20 74 68 65 20 69 6d 70 6c  ontains the impl
1bfd0 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 6d 65  ementation of me
1bfe0 74 68 6f 64 73 20 6f 6e 20 74 68 65 0a 2a 2a 20  thods on the.** 
1bff0 73 71 6c 69 74 65 33 5f 76 66 73 20 6f 62 6a 65  sqlite3_vfs obje
1c000 63 74 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e  ct..*/../*.** In
1c010 69 74 69 61 6c 69 7a 65 20 74 68 65 20 63 6f 6e  itialize the con
1c020 74 65 6e 74 73 20 6f 66 20 74 68 65 20 75 6e 69  tents of the uni
1c030 78 46 69 6c 65 20 73 74 72 75 63 74 75 72 65 20  xFile structure 
1c040 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 70 49  pointed to by pI
1c050 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
1c060 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 28   fillInUnixFile(
1c070 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
1c080 70 56 66 73 2c 20 20 20 20 20 20 2f 2a 20 50 6f  pVfs,      /* Po
1c090 69 6e 74 65 72 20 74 6f 20 76 66 73 20 6f 62 6a  inter to vfs obj
1c0a0 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 68 2c 20  ect */.  int h, 
1c0b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c0c0 20 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20 64 65   /* Open file de
1c0d0 73 63 72 69 70 74 6f 72 20 6f 66 20 66 69 6c 65  scriptor of file
1c0e0 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20 2a 2f   being opened */
1c0f0 0a 20 20 69 6e 74 20 64 69 72 66 64 2c 20 20 20  .  int dirfd,   
1c100 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69             /* Di
1c110 72 65 63 74 6f 72 79 20 66 69 6c 65 20 64 65 73  rectory file des
1c120 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 73 71 6c  criptor */.  sql
1c130 69 74 65 33 5f 66 69 6c 65 20 2a 70 49 64 2c 20  ite3_file *pId, 
1c140 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 6f       /* Write to
1c150 20 74 68 65 20 75 6e 69 78 46 69 6c 65 20 73 74   the unixFile st
1c160 72 75 63 74 75 72 65 20 68 65 72 65 20 2a 2f 0a  ructure here */.
1c170 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
1c180 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d  ilename,  /* Nam
1c190 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 62 65  e of the file be
1c1a0 69 6e 67 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20  ing opened */.  
1c1b0 69 6e 74 20 6e 6f 4c 6f 63 6b 2c 20 20 20 20 20  int noLock,     
1c1c0 20 20 20 20 20 20 20 20 2f 2a 20 4f 6d 69 74 20          /* Omit 
1c1d0 6c 6f 63 6b 69 6e 67 20 69 66 20 74 72 75 65 20  locking if true 
1c1e0 2a 2f 0a 20 20 69 6e 74 20 69 73 44 65 6c 65 74  */.  int isDelet
1c1f0 65 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e            /* 
1c200 44 65 6c 65 74 65 20 6f 6e 20 63 6c 6f 73 65 20  Delete on close 
1c210 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20  if true */.){.  
1c220 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f  const sqlite3_io
1c230 5f 6d 65 74 68 6f 64 73 20 2a 70 4c 6f 63 6b 69  _methods *pLocki
1c240 6e 67 53 74 79 6c 65 3b 0a 20 20 75 6e 69 78 46  ngStyle;.  unixF
1c250 69 6c 65 20 2a 70 4e 65 77 20 3d 20 28 75 6e 69  ile *pNew = (uni
1c260 78 46 69 6c 65 20 2a 29 70 49 64 3b 0a 20 20 69  xFile *)pId;.  i
1c270 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1c280 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4e  K;..  assert( pN
1c290 65 77 2d 3e 70 4c 6f 63 6b 3d 3d 4e 55 4c 4c 20  ew->pLock==NULL 
1c2a0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65  );.  assert( pNe
1c2b0 77 2d 3e 70 4f 70 65 6e 3d 3d 4e 55 4c 4c 20 29  w->pOpen==NULL )
1c2c0 3b 0a 0a 20 20 2f 2a 20 50 61 72 61 6d 65 74 65  ;..  /* Paramete
1c2d0 72 20 69 73 44 65 6c 65 74 65 20 69 73 20 6f 6e  r isDelete is on
1c2e0 6c 79 20 75 73 65 64 20 6f 6e 20 76 78 77 6f 72  ly used on vxwor
1c2f0 6b 73 2e 20 45 78 70 72 65 73 73 20 74 68 69 73  ks. Express this
1c300 20 65 78 70 6c 69 63 69 74 6c 79 20 0a 20 20 2a   explicitly .  *
1c310 2a 20 68 65 72 65 20 74 6f 20 70 72 65 76 65 6e  * here to preven
1c320 74 20 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69  t compiler warni
1c330 6e 67 73 20 61 62 6f 75 74 20 75 6e 75 73 65 64  ngs about unused
1c340 20 70 61 72 61 6d 65 74 65 72 73 2e 0a 20 20 2a   parameters..  *
1c350 2f 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  /.  UNUSED_PARAM
1c360 45 54 45 52 28 69 73 44 65 6c 65 74 65 29 3b 0a  ETER(isDelete);.
1c370 0a 20 20 4f 53 54 52 41 43 45 33 28 22 4f 50 45  .  OSTRACE3("OPE
1c380 4e 20 20 20 20 25 2d 33 64 20 25 73 5c 6e 22 2c  N    %-3d %s\n",
1c390 20 68 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 20   h, zFilename); 
1c3a0 20 20 20 0a 20 20 70 4e 65 77 2d 3e 68 20 3d 20     .  pNew->h = 
1c3b0 68 3b 0a 20 20 70 4e 65 77 2d 3e 64 69 72 66 64  h;.  pNew->dirfd
1c3c0 20 3d 20 64 69 72 66 64 3b 0a 20 20 53 45 54 5f   = dirfd;.  SET_
1c3d0 54 48 52 45 41 44 49 44 28 70 4e 65 77 29 3b 0a  THREADID(pNew);.
1c3e0 20 20 70 4e 65 77 2d 3e 66 69 6c 65 46 6c 61 67    pNew->fileFlag
1c3f0 73 20 3d 20 30 3b 0a 0a 23 69 66 20 4f 53 5f 56  s = 0;..#if OS_V
1c400 58 57 4f 52 4b 53 0a 20 20 70 4e 65 77 2d 3e 70  XWORKS.  pNew->p
1c410 49 64 20 3d 20 76 78 77 6f 72 6b 73 46 69 6e 64  Id = vxworksFind
1c420 46 69 6c 65 49 64 28 7a 46 69 6c 65 6e 61 6d 65  FileId(zFilename
1c430 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e 70  );.  if( pNew->p
1c440 49 64 3d 3d 30 20 29 7b 0a 20 20 20 20 6e 6f 4c  Id==0 ){.    noL
1c450 6f 63 6b 20 3d 20 31 3b 0a 20 20 20 20 72 63 20  ock = 1;.    rc 
1c460 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
1c470 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66    }.#endif..  if
1c480 28 20 6e 6f 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  ( noLock ){.    
1c490 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 20  pLockingStyle = 
1c4a0 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73  &nolockIoMethods
1c4b0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
1c4c0 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 20 28  LockingStyle = (
1c4d0 2a 2a 28 66 69 6e 64 65 72 5f 74 79 70 65 2a 29  **(finder_type*)
1c4e0 70 56 66 73 2d 3e 70 41 70 70 44 61 74 61 29 28  pVfs->pAppData)(
1c4f0 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 4e 65 77 29  zFilename, pNew)
1c500 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  ;.#if SQLITE_ENA
1c510 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
1c520 45 0a 20 20 20 20 2f 2a 20 43 61 63 68 65 20 7a  E.    /* Cache z
1c530 46 69 6c 65 6e 61 6d 65 20 69 6e 20 74 68 65 20  Filename in the 
1c540 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20  locking context 
1c550 28 41 46 50 20 61 6e 64 20 64 6f 74 6c 6f 63 6b  (AFP and dotlock
1c560 20 6f 76 65 72 72 69 64 65 29 20 66 6f 72 0a 20   override) for. 
1c570 20 20 20 2a 2a 20 70 72 6f 78 79 4c 6f 63 6b 20     ** proxyLock 
1c580 61 63 74 69 76 61 74 69 6f 6e 20 69 73 20 70 6f  activation is po
1c590 73 73 69 62 6c 65 20 28 72 65 6d 6f 74 65 20 70  ssible (remote p
1c5a0 72 6f 78 79 20 69 73 20 62 61 73 65 64 20 6f 6e  roxy is based on
1c5b0 20 64 62 20 6e 61 6d 65 29 0a 20 20 20 20 2a 2a   db name).    **
1c5c0 20 7a 46 69 6c 65 6e 61 6d 65 20 72 65 6d 61 69   zFilename remai
1c5d0 6e 73 20 76 61 6c 69 64 20 75 6e 74 69 6c 20 66  ns valid until f
1c5e0 69 6c 65 20 69 73 20 63 6c 6f 73 65 64 2c 20 74  ile is closed, t
1c5f0 6f 20 73 75 70 70 6f 72 74 20 2a 2f 0a 20 20 20  o support */.   
1c600 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f   pNew->lockingCo
1c610 6e 74 65 78 74 20 3d 20 28 76 6f 69 64 2a 29 7a  ntext = (void*)z
1c620 46 69 6c 65 6e 61 6d 65 3b 0a 23 65 6e 64 69 66  Filename;.#endif
1c630 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4c 6f 63  .  }..  if( pLoc
1c640 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26 70 6f  kingStyle == &po
1c650 73 69 78 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a  sixIoMethods ){.
1c660 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74      unixEnterMut
1c670 65 78 28 29 3b 0a 20 20 20 20 72 63 20 3d 20 66  ex();.    rc = f
1c680 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28 70 4e 65 77  indLockInfo(pNew
1c690 2c 20 26 70 4e 65 77 2d 3e 70 4c 6f 63 6b 2c 20  , &pNew->pLock, 
1c6a0 26 70 4e 65 77 2d 3e 70 4f 70 65 6e 29 3b 0a 20  &pNew->pOpen);. 
1c6b0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1c6c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a  E_OK ){.      /*
1c6d0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
1c6e0 75 72 65 64 20 69 6e 20 66 69 6e 64 4c 6f 63 6b  ured in findLock
1c6f0 49 6e 66 6f 28 29 2c 20 63 6c 6f 73 65 20 74 68  Info(), close th
1c700 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
1c710 72 0a 20 20 20 20 20 20 2a 2a 20 69 6d 6d 65 64  r.      ** immed
1c720 69 61 74 65 6c 79 2c 20 62 65 66 6f 72 65 20 72  iately, before r
1c730 65 6c 65 61 73 69 6e 67 20 74 68 65 20 6d 75 74  eleasing the mut
1c740 65 78 2e 20 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f  ex. findLockInfo
1c750 28 29 20 6d 61 79 20 66 61 69 6c 0a 20 20 20 20  () may fail.    
1c760 20 20 2a 2a 20 69 6e 20 74 77 6f 20 73 63 65 6e    ** in two scen
1c770 61 72 69 6f 73 3a 0a 20 20 20 20 20 20 2a 2a 0a  arios:.      **.
1c780 20 20 20 20 20 20 2a 2a 20 20 20 28 61 29 20 41        **   (a) A
1c790 20 63 61 6c 6c 20 74 6f 20 66 73 74 61 74 28 29   call to fstat()
1c7a0 20 66 61 69 6c 65 64 2e 0a 20 20 20 20 20 20 2a   failed..      *
1c7b0 2a 20 20 20 28 62 29 20 41 20 6d 61 6c 6c 6f 63  *   (b) A malloc
1c7c0 20 66 61 69 6c 65 64 2e 0a 20 20 20 20 20 20 2a   failed..      *
1c7d0 2a 0a 20 20 20 20 20 20 2a 2a 20 53 63 65 6e 61  *.      ** Scena
1c7e0 72 69 6f 20 28 62 29 20 6d 61 79 20 6f 6e 6c 79  rio (b) may only
1c7f0 20 6f 63 63 75 72 20 69 66 20 74 68 65 20 70 72   occur if the pr
1c800 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 69 6e 67  ocess is holding
1c810 20 6e 6f 20 6f 74 68 65 72 0a 20 20 20 20 20 20   no other.      
1c820 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ** file descript
1c830 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20  ors open on the 
1c840 73 61 6d 65 20 66 69 6c 65 2e 20 49 66 20 74 68  same file. If th
1c850 65 72 65 20 77 65 72 65 20 6f 74 68 65 72 20 66  ere were other f
1c860 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 64 65 73  ile.      ** des
1c870 63 72 69 70 74 6f 72 73 20 6f 6e 20 74 68 69 73  criptors on this
1c880 20 66 69 6c 65 2c 20 74 68 65 6e 20 6e 6f 20 6d   file, then no m
1c890 61 6c 6c 6f 63 20 77 6f 75 6c 64 20 62 65 20 72  alloc would be r
1c8a0 65 71 75 69 72 65 64 20 62 79 0a 20 20 20 20 20  equired by.     
1c8b0 20 2a 2a 20 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f   ** findLockInfo
1c8c0 28 29 2e 20 49 66 20 74 68 69 73 20 69 73 20 74  (). If this is t
1c8d0 68 65 20 63 61 73 65 2c 20 69 74 20 69 73 20 71  he case, it is q
1c8e0 75 69 74 65 20 73 61 66 65 20 74 6f 20 63 6c 6f  uite safe to clo
1c8f0 73 65 0a 20 20 20 20 20 20 2a 2a 20 68 61 6e 64  se.      ** hand
1c900 6c 65 20 68 20 2d 20 61 73 20 69 74 20 69 73 20  le h - as it is 
1c910 67 75 61 72 61 6e 74 65 65 64 20 74 68 61 74 20  guaranteed that 
1c920 6e 6f 20 70 6f 73 69 78 20 6c 6f 63 6b 73 20 77  no posix locks w
1c930 69 6c 6c 20 62 65 20 72 65 6c 65 61 73 65 64 0a  ill be released.
1c940 20 20 20 20 20 20 2a 2a 20 62 79 20 64 6f 69 6e        ** by doin
1c950 67 20 73 6f 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  g so..      **. 
1c960 20 20 20 20 20 2a 2a 20 49 66 20 73 63 65 6e 61       ** If scena
1c970 72 69 6f 20 28 61 29 20 63 61 75 73 65 64 20 74  rio (a) caused t
1c980 68 65 20 65 72 72 6f 72 20 74 68 65 6e 20 74 68  he error then th
1c990 69 6e 67 73 20 61 72 65 20 6e 6f 74 20 73 6f 20  ings are not so 
1c9a0 73 61 66 65 2e 20 54 68 65 0a 20 20 20 20 20 20  safe. The.      
1c9b0 2a 2a 20 69 6d 70 6c 69 63 69 74 20 61 73 73 75  ** implicit assu
1c9c0 6d 70 74 69 6f 6e 20 68 65 72 65 20 69 73 20 74  mption here is t
1c9d0 68 61 74 20 69 66 20 66 73 74 61 74 28 29 20 66  hat if fstat() f
1c9e0 61 69 6c 73 2c 20 74 68 69 6e 67 73 20 61 72 65  ails, things are
1c9f0 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 73 75 63   in.      ** suc
1ca00 68 20 62 61 64 20 73 68 61 70 65 20 74 68 61 74  h bad shape that
1ca10 20 64 72 6f 70 70 69 6e 67 20 61 20 6c 6f 63 6b   dropping a lock
1ca20 20 6f 72 20 74 77 6f 20 64 6f 65 73 6e 27 74 20   or two doesn't 
1ca30 6d 61 74 74 65 72 20 6d 75 63 68 2e 0a 20 20 20  matter much..   
1ca40 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 6c 6f 73     */.      clos
1ca50 65 28 68 29 3b 0a 20 20 20 20 20 20 68 20 3d 20  e(h);.      h = 
1ca60 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e  -1;.    }.    un
1ca70 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
1ca80 20 20 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f    }..#if SQLITE_
1ca90 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
1caa0 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28  TYLE && defined(
1cab0 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 65 6c 73  __APPLE__).  els
1cac0 65 20 69 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74  e if( pLockingSt
1cad0 79 6c 65 20 3d 3d 20 26 61 66 70 49 6f 4d 65 74  yle == &afpIoMet
1cae0 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f 2a 20 41  hods ){.    /* A
1caf0 46 50 20 6c 6f 63 6b 69 6e 67 20 75 73 65 73 20  FP locking uses 
1cb00 74 68 65 20 66 69 6c 65 20 70 61 74 68 20 73 6f  the file path so
1cb10 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20   it needs to be 
1cb20 69 6e 63 6c 75 64 65 64 20 69 6e 0a 20 20 20 20  included in.    
1cb30 2a 2a 20 74 68 65 20 61 66 70 4c 6f 63 6b 69 6e  ** the afpLockin
1cb40 67 43 6f 6e 74 65 78 74 2e 0a 20 20 20 20 2a 2f  gContext..    */
1cb50 0a 20 20 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43  .    afpLockingC
1cb60 6f 6e 74 65 78 74 20 2a 70 43 74 78 3b 0a 20 20  ontext *pCtx;.  
1cb70 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43    pNew->lockingC
1cb80 6f 6e 74 65 78 74 20 3d 20 70 43 74 78 20 3d 20  ontext = pCtx = 
1cb90 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20  sqlite3_malloc( 
1cba0 73 69 7a 65 6f 66 28 2a 70 43 74 78 29 20 29 3b  sizeof(*pCtx) );
1cbb0 0a 20 20 20 20 69 66 28 20 70 43 74 78 3d 3d 30  .    if( pCtx==0
1cbc0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
1cbd0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
1cbe0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
1cbf0 20 4e 42 3a 20 7a 46 69 6c 65 6e 61 6d 65 20 65   NB: zFilename e
1cc00 78 69 73 74 73 20 61 6e 64 20 72 65 6d 61 69 6e  xists and remain
1cc10 73 20 76 61 6c 69 64 20 75 6e 74 69 6c 20 74 68  s valid until th
1cc20 65 20 66 69 6c 65 20 69 73 20 63 6c 6f 73 65 64  e file is closed
1cc30 0a 20 20 20 20 20 20 2a 2a 20 61 63 63 6f 72 64  .      ** accord
1cc40 69 6e 67 20 74 6f 20 72 65 71 75 69 72 65 6d 65  ing to requireme
1cc50 6e 74 20 46 31 31 31 34 31 2e 20 20 53 6f 20 77  nt F11141.  So w
1cc60 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f  e do not need to
1cc70 20 6d 61 6b 65 20 61 0a 20 20 20 20 20 20 2a 2a   make a.      **
1cc80 20 63 6f 70 79 20 6f 66 20 74 68 65 20 66 69 6c   copy of the fil
1cc90 65 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 20 20  ename. */.      
1cca0 70 43 74 78 2d 3e 64 62 50 61 74 68 20 3d 20 7a  pCtx->dbPath = z
1ccb0 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 20 20  Filename;.      
1ccc0 73 72 61 6e 64 6f 6d 64 65 76 28 29 3b 0a 20 20  srandomdev();.  
1ccd0 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74      unixEnterMut
1cce0 65 78 28 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  ex();.      rc =
1ccf0 20 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28 70 4e   findLockInfo(pN
1cd00 65 77 2c 20 4e 55 4c 4c 2c 20 26 70 4e 65 77 2d  ew, NULL, &pNew-
1cd10 3e 70 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 75  >pOpen);.      u
1cd20 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
1cd30 20 20 20 20 20 20 20 20 0a 20 20 20 20 7d 0a 20          .    }. 
1cd40 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 65 6c 73   }.#endif..  els
1cd50 65 20 69 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74  e if( pLockingSt
1cd60 79 6c 65 20 3d 3d 20 26 64 6f 74 6c 6f 63 6b 49  yle == &dotlockI
1cd70 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20  oMethods ){.    
1cd80 2f 2a 20 44 6f 74 66 69 6c 65 20 6c 6f 63 6b 69  /* Dotfile locki
1cd90 6e 67 20 75 73 65 73 20 74 68 65 20 66 69 6c 65  ng uses the file
1cda0 20 70 61 74 68 20 73 6f 20 69 74 20 6e 65 65 64   path so it need
1cdb0 73 20 74 6f 20 62 65 20 69 6e 63 6c 75 64 65 64  s to be included
1cdc0 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 64   in.    ** the d
1cdd0 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e  otlockLockingCon
1cde0 74 65 78 74 20 0a 20 20 20 20 2a 2f 0a 20 20 20  text .    */.   
1cdf0 20 63 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65   char *zLockFile
1ce00 3b 0a 20 20 20 20 69 6e 74 20 6e 46 69 6c 65 6e  ;.    int nFilen
1ce10 61 6d 65 3b 0a 20 20 20 20 6e 46 69 6c 65 6e 61  ame;.    nFilena
1ce20 6d 65 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e  me = (int)strlen
1ce30 28 7a 46 69 6c 65 6e 61 6d 65 29 20 2b 20 36 3b  (zFilename) + 6;
1ce40 0a 20 20 20 20 7a 4c 6f 63 6b 46 69 6c 65 20 3d  .    zLockFile =
1ce50 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33   (char *)sqlite3
1ce60 5f 6d 61 6c 6c 6f 63 28 6e 46 69 6c 65 6e 61 6d  _malloc(nFilenam
1ce70 65 29 3b 0a 20 20 20 20 69 66 28 20 7a 4c 6f 63  e);.    if( zLoc
1ce80 6b 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20  kFile==0 ){.    
1ce90 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
1cea0 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  MEM;.    }else{.
1ceb0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
1cec0 70 72 69 6e 74 66 28 6e 46 69 6c 65 6e 61 6d 65  printf(nFilename
1ced0 2c 20 7a 4c 6f 63 6b 46 69 6c 65 2c 20 22 25 73  , zLockFile, "%s
1cee0 22 20 44 4f 54 4c 4f 43 4b 5f 53 55 46 46 49 58  " DOTLOCK_SUFFIX
1cef0 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  , zFilename);.  
1cf00 20 20 7d 0a 20 20 20 20 70 4e 65 77 2d 3e 6c 6f    }.    pNew->lo
1cf10 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20 7a  ckingContext = z
1cf20 4c 6f 63 6b 46 69 6c 65 3b 0a 20 20 7d 0a 0a 23  LockFile;.  }..#
1cf30 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  if OS_VXWORKS.  
1cf40 65 6c 73 65 20 69 66 28 20 70 4c 6f 63 6b 69 6e  else if( pLockin
1cf50 67 53 74 79 6c 65 20 3d 3d 20 26 73 65 6d 49 6f  gStyle == &semIo
1cf60 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f  Methods ){.    /
1cf70 2a 20 4e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72  * Named semaphor
1cf80 65 20 6c 6f 63 6b 69 6e 67 20 75 73 65 73 20 74  e locking uses t
1cf90 68 65 20 66 69 6c 65 20 70 61 74 68 20 73 6f 20  he file path so 
1cfa0 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20  it needs to be. 
1cfb0 20 20 20 2a 2a 20 69 6e 63 6c 75 64 65 64 20 69     ** included i
1cfc0 6e 20 74 68 65 20 73 65 6d 4c 6f 63 6b 69 6e 67  n the semLocking
1cfd0 43 6f 6e 74 65 78 74 0a 20 20 20 20 2a 2f 0a 20  Context.    */. 
1cfe0 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65     unixEnterMute
1cff0 78 28 29 3b 0a 20 20 20 20 72 63 20 3d 20 66 69  x();.    rc = fi
1d000 6e 64 4c 6f 63 6b 49 6e 66 6f 28 70 4e 65 77 2c  ndLockInfo(pNew,
1d010 20 26 70 4e 65 77 2d 3e 70 4c 6f 63 6b 2c 20 26   &pNew->pLock, &
1d020 70 4e 65 77 2d 3e 70 4f 70 65 6e 29 3b 0a 20 20  pNew->pOpen);.  
1d030 20 20 69 66 28 20 28 72 63 3d 3d 53 51 4c 49 54    if( (rc==SQLIT
1d040 45 5f 4f 4b 29 20 26 26 20 28 70 4e 65 77 2d 3e  E_OK) && (pNew->
1d050 70 4f 70 65 6e 2d 3e 70 53 65 6d 3d 3d 4e 55 4c  pOpen->pSem==NUL
1d060 4c 29 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72  L) ){.      char
1d070 20 2a 7a 53 65 6d 4e 61 6d 65 20 3d 20 70 4e 65   *zSemName = pNe
1d080 77 2d 3e 70 4f 70 65 6e 2d 3e 61 53 65 6d 4e 61  w->pOpen->aSemNa
1d090 6d 65 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b  me;.      int n;
1d0a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
1d0b0 6e 70 72 69 6e 74 66 28 4d 41 58 5f 50 41 54 48  nprintf(MAX_PATH
1d0c0 4e 41 4d 45 2c 20 7a 53 65 6d 4e 61 6d 65 2c 20  NAME, zSemName, 
1d0d0 22 2f 25 73 2e 73 65 6d 22 2c 0a 20 20 20 20 20  "/%s.sem",.     
1d0e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d0f0 20 20 70 4e 65 77 2d 3e 70 49 64 2d 3e 7a 43 61    pNew->pId->zCa
1d100 6e 6f 6e 69 63 61 6c 4e 61 6d 65 29 3b 0a 20 20  nonicalName);.  
1d110 20 20 20 20 66 6f 72 28 20 6e 3d 31 3b 20 7a 53      for( n=1; zS
1d120 65 6d 4e 61 6d 65 5b 6e 5d 3b 20 6e 2b 2b 20 29  emName[n]; n++ )
1d130 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 53 65  .        if( zSe
1d140 6d 4e 61 6d 65 5b 6e 5d 3d 3d 27 2f 27 20 29 20  mName[n]=='/' ) 
1d150 7a 53 65 6d 4e 61 6d 65 5b 6e 5d 20 3d 20 27 5f  zSemName[n] = '_
1d160 27 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  ';.      pNew->p
1d170 4f 70 65 6e 2d 3e 70 53 65 6d 20 3d 20 73 65 6d  Open->pSem = sem
1d180 5f 6f 70 65 6e 28 7a 53 65 6d 4e 61 6d 65 2c 20  _open(zSemName, 
1d190 4f 5f 43 52 45 41 54 2c 20 30 36 36 36 2c 20 31  O_CREAT, 0666, 1
1d1a0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65  );.      if( pNe
1d1b0 77 2d 3e 70 4f 70 65 6e 2d 3e 70 53 65 6d 20 3d  w->pOpen->pSem =
1d1c0 3d 20 53 45 4d 5f 46 41 49 4c 45 44 20 29 7b 0a  = SEM_FAILED ){.
1d1d0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
1d1e0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
1d1f0 20 20 20 70 4e 65 77 2d 3e 70 4f 70 65 6e 2d 3e     pNew->pOpen->
1d200 61 53 65 6d 4e 61 6d 65 5b 30 5d 20 3d 20 27 5c  aSemName[0] = '\
1d210 30 27 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0';.      }.    
1d220 7d 0a 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d  }.    unixLeaveM
1d230 75 74 65 78 28 29 3b 0a 20 20 7d 0a 23 65 6e 64  utex();.  }.#end
1d240 69 66 0a 20 20 0a 20 20 70 4e 65 77 2d 3e 6c 61  if.  .  pNew->la
1d250 73 74 45 72 72 6e 6f 20 3d 20 30 3b 0a 23 69 66  stErrno = 0;.#if
1d260 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 69 66   OS_VXWORKS.  if
1d270 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1d280 29 7b 0a 20 20 20 20 75 6e 6c 69 6e 6b 28 7a 46  ){.    unlink(zF
1d290 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 69 73  ilename);.    is
1d2a0 44 65 6c 65 74 65 20 3d 20 30 3b 0a 20 20 7d 0a  Delete = 0;.  }.
1d2b0 20 20 70 4e 65 77 2d 3e 69 73 44 65 6c 65 74 65    pNew->isDelete
1d2c0 20 3d 20 69 73 44 65 6c 65 74 65 3b 0a 23 65 6e   = isDelete;.#en
1d2d0 64 69 66 0a 20 20 69 66 28 20 72 63 21 3d 53 51  dif.  if( rc!=SQ
1d2e0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
1d2f0 66 28 20 64 69 72 66 64 3e 3d 30 20 29 20 63 6c  f( dirfd>=0 ) cl
1d300 6f 73 65 28 64 69 72 66 64 29 3b 20 2f 2a 20 73  ose(dirfd); /* s
1d310 69 6c 65 6e 74 20 6c 65 61 6b 20 69 66 20 66 61  ilent leak if fa
1d320 69 6c 2c 20 61 6c 72 65 61 64 79 20 69 6e 20 65  il, already in e
1d330 72 72 6f 72 20 2a 2f 0a 20 20 20 20 69 66 28 20  rror */.    if( 
1d340 68 3e 3d 30 20 29 20 63 6c 6f 73 65 28 68 29 3b  h>=0 ) close(h);
1d350 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4e  .  }else{.    pN
1d360 65 77 2d 3e 70 4d 65 74 68 6f 64 20 3d 20 70 4c  ew->pMethod = pL
1d370 6f 63 6b 69 6e 67 53 74 79 6c 65 3b 0a 20 20 20  ockingStyle;.   
1d380 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2b 31 29   OpenCounter(+1)
1d390 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
1d3a0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e  c;.}../*.** Open
1d3b0 20 61 20 66 69 6c 65 20 64 65 73 63 72 69 70 74   a file descript
1d3c0 6f 72 20 74 6f 20 74 68 65 20 64 69 72 65 63 74  or to the direct
1d3d0 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20 66  ory containing f
1d3e0 69 6c 65 20 7a 46 69 6c 65 6e 61 6d 65 2e 0a 2a  ile zFilename..*
1d3f0 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
1d400 20 2a 70 46 64 20 69 73 20 73 65 74 20 74 6f 20   *pFd is set to 
1d410 74 68 65 20 6f 70 65 6e 65 64 20 66 69 6c 65 20  the opened file 
1d420 64 65 73 63 72 69 70 74 6f 72 20 61 6e 64 0a 2a  descriptor and.*
1d430 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
1d440 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 65  eturned. If an e
1d450 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 65 69 74  rror occurs, eit
1d460 68 65 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  her SQLITE_NOMEM
1d470 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 43 41  .** or SQLITE_CA
1d480 4e 54 4f 50 45 4e 20 69 73 20 72 65 74 75 72 6e  NTOPEN is return
1d490 65 64 20 61 6e 64 20 2a 70 46 64 20 69 73 20 73  ed and *pFd is s
1d4a0 65 74 20 74 6f 20 61 6e 20 75 6e 64 65 66 69 6e  et to an undefin
1d4b0 65 64 0a 2a 2a 20 76 61 6c 75 65 2e 0a 2a 2a 0a  ed.** value..**.
1d4c0 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 4f 4b 20  ** If SQLITE_OK 
1d4d0 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65  is returned, the
1d4e0 20 63 61 6c 6c 65 72 20 69 73 20 72 65 73 70 6f   caller is respo
1d4f0 6e 73 69 62 6c 65 20 66 6f 72 20 63 6c 6f 73 69  nsible for closi
1d500 6e 67 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20 64  ng.** the file d
1d510 65 73 63 72 69 70 74 6f 72 20 2a 70 46 64 20 75  escriptor *pFd u
1d520 73 69 6e 67 20 63 6c 6f 73 65 28 29 2e 0a 2a 2f  sing close()..*/
1d530 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 70 65 6e  .static int open
1d540 44 69 72 65 63 74 6f 72 79 28 63 6f 6e 73 74 20  Directory(const 
1d550 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
1d560 20 69 6e 74 20 2a 70 46 64 29 7b 0a 20 20 69 6e   int *pFd){.  in
1d570 74 20 69 69 3b 0a 20 20 69 6e 74 20 66 64 20 3d  t ii;.  int fd =
1d580 20 2d 31 3b 0a 20 20 63 68 61 72 20 7a 44 69 72   -1;.  char zDir
1d590 6e 61 6d 65 5b 4d 41 58 5f 50 41 54 48 4e 41 4d  name[MAX_PATHNAM
1d5a0 45 2b 31 5d 3b 0a 0a 20 20 73 71 6c 69 74 65 33  E+1];..  sqlite3
1d5b0 5f 73 6e 70 72 69 6e 74 66 28 4d 41 58 5f 50 41  _snprintf(MAX_PA
1d5c0 54 48 4e 41 4d 45 2c 20 7a 44 69 72 6e 61 6d 65  THNAME, zDirname
1d5d0 2c 20 22 25 73 22 2c 20 7a 46 69 6c 65 6e 61 6d  , "%s", zFilenam
1d5e0 65 29 3b 0a 20 20 66 6f 72 28 69 69 3d 28 69 6e  e);.  for(ii=(in
1d5f0 74 29 73 74 72 6c 65 6e 28 7a 44 69 72 6e 61 6d  t)strlen(zDirnam
1d600 65 29 3b 20 69 69 3e 31 20 26 26 20 7a 44 69 72  e); ii>1 && zDir
1d610 6e 61 6d 65 5b 69 69 5d 21 3d 27 2f 27 3b 20 69  name[ii]!='/'; i
1d620 69 2d 2d 29 3b 0a 20 20 69 66 28 20 69 69 3e 30  i--);.  if( ii>0
1d630 20 29 7b 0a 20 20 20 20 7a 44 69 72 6e 61 6d 65   ){.    zDirname
1d640 5b 69 69 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20  [ii] = '\0';.   
1d650 20 66 64 20 3d 20 6f 70 65 6e 28 7a 44 69 72 6e   fd = open(zDirn
1d660 61 6d 65 2c 20 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f  ame, O_RDONLY|O_
1d670 42 49 4e 41 52 59 2c 20 30 29 3b 0a 20 20 20 20  BINARY, 0);.    
1d680 69 66 28 20 66 64 3e 3d 30 20 29 7b 0a 23 69 66  if( fd>=0 ){.#if
1d690 64 65 66 20 46 44 5f 43 4c 4f 45 58 45 43 0a 20  def FD_CLOEXEC. 
1d6a0 20 20 20 20 20 66 63 6e 74 6c 28 66 64 2c 20 46       fcntl(fd, F
1d6b0 5f 53 45 54 46 44 2c 20 66 63 6e 74 6c 28 66 64  _SETFD, fcntl(fd
1d6c0 2c 20 46 5f 47 45 54 46 44 2c 20 30 29 20 7c 20  , F_GETFD, 0) | 
1d6d0 46 44 5f 43 4c 4f 45 58 45 43 29 3b 0a 23 65 6e  FD_CLOEXEC);.#en
1d6e0 64 69 66 0a 20 20 20 20 20 20 4f 53 54 52 41 43  dif.      OSTRAC
1d6f0 45 33 28 22 4f 50 45 4e 44 49 52 20 25 2d 33 64  E3("OPENDIR %-3d
1d700 20 25 73 5c 6e 22 2c 20 66 64 2c 20 7a 44 69 72   %s\n", fd, zDir
1d710 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  name);.    }.  }
1d720 0a 20 20 2a 70 46 64 20 3d 20 66 64 3b 0a 20 20  .  *pFd = fd;.  
1d730 72 65 74 75 72 6e 20 28 66 64 3e 3d 30 3f 53 51  return (fd>=0?SQ
1d740 4c 49 54 45 5f 4f 4b 3a 53 51 4c 49 54 45 5f 43  LITE_OK:SQLITE_C
1d750 41 4e 54 4f 50 45 4e 29 3b 0a 7d 0a 0a 2f 2a 0a  ANTOPEN);.}../*.
1d760 2a 2a 20 43 72 65 61 74 65 20 61 20 74 65 6d 70  ** Create a temp
1d770 6f 72 61 72 79 20 66 69 6c 65 20 6e 61 6d 65 20  orary file name 
1d780 69 6e 20 7a 42 75 66 2e 20 20 7a 42 75 66 20 6d  in zBuf.  zBuf m
1d790 75 73 74 20 62 65 20 61 6c 6c 6f 63 61 74 65 64  ust be allocated
1d7a0 0a 2a 2a 20 62 79 20 74 68 65 20 63 61 6c 6c 69  .** by the calli
1d7b0 6e 67 20 70 72 6f 63 65 73 73 20 61 6e 64 20 6d  ng process and m
1d7c0 75 73 74 20 62 65 20 62 69 67 20 65 6e 6f 75 67  ust be big enoug
1d7d0 68 20 74 6f 20 68 6f 6c 64 20 61 74 20 6c 65 61  h to hold at lea
1d7e0 73 74 0a 2a 2a 20 70 56 66 73 2d 3e 6d 78 50 61  st.** pVfs->mxPa
1d7f0 74 68 6e 61 6d 65 20 62 79 74 65 73 2e 0a 2a 2f  thname bytes..*/
1d800 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 54  .static int getT
1d810 65 6d 70 6e 61 6d 65 28 69 6e 74 20 6e 42 75 66  empname(int nBuf
1d820 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20  , char *zBuf){. 
1d830 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68   static const ch
1d840 61 72 20 2a 61 7a 44 69 72 73 5b 5d 20 3d 20 7b  ar *azDirs[] = {
1d850 0a 20 20 20 20 20 30 2c 0a 20 20 20 20 20 30 2c  .     0,.     0,
1d860 0a 20 20 20 20 20 22 2f 76 61 72 2f 74 6d 70 22  .     "/var/tmp"
1d870 2c 0a 20 20 20 20 20 22 2f 75 73 72 2f 74 6d 70  ,.     "/usr/tmp
1d880 22 2c 0a 20 20 20 20 20 22 2f 74 6d 70 22 2c 0a  ",.     "/tmp",.
1d890 20 20 20 20 20 22 2e 22 2c 0a 20 20 7d 3b 0a 20       ".",.  };. 
1d8a0 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e   static const un
1d8b0 73 69 67 6e 65 64 20 63 68 61 72 20 7a 43 68 61  signed char zCha
1d8c0 72 73 5b 5d 20 3d 0a 20 20 20 20 22 61 62 63 64  rs[] =.    "abcd
1d8d0 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74  efghijklmnopqrst
1d8e0 75 76 77 78 79 7a 22 0a 20 20 20 20 22 41 42 43  uvwxyz".    "ABC
1d8f0 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53  DEFGHIJKLMNOPQRS
1d900 54 55 56 57 58 59 5a 22 0a 20 20 20 20 22 30 31  TUVWXYZ".    "01
1d910 32 33 34 35 36 37 38 39 22 3b 0a 20 20 75 6e 73  23456789";.  uns
1d920 69 67 6e 65 64 20 69 6e 74 20 69 2c 20 6a 3b 0a  igned int i, j;.
1d930 20 20 73 74 72 75 63 74 20 73 74 61 74 20 62 75    struct stat bu
1d940 66 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  f;.  const char 
1d950 2a 7a 44 69 72 20 3d 20 22 2e 22 3b 0a 0a 20 20  *zDir = ".";..  
1d960 2f 2a 20 49 74 27 73 20 6f 64 64 20 74 6f 20 73  /* It's odd to s
1d970 69 6d 75 6c 61 74 65 20 61 6e 20 69 6f 2d 65 72  imulate an io-er
1d980 72 6f 72 20 68 65 72 65 2c 20 62 75 74 20 72 65  ror here, but re
1d990 61 6c 6c 79 20 74 68 69 73 20 69 73 20 6a 75 73  ally this is jus
1d9a0 74 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 65  t.  ** using the
1d9b0 20 69 6f 2d 65 72 72 6f 72 20 69 6e 66 72 61 73   io-error infras
1d9c0 74 72 75 63 74 75 72 65 20 74 6f 20 74 65 73 74  tructure to test
1d9d0 20 74 68 61 74 20 53 51 4c 69 74 65 20 68 61 6e   that SQLite han
1d9e0 64 6c 65 73 20 74 68 69 73 0a 20 20 2a 2a 20 66  dles this.  ** f
1d9f0 75 6e 63 74 69 6f 6e 20 66 61 69 6c 69 6e 67 2e  unction failing.
1da00 20 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74   .  */.  Simulat
1da10 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
1da20 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 3b   SQLITE_IOERR );
1da30 0a 0a 20 20 61 7a 44 69 72 73 5b 30 5d 20 3d 20  ..  azDirs[0] = 
1da40 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72  sqlite3_temp_dir
1da50 65 63 74 6f 72 79 3b 0a 20 20 69 66 20 28 4e 55  ectory;.  if (NU
1da60 4c 4c 20 3d 3d 20 61 7a 44 69 72 73 5b 31 5d 29  LL == azDirs[1])
1da70 20 7b 0a 20 20 20 20 61 7a 44 69 72 73 5b 31 5d   {.    azDirs[1]
1da80 20 3d 20 67 65 74 65 6e 76 28 22 54 4d 50 44 49   = getenv("TMPDI
1da90 52 22 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 66 6f  R");.  }.  .  fo
1daa0 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28  r(i=0; i<sizeof(
1dab0 61 7a 44 69 72 73 29 2f 73 69 7a 65 6f 66 28 61  azDirs)/sizeof(a
1dac0 7a 44 69 72 73 5b 30 5d 29 3b 20 69 2b 2b 29 7b  zDirs[0]); i++){
1dad0 0a 20 20 20 20 69 66 28 20 61 7a 44 69 72 73 5b  .    if( azDirs[
1dae0 69 5d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  i]==0 ) continue
1daf0 3b 0a 20 20 20 20 69 66 28 20 73 74 61 74 28 61  ;.    if( stat(a
1db00 7a 44 69 72 73 5b 69 5d 2c 20 26 62 75 66 29 20  zDirs[i], &buf) 
1db10 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
1db20 69 66 28 20 21 53 5f 49 53 44 49 52 28 62 75 66  if( !S_ISDIR(buf
1db30 2e 73 74 5f 6d 6f 64 65 29 20 29 20 63 6f 6e 74  .st_mode) ) cont
1db40 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 61 63  inue;.    if( ac
1db50 63 65 73 73 28 61 7a 44 69 72 73 5b 69 5d 2c 20  cess(azDirs[i], 
1db60 30 37 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  07) ) continue;.
1db70 20 20 20 20 7a 44 69 72 20 3d 20 61 7a 44 69 72      zDir = azDir
1db80 73 5b 69 5d 3b 0a 20 20 20 20 62 72 65 61 6b 3b  s[i];.    break;
1db90 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  .  }..  /* Check
1dba0 20 74 68 61 74 20 74 68 65 20 6f 75 74 70 75 74   that the output
1dbb0 20 62 75 66 66 65 72 20 69 73 20 6c 61 72 67 65   buffer is large
1dbc0 20 65 6e 6f 75 67 68 20 66 6f 72 20 74 68 65 20   enough for the 
1dbd0 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 0a  temporary file .
1dbe0 20 20 2a 2a 20 6e 61 6d 65 2e 20 49 66 20 69 74    ** name. If it
1dbf0 20 69 73 20 6e 6f 74 2c 20 72 65 74 75 72 6e 20   is not, return 
1dc00 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 20 20  SQLITE_ERROR..  
1dc10 2a 2f 0a 20 20 69 66 28 20 28 73 74 72 6c 65 6e  */.  if( (strlen
1dc20 28 7a 44 69 72 29 20 2b 20 73 74 72 6c 65 6e 28  (zDir) + strlen(
1dc30 53 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45  SQLITE_TEMP_FILE
1dc40 5f 50 52 45 46 49 58 29 20 2b 20 31 37 29 20 3e  _PREFIX) + 17) >
1dc50 3d 20 28 73 69 7a 65 5f 74 29 6e 42 75 66 20 29  = (size_t)nBuf )
1dc60 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
1dc70 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  ITE_ERROR;.  }..
1dc80 20 20 64 6f 7b 0a 20 20 20 20 73 71 6c 69 74 65    do{.    sqlite
1dc90 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2d  3_snprintf(nBuf-
1dca0 31 37 2c 20 7a 42 75 66 2c 20 22 25 73 2f 22 53  17, zBuf, "%s/"S
1dcb0 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f  QLITE_TEMP_FILE_
1dcc0 50 52 45 46 49 58 2c 20 7a 44 69 72 29 3b 0a 20  PREFIX, zDir);. 
1dcd0 20 20 20 6a 20 3d 20 28 69 6e 74 29 73 74 72 6c     j = (int)strl
1dce0 65 6e 28 7a 42 75 66 29 3b 0a 20 20 20 20 73 71  en(zBuf);.    sq
1dcf0 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73  lite3_randomness
1dd00 28 31 35 2c 20 26 7a 42 75 66 5b 6a 5d 29 3b 0a  (15, &zBuf[j]);.
1dd10 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31      for(i=0; i<1
1dd20 35 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20  5; i++, j++){.  
1dd30 20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 28 63      zBuf[j] = (c
1dd40 68 61 72 29 7a 43 68 61 72 73 5b 20 28 28 75 6e  har)zChars[ ((un
1dd50 73 69 67 6e 65 64 20 63 68 61 72 29 7a 42 75 66  signed char)zBuf
1dd60 5b 6a 5d 29 25 28 73 69 7a 65 6f 66 28 7a 43 68  [j])%(sizeof(zCh
1dd70 61 72 73 29 2d 31 29 20 5d 3b 0a 20 20 20 20 7d  ars)-1) ];.    }
1dd80 0a 20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 30  .    zBuf[j] = 0
1dd90 3b 0a 20 20 7d 77 68 69 6c 65 28 20 61 63 63 65  ;.  }while( acce
1dda0 73 73 28 7a 42 75 66 2c 30 29 3d 3d 30 20 29 3b  ss(zBuf,0)==0 );
1ddb0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1ddc0 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49  _OK;.}..#if SQLI
1ddd0 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
1dde0 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e  G_STYLE && defin
1ddf0 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 2f 2a  ed(__APPLE__)./*
1de00 0a 2a 2a 20 52 6f 75 74 69 6e 65 20 74 6f 20 74  .** Routine to t
1de10 72 61 6e 73 66 6f 72 6d 20 61 20 75 6e 69 78 46  ransform a unixF
1de20 69 6c 65 20 69 6e 74 6f 20 61 20 70 72 6f 78 79  ile into a proxy
1de30 2d 6c 6f 63 6b 69 6e 67 20 75 6e 69 78 46 69 6c  -locking unixFil
1de40 65 2e 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61  e..** Implementa
1de50 74 69 6f 6e 20 69 6e 20 74 68 65 20 70 72 6f 78  tion in the prox
1de60 79 2d 6c 6f 63 6b 20 64 69 76 69 73 69 6f 6e 2c  y-lock division,
1de70 20 62 75 74 20 75 73 65 64 20 62 79 20 75 6e 69   but used by uni
1de80 78 4f 70 65 6e 28 29 0a 2a 2a 20 69 66 20 53 51  xOpen().** if SQ
1de90 4c 49 54 45 5f 50 52 45 46 45 52 5f 50 52 4f 58  LITE_PREFER_PROX
1dea0 59 5f 4c 4f 43 4b 49 4e 47 20 69 73 20 64 65 66  Y_LOCKING is def
1deb0 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ined..*/.static 
1dec0 69 6e 74 20 70 72 6f 78 79 54 72 61 6e 73 66 6f  int proxyTransfo
1ded0 72 6d 55 6e 69 78 46 69 6c 65 28 75 6e 69 78 46  rmUnixFile(unixF
1dee0 69 6c 65 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72  ile*, const char
1def0 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  *);.#endif../*.*
1df00 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61 6e 20  * Search for an 
1df10 75 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73 63  unused file desc
1df20 72 69 70 74 6f 72 20 74 68 61 74 20 77 61 73 20  riptor that was 
1df30 6f 70 65 6e 65 64 20 6f 6e 20 74 68 65 20 64 61  opened on the da
1df40 74 61 62 61 73 65 20 0a 2a 2a 20 66 69 6c 65 20  tabase .** file 
1df50 28 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 20 6f  (not a journal o
1df60 72 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  r master-journal
1df70 20 66 69 6c 65 29 20 69 64 65 6e 74 69 66 69 65   file) identifie
1df80 64 20 62 79 20 70 61 74 68 6e 61 6d 65 0a 2a 2a  d by pathname.**
1df90 20 7a 50 61 74 68 20 77 69 74 68 20 53 51 4c 49   zPath with SQLI
1dfa0 54 45 5f 4f 50 45 4e 5f 58 58 58 20 66 6c 61 67  TE_OPEN_XXX flag
1dfb0 73 20 6d 61 74 63 68 69 6e 67 20 74 68 6f 73 65  s matching those
1dfc0 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
1dfd0 65 63 6f 6e 64 0a 2a 2a 20 61 72 67 75 6d 65 6e  econd.** argumen
1dfe0 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  t to this functi
1dff0 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 53 75 63 68 20 61  on..**.** Such a
1e000 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
1e010 20 6d 61 79 20 65 78 69 73 74 20 69 66 20 61 20   may exist if a 
1e020 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
1e030 69 6f 6e 20 77 61 73 20 63 6c 6f 73 65 64 0a 2a  ion was closed.*
1e040 2a 20 62 75 74 20 74 68 65 20 61 73 73 6f 63 69  * but the associ
1e050 61 74 65 64 20 66 69 6c 65 20 64 65 73 63 72 69  ated file descri
1e060 70 74 6f 72 20 63 6f 75 6c 64 20 6e 6f 74 20 62  ptor could not b
1e070 65 20 63 6c 6f 73 65 64 20 62 65 63 61 75 73 65  e closed because
1e080 20 73 6f 6d 65 0a 2a 2a 20 6f 74 68 65 72 20 66   some.** other f
1e090 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f  ile descriptor o
1e0a0 70 65 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  pen on the same 
1e0b0 66 69 6c 65 20 69 73 20 68 6f 6c 64 69 6e 67 20  file is holding 
1e0c0 61 20 66 69 6c 65 2d 6c 6f 63 6b 2e 0a 2a 2a 20  a file-lock..** 
1e0d0 52 65 66 65 72 20 74 6f 20 63 6f 6d 6d 65 6e 74  Refer to comment
1e0e0 73 20 69 6e 20 74 68 65 20 75 6e 69 78 43 6c 6f  s in the unixClo
1e0f0 73 65 28 29 20 66 75 6e 63 74 69 6f 6e 20 61 6e  se() function an
1e100 64 20 74 68 65 20 6c 65 6e 67 74 68 79 20 63 6f  d the lengthy co
1e110 6d 6d 65 6e 74 0a 2a 2a 20 64 65 73 63 72 69 62  mment.** describ
1e120 69 6e 67 20 22 50 6f 73 69 78 20 41 64 76 69 73  ing "Posix Advis
1e130 6f 72 79 20 4c 6f 63 6b 69 6e 67 22 20 61 74 20  ory Locking" at 
1e140 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 69  the start of thi
1e150 73 20 66 69 6c 65 20 66 6f 72 20 0a 2a 2a 20 66  s file for .** f
1e160 75 72 74 68 65 72 20 64 65 74 61 69 6c 73 2e 20  urther details. 
1e170 41 6c 73 6f 2c 20 74 69 63 6b 65 74 20 23 34 30  Also, ticket #40
1e180 31 38 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 73  18..**.** If a s
1e190 75 69 74 61 62 6c 65 20 66 69 6c 65 20 64 65 73  uitable file des
1e1a0 63 72 69 70 74 6f 72 20 69 73 20 66 6f 75 6e 64  criptor is found
1e1b0 2c 20 74 68 65 6e 20 69 74 20 69 73 20 72 65 74  , then it is ret
1e1c0 75 72 6e 65 64 2e 20 49 66 20 6e 6f 0a 2a 2a 20  urned. If no.** 
1e1d0 73 75 63 68 20 66 69 6c 65 20 64 65 73 63 72 69  such file descri
1e1e0 70 74 6f 72 20 69 73 20 6c 6f 63 61 74 65 64 2c  ptor is located,
1e1f0 20 2d 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e   -1 is returned.
1e200 0a 2a 2f 0a 73 74 61 74 69 63 20 55 6e 69 78 55  .*/.static UnixU
1e210 6e 75 73 65 64 46 64 20 2a 66 69 6e 64 52 65 75  nusedFd *findReu
1e220 73 61 62 6c 65 46 64 28 63 6f 6e 73 74 20 63 68  sableFd(const ch
1e230 61 72 20 2a 7a 50 61 74 68 2c 20 69 6e 74 20 66  ar *zPath, int f
1e240 6c 61 67 73 29 7b 0a 20 20 55 6e 69 78 55 6e 75  lags){.  UnixUnu
1e250 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64 20 3d  sedFd *pUnused =
1e260 20 30 3b 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74   0;..  /* Do not
1e270 20 73 65 61 72 63 68 20 66 6f 72 20 61 6e 20 75   search for an u
1e280 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73 63 72  nused file descr
1e290 69 70 74 6f 72 20 6f 6e 20 76 78 77 6f 72 6b 73  iptor on vxworks
1e2a0 2e 20 4e 6f 74 20 62 65 63 61 75 73 65 0a 20 20  . Not because.  
1e2b0 2a 2a 20 76 78 77 6f 72 6b 73 20 77 6f 75 6c 64  ** vxworks would
1e2c0 20 6e 6f 74 20 62 65 6e 65 66 69 74 20 66 72 6f   not benefit fro
1e2d0 6d 20 74 68 65 20 63 68 61 6e 67 65 20 28 69 74  m the change (it
1e2e0 20 6d 69 67 68 74 2c 20 77 65 27 72 65 20 6e 6f   might, we're no
1e2f0 74 20 73 75 72 65 29 2c 0a 20 20 2a 2a 20 62 75  t sure),.  ** bu
1e300 74 20 62 65 63 61 75 73 65 20 6e 6f 20 77 61 79  t because no way
1e310 20 74 6f 20 74 65 73 74 20 69 74 20 69 73 20 63   to test it is c
1e320 75 72 72 65 6e 74 6c 79 20 61 76 61 69 6c 61 62  urrently availab
1e330 6c 65 2e 20 49 74 20 69 73 20 62 65 74 74 65 72  le. It is better
1e340 20 0a 20 20 2a 2a 20 6e 6f 74 20 74 6f 20 72 69   .  ** not to ri
1e350 73 6b 20 62 72 65 61 6b 69 6e 67 20 76 78 77 6f  sk breaking vxwo
1e360 72 6b 73 20 73 75 70 70 6f 72 74 20 66 6f 72 20  rks support for 
1e370 74 68 65 20 73 61 6b 65 20 6f 66 20 73 75 63 68  the sake of such
1e380 20 61 6e 20 6f 62 73 63 75 72 65 20 0a 20 20 2a   an obscure .  *
1e390 2a 20 66 65 61 74 75 72 65 2e 20 20 2a 2f 0a 23  * feature.  */.#
1e3a0 69 66 20 21 4f 53 5f 56 58 57 4f 52 4b 53 0a 20  if !OS_VXWORKS. 
1e3b0 20 73 74 72 75 63 74 20 73 74 61 74 20 73 53 74   struct stat sSt
1e3c0 61 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  at;             
1e3d0 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 73        /* Results
1e3e0 20 6f 66 20 73 74 61 74 28 29 20 63 61 6c 6c 20   of stat() call 
1e3f0 2a 2f 0a 0a 20 20 2f 2a 20 41 20 73 74 61 74 28  */..  /* A stat(
1e400 29 20 63 61 6c 6c 20 6d 61 79 20 66 61 69 6c 20  ) call may fail 
1e410 66 6f 72 20 76 61 72 69 6f 75 73 20 72 65 61 73  for various reas
1e420 6f 6e 73 2e 20 49 66 20 74 68 69 73 20 68 61 70  ons. If this hap
1e430 70 65 6e 73 2c 20 69 74 20 69 73 0a 20 20 2a 2a  pens, it is.  **
1e440 20 61 6c 6d 6f 73 74 20 63 65 72 74 61 69 6e 20   almost certain 
1e450 74 68 61 74 20 61 6e 20 6f 70 65 6e 28 29 20 63  that an open() c
1e460 61 6c 6c 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  all on the same 
1e470 70 61 74 68 20 77 69 6c 6c 20 61 6c 73 6f 20 66  path will also f
1e480 61 69 6c 2e 0a 20 20 2a 2a 20 46 6f 72 20 74 68  ail..  ** For th
1e490 69 73 20 72 65 61 73 6f 6e 2c 20 69 66 20 61 6e  is reason, if an
1e4a0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 69 6e   error occurs in
1e4b0 20 74 68 65 20 73 74 61 74 28 29 20 63 61 6c 6c   the stat() call
1e4c0 20 68 65 72 65 2c 20 69 74 20 69 73 0a 20 20 2a   here, it is.  *
1e4d0 2a 20 69 67 6e 6f 72 65 64 20 61 6e 64 20 2d 31  * ignored and -1
1e4e0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 54 68   is returned. Th
1e4f0 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 74 72  e caller will tr
1e500 79 20 74 6f 20 6f 70 65 6e 20 61 20 6e 65 77 20  y to open a new 
1e510 66 69 6c 65 0a 20 20 2a 2a 20 64 65 73 63 72 69  file.  ** descri
1e520 70 74 6f 72 20 6f 6e 20 74 68 65 20 73 61 6d 65  ptor on the same
1e530 20 70 61 74 68 2c 20 66 61 69 6c 2c 20 61 6e 64   path, fail, and
1e540 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   return an error
1e550 20 74 6f 20 53 51 4c 69 74 65 2e 0a 20 20 2a 2a   to SQLite..  **
1e560 0a 20 20 2a 2a 20 45 76 65 6e 20 69 66 20 61 20  .  ** Even if a 
1e570 73 75 62 73 65 71 75 65 6e 74 20 6f 70 65 6e 28  subsequent open(
1e580 29 20 63 61 6c 6c 20 64 6f 65 73 20 73 75 63 63  ) call does succ
1e590 65 65 64 2c 20 74 68 65 20 63 6f 6e 73 65 71 75  eed, the consequ
1e5a0 65 6e 63 65 73 20 6f 66 0a 20 20 2a 2a 20 6e 6f  ences of.  ** no
1e5b0 74 20 73 65 61 72 63 68 69 6e 67 20 66 6f 72 20  t searching for 
1e5c0 61 20 72 65 73 75 73 61 62 6c 65 20 66 69 6c 65  a resusable file
1e5d0 20 64 65 73 63 72 69 70 74 6f 72 20 61 72 65 20   descriptor are 
1e5e0 6e 6f 74 20 64 69 72 65 2e 20 20 2a 2f 0a 20 20  not dire.  */.  
1e5f0 69 66 28 20 30 3d 3d 73 74 61 74 28 7a 50 61 74  if( 0==stat(zPat
1e600 68 2c 20 26 73 53 74 61 74 29 20 29 7b 0a 20 20  h, &sStat) ){.  
1e610 20 20 73 74 72 75 63 74 20 75 6e 69 78 4f 70 65    struct unixOpe
1e620 6e 43 6e 74 20 2a 70 4f 3b 0a 20 20 20 20 73 74  nCnt *pO;.    st
1e630 72 75 63 74 20 75 6e 69 78 46 69 6c 65 49 64 20  ruct unixFileId 
1e640 69 64 3b 0a 20 20 20 20 69 64 2e 64 65 76 20 3d  id;.    id.dev =
1e650 20 73 53 74 61 74 2e 73 74 5f 64 65 76 3b 0a 20   sStat.st_dev;. 
1e660 20 20 20 69 64 2e 69 6e 6f 20 3d 20 73 53 74 61     id.ino = sSta
1e670 74 2e 73 74 5f 69 6e 6f 3b 0a 0a 20 20 20 20 75  t.st_ino;..    u
1e680 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
1e690 0a 20 20 20 20 66 6f 72 28 70 4f 3d 6f 70 65 6e  .    for(pO=open
1e6a0 4c 69 73 74 3b 20 70 4f 20 26 26 20 6d 65 6d 63  List; pO && memc
1e6b0 6d 70 28 26 69 64 2c 20 26 70 4f 2d 3e 66 69 6c  mp(&id, &pO->fil
1e6c0 65 49 64 2c 20 73 69 7a 65 6f 66 28 69 64 29 29  eId, sizeof(id))
1e6d0 3b 20 70 4f 3d 70 4f 2d 3e 70 4e 65 78 74 29 3b  ; pO=pO->pNext);
1e6e0 0a 20 20 20 20 69 66 28 20 70 4f 20 29 7b 0a 20  .    if( pO ){. 
1e6f0 20 20 20 20 20 55 6e 69 78 55 6e 75 73 65 64 46       UnixUnusedF
1e700 64 20 2a 2a 70 70 3b 0a 20 20 20 20 20 20 66 6f  d **pp;.      fo
1e710 72 28 70 70 3d 26 70 4f 2d 3e 70 55 6e 75 73 65  r(pp=&pO->pUnuse
1e720 64 3b 20 2a 70 70 20 26 26 20 28 2a 70 70 29 2d  d; *pp && (*pp)-
1e730 3e 66 6c 61 67 73 21 3d 66 6c 61 67 73 3b 20 70  >flags!=flags; p
1e740 70 3d 26 28 28 2a 70 70 29 2d 3e 70 4e 65 78 74  p=&((*pp)->pNext
1e750 29 29 3b 0a 20 20 20 20 20 20 70 55 6e 75 73 65  ));.      pUnuse
1e760 64 20 3d 20 2a 70 70 3b 0a 20 20 20 20 20 20 69  d = *pp;.      i
1e770 66 28 20 70 55 6e 75 73 65 64 20 29 7b 0a 20 20  f( pUnused ){.  
1e780 20 20 20 20 20 20 2a 70 70 20 3d 20 70 55 6e 75        *pp = pUnu
1e790 73 65 64 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  sed->pNext;.    
1e7a0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e    }.    }.    un
1e7b0 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
1e7c0 20 20 7d 0a 23 65 6e 64 69 66 20 20 20 20 2f 2a    }.#endif    /*
1e7d0 20 69 66 20 21 4f 53 5f 56 58 57 4f 52 4b 53 20   if !OS_VXWORKS 
1e7e0 2a 2f 0a 20 20 72 65 74 75 72 6e 20 70 55 6e 75  */.  return pUnu
1e7f0 73 65 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70  sed;.}../*.** Op
1e800 65 6e 20 74 68 65 20 66 69 6c 65 20 7a 50 61 74  en the file zPat
1e810 68 2e 0a 2a 2a 20 0a 2a 2a 20 50 72 65 76 69 6f  h..** .** Previo
1e820 75 73 6c 79 2c 20 74 68 65 20 53 51 4c 69 74 65  usly, the SQLite
1e830 20 4f 53 20 6c 61 79 65 72 20 75 73 65 64 20 74   OS layer used t
1e840 68 72 65 65 20 66 75 6e 63 74 69 6f 6e 73 20 69  hree functions i
1e850 6e 20 70 6c 61 63 65 20 6f 66 20 74 68 69 73 0a  n place of this.
1e860 2a 2a 20 6f 6e 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  ** one:.**.**   
1e870 20 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52    sqlite3OsOpenR
1e880 65 61 64 57 72 69 74 65 28 29 3b 0a 2a 2a 20 20  eadWrite();.**  
1e890 20 20 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e     sqlite3OsOpen
1e8a0 52 65 61 64 4f 6e 6c 79 28 29 3b 0a 2a 2a 20 20  ReadOnly();.**  
1e8b0 20 20 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e     sqlite3OsOpen
1e8c0 45 78 63 6c 75 73 69 76 65 28 29 3b 0a 2a 2a 0a  Exclusive();.**.
1e8d0 2a 2a 20 54 68 65 73 65 20 63 61 6c 6c 73 20 63  ** These calls c
1e8e0 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20 74 68 65  orrespond to the
1e8f0 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d 62 69   following combi
1e900 6e 61 74 69 6f 6e 73 20 6f 66 20 66 6c 61 67 73  nations of flags
1e910 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 52 65 61 64  :.**.**     Read
1e920 57 72 69 74 65 28 29 20 2d 3e 20 20 20 20 20 28  Write() ->     (
1e930 52 45 41 44 57 52 49 54 45 20 7c 20 43 52 45 41  READWRITE | CREA
1e940 54 45 29 0a 2a 2a 20 20 20 20 20 52 65 61 64 4f  TE).**     ReadO
1e950 6e 6c 79 28 29 20 20 2d 3e 20 20 20 20 20 28 52  nly()  ->     (R
1e960 45 41 44 4f 4e 4c 59 29 20 0a 2a 2a 20 20 20 20  EADONLY) .**    
1e970 20 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28 29   OpenExclusive()
1e980 20 2d 3e 20 28 52 45 41 44 57 52 49 54 45 20 7c   -> (READWRITE |
1e990 20 43 52 45 41 54 45 20 7c 20 45 58 43 4c 55 53   CREATE | EXCLUS
1e9a0 49 56 45 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f  IVE).**.** The o
1e9b0 6c 64 20 4f 70 65 6e 45 78 63 6c 75 73 69 76 65  ld OpenExclusive
1e9c0 28 29 20 61 63 63 65 70 74 65 64 20 61 20 62 6f  () accepted a bo
1e9d0 6f 6c 65 61 6e 20 61 72 67 75 6d 65 6e 74 20 2d  olean argument -
1e9e0 20 22 64 65 6c 46 6c 61 67 22 2e 20 49 66 0a 2a   "delFlag". If.*
1e9f0 2a 20 74 72 75 65 2c 20 74 68 65 20 66 69 6c 65  * true, the file
1ea00 20 77 61 73 20 63 6f 6e 66 69 67 75 72 65 64 20   was configured 
1ea10 74 6f 20 62 65 20 61 75 74 6f 6d 61 74 69 63 61  to be automatica
1ea20 6c 6c 79 20 64 65 6c 65 74 65 64 20 77 68 65 6e  lly deleted when
1ea30 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 68 61 6e   the.** file han
1ea40 64 6c 65 20 63 6c 6f 73 65 64 2e 20 54 6f 20 61  dle closed. To a
1ea50 63 68 69 65 76 65 20 74 68 65 20 73 61 6d 65 20  chieve the same 
1ea60 65 66 66 65 63 74 20 75 73 69 6e 67 20 74 68 69  effect using thi
1ea70 73 20 6e 65 77 20 0a 2a 2a 20 69 6e 74 65 72 66  s new .** interf
1ea80 61 63 65 2c 20 61 64 64 20 74 68 65 20 44 45 4c  ace, add the DEL
1ea90 45 54 45 4f 4e 43 4c 4f 53 45 20 66 6c 61 67 20  ETEONCLOSE flag 
1eaa0 74 6f 20 74 68 6f 73 65 20 73 70 65 63 69 66 69  to those specifi
1eab0 65 64 20 61 62 6f 76 65 20 66 6f 72 20 0a 2a 2a  ed above for .**
1eac0 20 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28 29   OpenExclusive()
1ead0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1eae0 75 6e 69 78 4f 70 65 6e 28 0a 20 20 73 71 6c 69  unixOpen(.  sqli
1eaf0 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20  te3_vfs *pVfs,  
1eb00 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1eb10 56 46 53 20 66 6f 72 20 77 68 69 63 68 20 74 68  VFS for which th
1eb20 69 73 20 69 73 20 74 68 65 20 78 4f 70 65 6e 20  is is the xOpen 
1eb30 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 63 6f 6e 73  method */.  cons
1eb40 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20  t char *zPath,  
1eb50 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 74 68           /* Path
1eb60 6e 61 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f 20  name of file to 
1eb70 62 65 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 73  be opened */.  s
1eb80 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69  qlite3_file *pFi
1eb90 6c 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54  le,         /* T
1eba0 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
1ebb0 6f 72 20 74 6f 20 62 65 20 66 69 6c 6c 65 64 20  or to be filled 
1ebc0 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  in */.  int flag
1ebd0 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
1ebe0 20 20 20 20 20 2f 2a 20 49 6e 70 75 74 20 66 6c       /* Input fl
1ebf0 61 67 73 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 74  ags to control t
1ec00 68 65 20 6f 70 65 6e 69 6e 67 20 2a 2f 0a 20 20  he opening */.  
1ec10 69 6e 74 20 2a 70 4f 75 74 46 6c 61 67 73 20 20  int *pOutFlags  
1ec20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ec30 4f 75 74 70 75 74 20 66 6c 61 67 73 20 72 65 74  Output flags ret
1ec40 75 72 6e 65 64 20 74 6f 20 53 51 4c 69 74 65 20  urned to SQLite 
1ec50 63 6f 72 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69  core */.){.  uni
1ec60 78 46 69 6c 65 20 2a 70 20 3d 20 28 75 6e 69 78  xFile *p = (unix
1ec70 46 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20  File *)pFile;.  
1ec80 69 6e 74 20 66 64 20 3d 20 2d 31 3b 20 20 20 20  int fd = -1;    
1ec90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1eca0 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * File descripto
1ecb0 72 20 72 65 74 75 72 6e 65 64 20 62 79 20 6f 70  r returned by op
1ecc0 65 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 64 69  en() */.  int di
1ecd0 72 66 64 20 3d 20 2d 31 3b 20 20 20 20 20 20 20  rfd = -1;       
1ece0 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69 72 65           /* Dire
1ecf0 63 74 6f 72 79 20 66 69 6c 65 20 64 65 73 63 72  ctory file descr
1ed00 69 70 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 6f  iptor */.  int o
1ed10 70 65 6e 46 6c 61 67 73 20 3d 20 30 3b 20 20 20  penFlags = 0;   
1ed20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
1ed30 67 73 20 74 6f 20 70 61 73 73 20 74 6f 20 6f 70  gs to pass to op
1ed40 65 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 65 54  en() */.  int eT
1ed50 79 70 65 20 3d 20 66 6c 61 67 73 26 30 78 46 46  ype = flags&0xFF
1ed60 46 46 46 46 30 30 3b 20 20 2f 2a 20 54 79 70 65  FFFF00;  /* Type
1ed70 20 6f 66 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e   of file to open
1ed80 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 4c 6f 63 6b   */.  int noLock
1ed90 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1eda0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
1edb0 6f 6d 69 74 20 6c 6f 63 6b 69 6e 67 20 70 72 69  omit locking pri
1edc0 6d 69 74 69 76 65 73 20 2a 2f 0a 20 20 69 6e 74  mitives */.  int
1edd0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1ede0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1edf0 75 6e 63 74 69 6f 6e 20 52 65 74 75 72 6e 20 43  unction Return C
1ee00 6f 64 65 20 2a 2f 0a 0a 20 20 69 6e 74 20 69 73  ode */..  int is
1ee10 45 78 63 6c 75 73 69 76 65 20 20 3d 20 28 66 6c  Exclusive  = (fl
1ee20 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
1ee30 4e 5f 45 58 43 4c 55 53 49 56 45 29 3b 0a 20 20  N_EXCLUSIVE);.  
1ee40 69 6e 74 20 69 73 44 65 6c 65 74 65 20 20 20 20  int isDelete    
1ee50 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49   = (flags & SQLI
1ee60 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e  TE_OPEN_DELETEON
1ee70 43 4c 4f 53 45 29 3b 0a 20 20 69 6e 74 20 69 73  CLOSE);.  int is
1ee80 43 72 65 61 74 65 20 20 20 20 20 3d 20 28 66 6c  Create     = (fl
1ee90 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
1eea0 4e 5f 43 52 45 41 54 45 29 3b 0a 20 20 69 6e 74  N_CREATE);.  int
1eeb0 20 69 73 52 65 61 64 6f 6e 6c 79 20 20 20 3d 20   isReadonly   = 
1eec0 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
1eed0 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a  OPEN_READONLY);.
1eee0 20 20 69 6e 74 20 69 73 52 65 61 64 57 72 69 74    int isReadWrit
1eef0 65 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51  e  = (flags & SQ
1ef00 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
1ef10 49 54 45 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 63  ITE);..  /* If c
1ef20 72 65 61 74 69 6e 67 20 61 20 6d 61 73 74 65 72  reating a master
1ef30 20 6f 72 20 6d 61 69 6e 2d 66 69 6c 65 20 6a 6f   or main-file jo
1ef40 75 72 6e 61 6c 2c 20 74 68 69 73 20 66 75 6e 63  urnal, this func
1ef50 74 69 6f 6e 20 77 69 6c 6c 20 6f 70 65 6e 0a 20  tion will open. 
1ef60 20 2a 2a 20 61 20 66 69 6c 65 2d 64 65 73 63 72   ** a file-descr
1ef70 69 70 74 6f 72 20 6f 6e 20 74 68 65 20 64 69 72  iptor on the dir
1ef80 65 63 74 6f 72 79 20 74 6f 6f 2e 20 54 68 65 20  ectory too. The 
1ef90 66 69 72 73 74 20 74 69 6d 65 20 75 6e 69 78 53  first time unixS
1efa0 79 6e 63 28 29 0a 20 20 2a 2a 20 69 73 20 63 61  ync().  ** is ca
1efb0 6c 6c 65 64 20 74 68 65 20 64 69 72 65 63 74 6f  lled the directo
1efc0 72 79 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ry file descript
1efd0 6f 72 20 77 69 6c 6c 20 62 65 20 66 73 79 6e 63  or will be fsync
1efe0 28 29 65 64 20 61 6e 64 20 63 6c 6f 73 65 28 29  ()ed and close()
1eff0 64 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 69 73  d..  */.  int is
1f000 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 20 3d 20  OpenDirectory = 
1f010 28 69 73 43 72 65 61 74 65 20 26 26 20 0a 20 20  (isCreate && .  
1f020 20 20 20 20 28 65 54 79 70 65 3d 3d 53 51 4c 49      (eType==SQLI
1f030 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a  TE_OPEN_MASTER_J
1f040 4f 55 52 4e 41 4c 20 7c 7c 20 65 54 79 70 65 3d  OURNAL || eType=
1f050 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  =SQLITE_OPEN_MAI
1f060 4e 5f 4a 4f 55 52 4e 41 4c 29 0a 20 20 29 3b 0a  N_JOURNAL).  );.
1f070 0a 20 20 2f 2a 20 49 66 20 61 72 67 75 6d 65 6e  .  /* If argumen
1f080 74 20 7a 50 61 74 68 20 69 73 20 61 20 4e 55 4c  t zPath is a NUL
1f090 4c 20 70 6f 69 6e 74 65 72 2c 20 74 68 69 73 20  L pointer, this 
1f0a0 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 71 75  function is requ
1f0b0 69 72 65 64 20 74 6f 20 6f 70 65 6e 0a 20 20 2a  ired to open.  *
1f0c0 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  * a temporary fi
1f0d0 6c 65 2e 20 55 73 65 20 74 68 69 73 20 62 75 66  le. Use this buf
1f0e0 66 65 72 20 74 6f 20 73 74 6f 72 65 20 74 68 65  fer to store the
1f0f0 20 66 69 6c 65 20 6e 61 6d 65 20 69 6e 2e 0a 20   file name in.. 
1f100 20 2a 2f 0a 20 20 63 68 61 72 20 7a 54 6d 70 6e   */.  char zTmpn
1f110 61 6d 65 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45  ame[MAX_PATHNAME
1f120 2b 31 5d 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  +1];.  const cha
1f130 72 20 2a 7a 4e 61 6d 65 20 3d 20 7a 50 61 74 68  r *zName = zPath
1f140 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68  ;..  /* Check th
1f150 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 61 74  e following stat
1f160 65 6d 65 6e 74 73 20 61 72 65 20 74 72 75 65 3a  ements are true:
1f170 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 28 61   .  **.  **   (a
1f180 29 20 45 78 61 63 74 6c 79 20 6f 6e 65 20 6f 66  ) Exactly one of
1f190 20 74 68 65 20 52 45 41 44 57 52 49 54 45 20 61   the READWRITE a
1f1a0 6e 64 20 52 45 41 44 4f 4e 4c 59 20 66 6c 61 67  nd READONLY flag
1f1b0 73 20 6d 75 73 74 20 62 65 20 73 65 74 2c 20 61  s must be set, a
1f1c0 6e 64 20 0a 20 20 2a 2a 20 20 20 28 62 29 20 69  nd .  **   (b) i
1f1d0 66 20 43 52 45 41 54 45 20 69 73 20 73 65 74 2c  f CREATE is set,
1f1e0 20 74 68 65 6e 20 52 45 41 44 57 52 49 54 45 20   then READWRITE 
1f1f0 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 73 65 74  must also be set
1f200 2c 20 61 6e 64 0a 20 20 2a 2a 20 20 20 28 63 29  , and.  **   (c)
1f210 20 69 66 20 45 58 43 4c 55 53 49 56 45 20 69 73   if EXCLUSIVE is
1f220 20 73 65 74 2c 20 74 68 65 6e 20 43 52 45 41 54   set, then CREAT
1f230 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 73  E must also be s
1f240 65 74 2e 0a 20 20 2a 2a 20 20 20 28 64 29 20 69  et..  **   (d) i
1f250 66 20 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20  f DELETEONCLOSE 
1f260 69 73 20 73 65 74 2c 20 74 68 65 6e 20 43 52 45  is set, then CRE
1f270 41 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65  ATE must also be
1f280 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73   set..  */.  ass
1f290 65 72 74 28 28 69 73 52 65 61 64 6f 6e 6c 79 3d  ert((isReadonly=
1f2a0 3d 30 20 7c 7c 20 69 73 52 65 61 64 57 72 69 74  =0 || isReadWrit
1f2b0 65 3d 3d 30 29 20 26 26 20 28 69 73 52 65 61 64  e==0) && (isRead
1f2c0 57 72 69 74 65 20 7c 7c 20 69 73 52 65 61 64 6f  Write || isReado
1f2d0 6e 6c 79 29 29 3b 0a 20 20 61 73 73 65 72 74 28  nly));.  assert(
1f2e0 69 73 43 72 65 61 74 65 3d 3d 30 20 7c 7c 20 69  isCreate==0 || i
1f2f0 73 52 65 61 64 57 72 69 74 65 29 3b 0a 20 20 61  sReadWrite);.  a
1f300 73 73 65 72 74 28 69 73 45 78 63 6c 75 73 69 76  ssert(isExclusiv
1f310 65 3d 3d 30 20 7c 7c 20 69 73 43 72 65 61 74 65  e==0 || isCreate
1f320 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73 44 65  );.  assert(isDe
1f330 6c 65 74 65 3d 3d 30 20 7c 7c 20 69 73 43 72 65  lete==0 || isCre
1f340 61 74 65 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  ate);..  /* The 
1f350 6d 61 69 6e 20 44 42 2c 20 6d 61 69 6e 20 6a 6f  main DB, main jo
1f360 75 72 6e 61 6c 2c 20 61 6e 64 20 6d 61 73 74 65  urnal, and maste
1f370 72 20 6a 6f 75 72 6e 61 6c 20 61 72 65 20 6e 65  r journal are ne
1f380 76 65 72 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  ver automaticall
1f390 79 0a 20 20 2a 2a 20 64 65 6c 65 74 65 64 2e 20  y.  ** deleted. 
1f3a0 4e 6f 72 20 61 72 65 20 74 68 65 79 20 65 76 65  Nor are they eve
1f3b0 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  r temporary file
1f3c0 73 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  s.  */.  assert(
1f3d0 20 28 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a   (!isDelete && z
1f3e0 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d  Name) || eType!=
1f3f0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
1f400 5f 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _DB );.  assert(
1f410 20 28 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a   (!isDelete && z
1f420 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d  Name) || eType!=
1f430 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
1f440 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20 20 61 73  _JOURNAL );.  as
1f450 73 65 72 74 28 20 28 21 69 73 44 65 6c 65 74 65  sert( (!isDelete
1f460 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54   && zName) || eT
1f470 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype!=SQLITE_OPEN
1f480 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20  _MASTER_JOURNAL 
1f490 29 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74 20  );..  /* Assert 
1f4a0 74 68 61 74 20 74 68 65 20 75 70 70 65 72 20 6c  that the upper l
1f4b0 61 79 65 72 20 68 61 73 20 73 65 74 20 6f 6e 65  ayer has set one
1f4c0 20 6f 66 20 74 68 65 20 22 66 69 6c 65 2d 74 79   of the "file-ty
1f4d0 70 65 22 20 66 6c 61 67 73 2e 20 2a 2f 0a 20 20  pe" flags. */.  
1f4e0 61 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d 53  assert( eType==S
1f4f0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
1f500 44 42 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65  DB      || eType
1f510 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45  ==SQLITE_OPEN_TE
1f520 4d 50 5f 44 42 20 0a 20 20 20 20 20 20 20 7c 7c  MP_DB .       ||
1f530 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
1f540 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
1f550 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
1f560 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52  E_OPEN_TEMP_JOUR
1f570 4e 41 4c 20 0a 20 20 20 20 20 20 20 7c 7c 20 65  NAL .       || e
1f580 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
1f590 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 20 20 20 7c  N_SUBJOURNAL   |
1f5a0 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
1f5b0 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52  OPEN_MASTER_JOUR
1f5c0 4e 41 4c 20 0a 20 20 20 20 20 20 20 7c 7c 20 65  NAL .       || e
1f5d0 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
1f5e0 4e 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42 0a 20  N_TRANSIENT_DB. 
1f5f0 20 29 3b 0a 0a 20 20 6d 65 6d 73 65 74 28 70 2c   );..  memset(p,
1f600 20 30 2c 20 73 69 7a 65 6f 66 28 75 6e 69 78 46   0, sizeof(unixF
1f610 69 6c 65 29 29 3b 0a 0a 20 20 69 66 28 20 65 54  ile));..  if( eT
1f620 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
1f630 5f 4d 41 49 4e 5f 44 42 20 29 7b 0a 20 20 20 20  _MAIN_DB ){.    
1f640 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70 55  UnixUnusedFd *pU
1f650 6e 75 73 65 64 3b 0a 20 20 20 20 70 55 6e 75 73  nused;.    pUnus
1f660 65 64 20 3d 20 66 69 6e 64 52 65 75 73 61 62 6c  ed = findReusabl
1f670 65 46 64 28 7a 4e 61 6d 65 2c 20 66 6c 61 67 73  eFd(zName, flags
1f680 29 3b 0a 20 20 20 20 69 66 28 20 70 55 6e 75 73  );.    if( pUnus
1f690 65 64 20 29 7b 0a 20 20 20 20 20 20 66 64 20 3d  ed ){.      fd =
1f6a0 20 70 55 6e 75 73 65 64 2d 3e 66 64 3b 0a 20 20   pUnused->fd;.  
1f6b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
1f6c0 55 6e 75 73 65 64 20 3d 20 73 71 6c 69 74 65 33  Unused = sqlite3
1f6d0 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a  _malloc(sizeof(*
1f6e0 70 55 6e 75 73 65 64 29 29 3b 0a 20 20 20 20 20  pUnused));.     
1f6f0 20 69 66 28 20 21 70 55 6e 75 73 65 64 20 29 7b   if( !pUnused ){
1f700 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1f710 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
1f720 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1f730 70 2d 3e 70 55 6e 75 73 65 64 20 3d 20 70 55 6e  p->pUnused = pUn
1f740 75 73 65 64 3b 0a 20 20 7d 65 6c 73 65 20 69 66  used;.  }else if
1f750 28 20 21 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20  ( !zName ){.    
1f760 2f 2a 20 49 66 20 7a 4e 61 6d 65 20 69 73 20 4e  /* If zName is N
1f770 55 4c 4c 2c 20 74 68 65 20 75 70 70 65 72 20 6c  ULL, the upper l
1f780 61 79 65 72 20 69 73 20 72 65 71 75 65 73 74 69  ayer is requesti
1f790 6e 67 20 61 20 74 65 6d 70 20 66 69 6c 65 2e 20  ng a temp file. 
1f7a0 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 69 73  */.    assert(is
1f7b0 44 65 6c 65 74 65 20 26 26 20 21 69 73 4f 70 65  Delete && !isOpe
1f7c0 6e 44 69 72 65 63 74 6f 72 79 29 3b 0a 20 20 20  nDirectory);.   
1f7d0 20 72 63 20 3d 20 67 65 74 54 65 6d 70 6e 61 6d   rc = getTempnam
1f7e0 65 28 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 31  e(MAX_PATHNAME+1
1f7f0 2c 20 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 20  , zTmpname);.   
1f800 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1f810 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
1f820 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
1f830 20 7a 4e 61 6d 65 20 3d 20 7a 54 6d 70 6e 61 6d   zName = zTmpnam
1f840 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 74  e;.  }..  /* Det
1f850 65 72 6d 69 6e 65 20 74 68 65 20 76 61 6c 75 65  ermine the value
1f860 20 6f 66 20 74 68 65 20 66 6c 61 67 73 20 70 61   of the flags pa
1f870 72 61 6d 65 74 65 72 20 70 61 73 73 65 64 20 74  rameter passed t
1f880 6f 20 50 4f 53 49 58 20 66 75 6e 63 74 69 6f 6e  o POSIX function
1f890 0a 20 20 2a 2a 20 6f 70 65 6e 28 29 2e 20 54 68  .  ** open(). Th
1f8a0 65 73 65 20 6d 75 73 74 20 62 65 20 63 61 6c 63  ese must be calc
1f8b0 75 6c 61 74 65 64 20 65 76 65 6e 20 69 66 20 6f  ulated even if o
1f8c0 70 65 6e 28 29 20 69 73 20 6e 6f 74 20 63 61 6c  pen() is not cal
1f8d0 6c 65 64 2c 20 61 73 0a 20 20 2a 2a 20 74 68 65  led, as.  ** the
1f8e0 79 20 6d 61 79 20 62 65 20 73 74 6f 72 65 64 20  y may be stored 
1f8f0 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 66  as part of the f
1f900 69 6c 65 20 68 61 6e 64 6c 65 20 61 6e 64 20 75  ile handle and u
1f910 73 65 64 20 62 79 20 74 68 65 20 0a 20 20 2a 2a  sed by the .  **
1f920 20 27 63 6f 6e 63 68 20 66 69 6c 65 27 20 6c 6f   'conch file' lo
1f930 63 6b 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73 20  cking functions 
1f940 6c 61 74 65 72 20 6f 6e 2e 20 20 2a 2f 0a 20 20  later on.  */.  
1f950 69 66 28 20 69 73 52 65 61 64 6f 6e 6c 79 20 29  if( isReadonly )
1f960 20 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 4f    openFlags |= O
1f970 5f 52 44 4f 4e 4c 59 3b 0a 20 20 69 66 28 20 69  _RDONLY;.  if( i
1f980 73 52 65 61 64 57 72 69 74 65 20 29 20 6f 70 65  sReadWrite ) ope
1f990 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f 52 44 57 52  nFlags |= O_RDWR
1f9a0 3b 0a 20 20 69 66 28 20 69 73 43 72 65 61 74 65  ;.  if( isCreate
1f9b0 20 29 20 20 20 20 6f 70 65 6e 46 6c 61 67 73 20   )    openFlags 
1f9c0 7c 3d 20 4f 5f 43 52 45 41 54 3b 0a 20 20 69 66  |= O_CREAT;.  if
1f9d0 28 20 69 73 45 78 63 6c 75 73 69 76 65 20 29 20  ( isExclusive ) 
1f9e0 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 28 4f 5f  openFlags |= (O_
1f9f0 45 58 43 4c 7c 4f 5f 4e 4f 46 4f 4c 4c 4f 57 29  EXCL|O_NOFOLLOW)
1fa00 3b 0a 20 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d  ;.  openFlags |=
1fa10 20 28 4f 5f 4c 41 52 47 45 46 49 4c 45 7c 4f 5f   (O_LARGEFILE|O_
1fa20 42 49 4e 41 52 59 29 3b 0a 0a 20 20 69 66 28 20  BINARY);..  if( 
1fa30 66 64 3c 30 20 29 7b 0a 20 20 20 20 6d 6f 64 65  fd<0 ){.    mode
1fa40 5f 74 20 6f 70 65 6e 4d 6f 64 65 20 3d 20 28 69  _t openMode = (i
1fa50 73 44 65 6c 65 74 65 3f 30 36 30 30 3a 53 51 4c  sDelete?0600:SQL
1fa60 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45  ITE_DEFAULT_FILE
1fa70 5f 50 45 52 4d 49 53 53 49 4f 4e 53 29 3b 0a 20  _PERMISSIONS);. 
1fa80 20 20 20 66 64 20 3d 20 6f 70 65 6e 28 7a 4e 61     fd = open(zNa
1fa90 6d 65 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20 6f  me, openFlags, o
1faa0 70 65 6e 4d 6f 64 65 29 3b 0a 20 20 20 20 4f 53  penMode);.    OS
1fab0 54 52 41 43 45 34 28 22 4f 50 45 4e 58 20 20 20  TRACE4("OPENX   
1fac0 25 2d 33 64 20 25 73 20 30 25 6f 5c 6e 22 2c 20  %-3d %s 0%o\n", 
1fad0 66 64 2c 20 7a 4e 61 6d 65 2c 20 6f 70 65 6e 46  fd, zName, openF
1fae0 6c 61 67 73 29 3b 0a 20 20 20 20 69 66 28 20 66  lags);.    if( f
1faf0 64 3c 30 20 26 26 20 65 72 72 6e 6f 21 3d 45 49  d<0 && errno!=EI
1fb00 53 44 49 52 20 26 26 20 69 73 52 65 61 64 57 72  SDIR && isReadWr
1fb10 69 74 65 20 26 26 20 21 69 73 45 78 63 6c 75 73  ite && !isExclus
1fb20 69 76 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ive ){.      /* 
1fb30 46 61 69 6c 65 64 20 74 6f 20 6f 70 65 6e 20 74  Failed to open t
1fb40 68 65 20 66 69 6c 65 20 66 6f 72 20 72 65 61 64  he file for read
1fb50 2f 77 72 69 74 65 20 61 63 63 65 73 73 2e 20 54  /write access. T
1fb60 72 79 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 2a 2f  ry read-only. */
1fb70 0a 20 20 20 20 20 20 66 6c 61 67 73 20 26 3d 20  .      flags &= 
1fb80 7e 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  ~(SQLITE_OPEN_RE
1fb90 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f  ADWRITE|SQLITE_O
1fba0 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a 20 20 20  PEN_CREATE);.   
1fbb0 20 20 20 6f 70 65 6e 46 6c 61 67 73 20 26 3d 20     openFlags &= 
1fbc0 7e 28 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54  ~(O_RDWR|O_CREAT
1fbd0 29 3b 0a 20 20 20 20 20 20 66 6c 61 67 73 20 7c  );.      flags |
1fbe0 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  = SQLITE_OPEN_RE
1fbf0 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 6f 70  ADONLY;.      op
1fc00 65 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f 52 44 4f  enFlags |= O_RDO
1fc10 4e 4c 59 3b 0a 20 20 20 20 20 20 66 64 20 3d 20  NLY;.      fd = 
1fc20 6f 70 65 6e 28 7a 4e 61 6d 65 2c 20 6f 70 65 6e  open(zName, open
1fc30 46 6c 61 67 73 2c 20 6f 70 65 6e 4d 6f 64 65 29  Flags, openMode)
1fc40 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1fc50 66 64 3c 30 20 29 7b 0a 20 20 20 20 20 20 72 63  fd<0 ){.      rc
1fc60 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50   = SQLITE_CANTOP
1fc70 45 4e 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f  EN;.      goto o
1fc80 70 65 6e 5f 66 69 6e 69 73 68 65 64 3b 0a 20 20  pen_finished;.  
1fc90 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74    }.  }.  assert
1fca0 28 20 66 64 3e 3d 30 20 29 3b 0a 20 20 69 66 28  ( fd>=0 );.  if(
1fcb0 20 70 4f 75 74 46 6c 61 67 73 20 29 7b 0a 20 20   pOutFlags ){.  
1fcc0 20 20 2a 70 4f 75 74 46 6c 61 67 73 20 3d 20 66    *pOutFlags = f
1fcd0 6c 61 67 73 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  lags;.  }..  if(
1fce0 20 70 2d 3e 70 55 6e 75 73 65 64 20 29 7b 0a 20   p->pUnused ){. 
1fcf0 20 20 20 70 2d 3e 70 55 6e 75 73 65 64 2d 3e 66     p->pUnused->f
1fd00 64 20 3d 20 66 64 3b 0a 20 20 20 20 70 2d 3e 70  d = fd;.    p->p
1fd10 55 6e 75 73 65 64 2d 3e 66 6c 61 67 73 20 3d 20  Unused->flags = 
1fd20 66 6c 61 67 73 3b 0a 20 20 7d 0a 0a 20 20 69 66  flags;.  }..  if
1fd30 28 20 69 73 44 65 6c 65 74 65 20 29 7b 0a 23 69  ( isDelete ){.#i
1fd40 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 20  f OS_VXWORKS.   
1fd50 20 7a 50 61 74 68 20 3d 20 7a 4e 61 6d 65 3b 0a   zPath = zName;.
1fd60 23 65 6c 73 65 0a 20 20 20 20 75 6e 6c 69 6e 6b  #else.    unlink
1fd70 28 7a 4e 61 6d 65 29 3b 0a 23 65 6e 64 69 66 0a  (zName);.#endif.
1fd80 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 45    }.#if SQLITE_E
1fd90 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
1fda0 59 4c 45 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20  YLE.  else{.    
1fdb0 70 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 6f  p->openFlags = o
1fdc0 70 65 6e 46 6c 61 67 73 3b 0a 20 20 7d 0a 23 65  penFlags;.  }.#e
1fdd0 6e 64 69 66 0a 0a 20 20 69 66 28 20 69 73 4f 70  ndif..  if( isOp
1fde0 65 6e 44 69 72 65 63 74 6f 72 79 20 29 7b 0a 20  enDirectory ){. 
1fdf0 20 20 20 72 63 20 3d 20 6f 70 65 6e 44 69 72 65     rc = openDire
1fe00 63 74 6f 72 79 28 7a 50 61 74 68 2c 20 26 64 69  ctory(zPath, &di
1fe10 72 66 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63  rfd);.    if( rc
1fe20 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1fe30 20 20 20 20 20 2f 2a 20 49 74 20 69 73 20 73 61       /* It is sa
1fe40 66 65 20 74 6f 20 63 6c 6f 73 65 20 66 64 20 61  fe to close fd a
1fe50 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 62 65  t this point, be
1fe60 63 61 75 73 65 20 69 74 20 69 73 20 67 75 61 72  cause it is guar
1fe70 61 6e 74 65 65 64 20 6e 6f 74 0a 20 20 20 20 20  anteed not.     
1fe80 20 2a 2a 20 74 6f 20 62 65 20 6f 70 65 6e 20 6f   ** to be open o
1fe90 6e 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  n a database fil
1fea0 65 2e 20 49 66 20 69 74 20 77 65 72 65 20 6f 70  e. If it were op
1feb0 65 6e 20 6f 6e 20 61 20 64 61 74 61 62 61 73 65  en on a database
1fec0 20 66 69 6c 65 2c 0a 20 20 20 20 20 20 2a 2a 20   file,.      ** 
1fed0 69 74 20 77 6f 75 6c 64 20 6e 6f 74 20 62 65 20  it would not be 
1fee0 73 61 66 65 20 74 6f 20 63 6c 6f 73 65 20 61 73  safe to close as
1fef0 20 74 68 69 73 20 77 6f 75 6c 64 20 72 65 6c 65   this would rele
1ff00 61 73 65 20 61 6e 79 20 6c 6f 63 6b 73 20 68 65  ase any locks he
1ff10 6c 64 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74  ld.      ** on t
1ff20 68 65 20 66 69 6c 65 20 62 79 20 74 68 69 73 20  he file by this 
1ff30 70 72 6f 63 65 73 73 2e 20 20 2a 2f 0a 20 20 20  process.  */.   
1ff40 20 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65     assert( eType
1ff50 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  !=SQLITE_OPEN_MA
1ff60 49 4e 5f 44 42 20 29 3b 0a 20 20 20 20 20 20 63  IN_DB );.      c
1ff70 6c 6f 73 65 28 66 64 29 3b 20 20 20 20 20 20 20  lose(fd);       
1ff80 20 20 20 20 20 20 2f 2a 20 73 69 6c 65 6e 74 6c        /* silentl
1ff90 79 20 6c 65 61 6b 20 69 66 20 66 61 69 6c 2c 20  y leak if fail, 
1ffa0 61 6c 72 65 61 64 79 20 69 6e 20 65 72 72 6f 72  already in error
1ffb0 20 2a 2f 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f   */.      goto o
1ffc0 70 65 6e 5f 66 69 6e 69 73 68 65 64 3b 0a 20 20  pen_finished;.  
1ffd0 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20    }.  }..#ifdef 
1ffe0 46 44 5f 43 4c 4f 45 58 45 43 0a 20 20 66 63 6e  FD_CLOEXEC.  fcn
1fff0 74 6c 28 66 64 2c 20 46 5f 53 45 54 46 44 2c 20  tl(fd, F_SETFD, 
20000 66 63 6e 74 6c 28 66 64 2c 20 46 5f 47 45 54 46  fcntl(fd, F_GETF
20010 44 2c 20 30 29 20 7c 20 46 44 5f 43 4c 4f 45 58  D, 0) | FD_CLOEX
20020 45 43 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 6e  EC);.#endif..  n
20030 6f 4c 6f 63 6b 20 3d 20 65 54 79 70 65 21 3d 53  oLock = eType!=S
20040 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
20050 44 42 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  DB;..#if SQLITE_
20060 50 52 45 46 45 52 5f 50 52 4f 58 59 5f 4c 4f 43  PREFER_PROXY_LOC
20070 4b 49 4e 47 0a 20 20 69 66 28 20 7a 50 61 74 68  KING.  if( zPath
20080 21 3d 4e 55 4c 4c 20 26 26 20 21 6e 6f 4c 6f 63  !=NULL && !noLoc
20090 6b 20 26 26 20 70 56 66 73 2d 3e 78 4f 70 65 6e  k && pVfs->xOpen
200a0 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 65 6e   ){.    char *en
200b0 76 66 6f 72 63 65 20 3d 20 67 65 74 65 6e 76 28  vforce = getenv(
200c0 22 53 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52  "SQLITE_FORCE_PR
200d0 4f 58 59 5f 4c 4f 43 4b 49 4e 47 22 29 3b 0a 20  OXY_LOCKING");. 
200e0 20 20 20 69 6e 74 20 75 73 65 50 72 6f 78 79 20     int useProxy 
200f0 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 53 51 4c  = 0;..    /* SQL
20100 49 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f  ITE_FORCE_PROXY_
20110 4c 4f 43 4b 49 4e 47 3d 3d 31 20 6d 65 61 6e 73  LOCKING==1 means
20120 20 66 6f 72 63 65 20 61 6c 77 61 79 73 20 75 73   force always us
20130 65 20 70 72 6f 78 79 2c 20 30 20 6d 65 61 6e 73  e proxy, 0 means
20140 20 0a 20 20 20 20 2a 2a 20 6e 65 76 65 72 20 75   .    ** never u
20150 73 65 20 70 72 6f 78 79 2c 20 4e 55 4c 4c 20 6d  se proxy, NULL m
20160 65 61 6e 73 20 75 73 65 20 70 72 6f 78 79 20 66  eans use proxy f
20170 6f 72 20 6e 6f 6e 2d 6c 6f 63 61 6c 20 66 69 6c  or non-local fil
20180 65 73 20 6f 6e 6c 79 2e 20 20 2a 2f 0a 20 20 20  es only.  */.   
20190 20 69 66 28 20 65 6e 76 66 6f 72 63 65 21 3d 4e   if( envforce!=N
201a0 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 75 73 65  ULL ){.      use
201b0 50 72 6f 78 79 20 3d 20 61 74 6f 69 28 65 6e 76  Proxy = atoi(env
201c0 66 6f 72 63 65 29 3e 30 3b 0a 20 20 20 20 7d 65  force)>0;.    }e
201d0 6c 73 65 7b 0a 20 20 20 20 20 20 73 74 72 75 63  lse{.      struc
201e0 74 20 73 74 61 74 66 73 20 66 73 49 6e 66 6f 3b  t statfs fsInfo;
201f0 0a 20 20 20 20 20 20 69 66 28 20 73 74 61 74 66  .      if( statf
20200 73 28 7a 50 61 74 68 2c 20 26 66 73 49 6e 66 6f  s(zPath, &fsInfo
20210 29 20 3d 3d 20 2d 31 20 29 7b 0a 20 20 20 20 20  ) == -1 ){.     
20220 20 20 20 2f 2a 20 49 6e 20 74 68 65 6f 72 79 2c     /* In theory,
20230 20 74 68 65 20 63 6c 6f 73 65 28 66 64 29 20 63   the close(fd) c
20240 61 6c 6c 20 69 73 20 73 75 62 2d 6f 70 74 69 6d  all is sub-optim
20250 61 6c 2e 20 49 66 20 74 68 65 20 66 69 6c 65 20  al. If the file 
20260 6f 70 65 6e 65 64 0a 20 20 20 20 20 20 20 20 2a  opened.        *
20270 2a 20 77 69 74 68 20 66 64 20 69 73 20 61 20 64  * with fd is a d
20280 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 61 6e  atabase file, an
20290 64 20 74 68 65 72 65 20 61 72 65 20 6f 74 68 65  d there are othe
202a0 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 70  r connections op
202b0 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e  en.        ** on
202c0 20 74 68 61 74 20 66 69 6c 65 20 74 68 61 74 20   that file that 
202d0 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 68 6f  are currently ho
202e0 6c 64 69 6e 67 20 61 64 76 69 73 6f 72 79 20 6c  lding advisory l
202f0 6f 63 6b 73 20 6f 6e 20 69 74 2c 0a 20 20 20 20  ocks on it,.    
20300 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20      ** then the 
20310 63 61 6c 6c 20 74 6f 20 63 6c 6f 73 65 28 29 20  call to close() 
20320 77 69 6c 6c 20 63 61 6e 63 65 6c 20 74 68 6f 73  will cancel thos
20330 65 20 6c 6f 63 6b 73 2e 20 49 6e 20 70 72 61 63  e locks. In prac
20340 74 69 63 65 2c 0a 20 20 20 20 20 20 20 20 2a 2a  tice,.        **
20350 20 77 65 27 72 65 20 61 73 73 75 6d 69 6e 67 20   we're assuming 
20360 74 68 61 74 20 73 74 61 74 66 73 28 29 20 64 6f  that statfs() do
20370 65 73 6e 27 74 20 66 61 69 6c 20 76 65 72 79 20  esn't fail very 
20380 6f 66 74 65 6e 2e 20 41 74 20 6c 65 61 73 74 0a  often. At least.
20390 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20 77          ** not w
203a0 68 69 6c 65 20 6f 74 68 65 72 20 66 69 6c 65 20  hile other file 
203b0 64 65 73 63 72 69 70 74 6f 72 73 20 6f 70 65 6e  descriptors open
203c0 65 64 20 62 79 20 74 68 65 20 73 61 6d 65 20 70  ed by the same p
203d0 72 6f 63 65 73 73 20 6f 6e 0a 20 20 20 20 20 20  rocess on.      
203e0 20 20 2a 2a 20 74 68 65 20 73 61 6d 65 20 66 69    ** the same fi
203f0 6c 65 20 61 72 65 20 77 6f 72 6b 69 6e 67 2e 20  le are working. 
20400 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c   */.        p->l
20410 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  astErrno = errno
20420 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 69  ;.        if( di
20430 72 66 64 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  rfd>=0 ){.      
20440 20 20 20 20 63 6c 6f 73 65 28 64 69 72 66 64 29      close(dirfd)
20450 3b 20 2f 2a 20 73 69 6c 65 6e 74 6c 79 20 6c 65  ; /* silently le
20460 61 6b 20 69 66 20 66 61 69 6c 2c 20 69 6e 20 65  ak if fail, in e
20470 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20  rror */.        
20480 7d 0a 20 20 20 20 20 20 20 20 63 6c 6f 73 65 28  }.        close(
20490 66 64 29 3b 20 2f 2a 20 73 69 6c 65 6e 74 6c 79  fd); /* silently
204a0 20 6c 65 61 6b 20 69 66 20 66 61 69 6c 2c 20 69   leak if fail, i
204b0 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20  n error */.     
204c0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
204d0 4f 45 52 52 5f 41 43 43 45 53 53 3b 0a 20 20 20  OERR_ACCESS;.   
204e0 20 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 5f 66       goto open_f
204f0 69 6e 69 73 68 65 64 3b 0a 20 20 20 20 20 20 7d  inished;.      }
20500 0a 20 20 20 20 20 20 75 73 65 50 72 6f 78 79 20  .      useProxy 
20510 3d 20 21 28 66 73 49 6e 66 6f 2e 66 5f 66 6c 61  = !(fsInfo.f_fla
20520 67 73 26 4d 4e 54 5f 4c 4f 43 41 4c 29 3b 0a 20  gs&MNT_LOCAL);. 
20530 20 20 20 7d 0a 20 20 20 20 69 66 28 20 75 73 65     }.    if( use
20540 50 72 6f 78 79 20 29 7b 0a 20 20 20 20 20 20 72  Proxy ){.      r
20550 63 20 3d 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69  c = fillInUnixFi
20560 6c 65 28 70 56 66 73 2c 20 66 64 2c 20 64 69 72  le(pVfs, fd, dir
20570 66 64 2c 20 70 46 69 6c 65 2c 20 7a 50 61 74 68  fd, pFile, zPath
20580 2c 20 6e 6f 4c 6f 63 6b 2c 20 69 73 44 65 6c 65  , noLock, isDele
20590 74 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  te);.      if( r
205a0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
205b0 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 72 6f          rc = pro
205c0 78 79 54 72 61 6e 73 66 6f 72 6d 55 6e 69 78 46  xyTransformUnixF
205d0 69 6c 65 28 28 75 6e 69 78 46 69 6c 65 2a 29 70  ile((unixFile*)p
205e0 46 69 6c 65 2c 20 22 3a 61 75 74 6f 3a 22 29 3b  File, ":auto:");
205f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67  .      }.      g
20600 6f 74 6f 20 6f 70 65 6e 5f 66 69 6e 69 73 68 65  oto open_finishe
20610 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  d;.    }.  }.#en
20620 64 69 66 0a 20 20 0a 20 20 72 63 20 3d 20 66 69  dif.  .  rc = fi
20630 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 28 70 56 66  llInUnixFile(pVf
20640 73 2c 20 66 64 2c 20 64 69 72 66 64 2c 20 70 46  s, fd, dirfd, pF
20650 69 6c 65 2c 20 7a 50 61 74 68 2c 20 6e 6f 4c 6f  ile, zPath, noLo
20660 63 6b 2c 20 69 73 44 65 6c 65 74 65 29 3b 0a 6f  ck, isDelete);.o
20670 70 65 6e 5f 66 69 6e 69 73 68 65 64 3a 0a 20 20  pen_finished:.  
20680 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
20690 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
206a0 5f 66 72 65 65 28 70 2d 3e 70 55 6e 75 73 65 64  _free(p->pUnused
206b0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
206c0 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65  rc;.}.../*.** De
206d0 6c 65 74 65 20 74 68 65 20 66 69 6c 65 20 61 74  lete the file at
206e0 20 7a 50 61 74 68 2e 20 49 66 20 74 68 65 20 64   zPath. If the d
206f0 69 72 53 79 6e 63 20 61 72 67 75 6d 65 6e 74 20  irSync argument 
20700 69 73 20 74 72 75 65 2c 20 66 73 79 6e 63 28 29  is true, fsync()
20710 0a 2a 2a 20 74 68 65 20 64 69 72 65 63 74 6f 72  .** the director
20720 79 20 61 66 74 65 72 20 64 65 6c 65 74 69 6e 67  y after deleting
20730 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74   the file..*/.st
20740 61 74 69 63 20 69 6e 74 20 75 6e 69 78 44 65 6c  atic int unixDel
20750 65 74 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  ete(.  sqlite3_v
20760 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 20 20 20  fs *NotUsed,    
20770 20 2f 2a 20 56 46 53 20 63 6f 6e 74 61 69 6e 69   /* VFS containi
20780 6e 67 20 74 68 69 73 20 61 73 20 74 68 65 20 78  ng this as the x
20790 44 65 6c 65 74 65 20 6d 65 74 68 6f 64 20 2a 2f  Delete method */
207a0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
207b0 50 61 74 68 2c 20 20 20 20 20 20 20 20 2f 2a 20  Path,        /* 
207c0 4e 61 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f 20  Name of file to 
207d0 62 65 20 64 65 6c 65 74 65 64 20 2a 2f 0a 20 20  be deleted */.  
207e0 69 6e 74 20 64 69 72 53 79 6e 63 20 20 20 20 20  int dirSync     
207f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
20800 74 72 75 65 2c 20 66 73 79 6e 63 28 29 20 64 69  true, fsync() di
20810 72 65 63 74 6f 72 79 20 61 66 74 65 72 20 64 65  rectory after de
20820 6c 65 74 69 6e 67 20 66 69 6c 65 20 2a 2f 0a 29  leting file */.)
20830 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
20840 49 54 45 5f 4f 4b 3b 0a 20 20 55 4e 55 53 45 44  ITE_OK;.  UNUSED
20850 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
20860 65 64 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49  ed);.  SimulateI
20870 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51  OError(return SQ
20880 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54  LITE_IOERR_DELET
20890 45 29 3b 0a 20 20 75 6e 6c 69 6e 6b 28 7a 50 61  E);.  unlink(zPa
208a0 74 68 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  th);.#ifndef SQL
208b0 49 54 45 5f 44 49 53 41 42 4c 45 5f 44 49 52 53  ITE_DISABLE_DIRS
208c0 59 4e 43 0a 20 20 69 66 28 20 64 69 72 53 79 6e  YNC.  if( dirSyn
208d0 63 20 29 7b 0a 20 20 20 20 69 6e 74 20 66 64 3b  c ){.    int fd;
208e0 0a 20 20 20 20 72 63 20 3d 20 6f 70 65 6e 44 69  .    rc = openDi
208f0 72 65 63 74 6f 72 79 28 7a 50 61 74 68 2c 20 26  rectory(zPath, &
20900 66 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  fd);.    if( rc=
20910 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 23 69  =SQLITE_OK ){.#i
20920 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 20  f OS_VXWORKS.   
20930 20 20 20 69 66 28 20 66 73 79 6e 63 28 66 64 29     if( fsync(fd)
20940 3d 3d 2d 31 20 29 0a 23 65 6c 73 65 0a 20 20 20  ==-1 ).#else.   
20950 20 20 20 69 66 28 20 66 73 79 6e 63 28 66 64 29     if( fsync(fd)
20960 20 29 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   ).#endif.      
20970 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
20980 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f  QLITE_IOERR_DIR_
20990 46 53 59 4e 43 3b 0a 20 20 20 20 20 20 7d 0a 20  FSYNC;.      }. 
209a0 20 20 20 20 20 69 66 28 20 63 6c 6f 73 65 28 66       if( close(f
209b0 64 29 26 26 21 72 63 20 29 7b 0a 20 20 20 20 20  d)&&!rc ){.     
209c0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
209d0 4f 45 52 52 5f 44 49 52 5f 43 4c 4f 53 45 3b 0a  OERR_DIR_CLOSE;.
209e0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
209f0 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  }.#endif.  retur
20a00 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
20a10 65 73 74 20 74 68 65 20 65 78 69 73 74 61 6e 63  est the existanc
20a20 65 20 6f 66 20 6f 72 20 61 63 63 65 73 73 20 70  e of or access p
20a30 65 72 6d 69 73 73 69 6f 6e 73 20 6f 66 20 66 69  ermissions of fi
20a40 6c 65 20 7a 50 61 74 68 2e 20 54 68 65 0a 2a 2a  le zPath. The.**
20a50 20 74 65 73 74 20 70 65 72 66 6f 72 6d 65 64 20   test performed 
20a60 64 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 76  depends on the v
20a70 61 6c 75 65 20 6f 66 20 66 6c 61 67 73 3a 0a 2a  alue of flags:.*
20a80 2a 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f  *.**     SQLITE_
20a90 41 43 43 45 53 53 5f 45 58 49 53 54 53 3a 20 52  ACCESS_EXISTS: R
20aa0 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 66  eturn 1 if the f
20ab0 69 6c 65 20 65 78 69 73 74 73 0a 2a 2a 20 20 20  ile exists.**   
20ac0 20 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f    SQLITE_ACCESS_
20ad0 52 45 41 44 57 52 49 54 45 3a 20 52 65 74 75 72  READWRITE: Retur
20ae0 6e 20 31 20 69 66 20 74 68 65 20 66 69 6c 65 20  n 1 if the file 
20af0 69 73 20 72 65 61 64 20 61 6e 64 20 77 72 69 74  is read and writ
20b00 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 20 53 51 4c  able..**     SQL
20b10 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44 4f  ITE_ACCESS_READO
20b20 4e 4c 59 3a 20 52 65 74 75 72 6e 20 31 20 69 66  NLY: Return 1 if
20b30 20 74 68 65 20 66 69 6c 65 20 69 73 20 72 65 61   the file is rea
20b40 64 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  dable..**.** Oth
20b50 65 72 77 69 73 65 20 72 65 74 75 72 6e 20 30 2e  erwise return 0.
20b60 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
20b70 6e 69 78 41 63 63 65 73 73 28 0a 20 20 73 71 6c  nixAccess(.  sql
20b80 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65  ite3_vfs *NotUse
20b90 64 2c 20 20 20 2f 2a 20 54 68 65 20 56 46 53 20  d,   /* The VFS 
20ba0 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 69 73 20  containing this 
20bb0 78 41 63 63 65 73 73 20 6d 65 74 68 6f 64 20 2a  xAccess method *
20bc0 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
20bd0 7a 50 61 74 68 2c 20 20 20 20 20 20 2f 2a 20 50  zPath,      /* P
20be0 61 74 68 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ath of the file 
20bf0 74 6f 20 65 78 61 6d 69 6e 65 20 2a 2f 0a 20 20  to examine */.  
20c00 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20  int flags,      
20c10 20 20 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20          /* What 
20c20 64 6f 20 77 65 20 77 61 6e 74 20 74 6f 20 6c 65  do we want to le
20c30 61 72 6e 20 61 62 6f 75 74 20 74 68 65 20 7a 50  arn about the zP
20c40 61 74 68 20 66 69 6c 65 3f 20 2a 2f 0a 20 20 69  ath file? */.  i
20c50 6e 74 20 2a 70 52 65 73 4f 75 74 20 20 20 20 20  nt *pResOut     
20c60 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
20c70 72 65 73 75 6c 74 20 62 6f 6f 6c 65 61 6e 20 68  result boolean h
20c80 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
20c90 61 6d 6f 64 65 20 3d 20 30 3b 0a 20 20 55 4e 55  amode = 0;.  UNU
20ca0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
20cb0 74 55 73 65 64 29 3b 0a 20 20 53 69 6d 75 6c 61  tUsed);.  Simula
20cc0 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72  teIOError( retur
20cd0 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41  n SQLITE_IOERR_A
20ce0 43 43 45 53 53 3b 20 29 3b 0a 20 20 73 77 69 74  CCESS; );.  swit
20cf0 63 68 28 20 66 6c 61 67 73 20 29 7b 0a 20 20 20  ch( flags ){.   
20d00 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43   case SQLITE_ACC
20d10 45 53 53 5f 45 58 49 53 54 53 3a 0a 20 20 20 20  ESS_EXISTS:.    
20d20 20 20 61 6d 6f 64 65 20 3d 20 46 5f 4f 4b 3b 0a    amode = F_OK;.
20d30 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
20d40 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43   case SQLITE_ACC
20d50 45 53 53 5f 52 45 41 44 57 52 49 54 45 3a 0a 20  ESS_READWRITE:. 
20d60 20 20 20 20 20 61 6d 6f 64 65 20 3d 20 57 5f 4f       amode = W_O
20d70 4b 7c 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 62 72  K|R_OK;.      br
20d80 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
20d90 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44  LITE_ACCESS_READ
20da0 3a 0a 20 20 20 20 20 20 61 6d 6f 64 65 20 3d 20  :.      amode = 
20db0 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 62 72 65 61  R_OK;.      brea
20dc0 6b 3b 0a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  k;..    default:
20dd0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 21 22  .      assert(!"
20de0 49 6e 76 61 6c 69 64 20 66 6c 61 67 73 20 61 72  Invalid flags ar
20df0 67 75 6d 65 6e 74 22 29 3b 0a 20 20 7d 0a 20 20  gument");.  }.  
20e00 2a 70 52 65 73 4f 75 74 20 3d 20 28 61 63 63 65  *pResOut = (acce
20e10 73 73 28 7a 50 61 74 68 2c 20 61 6d 6f 64 65 29  ss(zPath, amode)
20e20 3d 3d 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  ==0);.  return S
20e30 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a  QLITE_OK;.}.../*
20e40 0a 2a 2a 20 54 75 72 6e 20 61 20 72 65 6c 61 74  .** Turn a relat
20e50 69 76 65 20 70 61 74 68 6e 61 6d 65 20 69 6e 74  ive pathname int
20e60 6f 20 61 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d  o a full pathnam
20e70 65 2e 20 54 68 65 20 72 65 6c 61 74 69 76 65 20  e. The relative 
20e80 70 61 74 68 0a 2a 2a 20 69 73 20 73 74 6f 72 65  path.** is store
20e90 64 20 61 73 20 61 20 6e 75 6c 2d 74 65 72 6d 69  d as a nul-termi
20ea0 6e 61 74 65 64 20 73 74 72 69 6e 67 20 69 6e 20  nated string in 
20eb0 74 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74  the buffer point
20ec0 65 64 20 74 6f 20 62 79 0a 2a 2a 20 7a 50 61 74  ed to by.** zPat
20ed0 68 2e 20 0a 2a 2a 0a 2a 2a 20 7a 4f 75 74 20 70  h. .**.** zOut p
20ee0 6f 69 6e 74 73 20 74 6f 20 61 20 62 75 66 66 65  oints to a buffe
20ef0 72 20 6f 66 20 61 74 20 6c 65 61 73 74 20 73 71  r of at least sq
20f00 6c 69 74 65 33 5f 76 66 73 2e 6d 78 50 61 74 68  lite3_vfs.mxPath
20f10 6e 61 6d 65 20 62 79 74 65 73 20 0a 2a 2a 20 28  name bytes .** (
20f20 69 6e 20 74 68 69 73 20 63 61 73 65 2c 20 4d 41  in this case, MA
20f30 58 5f 50 41 54 48 4e 41 4d 45 20 62 79 74 65 73  X_PATHNAME bytes
20f40 29 2e 20 54 68 65 20 66 75 6c 6c 2d 70 61 74 68  ). The full-path
20f50 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 0a 2a   is written to.*
20f60 2a 20 74 68 69 73 20 62 75 66 66 65 72 20 62 65  * this buffer be
20f70 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
20f80 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
20f90 69 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 0a  ixFullPathname(.
20fa0 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
20fb0 56 66 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  Vfs,            
20fc0 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 76 66  /* Pointer to vf
20fd0 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 6f  s object */.  co
20fe0 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c  nst char *zPath,
20ff0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
21000 6f 73 73 69 62 6c 79 20 72 65 6c 61 74 69 76 65  ossibly relative
21010 20 69 6e 70 75 74 20 70 61 74 68 20 2a 2f 0a 20   input path */. 
21020 20 69 6e 74 20 6e 4f 75 74 2c 20 20 20 20 20 20   int nOut,      
21030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21040 2a 20 53 69 7a 65 20 6f 66 20 6f 75 74 70 75 74  * Size of output
21050 20 62 75 66 66 65 72 20 69 6e 20 62 79 74 65 73   buffer in bytes
21060 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74   */.  char *zOut
21070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21080 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 62 75      /* Output bu
21090 66 66 65 72 20 2a 2f 0a 29 7b 0a 0a 20 20 2f 2a  ffer */.){..  /*
210a0 20 49 74 27 73 20 6f 64 64 20 74 6f 20 73 69 6d   It's odd to sim
210b0 75 6c 61 74 65 20 61 6e 20 69 6f 2d 65 72 72 6f  ulate an io-erro
210c0 72 20 68 65 72 65 2c 20 62 75 74 20 72 65 61 6c  r here, but real
210d0 6c 79 20 74 68 69 73 20 69 73 20 6a 75 73 74 0a  ly this is just.
210e0 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 69    ** using the i
210f0 6f 2d 65 72 72 6f 72 20 69 6e 66 72 61 73 74 72  o-error infrastr
21100 75 63 74 75 72 65 20 74 6f 20 74 65 73 74 20 74  ucture to test t
21110 68 61 74 20 53 51 4c 69 74 65 20 68 61 6e 64 6c  hat SQLite handl
21120 65 73 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e  es this.  ** fun
21130 63 74 69 6f 6e 20 66 61 69 6c 69 6e 67 2e 20 54  ction failing. T
21140 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 75  his function cou
21150 6c 64 20 66 61 69 6c 20 69 66 2c 20 66 6f 72 20  ld fail if, for 
21160 65 78 61 6d 70 6c 65 2c 20 74 68 65 0a 20 20 2a  example, the.  *
21170 2a 20 63 75 72 72 65 6e 74 20 77 6f 72 6b 69 6e  * current workin
21180 67 20 64 69 72 65 63 74 6f 72 79 20 68 61 73 20  g directory has 
21190 62 65 65 6e 20 75 6e 6c 69 6e 6b 65 64 2e 0a 20  been unlinked.. 
211a0 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f   */.  SimulateIO
211b0 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51  Error( return SQ
211c0 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a 0a 20  LITE_ERROR );.. 
211d0 20 61 73 73 65 72 74 28 20 70 56 66 73 2d 3e 6d   assert( pVfs->m
211e0 78 50 61 74 68 6e 61 6d 65 3d 3d 4d 41 58 5f 50  xPathname==MAX_P
211f0 41 54 48 4e 41 4d 45 20 29 3b 0a 20 20 55 4e 55  ATHNAME );.  UNU
21200 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56  SED_PARAMETER(pV
21210 66 73 29 3b 0a 0a 20 20 7a 4f 75 74 5b 6e 4f 75  fs);..  zOut[nOu
21220 74 2d 31 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 69  t-1] = '\0';.  i
21230 66 28 20 7a 50 61 74 68 5b 30 5d 3d 3d 27 2f 27  f( zPath[0]=='/'
21240 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
21250 73 6e 70 72 69 6e 74 66 28 6e 4f 75 74 2c 20 7a  snprintf(nOut, z
21260 4f 75 74 2c 20 22 25 73 22 2c 20 7a 50 61 74 68  Out, "%s", zPath
21270 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
21280 69 6e 74 20 6e 43 77 64 3b 0a 20 20 20 20 69 66  int nCwd;.    if
21290 28 20 67 65 74 63 77 64 28 7a 4f 75 74 2c 20 6e  ( getcwd(zOut, n
212a0 4f 75 74 2d 31 29 3d 3d 30 20 29 7b 0a 20 20 20  Out-1)==0 ){.   
212b0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
212c0 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 20 20 7d  _CANTOPEN;.    }
212d0 0a 20 20 20 20 6e 43 77 64 20 3d 20 28 69 6e 74  .    nCwd = (int
212e0 29 73 74 72 6c 65 6e 28 7a 4f 75 74 29 3b 0a 20  )strlen(zOut);. 
212f0 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
21300 6e 74 66 28 6e 4f 75 74 2d 6e 43 77 64 2c 20 26  ntf(nOut-nCwd, &
21310 7a 4f 75 74 5b 6e 43 77 64 5d 2c 20 22 2f 25 73  zOut[nCwd], "/%s
21320 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 20  ", zPath);.  }. 
21330 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
21340 4b 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53  K;.}...#ifndef S
21350 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f  QLITE_OMIT_LOAD_
21360 45 58 54 45 4e 53 49 4f 4e 0a 2f 2a 0a 2a 2a 20  EXTENSION./*.** 
21370 49 6e 74 65 72 66 61 63 65 73 20 66 6f 72 20 6f  Interfaces for o
21380 70 65 6e 69 6e 67 20 61 20 73 68 61 72 65 64 20  pening a shared 
21390 6c 69 62 72 61 72 79 2c 20 66 69 6e 64 69 6e 67  library, finding
213a0 20 65 6e 74 72 79 20 70 6f 69 6e 74 73 0a 2a 2a   entry points.**
213b0 20 77 69 74 68 69 6e 20 74 68 65 20 73 68 61 72   within the shar
213c0 65 64 20 6c 69 62 72 61 72 79 2c 20 61 6e 64 20  ed library, and 
213d0 63 6c 6f 73 69 6e 67 20 74 68 65 20 73 68 61 72  closing the shar
213e0 65 64 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 23  ed library..*/.#
213f0 69 6e 63 6c 75 64 65 20 3c 64 6c 66 63 6e 2e 68  include <dlfcn.h
21400 3e 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 75  >.static void *u
21410 6e 69 78 44 6c 4f 70 65 6e 28 73 71 6c 69 74 65  nixDlOpen(sqlite
21420 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20  3_vfs *NotUsed, 
21430 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
21440 65 6e 61 6d 65 29 7b 0a 20 20 55 4e 55 53 45 44  ename){.  UNUSED
21450 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
21460 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 64 6c  ed);.  return dl
21470 6f 70 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20  open(zFilename, 
21480 52 54 4c 44 5f 4e 4f 57 20 7c 20 52 54 4c 44 5f  RTLD_NOW | RTLD_
21490 47 4c 4f 42 41 4c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  GLOBAL);.}../*.*
214a0 2a 20 53 51 4c 69 74 65 20 63 61 6c 6c 73 20 74  * SQLite calls t
214b0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 6d 6d  his function imm
214c0 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20 61  ediately after a
214d0 20 63 61 6c 6c 20 74 6f 20 75 6e 69 78 44 6c 53   call to unixDlS
214e0 79 6d 28 29 20 6f 72 0a 2a 2a 20 75 6e 69 78 44  ym() or.** unixD
214f0 6c 4f 70 65 6e 28 29 20 66 61 69 6c 73 20 28 72  lOpen() fails (r
21500 65 74 75 72 6e 73 20 61 20 6e 75 6c 6c 20 70 6f  eturns a null po
21510 69 6e 74 65 72 29 2e 20 49 66 20 61 20 6d 6f 72  inter). If a mor
21520 65 20 64 65 74 61 69 6c 65 64 20 65 72 72 6f 72  e detailed error
21530 0a 2a 2a 20 6d 65 73 73 61 67 65 20 69 73 20 61  .** message is a
21540 76 61 69 6c 61 62 6c 65 2c 20 69 74 20 69 73 20  vailable, it is 
21550 77 72 69 74 74 65 6e 20 74 6f 20 7a 42 75 66 4f  written to zBufO
21560 75 74 2e 20 49 66 20 6e 6f 20 65 72 72 6f 72 20  ut. If no error 
21570 6d 65 73 73 61 67 65 0a 2a 2a 20 69 73 20 61 76  message.** is av
21580 61 69 6c 61 62 6c 65 2c 20 7a 42 75 66 4f 75 74  ailable, zBufOut
21590 20 69 73 20 6c 65 66 74 20 75 6e 6d 6f 64 69 66   is left unmodif
215a0 69 65 64 20 61 6e 64 20 53 51 4c 69 74 65 20 75  ied and SQLite u
215b0 73 65 73 20 61 20 64 65 66 61 75 6c 74 0a 2a 2a  ses a default.**
215c0 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a   error message..
215d0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  */.static void u
215e0 6e 69 78 44 6c 45 72 72 6f 72 28 73 71 6c 69 74  nixDlError(sqlit
215f0 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c  e3_vfs *NotUsed,
21600 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20   int nBuf, char 
21610 2a 7a 42 75 66 4f 75 74 29 7b 0a 20 20 63 68 61  *zBufOut){.  cha
21620 72 20 2a 7a 45 72 72 3b 0a 20 20 55 4e 55 53 45  r *zErr;.  UNUSE
21630 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
21640 73 65 64 29 3b 0a 20 20 75 6e 69 78 45 6e 74 65  sed);.  unixEnte
21650 72 4d 75 74 65 78 28 29 3b 0a 20 20 7a 45 72 72  rMutex();.  zErr
21660 20 3d 20 64 6c 65 72 72 6f 72 28 29 3b 0a 20 20   = dlerror();.  
21670 69 66 28 20 7a 45 72 72 20 29 7b 0a 20 20 20 20  if( zErr ){.    
21680 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
21690 28 6e 42 75 66 2c 20 7a 42 75 66 4f 75 74 2c 20  (nBuf, zBufOut, 
216a0 22 25 73 22 2c 20 7a 45 72 72 29 3b 0a 20 20 7d  "%s", zErr);.  }
216b0 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65  .  unixLeaveMute
216c0 78 28 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  x();.}.static vo
216d0 69 64 20 28 2a 75 6e 69 78 44 6c 53 79 6d 28 73  id (*unixDlSym(s
216e0 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55  qlite3_vfs *NotU
216f0 73 65 64 2c 20 76 6f 69 64 20 2a 70 2c 20 63 6f  sed, void *p, co
21700 6e 73 74 20 63 68 61 72 2a 7a 53 79 6d 29 29 28  nst char*zSym))(
21710 76 6f 69 64 29 7b 0a 20 20 2f 2a 20 0a 20 20 2a  void){.  /* .  *
21720 2a 20 47 43 43 20 77 69 74 68 20 2d 70 65 64 61  * GCC with -peda
21730 6e 74 69 63 2d 65 72 72 6f 72 73 20 73 61 79 73  ntic-errors says
21740 20 74 68 61 74 20 43 39 30 20 64 6f 65 73 20 6e   that C90 does n
21750 6f 74 20 61 6c 6c 6f 77 20 61 20 76 6f 69 64 2a  ot allow a void*
21760 20 74 6f 20 62 65 0a 20 20 2a 2a 20 63 61 73 74   to be.  ** cast
21770 20 69 6e 74 6f 20 61 20 70 6f 69 6e 74 65 72 20   into a pointer 
21780 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 2e 20 20  to a function.  
21790 41 6e 64 20 79 65 74 20 74 68 65 20 6c 69 62 72  And yet the libr
217a0 61 72 79 20 64 6c 73 79 6d 28 29 20 72 6f 75 74  ary dlsym() rout
217b0 69 6e 65 0a 20 20 2a 2a 20 72 65 74 75 72 6e 73  ine.  ** returns
217c0 20 61 20 76 6f 69 64 2a 20 77 68 69 63 68 20 69   a void* which i
217d0 73 20 72 65 61 6c 6c 79 20 61 20 70 6f 69 6e 74  s really a point
217e0 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e  er to a function
217f0 2e 20 20 53 6f 20 68 6f 77 20 64 6f 20 77 65 0a  .  So how do we.
21800 20 20 2a 2a 20 75 73 65 20 64 6c 73 79 6d 28 29    ** use dlsym()
21810 20 77 69 74 68 20 2d 70 65 64 61 6e 74 69 63 2d   with -pedantic-
21820 65 72 72 6f 72 73 3f 0a 20 20 2a 2a 0a 20 20 2a  errors?.  **.  *
21830 2a 20 56 61 72 69 61 62 6c 65 20 78 20 62 65 6c  * Variable x bel
21840 6f 77 20 69 73 20 64 65 66 69 6e 65 64 20 74 6f  ow is defined to
21850 20 62 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   be a pointer to
21860 20 61 20 66 75 6e 63 74 69 6f 6e 20 74 61 6b 69   a function taki
21870 6e 67 0a 20 20 2a 2a 20 70 61 72 61 6d 65 74 65  ng.  ** paramete
21880 72 73 20 76 6f 69 64 2a 20 61 6e 64 20 63 6f 6e  rs void* and con
21890 73 74 20 63 68 61 72 2a 20 61 6e 64 20 72 65 74  st char* and ret
218a0 75 72 6e 69 6e 67 20 61 20 70 6f 69 6e 74 65 72  urning a pointer
218b0 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 2e 0a   to a function..
218c0 20 20 2a 2a 20 57 65 20 69 6e 69 74 69 61 6c 69    ** We initiali
218d0 7a 65 20 78 20 62 79 20 61 73 73 69 67 6e 69 6e  ze x by assignin
218e0 67 20 69 74 20 61 20 70 6f 69 6e 74 65 72 20 74  g it a pointer t
218f0 6f 20 74 68 65 20 64 6c 73 79 6d 28 29 20 66 75  o the dlsym() fu
21900 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 28 54 68  nction..  ** (Th
21910 61 74 20 61 73 73 69 67 6e 6d 65 6e 74 20 72 65  at assignment re
21920 71 75 69 72 65 73 20 61 20 63 61 73 74 2e 29 20  quires a cast.) 
21930 20 54 68 65 6e 20 77 65 20 63 61 6c 6c 20 74 68   Then we call th
21940 65 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 0a  e function that.
21950 20 20 2a 2a 20 78 20 70 6f 69 6e 74 73 20 74 6f    ** x points to
21960 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  .  .  **.  ** Th
21970 69 73 20 77 6f 72 6b 2d 61 72 6f 75 6e 64 20 69  is work-around i
21980 73 20 75 6e 6c 69 6b 65 6c 79 20 74 6f 20 77 6f  s unlikely to wo
21990 72 6b 20 63 6f 72 72 65 63 74 6c 79 20 6f 6e 20  rk correctly on 
219a0 61 6e 79 20 73 79 73 74 65 6d 20 77 68 65 72 65  any system where
219b0 0a 20 20 2a 2a 20 79 6f 75 20 72 65 61 6c 6c 79  .  ** you really
219c0 20 63 61 6e 6e 6f 74 20 63 61 73 74 20 61 20 66   cannot cast a f
219d0 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 20  unction pointer 
219e0 69 6e 74 6f 20 76 6f 69 64 2a 2e 20 20 42 75 74  into void*.  But
219f0 20 74 68 65 6e 2c 20 6f 6e 20 74 68 65 0a 20 20   then, on the.  
21a00 2a 2a 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 64  ** other hand, d
21a10 6c 73 79 6d 28 29 20 77 69 6c 6c 20 6e 6f 74 20  lsym() will not 
21a20 77 6f 72 6b 20 6f 6e 20 73 75 63 68 20 61 20 73  work on such a s
21a30 79 73 74 65 6d 20 65 69 74 68 65 72 2c 20 73 6f  ystem either, so
21a40 20 77 65 20 68 61 76 65 0a 20 20 2a 2a 20 6e 6f   we have.  ** no
21a50 74 20 72 65 61 6c 6c 79 20 6c 6f 73 74 20 61 6e  t really lost an
21a60 79 74 68 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 76  ything..  */.  v
21a70 6f 69 64 20 28 2a 28 2a 78 29 28 76 6f 69 64 2a  oid (*(*x)(void*
21a80 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 29 28 76  ,const char*))(v
21a90 6f 69 64 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  oid);.  UNUSED_P
21aa0 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
21ab0 29 3b 0a 20 20 78 20 3d 20 28 76 6f 69 64 28 2a  );.  x = (void(*
21ac0 28 2a 29 28 76 6f 69 64 2a 2c 63 6f 6e 73 74 20  (*)(void*,const 
21ad0 63 68 61 72 2a 29 29 28 76 6f 69 64 29 29 64 6c  char*))(void))dl
21ae0 73 79 6d 3b 0a 20 20 72 65 74 75 72 6e 20 28 2a  sym;.  return (*
21af0 78 29 28 70 2c 20 7a 53 79 6d 29 3b 0a 7d 0a 73  x)(p, zSym);.}.s
21b00 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 44  tatic void unixD
21b10 6c 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 76  lClose(sqlite3_v
21b20 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 76 6f 69  fs *NotUsed, voi
21b30 64 20 2a 70 48 61 6e 64 6c 65 29 7b 0a 20 20 55  d *pHandle){.  U
21b40 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
21b50 4e 6f 74 55 73 65 64 29 3b 0a 20 20 64 6c 63 6c  NotUsed);.  dlcl
21b60 6f 73 65 28 70 48 61 6e 64 6c 65 29 3b 0a 7d 0a  ose(pHandle);.}.
21b70 23 65 6c 73 65 20 2f 2a 20 69 66 20 53 51 4c 49  #else /* if SQLI
21b80 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54  TE_OMIT_LOAD_EXT
21b90 45 4e 53 49 4f 4e 20 69 73 20 64 65 66 69 6e 65  ENSION is define
21ba0 64 3a 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20  d: */.  #define 
21bb0 75 6e 69 78 44 6c 4f 70 65 6e 20 20 30 0a 20 20  unixDlOpen  0.  
21bc0 23 64 65 66 69 6e 65 20 75 6e 69 78 44 6c 45 72  #define unixDlEr
21bd0 72 6f 72 20 30 0a 20 20 23 64 65 66 69 6e 65 20  ror 0.  #define 
21be0 75 6e 69 78 44 6c 53 79 6d 20 20 20 30 0a 20 20  unixDlSym   0.  
21bf0 23 64 65 66 69 6e 65 20 75 6e 69 78 44 6c 43 6c  #define unixDlCl
21c00 6f 73 65 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ose 0.#endif../*
21c10 0a 2a 2a 20 57 72 69 74 65 20 6e 42 75 66 20 62  .** Write nBuf b
21c20 79 74 65 73 20 6f 66 20 72 61 6e 64 6f 6d 20 64  ytes of random d
21c30 61 74 61 20 74 6f 20 74 68 65 20 73 75 70 70 6c  ata to the suppl
21c40 69 65 64 20 62 75 66 66 65 72 20 7a 42 75 66 2e  ied buffer zBuf.
21c50 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
21c60 6e 69 78 52 61 6e 64 6f 6d 6e 65 73 73 28 73 71  nixRandomness(sq
21c70 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73  lite3_vfs *NotUs
21c80 65 64 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68  ed, int nBuf, ch
21c90 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 55 4e 55  ar *zBuf){.  UNU
21ca0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
21cb0 74 55 73 65 64 29 3b 0a 20 20 61 73 73 65 72 74  tUsed);.  assert
21cc0 28 28 73 69 7a 65 5f 74 29 6e 42 75 66 3e 3d 28  ((size_t)nBuf>=(
21cd0 73 69 7a 65 6f 66 28 74 69 6d 65 5f 74 29 2b 73  sizeof(time_t)+s
21ce0 69 7a 65 6f 66 28 69 6e 74 29 29 29 3b 0a 0a 20  izeof(int)));.. 
21cf0 20 2f 2a 20 57 65 20 68 61 76 65 20 74 6f 20 69   /* We have to i
21d00 6e 69 74 69 61 6c 69 7a 65 20 7a 42 75 66 20 74  nitialize zBuf t
21d10 6f 20 70 72 65 76 65 6e 74 20 76 61 6c 67 72 69  o prevent valgri
21d20 6e 64 20 66 72 6f 6d 20 72 65 70 6f 72 74 69 6e  nd from reportin
21d30 67 0a 20 20 2a 2a 20 65 72 72 6f 72 73 2e 20 20  g.  ** errors.  
21d40 54 68 65 20 72 65 70 6f 72 74 73 20 69 73 73 75  The reports issu
21d50 65 64 20 62 79 20 76 61 6c 67 72 69 6e 64 20 61  ed by valgrind a
21d60 72 65 20 69 6e 63 6f 72 72 65 63 74 20 2d 20 77  re incorrect - w
21d70 65 20 77 6f 75 6c 64 0a 20 20 2a 2a 20 70 72 65  e would.  ** pre
21d80 66 65 72 20 74 68 61 74 20 74 68 65 20 72 61 6e  fer that the ran
21d90 64 6f 6d 6e 65 73 73 20 62 65 20 69 6e 63 72 65  domness be incre
21da0 61 73 65 64 20 62 79 20 6d 61 6b 69 6e 67 20 75  ased by making u
21db0 73 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 75  se of the.  ** u
21dc0 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 73 70 61  ninitialized spa
21dd0 63 65 20 69 6e 20 7a 42 75 66 20 2d 20 62 75 74  ce in zBuf - but
21de0 20 76 61 6c 67 72 69 6e 64 20 65 72 72 6f 72 73   valgrind errors
21df0 20 74 65 6e 64 20 74 6f 20 77 6f 72 72 79 0a 20   tend to worry. 
21e00 20 2a 2a 20 73 6f 6d 65 20 75 73 65 72 73 2e 20   ** some users. 
21e10 20 52 61 74 68 65 72 20 74 68 61 6e 20 61 72 67   Rather than arg
21e20 75 65 2c 20 69 74 20 73 65 65 6d 73 20 65 61 73  ue, it seems eas
21e30 69 65 72 20 6a 75 73 74 20 74 6f 20 69 6e 69 74  ier just to init
21e40 69 61 6c 69 7a 65 0a 20 20 2a 2a 20 74 68 65 20  ialize.  ** the 
21e50 77 68 6f 6c 65 20 61 72 72 61 79 20 61 6e 64 20  whole array and 
21e60 73 69 6c 65 6e 63 65 20 76 61 6c 67 72 69 6e 64  silence valgrind
21e70 2c 20 65 76 65 6e 20 69 66 20 74 68 61 74 20 6d  , even if that m
21e80 65 61 6e 73 20 6c 65 73 73 20 72 61 6e 64 6f 6d  eans less random
21e90 6e 65 73 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65  ness.  ** in the
21ea0 20 72 61 6e 64 6f 6d 20 73 65 65 64 2e 0a 20 20   random seed..  
21eb0 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 74 65 73  **.  ** When tes
21ec0 74 69 6e 67 2c 20 69 6e 69 74 69 61 6c 69 7a 69  ting, initializi
21ed0 6e 67 20 7a 42 75 66 5b 5d 20 74 6f 20 7a 65 72  ng zBuf[] to zer
21ee0 6f 20 69 73 20 61 6c 6c 20 77 65 20 64 6f 2e 20  o is all we do. 
21ef0 20 54 68 61 74 20 6d 65 61 6e 73 0a 20 20 2a 2a   That means.  **
21f00 20 74 68 61 74 20 77 65 20 61 6c 77 61 79 73 20   that we always 
21f10 75 73 65 20 74 68 65 20 73 61 6d 65 20 72 61 6e  use the same ran
21f20 64 6f 6d 20 6e 75 6d 62 65 72 20 73 65 71 75 65  dom number seque
21f30 6e 63 65 2e 20 20 54 68 69 73 20 6d 61 6b 65 73  nce.  This makes
21f40 20 74 68 65 0a 20 20 2a 2a 20 74 65 73 74 73 20   the.  ** tests 
21f50 72 65 70 65 61 74 61 62 6c 65 2e 0a 20 20 2a 2f  repeatable..  */
21f60 0a 20 20 6d 65 6d 73 65 74 28 7a 42 75 66 2c 20  .  memset(zBuf, 
21f70 30 2c 20 6e 42 75 66 29 3b 0a 23 69 66 20 21 64  0, nBuf);.#if !d
21f80 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45  efined(SQLITE_TE
21f90 53 54 29 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20  ST).  {.    int 
21fa0 70 69 64 2c 20 66 64 3b 0a 20 20 20 20 66 64 20  pid, fd;.    fd 
21fb0 3d 20 6f 70 65 6e 28 22 2f 64 65 76 2f 75 72 61  = open("/dev/ura
21fc0 6e 64 6f 6d 22 2c 20 4f 5f 52 44 4f 4e 4c 59 29  ndom", O_RDONLY)
21fd0 3b 0a 20 20 20 20 69 66 28 20 66 64 3c 30 20 29  ;.    if( fd<0 )
21fe0 7b 0a 20 20 20 20 20 20 74 69 6d 65 5f 74 20 74  {.      time_t t
21ff0 3b 0a 20 20 20 20 20 20 74 69 6d 65 28 26 74 29  ;.      time(&t)
22000 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a  ;.      memcpy(z
22010 42 75 66 2c 20 26 74 2c 20 73 69 7a 65 6f 66 28  Buf, &t, sizeof(
22020 74 29 29 3b 0a 20 20 20 20 20 20 70 69 64 20 3d  t));.      pid =
22030 20 67 65 74 70 69 64 28 29 3b 0a 20 20 20 20 20   getpid();.     
22040 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 73 69   memcpy(&zBuf[si
22050 7a 65 6f 66 28 74 29 5d 2c 20 26 70 69 64 2c 20  zeof(t)], &pid, 
22060 73 69 7a 65 6f 66 28 70 69 64 29 29 3b 0a 20 20  sizeof(pid));.  
22070 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
22080 6f 66 28 74 29 2b 73 69 7a 65 6f 66 28 70 69 64  of(t)+sizeof(pid
22090 29 3c 3d 28 73 69 7a 65 5f 74 29 6e 42 75 66 20  )<=(size_t)nBuf 
220a0 29 3b 0a 20 20 20 20 20 20 6e 42 75 66 20 3d 20  );.      nBuf = 
220b0 73 69 7a 65 6f 66 28 74 29 20 2b 20 73 69 7a 65  sizeof(t) + size
220c0 6f 66 28 70 69 64 29 3b 0a 20 20 20 20 7d 65 6c  of(pid);.    }el
220d0 73 65 7b 0a 20 20 20 20 20 20 6e 42 75 66 20 3d  se{.      nBuf =
220e0 20 72 65 61 64 28 66 64 2c 20 7a 42 75 66 2c 20   read(fd, zBuf, 
220f0 6e 42 75 66 29 3b 0a 20 20 20 20 20 20 63 6c 6f  nBuf);.      clo
22100 73 65 28 66 64 29 3b 0a 20 20 20 20 7d 0a 20 20  se(fd);.    }.  
22110 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  }.#endif.  retur
22120 6e 20 6e 42 75 66 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  n nBuf;.}.../*.*
22130 2a 20 53 6c 65 65 70 20 66 6f 72 20 61 20 6c 69  * Sleep for a li
22140 74 74 6c 65 20 77 68 69 6c 65 2e 20 20 52 65 74  ttle while.  Ret
22150 75 72 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f  urn the amount o
22160 66 20 74 69 6d 65 20 73 6c 65 70 74 2e 0a 2a 2a  f time slept..**
22170 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73   The argument is
22180 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d   the number of m
22190 69 63 72 6f 73 65 63 6f 6e 64 73 20 77 65 20 77  icroseconds we w
221a0 61 6e 74 20 74 6f 20 73 6c 65 65 70 2e 0a 2a 2a  ant to sleep..**
221b0 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
221c0 65 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  e is the number 
221d0 6f 66 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20  of microseconds 
221e0 6f 66 20 73 6c 65 65 70 20 61 63 74 75 61 6c 6c  of sleep actuall
221f0 79 0a 2a 2a 20 72 65 71 75 65 73 74 65 64 20 66  y.** requested f
22200 72 6f 6d 20 74 68 65 20 75 6e 64 65 72 6c 79 69  rom the underlyi
22210 6e 67 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  ng operating sys
22220 74 65 6d 2c 20 61 20 6e 75 6d 62 65 72 20 77 68  tem, a number wh
22230 69 63 68 0a 2a 2a 20 6d 69 67 68 74 20 62 65 20  ich.** might be 
22240 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20  greater than or 
22250 65 71 75 61 6c 20 74 6f 20 74 68 65 20 61 72 67  equal to the arg
22260 75 6d 65 6e 74 2c 20 62 75 74 20 6e 6f 74 20 6c  ument, but not l
22270 65 73 73 0a 2a 2a 20 74 68 61 6e 20 74 68 65 20  ess.** than the 
22280 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61  argument..*/.sta
22290 74 69 63 20 69 6e 74 20 75 6e 69 78 53 6c 65 65  tic int unixSlee
222a0 70 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e  p(sqlite3_vfs *N
222b0 6f 74 55 73 65 64 2c 20 69 6e 74 20 6d 69 63 72  otUsed, int micr
222c0 6f 73 65 63 6f 6e 64 73 29 7b 0a 23 69 66 20 4f  oseconds){.#if O
222d0 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74 72 75  S_VXWORKS.  stru
222e0 63 74 20 74 69 6d 65 73 70 65 63 20 73 70 3b 0a  ct timespec sp;.
222f0 0a 20 20 73 70 2e 74 76 5f 73 65 63 20 3d 20 6d  .  sp.tv_sec = m
22300 69 63 72 6f 73 65 63 6f 6e 64 73 20 2f 20 31 30  icroseconds / 10
22310 30 30 30 30 30 3b 0a 20 20 73 70 2e 74 76 5f 6e  00000;.  sp.tv_n
22320 73 65 63 20 3d 20 28 6d 69 63 72 6f 73 65 63 6f  sec = (microseco
22330 6e 64 73 20 25 20 31 30 30 30 30 30 30 29 20 2a  nds % 1000000) *
22340 20 31 30 30 30 3b 0a 20 20 6e 61 6e 6f 73 6c 65   1000;.  nanosle
22350 65 70 28 26 73 70 2c 20 4e 55 4c 4c 29 3b 0a 20  ep(&sp, NULL);. 
22360 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
22370 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65  R(NotUsed);.  re
22380 74 75 72 6e 20 6d 69 63 72 6f 73 65 63 6f 6e 64  turn microsecond
22390 73 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64  s;.#elif defined
223a0 28 48 41 56 45 5f 55 53 4c 45 45 50 29 20 26 26  (HAVE_USLEEP) &&
223b0 20 48 41 56 45 5f 55 53 4c 45 45 50 0a 20 20 75   HAVE_USLEEP.  u
223c0 73 6c 65 65 70 28 6d 69 63 72 6f 73 65 63 6f 6e  sleep(microsecon
223d0 64 73 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  ds);.  UNUSED_PA
223e0 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
223f0 3b 0a 20 20 72 65 74 75 72 6e 20 6d 69 63 72 6f  ;.  return micro
22400 73 65 63 6f 6e 64 73 3b 0a 23 65 6c 73 65 0a 20  seconds;.#else. 
22410 20 69 6e 74 20 73 65 63 6f 6e 64 73 20 3d 20 28   int seconds = (
22420 6d 69 63 72 6f 73 65 63 6f 6e 64 73 2b 39 39 39  microseconds+999
22430 39 39 39 29 2f 31 30 30 30 30 30 30 3b 0a 20 20  999)/1000000;.  
22440 73 6c 65 65 70 28 73 65 63 6f 6e 64 73 29 3b 0a  sleep(seconds);.
22450 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
22460 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72  ER(NotUsed);.  r
22470 65 74 75 72 6e 20 73 65 63 6f 6e 64 73 2a 31 30  eturn seconds*10
22480 30 30 30 30 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a  00000;.#endif.}.
22490 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
224a0 77 69 6e 67 20 76 61 72 69 61 62 6c 65 2c 20 69  wing variable, i
224b0 66 20 73 65 74 20 74 6f 20 61 20 6e 6f 6e 2d 7a  f set to a non-z
224c0 65 72 6f 20 76 61 6c 75 65 2c 20 69 73 20 69 6e  ero value, is in
224d0 74 65 72 70 72 65 74 65 64 20 61 73 0a 2a 2a 20  terpreted as.** 
224e0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 65  the number of se
224f0 63 6f 6e 64 73 20 73 69 6e 63 65 20 31 39 37 30  conds since 1970
22500 20 61 6e 64 20 69 73 20 75 73 65 64 20 74 6f 20   and is used to 
22510 73 65 74 20 74 68 65 20 72 65 73 75 6c 74 20 6f  set the result o
22520 66 0a 2a 2a 20 73 71 6c 69 74 65 33 4f 73 43 75  f.** sqlite3OsCu
22530 72 72 65 6e 74 54 69 6d 65 28 29 20 64 75 72 69  rrentTime() duri
22540 6e 67 20 74 65 73 74 69 6e 67 2e 0a 2a 2f 0a 23  ng testing..*/.#
22550 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
22560 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 75  T.int sqlite3_cu
22570 72 72 65 6e 74 5f 74 69 6d 65 20 3d 20 30 3b 20  rrent_time = 0; 
22580 20 2f 2a 20 46 61 6b 65 20 73 79 73 74 65 6d 20   /* Fake system 
22590 74 69 6d 65 20 69 6e 20 73 65 63 6f 6e 64 73 20  time in seconds 
225a0 73 69 6e 63 65 20 31 39 37 30 2e 20 2a 2f 0a 23  since 1970. */.#
225b0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e  endif../*.** Fin
225c0 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 69  d the current ti
225d0 6d 65 20 28 69 6e 20 55 6e 69 76 65 72 73 61 6c  me (in Universal
225e0 20 43 6f 6f 72 64 69 6e 61 74 65 64 20 54 69 6d   Coordinated Tim
225f0 65 29 2e 20 20 57 72 69 74 65 20 74 68 65 0a 2a  e).  Write the.*
22600 2a 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 61  * current time a
22610 6e 64 20 64 61 74 65 20 61 73 20 61 20 4a 75 6c  nd date as a Jul
22620 69 61 6e 20 44 61 79 20 6e 75 6d 62 65 72 20 69  ian Day number i
22630 6e 74 6f 20 2a 70 72 4e 6f 77 20 61 6e 64 0a 2a  nto *prNow and.*
22640 2a 20 72 65 74 75 72 6e 20 30 2e 20 20 52 65 74  * return 0.  Ret
22650 75 72 6e 20 31 20 69 66 20 74 68 65 20 74 69 6d  urn 1 if the tim
22660 65 20 61 6e 64 20 64 61 74 65 20 63 61 6e 6e 6f  e and date canno
22670 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73  t be found..*/.s
22680 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 43 75  tatic int unixCu
22690 72 72 65 6e 74 54 69 6d 65 28 73 71 6c 69 74 65  rrentTime(sqlite
226a0 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20  3_vfs *NotUsed, 
226b0 64 6f 75 62 6c 65 20 2a 70 72 4e 6f 77 29 7b 0a  double *prNow){.
226c0 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
226d0 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47  TE_OMIT_FLOATING
226e0 5f 50 4f 49 4e 54 29 0a 20 20 74 69 6d 65 5f 74  _POINT).  time_t
226f0 20 74 3b 0a 20 20 74 69 6d 65 28 26 74 29 3b 0a   t;.  time(&t);.
22700 20 20 2a 70 72 4e 6f 77 20 3d 20 28 28 28 73 71    *prNow = (((sq
22710 6c 69 74 65 33 5f 69 6e 74 36 34 29 74 29 2f 38  lite3_int64)t)/8
22720 36 34 30 20 2b 20 32 34 34 30 35 38 37 35 29 2f  640 + 24405875)/
22730 31 30 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65  10;.#elif define
22740 64 28 4e 4f 5f 47 45 54 54 4f 44 29 0a 20 20 74  d(NO_GETTOD).  t
22750 69 6d 65 5f 74 20 74 3b 0a 20 20 74 69 6d 65 28  ime_t t;.  time(
22760 26 74 29 3b 0a 20 20 2a 70 72 4e 6f 77 20 3d 20  &t);.  *prNow = 
22770 74 2f 38 36 34 30 30 2e 30 20 2b 20 32 34 34 30  t/86400.0 + 2440
22780 35 38 37 2e 35 3b 0a 23 65 6c 69 66 20 4f 53 5f  587.5;.#elif OS_
22790 56 58 57 4f 52 4b 53 0a 20 20 73 74 72 75 63 74  VXWORKS.  struct
227a0 20 74 69 6d 65 73 70 65 63 20 73 4e 6f 77 3b 0a   timespec sNow;.
227b0 20 20 63 6c 6f 63 6b 5f 67 65 74 74 69 6d 65 28    clock_gettime(
227c0 43 4c 4f 43 4b 5f 52 45 41 4c 54 49 4d 45 2c 20  CLOCK_REALTIME, 
227d0 26 73 4e 6f 77 29 3b 0a 20 20 2a 70 72 4e 6f 77  &sNow);.  *prNow
227e0 20 3d 20 32 34 34 30 35 38 37 2e 35 20 2b 20 73   = 2440587.5 + s
227f0 4e 6f 77 2e 74 76 5f 73 65 63 2f 38 36 34 30 30  Now.tv_sec/86400
22800 2e 30 20 2b 20 73 4e 6f 77 2e 74 76 5f 6e 73 65  .0 + sNow.tv_nse
22810 63 2f 38 36 34 30 30 30 30 30 30 30 30 30 30 30  c/86400000000000
22820 2e 30 3b 0a 23 65 6c 73 65 0a 20 20 73 74 72 75  .0;.#else.  stru
22830 63 74 20 74 69 6d 65 76 61 6c 20 73 4e 6f 77 3b  ct timeval sNow;
22840 0a 20 20 67 65 74 74 69 6d 65 6f 66 64 61 79 28  .  gettimeofday(
22850 26 73 4e 6f 77 2c 20 30 29 3b 0a 20 20 2a 70 72  &sNow, 0);.  *pr
22860 4e 6f 77 20 3d 20 32 34 34 30 35 38 37 2e 35 20  Now = 2440587.5 
22870 2b 20 73 4e 6f 77 2e 74 76 5f 73 65 63 2f 38 36  + sNow.tv_sec/86
22880 34 30 30 2e 30 20 2b 20 73 4e 6f 77 2e 74 76 5f  400.0 + sNow.tv_
22890 75 73 65 63 2f 38 36 34 30 30 30 30 30 30 30 30  usec/86400000000
228a0 2e 30 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64  .0;.#endif..#ifd
228b0 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
228c0 20 69 66 28 20 73 71 6c 69 74 65 33 5f 63 75 72   if( sqlite3_cur
228d0 72 65 6e 74 5f 74 69 6d 65 20 29 7b 0a 20 20 20  rent_time ){.   
228e0 20 2a 70 72 4e 6f 77 20 3d 20 73 71 6c 69 74 65   *prNow = sqlite
228f0 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 2f 38  3_current_time/8
22900 36 34 30 30 2e 30 20 2b 20 32 34 34 30 35 38 37  6400.0 + 2440587
22910 2e 35 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  .5;.  }.#endif. 
22920 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
22930 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65  R(NotUsed);.  re
22940 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
22950 20 57 65 20 61 64 64 65 64 20 74 68 65 20 78 47   We added the xG
22960 65 74 4c 61 73 74 45 72 72 6f 72 28 29 20 6d 65  etLastError() me
22970 74 68 6f 64 20 77 69 74 68 20 74 68 65 20 69 6e  thod with the in
22980 74 65 6e 74 69 6f 6e 20 6f 66 20 70 72 6f 76 69  tention of provi
22990 64 69 6e 67 0a 2a 2a 20 62 65 74 74 65 72 20 6c  ding.** better l
229a0 6f 77 2d 6c 65 76 65 6c 20 65 72 72 6f 72 20 6d  ow-level error m
229b0 65 73 73 61 67 65 73 20 77 68 65 6e 20 6f 70 65  essages when ope
229c0 72 61 74 69 6e 67 2d 73 79 73 74 65 6d 20 70 72  rating-system pr
229d0 6f 62 6c 65 6d 73 20 63 6f 6d 65 20 75 70 0a 2a  oblems come up.*
229e0 2a 20 64 75 72 69 6e 67 20 53 51 4c 69 74 65 20  * during SQLite 
229f0 6f 70 65 72 61 74 69 6f 6e 2e 20 20 42 75 74 20  operation.  But 
22a00 73 6f 20 66 61 72 2c 20 6e 6f 6e 65 20 6f 66 20  so far, none of 
22a10 74 68 61 74 20 68 61 73 20 62 65 65 6e 20 69 6d  that has been im
22a20 70 6c 65 6d 65 6e 74 65 64 0a 2a 2a 20 69 6e 20  plemented.** in 
22a30 74 68 65 20 63 6f 72 65 2e 20 20 53 6f 20 74 68  the core.  So th
22a40 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65  is routine is ne
22a50 76 65 72 20 63 61 6c 6c 65 64 2e 20 20 46 6f 72  ver called.  For
22a60 20 6e 6f 77 2c 20 69 74 20 69 73 20 6d 65 72 65   now, it is mere
22a70 6c 79 0a 2a 2a 20 61 20 70 6c 61 63 65 2d 68 6f  ly.** a place-ho
22a80 6c 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lder..*/.static 
22a90 69 6e 74 20 75 6e 69 78 47 65 74 4c 61 73 74 45  int unixGetLastE
22aa0 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73  rror(sqlite3_vfs
22ab0 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 4e   *NotUsed, int N
22ac0 6f 74 55 73 65 64 32 2c 20 63 68 61 72 20 2a 4e  otUsed2, char *N
22ad0 6f 74 55 73 65 64 33 29 7b 0a 20 20 55 4e 55 53  otUsed3){.  UNUS
22ae0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
22af0 55 73 65 64 29 3b 0a 20 20 55 4e 55 53 45 44 5f  Used);.  UNUSED_
22b00 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
22b10 64 32 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  d2);.  UNUSED_PA
22b20 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 33  RAMETER(NotUsed3
22b30 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  );.  return 0;.}
22b40 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*.***********
22b50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e  ************* En
22b60 64 20 6f 66 20 73 71 6c 69 74 65 33 5f 76 66 73  d of sqlite3_vfs
22b70 20 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a   methods *******
22b80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22b90 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
22ba0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22bb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22bc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22bd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22be0 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***/../*********
22bf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22c00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22c10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22c20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22c30 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
22c40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22c50 20 42 65 67 69 6e 20 50 72 6f 78 79 20 4c 6f 63   Begin Proxy Loc
22c60 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  king ***********
22c70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22c80 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 50 72 6f 78  *****.**.** Prox
22c90 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20 61 20 22  y locking is a "
22ca0 75 62 65 72 2d 6c 6f 63 6b 69 6e 67 2d 6d 65 74  uber-locking-met
22cb0 68 6f 64 22 20 69 6e 20 74 68 69 73 20 73 65 6e  hod" in this sen
22cc0 73 65 3a 20 20 49 74 20 75 73 65 73 20 74 68 65  se:  It uses the
22cd0 0a 2a 2a 20 6f 74 68 65 72 20 6c 6f 63 6b 69 6e  .** other lockin
22ce0 67 20 6d 65 74 68 6f 64 73 20 6f 6e 20 73 65 63  g methods on sec
22cf0 6f 6e 64 61 72 79 20 6c 6f 63 6b 20 66 69 6c 65  ondary lock file
22d00 73 2e 20 20 50 72 6f 78 79 20 6c 6f 63 6b 69 6e  s.  Proxy lockin
22d10 67 20 69 73 20 61 0a 2a 2a 20 6d 65 74 61 2d 6c  g is a.** meta-l
22d20 61 79 65 72 20 6f 76 65 72 20 74 6f 70 20 6f 66  ayer over top of
22d30 20 74 68 65 20 70 72 69 6d 69 74 69 76 65 20 6c   the primitive l
22d40 6f 63 6b 69 6e 67 20 69 6d 70 6c 65 6d 65 6e 74  ocking implement
22d50 65 64 20 61 62 6f 76 65 2e 20 20 46 6f 72 0a 2a  ed above.  For.*
22d60 2a 20 74 68 69 73 20 72 65 61 73 6f 6e 2c 20 74  * this reason, t
22d70 68 65 20 64 69 76 69 73 69 6f 6e 20 74 68 61 74  he division that
22d80 20 69 6d 70 6c 65 6d 65 6e 74 73 20 6f 66 20 70   implements of p
22d90 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20  roxy locking is 
22da0 64 65 66 65 72 72 65 64 0a 2a 2a 20 75 6e 74 69  deferred.** unti
22db0 6c 20 6c 61 74 65 20 69 6e 20 74 68 65 20 66 69  l late in the fi
22dc0 6c 65 20 28 68 65 72 65 29 20 61 66 74 65 72 20  le (here) after 
22dd0 61 6c 6c 20 6f 66 20 74 68 65 20 6f 74 68 65 72  all of the other
22de0 20 49 2f 4f 20 6d 65 74 68 6f 64 73 20 68 61 76   I/O methods hav
22df0 65 0a 2a 2a 20 62 65 65 6e 20 64 65 66 69 6e 65  e.** been define
22e00 64 20 2d 20 73 6f 20 74 68 61 74 20 74 68 65 20  d - so that the 
22e10 70 72 69 6d 69 74 69 76 65 20 6c 6f 63 6b 69 6e  primitive lockin
22e20 67 20 6d 65 74 68 6f 64 73 20 61 72 65 20 61 76  g methods are av
22e30 61 69 6c 61 62 6c 65 0a 2a 2a 20 61 73 20 73 65  ailable.** as se
22e40 72 76 69 63 65 73 20 74 6f 20 68 65 6c 70 20 77  rvices to help w
22e50 69 74 68 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e  ith the implemen
22e60 74 61 74 69 6f 6e 20 6f 66 20 70 72 6f 78 79 20  tation of proxy 
22e70 6c 6f 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a 2a 2a  locking..**.****
22e80 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 66 61 75  .**.** The defau
22e90 6c 74 20 6c 6f 63 6b 69 6e 67 20 73 63 68 65 6d  lt locking schem
22ea0 65 73 20 69 6e 20 53 51 4c 69 74 65 20 75 73 65  es in SQLite use
22eb0 20 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b   byte-range lock
22ec0 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 61 74 61  s on the.** data
22ed0 62 61 73 65 20 66 69 6c 65 20 74 6f 20 63 6f 6f  base file to coo
22ee0 72 64 69 6e 61 74 65 20 73 61 66 65 2c 20 63 6f  rdinate safe, co
22ef0 6e 63 75 72 72 65 6e 74 20 61 63 63 65 73 73 20  ncurrent access 
22f00 62 79 20 6d 75 6c 74 69 70 6c 65 20 72 65 61 64  by multiple read
22f10 65 72 73 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65  ers.** and write
22f20 72 73 20 5b 68 74 74 70 3a 2f 2f 73 71 6c 69 74  rs [http://sqlit
22f30 65 2e 6f 72 67 2f 6c 6f 63 6b 69 6e 67 76 33 2e  e.org/lockingv3.
22f40 68 74 6d 6c 5d 2e 20 20 54 68 65 20 66 69 76 65  html].  The five
22f50 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a   file locking.**
22f60 20 73 74 61 74 65 73 20 28 55 4e 4c 4f 43 4b 45   states (UNLOCKE
22f70 44 2c 20 50 45 4e 44 49 4e 47 2c 20 53 48 41 52  D, PENDING, SHAR
22f80 45 44 2c 20 52 45 53 45 52 56 45 44 2c 20 45 58  ED, RESERVED, EX
22f90 43 4c 55 53 49 56 45 29 20 61 72 65 20 69 6d 70  CLUSIVE) are imp
22fa0 6c 65 6d 65 6e 74 65 64 0a 2a 2a 20 61 73 20 50  lemented.** as P
22fb0 4f 53 49 58 20 72 65 61 64 20 26 20 77 72 69 74  OSIX read & writ
22fc0 65 20 6c 6f 63 6b 73 20 6f 76 65 72 20 66 69 78  e locks over fix
22fd0 65 64 20 73 65 74 20 6f 66 20 6c 6f 63 61 74 69  ed set of locati
22fe0 6f 6e 73 20 28 76 69 61 20 66 73 63 74 6c 29 2c  ons (via fsctl),
22ff0 0a 2a 2a 20 6f 6e 20 41 46 50 20 61 6e 64 20 53  .** on AFP and S
23000 4d 42 20 6f 6e 6c 79 20 65 78 63 6c 75 73 69 76  MB only exclusiv
23010 65 20 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63  e byte-range loc
23020 6b 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65  ks are available
23030 20 76 69 61 20 66 73 63 74 6c 0a 2a 2a 20 77 69   via fsctl.** wi
23040 74 68 20 5f 49 4f 57 52 28 27 7a 27 2c 20 32 33  th _IOWR('z', 23
23050 2c 20 73 74 72 75 63 74 20 42 79 74 65 52 61 6e  , struct ByteRan
23060 67 65 4c 6f 63 6b 50 42 32 29 20 74 6f 20 74 72  geLockPB2) to tr
23070 61 63 6b 20 74 68 65 20 73 61 6d 65 20 35 20 73  ack the same 5 s
23080 74 61 74 65 73 2e 0a 2a 2a 20 54 6f 20 73 69 6d  tates..** To sim
23090 75 6c 61 74 65 20 61 20 46 5f 52 44 4c 43 4b 20  ulate a F_RDLCK 
230a0 6f 6e 20 74 68 65 20 73 68 61 72 65 64 20 72 61  on the shared ra
230b0 6e 67 65 2c 20 6f 6e 20 41 46 50 20 61 20 72 61  nge, on AFP a ra
230c0 6e 64 6f 6d 6c 79 20 73 65 6c 65 63 74 65 64 0a  ndomly selected.
230d0 2a 2a 20 61 64 64 72 65 73 73 20 69 6e 20 74 68  ** address in th
230e0 65 20 73 68 61 72 65 64 20 72 61 6e 67 65 20 69  e shared range i
230f0 73 20 74 61 6b 65 6e 20 66 6f 72 20 61 20 53 48  s taken for a SH
23100 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20 65  ARED lock, the e
23110 6e 74 69 72 65 0a 2a 2a 20 73 68 61 72 65 64 20  ntire.** shared 
23120 72 61 6e 67 65 20 69 73 20 74 61 6b 65 6e 20 66  range is taken f
23130 6f 72 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  or an EXCLUSIVE 
23140 6c 6f 63 6b 29 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  lock):.**.**    
23150 20 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 20    PENDING_BYTE  
23160 20 20 20 20 20 20 30 78 34 30 30 30 30 30 30 30        0x40000000
23170 09 09 20 20 20 09 0a 2a 2a 20 20 20 20 20 20 52  ..   ..**      R
23180 45 53 45 52 56 45 44 5f 42 59 54 45 20 20 20 20  ESERVED_BYTE    
23190 20 20 20 30 78 34 30 30 30 30 30 30 31 0a 2a 2a     0x40000001.**
231a0 20 20 20 20 20 20 53 48 41 52 45 44 5f 52 41 4e        SHARED_RAN
231b0 47 45 20 20 20 20 20 20 20 20 30 78 34 30 30 30  GE        0x4000
231c0 30 30 30 32 20 2d 3e 20 30 78 34 30 30 30 30 32  0002 -> 0x400002
231d0 30 30 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 6f  00.**.** This wo
231e0 72 6b 73 20 77 65 6c 6c 20 6f 6e 20 74 68 65 20  rks well on the 
231f0 6c 6f 63 61 6c 20 66 69 6c 65 20 73 79 73 74 65  local file syste
23200 6d 2c 20 62 75 74 20 73 68 6f 77 73 20 61 20 6e  m, but shows a n
23210 65 61 72 6c 79 20 31 30 30 78 0a 2a 2a 20 73 6c  early 100x.** sl
23220 6f 77 64 6f 77 6e 20 69 6e 20 72 65 61 64 20 70  owdown in read p
23230 65 72 66 6f 72 6d 61 6e 63 65 20 6f 6e 20 41 46  erformance on AF
23240 50 20 62 65 63 61 75 73 65 20 74 68 65 20 41 46  P because the AF
23250 50 20 63 6c 69 65 6e 74 20 64 69 73 61 62 6c 65  P client disable
23260 73 0a 2a 2a 20 74 68 65 20 72 65 61 64 20 63 61  s.** the read ca
23270 63 68 65 20 77 68 65 6e 20 62 79 74 65 2d 72 61  che when byte-ra
23280 6e 67 65 20 6c 6f 63 6b 73 20 61 72 65 20 70 72  nge locks are pr
23290 65 73 65 6e 74 2e 20 20 45 6e 61 62 6c 69 6e 67  esent.  Enabling
232a0 20 74 68 65 20 72 65 61 64 0a 2a 2a 20 63 61 63   the read.** cac
232b0 68 65 20 65 78 70 6f 73 65 73 20 61 20 63 61 63  he exposes a cac
232c0 68 65 20 63 6f 68 65 72 65 6e 63 79 20 70 72 6f  he coherency pro
232d0 62 6c 65 6d 20 74 68 61 74 20 69 73 20 70 72 65  blem that is pre
232e0 73 65 6e 74 20 6f 6e 20 61 6c 6c 20 4f 53 20 58  sent on all OS X
232f0 0a 2a 2a 20 73 75 70 70 6f 72 74 65 64 20 6e 65  .** supported ne
23300 74 77 6f 72 6b 20 66 69 6c 65 20 73 79 73 74 65  twork file syste
23310 6d 73 2e 20 20 4e 46 53 20 61 6e 64 20 41 46 50  ms.  NFS and AFP
23320 20 62 6f 74 68 20 6f 62 73 65 72 76 65 20 74 68   both observe th
23330 65 0a 2a 2a 20 63 6c 6f 73 65 2d 74 6f 2d 6f 70  e.** close-to-op
23340 65 6e 20 73 65 6d 61 6e 74 69 63 73 20 66 6f 72  en semantics for
23350 20 65 6e 73 75 72 69 6e 67 20 63 61 63 68 65 20   ensuring cache 
23360 63 6f 68 65 72 65 6e 63 79 0a 2a 2a 20 5b 68 74  coherency.** [ht
23370 74 70 3a 2f 2f 6e 66 73 2e 73 6f 75 72 63 65 66  tp://nfs.sourcef
23380 6f 72 67 65 2e 6e 65 74 2f 23 66 61 71 5f 61 38  orge.net/#faq_a8
23390 5d 2c 20 77 68 69 63 68 20 64 6f 65 73 20 6e 6f  ], which does no
233a0 74 20 65 66 66 65 63 74 69 76 65 6c 79 0a 2a 2a  t effectively.**
233b0 20 61 64 64 72 65 73 73 20 74 68 65 20 72 65 71   address the req
233c0 75 69 72 65 6d 65 6e 74 73 20 66 6f 72 20 63 6f  uirements for co
233d0 6e 63 75 72 72 65 6e 74 20 64 61 74 61 62 61 73  ncurrent databas
233e0 65 20 61 63 63 65 73 73 20 62 79 20 6d 75 6c 74  e access by mult
233f0 69 70 6c 65 0a 2a 2a 20 72 65 61 64 65 72 73 20  iple.** readers 
23400 61 6e 64 20 77 72 69 74 65 72 73 0a 2a 2a 20 5b  and writers.** [
23410 68 74 74 70 3a 2f 2f 77 77 77 2e 6e 61 62 62 6c  http://www.nabbl
23420 65 2e 63 6f 6d 2f 53 51 4c 69 74 65 2d 6f 6e 2d  e.com/SQLite-on-
23430 4e 46 53 2d 63 61 63 68 65 2d 63 6f 68 65 72 65  NFS-cache-cohere
23440 6e 63 79 2d 74 64 31 35 36 35 35 37 30 31 2e 68  ncy-td15655701.h
23450 74 6d 6c 5d 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61  tml]..**.** To a
23460 64 64 72 65 73 73 20 74 68 65 20 70 65 72 66 6f  ddress the perfo
23470 72 6d 61 6e 63 65 20 61 6e 64 20 63 61 63 68 65  rmance and cache
23480 20 63 6f 68 65 72 65 6e 63 79 20 69 73 73 75 65   coherency issue
23490 73 2c 20 70 72 6f 78 79 20 66 69 6c 65 20 6c 6f  s, proxy file lo
234a0 63 6b 69 6e 67 0a 2a 2a 20 63 68 61 6e 67 65 73  cking.** changes
234b0 20 74 68 65 20 77 61 79 20 64 61 74 61 62 61 73   the way databas
234c0 65 20 61 63 63 65 73 73 20 69 73 20 63 6f 6e 74  e access is cont
234d0 72 6f 6c 6c 65 64 20 62 79 20 6c 69 6d 69 74 69  rolled by limiti
234e0 6e 67 20 61 63 63 65 73 73 20 74 6f 20 61 0a 2a  ng access to a.*
234f0 2a 20 73 69 6e 67 6c 65 20 68 6f 73 74 20 61 74  * single host at
23500 20 61 20 74 69 6d 65 20 61 6e 64 20 6d 6f 76 69   a time and movi
23510 6e 67 20 66 69 6c 65 20 6c 6f 63 6b 73 20 6f 66  ng file locks of
23520 66 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  f of the databas
23530 65 20 66 69 6c 65 0a 2a 2a 20 61 6e 64 20 6f 6e  e file.** and on
23540 74 6f 20 61 20 70 72 6f 78 79 20 66 69 6c 65 20  to a proxy file 
23550 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 66 69 6c  on the local fil
23560 65 20 73 79 73 74 65 6d 2e 20 20 0a 2a 2a 0a 2a  e system.  .**.*
23570 2a 0a 2a 2a 20 55 73 69 6e 67 20 70 72 6f 78 79  *.** Using proxy
23580 20 6c 6f 63 6b 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d   locks.** ------
23590 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a  -----------.**.*
235a0 2a 20 43 20 41 50 49 73 0a 2a 2a 0a 2a 2a 20 20  * C APIs.**.**  
235b0 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e  sqlite3_file_con
235c0 74 72 6f 6c 28 64 62 2c 20 64 62 6e 61 6d 65 2c  trol(db, dbname,
235d0 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b   SQLITE_SET_LOCK
235e0 50 52 4f 58 59 46 49 4c 45 2c 0a 2a 2a 20 20 20  PROXYFILE,.**   
235f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23600 20 20 20 20 3c 70 72 6f 78 79 5f 70 61 74 68 3e      <proxy_path>
23610 20 7c 20 22 3a 61 75 74 6f 3a 22 29 3b 0a 2a 2a   | ":auto:");.**
23620 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63    sqlite3_file_c
23630 6f 6e 74 72 6f 6c 28 64 62 2c 20 64 62 6e 61 6d  ontrol(db, dbnam
23640 65 2c 20 53 51 4c 49 54 45 5f 47 45 54 5f 4c 4f  e, SQLITE_GET_LO
23650 43 4b 50 52 4f 58 59 46 49 4c 45 2c 20 26 3c 70  CKPROXYFILE, &<p
23660 72 6f 78 79 5f 70 61 74 68 3e 29 3b 0a 2a 2a 0a  roxy_path>);.**.
23670 2a 2a 0a 2a 2a 20 53 51 4c 20 70 72 61 67 6d 61  **.** SQL pragma
23680 73 0a 2a 2a 0a 2a 2a 20 20 50 52 41 47 4d 41 20  s.**.**  PRAGMA 
23690 5b 64 61 74 61 62 61 73 65 2e 5d 6c 6f 63 6b 5f  [database.]lock_
236a0 70 72 6f 78 79 5f 66 69 6c 65 3d 3c 70 72 6f 78  proxy_file=<prox
236b0 79 5f 70 61 74 68 3e 20 7c 20 3a 61 75 74 6f 3a  y_path> | :auto:
236c0 0a 2a 2a 20 20 50 52 41 47 4d 41 20 5b 64 61 74  .**  PRAGMA [dat
236d0 61 62 61 73 65 2e 5d 6c 6f 63 6b 5f 70 72 6f 78  abase.]lock_prox
236e0 79 5f 66 69 6c 65 0a 2a 2a 0a 2a 2a 20 53 70 65  y_file.**.** Spe
236f0 63 69 66 79 69 6e 67 20 22 3a 61 75 74 6f 3a 22  cifying ":auto:"
23700 20 6d 65 61 6e 73 20 74 68 61 74 20 69 66 20 74   means that if t
23710 68 65 72 65 20 69 73 20 61 20 63 6f 6e 63 68 20  here is a conch 
23720 66 69 6c 65 20 77 69 74 68 20 61 20 6d 61 74 63  file with a matc
23730 68 69 6e 67 0a 2a 2a 20 68 6f 73 74 20 49 44 20  hing.** host ID 
23740 69 6e 20 69 74 2c 20 74 68 65 20 70 72 6f 78 79  in it, the proxy
23750 20 70 61 74 68 20 69 6e 20 74 68 65 20 63 6f 6e   path in the con
23760 63 68 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20  ch file will be 
23770 75 73 65 64 2c 20 6f 74 68 65 72 77 69 73 65 0a  used, otherwise.
23780 2a 2a 20 61 20 70 72 6f 78 79 20 70 61 74 68 20  ** a proxy path 
23790 62 61 73 65 64 20 6f 6e 20 74 68 65 20 75 73 65  based on the use
237a0 72 27 73 20 74 65 6d 70 20 64 69 72 0a 2a 2a 20  r's temp dir.** 
237b0 28 76 69 61 20 63 6f 6e 66 73 74 72 28 5f 43 53  (via confstr(_CS
237c0 5f 44 41 52 57 49 4e 5f 55 53 45 52 5f 54 45 4d  _DARWIN_USER_TEM
237d0 50 5f 44 49 52 2c 2e 2e 2e 29 29 20 77 69 6c 6c  P_DIR,...)) will
237e0 20 62 65 20 75 73 65 64 20 61 6e 64 20 74 68 65   be used and the
237f0 0a 2a 2a 20 61 63 74 75 61 6c 20 70 72 6f 78 79  .** actual proxy
23800 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 67 65   file name is ge
23810 6e 65 72 61 74 65 64 20 66 72 6f 6d 20 74 68 65  nerated from the
23820 20 6e 61 6d 65 20 61 6e 64 20 70 61 74 68 20 6f   name and path o
23830 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  f the.** databas
23840 65 20 66 69 6c 65 2e 20 20 46 6f 72 20 65 78 61  e file.  For exa
23850 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  mple:.**.**     
23860 20 20 46 6f 72 20 64 61 74 61 62 61 73 65 20 70    For database p
23870 61 74 68 20 22 2f 55 73 65 72 73 2f 6d 65 2f 66  ath "/Users/me/f
23880 6f 6f 2e 64 62 22 20 0a 2a 2a 20 20 20 20 20 20  oo.db" .**      
23890 20 54 68 65 20 6c 6f 63 6b 20 70 61 74 68 20 77   The lock path w
238a0 69 6c 6c 20 62 65 20 22 3c 74 6d 70 64 69 72 3e  ill be "<tmpdir>
238b0 2f 73 71 6c 69 74 65 70 6c 6f 63 6b 73 2f 5f 55  /sqliteplocks/_U
238c0 73 65 72 73 5f 6d 65 5f 66 6f 6f 2e 64 62 3a 61  sers_me_foo.db:a
238d0 75 74 6f 3a 22 29 0a 2a 2a 0a 2a 2a 20 4f 6e 63  uto:").**.** Onc
238e0 65 20 61 20 6c 6f 63 6b 20 70 72 6f 78 79 20 69  e a lock proxy i
238f0 73 20 63 6f 6e 66 69 67 75 72 65 64 20 66 6f 72  s configured for
23900 20 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e   a database conn
23910 65 63 74 69 6f 6e 2c 20 69 74 20 63 61 6e 20 6e  ection, it can n
23920 6f 74 0a 2a 2a 20 62 65 20 72 65 6d 6f 76 65 64  ot.** be removed
23930 2c 20 68 6f 77 65 76 65 72 20 69 74 20 6d 61 79  , however it may
23940 20 62 65 20 73 77 69 74 63 68 65 64 20 74 6f 20   be switched to 
23950 61 20 64 69 66 66 65 72 65 6e 74 20 70 72 6f 78  a different prox
23960 79 20 70 61 74 68 20 76 69 61 0a 2a 2a 20 74 68  y path via.** th
23970 65 20 61 62 6f 76 65 20 41 50 49 73 20 28 61 73  e above APIs (as
23980 73 75 6d 69 6e 67 20 74 68 65 20 63 6f 6e 63 68  suming the conch
23990 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 62 65 69   file is not bei
239a0 6e 67 20 68 65 6c 64 20 62 79 20 61 6e 6f 74 68  ng held by anoth
239b0 65 72 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e  er.** connection
239c0 20 6f 72 20 70 72 6f 63 65 73 73 29 2e 20 0a 2a   or process). .*
239d0 2a 0a 2a 2a 0a 2a 2a 20 48 6f 77 20 70 72 6f 78  *.**.** How prox
239e0 79 20 6c 6f 63 6b 69 6e 67 20 77 6f 72 6b 73 0a  y locking works.
239f0 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ** -------------
23a00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a  ----------.**.**
23a10 20 50 72 6f 78 79 20 66 69 6c 65 20 6c 6f 63 6b   Proxy file lock
23a20 69 6e 67 20 72 65 6c 69 65 73 20 70 72 69 6d 61  ing relies prima
23a30 72 69 6c 79 20 6f 6e 20 74 77 6f 20 6e 65 77 20  rily on two new 
23a40 73 75 70 70 6f 72 74 69 6e 67 20 66 69 6c 65 73  supporting files
23a50 3a 20 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 63 6f  : .**.**   *  co
23a60 6e 63 68 20 66 69 6c 65 20 74 6f 20 6c 69 6d 69  nch file to limi
23a70 74 20 61 63 63 65 73 73 20 74 6f 20 74 68 65 20  t access to the 
23a80 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
23a90 20 61 20 73 69 6e 67 6c 65 20 68 6f 73 74 0a 2a   a single host.*
23aa0 2a 20 20 20 20 20 20 61 74 20 61 20 74 69 6d 65  *      at a time
23ab0 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 70 72 6f 78  .**.**   *  prox
23ac0 79 20 66 69 6c 65 20 74 6f 20 61 63 74 20 61 73  y file to act as
23ad0 20 61 20 70 72 6f 78 79 20 66 6f 72 20 74 68 65   a proxy for the
23ae0 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20   advisory locks 
23af0 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a 20 20 20 20 20  normally.**     
23b00 20 74 61 6b 65 6e 20 6f 6e 20 74 68 65 20 64 61   taken on the da
23b10 74 61 62 61 73 65 0a 2a 2a 0a 2a 2a 20 54 68 65  tabase.**.** The
23b20 20 63 6f 6e 63 68 20 66 69 6c 65 20 2d 20 74 6f   conch file - to
23b30 20 75 73 65 20 61 20 70 72 6f 78 79 20 66 69 6c   use a proxy fil
23b40 65 2c 20 73 71 6c 69 74 65 20 6d 75 73 74 20 66  e, sqlite must f
23b50 69 72 73 74 20 22 68 6f 6c 64 20 74 68 65 20 63  irst "hold the c
23b60 6f 6e 63 68 22 0a 2a 2a 20 62 79 20 74 61 6b 69  onch".** by taki
23b70 6e 67 20 61 6e 20 73 71 6c 69 74 65 2d 73 74 79  ng an sqlite-sty
23b80 6c 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f  le shared lock o
23b90 6e 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65  n the conch file
23ba0 2c 20 72 65 61 64 69 6e 67 20 74 68 65 0a 2a 2a  , reading the.**
23bb0 20 63 6f 6e 74 65 6e 74 73 20 61 6e 64 20 63 6f   contents and co
23bc0 6d 70 61 72 69 6e 67 20 74 68 65 20 68 6f 73 74  mparing the host
23bd0 27 73 20 75 6e 69 71 75 65 20 68 6f 73 74 20 49  's unique host I
23be0 44 20 28 73 65 65 20 62 65 6c 6f 77 29 20 61 6e  D (see below) an
23bf0 64 20 6c 6f 63 6b 0a 2a 2a 20 70 72 6f 78 79 20  d lock.** proxy 
23c00 70 61 74 68 20 61 67 61 69 6e 73 74 20 74 68 65  path against the
23c10 20 76 61 6c 75 65 73 20 73 74 6f 72 65 64 20 69   values stored i
23c20 6e 20 74 68 65 20 63 6f 6e 63 68 2e 20 20 54 68  n the conch.  Th
23c30 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 69 73 0a  e conch file is.
23c40 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  ** stored in the
23c50 20 73 61 6d 65 20 64 69 72 65 63 74 6f 72 79 20   same directory 
23c60 61 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  as the database 
23c70 66 69 6c 65 20 61 6e 64 20 74 68 65 20 66 69 6c  file and the fil
23c80 65 20 6e 61 6d 65 0a 2a 2a 20 69 73 20 70 61 74  e name.** is pat
23c90 74 65 72 6e 65 64 20 61 66 74 65 72 20 74 68 65  terned after the
23ca0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e   database file n
23cb0 61 6d 65 20 61 73 20 22 2e 3c 64 61 74 61 62 61  ame as ".<databa
23cc0 73 65 6e 61 6d 65 3e 2d 63 6f 6e 63 68 22 2e 0a  sename>-conch"..
23cd0 2a 2a 20 49 66 20 74 68 65 20 63 6f 6e 63 68 20  ** If the conch 
23ce0 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78  file does not ex
23cf0 69 73 74 2c 20 6f 72 20 69 74 27 73 20 63 6f 6e  ist, or it's con
23d00 74 65 6e 74 73 20 64 6f 20 6e 6f 74 20 6d 61 74  tents do not mat
23d10 63 68 20 74 68 65 0a 2a 2a 20 68 6f 73 74 20 49  ch the.** host I
23d20 44 20 61 6e 64 2f 6f 72 20 70 72 6f 78 79 20 70  D and/or proxy p
23d30 61 74 68 2c 20 74 68 65 6e 20 74 68 65 20 6c 6f  ath, then the lo
23d40 63 6b 20 69 73 20 65 73 63 61 6c 61 74 65 64 20  ck is escalated 
23d50 74 6f 20 61 6e 20 65 78 63 6c 75 73 69 76 65 0a  to an exclusive.
23d60 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20 74 68 65 20  ** lock and the 
23d70 63 6f 6e 63 68 20 66 69 6c 65 20 63 6f 6e 74 65  conch file conte
23d80 6e 74 73 20 69 73 20 75 70 64 61 74 65 64 20 77  nts is updated w
23d90 69 74 68 20 74 68 65 20 68 6f 73 74 20 49 44 20  ith the host ID 
23da0 61 6e 64 20 70 72 6f 78 79 0a 2a 2a 20 70 61 74  and proxy.** pat
23db0 68 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 69  h and the lock i
23dc0 73 20 64 6f 77 6e 67 72 61 64 65 64 20 74 6f 20  s downgraded to 
23dd0 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 61 67  a shared lock ag
23de0 61 69 6e 2e 20 20 49 66 20 74 68 65 20 63 6f 6e  ain.  If the con
23df0 63 68 0a 2a 2a 20 69 73 20 68 65 6c 64 20 62 79  ch.** is held by
23e00 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73   another process
23e10 20 28 77 69 74 68 20 61 20 73 68 61 72 65 64 20   (with a shared 
23e20 6c 6f 63 6b 29 2c 20 74 68 65 20 65 78 63 6c 75  lock), the exclu
23e30 73 69 76 65 20 6c 6f 63 6b 0a 2a 2a 20 77 69 6c  sive lock.** wil
23e40 6c 20 66 61 69 6c 20 61 6e 64 20 53 51 4c 49 54  l fail and SQLIT
23e50 45 5f 42 55 53 59 20 69 73 20 72 65 74 75 72 6e  E_BUSY is return
23e60 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72  ed..**.** The pr
23e70 6f 78 79 20 66 69 6c 65 20 2d 20 61 20 73 69 6e  oxy file - a sin
23e80 67 6c 65 2d 62 79 74 65 20 66 69 6c 65 20 75 73  gle-byte file us
23e90 65 64 20 66 6f 72 20 61 6c 6c 20 61 64 76 69 73  ed for all advis
23ea0 6f 72 79 20 66 69 6c 65 20 6c 6f 63 6b 73 0a 2a  ory file locks.*
23eb0 2a 20 6e 6f 72 6d 61 6c 6c 79 20 74 61 6b 65 6e  * normally taken
23ec0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
23ed0 20 66 69 6c 65 2e 20 20 20 54 68 69 73 20 61 6c   file.   This al
23ee0 6c 6f 77 73 20 66 6f 72 20 73 61 66 65 20 73 68  lows for safe sh
23ef0 61 72 69 6e 67 0a 2a 2a 20 6f 66 20 74 68 65 20  aring.** of the 
23f00 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f  database file fo
23f10 72 20 6d 75 6c 74 69 70 6c 65 20 72 65 61 64 65  r multiple reade
23f20 72 73 20 61 6e 64 20 77 72 69 74 65 72 73 20 6f  rs and writers o
23f30 6e 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 68 6f  n the same.** ho
23f40 73 74 20 28 74 68 65 20 63 6f 6e 63 68 20 65 6e  st (the conch en
23f50 73 75 72 65 73 20 74 68 61 74 20 74 68 65 79 20  sures that they 
23f60 61 6c 6c 20 75 73 65 20 74 68 65 20 73 61 6d 65  all use the same
23f70 20 6c 6f 63 61 6c 20 6c 6f 63 6b 20 66 69 6c 65   local lock file
23f80 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69  )..**.** There i
23f90 73 20 61 20 74 68 69 72 64 20 66 69 6c 65 20 2d  s a third file -
23fa0 20 74 68 65 20 68 6f 73 74 20 49 44 20 66 69 6c   the host ID fil
23fb0 65 20 2d 20 75 73 65 64 20 61 73 20 61 20 70 65  e - used as a pe
23fc0 72 73 69 73 74 65 6e 74 20 72 65 63 6f 72 64 0a  rsistent record.
23fd0 2a 2a 20 6f 66 20 61 20 75 6e 69 71 75 65 20 69  ** of a unique i
23fe0 64 65 6e 74 69 66 69 65 72 20 66 6f 72 20 74 68  dentifier for th
23ff0 65 20 68 6f 73 74 2c 20 61 20 31 32 38 2d 62 79  e host, a 128-by
24000 74 65 20 75 6e 69 71 75 65 20 68 6f 73 74 20 69  te unique host i
24010 64 20 66 69 6c 65 0a 2a 2a 20 69 6e 20 74 68 65  d file.** in the
24020 20 70 61 74 68 20 64 65 66 69 6e 65 64 20 62 79   path defined by
24030 20 74 68 65 20 48 4f 53 54 49 44 50 41 54 48 20   the HOSTIDPATH 
24040 6d 61 63 72 6f 20 28 64 65 66 61 75 6c 74 20 76  macro (default v
24050 61 6c 75 65 20 69 73 0a 2a 2a 20 2f 4c 69 62 72  alue is.** /Libr
24060 61 72 79 2f 43 61 63 68 65 73 2f 2e 63 6f 6d 2e  ary/Caches/.com.
24070 61 70 70 6c 65 2e 73 71 6c 69 74 65 43 6f 6e 63  apple.sqliteConc
24080 68 48 6f 73 74 49 64 29 2e 0a 2a 2a 0a 2a 2a 20  hHostId)..**.** 
24090 52 65 71 75 65 73 74 69 6e 67 20 74 68 65 20 6c  Requesting the l
240a0 6f 63 6b 20 70 72 6f 78 79 20 64 6f 65 73 20 6e  ock proxy does n
240b0 6f 74 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74  ot immediately t
240c0 61 6b 65 20 74 68 65 20 63 6f 6e 63 68 2c 20 69  ake the conch, i
240d0 74 20 69 73 0a 2a 2a 20 6f 6e 6c 79 20 74 61 6b  t is.** only tak
240e0 65 6e 20 77 68 65 6e 20 74 68 65 20 66 69 72 73  en when the firs
240f0 74 20 72 65 71 75 65 73 74 20 74 6f 20 6c 6f 63  t request to loc
24100 6b 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  k database file 
24110 69 73 20 6d 61 64 65 2e 20 20 0a 2a 2a 20 54 68  is made.  .** Th
24120 69 73 20 6d 61 74 63 68 65 73 20 74 68 65 20 73  is matches the s
24130 65 6d 61 6e 74 69 63 73 20 6f 66 20 74 68 65 20  emantics of the 
24140 74 72 61 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b  traditional lock
24150 69 6e 67 20 62 65 68 61 76 69 6f 72 2c 20 77 68  ing behavior, wh
24160 65 72 65 0a 2a 2a 20 6f 70 65 6e 69 6e 67 20 61  ere.** opening a
24170 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 61   connection to a
24180 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 64   database file d
24190 6f 65 73 20 6e 6f 74 20 74 61 6b 65 20 61 20 6c  oes not take a l
241a0 6f 63 6b 20 6f 6e 20 69 74 2e 0a 2a 2a 20 54 68  ock on it..** Th
241b0 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 61 6e  e shared lock an
241c0 64 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20 64  d an open file d
241d0 65 73 63 72 69 70 74 6f 72 20 61 72 65 20 6d 61  escriptor are ma
241e0 69 6e 74 61 69 6e 65 64 20 75 6e 74 69 6c 20 0a  intained until .
241f0 2a 2a 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  ** the connectio
24200 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  n to the databas
24210 65 20 69 73 20 63 6c 6f 73 65 64 2e 20 0a 2a 2a  e is closed. .**
24220 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79 20 66 69  .** The proxy fi
24230 6c 65 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20  le and the lock 
24240 66 69 6c 65 20 61 72 65 20 6e 65 76 65 72 20 64  file are never d
24250 65 6c 65 74 65 64 20 73 6f 20 74 68 65 79 20 6f  eleted so they o
24260 6e 6c 79 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 62  nly need.** to b
24270 65 20 63 72 65 61 74 65 64 20 74 68 65 20 66 69  e created the fi
24280 72 73 74 20 74 69 6d 65 20 74 68 65 79 20 61 72  rst time they ar
24290 65 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 43 6f  e used..**.** Co
242a0 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f 70 74 69  nfiguration opti
242b0 6f 6e 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  ons.** ---------
242c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a  ------------.**.
242d0 2a 2a 20 20 53 51 4c 49 54 45 5f 50 52 45 46 45  **  SQLITE_PREFE
242e0 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 0a  R_PROXY_LOCKING.
242f0 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 44 61 74 61  **.**       Data
24300 62 61 73 65 20 66 69 6c 65 73 20 61 63 63 65 73  base files acces
24310 73 65 64 20 6f 6e 20 6e 6f 6e 2d 6c 6f 63 61 6c  sed on non-local
24320 20 66 69 6c 65 20 73 79 73 74 65 6d 73 20 61 72   file systems ar
24330 65 0a 2a 2a 20 20 20 20 20 20 20 61 75 74 6f 6d  e.**       autom
24340 61 74 69 63 61 6c 6c 79 20 63 6f 6e 66 69 67 75  atically configu
24350 72 65 64 20 66 6f 72 20 70 72 6f 78 79 20 6c 6f  red for proxy lo
24360 63 6b 69 6e 67 2c 20 6c 6f 63 6b 20 66 69 6c 65  cking, lock file
24370 73 20 61 72 65 0a 2a 2a 20 20 20 20 20 20 20 6e  s are.**       n
24380 61 6d 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c  amed automatical
24390 6c 79 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d  ly using the sam
243a0 65 20 6c 6f 67 69 63 20 61 73 0a 2a 2a 20 20 20  e logic as.**   
243b0 20 20 20 20 50 52 41 47 4d 41 20 6c 6f 63 6b 5f      PRAGMA lock_
243c0 70 72 6f 78 79 5f 66 69 6c 65 3d 22 3a 61 75 74  proxy_file=":aut
243d0 6f 3a 22 0a 2a 2a 20 20 20 20 0a 2a 2a 20 20 53  o:".**    .**  S
243e0 51 4c 49 54 45 5f 50 52 4f 58 59 5f 44 45 42 55  QLITE_PROXY_DEBU
243f0 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 45 6e  G.**.**       En
24400 61 62 6c 65 73 20 74 68 65 20 6c 6f 67 67 69 6e  ables the loggin
24410 67 20 6f 66 20 65 72 72 6f 72 20 6d 65 73 73 61  g of error messa
24420 67 65 73 20 64 75 72 69 6e 67 20 68 6f 73 74 20  ges during host 
24430 69 64 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 20  id file.**      
24440 20 72 65 74 72 69 65 76 61 6c 20 61 6e 64 20 63   retrieval and c
24450 72 65 61 74 69 6f 6e 0a 2a 2a 0a 2a 2a 20 20 48  reation.**.**  H
24460 4f 53 54 49 44 50 41 54 48 0a 2a 2a 0a 2a 2a 20  OSTIDPATH.**.** 
24470 20 20 20 20 20 20 4f 76 65 72 72 69 64 65 73 20        Overrides 
24480 74 68 65 20 64 65 66 61 75 6c 74 20 68 6f 73 74  the default host
24490 20 49 44 20 66 69 6c 65 20 70 61 74 68 20 6c 6f   ID file path lo
244a0 63 61 74 69 6f 6e 0a 2a 2a 0a 2a 2a 20 20 4c 4f  cation.**.**  LO
244b0 43 4b 50 52 4f 58 59 44 49 52 0a 2a 2a 0a 2a 2a  CKPROXYDIR.**.**
244c0 20 20 20 20 20 20 20 4f 76 65 72 72 69 64 65 73         Overrides
244d0 20 74 68 65 20 64 65 66 61 75 6c 74 20 64 69 72   the default dir
244e0 65 63 74 6f 72 79 20 75 73 65 64 20 66 6f 72 20  ectory used for 
244f0 6c 6f 63 6b 20 70 72 6f 78 79 20 66 69 6c 65 73  lock proxy files
24500 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 61   that.**       a
24510 72 65 20 6e 61 6d 65 64 20 61 75 74 6f 6d 61 74  re named automat
24520 69 63 61 6c 6c 79 20 76 69 61 20 74 68 65 20 22  ically via the "
24530 3a 61 75 74 6f 3a 22 20 73 65 74 74 69 6e 67 0a  :auto:" setting.
24540 2a 2a 0a 2a 2a 20 20 53 51 4c 49 54 45 5f 44 45  **.**  SQLITE_DE
24550 46 41 55 4c 54 5f 50 52 4f 58 59 44 49 52 5f 50  FAULT_PROXYDIR_P
24560 45 52 4d 49 53 53 49 4f 4e 53 0a 2a 2a 0a 2a 2a  ERMISSIONS.**.**
24570 20 20 20 20 20 20 20 50 65 72 6d 69 73 73 69 6f         Permissio
24580 6e 73 20 74 6f 20 75 73 65 20 77 68 65 6e 20 63  ns to use when c
24590 72 65 61 74 69 6e 67 20 61 20 64 69 72 65 63 74  reating a direct
245a0 6f 72 79 20 66 6f 72 20 73 74 6f 72 69 6e 67 20  ory for storing 
245b0 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 6c 6f 63  the.**       loc
245c0 6b 20 70 72 6f 78 79 20 66 69 6c 65 73 2c 20 6f  k proxy files, o
245d0 6e 6c 79 20 75 73 65 64 20 77 68 65 6e 20 4c 4f  nly used when LO
245e0 43 4b 50 52 4f 58 59 44 49 52 20 69 73 20 6e 6f  CKPROXYDIR is no
245f0 74 20 73 65 74 2e 0a 2a 2a 20 20 20 20 0a 2a 2a  t set..**    .**
24600 20 20 20 20 0a 2a 2a 20 41 73 20 6d 65 6e 74 69      .** As menti
24610 6f 6e 65 64 20 61 62 6f 76 65 2c 20 77 68 65 6e  oned above, when
24620 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 53   compiled with S
24630 51 4c 49 54 45 5f 50 52 45 46 45 52 5f 50 52 4f  QLITE_PREFER_PRO
24640 58 59 5f 4c 4f 43 4b 49 4e 47 2c 0a 2a 2a 20 73  XY_LOCKING,.** s
24650 65 74 74 69 6e 67 20 74 68 65 20 65 6e 76 69 72  etting the envir
24660 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c 65 20  onment variable 
24670 53 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52 4f  SQLITE_FORCE_PRO
24680 58 59 5f 4c 4f 43 4b 49 4e 47 20 74 6f 20 31 20  XY_LOCKING to 1 
24690 77 69 6c 6c 0a 2a 2a 20 66 6f 72 63 65 20 70 72  will.** force pr
246a0 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 62  oxy locking to b
246b0 65 20 75 73 65 64 20 66 6f 72 20 65 76 65 72 79  e used for every
246c0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f   database file o
246d0 70 65 6e 65 64 2c 20 61 6e 64 20 30 0a 2a 2a 20  pened, and 0.** 
246e0 77 69 6c 6c 20 66 6f 72 63 65 20 61 75 74 6f 6d  will force autom
246f0 61 74 69 63 20 70 72 6f 78 79 20 6c 6f 63 6b 69  atic proxy locki
24700 6e 67 20 74 6f 20 62 65 20 64 69 73 61 62 6c 65  ng to be disable
24710 64 20 66 6f 72 20 61 6c 6c 20 64 61 74 61 62 61  d for all databa
24720 73 65 0a 2a 2a 20 66 69 6c 65 73 20 28 65 78 70  se.** files (exp
24730 6c 69 63 69 74 79 20 63 61 6c 6c 69 6e 67 20 74  licity calling t
24740 68 65 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f  he SQLITE_SET_LO
24750 43 4b 50 52 4f 58 59 46 49 4c 45 20 70 72 61 67  CKPROXYFILE prag
24760 6d 61 20 6f 72 0a 2a 2a 20 73 71 6c 69 74 65 5f  ma or.** sqlite_
24770 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20 41 50 49  file_control API
24780 20 69 73 20 6e 6f 74 20 61 66 66 65 63 74 65 64   is not affected
24790 20 62 79 20 53 51 4c 49 54 45 5f 46 4f 52 43 45   by SQLITE_FORCE
247a0 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 29 2e  _PROXY_LOCKING).
247b0 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 78 79  .*/../*.** Proxy
247c0 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6f 6e 6c 79   locking is only
247d0 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 4d 61   available on Ma
247e0 63 4f 53 58 20 0a 2a 2f 0a 23 69 66 20 64 65 66  cOSX .*/.#if def
247f0 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
24800 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
24810 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 0a  _LOCKING_STYLE..
24820 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
24830 53 54 0a 2f 2a 20 73 69 6d 75 6c 61 74 65 20 6d  ST./* simulate m
24840 75 6c 74 69 70 6c 65 20 68 6f 73 74 73 20 62 79  ultiple hosts by
24850 20 63 72 65 61 74 69 6e 67 20 75 6e 69 71 75 65   creating unique
24860 20 68 6f 73 74 69 64 20 66 69 6c 65 20 70 61 74   hostid file pat
24870 68 73 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  hs */.int sqlite
24880 33 5f 68 6f 73 74 69 64 5f 6e 75 6d 20 3d 20 30  3_hostid_num = 0
24890 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ;.#endif../*.** 
248a0 54 68 65 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67  The proxyLocking
248b0 43 6f 6e 74 65 78 74 20 68 61 73 20 74 68 65 20  Context has the 
248c0 70 61 74 68 20 61 6e 64 20 66 69 6c 65 20 73 74  path and file st
248d0 72 75 63 74 75 72 65 73 20 66 6f 72 20 74 68 65  ructures for the
248e0 20 72 65 6d 6f 74 65 20 0a 2a 2a 20 61 6e 64 20   remote .** and 
248f0 6c 6f 63 61 6c 20 70 72 6f 78 79 20 66 69 6c 65  local proxy file
24900 73 20 69 6e 20 69 74 0a 2a 2f 0a 74 79 70 65 64  s in it.*/.typed
24910 65 66 20 73 74 72 75 63 74 20 70 72 6f 78 79 4c  ef struct proxyL
24920 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 70 72  ockingContext pr
24930 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  oxyLockingContex
24940 74 3b 0a 73 74 72 75 63 74 20 70 72 6f 78 79 4c  t;.struct proxyL
24950 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 7b 0a  ockingContext {.
24960 20 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63    unixFile *conc
24970 68 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20 2f  hFile;         /
24980 2a 20 4f 70 65 6e 20 63 6f 6e 63 68 20 66 69 6c  * Open conch fil
24990 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 63 6f 6e  e */.  char *con
249a0 63 68 46 69 6c 65 50 61 74 68 3b 20 20 20 20 20  chFilePath;     
249b0 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
249c0 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 2a 2f  he conch file */
249d0 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 6c 6f 63  .  unixFile *loc
249e0 6b 50 72 6f 78 79 3b 20 20 20 20 20 20 20 20 20  kProxy;         
249f0 2f 2a 20 4f 70 65 6e 20 70 72 6f 78 79 20 6c 6f  /* Open proxy lo
24a00 63 6b 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61  ck file */.  cha
24a10 72 20 2a 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68  r *lockProxyPath
24a20 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d  ;         /* Nam
24a30 65 20 6f 66 20 74 68 65 20 70 72 6f 78 79 20 6c  e of the proxy l
24a40 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68  ock file */.  ch
24a50 61 72 20 2a 64 62 50 61 74 68 3b 20 20 20 20 20  ar *dbPath;     
24a60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
24a70 6d 65 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 66  me of the open f
24a80 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 63 6f 6e  ile */.  int con
24a90 63 68 48 65 6c 64 3b 20 20 20 20 20 20 20 20 20  chHeld;         
24aa0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
24ab0 20 74 68 65 20 63 6f 6e 63 68 20 69 73 20 63 75   the conch is cu
24ac0 72 72 65 6e 74 6c 79 20 68 65 6c 64 20 2a 2f 0a  rrently held */.
24ad0 20 20 76 6f 69 64 20 2a 6f 6c 64 4c 6f 63 6b 69    void *oldLocki
24ae0 6e 67 43 6f 6e 74 65 78 74 3b 20 20 20 20 20 2f  ngContext;     /
24af0 2a 20 4f 72 69 67 69 6e 61 6c 20 6c 6f 63 6b 69  * Original locki
24b00 6e 67 63 6f 6e 74 65 78 74 20 74 6f 20 72 65 73  ngcontext to res
24b10 74 6f 72 65 20 6f 6e 20 63 6c 6f 73 65 20 2a 2f  tore on close */
24b20 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  .  sqlite3_io_me
24b30 74 68 6f 64 73 20 63 6f 6e 73 74 20 2a 70 4f 6c  thods const *pOl
24b40 64 4d 65 74 68 6f 64 3b 20 20 20 20 20 2f 2a 20  dMethod;     /* 
24b50 4f 72 69 67 69 6e 61 6c 20 49 2f 4f 20 6d 65 74  Original I/O met
24b60 68 6f 64 73 20 66 6f 72 20 63 6c 6f 73 65 20 2a  hods for close *
24b70 2f 0a 7d 3b 0a 0a 2f 2a 20 48 4f 53 54 49 44 4c  /.};../* HOSTIDL
24b80 45 4e 20 61 6e 64 20 43 4f 4e 43 48 4c 45 4e 20  EN and CONCHLEN 
24b90 62 6f 74 68 20 69 6e 63 6c 75 64 65 20 73 70 61  both include spa
24ba0 63 65 20 66 6f 72 20 74 68 65 20 73 74 72 69 6e  ce for the strin
24bb0 67 20 0a 2a 2a 20 74 65 72 6d 69 6e 61 74 69 6e  g .** terminatin
24bc0 67 20 6e 75 6c 20 0a 2a 2f 0a 23 64 65 66 69 6e  g nul .*/.#defin
24bd0 65 20 48 4f 53 54 49 44 4c 45 4e 20 20 20 20 20  e HOSTIDLEN     
24be0 20 20 20 20 31 32 38 0a 23 64 65 66 69 6e 65 20      128.#define 
24bf0 43 4f 4e 43 48 4c 45 4e 20 20 20 20 20 20 20 20  CONCHLEN        
24c00 20 20 28 4d 41 58 50 41 54 48 4c 45 4e 2b 48 4f    (MAXPATHLEN+HO
24c10 53 54 49 44 4c 45 4e 2b 31 29 0a 23 69 66 6e 64  STIDLEN+1).#ifnd
24c20 65 66 20 48 4f 53 54 49 44 50 41 54 48 0a 23 20  ef HOSTIDPATH.# 
24c30 64 65 66 69 6e 65 20 48 4f 53 54 49 44 50 41 54  define HOSTIDPAT
24c40 48 20 20 20 20 20 20 20 22 2f 4c 69 62 72 61 72  H       "/Librar
24c50 79 2f 43 61 63 68 65 73 2f 2e 63 6f 6d 2e 61 70  y/Caches/.com.ap
24c60 70 6c 65 2e 73 71 6c 69 74 65 43 6f 6e 63 68 48  ple.sqliteConchH
24c70 6f 73 74 49 64 22 0a 23 65 6e 64 69 66 0a 0a 2f  ostId".#endif../
24c80 2a 20 62 61 73 69 63 61 6c 6c 79 20 61 20 63 6f  * basically a co
24c90 70 79 20 6f 66 20 75 6e 69 78 52 61 6e 64 6f 6d  py of unixRandom
24ca0 6e 65 73 73 20 77 69 74 68 20 64 69 66 66 65 72  ness with differ
24cb0 65 6e 74 0a 2a 2a 20 74 65 73 74 20 62 65 68 61  ent.** test beha
24cc0 76 69 6f 72 20 62 75 69 6c 74 20 69 6e 20 2a 2f  vior built in */
24cd0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
24ce0 79 47 65 6e 65 72 61 74 65 48 6f 73 74 49 44 28  yGenerateHostID(
24cf0 63 68 61 72 20 2a 70 48 6f 73 74 49 44 29 7b 0a  char *pHostID){.
24d00 20 20 69 6e 74 20 70 69 64 2c 20 66 64 2c 20 6c    int pid, fd, l
24d10 65 6e 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  en;.  unsigned c
24d20 68 61 72 20 2a 6b 65 79 20 3d 20 28 75 6e 73 69  har *key = (unsi
24d30 67 6e 65 64 20 63 68 61 72 20 2a 29 70 48 6f 73  gned char *)pHos
24d40 74 49 44 3b 0a 20 20 0a 20 20 6d 65 6d 73 65 74  tID;.  .  memset
24d50 28 6b 65 79 2c 20 30 2c 20 48 4f 53 54 49 44 4c  (key, 0, HOSTIDL
24d60 45 4e 29 3b 0a 20 20 6c 65 6e 20 3d 20 30 3b 0a  EN);.  len = 0;.
24d70 20 20 66 64 20 3d 20 6f 70 65 6e 28 22 2f 64 65    fd = open("/de
24d80 76 2f 75 72 61 6e 64 6f 6d 22 2c 20 4f 5f 52 44  v/urandom", O_RD
24d90 4f 4e 4c 59 29 3b 0a 20 20 69 66 28 20 66 64 3e  ONLY);.  if( fd>
24da0 3d 30 20 29 7b 0a 20 20 20 20 6c 65 6e 20 3d 20  =0 ){.    len = 
24db0 72 65 61 64 28 66 64 2c 20 6b 65 79 2c 20 48 4f  read(fd, key, HO
24dc0 53 54 49 44 4c 45 4e 29 3b 0a 20 20 20 20 63 6c  STIDLEN);.    cl
24dd0 6f 73 65 28 66 64 29 3b 20 2f 2a 20 73 69 6c 65  ose(fd); /* sile
24de0 6e 74 6c 79 20 6c 65 61 6b 20 74 68 65 20 66 64  ntly leak the fd
24df0 20 69 66 20 69 74 20 66 61 69 6c 73 20 2a 2f 0a   if it fails */.
24e00 20 20 7d 0a 20 20 69 66 28 20 6c 65 6e 20 3c 20    }.  if( len < 
24e10 48 4f 53 54 49 44 4c 45 4e 20 29 7b 0a 20 20 20  HOSTIDLEN ){.   
24e20 20 74 69 6d 65 5f 74 20 74 3b 0a 20 20 20 20 74   time_t t;.    t
24e30 69 6d 65 28 26 74 29 3b 0a 20 20 20 20 6d 65 6d  ime(&t);.    mem
24e40 63 70 79 28 6b 65 79 2c 20 26 74 2c 20 73 69 7a  cpy(key, &t, siz
24e50 65 6f 66 28 74 29 29 3b 0a 20 20 20 20 70 69 64  eof(t));.    pid
24e60 20 3d 20 67 65 74 70 69 64 28 29 3b 0a 20 20 20   = getpid();.   
24e70 20 6d 65 6d 63 70 79 28 26 6b 65 79 5b 73 69 7a   memcpy(&key[siz
24e80 65 6f 66 28 74 29 5d 2c 20 26 70 69 64 2c 20 73  eof(t)], &pid, s
24e90 69 7a 65 6f 66 28 70 69 64 29 29 3b 0a 20 20 7d  izeof(pid));.  }
24ea0 0a 20 20 0a 23 69 66 64 65 66 20 4d 41 4b 45 5f  .  .#ifdef MAKE_
24eb0 50 52 45 54 54 59 5f 48 4f 53 54 49 44 0a 20 20  PRETTY_HOSTID.  
24ec0 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
24ed0 20 2f 2a 20 66 69 6c 74 65 72 20 74 68 65 20 62   /* filter the b
24ee0 79 74 65 73 20 69 6e 74 6f 20 70 72 69 6e 74 61  ytes into printa
24ef0 62 6c 65 20 61 73 63 69 69 20 63 68 61 72 61 63  ble ascii charac
24f00 74 65 72 73 20 61 6e 64 20 4e 55 4c 20 74 65 72  ters and NUL ter
24f10 6d 69 6e 61 74 65 20 2a 2f 0a 20 20 20 20 6b 65  minate */.    ke
24f20 79 5b 28 48 4f 53 54 49 44 4c 45 4e 2d 31 29 5d  y[(HOSTIDLEN-1)]
24f30 20 3d 20 30 78 30 30 3b 0a 20 20 20 20 66 6f 72   = 0x00;.    for
24f40 28 20 69 3d 30 3b 20 69 3c 28 48 4f 53 54 49 44  ( i=0; i<(HOSTID
24f50 4c 45 4e 2d 31 29 3b 20 69 2b 2b 20 29 7b 0a 20  LEN-1); i++ ){. 
24f60 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68       unsigned ch
24f70 61 72 20 70 61 20 3d 20 6b 65 79 5b 69 5d 26 30  ar pa = key[i]&0
24f80 78 37 46 3b 0a 20 20 20 20 20 20 69 66 28 20 70  x7F;.      if( p
24f90 61 3c 30 78 32 30 20 29 7b 0a 20 20 20 20 20 20  a<0x20 ){.      
24fa0 20 20 6b 65 79 5b 69 5d 20 3d 20 28 6b 65 79 5b    key[i] = (key[
24fb0 69 5d 26 30 78 38 30 20 3d 3d 20 30 78 38 30 29  i]&0x80 == 0x80)
24fc0 20 3f 20 70 61 2b 30 78 34 30 20 3a 20 70 61 2b   ? pa+0x40 : pa+
24fd0 30 78 32 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73  0x20;.      }els
24fe0 65 20 69 66 28 20 70 61 3d 3d 30 78 37 46 20 29  e if( pa==0x7F )
24ff0 7b 0a 20 20 20 20 20 20 20 20 6b 65 79 5b 69 5d  {.        key[i]
25000 20 3d 20 28 6b 65 79 5b 69 5d 26 30 78 38 30 20   = (key[i]&0x80 
25010 3d 3d 20 30 78 38 30 29 20 3f 20 70 61 3d 30 78  == 0x80) ? pa=0x
25020 32 30 20 3a 20 70 61 2b 30 78 37 45 3b 0a 20 20  20 : pa+0x7E;.  
25030 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
25040 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
25050 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
25060 20 77 72 69 74 65 73 20 74 68 65 20 68 6f 73 74   writes the host
25070 20 69 64 20 70 61 74 68 20 74 6f 20 70 61 74 68   id path to path
25080 2c 20 70 61 74 68 20 73 68 6f 75 6c 64 20 62 65  , path should be
25090 20 61 6e 20 70 72 65 2d 61 6c 6c 6f 63 61 74 65   an pre-allocate
250a0 64 20 62 75 66 66 65 72 0a 2a 2a 20 77 69 74 68  d buffer.** with
250b0 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20 66 6f   enough space fo
250c0 72 20 61 20 70 61 74 68 20 0a 2a 2f 0a 73 74 61  r a path .*/.sta
250d0 74 69 63 20 76 6f 69 64 20 70 72 6f 78 79 47 65  tic void proxyGe
250e0 74 48 6f 73 74 49 44 50 61 74 68 28 63 68 61 72  tHostIDPath(char
250f0 20 2a 70 61 74 68 2c 20 73 69 7a 65 5f 74 20 6c   *path, size_t l
25100 65 6e 29 7b 0a 20 20 73 74 72 6c 63 70 79 28 70  en){.  strlcpy(p
25110 61 74 68 2c 20 48 4f 53 54 49 44 50 41 54 48 2c  ath, HOSTIDPATH,
25120 20 6c 65 6e 29 3b 0a 23 69 66 64 65 66 20 53 51   len);.#ifdef SQ
25130 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 66 28 20  LITE_TEST.  if( 
25140 73 71 6c 69 74 65 33 5f 68 6f 73 74 69 64 5f 6e  sqlite3_hostid_n
25150 75 6d 3e 30 20 29 7b 0a 20 20 20 20 63 68 61 72  um>0 ){.    char
25160 20 73 75 66 66 69 78 5b 32 5d 20 3d 20 22 31 22   suffix[2] = "1"
25170 3b 0a 20 20 20 20 73 75 66 66 69 78 5b 30 5d 20  ;.    suffix[0] 
25180 3d 20 73 75 66 66 69 78 5b 30 5d 20 2b 20 73 71  = suffix[0] + sq
25190 6c 69 74 65 33 5f 68 6f 73 74 69 64 5f 6e 75 6d  lite3_hostid_num
251a0 3b 0a 20 20 20 20 73 74 72 6c 63 61 74 28 70 61  ;.    strlcat(pa
251b0 74 68 2c 20 73 75 66 66 69 78 2c 20 6c 65 6e 29  th, suffix, len)
251c0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 4f  ;.  }.#endif.  O
251d0 53 54 52 41 43 45 33 28 22 47 45 54 48 4f 53 54  STRACE3("GETHOST
251e0 49 44 50 41 54 48 20 20 25 73 20 70 69 64 3d 25  IDPATH  %s pid=%
251f0 64 5c 6e 22 2c 20 70 61 74 68 2c 20 67 65 74 70  d\n", path, getp
25200 69 64 28 29 29 3b 0a 7d 0a 0a 2f 2a 20 67 65 74  id());.}../* get
25210 20 74 68 65 20 68 6f 73 74 20 49 44 20 66 72 6f   the host ID fro
25220 6d 20 61 20 73 71 6c 69 74 65 20 68 6f 73 74 69  m a sqlite hosti
25230 64 20 66 69 6c 65 20 73 74 6f 72 65 64 20 69 6e  d file stored in
25240 20 74 68 65 20 0a 2a 2a 20 75 73 65 72 2d 73 70   the .** user-sp
25250 65 63 69 66 69 63 20 74 6d 70 20 64 69 72 65 63  ecific tmp direc
25260 74 6f 72 79 2c 20 63 72 65 61 74 65 20 74 68 65  tory, create the
25270 20 49 44 20 69 66 20 69 74 27 73 20 6e 6f 74 20   ID if it's not 
25280 74 68 65 72 65 20 61 6c 72 65 61 64 79 20 0a 2a  there already .*
25290 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  /.static int pro
252a0 78 79 47 65 74 48 6f 73 74 49 44 28 63 68 61 72  xyGetHostID(char
252b0 20 2a 70 48 6f 73 74 49 44 2c 20 69 6e 74 20 2a   *pHostID, int *
252c0 70 45 72 72 6f 72 29 7b 0a 20 20 69 6e 74 20 66  pError){.  int f
252d0 64 3b 0a 20 20 63 68 61 72 20 70 61 74 68 5b 4d  d;.  char path[M
252e0 41 58 50 41 54 48 4c 45 4e 5d 3b 20 0a 20 20 73  AXPATHLEN]; .  s
252f0 69 7a 65 5f 74 20 6c 65 6e 3b 0a 20 20 69 6e 74  ize_t len;.  int
25300 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a   rc=SQLITE_OK;..
25310 20 20 70 72 6f 78 79 47 65 74 48 6f 73 74 49 44    proxyGetHostID
25320 50 61 74 68 28 70 61 74 68 2c 20 4d 41 58 50 41  Path(path, MAXPA
25330 54 48 4c 45 4e 29 3b 0a 20 20 2f 2a 20 74 72 79  THLEN);.  /* try
25340 20 74 6f 20 63 72 65 61 74 65 20 74 68 65 20 68   to create the h
25350 6f 73 74 20 49 44 20 66 69 6c 65 2c 20 69 66 20  ost ID file, if 
25360 69 74 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  it already exist
25370 73 20 72 65 61 64 20 74 68 65 20 63 6f 6e 74 65  s read the conte
25380 6e 74 73 20 2a 2f 0a 20 20 66 64 20 3d 20 6f 70  nts */.  fd = op
25390 65 6e 28 70 61 74 68 2c 20 4f 5f 43 52 45 41 54  en(path, O_CREAT
253a0 7c 4f 5f 57 52 4f 4e 4c 59 7c 4f 5f 45 58 43 4c  |O_WRONLY|O_EXCL
253b0 2c 20 30 36 34 34 29 3b 0a 20 20 69 66 28 20 66  , 0644);.  if( f
253c0 64 3c 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 65  d<0 ){.    int e
253d0 72 72 3d 65 72 72 6e 6f 3b 0a 09 09 0a 20 20 20  rr=errno;....   
253e0 20 69 66 28 20 65 72 72 21 3d 45 45 58 49 53 54   if( err!=EEXIST
253f0 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   ){.#ifdef SQLIT
25400 45 5f 50 52 4f 58 59 5f 44 45 42 55 47 20 2f 2a  E_PROXY_DEBUG /*
25410 20 73 65 74 20 74 68 65 20 73 71 6c 69 74 65 20   set the sqlite 
25420 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e  error message in
25430 73 74 65 61 64 20 2a 2f 0a 20 20 20 20 20 20 66  stead */.      f
25440 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
25450 73 71 6c 69 74 65 20 65 72 72 6f 72 20 63 72 65  sqlite error cre
25460 61 74 69 6e 67 20 68 6f 73 74 20 49 44 20 66 69  ating host ID fi
25470 6c 65 20 25 73 3a 20 25 73 5c 6e 22 2c 0a 20 20  le %s: %s\n",.  
25480 20 20 20 20 20 20 20 20 20 20 20 20 70 61 74 68              path
25490 2c 20 73 74 72 65 72 72 6f 72 28 65 72 72 29 29  , strerror(err))
254a0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 72  ;.#endif.      r
254b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52  eturn SQLITE_PER
254c0 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20  M;.    }.    /* 
254d0 63 6f 75 6c 64 6e 27 74 20 63 72 65 61 74 65 20  couldn't create 
254e0 74 68 65 20 66 69 6c 65 2c 20 72 65 61 64 20 69  the file, read i
254f0 74 20 69 6e 73 74 65 61 64 20 2a 2f 0a 20 20 20  t instead */.   
25500 20 66 64 20 3d 20 6f 70 65 6e 28 70 61 74 68 2c   fd = open(path,
25510 20 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f 45 58 43 4c   O_RDONLY|O_EXCL
25520 29 3b 0a 20 20 20 20 69 66 28 20 66 64 3c 30 20  );.    if( fd<0 
25530 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
25540 5f 50 52 4f 58 59 5f 44 45 42 55 47 20 2f 2a 20  _PROXY_DEBUG /* 
25550 73 65 74 20 74 68 65 20 73 71 6c 69 74 65 20 65  set the sqlite e
25560 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 73  rror message ins
25570 74 65 61 64 20 2a 2f 0a 20 20 20 20 20 20 69 6e  tead */.      in
25580 74 20 65 72 72 20 3d 20 65 72 72 6e 6f 3b 0a 20  t err = errno;. 
25590 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64       fprintf(std
255a0 65 72 72 2c 20 22 73 71 6c 69 74 65 20 65 72 72  err, "sqlite err
255b0 6f 72 20 6f 70 65 6e 69 6e 67 20 68 6f 73 74 20  or opening host 
255c0 49 44 20 66 69 6c 65 20 25 73 3a 20 25 73 5c 6e  ID file %s: %s\n
255d0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
255e0 20 70 61 74 68 2c 20 73 74 72 65 72 72 6f 72 28   path, strerror(
255f0 65 72 72 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20  err));.#endif.  
25600 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
25610 45 5f 50 45 52 4d 3b 0a 20 20 20 20 7d 0a 20 20  E_PERM;.    }.  
25620 20 20 6c 65 6e 20 3d 20 70 72 65 61 64 28 66 64    len = pread(fd
25630 2c 20 70 48 6f 73 74 49 44 2c 20 48 4f 53 54 49  , pHostID, HOSTI
25640 44 4c 45 4e 2c 20 30 29 3b 0a 20 20 20 20 69 66  DLEN, 0);.    if
25650 28 20 6c 65 6e 3c 30 20 29 7b 0a 20 20 20 20 20  ( len<0 ){.     
25660 20 2a 70 45 72 72 6f 72 20 3d 20 65 72 72 6e 6f   *pError = errno
25670 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  ;.      rc = SQL
25680 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 3b 0a  ITE_IOERR_READ;.
25690 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 65      }else if( le
256a0 6e 3c 48 4f 53 54 49 44 4c 45 4e 20 29 7b 0a 20  n<HOSTIDLEN ){. 
256b0 20 20 20 20 20 2a 70 45 72 72 6f 72 20 3d 20 30       *pError = 0
256c0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  ;.      rc = SQL
256d0 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f  ITE_IOERR_SHORT_
256e0 52 45 41 44 3b 0a 20 20 20 20 7d 0a 20 20 20 20  READ;.    }.    
256f0 63 6c 6f 73 65 28 66 64 29 3b 20 2f 2a 20 73 69  close(fd); /* si
25700 6c 65 6e 74 6c 79 20 6c 65 61 6b 20 74 68 65 20  lently leak the 
25710 66 64 20 69 66 20 69 74 20 66 61 69 6c 73 20 2a  fd if it fails *
25720 2f 0a 20 20 20 20 4f 53 54 52 41 43 45 33 28 22  /.    OSTRACE3("
25730 47 45 54 48 4f 53 54 49 44 20 20 72 65 61 64 20  GETHOSTID  read 
25740 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c 20 70 48  %s pid=%d\n", pH
25750 6f 73 74 49 44 2c 20 67 65 74 70 69 64 28 29 29  ostID, getpid())
25760 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
25770 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
25780 20 77 65 27 72 65 20 63 72 65 61 74 69 6e 67 20   we're creating 
25790 74 68 65 20 68 6f 73 74 20 49 44 20 66 69 6c 65  the host ID file
257a0 20 28 75 73 65 20 61 20 72 61 6e 64 6f 6d 20 73   (use a random s
257b0 74 72 69 6e 67 20 6f 66 20 62 79 74 65 73 29 20  tring of bytes) 
257c0 2a 2f 0a 20 20 20 20 70 72 6f 78 79 47 65 6e 65  */.    proxyGene
257d0 72 61 74 65 48 6f 73 74 49 44 28 70 48 6f 73 74  rateHostID(pHost
257e0 49 44 29 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 70  ID);.    len = p
257f0 77 72 69 74 65 28 66 64 2c 20 70 48 6f 73 74 49  write(fd, pHostI
25800 44 2c 20 48 4f 53 54 49 44 4c 45 4e 2c 20 30 29  D, HOSTIDLEN, 0)
25810 3b 0a 20 20 20 20 69 66 28 20 6c 65 6e 3c 30 20  ;.    if( len<0 
25820 29 7b 0a 20 20 20 20 20 20 2a 70 45 72 72 6f 72  ){.      *pError
25830 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
25840 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
25850 52 5f 57 52 49 54 45 3b 0a 20 20 20 20 7d 65 6c  R_WRITE;.    }el
25860 73 65 20 69 66 28 20 6c 65 6e 3c 48 4f 53 54 49  se if( len<HOSTI
25870 44 4c 45 4e 20 29 7b 0a 20 20 20 20 20 20 2a 70  DLEN ){.      *p
25880 45 72 72 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20  Error = 0;.     
25890 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
258a0 52 52 5f 57 52 49 54 45 3b 0a 20 20 20 20 7d 0a  RR_WRITE;.    }.
258b0 20 20 20 20 63 6c 6f 73 65 28 66 64 29 3b 20 2f      close(fd); /
258c0 2a 20 73 69 6c 65 6e 74 6c 79 20 6c 65 61 6b 20  * silently leak 
258d0 74 68 65 20 66 64 20 69 66 20 69 74 20 66 61 69  the fd if it fai
258e0 6c 73 20 2a 2f 0a 20 20 20 20 4f 53 54 52 41 43  ls */.    OSTRAC
258f0 45 33 28 22 47 45 54 48 4f 53 54 49 44 20 20 77  E3("GETHOSTID  w
25900 72 6f 74 65 20 25 73 20 70 69 64 3d 25 64 5c 6e  rote %s pid=%d\n
25910 22 2c 20 70 48 6f 73 74 49 44 2c 20 67 65 74 70  ", pHostID, getp
25920 69 64 28 29 29 3b 0a 20 20 20 20 72 65 74 75 72  id());.    retur
25930 6e 20 72 63 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61  n rc;.  }.}..sta
25940 74 69 63 20 69 6e 74 20 70 72 6f 78 79 47 65 74  tic int proxyGet
25950 4c 6f 63 6b 50 61 74 68 28 63 6f 6e 73 74 20 63  LockPath(const c
25960 68 61 72 20 2a 64 62 50 61 74 68 2c 20 63 68 61  har *dbPath, cha
25970 72 20 2a 6c 50 61 74 68 2c 20 73 69 7a 65 5f 74  r *lPath, size_t
25980 20 6d 61 78 4c 65 6e 29 7b 0a 20 20 69 6e 74 20   maxLen){.  int 
25990 6c 65 6e 3b 0a 20 20 69 6e 74 20 64 62 4c 65 6e  len;.  int dbLen
259a0 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 23 69 66 64  ;.  int i;..#ifd
259b0 65 66 20 4c 4f 43 4b 50 52 4f 58 59 44 49 52 0a  ef LOCKPROXYDIR.
259c0 20 20 6c 65 6e 20 3d 20 73 74 72 6c 63 70 79 28    len = strlcpy(
259d0 6c 50 61 74 68 2c 20 4c 4f 43 4b 50 52 4f 58 59  lPath, LOCKPROXY
259e0 44 49 52 2c 20 6d 61 78 4c 65 6e 29 3b 0a 23 65  DIR, maxLen);.#e
259f0 6c 73 65 0a 23 20 69 66 64 65 66 20 5f 43 53 5f  lse.# ifdef _CS_
25a00 44 41 52 57 49 4e 5f 55 53 45 52 5f 54 45 4d 50  DARWIN_USER_TEMP
25a10 5f 44 49 52 0a 20 20 7b 0a 20 20 20 20 63 6f 6e  _DIR.  {.    con
25a20 66 73 74 72 28 5f 43 53 5f 44 41 52 57 49 4e 5f  fstr(_CS_DARWIN_
25a30 55 53 45 52 5f 54 45 4d 50 5f 44 49 52 2c 20 6c  USER_TEMP_DIR, l
25a40 50 61 74 68 2c 20 6d 61 78 4c 65 6e 29 3b 0a 20  Path, maxLen);. 
25a50 20 20 20 6c 65 6e 20 3d 20 73 74 72 6c 63 61 74     len = strlcat
25a60 28 6c 50 61 74 68 2c 20 22 73 71 6c 69 74 65 70  (lPath, "sqlitep
25a70 6c 6f 63 6b 73 22 2c 20 6d 61 78 4c 65 6e 29 3b  locks", maxLen);
25a80 0a 20 20 20 20 69 66 28 20 6d 6b 64 69 72 28 6c  .    if( mkdir(l
25a90 50 61 74 68 2c 20 53 51 4c 49 54 45 5f 44 45 46  Path, SQLITE_DEF
25aa0 41 55 4c 54 5f 50 52 4f 58 59 44 49 52 5f 50 45  AULT_PROXYDIR_PE
25ab0 52 4d 49 53 53 49 4f 4e 53 29 20 29 7b 0a 20 20  RMISSIONS) ){.  
25ac0 20 20 20 20 2f 2a 20 69 66 20 6d 6b 64 69 72 20      /* if mkdir 
25ad0 66 61 69 6c 73 2c 20 68 61 6e 64 6c 65 20 61 73  fails, handle as
25ae0 20 6c 6f 63 6b 20 66 69 6c 65 20 63 72 65 61 74   lock file creat
25af0 69 6f 6e 20 66 61 69 6c 75 72 65 20 2a 2f 0a 23  ion failure */.#
25b00 20 20 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44    ifdef SQLITE_D
25b10 45 42 55 47 0a 20 20 20 20 20 20 69 6e 74 20 65  EBUG.      int e
25b20 72 72 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  rr = errno;.    
25b30 20 20 69 66 28 20 65 72 72 21 3d 45 45 58 49 53    if( err!=EEXIS
25b40 54 20 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72  T ){.        fpr
25b50 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 70 72  intf(stderr, "pr
25b60 6f 78 79 47 65 74 4c 6f 63 6b 50 61 74 68 3a 20  oxyGetLockPath: 
25b70 6d 6b 64 69 72 28 25 73 2c 30 25 6f 29 20 65 72  mkdir(%s,0%o) er
25b80 72 6f 72 20 25 64 20 25 73 5c 6e 22 2c 20 6c 50  ror %d %s\n", lP
25b90 61 74 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ath,.           
25ba0 20 20 20 20 20 53 51 4c 49 54 45 5f 44 45 46 41       SQLITE_DEFA
25bb0 55 4c 54 5f 50 52 4f 58 59 44 49 52 5f 50 45 52  ULT_PROXYDIR_PER
25bc0 4d 49 53 53 49 4f 4e 53 2c 20 65 72 72 2c 20 73  MISSIONS, err, s
25bd0 74 72 65 72 72 6f 72 28 65 72 72 29 29 3b 0a 20  trerror(err));. 
25be0 20 20 20 20 20 7d 0a 23 20 20 65 6e 64 69 66 0a       }.#  endif.
25bf0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
25c00 20 4f 53 54 52 41 43 45 33 28 22 47 45 54 4c 4f   OSTRACE3("GETLO
25c10 43 4b 50 41 54 48 20 20 6d 6b 64 69 72 20 25 73  CKPATH  mkdir %s
25c20 20 70 69 64 3d 25 64 5c 6e 22 2c 20 6c 50 61 74   pid=%d\n", lPat
25c30 68 2c 20 67 65 74 70 69 64 28 29 29 3b 0a 20 20  h, getpid());.  
25c40 20 20 7d 0a 20 20 20 20 0a 20 20 7d 0a 23 20 65    }.    .  }.# e
25c50 6c 73 65 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c  lse.  len = strl
25c60 63 70 79 28 6c 50 61 74 68 2c 20 22 2f 74 6d 70  cpy(lPath, "/tmp
25c70 2f 22 2c 20 6d 61 78 4c 65 6e 29 3b 0a 23 20 65  /", maxLen);.# e
25c80 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 20 20 69  ndif.#endif..  i
25c90 66 28 20 6c 50 61 74 68 5b 6c 65 6e 2d 31 5d 21  f( lPath[len-1]!
25ca0 3d 27 2f 27 20 29 7b 0a 20 20 20 20 6c 65 6e 20  ='/' ){.    len 
25cb0 3d 20 73 74 72 6c 63 61 74 28 6c 50 61 74 68 2c  = strlcat(lPath,
25cc0 20 22 2f 22 2c 20 6d 61 78 4c 65 6e 29 3b 0a 20   "/", maxLen);. 
25cd0 20 7d 0a 20 20 0a 20 20 2f 2a 20 74 72 61 6e 73   }.  .  /* trans
25ce0 66 6f 72 6d 20 74 68 65 20 64 62 20 70 61 74 68  form the db path
25cf0 20 74 6f 20 61 20 75 6e 69 71 75 65 20 63 61 63   to a unique cac
25d00 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 64 62 4c  he name */.  dbL
25d10 65 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e  en = (int)strlen
25d20 28 64 62 50 61 74 68 29 3b 0a 20 20 66 6f 72 28  (dbPath);.  for(
25d30 20 69 3d 30 3b 20 69 3c 64 62 4c 65 6e 20 26 26   i=0; i<dbLen &&
25d40 20 28 69 2b 6c 65 6e 2b 37 29 3c 6d 61 78 4c 65   (i+len+7)<maxLe
25d50 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61  n; i++){.    cha
25d60 72 20 63 20 3d 20 64 62 50 61 74 68 5b 69 5d 3b  r c = dbPath[i];
25d70 0a 20 20 20 20 6c 50 61 74 68 5b 69 2b 6c 65 6e  .    lPath[i+len
25d80 5d 20 3d 20 28 63 3d 3d 27 2f 27 29 3f 27 5f 27  ] = (c=='/')?'_'
25d90 3a 63 3b 0a 20 20 7d 0a 20 20 6c 50 61 74 68 5b  :c;.  }.  lPath[
25da0 69 2b 6c 65 6e 5d 3d 27 5c 30 27 3b 0a 20 20 73  i+len]='\0';.  s
25db0 74 72 6c 63 61 74 28 6c 50 61 74 68 2c 20 22 3a  trlcat(lPath, ":
25dc0 61 75 74 6f 3a 22 2c 20 6d 61 78 4c 65 6e 29 3b  auto:", maxLen);
25dd0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
25de0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  _OK;.}../*.** Cr
25df0 65 61 74 65 20 61 20 6e 65 77 20 56 46 53 20 66  eate a new VFS f
25e00 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 28  ile descriptor (
25e10 73 74 6f 72 65 64 20 69 6e 20 6d 65 6d 6f 72 79  stored in memory
25e20 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a   obtained from.*
25e30 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  * sqlite3_malloc
25e40 29 20 61 6e 64 20 6f 70 65 6e 20 74 68 65 20 66  ) and open the f
25e50 69 6c 65 20 6e 61 6d 65 64 20 22 70 61 74 68 22  ile named "path"
25e60 20 69 6e 20 74 68 65 20 66 69 6c 65 20 64 65 73   in the file des
25e70 63 72 69 70 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54  criptor..**.** T
25e80 68 65 20 63 61 6c 6c 65 72 20 69 73 20 72 65 73  he caller is res
25e90 70 6f 6e 73 69 62 6c 65 20 6e 6f 74 20 6f 6e 6c  ponsible not onl
25ea0 79 20 66 6f 72 20 63 6c 6f 73 69 6e 67 20 74 68  y for closing th
25eb0 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
25ec0 72 0a 2a 2a 20 62 75 74 20 61 6c 73 6f 20 66 6f  r.** but also fo
25ed0 72 20 66 72 65 65 69 6e 67 20 74 68 65 20 6d 65  r freeing the me
25ee0 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20  mory associated 
25ef0 77 69 74 68 20 74 68 65 20 66 69 6c 65 20 64 65  with the file de
25f00 73 63 72 69 70 74 6f 72 2e 0a 2a 2f 0a 73 74 61  scriptor..*/.sta
25f10 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43 72 65  tic int proxyCre
25f20 61 74 65 55 6e 69 78 46 69 6c 65 28 63 6f 6e 73  ateUnixFile(cons
25f30 74 20 63 68 61 72 20 2a 70 61 74 68 2c 20 75 6e  t char *path, un
25f40 69 78 46 69 6c 65 20 2a 2a 70 70 46 69 6c 65 29  ixFile **ppFile)
25f50 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70   {.  unixFile *p
25f60 4e 65 77 3b 0a 20 20 69 6e 74 20 66 6c 61 67 73  New;.  int flags
25f70 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d   = SQLITE_OPEN_M
25f80 41 49 4e 5f 44 42 7c 53 51 4c 49 54 45 5f 4f 50  AIN_DB|SQLITE_OP
25f90 45 4e 5f 43 52 45 41 54 45 7c 53 51 4c 49 54 45  EN_CREATE|SQLITE
25fa0 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 3b  _OPEN_READWRITE;
25fb0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
25fc0 54 45 5f 4f 4b 3b 0a 20 20 73 71 6c 69 74 65 33  TE_OK;.  sqlite3
25fd0 5f 76 66 73 20 64 75 6d 6d 79 56 66 73 3b 0a 0a  _vfs dummyVfs;..
25fe0 20 20 70 4e 65 77 20 3d 20 28 75 6e 69 78 46 69    pNew = (unixFi
25ff0 6c 65 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c  le *)sqlite3_mal
26000 6c 6f 63 28 73 69 7a 65 6f 66 28 75 6e 69 78 46  loc(sizeof(unixF
26010 69 6c 65 29 29 3b 0a 20 20 69 66 28 20 21 70 4e  ile));.  if( !pN
26020 65 77 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ew ){.    return
26030 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
26040 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70 4e 65 77   }.  memset(pNew
26050 2c 20 30 2c 20 73 69 7a 65 6f 66 28 75 6e 69 78  , 0, sizeof(unix
26060 46 69 6c 65 29 29 3b 0a 0a 20 20 2f 2a 20 43 61  File));..  /* Ca
26070 6c 6c 20 75 6e 69 78 4f 70 65 6e 28 29 20 74 6f  ll unixOpen() to
26080 20 6f 70 65 6e 20 74 68 65 20 70 72 6f 78 79 20   open the proxy 
26090 66 69 6c 65 2e 20 54 68 65 20 66 6c 61 67 73 20  file. The flags 
260a0 70 61 73 73 65 64 20 74 6f 20 75 6e 69 78 4f 70  passed to unixOp
260b0 65 6e 28 29 0a 20 20 2a 2a 20 73 75 67 67 65 73  en().  ** sugges
260c0 74 20 74 68 61 74 20 74 68 65 20 66 69 6c 65 20  t that the file 
260d0 62 65 69 6e 67 20 6f 70 65 6e 65 64 20 69 73 20  being opened is 
260e0 61 20 22 6d 61 69 6e 20 64 61 74 61 62 61 73 65  a "main database
260f0 22 2e 20 54 68 69 73 20 69 73 0a 20 20 2a 2a 20  ". This is.  ** 
26100 6e 65 63 65 73 73 61 72 79 20 61 73 20 6f 74 68  necessary as oth
26110 65 72 20 66 69 6c 65 20 74 79 70 65 73 20 64 6f  er file types do
26120 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79   not necessarily
26130 20 73 75 70 70 6f 72 74 20 6c 6f 63 6b 69 6e 67   support locking
26140 2e 20 49 74 0a 20 20 2a 2a 20 69 73 20 62 65 74  . It.  ** is bet
26150 74 65 72 20 74 6f 20 75 73 65 20 75 6e 69 78 4f  ter to use unixO
26160 70 65 6e 28 29 20 69 6e 73 74 65 61 64 20 6f 66  pen() instead of
26170 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 66 69 6c   opening the fil
26180 65 20 64 69 72 65 63 74 6c 79 20 77 69 74 68 0a  e directly with.
26190 20 20 2a 2a 20 6f 70 65 6e 28 29 2c 20 61 73 20    ** open(), as 
261a0 75 6e 69 78 4f 70 65 6e 28 29 20 73 65 74 73 20  unixOpen() sets 
261b0 75 70 20 74 68 65 20 76 61 72 69 6f 75 73 20 6d  up the various m
261c0 65 63 68 61 6e 69 73 6d 73 20 72 65 71 75 69 72  echanisms requir
261d0 65 64 20 74 6f 0a 20 20 2a 2a 20 6d 61 6b 65 20  ed to.  ** make 
261e0 73 75 72 65 20 61 20 63 61 6c 6c 20 74 6f 20 63  sure a call to c
261f0 6c 6f 73 65 28 29 20 64 6f 65 73 20 6e 6f 74 20  lose() does not 
26200 63 61 75 73 65 20 74 68 65 20 73 79 73 74 65 6d  cause the system
26210 20 74 6f 20 64 69 73 63 61 72 64 0a 20 20 2a 2a   to discard.  **
26220 20 50 4f 53 49 58 20 6c 6f 63 6b 73 20 70 72 65   POSIX locks pre
26230 6d 61 74 75 72 65 6c 79 2e 0a 20 20 2a 2a 0a 20  maturely..  **. 
26240 20 2a 2a 20 49 74 20 69 73 20 69 6d 70 6f 72 74   ** It is import
26250 61 6e 74 20 74 68 61 74 20 74 68 65 20 78 4f 70  ant that the xOp
26260 65 6e 20 6d 65 6d 62 65 72 20 6f 66 20 74 68 65  en member of the
26270 20 56 46 53 20 6f 62 6a 65 63 74 20 70 61 73 73   VFS object pass
26280 65 64 20 74 6f 20 0a 20 20 2a 2a 20 75 6e 69 78  ed to .  ** unix
26290 4f 70 65 6e 28 29 20 69 73 20 4e 55 4c 4c 2e 20  Open() is NULL. 
262a0 54 68 69 73 20 74 65 6c 6c 73 20 75 6e 69 78 4f  This tells unixO
262b0 70 65 6e 28 29 20 6d 61 79 20 74 72 79 20 74 6f  pen() may try to
262c0 20 6f 70 65 6e 20 61 20 70 72 6f 78 79 2d 66 69   open a proxy-fi
262d0 6c 65 20 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65  le .  ** for the
262e0 20 70 72 6f 78 79 2d 66 69 6c 65 20 28 63 72 65   proxy-file (cre
262f0 61 74 69 6e 67 20 61 20 70 6f 74 65 6e 74 69 61  ating a potentia
26300 6c 20 69 6e 66 69 6e 69 74 65 20 6c 6f 6f 70 29  l infinite loop)
26310 2e 0a 20 20 2a 2f 0a 20 20 64 75 6d 6d 79 56 66  ..  */.  dummyVf
26320 73 2e 70 41 70 70 44 61 74 61 20 3d 20 28 76 6f  s.pAppData = (vo
26330 69 64 2a 29 26 61 75 74 6f 6c 6f 63 6b 49 6f 46  id*)&autolockIoF
26340 69 6e 64 65 72 3b 0a 20 20 64 75 6d 6d 79 56 66  inder;.  dummyVf
26350 73 2e 78 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 72  s.xOpen = 0;.  r
26360 63 20 3d 20 75 6e 69 78 4f 70 65 6e 28 26 64 75  c = unixOpen(&du
26370 6d 6d 79 56 66 73 2c 20 70 61 74 68 2c 20 28 73  mmyVfs, path, (s
26380 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 70 4e  qlite3_file *)pN
26390 65 77 2c 20 66 6c 61 67 73 2c 20 26 66 6c 61 67  ew, flags, &flag
263a0 73 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  s);.  if( rc==SQ
263b0 4c 49 54 45 5f 4f 4b 20 26 26 20 28 66 6c 61 67  LITE_OK && (flag
263c0 73 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  s&SQLITE_OPEN_RE
263d0 41 44 4f 4e 4c 59 29 20 29 7b 0a 20 20 20 20 70  ADONLY) ){.    p
263e0 4e 65 77 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 43  New->pMethod->xC
263f0 6c 6f 73 65 28 28 73 71 6c 69 74 65 33 5f 66 69  lose((sqlite3_fi
26400 6c 65 20 2a 29 70 4e 65 77 29 3b 0a 20 20 20 20  le *)pNew);.    
26410 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54  rc = SQLITE_CANT
26420 4f 50 45 4e 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  OPEN;.  }..  if(
26430 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
26440 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
26450 65 65 28 70 4e 65 77 29 3b 0a 20 20 20 20 70 4e  ee(pNew);.    pN
26460 65 77 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2a  ew = 0;.  }..  *
26470 70 70 46 69 6c 65 20 3d 20 70 4e 65 77 3b 0a 20  ppFile = pNew;. 
26480 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
26490 2a 20 74 61 6b 65 73 20 74 68 65 20 63 6f 6e 63  * takes the conc
264a0 68 20 62 79 20 74 61 6b 69 6e 67 20 61 20 73 68  h by taking a sh
264b0 61 72 65 64 20 6c 6f 63 6b 20 61 6e 64 20 72 65  ared lock and re
264c0 61 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  ad the contents 
264d0 63 6f 6e 63 68 2c 20 69 66 20 0a 2a 2a 20 6c 6f  conch, if .** lo
264e0 63 6b 50 61 74 68 20 69 73 20 6e 6f 6e 2d 4e 55  ckPath is non-NU
264f0 4c 4c 2c 20 74 68 65 20 68 6f 73 74 20 49 44 20  LL, the host ID 
26500 61 6e 64 20 6c 6f 63 6b 20 66 69 6c 65 20 70 61  and lock file pa
26510 74 68 20 6d 75 73 74 20 6d 61 74 63 68 2e 20 20  th must match.  
26520 41 20 4e 55 4c 4c 20 0a 2a 2a 20 6c 6f 63 6b 50  A NULL .** lockP
26530 61 74 68 20 6d 65 61 6e 73 20 74 68 61 74 20 74  ath means that t
26540 68 65 20 6c 6f 63 6b 50 61 74 68 20 69 6e 20 74  he lockPath in t
26550 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 77 69  he conch file wi
26560 6c 6c 20 62 65 20 75 73 65 64 20 69 66 20 74 68  ll be used if th
26570 65 20 0a 2a 2a 20 68 6f 73 74 20 49 44 73 20 6d  e .** host IDs m
26580 61 74 63 68 2c 20 6f 72 20 61 20 6e 65 77 20 6c  atch, or a new l
26590 6f 63 6b 20 70 61 74 68 20 77 69 6c 6c 20 62 65  ock path will be
265a0 20 67 65 6e 65 72 61 74 65 64 20 61 75 74 6f 6d   generated autom
265b0 61 74 69 63 61 6c 6c 79 20 0a 2a 2a 20 61 6e 64  atically .** and
265c0 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
265d0 63 6f 6e 63 68 20 66 69 6c 65 2e 0a 2a 2f 0a 73  conch file..*/.s
265e0 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 54  tatic int proxyT
265f0 61 6b 65 43 6f 6e 63 68 28 75 6e 69 78 46 69 6c  akeConch(unixFil
26600 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 70 72 6f  e *pFile){.  pro
26610 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  xyLockingContext
26620 20 2a 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c   *pCtx = (proxyL
26630 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29  ockingContext *)
26640 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
26650 6e 74 65 78 74 3b 20 0a 20 20 0a 20 20 69 66 28  ntext; .  .  if(
26660 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64   pCtx->conchHeld
26670 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  >0 ){.    return
26680 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65   SQLITE_OK;.  }e
26690 6c 73 65 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c  lse{.    unixFil
266a0 65 20 2a 63 6f 6e 63 68 46 69 6c 65 20 3d 20 70  e *conchFile = p
266b0 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 3b 0a  Ctx->conchFile;.
266c0 20 20 20 20 63 68 61 72 20 74 65 73 74 56 61 6c      char testVal
266d0 75 65 5b 43 4f 4e 43 48 4c 45 4e 5d 3b 0a 20 20  ue[CONCHLEN];.  
266e0 20 20 63 68 61 72 20 63 6f 6e 63 68 56 61 6c 75    char conchValu
266f0 65 5b 43 4f 4e 43 48 4c 45 4e 5d 3b 0a 20 20 20  e[CONCHLEN];.   
26700 20 63 68 61 72 20 6c 6f 63 6b 50 61 74 68 5b 4d   char lockPath[M
26710 41 58 50 41 54 48 4c 45 4e 5d 3b 0a 20 20 20 20  AXPATHLEN];.    
26720 63 68 61 72 20 2a 74 4c 6f 63 6b 50 61 74 68 20  char *tLockPath 
26730 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20  = NULL;.    int 
26740 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
26750 20 20 20 20 69 6e 74 20 72 65 61 64 52 63 20 3d      int readRc =
26760 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
26770 69 6e 74 20 73 79 6e 63 50 65 72 6d 73 20 3d 20  int syncPerms = 
26780 30 3b 0a 0a 20 20 20 20 4f 53 54 52 41 43 45 34  0;..    OSTRACE4
26790 28 22 54 41 4b 45 43 4f 4e 43 48 20 20 25 64 20  ("TAKECONCH  %d 
267a0 66 6f 72 20 25 73 20 70 69 64 3d 25 64 5c 6e 22  for %s pid=%d\n"
267b0 2c 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 0a  , conchFile->h,.
267c0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 70 43               (pC
267d0 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74  tx->lockProxyPat
267e0 68 20 3f 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72  h ? pCtx->lockPr
267f0 6f 78 79 50 61 74 68 20 3a 20 22 3a 61 75 74 6f  oxyPath : ":auto
26800 3a 22 29 2c 20 67 65 74 70 69 64 28 29 29 3b 0a  :"), getpid());.
26810 0a 20 20 20 20 72 63 20 3d 20 63 6f 6e 63 68 46  .    rc = conchF
26820 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 4c  ile->pMethod->xL
26830 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c  ock((sqlite3_fil
26840 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 53 48  e*)conchFile, SH
26850 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  ARED_LOCK);.    
26860 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
26870 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 70  K ){.      int p
26880 45 72 72 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20  Error = 0;.     
26890 20 6d 65 6d 73 65 74 28 74 65 73 74 56 61 6c 75   memset(testValu
268a0 65 2c 20 30 2c 20 43 4f 4e 43 48 4c 45 4e 29 3b  e, 0, CONCHLEN);
268b0 20 2f 2a 20 63 6f 6e 63 68 20 69 73 20 66 69 78   /* conch is fix
268c0 65 64 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 20  ed size */.     
268d0 20 72 63 20 3d 20 70 72 6f 78 79 47 65 74 48 6f   rc = proxyGetHo
268e0 73 74 49 44 28 74 65 73 74 56 61 6c 75 65 2c 20  stID(testValue, 
268f0 26 70 45 72 72 6f 72 29 3b 0a 20 20 20 20 20 20  &pError);.      
26900 69 66 28 20 28 72 63 26 30 78 66 66 29 3d 3d 53  if( (rc&0xff)==S
26910 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20  QLITE_IOERR ){. 
26920 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61         pFile->la
26930 73 74 45 72 72 6e 6f 20 3d 20 70 45 72 72 6f 72  stErrno = pError
26940 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
26950 69 66 28 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72  if( pCtx->lockPr
26960 6f 78 79 50 61 74 68 20 29 7b 0a 20 20 20 20 20  oxyPath ){.     
26970 20 20 20 73 74 72 6c 63 70 79 28 26 74 65 73 74     strlcpy(&test
26980 56 61 6c 75 65 5b 48 4f 53 54 49 44 4c 45 4e 5d  Value[HOSTIDLEN]
26990 2c 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78  , pCtx->lockProx
269a0 79 50 61 74 68 2c 20 4d 41 58 50 41 54 48 4c 45  yPath, MAXPATHLE
269b0 4e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  N);.      }.    
269c0 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  }.    if( rc!=SQ
269d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
269e0 20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b 65 63 6f   goto end_takeco
269f0 6e 63 68 3b 0a 20 20 20 20 7d 0a 20 20 20 20 0a  nch;.    }.    .
26a00 20 20 20 20 72 65 61 64 52 63 20 3d 20 75 6e 69      readRc = uni
26a10 78 52 65 61 64 28 28 73 71 6c 69 74 65 33 5f 66  xRead((sqlite3_f
26a20 69 6c 65 20 2a 29 63 6f 6e 63 68 46 69 6c 65 2c  ile *)conchFile,
26a30 20 63 6f 6e 63 68 56 61 6c 75 65 2c 20 43 4f 4e   conchValue, CON
26a40 43 48 4c 45 4e 2c 20 30 29 3b 0a 20 20 20 20 69  CHLEN, 0);.    i
26a50 66 28 20 72 65 61 64 52 63 21 3d 53 51 4c 49 54  f( readRc!=SQLIT
26a60 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45  E_IOERR_SHORT_RE
26a70 41 44 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  AD ){.      if( 
26a80 72 65 61 64 52 63 21 3d 53 51 4c 49 54 45 5f 4f  readRc!=SQLITE_O
26a90 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  K ){.        if(
26aa0 20 28 72 63 26 30 78 66 66 29 3d 3d 53 51 4c 49   (rc&0xff)==SQLI
26ab0 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20 20  TE_IOERR ){.    
26ac0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
26ad0 74 45 72 72 6e 6f 20 3d 20 63 6f 6e 63 68 46 69  tErrno = conchFi
26ae0 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a 20  le->lastErrno;. 
26af0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
26b00 20 72 63 20 3d 20 72 65 61 64 52 63 3b 0a 20 20   rc = readRc;.  
26b10 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 74        goto end_t
26b20 61 6b 65 63 6f 6e 63 68 3b 0a 20 20 20 20 20 20  akeconch;.      
26b30 7d 0a 20 20 20 20 20 20 2f 2a 20 69 66 20 74 68  }.      /* if th
26b40 65 20 63 6f 6e 63 68 20 68 61 73 20 64 61 74 61  e conch has data
26b50 20 63 6f 6d 70 61 72 65 20 74 68 65 20 63 6f 6e   compare the con
26b60 74 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 69  tents */.      i
26b70 66 28 20 21 70 43 74 78 2d 3e 6c 6f 63 6b 50 72  f( !pCtx->lockPr
26b80 6f 78 79 50 61 74 68 20 29 7b 0a 20 20 20 20 20  oxyPath ){.     
26b90 20 20 20 2f 2a 20 66 6f 72 20 61 75 74 6f 2d 6e     /* for auto-n
26ba0 61 6d 65 64 20 6c 6f 63 61 6c 20 6c 6f 63 6b 20  amed local lock 
26bb0 66 69 6c 65 2c 20 6a 75 73 74 20 63 68 65 63 6b  file, just check
26bc0 20 74 68 65 20 68 6f 73 74 20 49 44 20 61 6e 64   the host ID and
26bd0 20 77 65 27 6c 6c 0a 20 20 20 20 20 20 20 20 20   we'll.         
26be0 2a 2a 20 75 73 65 20 74 68 65 20 6c 6f 63 61 6c  ** use the local
26bf0 20 6c 6f 63 6b 20 66 69 6c 65 20 70 61 74 68 20   lock file path 
26c00 74 68 61 74 27 73 20 61 6c 72 65 61 64 79 20 69  that's already i
26c10 6e 20 74 68 65 72 65 20 2a 2f 0a 20 20 20 20 20  n there */.     
26c20 20 20 20 69 66 28 20 21 6d 65 6d 63 6d 70 28 74     if( !memcmp(t
26c30 65 73 74 56 61 6c 75 65 2c 20 63 6f 6e 63 68 56  estValue, conchV
26c40 61 6c 75 65 2c 20 48 4f 53 54 49 44 4c 45 4e 29  alue, HOSTIDLEN)
26c50 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74 4c   ){.          tL
26c60 6f 63 6b 50 61 74 68 20 3d 20 28 63 68 61 72 20  ockPath = (char 
26c70 2a 29 26 63 6f 6e 63 68 56 61 6c 75 65 5b 48 4f  *)&conchValue[HO
26c80 53 54 49 44 4c 45 4e 5d 3b 0a 20 20 20 20 20 20  STIDLEN];.      
26c90 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b      goto end_tak
26ca0 65 63 6f 6e 63 68 3b 0a 20 20 20 20 20 20 20 20  econch;.        
26cb0 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
26cc0 20 20 20 20 20 20 20 2f 2a 20 77 65 27 76 65 20         /* we've 
26cd0 67 6f 74 20 74 68 65 20 63 6f 6e 63 68 20 69 66  got the conch if
26ce0 20 63 6f 6e 63 68 56 61 6c 75 65 20 6d 61 74 63   conchValue matc
26cf0 68 65 73 20 6f 75 72 20 70 61 74 68 20 61 6e 64  hes our path and
26d00 20 68 6f 73 74 20 49 44 20 2a 2f 0a 20 20 20 20   host ID */.    
26d10 20 20 20 20 69 66 28 20 21 6d 65 6d 63 6d 70 28      if( !memcmp(
26d20 74 65 73 74 56 61 6c 75 65 2c 20 63 6f 6e 63 68  testValue, conch
26d30 56 61 6c 75 65 2c 20 43 4f 4e 43 48 4c 45 4e 29  Value, CONCHLEN)
26d40 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
26d50 74 6f 20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63 68  to end_takeconch
26d60 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
26d70 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
26d80 20 20 20 20 20 2f 2a 20 61 20 73 68 6f 72 74 20       /* a short 
26d90 72 65 61 64 20 6d 65 61 6e 73 20 77 65 27 72 65  read means we're
26da0 20 22 63 72 65 61 74 69 6e 67 22 20 74 68 65 20   "creating" the 
26db0 63 6f 6e 63 68 20 28 65 76 65 6e 20 74 68 6f 75  conch (even thou
26dc0 67 68 20 69 74 20 63 6f 75 6c 64 20 0a 20 20 20  gh it could .   
26dd0 20 20 20 2a 2a 20 68 61 76 65 20 62 65 65 6e 20     ** have been 
26de0 75 73 65 72 2d 69 6e 74 65 72 76 65 6e 74 69 6f  user-interventio
26df0 6e 29 2c 20 69 66 20 77 65 20 61 63 71 75 69 72  n), if we acquir
26e00 65 20 74 68 65 20 65 78 63 6c 75 73 69 76 65 20  e the exclusive 
26e10 6c 6f 63 6b 2c 0a 20 20 20 20 20 20 2a 2a 20 77  lock,.      ** w
26e20 65 27 6c 6c 20 74 72 79 20 74 6f 20 6d 61 74 63  e'll try to matc
26e30 68 20 74 68 65 20 63 75 72 72 65 6e 74 20 6f 6e  h the current on
26e40 2d 64 69 73 6b 20 70 65 72 6d 69 73 73 69 6f 6e  -disk permission
26e50 73 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  s of the databas
26e60 65 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  e.      */.     
26e70 20 73 79 6e 63 50 65 72 6d 73 20 3d 20 31 3b 0a   syncPerms = 1;.
26e80 20 20 20 20 7d 0a 20 20 20 20 0a 20 20 20 20 2f      }.    .    /
26e90 2a 20 65 69 74 68 65 72 20 63 6f 6e 63 68 20 77  * either conch w
26ea0 61 73 20 65 6d 74 70 79 20 6f 72 20 64 69 64 6e  as emtpy or didn
26eb0 27 74 20 6d 61 74 63 68 20 2a 2f 0a 20 20 20 20  't match */.    
26ec0 69 66 28 20 21 70 43 74 78 2d 3e 6c 6f 63 6b 50  if( !pCtx->lockP
26ed0 72 6f 78 79 50 61 74 68 20 29 7b 0a 20 20 20 20  roxyPath ){.    
26ee0 20 20 70 72 6f 78 79 47 65 74 4c 6f 63 6b 50 61    proxyGetLockPa
26ef0 74 68 28 70 43 74 78 2d 3e 64 62 50 61 74 68 2c  th(pCtx->dbPath,
26f00 20 6c 6f 63 6b 50 61 74 68 2c 20 4d 41 58 50 41   lockPath, MAXPA
26f10 54 48 4c 45 4e 29 3b 0a 20 20 20 20 20 20 74 4c  THLEN);.      tL
26f20 6f 63 6b 50 61 74 68 20 3d 20 6c 6f 63 6b 50 61  ockPath = lockPa
26f30 74 68 3b 0a 20 20 20 20 20 20 73 74 72 6c 63 70  th;.      strlcp
26f40 79 28 26 74 65 73 74 56 61 6c 75 65 5b 48 4f 53  y(&testValue[HOS
26f50 54 49 44 4c 45 4e 5d 2c 20 6c 6f 63 6b 50 61 74  TIDLEN], lockPat
26f60 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a  h, MAXPATHLEN);.
26f70 20 20 20 20 7d 0a 20 20 20 20 0a 20 20 20 20 2f      }.    .    /
26f80 2a 20 75 70 64 61 74 65 20 63 6f 6e 63 68 20 77  * update conch w
26f90 69 74 68 20 68 6f 73 74 20 61 6e 64 20 70 61 74  ith host and pat
26fa0 68 20 28 74 68 69 73 20 77 69 6c 6c 20 66 61 69  h (this will fai
26fb0 6c 20 69 66 20 6f 74 68 65 72 20 70 72 6f 63 65  l if other proce
26fc0 73 73 0a 20 20 20 20 20 2a 2a 20 68 61 73 20 61  ss.     ** has a
26fd0 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 61 6c 72   shared lock alr
26fe0 65 61 64 79 29 20 2a 2f 0a 20 20 20 20 72 63 20  eady) */.    rc 
26ff0 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65  = conchFile->pMe
27000 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28 73 71 6c  thod->xLock((sql
27010 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68  ite3_file*)conch
27020 46 69 6c 65 2c 20 45 58 43 4c 55 53 49 56 45 5f  File, EXCLUSIVE_
27030 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 72  LOCK);.    if( r
27040 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
27050 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 57        rc = unixW
27060 72 69 74 65 28 28 73 71 6c 69 74 65 33 5f 66 69  rite((sqlite3_fi
27070 6c 65 20 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20  le *)conchFile, 
27080 74 65 73 74 56 61 6c 75 65 2c 20 43 4f 4e 43 48  testValue, CONCH
27090 4c 45 4e 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  LEN, 0);.      i
270a0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
270b0 20 26 26 20 73 79 6e 63 50 65 72 6d 73 20 29 7b   && syncPerms ){
270c0 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20  .        struct 
270d0 73 74 61 74 20 62 75 66 3b 0a 20 20 20 20 20 20  stat buf;.      
270e0 20 20 69 6e 74 20 65 72 72 20 3d 20 66 73 74 61    int err = fsta
270f0 74 28 70 46 69 6c 65 2d 3e 68 2c 20 26 62 75 66  t(pFile->h, &buf
27100 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 65  );.        if( e
27110 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  rr==0 ){.       
27120 20 20 20 2f 2a 20 74 72 79 20 74 6f 20 6d 61 74     /* try to mat
27130 63 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ch the database 
27140 66 69 6c 65 20 70 65 72 6d 69 73 73 69 6f 6e 73  file permissions
27150 2c 20 69 67 6e 6f 72 65 20 66 61 69 6c 75 72 65  , ignore failure
27160 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
27170 54 45 5f 50 52 4f 58 59 5f 44 45 42 55 47 0a 20  TE_PROXY_DEBUG. 
27180 20 20 20 20 20 20 20 20 20 66 63 68 6d 6f 64 28           fchmod(
27190 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 62 75  conchFile->h, bu
271a0 66 2e 73 74 5f 6d 6f 64 65 29 3b 0a 23 65 6c 73  f.st_mode);.#els
271b0 65 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  e.          if( 
271c0 66 63 68 6d 6f 64 28 63 6f 6e 63 68 46 69 6c 65  fchmod(conchFile
271d0 2d 3e 68 2c 20 62 75 66 2e 73 74 5f 6d 6f 64 65  ->h, buf.st_mode
271e0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
271f0 20 20 20 20 69 6e 74 20 63 6f 64 65 20 3d 20 65      int code = e
27200 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20  rrno;.          
27210 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
27220 2c 20 22 66 63 68 6d 6f 64 20 25 6f 20 46 41 49  , "fchmod %o FAI
27230 4c 45 44 20 77 69 74 68 20 25 64 20 25 73 5c 6e  LED with %d %s\n
27240 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
27250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27260 62 75 66 2e 73 74 5f 6d 6f 64 65 2c 20 63 6f 64  buf.st_mode, cod
27270 65 2c 20 73 74 72 65 72 72 6f 72 28 63 6f 64 65  e, strerror(code
27280 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 20  ));.          } 
27290 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20  else {.         
272a0 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
272b0 72 2c 20 22 66 63 68 6d 6f 64 20 25 6f 20 53 55  r, "fchmod %o SU
272c0 43 43 45 44 45 44 5c 6e 22 2c 62 75 66 2e 73 74  CCEDED\n",buf.st
272d0 5f 6d 6f 64 65 29 3b 0a 20 20 20 20 20 20 20 20  _mode);.        
272e0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73    }.        }els
272f0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  e{.          int
27300 20 63 6f 64 65 20 3d 20 65 72 72 6e 6f 3b 0a 20   code = errno;. 
27310 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66           fprintf
27320 28 73 74 64 65 72 72 2c 20 22 53 54 41 54 20 46  (stderr, "STAT F
27330 41 49 4c 45 44 5b 25 64 5d 20 77 69 74 68 20 25  AILED[%d] with %
27340 64 20 25 73 5c 6e 22 2c 20 0a 20 20 20 20 20 20  d %s\n", .      
27350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27360 20 20 20 20 65 72 72 2c 20 63 6f 64 65 2c 20 73      err, code, s
27370 74 72 65 72 72 6f 72 28 63 6f 64 65 29 29 3b 0a  trerror(code));.
27380 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7d  #endif.        }
27390 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
273a0 20 20 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d     conchFile->pM
273b0 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28 28  ethod->xUnlock((
273c0 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f  sqlite3_file*)co
273d0 6e 63 68 46 69 6c 65 2c 20 53 48 41 52 45 44 5f  nchFile, SHARED_
273e0 4c 4f 43 4b 29 3b 0a 20 20 0a 65 6e 64 5f 74 61  LOCK);.  .end_ta
273f0 6b 65 63 6f 6e 63 68 3a 0a 20 20 20 20 4f 53 54  keconch:.    OST
27400 52 41 43 45 32 28 22 54 52 41 4e 53 50 52 4f 58  RACE2("TRANSPROX
27410 59 3a 20 43 4c 4f 53 45 20 20 25 64 5c 6e 22 2c  Y: CLOSE  %d\n",
27420 20 70 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 20 20   pFile->h);.    
27430 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
27440 4b 20 26 26 20 70 46 69 6c 65 2d 3e 6f 70 65 6e  K && pFile->open
27450 46 6c 61 67 73 20 29 7b 0a 20 20 20 20 20 20 69  Flags ){.      i
27460 66 28 20 70 46 69 6c 65 2d 3e 68 3e 3d 30 20 29  f( pFile->h>=0 )
27470 7b 0a 23 69 66 64 65 66 20 53 54 52 49 43 54 5f  {.#ifdef STRICT_
27480 43 4c 4f 53 45 5f 45 52 52 4f 52 0a 20 20 20 20  CLOSE_ERROR.    
27490 20 20 20 20 69 66 28 20 63 6c 6f 73 65 28 70 46      if( close(pF
274a0 69 6c 65 2d 3e 68 29 20 29 7b 0a 20 20 20 20 20  ile->h) ){.     
274b0 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
274c0 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
274d0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
274e0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f  SQLITE_IOERR_CLO
274f0 53 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65  SE;.        }.#e
27500 6c 73 65 0a 20 20 20 20 20 20 20 20 63 6c 6f 73  lse.        clos
27510 65 28 70 46 69 6c 65 2d 3e 68 29 3b 20 2f 2a 20  e(pFile->h); /* 
27520 73 69 6c 65 6e 74 6c 79 20 6c 65 61 6b 20 66 64  silently leak fd
27530 20 69 66 20 66 61 69 6c 20 2a 2f 0a 23 65 6e 64   if fail */.#end
27540 69 66 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  if.      }.     
27550 20 70 46 69 6c 65 2d 3e 68 20 3d 20 2d 31 3b 0a   pFile->h = -1;.
27560 20 20 20 20 20 20 69 6e 74 20 66 64 20 3d 20 6f        int fd = o
27570 70 65 6e 28 70 43 74 78 2d 3e 64 62 50 61 74 68  pen(pCtx->dbPath
27580 2c 20 70 46 69 6c 65 2d 3e 6f 70 65 6e 46 6c 61  , pFile->openFla
27590 67 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  gs,.            
275a0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 44          SQLITE_D
275b0 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d  EFAULT_FILE_PERM
275c0 49 53 53 49 4f 4e 53 29 3b 0a 20 20 20 20 20 20  ISSIONS);.      
275d0 4f 53 54 52 41 43 45 32 28 22 54 52 41 4e 53 50  OSTRACE2("TRANSP
275e0 52 4f 58 59 3a 20 4f 50 45 4e 20 20 25 64 5c 6e  ROXY: OPEN  %d\n
275f0 22 2c 20 66 64 29 3b 0a 20 20 20 20 20 20 69 66  ", fd);.      if
27600 28 20 66 64 3e 3d 30 20 29 7b 0a 20 20 20 20 20  ( fd>=0 ){.     
27610 20 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 66 64     pFile->h = fd
27620 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
27630 20 20 20 20 20 20 20 72 63 3d 53 51 4c 49 54 45         rc=SQLITE
27640 5f 43 41 4e 54 4f 50 45 4e 3b 20 2f 2a 20 53 51  _CANTOPEN; /* SQ
27650 4c 49 54 45 5f 42 55 53 59 3f 20 70 72 6f 78 79  LITE_BUSY? proxy
27660 54 61 6b 65 43 6f 6e 63 68 20 63 61 6c 6c 65 64  TakeConch called
27670 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
27680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27690 64 75 72 69 6e 67 20 6c 6f 63 6b 69 6e 67 20 2a  during locking *
276a0 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  /.      }.    }.
276b0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
276c0 54 45 5f 4f 4b 20 26 26 20 21 70 43 74 78 2d 3e  TE_OK && !pCtx->
276d0 6c 6f 63 6b 50 72 6f 78 79 20 29 7b 0a 20 20 20  lockProxy ){.   
276e0 20 20 20 63 68 61 72 20 2a 70 61 74 68 20 3d 20     char *path = 
276f0 74 4c 6f 63 6b 50 61 74 68 20 3f 20 74 4c 6f 63  tLockPath ? tLoc
27700 6b 50 61 74 68 20 3a 20 70 43 74 78 2d 3e 6c 6f  kPath : pCtx->lo
27710 63 6b 50 72 6f 78 79 50 61 74 68 3b 0a 20 20 20  ckProxyPath;.   
27720 20 20 20 2f 2a 20 41 43 53 3a 20 4e 65 65 64 20     /* ACS: Need 
27730 74 6f 20 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f  to make a copy o
27740 66 20 70 61 74 68 20 73 6f 6d 65 74 69 6d 65 73  f path sometimes
27750 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 70   */.      rc = p
27760 72 6f 78 79 43 72 65 61 74 65 55 6e 69 78 46 69  roxyCreateUnixFi
27770 6c 65 28 70 61 74 68 2c 20 26 70 43 74 78 2d 3e  le(path, &pCtx->
27780 6c 6f 63 6b 50 72 6f 78 79 29 3b 0a 20 20 20 20  lockProxy);.    
27790 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
277a0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
277b0 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64   pCtx->conchHeld
277c0 20 3d 20 31 3b 0a 0a 20 20 20 20 20 20 69 66 28   = 1;..      if(
277d0 20 74 4c 6f 63 6b 50 61 74 68 20 29 7b 0a 20 20   tLockPath ){.  
277e0 20 20 20 20 20 20 70 43 74 78 2d 3e 6c 6f 63 6b        pCtx->lock
277f0 50 72 6f 78 79 50 61 74 68 20 3d 20 73 71 6c 69  ProxyPath = sqli
27800 74 65 33 44 62 53 74 72 44 75 70 28 30 2c 20 74  te3DbStrDup(0, t
27810 4c 6f 63 6b 50 61 74 68 29 3b 0a 20 20 20 20 20  LockPath);.     
27820 20 20 20 69 66 28 20 70 43 74 78 2d 3e 6c 6f 63     if( pCtx->loc
27830 6b 50 72 6f 78 79 2d 3e 70 4d 65 74 68 6f 64 20  kProxy->pMethod 
27840 3d 3d 20 26 61 66 70 49 6f 4d 65 74 68 6f 64 73  == &afpIoMethods
27850 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 28 28   ){.          ((
27860 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
27870 74 20 2a 29 70 43 74 78 2d 3e 6c 6f 63 6b 50 72  t *)pCtx->lockPr
27880 6f 78 79 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  oxy->lockingCont
27890 65 78 74 29 2d 3e 64 62 50 61 74 68 20 3d 0a 20  ext)->dbPath =. 
278a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
278b0 20 20 20 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72      pCtx->lockPr
278c0 6f 78 79 50 61 74 68 3b 0a 20 20 20 20 20 20 20  oxyPath;.       
278d0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
278e0 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 63 6f   else {.      co
278f0 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64  nchFile->pMethod
27900 2d 3e 78 55 6e 6c 6f 63 6b 28 28 73 71 6c 69 74  ->xUnlock((sqlit
27910 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69  e3_file*)conchFi
27920 6c 65 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20  le, NO_LOCK);.  
27930 20 20 7d 0a 20 20 20 20 4f 53 54 52 41 43 45 33    }.    OSTRACE3
27940 28 22 54 41 4b 45 43 4f 4e 43 48 20 20 25 64 20  ("TAKECONCH  %d 
27950 25 73 5c 6e 22 2c 20 63 6f 6e 63 68 46 69 6c 65  %s\n", conchFile
27960 2d 3e 68 2c 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ->h, rc==SQLITE_
27970 4f 4b 3f 22 6f 6b 22 3a 22 66 61 69 6c 65 64 22  OK?"ok":"failed"
27980 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  );.    return rc
27990 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  ;.  }.}../*.** I
279a0 66 20 70 46 69 6c 65 20 68 6f 6c 64 73 20 61 20  f pFile holds a 
279b0 6c 6f 63 6b 20 6f 6e 20 61 20 63 6f 6e 63 68 20  lock on a conch 
279c0 66 69 6c 65 2c 20 74 68 65 6e 20 72 65 6c 65 61  file, then relea
279d0 73 65 20 74 68 61 74 20 6c 6f 63 6b 2e 0a 2a 2f  se that lock..*/
279e0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
279f0 79 52 65 6c 65 61 73 65 43 6f 6e 63 68 28 75 6e  yReleaseConch(un
27a00 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a  ixFile *pFile){.
27a10 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
27a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
27a30 20 53 75 62 72 6f 75 74 69 6e 65 20 72 65 74 75   Subroutine retu
27a40 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 70 72 6f  rn code */.  pro
27a50 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  xyLockingContext
27a60 20 2a 70 43 74 78 3b 20 20 2f 2a 20 54 68 65 20   *pCtx;  /* The 
27a70 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20  locking context 
27a80 66 6f 72 20 74 68 65 20 70 72 6f 78 79 20 6c 6f  for the proxy lo
27a90 63 6b 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65  ck */.  unixFile
27aa0 20 2a 63 6f 6e 63 68 46 69 6c 65 3b 20 20 20 20   *conchFile;    
27ab0 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
27ac0 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 2a 2f  he conch file */
27ad0 0a 0a 20 20 70 43 74 78 20 3d 20 28 70 72 6f 78  ..  pCtx = (prox
27ae0 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  yLockingContext 
27af0 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  *)pFile->locking
27b00 43 6f 6e 74 65 78 74 3b 0a 20 20 63 6f 6e 63 68  Context;.  conch
27b10 46 69 6c 65 20 3d 20 70 43 74 78 2d 3e 63 6f 6e  File = pCtx->con
27b20 63 68 46 69 6c 65 3b 0a 20 20 4f 53 54 52 41 43  chFile;.  OSTRAC
27b30 45 34 28 22 52 45 4c 45 41 53 45 43 4f 4e 43 48  E4("RELEASECONCH
27b40 20 20 25 64 20 66 6f 72 20 25 73 20 70 69 64 3d    %d for %s pid=
27b50 25 64 5c 6e 22 2c 20 63 6f 6e 63 68 46 69 6c 65  %d\n", conchFile
27b60 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ->h,.           
27b70 28 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79  (pCtx->lockProxy
27b80 50 61 74 68 20 3f 20 70 43 74 78 2d 3e 6c 6f 63  Path ? pCtx->loc
27b90 6b 50 72 6f 78 79 50 61 74 68 20 3a 20 22 3a 61  kProxyPath : ":a
27ba0 75 74 6f 3a 22 29 2c 20 0a 20 20 20 20 20 20 20  uto:"), .       
27bb0 20 20 20 20 67 65 74 70 69 64 28 29 29 3b 0a 20      getpid());. 
27bc0 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64   pCtx->conchHeld
27bd0 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 63 6f 6e   = 0;.  rc = con
27be0 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d  chFile->pMethod-
27bf0 3e 78 55 6e 6c 6f 63 6b 28 28 73 71 6c 69 74 65  >xUnlock((sqlite
27c00 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c  3_file*)conchFil
27c10 65 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 4f  e, NO_LOCK);.  O
27c20 53 54 52 41 43 45 33 28 22 52 45 4c 45 41 53 45  STRACE3("RELEASE
27c30 43 4f 4e 43 48 20 20 25 64 20 25 73 5c 6e 22 2c  CONCH  %d %s\n",
27c40 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 0a 20   conchFile->h,. 
27c50 20 20 20 20 20 20 20 20 20 20 28 72 63 3d 3d 53            (rc==S
27c60 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20  QLITE_OK ? "ok" 
27c70 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20  : "failed"));.  
27c80 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
27c90 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 6e 61  .** Given the na
27ca0 6d 65 20 6f 66 20 61 20 64 61 74 61 62 61 73 65  me of a database
27cb0 20 66 69 6c 65 2c 20 63 6f 6d 70 75 74 65 20 74   file, compute t
27cc0 68 65 20 6e 61 6d 65 20 6f 66 20 69 74 73 20 63  he name of its c
27cd0 6f 6e 63 68 20 66 69 6c 65 2e 0a 2a 2a 20 53 74  onch file..** St
27ce0 6f 72 65 20 74 68 65 20 63 6f 6e 63 68 20 66 69  ore the conch fi
27cf0 6c 65 6e 61 6d 65 20 69 6e 20 6d 65 6d 6f 72 79  lename in memory
27d00 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73   obtained from s
27d10 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e  qlite3_malloc().
27d20 0a 2a 2a 20 4d 61 6b 65 20 2a 70 43 6f 6e 63 68  .** Make *pConch
27d30 50 61 74 68 20 70 6f 69 6e 74 20 74 6f 20 74 68  Path point to th
27d40 65 20 6e 65 77 20 6e 61 6d 65 2e 20 20 52 65 74  e new name.  Ret
27d50 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
27d60 20 73 75 63 63 65 73 73 0a 2a 2a 20 6f 72 20 53   success.** or S
27d70 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 75  QLITE_NOMEM if u
27d80 6e 61 62 6c 65 20 74 6f 20 6f 62 74 61 69 6e 20  nable to obtain 
27d90 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68  memory..**.** Th
27da0 65 20 63 61 6c 6c 65 72 20 69 73 20 72 65 73 70  e caller is resp
27db0 6f 6e 73 69 62 6c 65 20 66 6f 72 20 65 6e 73 75  onsible for ensu
27dc0 72 69 6e 67 20 74 68 61 74 20 74 68 65 20 61 6c  ring that the al
27dd0 6c 6f 63 61 74 65 64 20 6d 65 6d 6f 72 79 0a 2a  located memory.*
27de0 2a 20 73 70 61 63 65 20 69 73 20 65 76 65 6e 74  * space is event
27df0 75 61 6c 6c 79 20 66 72 65 65 64 2e 0a 2a 2a 0a  ually freed..**.
27e00 2a 2a 20 2a 70 43 6f 6e 63 68 50 61 74 68 20 69  ** *pConchPath i
27e10 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 69 66  s set to NULL if
27e20 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61   a memory alloca
27e30 74 69 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  tion error occur
27e40 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
27e50 20 70 72 6f 78 79 43 72 65 61 74 65 43 6f 6e 63   proxyCreateConc
27e60 68 50 61 74 68 6e 61 6d 65 28 63 68 61 72 20 2a  hPathname(char *
27e70 64 62 50 61 74 68 2c 20 63 68 61 72 20 2a 2a 70  dbPath, char **p
27e80 43 6f 6e 63 68 50 61 74 68 29 7b 0a 20 20 69 6e  ConchPath){.  in
27e90 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
27ea0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
27eb0 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
27ec0 20 69 6e 74 20 6c 65 6e 20 3d 20 28 69 6e 74 29   int len = (int)
27ed0 73 74 72 6c 65 6e 28 64 62 50 61 74 68 29 3b 20  strlen(dbPath); 
27ee0 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 64 61 74  /* Length of dat
27ef0 61 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 20 2d  abase filename -
27f00 20 64 62 50 61 74 68 20 2a 2f 0a 20 20 63 68 61   dbPath */.  cha
27f10 72 20 2a 63 6f 6e 63 68 50 61 74 68 3b 20 20 20  r *conchPath;   
27f20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 62 75             /* bu
27f30 66 66 65 72 20 69 6e 20 77 68 69 63 68 20 74 6f  ffer in which to
27f40 20 63 6f 6e 73 74 72 75 63 74 20 63 6f 6e 63 68   construct conch
27f50 20 6e 61 6d 65 20 2a 2f 0a 0a 20 20 2f 2a 20 41   name */..  /* A
27f60 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f  llocate space fo
27f70 72 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65  r the conch file
27f80 6e 61 6d 65 20 61 6e 64 20 69 6e 69 74 69 61 6c  name and initial
27f90 69 7a 65 20 74 68 65 20 6e 61 6d 65 20 74 6f 0a  ize the name to.
27fa0 20 20 2a 2a 20 74 68 65 20 6e 61 6d 65 20 6f 66    ** the name of
27fb0 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61   the original da
27fc0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 20  tabase file. */ 
27fd0 20 0a 20 20 2a 70 43 6f 6e 63 68 50 61 74 68 20   .  *pConchPath 
27fe0 3d 20 63 6f 6e 63 68 50 61 74 68 20 3d 20 28 63  = conchPath = (c
27ff0 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61  har *)sqlite3_ma
28000 6c 6c 6f 63 28 6c 65 6e 20 2b 20 38 29 3b 0a 20  lloc(len + 8);. 
28010 20 69 66 28 20 63 6f 6e 63 68 50 61 74 68 3d 3d   if( conchPath==
28020 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
28030 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
28040 7d 0a 20 20 6d 65 6d 63 70 79 28 63 6f 6e 63 68  }.  memcpy(conch
28050 50 61 74 68 2c 20 64 62 50 61 74 68 2c 20 6c 65  Path, dbPath, le
28060 6e 2b 31 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f  n+1);.  .  /* no
28070 77 20 69 6e 73 65 72 74 20 61 20 22 2e 22 20 62  w insert a "." b
28080 65 66 6f 72 65 20 74 68 65 20 6c 61 73 74 20 2f  efore the last /
28090 20 63 68 61 72 61 63 74 65 72 20 2a 2f 0a 20 20   character */.  
280a0 66 6f 72 28 20 69 3d 28 6c 65 6e 2d 31 29 3b 20  for( i=(len-1); 
280b0 69 3e 3d 30 3b 20 69 2d 2d 20 29 7b 0a 20 20 20  i>=0; i-- ){.   
280c0 20 69 66 28 20 63 6f 6e 63 68 50 61 74 68 5b 69   if( conchPath[i
280d0 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20  ]=='/' ){.      
280e0 69 2b 2b 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  i++;.      break
280f0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 63 6f  ;.    }.  }.  co
28100 6e 63 68 50 61 74 68 5b 69 5d 3d 27 2e 27 3b 0a  nchPath[i]='.';.
28110 20 20 77 68 69 6c 65 20 28 20 69 3c 6c 65 6e 20    while ( i<len 
28120 29 7b 0a 20 20 20 20 63 6f 6e 63 68 50 61 74 68  ){.    conchPath
28130 5b 69 2b 31 5d 3d 64 62 50 61 74 68 5b 69 5d 3b  [i+1]=dbPath[i];
28140 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a 0a 20  .    i++;.  }.. 
28150 20 2f 2a 20 61 70 70 65 6e 64 20 74 68 65 20 22   /* append the "
28160 2d 63 6f 6e 63 68 22 20 73 75 66 66 69 78 20 74  -conch" suffix t
28170 6f 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20  o the file */.  
28180 6d 65 6d 63 70 79 28 26 63 6f 6e 63 68 50 61 74  memcpy(&conchPat
28190 68 5b 69 2b 31 5d 2c 20 22 2d 63 6f 6e 63 68 22  h[i+1], "-conch"
281a0 2c 20 37 29 3b 0a 20 20 61 73 73 65 72 74 28 20  , 7);.  assert( 
281b0 28 69 6e 74 29 73 74 72 6c 65 6e 28 63 6f 6e 63  (int)strlen(conc
281c0 68 50 61 74 68 29 20 3d 3d 20 6c 65 6e 2b 37 20  hPath) == len+7 
281d0 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  );..  return SQL
281e0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 20 54  ITE_OK;.}.../* T
281f0 61 6b 65 73 20 61 20 66 75 6c 6c 79 20 63 6f 6e  akes a fully con
28200 66 69 67 75 72 65 64 20 70 72 6f 78 79 20 6c 6f  figured proxy lo
28210 63 6b 69 6e 67 2d 73 74 79 6c 65 20 75 6e 69 78  cking-style unix
28220 20 66 69 6c 65 20 61 6e 64 20 73 77 69 74 63 68   file and switch
28230 65 73 0a 2a 2a 20 74 68 65 20 6c 6f 63 61 6c 20  es.** the local 
28240 6c 6f 63 6b 20 66 69 6c 65 20 70 61 74 68 20 0a  lock file path .
28250 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 77  */.static int sw
28260 69 74 63 68 4c 6f 63 6b 50 72 6f 78 79 50 61 74  itchLockProxyPat
28270 68 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c  h(unixFile *pFil
28280 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70  e, const char *p
28290 61 74 68 29 20 7b 0a 20 20 70 72 6f 78 79 4c 6f  ath) {.  proxyLo
282a0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43  ckingContext *pC
282b0 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69  tx = (proxyLocki
282c0 6e 67 43 6f 6e 74 65 78 74 2a 29 70 46 69 6c 65  ngContext*)pFile
282d0 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
282e0 3b 0a 20 20 63 68 61 72 20 2a 6f 6c 64 50 61 74  ;.  char *oldPat
282f0 68 20 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72  h = pCtx->lockPr
28300 6f 78 79 50 61 74 68 3b 0a 20 20 69 6e 74 20 72  oxyPath;.  int r
28310 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
28320 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63    if( pFile->loc
28330 6b 74 79 70 65 21 3d 4e 4f 5f 4c 4f 43 4b 20 29  ktype!=NO_LOCK )
28340 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
28350 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 20 20 0a  ITE_BUSY;.  }  .
28360 0a 20 20 2f 2a 20 6e 6f 74 68 69 6e 67 20 74 6f  .  /* nothing to
28370 20 64 6f 20 69 66 20 74 68 65 20 70 61 74 68 20   do if the path 
28380 69 73 20 4e 55 4c 4c 2c 20 3a 61 75 74 6f 3a 20  is NULL, :auto: 
28390 6f 72 20 6d 61 74 63 68 65 73 20 74 68 65 20 65  or matches the e
283a0 78 69 73 74 69 6e 67 20 70 61 74 68 20 2a 2f 0a  xisting path */.
283b0 20 20 69 66 28 20 21 70 61 74 68 20 7c 7c 20 70    if( !path || p
283c0 61 74 68 5b 30 5d 3d 3d 27 5c 30 27 20 7c 7c 20  ath[0]=='\0' || 
283d0 21 73 74 72 63 6d 70 28 70 61 74 68 2c 20 22 3a  !strcmp(path, ":
283e0 61 75 74 6f 3a 22 29 20 7c 7c 0a 20 20 20 20 28  auto:") ||.    (
283f0 6f 6c 64 50 61 74 68 20 26 26 20 21 73 74 72 6e  oldPath && !strn
28400 63 6d 70 28 6f 6c 64 50 61 74 68 2c 20 70 61 74  cmp(oldPath, pat
28410 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29 29 20  h, MAXPATHLEN)) 
28420 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
28430 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65  LITE_OK;.  }else
28440 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a  {.    unixFile *
28450 6c 6f 63 6b 50 72 6f 78 79 20 3d 20 70 43 74 78  lockProxy = pCtx
28460 2d 3e 6c 6f 63 6b 50 72 6f 78 79 3b 0a 20 20 20  ->lockProxy;.   
28470 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79   pCtx->lockProxy
28480 3d 4e 55 4c 4c 3b 0a 20 20 20 20 70 43 74 78 2d  =NULL;.    pCtx-
28490 3e 63 6f 6e 63 68 48 65 6c 64 20 3d 20 30 3b 0a  >conchHeld = 0;.
284a0 20 20 20 20 69 66 28 20 6c 6f 63 6b 50 72 6f 78      if( lockProx
284b0 79 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20  y!=NULL ){.     
284c0 20 72 63 3d 6c 6f 63 6b 50 72 6f 78 79 2d 3e 70   rc=lockProxy->p
284d0 4d 65 74 68 6f 64 2d 3e 78 43 6c 6f 73 65 28 28  Method->xClose((
284e0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 6c  sqlite3_file *)l
284f0 6f 63 6b 50 72 6f 78 79 29 3b 0a 20 20 20 20 20  ockProxy);.     
28500 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
28510 20 72 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   rc;.      sqlit
28520 65 33 5f 66 72 65 65 28 6c 6f 63 6b 50 72 6f 78  e3_free(lockProx
28530 79 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  y);.    }.    sq
28540 6c 69 74 65 33 5f 66 72 65 65 28 6f 6c 64 50 61  lite3_free(oldPa
28550 74 68 29 3b 0a 20 20 20 20 70 43 74 78 2d 3e 6c  th);.    pCtx->l
28560 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 3d 20 73  ockProxyPath = s
28570 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 30  qlite3DbStrDup(0
28580 2c 20 70 61 74 68 29 3b 0a 20 20 7d 0a 20 20 0a  , path);.  }.  .
28590 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
285a0 2f 2a 0a 2a 2a 20 70 46 69 6c 65 20 69 73 20 61  /*.** pFile is a
285b0 20 66 69 6c 65 20 74 68 61 74 20 68 61 73 20 62   file that has b
285c0 65 65 6e 20 6f 70 65 6e 65 64 20 62 79 20 61 20  een opened by a 
285d0 70 72 69 6f 72 20 78 4f 70 65 6e 20 63 61 6c 6c  prior xOpen call
285e0 2e 20 20 64 62 50 61 74 68 0a 2a 2a 20 69 73 20  .  dbPath.** is 
285f0 61 20 73 74 72 69 6e 67 20 62 75 66 66 65 72 20  a string buffer 
28600 61 74 20 6c 65 61 73 74 20 4d 41 58 50 41 54 48  at least MAXPATH
28610 4c 45 4e 2b 31 20 63 68 61 72 61 63 74 65 72 73  LEN+1 characters
28620 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20   in size..**.** 
28630 54 68 69 73 20 72 6f 75 74 69 6e 65 20 66 69 6e  This routine fin
28640 64 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20 61  d the filename a
28650 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70  ssociated with p
28660 46 69 6c 65 20 61 6e 64 20 77 72 69 74 65 73 20  File and writes 
28670 69 74 0a 2a 2a 20 69 6e 74 20 64 62 50 61 74 68  it.** int dbPath
28680 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
28690 70 72 6f 78 79 47 65 74 44 62 50 61 74 68 46 6f  proxyGetDbPathFo
286a0 72 55 6e 69 78 46 69 6c 65 28 75 6e 69 78 46 69  rUnixFile(unixFi
286b0 6c 65 20 2a 70 46 69 6c 65 2c 20 63 68 61 72 20  le *pFile, char 
286c0 2a 64 62 50 61 74 68 29 7b 0a 23 69 66 20 64 65  *dbPath){.#if de
286d0 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
286e0 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 4d  .  if( pFile->pM
286f0 65 74 68 6f 64 20 3d 3d 20 26 61 66 70 49 6f 4d  ethod == &afpIoM
28700 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f 2a  ethods ){.    /*
28710 20 61 66 70 20 73 74 79 6c 65 20 6b 65 65 70 73   afp style keeps
28720 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
28730 74 68 65 20 64 62 20 70 61 74 68 20 69 6e 20 74  the db path in t
28740 68 65 20 66 69 6c 65 50 61 74 68 20 66 69 65 6c  he filePath fiel
28750 64 20 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  d .    ** of the
28760 20 73 74 72 75 63 74 20 2a 2f 0a 20 20 20 20 61   struct */.    a
28770 73 73 65 72 74 28 20 28 69 6e 74 29 73 74 72 6c  ssert( (int)strl
28780 65 6e 28 28 63 68 61 72 2a 29 70 46 69 6c 65 2d  en((char*)pFile-
28790 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29  >lockingContext)
287a0 3c 3d 4d 41 58 50 41 54 48 4c 45 4e 20 29 3b 0a  <=MAXPATHLEN );.
287b0 20 20 20 20 73 74 72 63 70 79 28 64 62 50 61 74      strcpy(dbPat
287c0 68 2c 20 28 28 61 66 70 4c 6f 63 6b 69 6e 67 43  h, ((afpLockingC
287d0 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e  ontext *)pFile->
287e0 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 2d  lockingContext)-
287f0 3e 64 62 50 61 74 68 29 3b 0a 20 20 7d 65 6c 73  >dbPath);.  }els
28800 65 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70  e.#endif.  if( p
28810 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 20 3d 3d  File->pMethod ==
28820 20 26 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f   &dotlockIoMetho
28830 64 73 20 29 7b 0a 20 20 20 20 2f 2a 20 64 6f 74  ds ){.    /* dot
28840 20 6c 6f 63 6b 20 73 74 79 6c 65 20 75 73 65 73   lock style uses
28850 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e   the locking con
28860 74 65 78 74 20 74 6f 20 73 74 6f 72 65 20 74 68  text to store th
28870 65 20 64 6f 74 20 6c 6f 63 6b 0a 20 20 20 20 2a  e dot lock.    *
28880 2a 20 66 69 6c 65 20 70 61 74 68 20 2a 2f 0a 20  * file path */. 
28890 20 20 20 69 6e 74 20 6c 65 6e 20 3d 20 73 74 72     int len = str
288a0 6c 65 6e 28 28 63 68 61 72 20 2a 29 70 46 69 6c  len((char *)pFil
288b0 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
288c0 74 29 20 2d 20 73 74 72 6c 65 6e 28 44 4f 54 4c  t) - strlen(DOTL
288d0 4f 43 4b 5f 53 55 46 46 49 58 29 3b 0a 20 20 20  OCK_SUFFIX);.   
288e0 20 6d 65 6d 63 70 79 28 64 62 50 61 74 68 2c 20   memcpy(dbPath, 
288f0 28 63 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e 6c  (char *)pFile->l
28900 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2c 20 6c  ockingContext, l
28910 65 6e 20 2b 20 31 29 3b 0a 20 20 7d 65 6c 73 65  en + 1);.  }else
28920 7b 0a 20 20 20 20 2f 2a 20 61 6c 6c 20 6f 74 68  {.    /* all oth
28930 65 72 20 73 74 79 6c 65 73 20 75 73 65 20 74 68  er styles use th
28940 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78  e locking contex
28950 74 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 64  t to store the d
28960 62 20 66 69 6c 65 20 70 61 74 68 20 2a 2f 0a 20  b file path */. 
28970 20 20 20 61 73 73 65 72 74 28 20 73 74 72 6c 65     assert( strle
28980 6e 28 28 63 68 61 72 2a 29 70 46 69 6c 65 2d 3e  n((char*)pFile->
28990 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3c  lockingContext)<
289a0 3d 4d 41 58 50 41 54 48 4c 45 4e 20 29 3b 0a 20  =MAXPATHLEN );. 
289b0 20 20 20 73 74 72 63 70 79 28 64 62 50 61 74 68     strcpy(dbPath
289c0 2c 20 28 63 68 61 72 20 2a 29 70 46 69 6c 65 2d  , (char *)pFile-
289d0 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29  >lockingContext)
289e0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
289f0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
28a00 2a 2a 20 54 61 6b 65 73 20 61 6e 20 61 6c 72 65  ** Takes an alre
28a10 61 64 79 20 66 69 6c 6c 65 64 20 69 6e 20 75 6e  ady filled in un
28a20 69 78 20 66 69 6c 65 20 61 6e 64 20 61 6c 74 65  ix file and alte
28a30 72 73 20 69 74 20 73 6f 20 61 6c 6c 20 66 69 6c  rs it so all fil
28a40 65 20 6c 6f 63 6b 69 6e 67 20 0a 2a 2a 20 77 69  e locking .** wi
28a50 6c 6c 20 62 65 20 70 65 72 66 6f 72 6d 65 64 20  ll be performed 
28a60 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 72 6f  on the local pro
28a70 78 79 20 6c 6f 63 6b 20 66 69 6c 65 2e 20 20 54  xy lock file.  T
28a80 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65  he following fie
28a90 6c 64 73 0a 2a 2a 20 61 72 65 20 70 72 65 73 65  lds.** are prese
28aa0 72 76 65 64 20 69 6e 20 74 68 65 20 6c 6f 63 6b  rved in the lock
28ab0 69 6e 67 20 63 6f 6e 74 65 78 74 20 73 6f 20 74  ing context so t
28ac0 68 61 74 20 74 68 65 79 20 63 61 6e 20 62 65 20  hat they can be 
28ad0 72 65 73 74 6f 72 65 64 20 61 6e 64 20 0a 2a 2a  restored and .**
28ae0 20 74 68 65 20 75 6e 69 78 20 73 74 72 75 63 74   the unix struct
28af0 75 72 65 20 70 72 6f 70 65 72 6c 79 20 63 6c 65  ure properly cle
28b00 61 6e 65 64 20 75 70 20 61 74 20 63 6c 6f 73 65  aned up at close
28b10 20 74 69 6d 65 3a 0a 2a 2a 20 20 2d 3e 6c 6f 63   time:.**  ->loc
28b20 6b 69 6e 67 43 6f 6e 74 65 78 74 0a 2a 2a 20 20  kingContext.**  
28b30 2d 3e 70 4d 65 74 68 6f 64 0a 2a 2f 0a 73 74 61  ->pMethod.*/.sta
28b40 74 69 63 20 69 6e 74 20 70 72 6f 78 79 54 72 61  tic int proxyTra
28b50 6e 73 66 6f 72 6d 55 6e 69 78 46 69 6c 65 28 75  nsformUnixFile(u
28b60 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20  nixFile *pFile, 
28b70 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 61 74 68  const char *path
28b80 29 20 7b 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 69  ) {.  proxyLocki
28b90 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 3b  ngContext *pCtx;
28ba0 0a 20 20 63 68 61 72 20 64 62 50 61 74 68 5b 4d  .  char dbPath[M
28bb0 41 58 50 41 54 48 4c 45 4e 2b 31 5d 3b 20 20 20  AXPATHLEN+1];   
28bc0 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
28bd0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
28be0 20 2a 2f 0a 20 20 63 68 61 72 20 2a 6c 6f 63 6b   */.  char *lock
28bf0 50 61 74 68 3d 4e 55 4c 4c 3b 0a 20 20 69 6e 74  Path=NULL;.  int
28c00 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
28c10 0a 20 20 0a 20 20 69 66 28 20 70 46 69 6c 65 2d  .  .  if( pFile-
28c20 3e 6c 6f 63 6b 74 79 70 65 21 3d 4e 4f 5f 4c 4f  >locktype!=NO_LO
28c30 43 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  CK ){.    return
28c40 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
28c50 7d 0a 20 20 70 72 6f 78 79 47 65 74 44 62 50 61  }.  proxyGetDbPa
28c60 74 68 46 6f 72 55 6e 69 78 46 69 6c 65 28 70 46  thForUnixFile(pF
28c70 69 6c 65 2c 20 64 62 50 61 74 68 29 3b 0a 20 20  ile, dbPath);.  
28c80 69 66 28 20 21 70 61 74 68 20 7c 7c 20 70 61 74  if( !path || pat
28c90 68 5b 30 5d 3d 3d 27 5c 30 27 20 7c 7c 20 21 73  h[0]=='\0' || !s
28ca0 74 72 63 6d 70 28 70 61 74 68 2c 20 22 3a 61 75  trcmp(path, ":au
28cb0 74 6f 3a 22 29 20 29 7b 0a 20 20 20 20 6c 6f 63  to:") ){.    loc
28cc0 6b 50 61 74 68 3d 4e 55 4c 4c 3b 0a 20 20 7d 65  kPath=NULL;.  }e
28cd0 6c 73 65 7b 0a 20 20 20 20 6c 6f 63 6b 50 61 74  lse{.    lockPat
28ce0 68 3d 28 63 68 61 72 20 2a 29 70 61 74 68 3b 0a  h=(char *)path;.
28cf0 20 20 7d 0a 20 20 0a 20 20 4f 53 54 52 41 43 45    }.  .  OSTRACE
28d00 34 28 22 54 52 41 4e 53 50 52 4f 58 59 20 20 25  4("TRANSPROXY  %
28d10 64 20 66 6f 72 20 25 73 20 70 69 64 3d 25 64 5c  d for %s pid=%d\
28d20 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20  n", pFile->h,.  
28d30 20 20 20 20 20 20 20 20 20 28 6c 6f 63 6b 50 61           (lockPa
28d40 74 68 20 3f 20 6c 6f 63 6b 50 61 74 68 20 3a 20  th ? lockPath : 
28d50 22 3a 61 75 74 6f 3a 22 29 2c 20 67 65 74 70 69  ":auto:"), getpi
28d60 64 28 29 29 3b 0a 0a 20 20 70 43 74 78 20 3d 20  d());..  pCtx = 
28d70 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20  sqlite3_malloc( 
28d80 73 69 7a 65 6f 66 28 2a 70 43 74 78 29 20 29 3b  sizeof(*pCtx) );
28d90 0a 20 20 69 66 28 20 70 43 74 78 3d 3d 30 20 29  .  if( pCtx==0 )
28da0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
28db0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
28dc0 20 6d 65 6d 73 65 74 28 70 43 74 78 2c 20 30 2c   memset(pCtx, 0,
28dd0 20 73 69 7a 65 6f 66 28 2a 70 43 74 78 29 29 3b   sizeof(*pCtx));
28de0 0a 0a 20 20 72 63 20 3d 20 70 72 6f 78 79 43 72  ..  rc = proxyCr
28df0 65 61 74 65 43 6f 6e 63 68 50 61 74 68 6e 61 6d  eateConchPathnam
28e00 65 28 64 62 50 61 74 68 2c 20 26 70 43 74 78 2d  e(dbPath, &pCtx-
28e10 3e 63 6f 6e 63 68 46 69 6c 65 50 61 74 68 29 3b  >conchFilePath);
28e20 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
28e30 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
28e40 20 70 72 6f 78 79 43 72 65 61 74 65 55 6e 69 78   proxyCreateUnix
28e50 46 69 6c 65 28 70 43 74 78 2d 3e 63 6f 6e 63 68  File(pCtx->conch
28e60 46 69 6c 65 50 61 74 68 2c 20 26 70 43 74 78 2d  FilePath, &pCtx-
28e70 3e 63 6f 6e 63 68 46 69 6c 65 29 3b 0a 20 20 7d  >conchFile);.  }
28e80 20 20 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c    .  if( rc==SQL
28e90 49 54 45 5f 4f 4b 20 26 26 20 6c 6f 63 6b 50 61  ITE_OK && lockPa
28ea0 74 68 20 29 7b 0a 20 20 20 20 70 43 74 78 2d 3e  th ){.    pCtx->
28eb0 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 3d 20  lockProxyPath = 
28ec0 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
28ed0 30 2c 20 6c 6f 63 6b 50 61 74 68 29 3b 0a 20 20  0, lockPath);.  
28ee0 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  }..  if( rc==SQL
28ef0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a  ITE_OK ){.    /*
28f00 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 69 73 20 61   all memory is a
28f10 6c 6c 6f 63 61 74 65 64 2c 20 70 72 6f 78 79 73  llocated, proxys
28f20 20 61 72 65 20 63 72 65 61 74 65 64 20 61 6e 64   are created and
28f30 20 61 73 73 69 67 6e 65 64 2c 20 0a 20 20 20 20   assigned, .    
28f40 2a 2a 20 73 77 69 74 63 68 20 74 68 65 20 6c 6f  ** switch the lo
28f50 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 61 6e  cking context an
28f60 64 20 70 4d 65 74 68 6f 64 20 74 68 65 6e 20 72  d pMethod then r
28f70 65 74 75 72 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  eturn..    */.  
28f80 20 20 70 43 74 78 2d 3e 64 62 50 61 74 68 20 3d    pCtx->dbPath =
28f90 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
28fa0 28 30 2c 20 64 62 50 61 74 68 29 3b 0a 20 20 20  (0, dbPath);.   
28fb0 20 70 43 74 78 2d 3e 6f 6c 64 4c 6f 63 6b 69 6e   pCtx->oldLockin
28fc0 67 43 6f 6e 74 65 78 74 20 3d 20 70 46 69 6c 65  gContext = pFile
28fd0 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
28fe0 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63  ;.    pFile->loc
28ff0 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20 70 43  kingContext = pC
29000 74 78 3b 0a 20 20 20 20 70 43 74 78 2d 3e 70 4f  tx;.    pCtx->pO
29010 6c 64 4d 65 74 68 6f 64 20 3d 20 70 46 69 6c 65  ldMethod = pFile
29020 2d 3e 70 4d 65 74 68 6f 64 3b 0a 20 20 20 20 70  ->pMethod;.    p
29030 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 20 3d 20  File->pMethod = 
29040 26 70 72 6f 78 79 49 6f 4d 65 74 68 6f 64 73 3b  &proxyIoMethods;
29050 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66  .  }else{.    if
29060 28 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c  ( pCtx->conchFil
29070 65 20 29 7b 20 0a 20 20 20 20 20 20 72 63 20 3d  e ){ .      rc =
29080 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65   pCtx->conchFile
29090 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 43 6c 6f 73  ->pMethod->xClos
290a0 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  e((sqlite3_file 
290b0 2a 29 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c  *)pCtx->conchFil
290c0 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
290d0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
290e0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
290f0 28 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65  (pCtx->conchFile
29100 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
29110 69 74 65 33 5f 66 72 65 65 28 70 43 74 78 2d 3e  ite3_free(pCtx->
29120 63 6f 6e 63 68 46 69 6c 65 50 61 74 68 29 3b 20  conchFilePath); 
29130 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
29140 65 28 70 43 74 78 29 3b 0a 20 20 7d 0a 20 20 4f  e(pCtx);.  }.  O
29150 53 54 52 41 43 45 33 28 22 54 52 41 4e 53 50 52  STRACE3("TRANSPR
29160 4f 58 59 20 20 25 64 20 25 73 5c 6e 22 2c 20 70  OXY  %d %s\n", p
29170 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20  File->h,.       
29180 20 20 20 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f      (rc==SQLITE_
29190 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69  OK ? "ok" : "fai
291a0 6c 65 64 22 29 29 3b 0a 20 20 72 65 74 75 72 6e  led"));.  return
291b0 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54   rc;.}.../*.** T
291c0 68 69 73 20 72 6f 75 74 69 6e 65 20 68 61 6e 64  his routine hand
291d0 6c 65 73 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  les sqlite3_file
291e0 5f 63 6f 6e 74 72 6f 6c 28 29 20 63 61 6c 6c 73  _control() calls
291f0 20 74 68 61 74 20 61 72 65 20 73 70 65 63 69 66   that are specif
29200 69 63 0a 2a 2a 20 74 6f 20 70 72 6f 78 79 20 6c  ic.** to proxy l
29210 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  ocking..*/.stati
29220 63 20 69 6e 74 20 70 72 6f 78 79 46 69 6c 65 43  c int proxyFileC
29230 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66  ontrol(sqlite3_f
29240 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6f 70 2c  ile *id, int op,
29250 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20   void *pArg){.  
29260 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20  switch( op ){.  
29270 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 47 45    case SQLITE_GE
29280 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 3a  T_LOCKPROXYFILE:
29290 20 7b 0a 20 20 20 20 20 20 75 6e 69 78 46 69 6c   {.      unixFil
292a0 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
292b0 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20 20 20  File*)id;.      
292c0 69 66 28 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68  if( pFile->pMeth
292d0 6f 64 20 3d 3d 20 26 70 72 6f 78 79 49 6f 4d 65  od == &proxyIoMe
292e0 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 20 20 20  thods ){.       
292f0 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e   proxyLockingCon
29300 74 65 78 74 20 2a 70 43 74 78 20 3d 20 28 70 72  text *pCtx = (pr
29310 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  oxyLockingContex
29320 74 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e  t*)pFile->lockin
29330 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 20 20  gContext;.      
29340 20 20 70 72 6f 78 79 54 61 6b 65 43 6f 6e 63 68    proxyTakeConch
29350 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20  (pFile);.       
29360 20 69 66 28 20 70 43 74 78 2d 3e 6c 6f 63 6b 50   if( pCtx->lockP
29370 72 6f 78 79 50 61 74 68 20 29 7b 0a 20 20 20 20  roxyPath ){.    
29380 20 20 20 20 20 20 2a 28 63 6f 6e 73 74 20 63 68        *(const ch
29390 61 72 20 2a 2a 29 70 41 72 67 20 3d 20 70 43 74  ar **)pArg = pCt
293a0 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68  x->lockProxyPath
293b0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
293c0 0a 20 20 20 20 20 20 20 20 20 20 2a 28 63 6f 6e  .          *(con
293d0 73 74 20 63 68 61 72 20 2a 2a 29 70 41 72 67 20  st char **)pArg 
293e0 3d 20 22 3a 61 75 74 6f 3a 20 28 6e 6f 74 20 68  = ":auto: (not h
293f0 65 6c 64 29 22 3b 0a 20 20 20 20 20 20 20 20 7d  eld)";.        }
29400 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  .      } else {.
29410 20 20 20 20 20 20 20 20 2a 28 63 6f 6e 73 74 20          *(const 
29420 63 68 61 72 20 2a 2a 29 70 41 72 67 20 3d 20 4e  char **)pArg = N
29430 55 4c 4c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ULL;.      }.   
29440 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
29450 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  _OK;.    }.    c
29460 61 73 65 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c  ase SQLITE_SET_L
29470 4f 43 4b 50 52 4f 58 59 46 49 4c 45 3a 20 7b 0a  OCKPROXYFILE: {.
29480 20 20 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a        unixFile *
29490 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
294a0 65 2a 29 69 64 3b 0a 20 20 20 20 20 20 69 6e 74  e*)id;.      int
294b0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
294c0 0a 20 20 20 20 20 20 69 6e 74 20 69 73 50 72 6f  .      int isPro
294d0 78 79 53 74 79 6c 65 20 3d 20 28 70 46 69 6c 65  xyStyle = (pFile
294e0 2d 3e 70 4d 65 74 68 6f 64 20 3d 3d 20 26 70 72  ->pMethod == &pr
294f0 6f 78 79 49 6f 4d 65 74 68 6f 64 73 29 3b 0a 20  oxyIoMethods);. 
29500 20 20 20 20 20 69 66 28 20 70 41 72 67 3d 3d 4e       if( pArg==N
29510 55 4c 4c 20 7c 7c 20 28 63 6f 6e 73 74 20 63 68  ULL || (const ch
29520 61 72 20 2a 29 70 41 72 67 3d 3d 30 20 29 7b 0a  ar *)pArg==0 ){.
29530 20 20 20 20 20 20 20 20 69 66 28 20 69 73 50 72          if( isPr
29540 6f 78 79 53 74 79 6c 65 20 29 7b 0a 20 20 20 20  oxyStyle ){.    
29550 20 20 20 20 20 20 2f 2a 20 74 75 72 6e 20 6f 66        /* turn of
29560 66 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20  f proxy locking 
29570 2d 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 20  - not supported 
29580 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  */.          rc 
29590 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 2f  = SQLITE_ERROR /
295a0 2a 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c  *SQLITE_PROTOCOL
295b0 3f 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3f  ? SQLITE_MISUSE?
295c0 2a 2f 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  */;.        }els
295d0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e{.          /* 
295e0 74 75 72 6e 20 6f 66 66 20 70 72 6f 78 79 20 6c  turn off proxy l
295f0 6f 63 6b 69 6e 67 20 2d 20 61 6c 72 65 61 64 79  ocking - already
29600 20 6f 66 66 20 2d 20 4e 4f 4f 50 20 2a 2f 0a 20   off - NOOP */. 
29610 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
29620 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
29630 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
29640 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
29650 61 72 20 2a 70 72 6f 78 79 50 61 74 68 20 3d 20  ar *proxyPath = 
29660 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 41  (const char *)pA
29670 72 67 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  rg;.        if( 
29680 69 73 50 72 6f 78 79 53 74 79 6c 65 20 29 7b 0a  isProxyStyle ){.
29690 20 20 20 20 20 20 20 20 20 20 70 72 6f 78 79 4c            proxyL
296a0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70  ockingContext *p
296b0 43 74 78 20 3d 20 0a 20 20 20 20 20 20 20 20 20  Ctx = .         
296c0 20 20 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67     (proxyLocking
296d0 43 6f 6e 74 65 78 74 2a 29 70 46 69 6c 65 2d 3e  Context*)pFile->
296e0 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  lockingContext;.
296f0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 73            if( !s
29700 74 72 63 6d 70 28 70 41 72 67 2c 20 22 3a 61 75  trcmp(pArg, ":au
29710 74 6f 3a 22 29 20 0a 20 20 20 20 20 20 20 20 20  to:") .         
29720 20 20 7c 7c 20 28 70 43 74 78 2d 3e 6c 6f 63 6b    || (pCtx->lock
29730 50 72 6f 78 79 50 61 74 68 20 26 26 0a 20 20 20  ProxyPath &&.   
29740 20 20 20 20 20 20 20 20 20 20 20 20 21 73 74 72              !str
29750 6e 63 6d 70 28 70 43 74 78 2d 3e 6c 6f 63 6b 50  ncmp(pCtx->lockP
29760 72 6f 78 79 50 61 74 68 2c 20 70 72 6f 78 79 50  roxyPath, proxyP
29770 61 74 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29  ath, MAXPATHLEN)
29780 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20  ).          ){. 
29790 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
297a0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
297b0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
297c0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 77 69          rc = swi
297d0 74 63 68 4c 6f 63 6b 50 72 6f 78 79 50 61 74 68  tchLockProxyPath
297e0 28 70 46 69 6c 65 2c 20 70 72 6f 78 79 50 61 74  (pFile, proxyPat
297f0 68 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  h);.          }.
29800 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
29810 20 20 20 20 20 20 20 20 20 2f 2a 20 74 75 72 6e           /* turn
29820 20 6f 6e 20 70 72 6f 78 79 20 66 69 6c 65 20 6c   on proxy file l
29830 6f 63 6b 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20  ocking */.      
29840 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79 54 72      rc = proxyTr
29850 61 6e 73 66 6f 72 6d 55 6e 69 78 46 69 6c 65 28  ansformUnixFile(
29860 70 46 69 6c 65 2c 20 70 72 6f 78 79 50 61 74 68  pFile, proxyPath
29870 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
29880 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72     }.      retur
29890 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
298a0 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
298b0 20 61 73 73 65 72 74 28 20 30 20 29 3b 20 20 2f   assert( 0 );  /
298c0 2a 20 54 68 65 20 63 61 6c 6c 20 61 73 73 75 72  * The call assur
298d0 65 73 20 74 68 61 74 20 6f 6e 6c 79 20 76 61 6c  es that only val
298e0 69 64 20 6f 70 63 6f 64 65 73 20 61 72 65 20 73  id opcodes are s
298f0 65 6e 74 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d  ent */.    }.  }
29900 0a 20 20 2f 2a 4e 4f 54 52 45 41 43 48 45 44 2a  .  /*NOTREACHED*
29910 2f 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  /.  return SQLIT
29920 45 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a  E_ERROR;.}../*.*
29930 2a 20 57 69 74 68 69 6e 20 74 68 69 73 20 64 69  * Within this di
29940 76 69 73 69 6f 6e 20 28 74 68 65 20 70 72 6f 78  vision (the prox
29950 79 69 6e 67 20 6c 6f 63 6b 69 6e 67 20 69 6d 70  ying locking imp
29960 6c 65 6d 65 6e 74 61 74 69 6f 6e 29 20 74 68 65  lementation) the
29970 20 70 72 6f 63 65 64 75 72 65 73 0a 2a 2a 20 61   procedures.** a
29980 62 6f 76 65 20 74 68 69 73 20 70 6f 69 6e 74 20  bove this point 
29990 61 72 65 20 61 6c 6c 20 75 74 69 6c 69 74 69 65  are all utilitie
299a0 73 2e 20 20 54 68 65 20 6c 6f 63 6b 2d 72 65 6c  s.  The lock-rel
299b0 61 74 65 64 20 6d 65 74 68 6f 64 73 20 6f 66 20  ated methods of 
299c0 74 68 65 0a 2a 2a 20 70 72 6f 78 79 2d 6c 6f 63  the.** proxy-loc
299d0 6b 69 6e 67 20 73 71 6c 69 74 65 33 5f 69 6f 5f  king sqlite3_io_
299e0 6d 65 74 68 6f 64 20 6f 62 6a 65 63 74 20 66 6f  method object fo
299f0 6c 6c 6f 77 2e 0a 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a  llow..*/.../*.**
29a00 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68   This routine ch
29a10 65 63 6b 73 20 69 66 20 74 68 65 72 65 20 69 73  ecks if there is
29a20 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
29a30 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65   held on the spe
29a40 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62  cified.** file b
29a50 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74  y this or any ot
29a60 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20  her process. If 
29a70 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68  such a lock is h
29a80 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75  eld, set *pResOu
29a90 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65  t.** to a non-ze
29aa0 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69  ro value otherwi
29ab0 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73  se *pResOut is s
29ac0 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65  et to zero.  The
29ad0 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a   return value.**
29ae0 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54   is set to SQLIT
29af0 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49  E_OK unless an I
29b00 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  /O error occurs 
29b10 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63  during lock chec
29b20 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  king..*/.static 
29b30 69 6e 74 20 70 72 6f 78 79 43 68 65 63 6b 52 65  int proxyCheckRe
29b40 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74  servedLock(sqlit
29b50 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
29b60 20 2a 70 52 65 73 4f 75 74 29 20 7b 0a 20 20 75   *pResOut) {.  u
29b70 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
29b80 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
29b90 20 20 69 6e 74 20 72 63 20 3d 20 70 72 6f 78 79    int rc = proxy
29ba0 54 61 6b 65 43 6f 6e 63 68 28 70 46 69 6c 65 29  TakeConch(pFile)
29bb0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
29bc0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 72 6f  TE_OK ){.    pro
29bd0 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  xyLockingContext
29be0 20 2a 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c   *pCtx = (proxyL
29bf0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29  ockingContext *)
29c00 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
29c10 6e 74 65 78 74 3b 0a 20 20 20 20 75 6e 69 78 46  ntext;.    unixF
29c20 69 6c 65 20 2a 70 72 6f 78 79 20 3d 20 70 43 74  ile *proxy = pCt
29c30 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 3b 0a 20 20  x->lockProxy;.  
29c40 20 20 72 65 74 75 72 6e 20 70 72 6f 78 79 2d 3e    return proxy->
29c50 70 4d 65 74 68 6f 64 2d 3e 78 43 68 65 63 6b 52  pMethod->xCheckR
29c60 65 73 65 72 76 65 64 4c 6f 63 6b 28 28 73 71 6c  eservedLock((sql
29c70 69 74 65 33 5f 66 69 6c 65 2a 29 70 72 6f 78 79  ite3_file*)proxy
29c80 2c 20 70 52 65 73 4f 75 74 29 3b 0a 20 20 7d 0a  , pResOut);.  }.
29c90 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
29ca0 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66  /*.** Lock the f
29cb0 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63  ile with the loc
29cc0 6b 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70  k specified by p
29cd0 61 72 61 6d 65 74 65 72 20 6c 6f 63 6b 74 79 70  arameter locktyp
29ce0 65 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68  e - one.** of th
29cf0 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
29d00 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45  **     (1) SHARE
29d10 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32  D_LOCK.**     (2
29d20 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a  ) RESERVED_LOCK.
29d30 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49  **     (3) PENDI
29d40 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  NG_LOCK.**     (
29d50 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  4) EXCLUSIVE_LOC
29d60 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65  K.**.** Sometime
29d70 73 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e  s when requestin
29d80 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65  g one lock state
29d90 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63  , additional loc
29da0 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20  k states.** are 
29db0 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77  inserted in betw
29dc0 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e  een.  The lockin
29dd0 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20  g might fail on 
29de0 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72  one of the later
29df0 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  .** transitions 
29e00 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b  leaving the lock
29e10 20 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74   state different
29e20 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74   from what it st
29e30 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69  arted but.** sti
29e40 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20  ll short of its 
29e50 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  goal.  The follo
29e60 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73  wing chart shows
29e70 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20   the allowed.** 
29e80 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20  transitions and 
29e90 74 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74  the inserted int
29ea0 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73  ermediate states
29eb0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43  :.**.**    UNLOC
29ec0 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a  KED -> SHARED.**
29ed0 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45      SHARED -> RE
29ee0 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41  SERVED.**    SHA
29ef0 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  RED -> (PENDING)
29f00 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
29f10 20 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20      RESERVED -> 
29f20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43  (PENDING) -> EXC
29f30 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e  LUSIVE.**    PEN
29f40 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56  DING -> EXCLUSIV
29f50 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  E.**.** This rou
29f60 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69  tine will only i
29f70 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20  ncrease a lock. 
29f80 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33   Use the sqlite3
29f90 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f  OsUnlock().** ro
29fa0 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61  utine to lower a
29fb0 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a   locking level..
29fc0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  */.static int pr
29fd0 6f 78 79 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  oxyLock(sqlite3_
29fe0 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f  file *id, int lo
29ff0 63 6b 74 79 70 65 29 20 7b 0a 20 20 75 6e 69 78  cktype) {.  unix
2a000 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
2a010 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69  nixFile*)id;.  i
2a020 6e 74 20 72 63 20 3d 20 70 72 6f 78 79 54 61 6b  nt rc = proxyTak
2a030 65 43 6f 6e 63 68 28 70 46 69 6c 65 29 3b 0a 20  eConch(pFile);. 
2a040 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2a050 4f 4b 20 29 7b 0a 20 20 20 20 70 72 6f 78 79 4c  OK ){.    proxyL
2a060 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70  ockingContext *p
2a070 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b  Ctx = (proxyLock
2a080 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 46 69  ingContext *)pFi
2a090 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
2a0a0 78 74 3b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65  xt;.    unixFile
2a0b0 20 2a 70 72 6f 78 79 20 3d 20 70 43 74 78 2d 3e   *proxy = pCtx->
2a0c0 6c 6f 63 6b 50 72 6f 78 79 3b 0a 20 20 20 20 72  lockProxy;.    r
2a0d0 63 20 3d 20 70 72 6f 78 79 2d 3e 70 4d 65 74 68  c = proxy->pMeth
2a0e0 6f 64 2d 3e 78 4c 6f 63 6b 28 28 73 71 6c 69 74  od->xLock((sqlit
2a0f0 65 33 5f 66 69 6c 65 2a 29 70 72 6f 78 79 2c 20  e3_file*)proxy, 
2a100 6c 6f 63 6b 74 79 70 65 29 3b 0a 20 20 20 20 70  locktype);.    p
2a110 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d  File->locktype =
2a120 20 70 72 6f 78 79 2d 3e 6c 6f 63 6b 74 79 70 65   proxy->locktype
2a130 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
2a140 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77  c;.}.../*.** Low
2a150 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  er the locking l
2a160 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73  evel on file des
2a170 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f  criptor pFile to
2a180 20 6c 6f 63 6b 74 79 70 65 2e 20 20 6c 6f 63 6b   locktype.  lock
2a190 74 79 70 65 0a 2a 2a 20 6d 75 73 74 20 62 65 20  type.** must be 
2a1a0 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f  either NO_LOCK o
2a1b0 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a  r SHARED_LOCK..*
2a1c0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b  *.** If the lock
2a1d0 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65  ing level of the
2a1e0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
2a1f0 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f   is already at o
2a200 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72  r below.** the r
2a210 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67  equested locking
2a220 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75   level, this rou
2a230 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
2a240 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
2a250 72 6f 78 79 55 6e 6c 6f 63 6b 28 73 71 6c 69 74  roxyUnlock(sqlit
2a260 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
2a270 20 6c 6f 63 6b 74 79 70 65 29 20 7b 0a 20 20 75   locktype) {.  u
2a280 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
2a290 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
2a2a0 20 20 69 6e 74 20 72 63 20 3d 20 70 72 6f 78 79    int rc = proxy
2a2b0 54 61 6b 65 43 6f 6e 63 68 28 70 46 69 6c 65 29  TakeConch(pFile)
2a2c0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
2a2d0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 72 6f  TE_OK ){.    pro
2a2e0 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  xyLockingContext
2a2f0 20 2a 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c   *pCtx = (proxyL
2a300 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29  ockingContext *)
2a310 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
2a320 6e 74 65 78 74 3b 0a 20 20 20 20 75 6e 69 78 46  ntext;.    unixF
2a330 69 6c 65 20 2a 70 72 6f 78 79 20 3d 20 70 43 74  ile *proxy = pCt
2a340 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 3b 0a 20 20  x->lockProxy;.  
2a350 20 20 72 63 20 3d 20 70 72 6f 78 79 2d 3e 70 4d    rc = proxy->pM
2a360 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28 28  ethod->xUnlock((
2a370 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 70 72  sqlite3_file*)pr
2a380 6f 78 79 2c 20 6c 6f 63 6b 74 79 70 65 29 3b 0a  oxy, locktype);.
2a390 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74      pFile->lockt
2a3a0 79 70 65 20 3d 20 70 72 6f 78 79 2d 3e 6c 6f 63  ype = proxy->loc
2a3b0 6b 74 79 70 65 3b 0a 20 20 7d 0a 20 20 72 65 74  ktype;.  }.  ret
2a3c0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2a3d0 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 20 74 68   Close a file th
2a3e0 61 74 20 75 73 65 73 20 70 72 6f 78 79 20 6c 6f  at uses proxy lo
2a3f0 63 6b 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  cks..*/.static i
2a400 6e 74 20 70 72 6f 78 79 43 6c 6f 73 65 28 73 71  nt proxyClose(sq
2a410 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20  lite3_file *id) 
2a420 7b 0a 20 20 69 66 28 20 69 64 20 29 7b 0a 20 20  {.  if( id ){.  
2a430 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
2a440 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
2a450 64 3b 0a 20 20 20 20 70 72 6f 78 79 4c 6f 63 6b  d;.    proxyLock
2a460 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78  ingContext *pCtx
2a470 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67   = (proxyLocking
2a480 43 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d  Context *)pFile-
2a490 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  >lockingContext;
2a4a0 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 6c  .    unixFile *l
2a4b0 6f 63 6b 50 72 6f 78 79 20 3d 20 70 43 74 78 2d  ockProxy = pCtx-
2a4c0 3e 6c 6f 63 6b 50 72 6f 78 79 3b 0a 20 20 20 20  >lockProxy;.    
2a4d0 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46  unixFile *conchF
2a4e0 69 6c 65 20 3d 20 70 43 74 78 2d 3e 63 6f 6e 63  ile = pCtx->conc
2a4f0 68 46 69 6c 65 3b 0a 20 20 20 20 69 6e 74 20 72  hFile;.    int r
2a500 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
2a510 20 20 20 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b     .    if( lock
2a520 50 72 6f 78 79 20 29 7b 0a 20 20 20 20 20 20 72  Proxy ){.      r
2a530 63 20 3d 20 6c 6f 63 6b 50 72 6f 78 79 2d 3e 70  c = lockProxy->p
2a540 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28  Method->xUnlock(
2a550 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 6c  (sqlite3_file*)l
2a560 6f 63 6b 50 72 6f 78 79 2c 20 4e 4f 5f 4c 4f 43  ockProxy, NO_LOC
2a570 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  K);.      if( rc
2a580 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
2a590 20 20 20 20 72 63 20 3d 20 6c 6f 63 6b 50 72 6f      rc = lockPro
2a5a0 78 79 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 43 6c  xy->pMethod->xCl
2a5b0 6f 73 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c  ose((sqlite3_fil
2a5c0 65 2a 29 6c 6f 63 6b 50 72 6f 78 79 29 3b 0a 20  e*)lockProxy);. 
2a5d0 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
2a5e0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 73  turn rc;.      s
2a5f0 71 6c 69 74 65 33 5f 66 72 65 65 28 6c 6f 63 6b  qlite3_free(lock
2a600 50 72 6f 78 79 29 3b 0a 20 20 20 20 20 20 70 43  Proxy);.      pC
2a610 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 20 3d 20  tx->lockProxy = 
2a620 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  0;.    }.    if(
2a630 20 63 6f 6e 63 68 46 69 6c 65 20 29 7b 0a 20 20   conchFile ){.  
2a640 20 20 20 20 69 66 28 20 70 43 74 78 2d 3e 63 6f      if( pCtx->co
2a650 6e 63 68 48 65 6c 64 20 29 7b 0a 20 20 20 20 20  nchHeld ){.     
2a660 20 20 20 72 63 20 3d 20 70 72 6f 78 79 52 65 6c     rc = proxyRel
2a670 65 61 73 65 43 6f 6e 63 68 28 70 46 69 6c 65 29  easeConch(pFile)
2a680 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
2a690 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
2a6a0 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d      }.      rc =
2a6b0 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74   conchFile->pMet
2a6c0 68 6f 64 2d 3e 78 43 6c 6f 73 65 28 28 73 71 6c  hod->xClose((sql
2a6d0 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68  ite3_file*)conch
2a6e0 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 69 66 28  File);.      if(
2a6f0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
2a700 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
2a710 72 65 65 28 63 6f 6e 63 68 46 69 6c 65 29 3b 0a  ree(conchFile);.
2a720 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
2a730 33 5f 66 72 65 65 28 70 43 74 78 2d 3e 6c 6f 63  3_free(pCtx->loc
2a740 6b 50 72 6f 78 79 50 61 74 68 29 3b 0a 20 20 20  kProxyPath);.   
2a750 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
2a760 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 50 61 74  tx->conchFilePat
2a770 68 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  h);.    sqlite3_
2a780 66 72 65 65 28 70 43 74 78 2d 3e 64 62 50 61 74  free(pCtx->dbPat
2a790 68 29 3b 0a 20 20 20 20 2f 2a 20 72 65 73 74 6f  h);.    /* resto
2a7a0 72 65 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  re the original 
2a7b0 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20  locking context 
2a7c0 61 6e 64 20 70 4d 65 74 68 6f 64 20 74 68 65 6e  and pMethod then
2a7d0 20 63 6c 6f 73 65 20 69 74 20 2a 2f 0a 20 20 20   close it */.   
2a7e0 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43   pFile->lockingC
2a7f0 6f 6e 74 65 78 74 20 3d 20 70 43 74 78 2d 3e 6f  ontext = pCtx->o
2a800 6c 64 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ldLockingContext
2a810 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 70 4d 65  ;.    pFile->pMe
2a820 74 68 6f 64 20 3d 20 70 43 74 78 2d 3e 70 4f 6c  thod = pCtx->pOl
2a830 64 4d 65 74 68 6f 64 3b 0a 20 20 20 20 73 71 6c  dMethod;.    sql
2a840 69 74 65 33 5f 66 72 65 65 28 70 43 74 78 29 3b  ite3_free(pCtx);
2a850 0a 20 20 20 20 72 65 74 75 72 6e 20 70 46 69 6c  .    return pFil
2a860 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 43 6c 6f  e->pMethod->xClo
2a870 73 65 28 69 64 29 3b 0a 20 20 7d 0a 20 20 72 65  se(id);.  }.  re
2a880 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2a890 7d 0a 0a 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 64  }....#endif /* d
2a8a0 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
2a8b0 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42  ) && SQLITE_ENAB
2a8c0 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
2a8d0 20 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 72   */./*.** The pr
2a8e0 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 73 74 79 6c  oxy locking styl
2a8f0 65 20 69 73 20 69 6e 74 65 6e 64 65 64 20 66 6f  e is intended fo
2a900 72 20 75 73 65 20 77 69 74 68 20 41 46 50 20 66  r use with AFP f
2a910 69 6c 65 73 79 73 74 65 6d 73 2e 0a 2a 2a 20 41  ilesystems..** A
2a920 6e 64 20 73 69 6e 63 65 20 41 46 50 20 69 73 20  nd since AFP is 
2a930 6f 6e 6c 79 20 73 75 70 70 6f 72 74 65 64 20 6f  only supported o
2a940 6e 20 4d 61 63 4f 53 58 2c 20 74 68 65 20 70 72  n MacOSX, the pr
2a950 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20 61  oxy locking is a
2a960 6c 73 6f 0a 2a 2a 20 72 65 73 74 72 69 63 74 65  lso.** restricte
2a970 64 20 74 6f 20 4d 61 63 4f 53 58 2e 0a 2a 2a 20  d to MacOSX..** 
2a980 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .**.************
2a990 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74  ******* End of t
2a9a0 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b 20 69 6d  he proxy lock im
2a9b0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a  plementation ***
2a9c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a9d0 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
2a9e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a9f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2aa00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2aa10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2aa20 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69  **/../*.** Initi
2aa30 61 6c 69 7a 65 20 74 68 65 20 6f 70 65 72 61 74  alize the operat
2aa40 69 6e 67 20 73 79 73 74 65 6d 20 69 6e 74 65 72  ing system inter
2aa50 66 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  face..**.** This
2aa60 20 72 6f 75 74 69 6e 65 20 72 65 67 69 73 74 65   routine registe
2aa70 72 73 20 61 6c 6c 20 56 46 53 20 69 6d 70 6c 65  rs all VFS imple
2aa80 6d 65 6e 74 61 74 69 6f 6e 73 20 66 6f 72 20 75  mentations for u
2aa90 6e 69 78 2d 6c 69 6b 65 20 6f 70 65 72 61 74 69  nix-like operati
2aaa0 6e 67 0a 2a 2a 20 73 79 73 74 65 6d 73 2e 20 20  ng.** systems.  
2aab0 54 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 61 6e  This routine, an
2aac0 64 20 74 68 65 20 73 71 6c 69 74 65 33 5f 6f 73  d the sqlite3_os
2aad0 5f 65 6e 64 28 29 20 72 6f 75 74 69 6e 65 20 74  _end() routine t
2aae0 68 61 74 20 66 6f 6c 6c 6f 77 73 2c 0a 2a 2a 20  hat follows,.** 
2aaf0 73 68 6f 75 6c 64 20 62 65 20 74 68 65 20 6f 6e  should be the on
2ab00 6c 79 20 72 6f 75 74 69 6e 65 73 20 69 6e 20 74  ly routines in t
2ab10 68 69 73 20 66 69 6c 65 20 74 68 61 74 20 61 72  his file that ar
2ab20 65 20 76 69 73 69 62 6c 65 20 66 72 6f 6d 20 6f  e visible from o
2ab30 74 68 65 72 0a 2a 2a 20 66 69 6c 65 73 2e 0a 2a  ther.** files..*
2ab40 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
2ab50 65 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 63 65  e is called once
2ab60 20 64 75 72 69 6e 67 20 53 51 4c 69 74 65 20 69   during SQLite i
2ab70 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 61 6e  nitialization an
2ab80 64 20 62 79 20 61 0a 2a 2a 20 73 69 6e 67 6c 65  d by a.** single
2ab90 20 74 68 72 65 61 64 2e 20 20 54 68 65 20 6d 65   thread.  The me
2aba0 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
2abb0 61 6e 64 20 6d 75 74 65 78 20 73 75 62 73 79 73  and mutex subsys
2abc0 74 65 6d 73 20 68 61 76 65 20 6e 6f 74 0a 2a 2a  tems have not.**
2abd0 20 6e 65 63 65 73 73 61 72 69 6c 79 20 62 65 65   necessarily bee
2abe0 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 77 68  n initialized wh
2abf0 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
2ac00 69 73 20 63 61 6c 6c 65 64 2c 20 61 6e 64 20 73  is called, and s
2ac10 6f 20 74 68 65 79 0a 2a 2a 20 73 68 6f 75 6c 64  o they.** should
2ac20 20 6e 6f 74 20 62 65 20 75 73 65 64 2e 0a 2a 2f   not be used..*/
2ac30 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 73 5f  .int sqlite3_os_
2ac40 69 6e 69 74 28 76 6f 69 64 29 7b 20 0a 20 20 2f  init(void){ .  /
2ac50 2a 20 0a 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c  * .  ** The foll
2ac60 6f 77 69 6e 67 20 6d 61 63 72 6f 20 64 65 66 69  owing macro defi
2ac70 6e 65 73 20 61 6e 20 69 6e 69 74 69 61 6c 69 7a  nes an initializ
2ac80 65 72 20 66 6f 72 20 61 6e 20 73 71 6c 69 74 65  er for an sqlite
2ac90 33 5f 76 66 73 20 6f 62 6a 65 63 74 2e 0a 20 20  3_vfs object..  
2aca0 2a 2a 20 54 68 65 20 6e 61 6d 65 20 6f 66 20 74  ** The name of t
2acb0 68 65 20 56 46 53 20 69 73 20 4e 41 4d 45 2e 20  he VFS is NAME. 
2acc0 20 54 68 65 20 70 41 70 70 44 61 74 61 20 69 73   The pAppData is
2acd0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
2ace0 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 74 6f 20  pointer.  ** to 
2acf0 74 68 65 20 22 66 69 6e 64 65 72 22 20 66 75 6e  the "finder" fun
2ad00 63 74 69 6f 6e 2e 20 20 28 70 41 70 70 44 61 74  ction.  (pAppDat
2ad10 61 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  a is a pointer t
2ad20 6f 20 61 20 70 6f 69 6e 74 65 72 20 62 65 63 61  o a pointer beca
2ad30 75 73 65 0a 20 20 2a 2a 20 73 69 6c 6c 79 20 43  use.  ** silly C
2ad40 39 30 20 72 75 6c 65 73 20 70 72 6f 68 69 62 69  90 rules prohibi
2ad50 74 20 61 20 76 6f 69 64 2a 20 66 72 6f 6d 20 62  t a void* from b
2ad60 65 69 6e 67 20 63 61 73 74 20 74 6f 20 61 20 66  eing cast to a f
2ad70 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 0a  unction pointer.
2ad80 20 20 2a 2a 20 61 6e 64 20 73 6f 20 77 65 20 68    ** and so we h
2ad90 61 76 65 20 74 6f 20 67 6f 20 74 68 72 6f 75 67  ave to go throug
2ada0 68 20 74 68 65 20 69 6e 74 65 72 6d 65 64 69 61  h the intermedia
2adb0 74 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 76  te pointer to av
2adc0 6f 69 64 20 70 72 6f 62 6c 65 6d 73 0a 20 20 2a  oid problems.  *
2add0 2a 20 77 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67  * when compiling
2ade0 20 77 69 74 68 20 2d 70 65 64 61 6e 74 69 63 2d   with -pedantic-
2adf0 65 72 72 6f 72 73 20 6f 6e 20 47 43 43 2e 29 0a  errors on GCC.).
2ae00 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 46 49    **.  ** The FI
2ae10 4e 44 45 52 20 70 61 72 61 6d 65 74 65 72 20 74  NDER parameter t
2ae20 6f 20 74 68 69 73 20 6d 61 63 72 6f 20 69 73 20  o this macro is 
2ae30 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
2ae40 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 0a 20  pointer to the. 
2ae50 20 2a 2a 20 66 69 6e 64 65 72 2d 66 75 6e 63 74   ** finder-funct
2ae60 69 6f 6e 2e 20 20 54 68 65 20 66 69 6e 64 65 72  ion.  The finder
2ae70 2d 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e  -function return
2ae80 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  s a pointer to t
2ae90 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 5f 69  he.  ** sqlite_i
2aea0 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74  o_methods object
2aeb0 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73   that implements
2aec0 20 74 68 65 20 64 65 73 69 72 65 64 20 6c 6f 63   the desired loc
2aed0 6b 69 6e 67 0a 20 20 2a 2a 20 62 65 68 61 76 69  king.  ** behavi
2aee0 6f 72 73 2e 20 20 53 65 65 20 74 68 65 20 64 69  ors.  See the di
2aef0 76 69 73 69 6f 6e 20 61 62 6f 76 65 20 74 68 61  vision above tha
2af00 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 49  t contains the I
2af10 4f 4d 45 54 48 4f 44 53 0a 20 20 2a 2a 20 6d 61  OMETHODS.  ** ma
2af20 63 72 6f 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  cro for addition
2af30 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20   information on 
2af40 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 73  finder-functions
2af50 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 6f 73 74  ..  **.  ** Most
2af60 20 66 69 6e 64 65 72 73 20 73 69 6d 70 6c 79 20   finders simply 
2af70 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
2af80 20 74 6f 20 61 20 66 69 78 65 64 20 73 71 6c 69   to a fixed sqli
2af90 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 0a 20  te3_io_methods. 
2afa0 20 2a 2a 20 6f 62 6a 65 63 74 2e 20 20 42 75 74   ** object.  But
2afb0 20 74 68 65 20 22 61 75 74 6f 6c 6f 63 6b 49 6f   the "autolockIo
2afc0 46 69 6e 64 65 72 22 20 61 76 61 69 6c 61 62 6c  Finder" availabl
2afd0 65 20 6f 6e 20 4d 61 63 4f 53 58 20 64 6f 65 73  e on MacOSX does
2afe0 20 61 20 6c 69 74 74 6c 65 0a 20 20 2a 2a 20 6d   a little.  ** m
2aff0 6f 72 65 20 74 68 61 6e 20 74 68 61 74 3b 20 69  ore than that; i
2b000 74 20 6c 6f 6f 6b 73 20 61 74 20 74 68 65 20 66  t looks at the f
2b010 69 6c 65 73 79 73 74 65 6d 20 74 79 70 65 20 74  ilesystem type t
2b020 68 61 74 20 68 6f 73 74 73 20 74 68 65 20 0a 20  hat hosts the . 
2b030 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
2b040 65 20 61 6e 64 20 74 72 69 65 73 20 74 6f 20 63  e and tries to c
2b050 68 6f 6f 73 65 20 61 6e 20 6c 6f 63 6b 69 6e 67  hoose an locking
2b060 20 6d 65 74 68 6f 64 20 61 70 70 72 6f 70 72 69   method appropri
2b070 61 74 65 20 66 6f 72 0a 20 20 2a 2a 20 74 68 61  ate for.  ** tha
2b080 74 20 66 69 6c 65 73 79 73 74 65 6d 20 74 69 6d  t filesystem tim
2b090 65 2e 0a 20 20 2a 2f 0a 20 20 23 64 65 66 69 6e  e..  */.  #defin
2b0a0 65 20 55 4e 49 58 56 46 53 28 56 46 53 4e 41 4d  e UNIXVFS(VFSNAM
2b0b0 45 2c 20 46 49 4e 44 45 52 29 20 7b 20 20 20 20  E, FINDER) {    
2b0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b0d0 20 20 20 20 5c 0a 20 20 20 20 31 2c 20 20 20 20      \.    1,    
2b0e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b0f0 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 20 20  /* iVersion */  
2b100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b110 20 20 5c 0a 20 20 20 20 73 69 7a 65 6f 66 28 75    \.    sizeof(u
2b120 6e 69 78 46 69 6c 65 29 2c 20 20 20 20 20 2f 2a  nixFile),     /*
2b130 20 73 7a 4f 73 46 69 6c 65 20 2a 2f 20 20 20 20   szOsFile */    
2b140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b150 5c 0a 20 20 20 20 4d 41 58 5f 50 41 54 48 4e 41  \.    MAX_PATHNA
2b160 4d 45 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 6d  ME,         /* m
2b170 78 50 61 74 68 6e 61 6d 65 20 2a 2f 20 20 20 20  xPathname */    
2b180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
2b190 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20      0,          
2b1a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 4e 65            /* pNe
2b1b0 78 74 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  xt */           
2b1c0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
2b1d0 20 20 56 46 53 4e 41 4d 45 2c 20 20 20 20 20 20    VFSNAME,      
2b1e0 20 20 20 20 20 20 20 20 2f 2a 20 7a 4e 61 6d 65          /* zName
2b1f0 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
2b200 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
2b210 28 76 6f 69 64 2a 29 26 46 49 4e 44 45 52 2c 20  (void*)&FINDER, 
2b220 20 20 20 20 20 20 2f 2a 20 70 41 70 70 44 61 74        /* pAppDat
2b230 61 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  a */            
2b240 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e          \.    un
2b250 69 78 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20  ixOpen,         
2b260 20 20 20 20 2f 2a 20 78 4f 70 65 6e 20 2a 2f 20      /* xOpen */ 
2b270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b280 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78        \.    unix
2b290 44 65 6c 65 74 65 2c 20 20 20 20 20 20 20 20 20  Delete,         
2b2a0 20 20 2f 2a 20 78 44 65 6c 65 74 65 20 2a 2f 20    /* xDelete */ 
2b2b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b2c0 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 41 63      \.    unixAc
2b2d0 63 65 73 73 2c 20 20 20 20 20 20 20 20 20 20 20  cess,           
2b2e0 2f 2a 20 78 41 63 63 65 73 73 20 2a 2f 20 20 20  /* xAccess */   
2b2f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b300 20 20 5c 0a 20 20 20 20 75 6e 69 78 46 75 6c 6c    \.    unixFull
2b310 50 61 74 68 6e 61 6d 65 2c 20 20 20 20 20 2f 2a  Pathname,     /*
2b320 20 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 2a   xFullPathname *
2b330 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
2b340 5c 0a 20 20 20 20 75 6e 69 78 44 6c 4f 70 65 6e  \.    unixDlOpen
2b350 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78  ,           /* x
2b360 44 6c 4f 70 65 6e 20 2a 2f 20 20 20 20 20 20 20  DlOpen */       
2b370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
2b380 20 20 20 20 75 6e 69 78 44 6c 45 72 72 6f 72 2c      unixDlError,
2b390 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c            /* xDl
2b3a0 45 72 72 6f 72 20 2a 2f 20 20 20 20 20 20 20 20  Error */        
2b3b0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
2b3c0 20 20 75 6e 69 78 44 6c 53 79 6d 2c 20 20 20 20    unixDlSym,    
2b3d0 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 53 79          /* xDlSy
2b3e0 6d 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  m */            
2b3f0 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
2b400 75 6e 69 78 44 6c 43 6c 6f 73 65 2c 20 20 20 20  unixDlClose,    
2b410 20 20 20 20 20 20 2f 2a 20 78 44 6c 43 6c 6f 73        /* xDlClos
2b420 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  e */            
2b430 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e          \.    un
2b440 69 78 52 61 6e 64 6f 6d 6e 65 73 73 2c 20 20 20  ixRandomness,   
2b450 20 20 20 20 2f 2a 20 78 52 61 6e 64 6f 6d 6e 65      /* xRandomne
2b460 73 73 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  ss */           
2b470 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78        \.    unix
2b480 53 6c 65 65 70 2c 20 20 20 20 20 20 20 20 20 20  Sleep,          
2b490 20 20 2f 2a 20 78 53 6c 65 65 70 20 2a 2f 20 20    /* xSleep */  
2b4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b4b0 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 43 75      \.    unixCu
2b4c0 72 72 65 6e 74 54 69 6d 65 2c 20 20 20 20 20 20  rrentTime,      
2b4d0 2f 2a 20 78 43 75 72 72 65 6e 74 54 69 6d 65 20  /* xCurrentTime 
2b4e0 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
2b4f0 20 20 5c 0a 20 20 20 20 75 6e 69 78 47 65 74 4c    \.    unixGetL
2b500 61 73 74 45 72 72 6f 72 20 20 20 20 20 20 2f 2a  astError      /*
2b510 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72 20 2a   xGetLastError *
2b520 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
2b530 5c 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  \.  }..  /*.  **
2b540 20 41 6c 6c 20 64 65 66 61 75 6c 74 20 56 46 53   All default VFS
2b550 65 73 20 66 6f 72 20 75 6e 69 78 20 61 72 65 20  es for unix are 
2b560 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65  contained in the
2b570 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 72 61 79   following array
2b580 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65  ..  **.  ** Note
2b590 20 74 68 61 74 20 74 68 65 20 73 71 6c 69 74 65   that the sqlite
2b5a0 33 5f 76 66 73 2e 70 4e 65 78 74 20 66 69 65 6c  3_vfs.pNext fiel
2b5b0 64 20 6f 66 20 74 68 65 20 56 46 53 20 6f 62 6a  d of the VFS obj
2b5c0 65 63 74 20 69 73 20 6d 6f 64 69 66 69 65 64 0a  ect is modified.
2b5d0 20 20 2a 2a 20 62 79 20 74 68 65 20 53 51 4c 69    ** by the SQLi
2b5e0 74 65 20 63 6f 72 65 20 77 68 65 6e 20 74 68 65  te core when the
2b5f0 20 56 46 53 20 69 73 20 72 65 67 69 73 74 65 72   VFS is register
2b600 65 64 2e 20 20 53 6f 20 74 68 65 20 66 6f 6c 6c  ed.  So the foll
2b610 6f 77 69 6e 67 0a 20 20 2a 2a 20 61 72 72 61 79  owing.  ** array
2b620 20 63 61 6e 6e 6f 74 20 62 65 20 63 6f 6e 73 74   cannot be const
2b630 2e 0a 20 20 2a 2f 0a 20 20 73 74 61 74 69 63 20  ..  */.  static 
2b640 73 71 6c 69 74 65 33 5f 76 66 73 20 61 56 66 73  sqlite3_vfs aVfs
2b650 5b 5d 20 3d 20 7b 0a 23 69 66 20 53 51 4c 49 54  [] = {.#if SQLIT
2b660 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
2b670 5f 53 54 59 4c 45 20 26 26 20 28 4f 53 5f 56 58  _STYLE && (OS_VX
2b680 57 4f 52 4b 53 20 7c 7c 20 64 65 66 69 6e 65 64  WORKS || defined
2b690 28 5f 5f 41 50 50 4c 45 5f 5f 29 29 0a 20 20 20  (__APPLE__)).   
2b6a0 20 55 4e 49 58 56 46 53 28 22 75 6e 69 78 22 2c   UNIXVFS("unix",
2b6b0 20 20 20 20 20 20 20 20 20 20 61 75 74 6f 6c 6f            autolo
2b6c0 63 6b 49 6f 46 69 6e 64 65 72 20 29 2c 0a 23 65  ckIoFinder ),.#e
2b6d0 6c 73 65 0a 20 20 20 20 55 4e 49 58 56 46 53 28  lse.    UNIXVFS(
2b6e0 22 75 6e 69 78 22 2c 20 20 20 20 20 20 20 20 20  "unix",         
2b6f0 20 70 6f 73 69 78 49 6f 46 69 6e 64 65 72 20 29   posixIoFinder )
2b700 2c 0a 23 65 6e 64 69 66 0a 20 20 20 20 55 4e 49  ,.#endif.    UNI
2b710 58 56 46 53 28 22 75 6e 69 78 2d 6e 6f 6e 65 22  XVFS("unix-none"
2b720 2c 20 20 20 20 20 6e 6f 6c 6f 63 6b 49 6f 46 69  ,     nolockIoFi
2b730 6e 64 65 72 20 29 2c 0a 20 20 20 20 55 4e 49 58  nder ),.    UNIX
2b740 56 46 53 28 22 75 6e 69 78 2d 64 6f 74 66 69 6c  VFS("unix-dotfil
2b750 65 22 2c 20 20 64 6f 74 6c 6f 63 6b 49 6f 46 69  e",  dotlockIoFi
2b760 6e 64 65 72 20 29 2c 0a 20 20 20 20 55 4e 49 58  nder ),.    UNIX
2b770 56 46 53 28 22 75 6e 69 78 2d 77 66 6c 22 2c 20  VFS("unix-wfl", 
2b780 20 20 20 20 20 70 6f 73 69 78 57 66 6c 49 6f 46       posixWflIoF
2b790 69 6e 64 65 72 20 29 2c 0a 23 69 66 20 4f 53 5f  inder ),.#if OS_
2b7a0 56 58 57 4f 52 4b 53 0a 20 20 20 20 55 4e 49 58  VXWORKS.    UNIX
2b7b0 56 46 53 28 22 75 6e 69 78 2d 6e 61 6d 65 64 73  VFS("unix-nameds
2b7c0 65 6d 22 2c 20 73 65 6d 49 6f 46 69 6e 64 65 72  em", semIoFinder
2b7d0 20 29 2c 0a 23 65 6e 64 69 66 0a 23 69 66 20 53   ),.#endif.#if S
2b7e0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
2b7f0 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20 55  KING_STYLE.    U
2b800 4e 49 58 56 46 53 28 22 75 6e 69 78 2d 70 6f 73  NIXVFS("unix-pos
2b810 69 78 22 2c 20 20 20 20 70 6f 73 69 78 49 6f 46  ix",    posixIoF
2b820 69 6e 64 65 72 20 29 2c 0a 23 69 66 20 21 4f 53  inder ),.#if !OS
2b830 5f 56 58 57 4f 52 4b 53 0a 20 20 20 20 55 4e 49  _VXWORKS.    UNI
2b840 58 56 46 53 28 22 75 6e 69 78 2d 66 6c 6f 63 6b  XVFS("unix-flock
2b850 22 2c 20 20 20 20 66 6c 6f 63 6b 49 6f 46 69 6e  ",    flockIoFin
2b860 64 65 72 20 29 2c 0a 23 65 6e 64 69 66 0a 23 65  der ),.#endif.#e
2b870 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
2b880 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
2b890 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28  TYLE && defined(
2b8a0 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 20 20 55  __APPLE__).    U
2b8b0 4e 49 58 56 46 53 28 22 75 6e 69 78 2d 61 66 70  NIXVFS("unix-afp
2b8c0 22 2c 20 20 20 20 20 20 61 66 70 49 6f 46 69 6e  ",      afpIoFin
2b8d0 64 65 72 20 29 2c 0a 20 20 20 20 55 4e 49 58 56  der ),.    UNIXV
2b8e0 46 53 28 22 75 6e 69 78 2d 70 72 6f 78 79 22 2c  FS("unix-proxy",
2b8f0 20 20 20 20 70 72 6f 78 79 49 6f 46 69 6e 64 65      proxyIoFinde
2b900 72 20 29 2c 0a 23 65 6e 64 69 66 0a 20 20 7d 3b  r ),.#endif.  };
2b910 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  .  unsigned int 
2b920 69 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  i;          /* L
2b930 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a  oop counter */..
2b940 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 61 6c    /* Register al
2b950 6c 20 56 46 53 65 73 20 64 65 66 69 6e 65 64 20  l VFSes defined 
2b960 69 6e 20 74 68 65 20 61 56 66 73 5b 5d 20 61 72  in the aVfs[] ar
2b970 72 61 79 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ray */.  for(i=0
2b980 3b 20 69 3c 28 73 69 7a 65 6f 66 28 61 56 66 73  ; i<(sizeof(aVfs
2b990 29 2f 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33  )/sizeof(sqlite3
2b9a0 5f 76 66 73 29 29 3b 20 69 2b 2b 29 7b 0a 20 20  _vfs)); i++){.  
2b9b0 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65    sqlite3_vfs_re
2b9c0 67 69 73 74 65 72 28 26 61 56 66 73 5b 69 5d 2c  gister(&aVfs[i],
2b9d0 20 69 3d 3d 30 29 3b 0a 20 20 7d 0a 20 20 72 65   i==0);.  }.  re
2b9e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  turn SQLITE_OK; 
2b9f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68 75 74 64 6f  .}../*.** Shutdo
2ba00 77 6e 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67  wn the operating
2ba10 20 73 79 73 74 65 6d 20 69 6e 74 65 72 66 61 63   system interfac
2ba20 65 2e 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 20 6f 70  e..**.** Some op
2ba30 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 73 20  erating systems 
2ba40 6d 69 67 68 74 20 6e 65 65 64 20 74 6f 20 64 6f  might need to do
2ba50 20 73 6f 6d 65 20 63 6c 65 61 6e 75 70 20 69 6e   some cleanup in
2ba60 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 0a 2a   this routine,.*
2ba70 2a 20 74 6f 20 72 65 6c 65 61 73 65 20 64 79 6e  * to release dyn
2ba80 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74  amically allocat
2ba90 65 64 20 6f 62 6a 65 63 74 73 2e 20 20 42 75 74  ed objects.  But
2baa0 20 6e 6f 74 20 6f 6e 20 75 6e 69 78 2e 0a 2a 2a   not on unix..**
2bab0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
2bac0 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 75 6e 69   a no-op for uni
2bad0 78 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  x..*/.int sqlite
2bae0 33 5f 6f 73 5f 65 6e 64 28 76 6f 69 64 29 7b 20  3_os_end(void){ 
2baf0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
2bb00 5f 4f 4b 3b 20 0a 7d 0a 20 0a 23 65 6e 64 69 66  _OK; .}. .#endif
2bb10 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 53 5f 55 4e   /* SQLITE_OS_UN
2bb20 49 58 20 2a 2f 0a                                IX */.