/ Hex Artifact Content
Login

Artifact fe85acfeded5cc13c2340ab73c9baf841de4e6d9:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 4d 61 79 20 32  /*.** 2004 May 2
0010: 32 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  2.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
0180: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74   file contains t
0190: 68 65 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74  he VFS implement
01a0: 61 74 69 6f 6e 20 66 6f 72 20 75 6e 69 78 2d 6c  ation for unix-l
01b0: 69 6b 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  ike operating sy
01c0: 73 74 65 6d 73 0a 2a 2a 20 69 6e 63 6c 75 64 65  stems.** include
01d0: 20 4c 69 6e 75 78 2c 20 4d 61 63 4f 53 58 2c 20   Linux, MacOSX, 
01e0: 2a 42 53 44 2c 20 51 4e 58 2c 20 56 78 57 6f 72  *BSD, QNX, VxWor
01f0: 6b 73 2c 20 41 49 58 2c 20 48 50 55 58 2c 20 61  ks, AIX, HPUX, a
0200: 6e 64 20 6f 74 68 65 72 73 2e 0a 2a 2a 0a 2a 2a  nd others..**.**
0210: 20 54 68 65 72 65 20 61 72 65 20 61 63 74 75 61   There are actua
0220: 6c 6c 79 20 73 65 76 65 72 61 6c 20 64 69 66 66  lly several diff
0230: 65 72 65 6e 74 20 56 46 53 20 69 6d 70 6c 65 6d  erent VFS implem
0240: 65 6e 74 61 74 69 6f 6e 73 20 69 6e 20 74 68 69  entations in thi
0250: 73 20 66 69 6c 65 2e 0a 2a 2a 20 54 68 65 20 64  s file..** The d
0260: 69 66 66 65 72 65 6e 63 65 73 20 61 72 65 20 69  ifferences are i
0270: 6e 20 74 68 65 20 77 61 79 20 74 68 61 74 20 66  n the way that f
0280: 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20 64  ile locking is d
0290: 6f 6e 65 2e 20 20 54 68 65 20 64 65 66 61 75 6c  one.  The defaul
02a0: 74 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74  t.** implementat
02b0: 69 6f 6e 20 75 73 65 73 20 50 6f 73 69 78 20 41  ion uses Posix A
02c0: 64 76 69 73 6f 72 79 20 4c 6f 63 6b 73 2e 20 20  dvisory Locks.  
02d0: 41 6c 74 65 72 6e 61 74 69 76 65 20 69 6d 70 6c  Alternative impl
02e0: 65 6d 65 6e 74 61 74 69 6f 6e 73 0a 2a 2a 20 75  ementations.** u
02f0: 73 65 20 66 6c 6f 63 6b 28 29 2c 20 64 6f 74 2d  se flock(), dot-
0300: 66 69 6c 65 73 2c 20 76 61 72 69 6f 75 73 20 70  files, various p
0310: 72 6f 70 72 69 65 74 61 72 79 20 6c 6f 63 6b 69  roprietary locki
0320: 6e 67 20 73 63 68 65 6d 61 73 2c 20 6f 72 20 73  ng schemas, or s
0330: 69 6d 70 6c 79 0a 2a 2a 20 73 6b 69 70 20 6c 6f  imply.** skip lo
0340: 63 6b 69 6e 67 20 61 6c 6c 20 74 6f 67 65 74 68  cking all togeth
0350: 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73  er..**.** This s
0360: 6f 75 72 63 65 20 66 69 6c 65 20 69 73 20 6f 72  ource file is or
0370: 67 61 6e 69 7a 65 64 20 69 6e 74 6f 20 64 69 76  ganized into div
0380: 69 73 69 6f 6e 73 20 77 68 65 72 65 20 74 68 65  isions where the
0390: 20 6c 6f 67 69 63 20 66 6f 72 20 76 61 72 69 6f   logic for vario
03a0: 75 73 0a 2a 2a 20 73 75 62 66 75 6e 63 74 69 6f  us.** subfunctio
03b0: 6e 73 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20  ns is contained 
03c0: 77 69 74 68 69 6e 20 74 68 65 20 61 70 70 72 6f  within the appro
03d0: 70 72 69 61 74 65 20 64 69 76 69 73 69 6f 6e 2e  priate division.
03e0: 20 20 50 4c 45 41 53 45 0a 2a 2a 20 4b 45 45 50    PLEASE.** KEEP
03f0: 20 54 48 45 20 53 54 52 55 43 54 55 52 45 20 4f   THE STRUCTURE O
0400: 46 20 54 48 49 53 20 46 49 4c 45 20 49 4e 54 41  F THIS FILE INTA
0410: 43 54 2e 20 20 4e 65 77 20 63 6f 64 65 20 73 68  CT.  New code sh
0420: 6f 75 6c 64 20 62 65 20 70 6c 61 63 65 64 0a 2a  ould be placed.*
0430: 2a 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74  * in the correct
0440: 20 64 69 76 69 73 69 6f 6e 20 61 6e 64 20 73 68   division and sh
0450: 6f 75 6c 64 20 62 65 20 63 6c 65 61 72 6c 79 20  ould be clearly 
0460: 6c 61 62 65 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  labeled..**.** T
0470: 68 65 20 6c 61 79 6f 75 74 20 6f 66 20 64 69 76  he layout of div
0480: 69 73 69 6f 6e 73 20 69 73 20 61 73 20 66 6f 6c  isions is as fol
0490: 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  lows:.**.**   * 
04a0: 20 47 65 6e 65 72 61 6c 2d 70 75 72 70 6f 73 65   General-purpose
04b0: 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 20 61 6e   declarations an
04c0: 64 20 75 74 69 6c 69 74 79 20 66 75 6e 63 74 69  d utility functi
04d0: 6f 6e 73 2e 0a 2a 2a 20 20 20 2a 20 20 55 6e 69  ons..**   *  Uni
04e0: 71 75 65 20 66 69 6c 65 20 49 44 20 6c 6f 67 69  que file ID logi
04f0: 63 20 75 73 65 64 20 62 79 20 56 78 57 6f 72 6b  c used by VxWork
0500: 73 2e 0a 2a 2a 20 20 20 2a 20 20 56 61 72 69 6f  s..**   *  Vario
0510: 75 73 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69  us locking primi
0520: 74 69 76 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  tive implementat
0530: 69 6f 6e 73 20 28 61 6c 6c 20 65 78 63 65 70 74  ions (all except
0540: 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 29 3a   proxy locking):
0550: 0a 2a 2a 20 20 20 20 20 20 2b 20 66 6f 72 20 50  .**      + for P
0560: 6f 73 69 78 20 41 64 76 69 73 6f 72 79 20 4c 6f  osix Advisory Lo
0570: 63 6b 73 0a 2a 2a 20 20 20 20 20 20 2b 20 66 6f  cks.**      + fo
0580: 72 20 6e 6f 2d 6f 70 20 6c 6f 63 6b 73 0a 2a 2a  r no-op locks.**
0590: 20 20 20 20 20 20 2b 20 66 6f 72 20 64 6f 74 2d        + for dot-
05a0: 66 69 6c 65 20 6c 6f 63 6b 73 0a 2a 2a 20 20 20  file locks.**   
05b0: 20 20 20 2b 20 66 6f 72 20 66 6c 6f 63 6b 28 29     + for flock()
05c0: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   locking.**     
05d0: 20 2b 20 66 6f 72 20 6e 61 6d 65 64 20 73 65 6d   + for named sem
05e0: 61 70 68 6f 72 65 20 6c 6f 63 6b 73 20 28 56 78  aphore locks (Vx
05f0: 57 6f 72 6b 73 20 6f 6e 6c 79 29 0a 2a 2a 20 20  Works only).**  
0600: 20 20 20 20 2b 20 66 6f 72 20 41 46 50 20 66 69      + for AFP fi
0610: 6c 65 73 79 73 74 65 6d 20 6c 6f 63 6b 73 20 28  lesystem locks (
0620: 4d 61 63 4f 53 58 20 6f 6e 6c 79 29 0a 2a 2a 20  MacOSX only).** 
0630: 20 20 2a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c    *  sqlite3_fil
0640: 65 20 6d 65 74 68 6f 64 73 20 6e 6f 74 20 61 73  e methods not as
0650: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 6c 6f  sociated with lo
0660: 63 6b 69 6e 67 2e 0a 2a 2a 20 20 20 2a 20 20 44  cking..**   *  D
0670: 65 66 69 6e 69 74 69 6f 6e 73 20 6f 66 20 73 71  efinitions of sq
0680: 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
0690: 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 61 6c 6c   objects for all
06a0: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   locking.**     
06b0: 20 6d 65 74 68 6f 64 73 20 70 6c 75 73 20 22 66   methods plus "f
06c0: 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 73  inder" functions
06d0: 20 66 6f 72 20 65 61 63 68 20 6c 6f 63 6b 69 6e   for each lockin
06e0: 67 20 6d 65 74 68 6f 64 2e 0a 2a 2a 20 20 20 2a  g method..**   *
06f0: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65    sqlite3_vfs me
0700: 74 68 6f 64 20 69 6d 70 6c 65 6d 65 6e 74 61 74  thod implementat
0710: 69 6f 6e 73 2e 0a 2a 2a 20 20 20 2a 20 20 4c 6f  ions..**   *  Lo
0720: 63 6b 69 6e 67 20 70 72 69 6d 69 74 69 76 65 73  cking primitives
0730: 20 66 6f 72 20 74 68 65 20 70 72 6f 78 79 20 75   for the proxy u
0740: 62 65 72 2d 6c 6f 63 6b 69 6e 67 2d 6d 65 74 68  ber-locking-meth
0750: 6f 64 2e 20 28 4d 61 63 4f 53 58 20 6f 6e 6c 79  od. (MacOSX only
0760: 29 0a 2a 2a 20 20 20 2a 20 20 44 65 66 69 6e 69  ).**   *  Defini
0770: 74 69 6f 6e 73 20 6f 66 20 73 71 6c 69 74 65 33  tions of sqlite3
0780: 5f 76 66 73 20 6f 62 6a 65 63 74 73 20 66 6f 72  _vfs objects for
0790: 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6d 65 74   all locking met
07a0: 68 6f 64 73 0a 2a 2a 20 20 20 20 20 20 70 6c 75  hods.**      plu
07b0: 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  s implementation
07c0: 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 6f 73 5f  s of sqlite3_os_
07d0: 69 6e 69 74 28 29 20 61 6e 64 20 73 71 6c 69 74  init() and sqlit
07e0: 65 33 5f 6f 73 5f 65 6e 64 28 29 2e 0a 2a 2f 0a  e3_os_end()..*/.
07f0: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0800: 49 6e 74 2e 68 22 0a 23 69 66 20 53 51 4c 49 54  Int.h".#if SQLIT
0810: 45 5f 4f 53 5f 55 4e 49 58 20 20 20 20 20 20 20  E_OS_UNIX       
0820: 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 66         /* This f
0830: 69 6c 65 20 69 73 20 75 73 65 64 20 6f 6e 20 75  ile is used on u
0840: 6e 69 78 20 6f 6e 6c 79 20 2a 2f 0a 0a 2f 2a 0a  nix only */../*.
0850: 2a 2a 20 54 68 65 72 65 20 61 72 65 20 76 61 72  ** There are var
0860: 69 6f 75 73 20 6d 65 74 68 6f 64 73 20 66 6f 72  ious methods for
0870: 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 75 73   file locking us
0880: 65 64 20 66 6f 72 20 63 6f 6e 63 75 72 72 65 6e  ed for concurren
0890: 63 79 0a 2a 2a 20 63 6f 6e 74 72 6f 6c 3a 0a 2a  cy.** control:.*
08a0: 2a 0a 2a 2a 20 20 20 31 2e 20 50 4f 53 49 58 20  *.**   1. POSIX 
08b0: 6c 6f 63 6b 69 6e 67 20 28 74 68 65 20 64 65 66  locking (the def
08c0: 61 75 6c 74 29 2c 0a 2a 2a 20 20 20 32 2e 20 4e  ault),.**   2. N
08d0: 6f 20 6c 6f 63 6b 69 6e 67 2c 0a 2a 2a 20 20 20  o locking,.**   
08e0: 33 2e 20 44 6f 74 2d 66 69 6c 65 20 6c 6f 63 6b  3. Dot-file lock
08f0: 69 6e 67 2c 0a 2a 2a 20 20 20 34 2e 20 66 6c 6f  ing,.**   4. flo
0900: 63 6b 28 29 20 6c 6f 63 6b 69 6e 67 2c 0a 2a 2a  ck() locking,.**
0910: 20 20 20 35 2e 20 41 46 50 20 6c 6f 63 6b 69 6e     5. AFP lockin
0920: 67 20 28 4f 53 58 20 6f 6e 6c 79 29 2c 0a 2a 2a  g (OSX only),.**
0930: 20 20 20 36 2e 20 4e 61 6d 65 64 20 50 4f 53 49     6. Named POSI
0940: 58 20 73 65 6d 61 70 68 6f 72 65 73 20 28 56 58  X semaphores (VX
0950: 57 6f 72 6b 73 20 6f 6e 6c 79 29 2c 0a 2a 2a 20  Works only),.** 
0960: 20 20 37 2e 20 70 72 6f 78 79 20 6c 6f 63 6b 69    7. proxy locki
0970: 6e 67 2e 20 28 4f 53 58 20 6f 6e 6c 79 29 0a 2a  ng. (OSX only).*
0980: 2a 0a 2a 2a 20 53 74 79 6c 65 73 20 34 2c 20 35  *.** Styles 4, 5
0990: 2c 20 61 6e 64 20 37 20 61 72 65 20 6f 6e 6c 79  , and 7 are only
09a0: 20 61 76 61 69 6c 61 62 6c 65 20 6f 66 20 53 51   available of SQ
09b0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
09c0: 49 4e 47 5f 53 54 59 4c 45 0a 2a 2a 20 69 73 20  ING_STYLE.** is 
09d0: 64 65 66 69 6e 65 64 20 74 6f 20 31 2e 20 20 54  defined to 1.  T
09e0: 68 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  he SQLITE_ENABLE
09f0: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 61  _LOCKING_STYLE a
0a00: 6c 73 6f 20 65 6e 61 62 6c 65 73 20 61 75 74 6f  lso enables auto
0a10: 6d 61 74 69 63 0a 2a 2a 20 73 65 6c 65 63 74 69  matic.** selecti
0a20: 6f 6e 20 6f 66 20 74 68 65 20 61 70 70 72 6f 70  on of the approp
0a30: 72 69 61 74 65 20 6c 6f 63 6b 69 6e 67 20 73 74  riate locking st
0a40: 79 6c 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65  yle based on the
0a50: 20 66 69 6c 65 73 79 73 74 65 6d 0a 2a 2a 20 77   filesystem.** w
0a60: 68 65 72 65 20 74 68 65 20 64 61 74 61 62 61 73  here the databas
0a70: 65 20 69 73 20 6c 6f 63 61 74 65 64 2e 20 20 0a  e is located.  .
0a80: 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
0a90: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
0aa0: 43 4b 49 4e 47 5f 53 54 59 4c 45 29 0a 23 20 20  CKING_STYLE).#  
0ab0: 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
0ac0: 4c 45 5f 5f 29 0a 23 20 20 20 20 64 65 66 69 6e  LE__).#    defin
0ad0: 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  e SQLITE_ENABLE_
0ae0: 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 31 0a  LOCKING_STYLE 1.
0af0: 23 20 20 65 6c 73 65 0a 23 20 20 20 20 64 65 66  #  else.#    def
0b00: 69 6e 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ine SQLITE_ENABL
0b10: 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
0b20: 30 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69  0.#  endif.#endi
0b30: 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65 20  f../*.** Define 
0b40: 74 68 65 20 4f 53 5f 56 58 57 4f 52 4b 53 20 70  the OS_VXWORKS p
0b50: 72 65 2d 70 72 6f 63 65 73 73 6f 72 20 6d 61 63  re-processor mac
0b60: 72 6f 20 74 6f 20 31 20 69 66 20 62 75 69 6c 64  ro to 1 if build
0b70: 69 6e 67 20 6f 6e 20 0a 2a 2a 20 76 78 77 6f 72  ing on .** vxwor
0b80: 6b 73 2c 20 6f 72 20 30 20 6f 74 68 65 72 77 69  ks, or 0 otherwi
0b90: 73 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4f  se..*/.#ifndef O
0ba0: 53 5f 56 58 57 4f 52 4b 53 0a 23 20 20 69 66 20  S_VXWORKS.#  if 
0bb0: 64 65 66 69 6e 65 64 28 5f 5f 52 54 50 5f 5f 29  defined(__RTP__)
0bc0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 57 52 53   || defined(_WRS
0bd0: 5f 4b 45 52 4e 45 4c 29 0a 23 20 20 20 20 64 65  _KERNEL).#    de
0be0: 66 69 6e 65 20 4f 53 5f 56 58 57 4f 52 4b 53 20  fine OS_VXWORKS 
0bf0: 31 0a 23 20 20 65 6c 73 65 0a 23 20 20 20 20 64  1.#  else.#    d
0c00: 65 66 69 6e 65 20 4f 53 5f 56 58 57 4f 52 4b 53  efine OS_VXWORKS
0c10: 20 30 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64   0.#  endif.#end
0c20: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20  if../*.** These 
0c30: 23 64 65 66 69 6e 65 73 20 73 68 6f 75 6c 64 20  #defines should 
0c40: 65 6e 61 62 6c 65 20 3e 32 47 42 20 66 69 6c 65  enable >2GB file
0c50: 20 73 75 70 70 6f 72 74 20 6f 6e 20 50 6f 73 69   support on Posi
0c60: 78 20 69 66 20 74 68 65 0a 2a 2a 20 75 6e 64 65  x if the.** unde
0c70: 72 6c 79 69 6e 67 20 6f 70 65 72 61 74 69 6e 67  rlying operating
0c80: 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 73   system supports
0c90: 20 69 74 2e 20 20 49 66 20 74 68 65 20 4f 53 20   it.  If the OS 
0ca0: 6c 61 63 6b 73 0a 2a 2a 20 6c 61 72 67 65 20 66  lacks.** large f
0cb0: 69 6c 65 20 73 75 70 70 6f 72 74 2c 20 74 68 65  ile support, the
0cc0: 73 65 20 73 68 6f 75 6c 64 20 62 65 20 6e 6f 2d  se should be no-
0cd0: 6f 70 73 2e 0a 2a 2a 0a 2a 2a 20 4c 61 72 67 65  ops..**.** Large
0ce0: 20 66 69 6c 65 20 73 75 70 70 6f 72 74 20 63 61   file support ca
0cf0: 6e 20 62 65 20 64 69 73 61 62 6c 65 64 20 75 73  n be disabled us
0d00: 69 6e 67 20 74 68 65 20 2d 44 53 51 4c 49 54 45  ing the -DSQLITE
0d10: 5f 44 49 53 41 42 4c 45 5f 4c 46 53 20 73 77 69  _DISABLE_LFS swi
0d20: 74 63 68 0a 2a 2a 20 6f 6e 20 74 68 65 20 63 6f  tch.** on the co
0d30: 6d 70 69 6c 65 72 20 63 6f 6d 6d 61 6e 64 20 6c  mpiler command l
0d40: 69 6e 65 2e 20 20 54 68 69 73 20 69 73 20 6e 65  ine.  This is ne
0d50: 63 65 73 73 61 72 79 20 69 66 20 79 6f 75 20 61  cessary if you a
0d60: 72 65 20 63 6f 6d 70 69 6c 69 6e 67 0a 2a 2a 20  re compiling.** 
0d70: 6f 6e 20 61 20 72 65 63 65 6e 74 20 6d 61 63 68  on a recent mach
0d80: 69 6e 65 20 28 65 78 3a 20 52 65 64 48 61 74 20  ine (ex: RedHat 
0d90: 37 2e 32 29 20 62 75 74 20 79 6f 75 20 77 61 6e  7.2) but you wan
0da0: 74 20 79 6f 75 72 20 63 6f 64 65 20 74 6f 20 77  t your code to w
0db0: 6f 72 6b 0a 2a 2a 20 6f 6e 20 61 6e 20 6f 6c 64  ork.** on an old
0dc0: 65 72 20 6d 61 63 68 69 6e 65 20 28 65 78 3a 20  er machine (ex: 
0dd0: 52 65 64 48 61 74 20 36 2e 30 29 2e 20 20 49 66  RedHat 6.0).  If
0de0: 20 79 6f 75 20 63 6f 6d 70 69 6c 65 20 6f 6e 20   you compile on 
0df0: 52 65 64 48 61 74 20 37 2e 32 0a 2a 2a 20 77 69  RedHat 7.2.** wi
0e00: 74 68 6f 75 74 20 74 68 69 73 20 6f 70 74 69 6f  thout this optio
0e10: 6e 2c 20 4c 46 53 20 69 73 20 65 6e 61 62 6c 65  n, LFS is enable
0e20: 2e 20 20 42 75 74 20 4c 46 53 20 64 6f 65 73 20  .  But LFS does 
0e30: 6e 6f 74 20 65 78 69 73 74 20 69 6e 20 74 68 65  not exist in the
0e40: 20 6b 65 72 6e 65 6c 0a 2a 2a 20 69 6e 20 52 65   kernel.** in Re
0e50: 64 48 61 74 20 36 2e 30 2c 20 73 6f 20 74 68 65  dHat 6.0, so the
0e60: 20 63 6f 64 65 20 77 6f 6e 27 74 20 77 6f 72 6b   code won't work
0e70: 2e 20 20 48 65 6e 63 65 2c 20 66 6f 72 20 6d 61  .  Hence, for ma
0e80: 78 69 6d 75 6d 20 62 69 6e 61 72 79 0a 2a 2a 20  ximum binary.** 
0e90: 70 6f 72 74 61 62 69 6c 69 74 79 20 79 6f 75 20  portability you 
0ea0: 73 68 6f 75 6c 64 20 6f 6d 69 74 20 4c 46 53 2e  should omit LFS.
0eb0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 65 76 69  .**.** The previ
0ec0: 6f 75 73 20 70 61 72 61 67 72 61 70 68 20 77 61  ous paragraph wa
0ed0: 73 20 77 72 69 74 74 65 6e 20 69 6e 20 32 30 30  s written in 200
0ee0: 35 2e 20 20 28 54 68 69 73 20 70 61 72 61 67 72  5.  (This paragr
0ef0: 61 70 68 20 69 73 20 77 72 69 74 74 65 6e 0a 2a  aph is written.*
0f00: 2a 20 6f 6e 20 32 30 30 38 2d 31 31 2d 32 38 2e  * on 2008-11-28.
0f10: 29 20 54 68 65 73 65 20 64 61 79 73 2c 20 61 6c  ) These days, al
0f20: 6c 20 4c 69 6e 75 78 20 6b 65 72 6e 65 6c 73 20  l Linux kernels 
0f30: 73 75 70 70 6f 72 74 20 6c 61 72 67 65 20 66 69  support large fi
0f40: 6c 65 73 2c 20 73 6f 0a 2a 2a 20 79 6f 75 20 73  les, so.** you s
0f50: 68 6f 75 6c 64 20 70 72 6f 62 61 62 6c 79 20 6c  hould probably l
0f60: 65 61 76 65 20 4c 46 53 20 65 6e 61 62 6c 65 64  eave LFS enabled
0f70: 2e 20 20 42 75 74 20 73 6f 6d 65 20 65 6d 62 65  .  But some embe
0f80: 64 64 65 64 20 70 6c 61 74 66 6f 72 6d 73 20 6d  dded platforms m
0f90: 69 67 68 74 0a 2a 2a 20 6c 61 63 6b 20 4c 46 53  ight.** lack LFS
0fa0: 20 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 74   in which case t
0fb0: 68 65 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c  he SQLITE_DISABL
0fc0: 45 5f 4c 46 53 20 6d 61 63 72 6f 20 6d 69 67 68  E_LFS macro migh
0fd0: 74 20 73 74 69 6c 6c 20 62 65 20 75 73 65 66 75  t still be usefu
0fe0: 6c 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  l..*/.#ifndef SQ
0ff0: 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 4c 46 53  LITE_DISABLE_LFS
1000: 0a 23 20 64 65 66 69 6e 65 20 5f 4c 41 52 47 45  .# define _LARGE
1010: 5f 46 49 4c 45 20 20 20 20 20 20 20 31 0a 23 20  _FILE       1.# 
1020: 69 66 6e 64 65 66 20 5f 46 49 4c 45 5f 4f 46 46  ifndef _FILE_OFF
1030: 53 45 54 5f 42 49 54 53 0a 23 20 20 20 64 65 66  SET_BITS.#   def
1040: 69 6e 65 20 5f 46 49 4c 45 5f 4f 46 46 53 45 54  ine _FILE_OFFSET
1050: 5f 42 49 54 53 20 36 34 0a 23 20 65 6e 64 69 66  _BITS 64.# endif
1060: 0a 23 20 64 65 66 69 6e 65 20 5f 4c 41 52 47 45  .# define _LARGE
1070: 46 49 4c 45 5f 53 4f 55 52 43 45 20 31 0a 23 65  FILE_SOURCE 1.#e
1080: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 73 74 61 6e  ndif../*.** stan
1090: 64 61 72 64 20 69 6e 63 6c 75 64 65 20 66 69 6c  dard include fil
10a0: 65 73 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20  es..*/.#include 
10b0: 3c 73 79 73 2f 74 79 70 65 73 2e 68 3e 0a 23 69  <sys/types.h>.#i
10c0: 6e 63 6c 75 64 65 20 3c 73 79 73 2f 73 74 61 74  nclude <sys/stat
10d0: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 66 63  .h>.#include <fc
10e0: 6e 74 6c 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  ntl.h>.#include 
10f0: 3c 75 6e 69 73 74 64 2e 68 3e 0a 23 69 6e 63 6c  <unistd.h>.#incl
1100: 75 64 65 20 3c 74 69 6d 65 2e 68 3e 0a 23 69 6e  ude <time.h>.#in
1110: 63 6c 75 64 65 20 3c 73 79 73 2f 74 69 6d 65 2e  clude <sys/time.
1120: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 65 72 72  h>.#include <err
1130: 6e 6f 2e 68 3e 0a 0a 23 69 66 20 53 51 4c 49 54  no.h>..#if SQLIT
1140: 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
1150: 5f 53 54 59 4c 45 0a 23 20 69 6e 63 6c 75 64 65  _STYLE.# include
1160: 20 3c 73 79 73 2f 69 6f 63 74 6c 2e 68 3e 0a 23   <sys/ioctl.h>.#
1170: 20 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 23   if OS_VXWORKS.#
1180: 20 20 69 6e 63 6c 75 64 65 20 3c 73 65 6d 61 70    include <semap
1190: 68 6f 72 65 2e 68 3e 0a 23 20 20 69 6e 63 6c 75  hore.h>.#  inclu
11a0: 64 65 20 3c 6c 69 6d 69 74 73 2e 68 3e 0a 23 20  de <limits.h>.# 
11b0: 65 6c 73 65 0a 23 20 20 69 6e 63 6c 75 64 65 20  else.#  include 
11c0: 3c 73 79 73 2f 66 69 6c 65 2e 68 3e 0a 23 20 20  <sys/file.h>.#  
11d0: 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 70 61 72  include <sys/par
11e0: 61 6d 2e 68 3e 0a 23 20 20 69 6e 63 6c 75 64 65  am.h>.#  include
11f0: 20 3c 73 79 73 2f 6d 6f 75 6e 74 2e 68 3e 0a 23   <sys/mount.h>.#
1200: 20 65 6e 64 69 66 0a 23 65 6e 64 69 66 20 2f 2a   endif.#endif /*
1210: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
1220: 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a  OCKING_STYLE */.
1230: 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65 20 61 72 65  ./*.** If we are
1240: 20 74 6f 20 62 65 20 74 68 72 65 61 64 2d 73 61   to be thread-sa
1250: 66 65 2c 20 69 6e 63 6c 75 64 65 20 74 68 65 20  fe, include the 
1260: 70 74 68 72 65 61 64 73 20 68 65 61 64 65 72 20  pthreads header 
1270: 61 6e 64 20 64 65 66 69 6e 65 0a 2a 2a 20 74 68  and define.** th
1280: 65 20 53 51 4c 49 54 45 5f 55 4e 49 58 5f 54 48  e SQLITE_UNIX_TH
1290: 52 45 41 44 53 20 6d 61 63 72 6f 2e 0a 2a 2f 0a  READS macro..*/.
12a0: 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41  #if SQLITE_THREA
12b0: 44 53 41 46 45 0a 23 20 69 6e 63 6c 75 64 65 20  DSAFE.# include 
12c0: 3c 70 74 68 72 65 61 64 2e 68 3e 0a 23 20 64 65  <pthread.h>.# de
12d0: 66 69 6e 65 20 53 51 4c 49 54 45 5f 55 4e 49 58  fine SQLITE_UNIX
12e0: 5f 54 48 52 45 41 44 53 20 31 0a 23 65 6e 64 69  _THREADS 1.#endi
12f0: 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 61 75 6c 74  f../*.** Default
1300: 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 77 68 65   permissions whe
1310: 6e 20 63 72 65 61 74 69 6e 67 20 61 20 6e 65 77  n creating a new
1320: 20 66 69 6c 65 0a 2a 2f 0a 23 69 66 6e 64 65 66   file.*/.#ifndef
1330: 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
1340: 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53  FILE_PERMISSIONS
1350: 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45  .# define SQLITE
1360: 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45  _DEFAULT_FILE_PE
1370: 52 4d 49 53 53 49 4f 4e 53 20 30 36 34 34 0a 23  RMISSIONS 0644.#
1380: 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 2a 20 44 65  endif../*. ** De
1390: 66 61 75 6c 74 20 70 65 72 6d 69 73 73 69 6f 6e  fault permission
13a0: 73 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20  s when creating 
13b0: 61 75 74 6f 20 70 72 6f 78 79 20 64 69 72 0a 20  auto proxy dir. 
13c0: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
13d0: 45 5f 44 45 46 41 55 4c 54 5f 50 52 4f 58 59 44  E_DEFAULT_PROXYD
13e0: 49 52 5f 50 45 52 4d 49 53 53 49 4f 4e 53 0a 23  IR_PERMISSIONS.#
13f0: 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 44   define SQLITE_D
1400: 45 46 41 55 4c 54 5f 50 52 4f 58 59 44 49 52 5f  EFAULT_PROXYDIR_
1410: 50 45 52 4d 49 53 53 49 4f 4e 53 20 30 37 35 35  PERMISSIONS 0755
1420: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d  .#endif../*.** M
1430: 61 78 69 6d 75 6d 20 73 75 70 70 6f 72 74 65 64  aximum supported
1440: 20 70 61 74 68 2d 6c 65 6e 67 74 68 2e 0a 2a 2f   path-length..*/
1450: 0a 23 64 65 66 69 6e 65 20 4d 41 58 5f 50 41 54  .#define MAX_PAT
1460: 48 4e 41 4d 45 20 35 31 32 0a 0a 2f 2a 0a 2a 2a  HNAME 512../*.**
1470: 20 4f 6e 6c 79 20 73 65 74 20 74 68 65 20 6c 61   Only set the la
1480: 73 74 45 72 72 6e 6f 20 69 66 20 74 68 65 20 65  stErrno if the e
1490: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 61 20 72  rror code is a r
14a0: 65 61 6c 20 65 72 72 6f 72 20 61 6e 64 20 6e 6f  eal error and no
14b0: 74 20 0a 2a 2a 20 61 20 6e 6f 72 6d 61 6c 20 65  t .** a normal e
14c0: 78 70 65 63 74 65 64 20 72 65 74 75 72 6e 20 63  xpected return c
14d0: 6f 64 65 20 6f 66 20 53 51 4c 49 54 45 5f 42 55  ode of SQLITE_BU
14e0: 53 59 20 6f 72 20 53 51 4c 49 54 45 5f 4f 4b 0a  SY or SQLITE_OK.
14f0: 2a 2f 0a 23 64 65 66 69 6e 65 20 49 53 5f 4c 4f  */.#define IS_LO
1500: 43 4b 5f 45 52 52 4f 52 28 78 29 20 20 28 28 78  CK_ERROR(x)  ((x
1510: 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 29 20 26   != SQLITE_OK) &
1520: 26 20 28 78 20 21 3d 20 53 51 4c 49 54 45 5f 42  & (x != SQLITE_B
1530: 55 53 59 29 29 0a 0a 0a 2f 2a 0a 2a 2a 20 53 6f  USY)).../*.** So
1540: 6d 65 74 69 6d 65 73 2c 20 61 66 74 65 72 20 61  metimes, after a
1550: 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 69 73 20   file handle is 
1560: 63 6c 6f 73 65 64 20 62 79 20 53 51 4c 69 74 65  closed by SQLite
1570: 2c 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  , the file descr
1580: 69 70 74 6f 72 0a 2a 2a 20 63 61 6e 6e 6f 74 20  iptor.** cannot 
1590: 62 65 20 63 6c 6f 73 65 64 20 69 6d 6d 65 64 69  be closed immedi
15a0: 61 74 65 6c 79 2e 20 49 6e 20 74 68 65 73 65 20  ately. In these 
15b0: 63 61 73 65 73 2c 20 69 6e 73 74 61 6e 63 65 73  cases, instances
15c0: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
15d0: 67 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 61  g.** structure a
15e0: 72 65 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65  re used to store
15f0: 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
1600: 70 74 6f 72 20 77 68 69 6c 65 20 77 61 69 74 69  ptor while waiti
1610: 6e 67 20 66 6f 72 20 61 6e 0a 2a 2a 20 6f 70 70  ng for an.** opp
1620: 6f 72 74 75 6e 69 74 79 20 74 6f 20 65 69 74 68  ortunity to eith
1630: 65 72 20 63 6c 6f 73 65 20 6f 72 20 72 65 75 73  er close or reus
1640: 65 20 69 74 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  e it..*/.typedef
1650: 20 73 74 72 75 63 74 20 55 6e 69 78 55 6e 75 73   struct UnixUnus
1660: 65 64 46 64 20 55 6e 69 78 55 6e 75 73 65 64 46  edFd UnixUnusedF
1670: 64 3b 0a 73 74 72 75 63 74 20 55 6e 69 78 55 6e  d;.struct UnixUn
1680: 75 73 65 64 46 64 20 7b 0a 20 20 69 6e 74 20 66  usedFd {.  int f
1690: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
16a0: 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73       /* File des
16b0: 63 72 69 70 74 6f 72 20 74 6f 20 63 6c 6f 73 65  criptor to close
16c0: 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 3b   */.  int flags;
16d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16e0: 2f 2a 20 46 6c 61 67 73 20 74 68 69 73 20 66 69  /* Flags this fi
16f0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 77 61  le descriptor wa
1700: 73 20 6f 70 65 6e 65 64 20 77 69 74 68 20 2a 2f  s opened with */
1710: 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20  .  UnixUnusedFd 
1720: 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 2f 2a 20  *pNext;      /* 
1730: 4e 65 78 74 20 75 6e 75 73 65 64 20 66 69 6c 65  Next unused file
1740: 20 64 65 73 63 72 69 70 74 6f 72 20 6f 6e 20 73   descriptor on s
1750: 61 6d 65 20 66 69 6c 65 20 2a 2f 0a 7d 3b 0a 0a  ame file */.};..
1760: 2f 2a 0a 2a 2a 20 54 68 65 20 75 6e 69 78 46 69  /*.** The unixFi
1770: 6c 65 20 73 74 72 75 63 74 75 72 65 20 69 73 20  le structure is 
1780: 73 75 62 63 6c 61 73 73 20 6f 66 20 73 71 6c 69  subclass of sqli
1790: 74 65 33 5f 66 69 6c 65 20 73 70 65 63 69 66 69  te3_file specifi
17a0: 63 20 74 6f 20 74 68 65 20 75 6e 69 78 0a 2a 2a  c to the unix.**
17b0: 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74 61 74   VFS implementat
17c0: 69 6f 6e 73 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  ions..*/.typedef
17d0: 20 73 74 72 75 63 74 20 75 6e 69 78 46 69 6c 65   struct unixFile
17e0: 20 75 6e 69 78 46 69 6c 65 3b 0a 73 74 72 75 63   unixFile;.struc
17f0: 74 20 75 6e 69 78 46 69 6c 65 20 7b 0a 20 20 73  t unixFile {.  s
1800: 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
1810: 73 20 63 6f 6e 73 74 20 2a 70 4d 65 74 68 6f 64  s const *pMethod
1820: 3b 20 20 2f 2a 20 41 6c 77 61 79 73 20 74 68 65  ;  /* Always the
1830: 20 66 69 72 73 74 20 65 6e 74 72 79 20 2a 2f 0a   first entry */.
1840: 20 20 73 74 72 75 63 74 20 75 6e 69 78 4f 70 65    struct unixOpe
1850: 6e 43 6e 74 20 2a 70 4f 70 65 6e 3b 20 20 20 20  nCnt *pOpen;    
1860: 20 20 20 2f 2a 20 49 6e 66 6f 20 61 62 6f 75 74     /* Info about
1870: 20 61 6c 6c 20 6f 70 65 6e 20 66 64 27 73 20 6f   all open fd's o
1880: 6e 20 74 68 69 73 20 69 6e 6f 64 65 20 2a 2f 0a  n this inode */.
1890: 20 20 73 74 72 75 63 74 20 75 6e 69 78 4c 6f 63    struct unixLoc
18a0: 6b 49 6e 66 6f 20 2a 70 4c 6f 63 6b 3b 20 20 20  kInfo *pLock;   
18b0: 20 20 20 2f 2a 20 49 6e 66 6f 20 61 62 6f 75 74     /* Info about
18c0: 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 69 73 20 69   locks on this i
18d0: 6e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 68 3b  node */.  int h;
18e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1900: 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
1910: 72 20 2a 2f 0a 20 20 69 6e 74 20 64 69 72 66 64  r */.  int dirfd
1920: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1930: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20          /* File 
1940: 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20 74  descriptor for t
1950: 68 65 20 64 69 72 65 63 74 6f 72 79 20 2a 2f 0a  he directory */.
1960: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
1970: 6c 6f 63 6b 74 79 70 65 3b 20 20 20 20 20 20 20  locktype;       
1980: 20 20 20 2f 2a 20 54 68 65 20 74 79 70 65 20 6f     /* The type o
1990: 66 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74  f lock held on t
19a0: 68 69 73 20 66 64 20 2a 2f 0a 20 20 69 6e 74 20  his fd */.  int 
19b0: 6c 61 73 74 45 72 72 6e 6f 3b 20 20 20 20 20 20  lastErrno;      
19c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19d0: 54 68 65 20 75 6e 69 78 20 65 72 72 6e 6f 20 66  The unix errno f
19e0: 72 6f 6d 20 74 68 65 20 6c 61 73 74 20 49 2f 4f  rom the last I/O
19f0: 20 65 72 72 6f 72 20 2a 2f 0a 20 20 76 6f 69 64   error */.  void
1a00: 20 2a 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74   *lockingContext
1a10: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
1a20: 4c 6f 63 6b 69 6e 67 20 73 74 79 6c 65 20 73 70  Locking style sp
1a30: 65 63 69 66 69 63 20 73 74 61 74 65 20 2a 2f 0a  ecific state */.
1a40: 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a    UnixUnusedFd *
1a50: 70 55 6e 75 73 65 64 3b 20 20 20 20 20 20 20 20  pUnused;        
1a60: 20 20 20 2f 2a 20 50 72 65 2d 61 6c 6c 6f 63 61     /* Pre-alloca
1a70: 74 65 64 20 55 6e 69 78 55 6e 75 73 65 64 46 64  ted UnixUnusedFd
1a80: 20 2a 2f 0a 20 20 69 6e 74 20 66 69 6c 65 46 6c   */.  int fileFl
1a90: 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
1aa0: 20 20 20 20 20 20 20 2f 2a 20 4d 69 73 63 65 6c         /* Miscel
1ab0: 6c 61 6e 6f 75 73 20 66 6c 61 67 73 20 2a 2f 0a  lanous flags */.
1ac0: 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  #if SQLITE_ENABL
1ad0: 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
1ae0: 20 20 69 6e 74 20 6f 70 65 6e 46 6c 61 67 73 3b    int openFlags;
1af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b00: 20 20 20 2f 2a 20 54 68 65 20 66 6c 61 67 73 20     /* The flags 
1b10: 73 70 65 63 69 66 69 65 64 20 61 74 20 6f 70 65  specified at ope
1b20: 6e 28 29 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69  n() */.#endif.#i
1b30: 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53  f SQLITE_THREADS
1b40: 41 46 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f  AFE && defined(_
1b50: 5f 6c 69 6e 75 78 5f 5f 29 0a 20 20 70 74 68 72  _linux__).  pthr
1b60: 65 61 64 5f 74 20 74 69 64 3b 20 20 20 20 20 20  ead_t tid;      
1b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b80: 54 68 65 20 74 68 72 65 61 64 20 74 68 61 74 20  The thread that 
1b90: 22 6f 77 6e 73 22 20 74 68 69 73 20 75 6e 69 78  "owns" this unix
1ba0: 46 69 6c 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 23  File */.#endif.#
1bb0: 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  if OS_VXWORKS.  
1bc0: 69 6e 74 20 69 73 44 65 6c 65 74 65 3b 20 20 20  int isDelete;   
1bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1be0: 20 2f 2a 20 44 65 6c 65 74 65 20 6f 6e 20 63 6c   /* Delete on cl
1bf0: 6f 73 65 20 69 66 20 74 72 75 65 20 2a 2f 0a 20  ose if true */. 
1c00: 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46   struct vxworksF
1c10: 69 6c 65 49 64 20 2a 70 49 64 3b 20 20 20 20 20  ileId *pId;     
1c20: 20 20 2f 2a 20 55 6e 69 71 75 65 20 66 69 6c 65    /* Unique file
1c30: 20 49 44 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69   ID */.#endif.#i
1c40: 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 2f  fndef NDEBUG.  /
1c50: 2a 20 54 68 65 20 6e 65 78 74 20 67 72 6f 75 70  * The next group
1c60: 20 6f 66 20 76 61 72 69 61 62 6c 65 73 20 61 72   of variables ar
1c70: 65 20 75 73 65 64 20 74 6f 20 74 72 61 63 6b 20  e used to track 
1c80: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
1c90: 68 65 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  he.  ** transact
1ca0: 69 6f 6e 20 63 6f 75 6e 74 65 72 20 69 6e 20 62  ion counter in b
1cb0: 79 74 65 73 20 32 34 2d 32 37 20 6f 66 20 64 61  ytes 24-27 of da
1cc0: 74 61 62 61 73 65 20 66 69 6c 65 73 20 61 72 65  tabase files are
1cd0: 20 75 70 64 61 74 65 64 0a 20 20 2a 2a 20 77 68   updated.  ** wh
1ce0: 65 6e 65 76 65 72 20 61 6e 79 20 70 61 72 74 20  enever any part 
1cf0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1d00: 63 68 61 6e 67 65 73 2e 20 20 41 6e 20 61 73 73  changes.  An ass
1d10: 65 72 74 69 6f 6e 20 66 61 75 6c 74 20 77 69 6c  ertion fault wil
1d20: 6c 0a 20 20 2a 2a 20 6f 63 63 75 72 20 69 66 20  l.  ** occur if 
1d30: 61 20 66 69 6c 65 20 69 73 20 75 70 64 61 74 65  a file is update
1d40: 64 20 77 69 74 68 6f 75 74 20 61 6c 73 6f 20 75  d without also u
1d50: 70 64 61 74 69 6e 67 20 74 68 65 20 74 72 61 6e  pdating the tran
1d60: 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 63 6f 75  saction.  ** cou
1d70: 6e 74 65 72 2e 20 20 54 68 69 73 20 74 65 73 74  nter.  This test
1d80: 20 69 73 20 6d 61 64 65 20 74 6f 20 61 76 6f 69   is made to avoi
1d90: 64 20 6e 65 77 20 70 72 6f 62 6c 65 6d 73 20 73  d new problems s
1da0: 69 6d 69 6c 61 72 20 74 6f 20 74 68 65 0a 20 20  imilar to the.  
1db0: 2a 2a 20 6f 6e 65 20 64 65 73 63 72 69 62 65 64  ** one described
1dc0: 20 62 79 20 74 69 63 6b 65 74 20 23 33 35 38 34   by ticket #3584
1dd0: 2e 20 0a 20 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  . .  */.  unsign
1de0: 65 64 20 63 68 61 72 20 74 72 61 6e 73 43 6e 74  ed char transCnt
1df0: 72 43 68 6e 67 3b 20 20 20 2f 2a 20 54 72 75 65  rChng;   /* True
1e00: 20 69 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   if the transact
1e10: 69 6f 6e 20 63 6f 75 6e 74 65 72 20 63 68 61 6e  ion counter chan
1e20: 67 65 64 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ged */.  unsigne
1e30: 64 20 63 68 61 72 20 64 62 55 70 64 61 74 65 3b  d char dbUpdate;
1e40: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1e50: 69 66 20 61 6e 79 20 70 61 72 74 20 6f 66 20 64  if any part of d
1e60: 61 74 61 62 61 73 65 20 66 69 6c 65 20 63 68 61  atabase file cha
1e70: 6e 67 65 64 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  nged */.  unsign
1e80: 65 64 20 63 68 61 72 20 69 6e 4e 6f 72 6d 61 6c  ed char inNormal
1e90: 57 72 69 74 65 3b 20 20 20 2f 2a 20 54 72 75 65  Write;   /* True
1ea0: 20 69 66 20 69 6e 20 61 20 6e 6f 72 6d 61 6c 20   if in a normal 
1eb0: 77 72 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 20  write operation 
1ec0: 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  */.#endif.#ifdef
1ed0: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 2f   SQLITE_TEST.  /
1ee0: 2a 20 49 6e 20 74 65 73 74 20 6d 6f 64 65 2c 20  * In test mode, 
1ef0: 69 6e 63 72 65 61 73 65 20 74 68 65 20 73 69 7a  increase the siz
1f00: 65 20 6f 66 20 74 68 69 73 20 73 74 72 75 63 74  e of this struct
1f10: 75 72 65 20 61 20 62 69 74 20 73 6f 20 74 68 61  ure a bit so tha
1f20: 74 20 0a 20 20 2a 2a 20 69 74 20 69 73 20 6c 61  t .  ** it is la
1f30: 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 73 74  rger than the st
1f40: 72 75 63 74 20 43 72 61 73 68 46 69 6c 65 20 64  ruct CrashFile d
1f50: 65 66 69 6e 65 64 20 69 6e 20 74 65 73 74 36 2e  efined in test6.
1f60: 63 2e 0a 20 20 2a 2f 0a 20 20 63 68 61 72 20 61  c..  */.  char a
1f70: 50 61 64 64 69 6e 67 5b 33 32 5d 3b 0a 23 65 6e  Padding[32];.#en
1f80: 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68  dif.};../*.** Th
1f90: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72  e following macr
1fa0: 6f 73 20 64 65 66 69 6e 65 20 62 69 74 73 20 69  os define bits i
1fb0: 6e 20 75 6e 69 78 46 69 6c 65 2e 66 69 6c 65 46  n unixFile.fileF
1fc0: 6c 61 67 73 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  lags.*/.#define 
1fd0: 53 51 4c 49 54 45 5f 57 48 4f 4c 45 5f 46 49 4c  SQLITE_WHOLE_FIL
1fe0: 45 5f 4c 4f 43 4b 49 4e 47 20 20 30 78 30 30 30  E_LOCKING  0x000
1ff0: 31 20 20 20 2f 2a 20 55 73 65 20 77 68 6f 6c 65  1   /* Use whole
2000: 2d 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 2a 2f  -file locking */
2010: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 6c 75 64 65 20  ../*.** Include 
2020: 63 6f 64 65 20 74 68 61 74 20 69 73 20 63 6f 6d  code that is com
2030: 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6f 73 5f 2a 2e  mon to all os_*.
2040: 63 20 66 69 6c 65 73 0a 2a 2f 0a 23 69 6e 63 6c  c files.*/.#incl
2050: 75 64 65 20 22 6f 73 5f 63 6f 6d 6d 6f 6e 2e 68  ude "os_common.h
2060: 22 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65 20  "../*.** Define 
2070: 76 61 72 69 6f 75 73 20 6d 61 63 72 6f 73 20 74  various macros t
2080: 68 61 74 20 61 72 65 20 6d 69 73 73 69 6e 67 20  hat are missing 
2090: 66 72 6f 6d 20 73 6f 6d 65 20 73 79 73 74 65 6d  from some system
20a0: 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4f 5f  s..*/.#ifndef O_
20b0: 4c 41 52 47 45 46 49 4c 45 0a 23 20 64 65 66 69  LARGEFILE.# defi
20c0: 6e 65 20 4f 5f 4c 41 52 47 45 46 49 4c 45 20 30  ne O_LARGEFILE 0
20d0: 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53  .#endif.#ifdef S
20e0: 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 4c 46  QLITE_DISABLE_LF
20f0: 53 0a 23 20 75 6e 64 65 66 20 4f 5f 4c 41 52 47  S.# undef O_LARG
2100: 45 46 49 4c 45 0a 23 20 64 65 66 69 6e 65 20 4f  EFILE.# define O
2110: 5f 4c 41 52 47 45 46 49 4c 45 20 30 0a 23 65 6e  _LARGEFILE 0.#en
2120: 64 69 66 0a 23 69 66 6e 64 65 66 20 4f 5f 4e 4f  dif.#ifndef O_NO
2130: 46 4f 4c 4c 4f 57 0a 23 20 64 65 66 69 6e 65 20  FOLLOW.# define 
2140: 4f 5f 4e 4f 46 4f 4c 4c 4f 57 20 30 0a 23 65 6e  O_NOFOLLOW 0.#en
2150: 64 69 66 0a 23 69 66 6e 64 65 66 20 4f 5f 42 49  dif.#ifndef O_BI
2160: 4e 41 52 59 0a 23 20 64 65 66 69 6e 65 20 4f 5f  NARY.# define O_
2170: 42 49 4e 41 52 59 20 30 0a 23 65 6e 64 69 66 0a  BINARY 0.#endif.
2180: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 44 4a 47 50 50  ./*.** The DJGPP
2190: 20 63 6f 6d 70 69 6c 65 72 20 65 6e 76 69 72 6f   compiler enviro
21a0: 6e 6d 65 6e 74 20 6c 6f 6f 6b 73 20 6d 6f 73 74  nment looks most
21b0: 6c 79 20 6c 69 6b 65 20 55 6e 69 78 2c 20 62 75  ly like Unix, bu
21c0: 74 20 69 74 0a 2a 2a 20 6c 61 63 6b 73 20 74 68  t it.** lacks th
21d0: 65 20 66 63 6e 74 6c 28 29 20 73 79 73 74 65 6d  e fcntl() system
21e0: 20 63 61 6c 6c 2e 20 20 53 6f 20 72 65 64 65 66   call.  So redef
21f0: 69 6e 65 20 66 63 6e 74 6c 28 29 20 74 6f 20 62  ine fcntl() to b
2200: 65 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 74  e something.** t
2210: 68 61 74 20 61 6c 77 61 79 73 20 73 75 63 63 65  hat always succe
2220: 65 64 73 2e 20 20 54 68 69 73 20 6d 65 61 6e 73  eds.  This means
2230: 20 74 68 61 74 20 6c 6f 63 6b 69 6e 67 20 64 6f   that locking do
2240: 65 73 20 6e 6f 74 20 6f 63 63 75 72 20 75 6e 64  es not occur und
2250: 65 72 0a 2a 2a 20 44 4a 47 50 50 2e 20 20 42 75  er.** DJGPP.  Bu
2260: 74 20 69 74 20 69 73 20 44 4f 53 20 2d 20 77 68  t it is DOS - wh
2270: 61 74 20 64 69 64 20 79 6f 75 20 65 78 70 65 63  at did you expec
2280: 74 3f 0a 2a 2f 0a 23 69 66 64 65 66 20 5f 5f 44  t?.*/.#ifdef __D
2290: 4a 47 50 50 5f 5f 0a 23 20 64 65 66 69 6e 65 20  JGPP__.# define 
22a0: 66 63 6e 74 6c 28 41 2c 42 2c 43 29 20 30 0a 23  fcntl(A,B,C) 0.#
22b0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
22c0: 20 74 68 72 65 61 64 69 64 20 6d 61 63 72 6f 20   threadid macro 
22d0: 72 65 73 6f 6c 76 65 73 20 74 6f 20 74 68 65 20  resolves to the 
22e0: 74 68 72 65 61 64 2d 69 64 20 6f 72 20 74 6f 20  thread-id or to 
22f0: 30 2e 20 20 55 73 65 64 20 66 6f 72 0a 2a 2a 20  0.  Used for.** 
2300: 74 65 73 74 69 6e 67 20 61 6e 64 20 64 65 62 75  testing and debu
2310: 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23  gging only..*/.#
2320: 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44  if SQLITE_THREAD
2330: 53 41 46 45 0a 23 64 65 66 69 6e 65 20 74 68 72  SAFE.#define thr
2340: 65 61 64 69 64 20 70 74 68 72 65 61 64 5f 73 65  eadid pthread_se
2350: 6c 66 28 29 0a 23 65 6c 73 65 0a 23 64 65 66 69  lf().#else.#defi
2360: 6e 65 20 74 68 72 65 61 64 69 64 20 30 0a 23 65  ne threadid 0.#e
2370: 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 48 65 6c  ndif.../*.** Hel
2380: 70 65 72 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f  per functions to
2390: 20 6f 62 74 61 69 6e 20 61 6e 64 20 72 65 6c 69   obtain and reli
23a0: 6e 71 75 69 73 68 20 74 68 65 20 67 6c 6f 62 61  nquish the globa
23b0: 6c 20 6d 75 74 65 78 2e 20 54 68 65 0a 2a 2a 20  l mutex. The.** 
23c0: 67 6c 6f 62 61 6c 20 6d 75 74 65 78 20 69 73 20  global mutex is 
23d0: 75 73 65 64 20 74 6f 20 70 72 6f 74 65 63 74 20  used to protect 
23e0: 74 68 65 20 75 6e 69 78 4f 70 65 6e 43 6e 74 2c  the unixOpenCnt,
23f0: 20 75 6e 69 78 4c 6f 63 6b 49 6e 66 6f 20 61 6e   unixLockInfo an
2400: 64 0a 2a 2a 20 76 78 77 6f 72 6b 73 46 69 6c 65  d.** vxworksFile
2410: 49 64 20 6f 62 6a 65 63 74 73 20 75 73 65 64 20  Id objects used 
2420: 62 79 20 74 68 69 73 20 66 69 6c 65 2c 20 61 6c  by this file, al
2430: 6c 20 6f 66 20 77 68 69 63 68 20 6d 61 79 20 62  l of which may b
2440: 65 20 0a 2a 2a 20 73 68 61 72 65 64 20 62 79 20  e .** shared by 
2450: 6d 75 6c 74 69 70 6c 65 20 74 68 72 65 61 64 73  multiple threads
2460: 2e 0a 2a 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e  ..**.** Function
2470: 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29   unixMutexHeld()
2480: 20 69 73 20 75 73 65 64 20 74 6f 20 61 73 73 65   is used to asse
2490: 72 74 28 29 20 74 68 61 74 20 74 68 65 20 67 6c  rt() that the gl
24a0: 6f 62 61 6c 20 6d 75 74 65 78 20 0a 2a 2a 20 69  obal mutex .** i
24b0: 73 20 68 65 6c 64 20 77 68 65 6e 20 72 65 71 75  s held when requ
24c0: 69 72 65 64 2e 20 54 68 69 73 20 66 75 6e 63 74  ired. This funct
24d0: 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64  ion is only used
24e0: 20 61 73 20 70 61 72 74 20 6f 66 20 61 73 73 65   as part of asse
24f0: 72 74 28 29 20 0a 2a 2a 20 73 74 61 74 65 6d 65  rt() .** stateme
2500: 6e 74 73 2e 20 65 2e 67 2e 0a 2a 2a 0a 2a 2a 20  nts. e.g..**.** 
2510: 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
2520: 28 29 0a 2a 2a 20 20 20 20 20 61 73 73 65 72 74  ().**     assert
2530: 28 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28  ( unixMutexHeld(
2540: 29 20 29 3b 0a 2a 2a 20 20 20 75 6e 69 78 45 6e  ) );.**   unixEn
2550: 74 65 72 4c 65 61 76 65 28 29 0a 2a 2f 0a 73 74  terLeave().*/.st
2560: 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 45 6e  atic void unixEn
2570: 74 65 72 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a  terMutex(void){.
2580: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
2590: 65 6e 74 65 72 28 73 71 6c 69 74 65 33 4d 75 74  enter(sqlite3Mut
25a0: 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  exAlloc(SQLITE_M
25b0: 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54  UTEX_STATIC_MAST
25c0: 45 52 29 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76  ER));.}.static v
25d0: 6f 69 64 20 75 6e 69 78 4c 65 61 76 65 4d 75 74  oid unixLeaveMut
25e0: 65 78 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69  ex(void){.  sqli
25f0: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
2600: 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
2610: 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
2620: 54 41 54 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a  TATIC_MASTER));.
2630: 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
2640: 44 45 42 55 47 0a 73 74 61 74 69 63 20 69 6e 74  DEBUG.static int
2650: 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 76   unixMutexHeld(v
2660: 6f 69 64 29 20 7b 0a 20 20 72 65 74 75 72 6e 20  oid) {.  return 
2670: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
2680: 6c 64 28 73 71 6c 69 74 65 33 4d 75 74 65 78 41  ld(sqlite3MutexA
2690: 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
26a0: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29  X_STATIC_MASTER)
26b0: 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23 69  );.}.#endif...#i
26c0: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
26d0: 47 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66  G./*.** Helper f
26e0: 75 6e 63 74 69 6f 6e 20 66 6f 72 20 70 72 69 6e  unction for prin
26f0: 74 69 6e 67 20 6f 75 74 20 74 72 61 63 65 20 69  ting out trace i
2700: 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20  nformation from 
2710: 64 65 62 75 67 67 69 6e 67 0a 2a 2a 20 62 69 6e  debugging.** bin
2720: 61 72 69 65 73 2e 20 54 68 69 73 20 72 65 74 75  aries. This retu
2730: 72 6e 73 20 74 68 65 20 73 74 72 69 6e 67 20 72  rns the string r
2740: 65 70 72 65 73 65 74 61 74 69 6f 6e 20 6f 66 20  epresetation of 
2750: 74 68 65 20 73 75 70 70 6c 69 65 64 0a 2a 2a 20  the supplied.** 
2760: 69 6e 74 65 67 65 72 20 6c 6f 63 6b 2d 74 79 70  integer lock-typ
2770: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  e..*/.static con
2780: 73 74 20 63 68 61 72 20 2a 6c 6f 63 6b 74 79 70  st char *locktyp
2790: 65 4e 61 6d 65 28 69 6e 74 20 6c 6f 63 6b 74 79  eName(int lockty
27a0: 70 65 29 7b 0a 20 20 73 77 69 74 63 68 28 20 6c  pe){.  switch( l
27b0: 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 63  ocktype ){.    c
27c0: 61 73 65 20 4e 4f 5f 4c 4f 43 4b 3a 20 72 65 74  ase NO_LOCK: ret
27d0: 75 72 6e 20 22 4e 4f 4e 45 22 3b 0a 20 20 20 20  urn "NONE";.    
27e0: 63 61 73 65 20 53 48 41 52 45 44 5f 4c 4f 43 4b  case SHARED_LOCK
27f0: 3a 20 72 65 74 75 72 6e 20 22 53 48 41 52 45 44  : return "SHARED
2800: 22 3b 0a 20 20 20 20 63 61 73 65 20 52 45 53 45  ";.    case RESE
2810: 52 56 45 44 5f 4c 4f 43 4b 3a 20 72 65 74 75 72  RVED_LOCK: retur
2820: 6e 20 22 52 45 53 45 52 56 45 44 22 3b 0a 20 20  n "RESERVED";.  
2830: 20 20 63 61 73 65 20 50 45 4e 44 49 4e 47 5f 4c    case PENDING_L
2840: 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 50 45 4e  OCK: return "PEN
2850: 44 49 4e 47 22 3b 0a 20 20 20 20 63 61 73 65 20  DING";.    case 
2860: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3a 20  EXCLUSIVE_LOCK: 
2870: 72 65 74 75 72 6e 20 22 45 58 43 4c 55 53 49 56  return "EXCLUSIV
2880: 45 22 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  E";.  }.  return
2890: 20 22 45 52 52 4f 52 22 3b 0a 7d 0a 23 65 6e 64   "ERROR";.}.#end
28a0: 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  if..#ifdef SQLIT
28b0: 45 5f 4c 4f 43 4b 5f 54 52 41 43 45 0a 2f 2a 0a  E_LOCK_TRACE./*.
28c0: 2a 2a 20 50 72 69 6e 74 20 6f 75 74 20 69 6e 66  ** Print out inf
28d0: 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 61  ormation about a
28e0: 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6f 70 65 72 61  ll locking opera
28f0: 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  tions..**.** Thi
2900: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
2910: 64 20 66 6f 72 20 74 72 6f 75 62 6c 65 73 68 6f  d for troublesho
2920: 6f 74 69 6e 67 20 6c 6f 63 6b 73 20 6f 6e 20 6d  oting locks on m
2930: 75 6c 74 69 74 68 72 65 61 64 65 64 0a 2a 2a 20  ultithreaded.** 
2940: 70 6c 61 74 66 6f 72 6d 73 2e 20 20 45 6e 61 62  platforms.  Enab
2950: 6c 65 20 62 79 20 63 6f 6d 70 69 6c 69 6e 67 20  le by compiling 
2960: 77 69 74 68 20 74 68 65 20 2d 44 53 51 4c 49 54  with the -DSQLIT
2970: 45 5f 4c 4f 43 4b 5f 54 52 41 43 45 0a 2a 2a 20  E_LOCK_TRACE.** 
2980: 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 6f 70 74  command-line opt
2990: 69 6f 6e 20 6f 6e 20 74 68 65 20 63 6f 6d 70 69  ion on the compi
29a0: 6c 65 72 2e 20 20 54 68 69 73 20 63 6f 64 65 20  ler.  This code 
29b0: 69 73 20 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a 20 74  is normally.** t
29c0: 75 72 6e 65 64 20 6f 66 66 2e 0a 2a 2f 0a 73 74  urned off..*/.st
29d0: 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b 54 72 61  atic int lockTra
29e0: 63 65 28 69 6e 74 20 66 64 2c 20 69 6e 74 20 6f  ce(int fd, int o
29f0: 70 2c 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20  p, struct flock 
2a00: 2a 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4f 70  *p){.  char *zOp
2a10: 4e 61 6d 65 2c 20 2a 7a 54 79 70 65 3b 0a 20 20  Name, *zType;.  
2a20: 69 6e 74 20 73 3b 0a 20 20 69 6e 74 20 73 61 76  int s;.  int sav
2a30: 65 64 45 72 72 6e 6f 3b 0a 20 20 69 66 28 20 6f  edErrno;.  if( o
2a40: 70 3d 3d 46 5f 47 45 54 4c 4b 20 29 7b 0a 20 20  p==F_GETLK ){.  
2a50: 20 20 7a 4f 70 4e 61 6d 65 20 3d 20 22 47 45 54    zOpName = "GET
2a60: 4c 4b 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  LK";.  }else if(
2a70: 20 6f 70 3d 3d 46 5f 53 45 54 4c 4b 20 29 7b 0a   op==F_SETLK ){.
2a80: 20 20 20 20 7a 4f 70 4e 61 6d 65 20 3d 20 22 53      zOpName = "S
2a90: 45 54 4c 4b 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ETLK";.  }else{.
2aa0: 20 20 20 20 73 20 3d 20 66 63 6e 74 6c 28 66 64      s = fcntl(fd
2ab0: 2c 20 6f 70 2c 20 70 29 3b 0a 20 20 20 20 73 71  , op, p);.    sq
2ac0: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
2ad0: 28 22 66 63 6e 74 6c 20 75 6e 6b 6e 6f 77 6e 20  ("fcntl unknown 
2ae0: 25 64 20 25 64 20 25 64 5c 6e 22 2c 20 66 64 2c  %d %d %d\n", fd,
2af0: 20 6f 70 2c 20 73 29 3b 0a 20 20 20 20 72 65 74   op, s);.    ret
2b00: 75 72 6e 20 73 3b 0a 20 20 7d 0a 20 20 69 66 28  urn s;.  }.  if(
2b10: 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44   p->l_type==F_RD
2b20: 4c 43 4b 20 29 7b 0a 20 20 20 20 7a 54 79 70 65  LCK ){.    zType
2b30: 20 3d 20 22 52 44 4c 43 4b 22 3b 0a 20 20 7d 65   = "RDLCK";.  }e
2b40: 6c 73 65 20 69 66 28 20 70 2d 3e 6c 5f 74 79 70  lse if( p->l_typ
2b50: 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 7b 0a 20 20  e==F_WRLCK ){.  
2b60: 20 20 7a 54 79 70 65 20 3d 20 22 57 52 4c 43 4b    zType = "WRLCK
2b70: 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  ";.  }else if( p
2b80: 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 55 4e 4c 43  ->l_type==F_UNLC
2b90: 4b 20 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d  K ){.    zType =
2ba0: 20 22 55 4e 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73   "UNLCK";.  }els
2bb0: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 30  e{.    assert( 0
2bc0: 20 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   );.  }.  assert
2bd0: 28 20 70 2d 3e 6c 5f 77 68 65 6e 63 65 3d 3d 53  ( p->l_whence==S
2be0: 45 45 4b 5f 53 45 54 20 29 3b 0a 20 20 73 20 3d  EEK_SET );.  s =
2bf0: 20 66 63 6e 74 6c 28 66 64 2c 20 6f 70 2c 20 70   fcntl(fd, op, p
2c00: 29 3b 0a 20 20 73 61 76 65 64 45 72 72 6e 6f 20  );.  savedErrno 
2c10: 3d 20 65 72 72 6e 6f 3b 0a 20 20 73 71 6c 69 74  = errno;.  sqlit
2c20: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 66  e3DebugPrintf("f
2c30: 63 6e 74 6c 20 25 64 20 25 64 20 25 73 20 25 73  cntl %d %d %s %s
2c40: 20 25 64 20 25 64 20 25 64 20 25 64 5c 6e 22 2c   %d %d %d %d\n",
2c50: 0a 20 20 20 20 20 74 68 72 65 61 64 69 64 2c 20  .     threadid, 
2c60: 66 64 2c 20 7a 4f 70 4e 61 6d 65 2c 20 7a 54 79  fd, zOpName, zTy
2c70: 70 65 2c 20 28 69 6e 74 29 70 2d 3e 6c 5f 73 74  pe, (int)p->l_st
2c80: 61 72 74 2c 20 28 69 6e 74 29 70 2d 3e 6c 5f 6c  art, (int)p->l_l
2c90: 65 6e 2c 0a 20 20 20 20 20 28 69 6e 74 29 70 2d  en,.     (int)p-
2ca0: 3e 6c 5f 70 69 64 2c 20 73 29 3b 0a 20 20 69 66  >l_pid, s);.  if
2cb0: 28 20 73 3d 3d 28 2d 31 29 20 26 26 20 6f 70 3d  ( s==(-1) && op=
2cc0: 3d 46 5f 53 45 54 4c 4b 20 26 26 20 28 70 2d 3e  =F_SETLK && (p->
2cd0: 6c 5f 74 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20  l_type==F_RDLCK 
2ce0: 7c 7c 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f  || p->l_type==F_
2cf0: 57 52 4c 43 4b 29 20 29 7b 0a 20 20 20 20 73 74  WRLCK) ){.    st
2d00: 72 75 63 74 20 66 6c 6f 63 6b 20 6c 32 3b 0a 20  ruct flock l2;. 
2d10: 20 20 20 6c 32 20 3d 20 2a 70 3b 0a 20 20 20 20     l2 = *p;.    
2d20: 66 63 6e 74 6c 28 66 64 2c 20 46 5f 47 45 54 4c  fcntl(fd, F_GETL
2d30: 4b 2c 20 26 6c 32 29 3b 0a 20 20 20 20 69 66 28  K, &l2);.    if(
2d40: 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44   l2.l_type==F_RD
2d50: 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 7a 54 79  LCK ){.      zTy
2d60: 70 65 20 3d 20 22 52 44 4c 43 4b 22 3b 0a 20 20  pe = "RDLCK";.  
2d70: 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 32 2e 6c    }else if( l2.l
2d80: 5f 74 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29  _type==F_WRLCK )
2d90: 7b 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20  {.      zType = 
2da0: 22 57 52 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c  "WRLCK";.    }el
2db0: 73 65 20 69 66 28 20 6c 32 2e 6c 5f 74 79 70 65  se if( l2.l_type
2dc0: 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20  ==F_UNLCK ){.   
2dd0: 20 20 20 7a 54 79 70 65 20 3d 20 22 55 4e 4c 43     zType = "UNLC
2de0: 4b 22 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  K";.    }else{. 
2df0: 20 20 20 20 20 61 73 73 65 72 74 28 20 30 20 29       assert( 0 )
2e00: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
2e10: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
2e20: 66 63 6e 74 6c 2d 66 61 69 6c 75 72 65 2d 72 65  fcntl-failure-re
2e30: 61 73 6f 6e 3a 20 25 73 20 25 64 20 25 64 20 25  ason: %s %d %d %
2e40: 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 7a 54 79  d\n",.       zTy
2e50: 70 65 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f 73 74  pe, (int)l2.l_st
2e60: 61 72 74 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f 6c  art, (int)l2.l_l
2e70: 65 6e 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f 70 69  en, (int)l2.l_pi
2e80: 64 29 3b 0a 20 20 7d 0a 20 20 65 72 72 6e 6f 20  d);.  }.  errno 
2e90: 3d 20 73 61 76 65 64 45 72 72 6e 6f 3b 0a 20 20  = savedErrno;.  
2ea0: 72 65 74 75 72 6e 20 73 3b 0a 7d 0a 23 64 65 66  return s;.}.#def
2eb0: 69 6e 65 20 66 63 6e 74 6c 20 6c 6f 63 6b 54 72  ine fcntl lockTr
2ec0: 61 63 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ace.#endif /* SQ
2ed0: 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52 41 43 45 20  LITE_LOCK_TRACE 
2ee0: 2a 2f 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  */..../*.** This
2ef0: 20 72 6f 75 74 69 6e 65 20 74 72 61 6e 73 6c 61   routine transla
2f00: 74 65 73 20 61 20 73 74 61 6e 64 61 72 64 20 50  tes a standard P
2f10: 4f 53 49 58 20 65 72 72 6e 6f 20 63 6f 64 65 20  OSIX errno code 
2f20: 69 6e 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a  into something.*
2f30: 2a 20 75 73 65 66 75 6c 20 74 6f 20 74 68 65 20  * useful to the 
2f40: 63 6c 69 65 6e 74 73 20 6f 66 20 74 68 65 20 73  clients of the s
2f50: 71 6c 69 74 65 33 20 66 75 6e 63 74 69 6f 6e 73  qlite3 functions
2f60: 2e 20 20 53 70 65 63 69 66 69 63 61 6c 6c 79 2c  .  Specifically,
2f70: 20 69 74 20 69 73 0a 2a 2a 20 69 6e 74 65 6e 64   it is.** intend
2f80: 65 64 20 74 6f 20 74 72 61 6e 73 6c 61 74 65 20  ed to translate 
2f90: 61 20 76 61 72 69 65 74 79 20 6f 66 20 22 74 72  a variety of "tr
2fa0: 79 20 61 67 61 69 6e 22 20 65 72 72 6f 72 73 20  y again" errors 
2fb0: 69 6e 74 6f 20 53 51 4c 49 54 45 5f 42 55 53 59  into SQLITE_BUSY
2fc0: 0a 2a 2a 20 61 6e 64 20 61 20 76 61 72 69 65 74  .** and a variet
2fd0: 79 20 6f 66 20 22 70 6c 65 61 73 65 20 63 6c 6f  y of "please clo
2fe0: 73 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  se the file desc
2ff0: 72 69 70 74 6f 72 20 4e 4f 57 22 20 65 72 72 6f  riptor NOW" erro
3000: 72 73 20 69 6e 74 6f 20 0a 2a 2a 20 53 51 4c 49  rs into .** SQLI
3010: 54 45 5f 49 4f 45 52 52 0a 2a 2a 20 0a 2a 2a 20  TE_IOERR.** .** 
3020: 45 72 72 6f 72 73 20 64 75 72 69 6e 67 20 69 6e  Errors during in
3030: 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20  itialization of 
3040: 6c 6f 63 6b 73 2c 20 6f 72 20 66 69 6c 65 20 73  locks, or file s
3050: 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20 66 6f  ystem support fo
3060: 72 20 6c 6f 63 6b 73 2c 0a 2a 2a 20 73 68 6f 75  r locks,.** shou
3070: 6c 64 20 68 61 6e 64 6c 65 20 45 4e 4f 4c 43 4b  ld handle ENOLCK
3080: 2c 20 45 4e 4f 54 53 55 50 2c 20 45 4f 50 4e 4f  , ENOTSUP, EOPNO
3090: 54 53 55 50 50 20 73 65 70 61 72 61 74 65 6c 79  TSUPP separately
30a0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
30b0: 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
30c0: 6f 73 69 78 45 72 72 6f 72 28 69 6e 74 20 70 6f  osixError(int po
30d0: 73 69 78 45 72 72 6f 72 2c 20 69 6e 74 20 73 71  sixError, int sq
30e0: 6c 69 74 65 49 4f 45 72 72 29 20 7b 0a 20 20 73  liteIOErr) {.  s
30f0: 77 69 74 63 68 20 28 70 6f 73 69 78 45 72 72 6f  witch (posixErro
3100: 72 29 20 7b 0a 20 20 63 61 73 65 20 30 3a 20 0a  r) {.  case 0: .
3110: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
3120: 45 5f 4f 4b 3b 0a 20 20 20 20 0a 20 20 63 61 73  E_OK;.    .  cas
3130: 65 20 45 41 47 41 49 4e 3a 0a 20 20 63 61 73 65  e EAGAIN:.  case
3140: 20 45 54 49 4d 45 44 4f 55 54 3a 0a 20 20 63 61   ETIMEDOUT:.  ca
3150: 73 65 20 45 42 55 53 59 3a 0a 20 20 63 61 73 65  se EBUSY:.  case
3160: 20 45 49 4e 54 52 3a 0a 20 20 63 61 73 65 20 45   EINTR:.  case E
3170: 4e 4f 4c 43 4b 3a 20 20 0a 20 20 20 20 2f 2a 20  NOLCK:  .    /* 
3180: 72 61 6e 64 6f 6d 20 4e 46 53 20 72 65 74 72 79  random NFS retry
3190: 20 65 72 72 6f 72 2c 20 75 6e 6c 65 73 73 20 64   error, unless d
31a0: 75 72 69 6e 67 20 66 69 6c 65 20 73 79 73 74 65  uring file syste
31b0: 6d 20 73 75 70 70 6f 72 74 20 0a 20 20 20 20 20  m support .     
31c0: 2a 20 69 6e 74 72 6f 73 70 65 63 74 69 6f 6e 2c  * introspection,
31d0: 20 69 6e 20 77 68 69 63 68 20 69 74 20 61 63 74   in which it act
31e0: 75 61 6c 6c 79 20 6d 65 61 6e 73 20 77 68 61 74  ually means what
31f0: 20 69 74 20 73 61 79 73 20 2a 2f 0a 20 20 20 20   it says */.    
3200: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
3210: 53 59 3b 0a 20 20 20 20 0a 20 20 63 61 73 65 20  SY;.    .  case 
3220: 45 41 43 43 45 53 3a 20 0a 20 20 20 20 2f 2a 20  EACCES: .    /* 
3230: 45 41 43 43 45 53 20 69 73 20 6c 69 6b 65 20 45  EACCES is like E
3240: 41 47 41 49 4e 20 64 75 72 69 6e 67 20 6c 6f 63  AGAIN during loc
3250: 6b 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73 2c  king operations,
3260: 20 62 75 74 20 6e 6f 74 20 61 6e 79 20 6f 74 68   but not any oth
3270: 65 72 20 74 69 6d 65 2a 2f 0a 20 20 20 20 69 66  er time*/.    if
3280: 28 20 28 73 71 6c 69 74 65 49 4f 45 72 72 20 3d  ( (sqliteIOErr =
3290: 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c  = SQLITE_IOERR_L
32a0: 4f 43 4b 29 20 7c 7c 20 0a 09 28 73 71 6c 69 74  OCK) || ..(sqlit
32b0: 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49 54 45  eIOErr == SQLITE
32c0: 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 20 7c  _IOERR_UNLOCK) |
32d0: 7c 20 0a 09 28 73 71 6c 69 74 65 49 4f 45 72 72  | ..(sqliteIOErr
32e0: 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52   == SQLITE_IOERR
32f0: 5f 52 44 4c 4f 43 4b 29 20 7c 7c 0a 09 28 73 71  _RDLOCK) ||..(sq
3300: 6c 69 74 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c  liteIOErr == SQL
3310: 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52  ITE_IOERR_CHECKR
3320: 45 53 45 52 56 45 44 4c 4f 43 4b 29 20 29 7b 0a  ESERVEDLOCK) ){.
3330: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
3340: 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a  ITE_BUSY;.    }.
3350: 20 20 20 20 2f 2a 20 65 6c 73 65 20 66 61 6c 6c      /* else fall
3360: 20 74 68 72 6f 75 67 68 20 2a 2f 0a 20 20 63 61   through */.  ca
3370: 73 65 20 45 50 45 52 4d 3a 20 0a 20 20 20 20 72  se EPERM: .    r
3380: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52  eturn SQLITE_PER
3390: 4d 3b 0a 20 20 20 20 0a 20 20 63 61 73 65 20 45  M;.    .  case E
33a0: 44 45 41 44 4c 4b 3a 0a 20 20 20 20 72 65 74 75  DEADLK:.    retu
33b0: 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
33c0: 42 4c 4f 43 4b 45 44 3b 0a 20 20 20 20 0a 23 69  BLOCKED;.    .#i
33d0: 66 20 45 4f 50 4e 4f 54 53 55 50 50 21 3d 45 4e  f EOPNOTSUPP!=EN
33e0: 4f 54 53 55 50 0a 20 20 63 61 73 65 20 45 4f 50  OTSUP.  case EOP
33f0: 4e 4f 54 53 55 50 50 3a 20 0a 20 20 20 20 2f 2a  NOTSUPP: .    /*
3400: 20 73 6f 6d 65 74 68 69 6e 67 20 77 65 6e 74 20   something went 
3410: 74 65 72 72 69 62 6c 79 20 61 77 72 79 2c 20 75  terribly awry, u
3420: 6e 6c 65 73 73 20 64 75 72 69 6e 67 20 66 69 6c  nless during fil
3430: 65 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74  e system support
3440: 20 0a 20 20 20 20 20 2a 20 69 6e 74 72 6f 73 70   .     * introsp
3450: 65 63 74 69 6f 6e 2c 20 69 6e 20 77 68 69 63 68  ection, in which
3460: 20 69 74 20 61 63 74 75 61 6c 6c 79 20 6d 65 61   it actually mea
3470: 6e 73 20 77 68 61 74 20 69 74 20 73 61 79 73 20  ns what it says 
3480: 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  */.#endif.#ifdef
3490: 20 45 4e 4f 54 53 55 50 0a 20 20 63 61 73 65 20   ENOTSUP.  case 
34a0: 45 4e 4f 54 53 55 50 3a 20 0a 20 20 20 20 2f 2a  ENOTSUP: .    /*
34b0: 20 69 6e 76 61 6c 69 64 20 66 64 2c 20 75 6e 6c   invalid fd, unl
34c0: 65 73 73 20 64 75 72 69 6e 67 20 66 69 6c 65 20  ess during file 
34d0: 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20 69  system support i
34e0: 6e 74 72 6f 73 70 65 63 74 69 6f 6e 2c 20 69 6e  ntrospection, in
34f0: 20 77 68 69 63 68 20 0a 20 20 20 20 20 2a 20 69   which .     * i
3500: 74 20 61 63 74 75 61 6c 6c 79 20 6d 65 61 6e 73  t actually means
3510: 20 77 68 61 74 20 69 74 20 73 61 79 73 20 2a 2f   what it says */
3520: 0a 23 65 6e 64 69 66 0a 20 20 63 61 73 65 20 45  .#endif.  case E
3530: 49 4f 3a 0a 20 20 63 61 73 65 20 45 42 41 44 46  IO:.  case EBADF
3540: 3a 0a 20 20 63 61 73 65 20 45 49 4e 56 41 4c 3a  :.  case EINVAL:
3550: 0a 20 20 63 61 73 65 20 45 4e 4f 54 43 4f 4e 4e  .  case ENOTCONN
3560: 3a 0a 20 20 63 61 73 65 20 45 4e 4f 44 45 56 3a  :.  case ENODEV:
3570: 0a 20 20 63 61 73 65 20 45 4e 58 49 4f 3a 0a 20  .  case ENXIO:. 
3580: 20 63 61 73 65 20 45 4e 4f 45 4e 54 3a 0a 20 20   case ENOENT:.  
3590: 63 61 73 65 20 45 53 54 41 4c 45 3a 0a 20 20 63  case ESTALE:.  c
35a0: 61 73 65 20 45 4e 4f 53 59 53 3a 0a 20 20 20 20  ase ENOSYS:.    
35b0: 2f 2a 20 74 68 65 73 65 20 73 68 6f 75 6c 64 20  /* these should 
35c0: 66 6f 72 63 65 20 74 68 65 20 63 6c 69 65 6e 74  force the client
35d0: 20 74 6f 20 63 6c 6f 73 65 20 74 68 65 20 66 69   to close the fi
35e0: 6c 65 20 61 6e 64 20 72 65 63 6f 6e 6e 65 63 74  le and reconnect
35f0: 20 2a 2f 0a 20 20 20 20 0a 20 20 64 65 66 61 75   */.    .  defau
3600: 6c 74 3a 20 0a 20 20 20 20 72 65 74 75 72 6e 20  lt: .    return 
3610: 73 71 6c 69 74 65 49 4f 45 72 72 3b 0a 20 20 7d  sqliteIOErr;.  }
3620: 0a 7d 0a 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  .}..../*********
3630: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3640: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3650: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3660: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3670: 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
3680: 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 55  ******** Begin U
3690: 6e 69 71 75 65 20 46 69 6c 65 20 49 44 20 55 74  nique File ID Ut
36a0: 69 6c 69 74 79 20 55 73 65 64 20 42 79 20 56 78  ility Used By Vx
36b0: 57 6f 72 6b 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  Works **********
36c0: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4f 6e 20 6d  *****.**.** On m
36d0: 6f 73 74 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  ost versions of 
36e0: 75 6e 69 78 2c 20 77 65 20 63 61 6e 20 67 65 74  unix, we can get
36f0: 20 61 20 75 6e 69 71 75 65 20 49 44 20 66 6f 72   a unique ID for
3700: 20 61 20 66 69 6c 65 20 62 79 20 63 6f 6e 63 61   a file by conca
3710: 74 65 6e 61 74 69 6e 67 0a 2a 2a 20 74 68 65 20  tenating.** the 
3720: 64 65 76 69 63 65 20 6e 75 6d 62 65 72 20 61 6e  device number an
3730: 64 20 74 68 65 20 69 6e 6f 64 65 20 6e 75 6d 62  d the inode numb
3740: 65 72 2e 20 20 42 75 74 20 74 68 69 73 20 64 6f  er.  But this do
3750: 65 73 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 56  es not work on V
3760: 78 57 6f 72 6b 73 2e 0a 2a 2a 20 4f 6e 20 56 78  xWorks..** On Vx
3770: 57 6f 72 6b 73 2c 20 61 20 75 6e 69 71 75 65 20  Works, a unique 
3780: 66 69 6c 65 20 69 64 20 6d 75 73 74 20 62 65 20  file id must be 
3790: 62 61 73 65 64 20 6f 6e 20 74 68 65 20 63 61 6e  based on the can
37a0: 6f 6e 69 63 61 6c 20 66 69 6c 65 6e 61 6d 65 2e  onical filename.
37b0: 0a 2a 2a 0a 2a 2a 20 41 20 70 6f 69 6e 74 65 72  .**.** A pointer
37c0: 20 74 6f 20 61 6e 20 69 6e 73 74 61 6e 63 65 20   to an instance 
37d0: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
37e0: 20 73 74 72 75 63 74 75 72 65 20 63 61 6e 20 62   structure can b
37f0: 65 20 75 73 65 64 20 61 73 20 61 0a 2a 2a 20 75  e used as a.** u
3800: 6e 69 71 75 65 20 66 69 6c 65 20 49 44 20 69 6e  nique file ID in
3810: 20 56 78 57 6f 72 6b 73 2e 20 20 45 61 63 68 20   VxWorks.  Each 
3820: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73  instance of this
3830: 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61   structure conta
3840: 69 6e 73 0a 2a 2a 20 61 20 63 6f 70 79 20 6f 66  ins.** a copy of
3850: 20 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c 20 66   the canonical f
3860: 69 6c 65 6e 61 6d 65 2e 20 20 54 68 65 72 65 20  ilename.  There 
3870: 69 73 20 61 6c 73 6f 20 61 20 72 65 66 65 72 65  is also a refere
3880: 6e 63 65 20 63 6f 75 6e 74 2e 20 20 0a 2a 2a 20  nce count.  .** 
3890: 54 68 65 20 73 74 72 75 63 74 75 72 65 20 69 73  The structure is
38a0: 20 72 65 63 6c 61 69 6d 65 64 20 77 68 65 6e 20   reclaimed when 
38b0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 6f  the number of po
38c0: 69 6e 74 65 72 73 20 74 6f 20 69 74 20 64 72 6f  inters to it dro
38d0: 70 73 20 74 6f 0a 2a 2a 20 7a 65 72 6f 2e 0a 2a  ps to.** zero..*
38e0: 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20 6e  *.** There are n
38f0: 65 76 65 72 20 76 65 72 79 20 6d 61 6e 79 20 66  ever very many f
3900: 69 6c 65 73 20 6f 70 65 6e 20 61 74 20 6f 6e 65  iles open at one
3910: 20 74 69 6d 65 20 61 6e 64 20 6c 6f 6f 6b 75 70   time and lookup
3920: 73 20 61 72 65 20 6e 6f 74 0a 2a 2a 20 61 20 70  s are not.** a p
3930: 65 72 66 6f 72 6d 61 6e 63 65 2d 63 72 69 74 69  erformance-criti
3940: 63 61 6c 20 70 61 74 68 2c 20 73 6f 20 69 74 20  cal path, so it 
3950: 69 73 20 73 75 66 66 69 63 69 65 6e 74 20 74 6f  is sufficient to
3960: 20 70 75 74 20 74 68 65 73 65 0a 2a 2a 20 73 74   put these.** st
3970: 72 75 63 74 75 72 65 73 20 6f 6e 20 61 20 6c 69  ructures on a li
3980: 6e 6b 65 64 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74  nked list..*/.st
3990: 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65  ruct vxworksFile
39a0: 49 64 20 7b 0a 20 20 73 74 72 75 63 74 20 76 78  Id {.  struct vx
39b0: 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 4e 65  worksFileId *pNe
39c0: 78 74 3b 20 20 2f 2a 20 4e 65 78 74 20 69 6e 20  xt;  /* Next in 
39d0: 61 20 6c 69 73 74 20 6f 66 20 74 68 65 6d 20 61  a list of them a
39e0: 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66  ll */.  int nRef
39f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3a00: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
3a10: 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  of references to
3a20: 20 74 68 69 73 20 6f 6e 65 20 2a 2f 0a 20 20 69   this one */.  i
3a30: 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20  nt nName;       
3a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3a50: 4c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 7a 43  Length of the zC
3a60: 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 5b 5d 20 73  anonicalName[] s
3a70: 74 72 69 6e 67 20 2a 2f 0a 20 20 63 68 61 72 20  tring */.  char 
3a80: 2a 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 3b  *zCanonicalName;
3a90: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61 6e 6f           /* Cano
3aa0: 6e 69 63 61 6c 20 66 69 6c 65 6e 61 6d 65 20 2a  nical filename *
3ab0: 2f 0a 7d 3b 0a 0a 23 69 66 20 4f 53 5f 56 58 57  /.};..#if OS_VXW
3ac0: 4f 52 4b 53 0a 2f 2a 20 0a 2a 2a 20 41 6c 6c 20  ORKS./* .** All 
3ad0: 75 6e 69 71 75 65 20 66 69 6c 65 6e 61 6d 65 73  unique filenames
3ae0: 20 61 72 65 20 68 65 6c 64 20 6f 6e 20 61 20 6c   are held on a l
3af0: 69 6e 6b 65 64 20 6c 69 73 74 20 68 65 61 64 65  inked list heade
3b00: 64 20 62 79 20 74 68 69 73 0a 2a 2a 20 76 61 72  d by this.** var
3b10: 69 61 62 6c 65 3a 0a 2a 2f 0a 73 74 61 74 69 63  iable:.*/.static
3b20: 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46   struct vxworksF
3b30: 69 6c 65 49 64 20 2a 76 78 77 6f 72 6b 73 46 69  ileId *vxworksFi
3b40: 6c 65 4c 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a 0a  leList = 0;../*.
3b50: 2a 2a 20 53 69 6d 70 6c 69 66 79 20 61 20 66 69  ** Simplify a fi
3b60: 6c 65 6e 61 6d 65 20 69 6e 74 6f 20 69 74 73 20  lename into its 
3b70: 63 61 6e 6f 6e 69 63 61 6c 20 66 6f 72 6d 0a 2a  canonical form.*
3b80: 2a 20 62 79 20 6d 61 6b 69 6e 67 20 74 68 65 20  * by making the 
3b90: 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 6e 67 65  following change
3ba0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 2a 20 72 65 6d 6f  s:.**.**  * remo
3bb0: 76 69 6e 67 20 61 6e 79 20 74 72 61 69 6c 69 6e  ving any trailin
3bc0: 67 20 61 6e 64 20 64 75 70 6c 69 63 61 74 65 20  g and duplicate 
3bd0: 2f 0a 2a 2a 20 20 2a 20 63 6f 6e 76 65 72 74 20  /.**  * convert 
3be0: 2f 2e 2f 20 69 6e 74 6f 20 6a 75 73 74 20 2f 0a  /./ into just /.
3bf0: 2a 2a 20 20 2a 20 63 6f 6e 76 65 72 74 20 2f 41  **  * convert /A
3c00: 2f 2e 2e 2f 20 77 68 65 72 65 20 41 20 69 73 20  /../ where A is 
3c10: 61 6e 79 20 73 69 6d 70 6c 65 20 6e 61 6d 65 20  any simple name 
3c20: 69 6e 74 6f 20 6a 75 73 74 20 2f 0a 2a 2a 0a 2a  into just /.**.*
3c30: 2a 20 43 68 61 6e 67 65 73 20 61 72 65 20 6d 61  * Changes are ma
3c40: 64 65 20 69 6e 2d 70 6c 61 63 65 2e 20 20 52 65  de in-place.  Re
3c50: 74 75 72 6e 20 74 68 65 20 6e 65 77 20 6e 61 6d  turn the new nam
3c60: 65 20 6c 65 6e 67 74 68 2e 0a 2a 2a 0a 2a 2a 20  e length..**.** 
3c70: 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c  The original fil
3c80: 65 6e 61 6d 65 20 69 73 20 69 6e 20 7a 5b 30 2e  ename is in z[0.
3c90: 2e 6e 2d 31 5d 2e 20 20 52 65 74 75 72 6e 20 74  .n-1].  Return t
3ca0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  he number of.** 
3cb0: 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 74 68  characters in th
3cc0: 65 20 73 69 6d 70 6c 69 66 69 65 64 20 6e 61 6d  e simplified nam
3cd0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
3ce0: 20 76 78 77 6f 72 6b 73 53 69 6d 70 6c 69 66 79   vxworksSimplify
3cf0: 4e 61 6d 65 28 63 68 61 72 20 2a 7a 2c 20 69 6e  Name(char *z, in
3d00: 74 20 6e 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a  t n){.  int i, j
3d10: 3b 0a 20 20 77 68 69 6c 65 28 20 6e 3e 31 20 26  ;.  while( n>1 &
3d20: 26 20 7a 5b 6e 2d 31 5d 3d 3d 27 2f 27 20 29 7b  & z[n-1]=='/' ){
3d30: 20 6e 2d 2d 3b 20 7d 0a 20 20 66 6f 72 28 69 3d   n--; }.  for(i=
3d40: 6a 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a  j=0; i<n; i++){.
3d50: 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 2f      if( z[i]=='/
3d60: 27 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 7a  ' ){.      if( z
3d70: 5b 69 2b 31 5d 3d 3d 27 2f 27 20 29 20 63 6f 6e  [i+1]=='/' ) con
3d80: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28  tinue;.      if(
3d90: 20 7a 5b 69 2b 31 5d 3d 3d 27 2e 27 20 26 26 20   z[i+1]=='.' && 
3da0: 69 2b 32 3c 6e 20 26 26 20 7a 5b 69 2b 32 5d 3d  i+2<n && z[i+2]=
3db0: 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='/' ){.        
3dc0: 69 20 2b 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  i += 1;.        
3dd0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
3de0: 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2b  }.      if( z[i+
3df0: 31 5d 3d 3d 27 2e 27 20 26 26 20 69 2b 33 3c 6e  1]=='.' && i+3<n
3e00: 20 26 26 20 7a 5b 69 2b 32 5d 3d 3d 27 2e 27 20   && z[i+2]=='.' 
3e10: 26 26 20 7a 5b 69 2b 33 5d 3d 3d 27 2f 27 20 29  && z[i+3]=='/' )
3e20: 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  {.        while(
3e30: 20 6a 3e 30 20 26 26 20 7a 5b 6a 2d 31 5d 21 3d   j>0 && z[j-1]!=
3e40: 27 2f 27 20 29 7b 20 6a 2d 2d 3b 20 7d 0a 20 20  '/' ){ j--; }.  
3e50: 20 20 20 20 20 20 69 66 28 20 6a 3e 30 20 29 7b        if( j>0 ){
3e60: 20 6a 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 20 20   j--; }.        
3e70: 69 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 20 20  i += 2;.        
3e80: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
3e90: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 5b 6a 2b  }.    }.    z[j+
3ea0: 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a 20 20 7d 0a 20  +] = z[i];.  }. 
3eb0: 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20 72 65 74   z[j] = 0;.  ret
3ec0: 75 72 6e 20 6a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn j;.}../*.** 
3ed0: 46 69 6e 64 20 61 20 75 6e 69 71 75 65 20 66 69  Find a unique fi
3ee0: 6c 65 20 49 44 20 66 6f 72 20 74 68 65 20 67 69  le ID for the gi
3ef0: 76 65 6e 20 61 62 73 6f 6c 75 74 65 20 70 61 74  ven absolute pat
3f00: 68 6e 61 6d 65 2e 20 20 52 65 74 75 72 6e 0a 2a  hname.  Return.*
3f10: 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  * a pointer to t
3f20: 68 65 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64  he vxworksFileId
3f30: 20 6f 62 6a 65 63 74 2e 20 20 54 68 69 73 20 70   object.  This p
3f40: 6f 69 6e 74 65 72 20 69 73 20 74 68 65 20 75 6e  ointer is the un
3f50: 69 71 75 65 0a 2a 2a 20 66 69 6c 65 20 49 44 2e  ique.** file ID.
3f60: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 52 65 66 20  .**.** The nRef 
3f70: 66 69 65 6c 64 20 6f 66 20 74 68 65 20 76 78 77  field of the vxw
3f80: 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65 63  orksFileId objec
3f90: 74 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64  t is incremented
3fa0: 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20 6f   before.** the o
3fb0: 62 6a 65 63 74 20 69 73 20 72 65 74 75 72 6e 65  bject is returne
3fc0: 64 2e 20 20 41 20 6e 65 77 20 76 78 77 6f 72 6b  d.  A new vxwork
3fd0: 73 46 69 6c 65 49 64 20 6f 62 6a 65 63 74 20 69  sFileId object i
3fe0: 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64  s created.** and
3ff0: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 67 6c   added to the gl
4000: 6f 62 61 6c 20 6c 69 73 74 20 69 66 20 6e 65 63  obal list if nec
4010: 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66  essary..**.** If
4020: 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61   a memory alloca
4030: 74 69 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  tion error occur
4040: 73 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a  s, return NULL..
4050: 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74  */.static struct
4060: 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a   vxworksFileId *
4070: 76 78 77 6f 72 6b 73 46 69 6e 64 46 69 6c 65 49  vxworksFindFileI
4080: 64 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41  d(const char *zA
4090: 62 73 6f 6c 75 74 65 4e 61 6d 65 29 7b 0a 20 20  bsoluteName){.  
40a0: 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69  struct vxworksFi
40b0: 6c 65 49 64 20 2a 70 4e 65 77 3b 20 20 20 20 20  leId *pNew;     
40c0: 20 20 20 20 2f 2a 20 73 65 61 72 63 68 20 6b 65      /* search ke
40d0: 79 20 61 6e 64 20 6e 65 77 20 66 69 6c 65 20 49  y and new file I
40e0: 44 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 76 78  D */.  struct vx
40f0: 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 43 61  worksFileId *pCa
4100: 6e 64 69 64 61 74 65 3b 20 20 20 2f 2a 20 46 6f  ndidate;   /* Fo
4110: 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 65  r looping over e
4120: 78 69 73 74 69 6e 67 20 66 69 6c 65 20 49 44 73  xisting file IDs
4130: 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20   */.  int n;    
4140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4150: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e            /* Len
4160: 67 74 68 20 6f 66 20 7a 41 62 73 6f 6c 75 74 65  gth of zAbsolute
4170: 4e 61 6d 65 20 73 74 72 69 6e 67 20 2a 2f 0a 0a  Name string */..
4180: 20 20 61 73 73 65 72 74 28 20 7a 41 62 73 6f 6c    assert( zAbsol
4190: 75 74 65 4e 61 6d 65 5b 30 5d 3d 3d 27 2f 27 20  uteName[0]=='/' 
41a0: 29 3b 0a 20 20 6e 20 3d 20 28 69 6e 74 29 73 74  );.  n = (int)st
41b0: 72 6c 65 6e 28 7a 41 62 73 6f 6c 75 74 65 4e 61  rlen(zAbsoluteNa
41c0: 6d 65 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71  me);.  pNew = sq
41d0: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69  lite3_malloc( si
41e0: 7a 65 6f 66 28 2a 70 4e 65 77 29 20 2b 20 28 6e  zeof(*pNew) + (n
41f0: 2b 31 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65  +1) );.  if( pNe
4200: 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  w==0 ) return 0;
4210: 0a 20 20 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69  .  pNew->zCanoni
4220: 63 61 6c 4e 61 6d 65 20 3d 20 28 63 68 61 72 2a  calName = (char*
4230: 29 26 70 4e 65 77 5b 31 5d 3b 0a 20 20 6d 65 6d  )&pNew[1];.  mem
4240: 63 70 79 28 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e  cpy(pNew->zCanon
4250: 69 63 61 6c 4e 61 6d 65 2c 20 7a 41 62 73 6f 6c  icalName, zAbsol
4260: 75 74 65 4e 61 6d 65 2c 20 6e 2b 31 29 3b 0a 20  uteName, n+1);. 
4270: 20 6e 20 3d 20 76 78 77 6f 72 6b 73 53 69 6d 70   n = vxworksSimp
4280: 6c 69 66 79 4e 61 6d 65 28 70 4e 65 77 2d 3e 7a  lifyName(pNew->z
4290: 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20 6e  CanonicalName, n
42a0: 29 3b 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68 20  );..  /* Search 
42b0: 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e 67 20  for an existing 
42c0: 65 6e 74 72 79 20 74 68 61 74 20 6d 61 74 63 68  entry that match
42d0: 69 6e 67 20 74 68 65 20 63 61 6e 6f 6e 69 63 61  ing the canonica
42e0: 6c 20 6e 61 6d 65 2e 0a 20 20 2a 2a 20 49 66 20  l name..  ** If 
42f0: 66 6f 75 6e 64 2c 20 69 6e 63 72 65 6d 65 6e 74  found, increment
4300: 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63   the reference c
4310: 6f 75 6e 74 20 61 6e 64 20 72 65 74 75 72 6e 20  ount and return 
4320: 61 20 70 6f 69 6e 74 65 72 20 74 6f 0a 20 20 2a  a pointer to.  *
4330: 2a 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 66  * the existing f
4340: 69 6c 65 20 49 44 2e 0a 20 20 2a 2f 0a 20 20 75  ile ID..  */.  u
4350: 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
4360: 0a 20 20 66 6f 72 28 70 43 61 6e 64 69 64 61 74  .  for(pCandidat
4370: 65 3d 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73  e=vxworksFileLis
4380: 74 3b 20 70 43 61 6e 64 69 64 61 74 65 3b 20 70  t; pCandidate; p
4390: 43 61 6e 64 69 64 61 74 65 3d 70 43 61 6e 64 69  Candidate=pCandi
43a0: 64 61 74 65 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  date->pNext){.  
43b0: 20 20 69 66 28 20 70 43 61 6e 64 69 64 61 74 65    if( pCandidate
43c0: 2d 3e 6e 4e 61 6d 65 3d 3d 6e 20 0a 20 20 20 20  ->nName==n .    
43d0: 20 26 26 20 6d 65 6d 63 6d 70 28 70 43 61 6e 64   && memcmp(pCand
43e0: 69 64 61 74 65 2d 3e 7a 43 61 6e 6f 6e 69 63 61  idate->zCanonica
43f0: 6c 4e 61 6d 65 2c 20 70 4e 65 77 2d 3e 7a 43 61  lName, pNew->zCa
4400: 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20 6e 29 3d  nonicalName, n)=
4410: 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  =0.    ){.      
4420: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e   sqlite3_free(pN
4430: 65 77 29 3b 0a 20 20 20 20 20 20 20 70 43 61 6e  ew);.       pCan
4440: 64 69 64 61 74 65 2d 3e 6e 52 65 66 2b 2b 3b 0a  didate->nRef++;.
4450: 20 20 20 20 20 20 20 75 6e 69 78 4c 65 61 76 65         unixLeave
4460: 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 20 20 20  Mutex();.       
4470: 72 65 74 75 72 6e 20 70 43 61 6e 64 69 64 61 74  return pCandidat
4480: 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  e;.    }.  }..  
4490: 2f 2a 20 4e 6f 20 6d 61 74 63 68 20 77 61 73 20  /* No match was 
44a0: 66 6f 75 6e 64 2e 20 20 57 65 20 77 69 6c 6c 20  found.  We will 
44b0: 6d 61 6b 65 20 61 20 6e 65 77 20 66 69 6c 65 20  make a new file 
44c0: 49 44 20 2a 2f 0a 20 20 70 4e 65 77 2d 3e 6e 52  ID */.  pNew->nR
44d0: 65 66 20 3d 20 31 3b 0a 20 20 70 4e 65 77 2d 3e  ef = 1;.  pNew->
44e0: 6e 4e 61 6d 65 20 3d 20 6e 3b 0a 20 20 70 4e 65  nName = n;.  pNe
44f0: 77 2d 3e 70 4e 65 78 74 20 3d 20 76 78 77 6f 72  w->pNext = vxwor
4500: 6b 73 46 69 6c 65 4c 69 73 74 3b 0a 20 20 76 78  ksFileList;.  vx
4510: 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74 20 3d 20  worksFileList = 
4520: 70 4e 65 77 3b 0a 20 20 75 6e 69 78 4c 65 61 76  pNew;.  unixLeav
4530: 65 4d 75 74 65 78 28 29 3b 0a 20 20 72 65 74 75  eMutex();.  retu
4540: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pNew;.}../*.*
4550: 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20  * Decrement the 
4560: 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
4570: 6f 6e 20 61 20 76 78 77 6f 72 6b 73 46 69 6c 65  on a vxworksFile
4580: 49 64 20 6f 62 6a 65 63 74 2e 20 20 46 72 65 65  Id object.  Free
4590: 0a 2a 2a 20 74 68 65 20 6f 62 6a 65 63 74 20 77  .** the object w
45a0: 68 65 6e 20 74 68 65 20 72 65 66 65 72 65 6e 63  hen the referenc
45b0: 65 20 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20  e count reaches 
45c0: 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  zero..*/.static 
45d0: 76 6f 69 64 20 76 78 77 6f 72 6b 73 52 65 6c 65  void vxworksRele
45e0: 61 73 65 46 69 6c 65 49 64 28 73 74 72 75 63 74  aseFileId(struct
45f0: 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a   vxworksFileId *
4600: 70 49 64 29 7b 0a 20 20 75 6e 69 78 45 6e 74 65  pId){.  unixEnte
4610: 72 4d 75 74 65 78 28 29 3b 0a 20 20 61 73 73 65  rMutex();.  asse
4620: 72 74 28 20 70 49 64 2d 3e 6e 52 65 66 3e 30 20  rt( pId->nRef>0 
4630: 29 3b 0a 20 20 70 49 64 2d 3e 6e 52 65 66 2d 2d  );.  pId->nRef--
4640: 3b 0a 20 20 69 66 28 20 70 49 64 2d 3e 6e 52 65  ;.  if( pId->nRe
4650: 66 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 72 75  f==0 ){.    stru
4660: 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64  ct vxworksFileId
4670: 20 2a 2a 70 70 3b 0a 20 20 20 20 66 6f 72 28 70   **pp;.    for(p
4680: 70 3d 26 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69  p=&vxworksFileLi
4690: 73 74 3b 20 2a 70 70 20 26 26 20 2a 70 70 21 3d  st; *pp && *pp!=
46a0: 70 49 64 3b 20 70 70 20 3d 20 26 28 28 2a 70 70  pId; pp = &((*pp
46b0: 29 2d 3e 70 4e 65 78 74 29 29 7b 7d 0a 20 20 20  )->pNext)){}.   
46c0: 20 61 73 73 65 72 74 28 20 2a 70 70 3d 3d 70 49   assert( *pp==pI
46d0: 64 20 29 3b 0a 20 20 20 20 2a 70 70 20 3d 20 70  d );.    *pp = p
46e0: 49 64 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 73  Id->pNext;.    s
46f0: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49 64 29  qlite3_free(pId)
4700: 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 4c 65 61 76  ;.  }.  unixLeav
4710: 65 4d 75 74 65 78 28 29 3b 0a 7d 0a 23 65 6e 64  eMutex();.}.#end
4720: 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53  if /* OS_VXWORKS
4730: 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   */./***********
4740: 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 55 6e 69 71  **** End of Uniq
4750: 75 65 20 46 69 6c 65 20 49 44 20 55 74 69 6c 69  ue File ID Utili
4760: 74 79 20 55 73 65 64 20 42 79 20 56 78 57 6f 72  ty Used By VxWor
4770: 6b 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ks *************
4780: 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
4790: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
47a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
47b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
47c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
47d0: 2a 2a 2f 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  **/.../*********
47e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
47f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4800: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4810: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4820: 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
4830: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4840: 2a 20 50 6f 73 69 78 20 41 64 76 69 73 6f 72 79  * Posix Advisory
4850: 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a   Locking *******
4860: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4870: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 50 4f 53 49  *****.**.** POSI
4880: 58 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73  X advisory locks
4890: 20 61 72 65 20 62 72 6f 6b 65 6e 20 62 79 20 64   are broken by d
48a0: 65 73 69 67 6e 2e 20 20 41 4e 53 49 20 53 54 44  esign.  ANSI STD
48b0: 20 31 30 30 33 2e 31 20 28 31 39 39 36 29 0a 2a   1003.1 (1996).*
48c0: 2a 20 73 65 63 74 69 6f 6e 20 36 2e 35 2e 32 2e  * section 6.5.2.
48d0: 32 20 6c 69 6e 65 73 20 34 38 33 20 74 68 72 6f  2 lines 483 thro
48e0: 75 67 68 20 34 39 30 20 73 70 65 63 69 66 79 20  ugh 490 specify 
48f0: 74 68 61 74 20 77 68 65 6e 20 61 20 70 72 6f 63  that when a proc
4900: 65 73 73 0a 2a 2a 20 73 65 74 73 20 6f 72 20 63  ess.** sets or c
4910: 6c 65 61 72 73 20 61 20 6c 6f 63 6b 2c 20 74 68  lears a lock, th
4920: 61 74 20 6f 70 65 72 61 74 69 6f 6e 20 6f 76 65  at operation ove
4930: 72 72 69 64 65 73 20 61 6e 79 20 70 72 69 6f 72  rrides any prior
4940: 20 6c 6f 63 6b 73 20 73 65 74 0a 2a 2a 20 62 79   locks set.** by
4950: 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73   the same proces
4960: 73 2e 20 20 49 74 20 64 6f 65 73 20 6e 6f 74 20  s.  It does not 
4970: 65 78 70 6c 69 63 69 74 6c 79 20 73 61 79 20 73  explicitly say s
4980: 6f 2c 20 62 75 74 20 74 68 69 73 20 69 6d 70 6c  o, but this impl
4990: 69 65 73 0a 2a 2a 20 74 68 61 74 20 69 74 20 6f  ies.** that it o
49a0: 76 65 72 72 69 64 65 73 20 6c 6f 63 6b 73 20 73  verrides locks s
49b0: 65 74 20 62 79 20 74 68 65 20 73 61 6d 65 20 70  et by the same p
49c0: 72 6f 63 65 73 73 20 75 73 69 6e 67 20 61 20 64  rocess using a d
49d0: 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66 69 6c 65  ifferent.** file
49e0: 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 43 6f   descriptor.  Co
49f0: 6e 73 69 64 65 72 20 74 68 69 73 20 74 65 73 74  nsider this test
4a00: 20 63 61 73 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   case:.**.**    
4a10: 20 20 20 69 6e 74 20 66 64 31 20 3d 20 6f 70 65     int fd1 = ope
4a20: 6e 28 22 2e 2f 66 69 6c 65 31 22 2c 20 4f 5f 52  n("./file1", O_R
4a30: 44 57 52 7c 4f 5f 43 52 45 41 54 2c 20 30 36 34  DWR|O_CREAT, 064
4a40: 34 29 3b 0a 2a 2a 20 20 20 20 20 20 20 69 6e 74  4);.**       int
4a50: 20 66 64 32 20 3d 20 6f 70 65 6e 28 22 2e 2f 66   fd2 = open("./f
4a60: 69 6c 65 32 22 2c 20 4f 5f 52 44 57 52 7c 4f 5f  ile2", O_RDWR|O_
4a70: 43 52 45 41 54 2c 20 30 36 34 34 29 3b 0a 2a 2a  CREAT, 0644);.**
4a80: 0a 2a 2a 20 53 75 70 70 6f 73 65 20 2e 2f 66 69  .** Suppose ./fi
4a90: 6c 65 31 20 61 6e 64 20 2e 2f 66 69 6c 65 32 20  le1 and ./file2 
4aa0: 61 72 65 20 72 65 61 6c 6c 79 20 74 68 65 20 73  are really the s
4ab0: 61 6d 65 20 66 69 6c 65 20 28 62 65 63 61 75 73  ame file (becaus
4ac0: 65 0a 2a 2a 20 6f 6e 65 20 69 73 20 61 20 68 61  e.** one is a ha
4ad0: 72 64 20 6f 72 20 73 79 6d 62 6f 6c 69 63 20 6c  rd or symbolic l
4ae0: 69 6e 6b 20 74 6f 20 74 68 65 20 6f 74 68 65 72  ink to the other
4af0: 29 20 74 68 65 6e 20 69 66 20 79 6f 75 20 73 65  ) then if you se
4b00: 74 0a 2a 2a 20 61 6e 20 65 78 63 6c 75 73 69 76  t.** an exclusiv
4b10: 65 20 6c 6f 63 6b 20 6f 6e 20 66 64 31 2c 20 74  e lock on fd1, t
4b20: 68 65 6e 20 74 72 79 20 74 6f 20 67 65 74 20 61  hen try to get a
4b30: 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
4b40: 0a 2a 2a 20 6f 6e 20 66 64 32 2c 20 69 74 20 77  .** on fd2, it w
4b50: 6f 72 6b 73 2e 20 20 49 20 77 6f 75 6c 64 20 68  orks.  I would h
4b60: 61 76 65 20 65 78 70 65 63 74 65 64 20 74 68 65  ave expected the
4b70: 20 73 65 63 6f 6e 64 20 6c 6f 63 6b 20 74 6f 0a   second lock to.
4b80: 2a 2a 20 66 61 69 6c 20 73 69 6e 63 65 20 74 68  ** fail since th
4b90: 65 72 65 20 77 61 73 20 61 6c 72 65 61 64 79 20  ere was already 
4ba0: 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69  a lock on the fi
4bb0: 6c 65 20 64 75 65 20 74 6f 20 66 64 31 2e 0a 2a  le due to fd1..*
4bc0: 2a 20 42 75 74 20 6e 6f 74 20 73 6f 2e 20 20 53  * But not so.  S
4bd0: 69 6e 63 65 20 62 6f 74 68 20 6c 6f 63 6b 73 20  ince both locks 
4be0: 63 61 6d 65 20 66 72 6f 6d 20 74 68 65 20 73 61  came from the sa
4bf0: 6d 65 20 70 72 6f 63 65 73 73 2c 20 74 68 65 0a  me process, the.
4c00: 2a 2a 20 73 65 63 6f 6e 64 20 6f 76 65 72 72 69  ** second overri
4c10: 64 65 73 20 74 68 65 20 66 69 72 73 74 2c 20 65  des the first, e
4c20: 76 65 6e 20 74 68 6f 75 67 68 20 74 68 65 79 20  ven though they 
4c30: 77 65 72 65 20 6f 6e 20 64 69 66 66 65 72 65 6e  were on differen
4c40: 74 0a 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69  t.** file descri
4c50: 70 74 6f 72 73 20 6f 70 65 6e 65 64 20 6f 6e 20  ptors opened on 
4c60: 64 69 66 66 65 72 65 6e 74 20 66 69 6c 65 20 6e  different file n
4c70: 61 6d 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ames..**.** This
4c80: 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 63   means that we c
4c90: 61 6e 6e 6f 74 20 75 73 65 20 50 4f 53 49 58 20  annot use POSIX 
4ca0: 6c 6f 63 6b 73 20 74 6f 20 73 79 6e 63 68 72 6f  locks to synchro
4cb0: 6e 69 7a 65 20 66 69 6c 65 20 61 63 63 65 73 73  nize file access
4cc0: 0a 2a 2a 20 61 6d 6f 6e 67 20 63 6f 6d 70 65 74  .** among compet
4cd0: 69 6e 67 20 74 68 72 65 61 64 73 20 6f 66 20 74  ing threads of t
4ce0: 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 2e  he same process.
4cf0: 20 20 50 4f 53 49 58 20 6c 6f 63 6b 73 20 77 69    POSIX locks wi
4d00: 6c 6c 20 77 6f 72 6b 20 66 69 6e 65 0a 2a 2a 20  ll work fine.** 
4d10: 74 6f 20 73 79 6e 63 68 72 6f 6e 69 7a 65 20 61  to synchronize a
4d20: 63 63 65 73 73 20 66 6f 72 20 74 68 72 65 61 64  ccess for thread
4d30: 73 20 69 6e 20 73 65 70 61 72 61 74 65 20 70 72  s in separate pr
4d40: 6f 63 65 73 73 65 73 2c 20 62 75 74 20 6e 6f 74  ocesses, but not
4d50: 0a 2a 2a 20 74 68 72 65 61 64 73 20 77 69 74 68  .** threads with
4d60: 69 6e 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63  in the same proc
4d70: 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 77 6f  ess..**.** To wo
4d80: 72 6b 20 61 72 6f 75 6e 64 20 74 68 65 20 70 72  rk around the pr
4d90: 6f 62 6c 65 6d 2c 20 53 51 4c 69 74 65 20 68 61  oblem, SQLite ha
4da0: 73 20 74 6f 20 6d 61 6e 61 67 65 20 66 69 6c 65  s to manage file
4db0: 20 6c 6f 63 6b 73 20 69 6e 74 65 72 6e 61 6c 6c   locks internall
4dc0: 79 0a 2a 2a 20 6f 6e 20 69 74 73 20 6f 77 6e 2e  y.** on its own.
4dd0: 20 20 57 68 65 6e 65 76 65 72 20 61 20 6e 65 77    Whenever a new
4de0: 20 64 61 74 61 62 61 73 65 20 69 73 20 6f 70 65   database is ope
4df0: 6e 65 64 2c 20 77 65 20 68 61 76 65 20 74 6f 20  ned, we have to 
4e00: 66 69 6e 64 20 74 68 65 0a 2a 2a 20 73 70 65 63  find the.** spec
4e10: 69 66 69 63 20 69 6e 6f 64 65 20 6f 66 20 74 68  ific inode of th
4e20: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
4e30: 28 74 68 65 20 69 6e 6f 64 65 20 69 73 20 64 65  (the inode is de
4e40: 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 0a  termined by the.
4e50: 2a 2a 20 73 74 5f 64 65 76 20 61 6e 64 20 73 74  ** st_dev and st
4e60: 5f 69 6e 6f 20 66 69 65 6c 64 73 20 6f 66 20 74  _ino fields of t
4e70: 68 65 20 73 74 61 74 20 73 74 72 75 63 74 75 72  he stat structur
4e80: 65 20 74 68 61 74 20 66 73 74 61 74 28 29 20 66  e that fstat() f
4e90: 69 6c 6c 73 20 69 6e 29 0a 2a 2a 20 61 6e 64 20  ills in).** and 
4ea0: 63 68 65 63 6b 20 66 6f 72 20 6c 6f 63 6b 73 20  check for locks 
4eb0: 61 6c 72 65 61 64 79 20 65 78 69 73 74 69 6e 67  already existing
4ec0: 20 6f 6e 20 74 68 61 74 20 69 6e 6f 64 65 2e 20   on that inode. 
4ed0: 20 57 68 65 6e 20 6c 6f 63 6b 73 20 61 72 65 0a   When locks are.
4ee0: 2a 2a 20 63 72 65 61 74 65 64 20 6f 72 20 72 65  ** created or re
4ef0: 6d 6f 76 65 64 2c 20 77 65 20 68 61 76 65 20 74  moved, we have t
4f00: 6f 20 6c 6f 6f 6b 20 61 74 20 6f 75 72 20 6f 77  o look at our ow
4f10: 6e 20 69 6e 74 65 72 6e 61 6c 20 72 65 63 6f 72  n internal recor
4f20: 64 20 6f 66 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b  d of the.** lock
4f30: 73 20 74 6f 20 73 65 65 20 69 66 20 61 6e 6f 74  s to see if anot
4f40: 68 65 72 20 74 68 72 65 61 64 20 68 61 73 20 70  her thread has p
4f50: 72 65 76 69 6f 75 73 6c 79 20 73 65 74 20 61 20  reviously set a 
4f60: 6c 6f 63 6b 20 6f 6e 20 74 68 61 74 20 73 61 6d  lock on that sam
4f70: 65 0a 2a 2a 20 69 6e 6f 64 65 2e 0a 2a 2a 0a 2a  e.** inode..**.*
4f80: 2a 20 28 41 73 69 64 65 3a 20 54 68 65 20 75 73  * (Aside: The us
4f90: 65 20 6f 66 20 69 6e 6f 64 65 20 6e 75 6d 62 65  e of inode numbe
4fa0: 72 73 20 61 73 20 75 6e 69 71 75 65 20 49 44 73  rs as unique IDs
4fb0: 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 6f   does not work o
4fc0: 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a 20 46 6f  n VxWorks..** Fo
4fd0: 72 20 56 78 57 6f 72 6b 73 2c 20 77 65 20 68 61  r VxWorks, we ha
4fe0: 76 65 20 74 6f 20 75 73 65 20 74 68 65 20 61 6c  ve to use the al
4ff0: 74 65 72 6e 61 74 69 76 65 20 75 6e 69 71 75 65  ternative unique
5000: 20 49 44 20 73 79 73 74 65 6d 20 62 61 73 65 64   ID system based
5010: 20 6f 6e 0a 2a 2a 20 63 61 6e 6f 6e 69 63 61 6c   on.** canonical
5020: 20 66 69 6c 65 6e 61 6d 65 20 61 6e 64 20 69 6d   filename and im
5030: 70 6c 65 6d 65 6e 74 65 64 20 69 6e 20 74 68 65  plemented in the
5040: 20 70 72 65 76 69 6f 75 73 20 64 69 76 69 73 69   previous divisi
5050: 6f 6e 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  on.).**.** The s
5060: 71 6c 69 74 65 33 5f 66 69 6c 65 20 73 74 72 75  qlite3_file stru
5070: 63 74 75 72 65 20 66 6f 72 20 50 4f 53 49 58 20  cture for POSIX 
5080: 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6a 75 73  is no longer jus
5090: 74 20 61 6e 20 69 6e 74 65 67 65 72 20 66 69 6c  t an integer fil
50a0: 65 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 2e  e.** descriptor.
50b0: 20 20 49 74 20 69 73 20 6e 6f 77 20 61 20 73 74    It is now a st
50c0: 72 75 63 74 75 72 65 20 74 68 61 74 20 68 6f 6c  ructure that hol
50d0: 64 73 20 74 68 65 20 69 6e 74 65 67 65 72 20 66  ds the integer f
50e0: 69 6c 65 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f  ile.** descripto
50f0: 72 20 61 6e 64 20 61 20 70 6f 69 6e 74 65 72 20  r and a pointer 
5100: 74 6f 20 61 20 73 74 72 75 63 74 75 72 65 20 74  to a structure t
5110: 68 61 74 20 64 65 73 63 72 69 62 65 73 20 74 68  hat describes th
5120: 65 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a 20 6c 6f  e internal.** lo
5130: 63 6b 73 20 6f 6e 20 74 68 65 20 63 6f 72 72 65  cks on the corre
5140: 73 70 6f 6e 64 69 6e 67 20 69 6e 6f 64 65 2e 20  sponding inode. 
5150: 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 6c 6f   There is one lo
5160: 63 6b 69 6e 67 20 73 74 72 75 63 74 75 72 65 0a  cking structure.
5170: 2a 2a 20 70 65 72 20 69 6e 6f 64 65 2c 20 73 6f  ** per inode, so
5180: 20 69 66 20 74 68 65 20 73 61 6d 65 20 69 6e 6f   if the same ino
5190: 64 65 20 69 73 20 6f 70 65 6e 65 64 20 74 77 69  de is opened twi
51a0: 63 65 2c 20 62 6f 74 68 20 75 6e 69 78 46 69 6c  ce, both unixFil
51b0: 65 20 73 74 72 75 63 74 75 72 65 73 0a 2a 2a 20  e structures.** 
51c0: 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 73 61 6d  point to the sam
51d0: 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63 74  e locking struct
51e0: 75 72 65 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e  ure.  The lockin
51f0: 67 20 73 74 72 75 63 74 75 72 65 20 6b 65 65 70  g structure keep
5200: 73 0a 2a 2a 20 61 20 72 65 66 65 72 65 6e 63 65  s.** a reference
5210: 20 63 6f 75 6e 74 20 28 73 6f 20 77 65 20 77 69   count (so we wi
5220: 6c 6c 20 6b 6e 6f 77 20 77 68 65 6e 20 74 6f 20  ll know when to 
5230: 64 65 6c 65 74 65 20 69 74 29 20 61 6e 64 20 61  delete it) and a
5240: 20 22 63 6e 74 22 0a 2a 2a 20 66 69 65 6c 64 20   "cnt".** field 
5250: 74 68 61 74 20 74 65 6c 6c 73 20 75 73 20 69 74  that tells us it
5260: 73 20 69 6e 74 65 72 6e 61 6c 20 6c 6f 63 6b 20  s internal lock 
5270: 73 74 61 74 75 73 2e 20 20 63 6e 74 3d 3d 30 20  status.  cnt==0 
5280: 6d 65 61 6e 73 20 74 68 65 0a 2a 2a 20 66 69 6c  means the.** fil
5290: 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 2e 20 20  e is unlocked.  
52a0: 63 6e 74 3d 3d 2d 31 20 6d 65 61 6e 73 20 74 68  cnt==-1 means th
52b0: 65 20 66 69 6c 65 20 68 61 73 20 61 6e 20 65 78  e file has an ex
52c0: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e 0a 2a 2a  clusive lock..**
52d0: 20 63 6e 74 3e 30 20 6d 65 61 6e 73 20 74 68 65   cnt>0 means the
52e0: 72 65 20 61 72 65 20 63 6e 74 20 73 68 61 72 65  re are cnt share
52f0: 64 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 20 66  d locks on the f
5300: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 61  ile..**.** Any a
5310: 74 74 65 6d 70 74 20 74 6f 20 6c 6f 63 6b 20 6f  ttempt to lock o
5320: 72 20 75 6e 6c 6f 63 6b 20 61 20 66 69 6c 65 20  r unlock a file 
5330: 66 69 72 73 74 20 63 68 65 63 6b 73 20 74 68 65  first checks the
5340: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73 74 72 75   locking.** stru
5350: 63 74 75 72 65 2e 20 20 54 68 65 20 66 63 6e 74  cture.  The fcnt
5360: 6c 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  l() system call 
5370: 69 73 20 6f 6e 6c 79 20 69 6e 76 6f 6b 65 64 20  is only invoked 
5380: 74 6f 20 73 65 74 20 61 20 0a 2a 2a 20 50 4f 53  to set a .** POS
5390: 49 58 20 6c 6f 63 6b 20 69 66 20 74 68 65 20 69  IX lock if the i
53a0: 6e 74 65 72 6e 61 6c 20 6c 6f 63 6b 20 73 74 72  nternal lock str
53b0: 75 63 74 75 72 65 20 74 72 61 6e 73 69 74 69 6f  ucture transitio
53c0: 6e 73 20 62 65 74 77 65 65 6e 0a 2a 2a 20 61 20  ns between.** a 
53d0: 6c 6f 63 6b 65 64 20 61 6e 64 20 61 6e 20 75 6e  locked and an un
53e0: 6c 6f 63 6b 65 64 20 73 74 61 74 65 2e 0a 2a 2a  locked state..**
53f0: 0a 2a 2a 20 42 75 74 20 77 61 69 74 3a 20 20 74  .** But wait:  t
5400: 68 65 72 65 20 61 72 65 20 79 65 74 20 6d 6f 72  here are yet mor
5410: 65 20 70 72 6f 62 6c 65 6d 73 20 77 69 74 68 20  e problems with 
5420: 50 4f 53 49 58 20 61 64 76 69 73 6f 72 79 20 6c  POSIX advisory l
5430: 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 79  ocks..**.** If y
5440: 6f 75 20 63 6c 6f 73 65 20 61 20 66 69 6c 65 20  ou close a file 
5450: 64 65 73 63 72 69 70 74 6f 72 20 74 68 61 74 20  descriptor that 
5460: 70 6f 69 6e 74 73 20 74 6f 20 61 20 66 69 6c 65  points to a file
5470: 20 74 68 61 74 20 68 61 73 20 6c 6f 63 6b 73 2c   that has locks,
5480: 0a 2a 2a 20 61 6c 6c 20 6c 6f 63 6b 73 20 6f 6e  .** all locks on
5490: 20 74 68 61 74 20 66 69 6c 65 20 74 68 61 74 20   that file that 
54a0: 61 72 65 20 6f 77 6e 65 64 20 62 79 20 74 68 65  are owned by the
54b0: 20 63 75 72 72 65 6e 74 20 70 72 6f 63 65 73 73   current process
54c0: 20 61 72 65 0a 2a 2a 20 72 65 6c 65 61 73 65 64   are.** released
54d0: 2e 20 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e  .  To work aroun
54e0: 64 20 74 68 69 73 20 70 72 6f 62 6c 65 6d 2c 20  d this problem, 
54f0: 65 61 63 68 20 75 6e 69 78 46 69 6c 65 20 73 74  each unixFile st
5500: 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73  ructure contains
5510: 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  .** a pointer to
5520: 20 61 6e 20 75 6e 69 78 4f 70 65 6e 43 6e 74 20   an unixOpenCnt 
5530: 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65 72  structure.  Ther
5540: 65 20 69 73 20 6f 6e 65 20 75 6e 69 78 4f 70 65  e is one unixOpe
5550: 6e 43 6e 74 20 73 74 72 75 63 74 75 72 65 0a 2a  nCnt structure.*
5560: 2a 20 70 65 72 20 6f 70 65 6e 20 69 6e 6f 64 65  * per open inode
5570: 2c 20 77 68 69 63 68 20 6d 65 61 6e 73 20 74 68  , which means th
5580: 61 74 20 6d 75 6c 74 69 70 6c 65 20 75 6e 69 78  at multiple unix
5590: 46 69 6c 65 20 63 61 6e 20 70 6f 69 6e 74 20 74  File can point t
55a0: 6f 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 75 6e  o a single.** un
55b0: 69 78 4f 70 65 6e 43 6e 74 2e 20 20 57 68 65 6e  ixOpenCnt.  When
55c0: 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d   an attempt is m
55d0: 61 64 65 20 74 6f 20 63 6c 6f 73 65 20 61 6e 20  ade to close an 
55e0: 75 6e 69 78 46 69 6c 65 2c 20 69 66 20 74 68 65  unixFile, if the
55f0: 72 65 20 61 72 65 0a 2a 2a 20 6f 74 68 65 72 20  re are.** other 
5600: 75 6e 69 78 46 69 6c 65 20 6f 70 65 6e 20 6f 6e  unixFile open on
5610: 20 74 68 65 20 73 61 6d 65 20 69 6e 6f 64 65 20   the same inode 
5620: 74 68 61 74 20 61 72 65 20 68 6f 6c 64 69 6e 67  that are holding
5630: 20 6c 6f 63 6b 73 2c 20 74 68 65 20 63 61 6c 6c   locks, the call
5640: 0a 2a 2a 20 74 6f 20 63 6c 6f 73 65 28 29 20 74  .** to close() t
5650: 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
5660: 6f 72 20 69 73 20 64 65 66 65 72 72 65 64 20 75  or is deferred u
5670: 6e 74 69 6c 20 61 6c 6c 20 6f 66 20 74 68 65 20  ntil all of the 
5680: 6c 6f 63 6b 73 20 63 6c 65 61 72 2e 0a 2a 2a 20  locks clear..** 
5690: 54 68 65 20 75 6e 69 78 4f 70 65 6e 43 6e 74 20  The unixOpenCnt 
56a0: 73 74 72 75 63 74 75 72 65 20 6b 65 65 70 73 20  structure keeps 
56b0: 61 20 6c 69 73 74 20 6f 66 20 66 69 6c 65 20 64  a list of file d
56c0: 65 73 63 72 69 70 74 6f 72 73 20 74 68 61 74 20  escriptors that 
56d0: 6e 65 65 64 20 74 6f 0a 2a 2a 20 62 65 20 63 6c  need to.** be cl
56e0: 6f 73 65 64 20 61 6e 64 20 74 68 61 74 20 6c 69  osed and that li
56f0: 73 74 20 69 73 20 77 61 6c 6b 65 64 20 28 61 6e  st is walked (an
5700: 64 20 63 6c 65 61 72 65 64 29 20 77 68 65 6e 20  d cleared) when 
5710: 74 68 65 20 6c 61 73 74 20 6c 6f 63 6b 0a 2a 2a  the last lock.**
5720: 20 63 6c 65 61 72 73 2e 0a 2a 2a 0a 2a 2a 20 59   clears..**.** Y
5730: 65 74 20 61 6e 6f 74 68 65 72 20 70 72 6f 62 6c  et another probl
5740: 65 6d 3a 20 20 4c 69 6e 75 78 54 68 72 65 61 64  em:  LinuxThread
5750: 73 20 64 6f 20 6e 6f 74 20 70 6c 61 79 20 77 65  s do not play we
5760: 6c 6c 20 77 69 74 68 20 70 6f 73 69 78 20 6c 6f  ll with posix lo
5770: 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 4d 61 6e 79 20  cks..**.** Many 
5780: 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 73 20 6f  older versions o
5790: 66 20 6c 69 6e 75 78 20 75 73 65 20 74 68 65 20  f linux use the 
57a0: 4c 69 6e 75 78 54 68 72 65 61 64 73 20 6c 69 62  LinuxThreads lib
57b0: 72 61 72 79 20 77 68 69 63 68 20 69 73 0a 2a 2a  rary which is.**
57c0: 20 6e 6f 74 20 70 6f 73 69 78 20 63 6f 6d 70 6c   not posix compl
57d0: 69 61 6e 74 2e 20 20 55 6e 64 65 72 20 4c 69 6e  iant.  Under Lin
57e0: 75 78 54 68 72 65 61 64 73 2c 20 61 20 6c 6f 63  uxThreads, a loc
57f0: 6b 20 63 72 65 61 74 65 64 20 62 79 20 74 68 72  k created by thr
5800: 65 61 64 0a 2a 2a 20 41 20 63 61 6e 6e 6f 74 20  ead.** A cannot 
5810: 62 65 20 6d 6f 64 69 66 69 65 64 20 6f 72 20 6f  be modified or o
5820: 76 65 72 72 69 64 64 65 6e 20 62 79 20 61 20 64  verridden by a d
5830: 69 66 66 65 72 65 6e 74 20 74 68 72 65 61 64 20  ifferent thread 
5840: 42 2e 0a 2a 2a 20 4f 6e 6c 79 20 74 68 72 65 61  B..** Only threa
5850: 64 20 41 20 63 61 6e 20 6d 6f 64 69 66 79 20 74  d A can modify t
5860: 68 65 20 6c 6f 63 6b 2e 20 20 4c 6f 63 6b 69 6e  he lock.  Lockin
5870: 67 20 62 65 68 61 76 69 6f 72 20 69 73 20 63 6f  g behavior is co
5880: 72 72 65 63 74 0a 2a 2a 20 69 66 20 74 68 65 20  rrect.** if the 
5890: 61 70 70 6c 69 61 74 69 6f 6e 20 75 73 65 73 20  appliation uses 
58a0: 74 68 65 20 6e 65 77 65 72 20 4e 61 74 69 76 65  the newer Native
58b0: 20 50 6f 73 69 78 20 54 68 72 65 61 64 20 4c 69   Posix Thread Li
58c0: 62 72 61 72 79 20 28 4e 50 54 4c 29 0a 2a 2a 20  brary (NPTL).** 
58d0: 6f 6e 20 6c 69 6e 75 78 20 2d 20 77 69 74 68 20  on linux - with 
58e0: 4e 50 54 4c 20 61 20 6c 6f 63 6b 20 63 72 65 61  NPTL a lock crea
58f0: 74 65 64 20 62 79 20 74 68 72 65 61 64 20 41 20  ted by thread A 
5900: 63 61 6e 20 6f 76 65 72 72 69 64 65 20 6c 6f 63  can override loc
5910: 6b 73 0a 2a 2a 20 69 6e 20 74 68 72 65 61 64 20  ks.** in thread 
5920: 42 2e 20 20 42 75 74 20 74 68 65 72 65 20 69 73  B.  But there is
5930: 20 6e 6f 20 77 61 79 20 74 6f 20 6b 6e 6f 77 20   no way to know 
5940: 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  at compile-time 
5950: 77 68 69 63 68 0a 2a 2a 20 74 68 72 65 61 64 69  which.** threadi
5960: 6e 67 20 6c 69 62 72 61 72 79 20 69 73 20 62 65  ng library is be
5970: 69 6e 67 20 75 73 65 64 2e 20 20 53 6f 20 74 68  ing used.  So th
5980: 65 72 65 20 69 73 20 6e 6f 20 77 61 79 20 74 6f  ere is no way to
5990: 20 6b 6e 6f 77 20 61 74 0a 2a 2a 20 63 6f 6d 70   know at.** comp
59a0: 69 6c 65 2d 74 69 6d 65 20 77 68 65 74 68 65 72  ile-time whether
59b0: 20 6f 72 20 6e 6f 74 20 74 68 72 65 61 64 20 41   or not thread A
59c0: 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20 6c 6f   can override lo
59d0: 63 6b 73 20 6f 6e 20 74 68 72 65 61 64 20 42 2e  cks on thread B.
59e0: 0a 2a 2a 20 57 65 20 68 61 76 65 20 74 6f 20 64  .** We have to d
59f0: 6f 20 61 20 72 75 6e 2d 74 69 6d 65 20 63 68 65  o a run-time che
5a00: 63 6b 20 74 6f 20 64 69 73 63 6f 76 65 72 20 74  ck to discover t
5a10: 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20 74  he behavior of t
5a20: 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 70 72  he.** current pr
5a30: 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20  ocess..**.** On 
5a40: 73 79 73 74 65 6d 73 20 77 68 65 72 65 20 74 68  systems where th
5a50: 72 65 61 64 20 41 20 69 73 20 75 6e 61 62 6c 65  read A is unable
5a60: 20 74 6f 20 6d 6f 64 69 66 79 20 6c 6f 63 6b 73   to modify locks
5a70: 20 63 72 65 61 74 65 64 20 62 79 0a 2a 2a 20 74   created by.** t
5a80: 68 72 65 61 64 20 42 2c 20 77 65 20 68 61 76 65  hread B, we have
5a90: 20 74 6f 20 6b 65 65 70 20 74 72 61 63 6b 20 6f   to keep track o
5aa0: 66 20 77 68 69 63 68 20 74 68 72 65 61 64 20 63  f which thread c
5ab0: 72 65 61 74 65 64 20 65 61 63 68 0a 2a 2a 20 6c  reated each.** l
5ac0: 6f 63 6b 2e 20 20 48 65 6e 63 65 20 74 68 65 72  ock.  Hence ther
5ad0: 65 20 69 73 20 61 6e 20 65 78 74 72 61 20 66 69  e is an extra fi
5ae0: 65 6c 64 20 69 6e 20 74 68 65 20 6b 65 79 20 74  eld in the key t
5af0: 6f 20 74 68 65 20 75 6e 69 78 4c 6f 63 6b 49 6e  o the unixLockIn
5b00: 66 6f 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20  fo.** structure 
5b10: 74 6f 20 72 65 63 6f 72 64 20 74 68 69 73 20 69  to record this i
5b20: 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 41 6e 64  nformation.  And
5b30: 20 6f 6e 20 74 68 6f 73 65 20 73 79 73 74 65 6d   on those system
5b40: 73 20 69 74 0a 2a 2a 20 69 73 20 69 6c 6c 65 67  s it.** is illeg
5b50: 61 6c 20 74 6f 20 62 65 67 69 6e 20 61 20 74 72  al to begin a tr
5b60: 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 6f 6e 65  ansaction in one
5b70: 20 74 68 72 65 61 64 20 61 6e 64 20 66 69 6e 69   thread and fini
5b80: 73 68 20 69 74 0a 2a 2a 20 69 6e 20 61 6e 6f 74  sh it.** in anot
5b90: 68 65 72 2e 20 20 46 6f 72 20 74 68 69 73 20 6c  her.  For this l
5ba0: 61 74 74 65 72 20 72 65 73 74 72 69 63 74 69 6f  atter restrictio
5bb0: 6e 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77  n, there is no w
5bc0: 6f 72 6b 2d 61 72 6f 75 6e 64 2e 0a 2a 2a 20 49  ork-around..** I
5bd0: 74 20 69 73 20 61 20 6c 69 6d 69 74 61 74 69 6f  t is a limitatio
5be0: 6e 20 6f 66 20 4c 69 6e 75 78 54 68 72 65 61 64  n of LinuxThread
5bf0: 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  s..*/../*.** Set
5c00: 20 6f 72 20 63 68 65 63 6b 20 74 68 65 20 75 6e   or check the un
5c10: 69 78 46 69 6c 65 2e 74 69 64 20 66 69 65 6c 64  ixFile.tid field
5c20: 2e 20 20 54 68 69 73 20 66 69 65 6c 64 20 69 73  .  This field is
5c30: 20 73 65 74 20 77 68 65 6e 20 61 6e 20 75 6e 69   set when an uni
5c40: 78 46 69 6c 65 0a 2a 2a 20 69 73 20 66 69 72 73  xFile.** is firs
5c50: 74 20 6f 70 65 6e 65 64 2e 20 20 41 6c 6c 20 73  t opened.  All s
5c60: 75 62 73 65 71 75 65 6e 74 20 75 73 65 73 20 6f  ubsequent uses o
5c70: 66 20 74 68 65 20 75 6e 69 78 46 69 6c 65 20 76  f the unixFile v
5c80: 65 72 69 66 79 20 74 68 61 74 20 74 68 65 0a 2a  erify that the.*
5c90: 2a 20 73 61 6d 65 20 74 68 72 65 61 64 20 69 73  * same thread is
5ca0: 20 6f 70 65 72 61 74 69 6e 67 20 6f 6e 20 74 68   operating on th
5cb0: 65 20 75 6e 69 78 46 69 6c 65 2e 20 20 53 6f 6d  e unixFile.  Som
5cc0: 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  e operating syst
5cd0: 65 6d 73 20 64 6f 0a 2a 2a 20 6e 6f 74 20 61 6c  ems do.** not al
5ce0: 6c 6f 77 20 6c 6f 63 6b 73 20 74 6f 20 62 65 20  low locks to be 
5cf0: 6f 76 65 72 72 69 64 64 65 6e 20 62 79 20 6f 74  overridden by ot
5d00: 68 65 72 20 74 68 72 65 61 64 73 20 61 6e 64 20  her threads and 
5d10: 74 68 61 74 20 72 65 73 74 72 69 63 74 69 6f 6e  that restriction
5d20: 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 61 74 20 73  .** means that s
5d30: 71 6c 69 74 65 33 2a 20 64 61 74 61 62 61 73 65  qlite3* database
5d40: 20 68 61 6e 64 6c 65 73 20 63 61 6e 6e 6f 74 20   handles cannot 
5d50: 62 65 20 6d 6f 76 65 64 20 66 72 6f 6d 20 6f 6e  be moved from on
5d60: 65 20 74 68 72 65 61 64 0a 2a 2a 20 74 6f 20 61  e thread.** to a
5d70: 6e 6f 74 68 65 72 20 77 68 69 6c 65 20 6c 6f 63  nother while loc
5d80: 6b 73 20 61 72 65 20 68 65 6c 64 2e 0a 2a 2a 0a  ks are held..**.
5d90: 2a 2a 20 56 65 72 73 69 6f 6e 20 33 2e 33 2e 31  ** Version 3.3.1
5da0: 20 28 32 30 30 36 2d 30 31 2d 31 35 29 3a 20 20   (2006-01-15):  
5db0: 75 6e 69 78 46 69 6c 65 20 63 61 6e 20 62 65 20  unixFile can be 
5dc0: 6d 6f 76 65 64 20 66 72 6f 6d 20 6f 6e 65 20 74  moved from one t
5dd0: 68 72 65 61 64 20 74 6f 0a 2a 2a 20 61 6e 6f 74  hread to.** anot
5de0: 68 65 72 20 61 73 20 6c 6f 6e 67 20 61 73 20 77  her as long as w
5df0: 65 20 61 72 65 20 72 75 6e 6e 69 6e 67 20 6f 6e  e are running on
5e00: 20 61 20 73 79 73 74 65 6d 20 74 68 61 74 20 73   a system that s
5e10: 75 70 70 6f 72 74 73 20 74 68 72 65 61 64 73 0a  upports threads.
5e20: 2a 2a 20 6f 76 65 72 72 69 64 69 6e 67 20 65 61  ** overriding ea
5e30: 63 68 20 6f 74 68 65 72 73 20 6c 6f 63 6b 73 20  ch others locks 
5e40: 28 77 68 69 63 68 20 69 73 20 6e 6f 77 20 74 68  (which is now th
5e50: 65 20 6d 6f 73 74 20 63 6f 6d 6d 6f 6e 20 62 65  e most common be
5e60: 68 61 76 69 6f 72 29 0a 2a 2a 20 6f 72 20 69 66  havior).** or if
5e70: 20 6e 6f 20 6c 6f 63 6b 73 20 61 72 65 20 68 65   no locks are he
5e80: 6c 64 2e 20 20 42 75 74 20 74 68 65 20 75 6e 69  ld.  But the uni
5e90: 78 46 69 6c 65 2e 70 4c 6f 63 6b 20 66 69 65 6c  xFile.pLock fiel
5ea0: 64 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 2a 2a  d needs to be.**
5eb0: 20 72 65 63 6f 6d 70 75 74 65 64 20 62 65 63 61   recomputed beca
5ec0: 75 73 65 20 69 74 73 20 6b 65 79 20 69 6e 63 6c  use its key incl
5ed0: 75 64 65 73 20 74 68 65 20 74 68 72 65 61 64 2d  udes the thread-
5ee0: 69 64 2e 20 20 53 65 65 20 74 68 65 20 0a 2a 2a  id.  See the .**
5ef0: 20 74 72 61 6e 73 66 65 72 4f 77 6e 65 72 73 68   transferOwnersh
5f00: 69 70 28 29 20 66 75 6e 63 74 69 6f 6e 20 62 65  ip() function be
5f10: 6c 6f 77 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  low for addition
5f20: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a  al information.*
5f30: 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52  /.#if SQLITE_THR
5f40: 45 41 44 53 41 46 45 20 26 26 20 64 65 66 69 6e  EADSAFE && defin
5f50: 65 64 28 5f 5f 6c 69 6e 75 78 5f 5f 29 0a 23 20  ed(__linux__).# 
5f60: 64 65 66 69 6e 65 20 53 45 54 5f 54 48 52 45 41  define SET_THREA
5f70: 44 49 44 28 58 29 20 20 20 28 58 29 2d 3e 74 69  DID(X)   (X)->ti
5f80: 64 20 3d 20 70 74 68 72 65 61 64 5f 73 65 6c 66  d = pthread_self
5f90: 28 29 0a 23 20 64 65 66 69 6e 65 20 43 48 45 43  ().# define CHEC
5fa0: 4b 5f 54 48 52 45 41 44 49 44 28 58 29 20 28 74  K_THREADID(X) (t
5fb0: 68 72 65 61 64 73 4f 76 65 72 72 69 64 65 45 61  hreadsOverrideEa
5fc0: 63 68 4f 74 68 65 72 73 4c 6f 63 6b 73 3d 3d 30  chOthersLocks==0
5fd0: 20 26 26 20 5c 0a 20 20 20 20 20 20 20 20 20 20   && \.          
5fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ff0: 20 20 21 70 74 68 72 65 61 64 5f 65 71 75 61 6c    !pthread_equal
6000: 28 28 58 29 2d 3e 74 69 64 2c 20 70 74 68 72 65  ((X)->tid, pthre
6010: 61 64 5f 73 65 6c 66 28 29 29 29 0a 23 65 6c 73  ad_self())).#els
6020: 65 0a 23 20 64 65 66 69 6e 65 20 53 45 54 5f 54  e.# define SET_T
6030: 48 52 45 41 44 49 44 28 58 29 0a 23 20 64 65 66  HREADID(X).# def
6040: 69 6e 65 20 43 48 45 43 4b 5f 54 48 52 45 41 44  ine CHECK_THREAD
6050: 49 44 28 58 29 20 30 0a 23 65 6e 64 69 66 0a 0a  ID(X) 0.#endif..
6060: 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63  /*.** An instanc
6070: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
6080: 6e 67 20 73 74 72 75 63 74 75 72 65 20 73 65 72  ng structure ser
6090: 76 65 73 20 61 73 20 74 68 65 20 6b 65 79 20 75  ves as the key u
60a0: 73 65 64 0a 2a 2a 20 74 6f 20 6c 6f 63 61 74 65  sed.** to locate
60b0: 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 75 6e   a particular un
60c0: 69 78 4f 70 65 6e 43 6e 74 20 73 74 72 75 63 74  ixOpenCnt struct
60d0: 75 72 65 20 67 69 76 65 6e 20 69 74 73 20 69 6e  ure given its in
60e0: 6f 64 65 2e 20 20 54 68 69 73 0a 2a 2a 20 69 73  ode.  This.** is
60f0: 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65   the same as the
6100: 20 75 6e 69 78 4c 6f 63 6b 4b 65 79 20 65 78 63   unixLockKey exc
6110: 65 70 74 20 74 68 61 74 20 74 68 65 20 74 68 72  ept that the thr
6120: 65 61 64 20 49 44 20 69 73 20 6f 6d 69 74 74 65  ead ID is omitte
6130: 64 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 75 6e 69  d..*/.struct uni
6140: 78 46 69 6c 65 49 64 20 7b 0a 20 20 64 65 76 5f  xFileId {.  dev_
6150: 74 20 64 65 76 3b 20 20 20 20 20 20 20 20 20 20  t dev;          
6160: 20 20 20 20 20 20 20 20 2f 2a 20 44 65 76 69 63          /* Devic
6170: 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 23 69 66 20  e number */.#if 
6180: 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74 72  OS_VXWORKS.  str
6190: 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49  uct vxworksFileI
61a0: 64 20 2a 70 49 64 3b 20 20 2f 2a 20 55 6e 69 71  d *pId;  /* Uniq
61b0: 75 65 20 66 69 6c 65 20 49 44 20 66 6f 72 20 76  ue file ID for v
61c0: 78 77 6f 72 6b 73 2e 20 2a 2f 0a 23 65 6c 73 65  xworks. */.#else
61d0: 0a 20 20 69 6e 6f 5f 74 20 69 6e 6f 3b 20 20 20  .  ino_t ino;   
61e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
61f0: 2a 20 49 6e 6f 64 65 20 6e 75 6d 62 65 72 20 2a  * Inode number *
6200: 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a  /.#endif.};../*.
6210: 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f  ** An instance o
6220: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
6230: 73 74 72 75 63 74 75 72 65 20 73 65 72 76 65 73  structure serves
6240: 20 61 73 20 74 68 65 20 6b 65 79 20 75 73 65 64   as the key used
6250: 0a 2a 2a 20 74 6f 20 6c 6f 63 61 74 65 20 61 20  .** to locate a 
6260: 70 61 72 74 69 63 75 6c 61 72 20 75 6e 69 78 4c  particular unixL
6270: 6f 63 6b 49 6e 66 6f 20 73 74 72 75 63 74 75 72  ockInfo structur
6280: 65 20 67 69 76 65 6e 20 69 74 73 20 69 6e 6f 64  e given its inod
6290: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 72 65  e..**.** If thre
62a0: 61 64 73 20 63 61 6e 6e 6f 74 20 6f 76 65 72 72  ads cannot overr
62b0: 69 64 65 20 65 61 63 68 20 6f 74 68 65 72 73 20  ide each others 
62c0: 6c 6f 63 6b 73 20 28 4c 69 6e 75 78 54 68 72 65  locks (LinuxThre
62d0: 61 64 73 29 2c 20 74 68 65 6e 20 77 65 0a 2a 2a  ads), then we.**
62e0: 20 73 65 74 20 74 68 65 20 75 6e 69 78 4c 6f 63   set the unixLoc
62f0: 6b 4b 65 79 2e 74 69 64 20 66 69 65 6c 64 20 74  kKey.tid field t
6300: 6f 20 74 68 65 20 74 68 72 65 61 64 20 49 44 2e  o the thread ID.
6310: 20 20 49 66 20 74 68 72 65 61 64 73 20 63 61 6e    If threads can
6320: 20 6f 76 65 72 72 69 64 65 0a 2a 2a 20 65 61 63   override.** eac
6330: 68 20 6f 74 68 65 72 73 20 6c 6f 63 6b 73 20 28  h others locks (
6340: 50 6f 73 69 78 20 61 6e 64 20 4e 50 54 4c 29 20  Posix and NPTL) 
6350: 74 68 65 6e 20 74 69 64 20 69 73 20 61 6c 77 61  then tid is alwa
6360: 79 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 0a  ys set to zero..
6370: 2a 2a 20 74 69 64 20 69 73 20 6f 6d 69 74 74 65  ** tid is omitte
6380: 64 20 69 66 20 77 65 20 63 6f 6d 70 69 6c 65 20  d if we compile 
6390: 77 69 74 68 6f 75 74 20 74 68 72 65 61 64 69 6e  without threadin
63a0: 67 20 73 75 70 70 6f 72 74 20 6f 72 20 6f 6e 20  g support or on 
63b0: 61 6e 20 4f 53 0a 2a 2a 20 6f 74 68 65 72 20 74  an OS.** other t
63c0: 68 61 6e 20 6c 69 6e 75 78 2e 0a 2a 2f 0a 73 74  han linux..*/.st
63d0: 72 75 63 74 20 75 6e 69 78 4c 6f 63 6b 4b 65 79  ruct unixLockKey
63e0: 20 7b 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78   {.  struct unix
63f0: 46 69 6c 65 49 64 20 66 69 64 3b 20 20 2f 2a 20  FileId fid;  /* 
6400: 55 6e 69 71 75 65 20 69 64 65 6e 74 69 66 69 65  Unique identifie
6410: 72 20 66 6f 72 20 74 68 65 20 66 69 6c 65 20 2a  r for the file *
6420: 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52  /.#if SQLITE_THR
6430: 45 41 44 53 41 46 45 20 26 26 20 64 65 66 69 6e  EADSAFE && defin
6440: 65 64 28 5f 5f 6c 69 6e 75 78 5f 5f 29 0a 20 20  ed(__linux__).  
6450: 70 74 68 72 65 61 64 5f 74 20 74 69 64 3b 20 20  pthread_t tid;  
6460: 2f 2a 20 54 68 72 65 61 64 20 49 44 20 6f 66 20  /* Thread ID of 
6470: 6c 6f 63 6b 20 6f 77 6e 65 72 2e 20 5a 65 72 6f  lock owner. Zero
6480: 20 69 66 20 6e 6f 74 20 75 73 69 6e 67 20 4c 69   if not using Li
6490: 6e 75 78 54 68 72 65 61 64 73 20 2a 2f 0a 23 65  nuxThreads */.#e
64a0: 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  ndif.};../*.** A
64b0: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
64c0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
64d0: 63 74 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74  cture is allocat
64e0: 65 64 20 66 6f 72 20 65 61 63 68 20 6f 70 65 6e  ed for each open
64f0: 0a 2a 2a 20 69 6e 6f 64 65 2e 20 20 4f 72 2c 20  .** inode.  Or, 
6500: 6f 6e 20 4c 69 6e 75 78 54 68 72 65 61 64 73 2c  on LinuxThreads,
6510: 20 74 68 65 72 65 20 69 73 20 6f 6e 65 20 6f 66   there is one of
6520: 20 74 68 65 73 65 20 73 74 72 75 63 74 75 72 65   these structure
6530: 73 20 66 6f 72 0a 2a 2a 20 65 61 63 68 20 69 6e  s for.** each in
6540: 6f 64 65 20 6f 70 65 6e 65 64 20 62 79 20 65 61  ode opened by ea
6550: 63 68 20 74 68 72 65 61 64 2e 0a 2a 2a 0a 2a 2a  ch thread..**.**
6560: 20 41 20 73 69 6e 67 6c 65 20 69 6e 6f 64 65 20   A single inode 
6570: 63 61 6e 20 68 61 76 65 20 6d 75 6c 74 69 70 6c  can have multipl
6580: 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
6590: 72 73 2c 20 73 6f 20 65 61 63 68 20 75 6e 69 78  rs, so each unix
65a0: 46 69 6c 65 0a 2a 2a 20 73 74 72 75 63 74 75 72  File.** structur
65b0: 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69  e contains a poi
65c0: 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e 73 74 61  nter to an insta
65d0: 6e 63 65 20 6f 66 20 74 68 69 73 20 6f 62 6a 65  nce of this obje
65e0: 63 74 20 61 6e 64 20 74 68 69 73 0a 2a 2a 20 6f  ct and this.** o
65f0: 62 6a 65 63 74 20 6b 65 65 70 73 20 61 20 63 6f  bject keeps a co
6600: 75 6e 74 20 6f 66 20 74 68 65 20 6e 75 6d 62 65  unt of the numbe
6610: 72 20 6f 66 20 75 6e 69 78 46 69 6c 65 20 70 6f  r of unixFile po
6620: 69 6e 74 69 6e 67 20 74 6f 20 69 74 2e 0a 2a 2f  inting to it..*/
6630: 0a 73 74 72 75 63 74 20 75 6e 69 78 4c 6f 63 6b  .struct unixLock
6640: 49 6e 66 6f 20 7b 0a 20 20 73 74 72 75 63 74 20  Info {.  struct 
6650: 75 6e 69 78 4c 6f 63 6b 4b 65 79 20 6c 6f 63 6b  unixLockKey lock
6660: 4b 65 79 3b 20 20 20 20 20 2f 2a 20 54 68 65 20  Key;     /* The 
6670: 6c 6f 6f 6b 75 70 20 6b 65 79 20 2a 2f 0a 20 20  lookup key */.  
6680: 69 6e 74 20 63 6e 74 3b 20 20 20 20 20 20 20 20  int cnt;        
6690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
66a0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 53 48 41  /* Number of SHA
66b0: 52 45 44 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a  RED locks held *
66c0: 2f 0a 20 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65  /.  int locktype
66d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
66e0: 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 53 48      /* One of SH
66f0: 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45 53 45 52  ARED_LOCK, RESER
6700: 56 45 44 5f 4c 4f 43 4b 20 65 74 63 2e 20 2a 2f  VED_LOCK etc. */
6710: 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20  .  int nRef;    
6720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6730: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
6740: 70 6f 69 6e 74 65 72 73 20 74 6f 20 74 68 69 73  pointers to this
6750: 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20   structure */.  
6760: 73 74 72 75 63 74 20 75 6e 69 78 4c 6f 63 6b 49  struct unixLockI
6770: 6e 66 6f 20 2a 70 4e 65 78 74 3b 20 20 20 20 20  nfo *pNext;     
6780: 2f 2a 20 4c 69 73 74 20 6f 66 20 61 6c 6c 20 75  /* List of all u
6790: 6e 69 78 4c 6f 63 6b 49 6e 66 6f 20 6f 62 6a 65  nixLockInfo obje
67a0: 63 74 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  cts */.  struct 
67b0: 75 6e 69 78 4c 6f 63 6b 49 6e 66 6f 20 2a 70 50  unixLockInfo *pP
67c0: 72 65 76 3b 20 20 20 20 20 2f 2a 20 20 20 20 2e  rev;     /*    .
67d0: 2e 2e 2e 20 64 6f 75 62 6c 79 20 6c 69 6e 6b 65  ... doubly linke
67e0: 64 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  d */.};../*.** A
67f0: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
6800: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
6810: 63 74 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74  cture is allocat
6820: 65 64 20 66 6f 72 20 65 61 63 68 20 6f 70 65 6e  ed for each open
6830: 0a 2a 2a 20 69 6e 6f 64 65 2e 20 20 54 68 69 73  .** inode.  This
6840: 20 73 74 72 75 63 74 75 72 65 20 6b 65 65 70 73   structure keeps
6850: 20 74 72 61 63 6b 20 6f 66 20 74 68 65 20 6e 75   track of the nu
6860: 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73 20 6f 6e  mber of locks on
6870: 20 74 68 61 74 0a 2a 2a 20 69 6e 6f 64 65 2e 20   that.** inode. 
6880: 20 49 66 20 61 20 63 6c 6f 73 65 20 69 73 20 61   If a close is a
6890: 74 74 65 6d 70 74 65 64 20 61 67 61 69 6e 73 74  ttempted against
68a0: 20 61 6e 20 69 6e 6f 64 65 20 74 68 61 74 20 69   an inode that i
68b0: 73 20 68 6f 6c 64 69 6e 67 0a 2a 2a 20 6c 6f 63  s holding.** loc
68c0: 6b 73 2c 20 74 68 65 20 63 6c 6f 73 65 20 69 73  ks, the close is
68d0: 20 64 65 66 65 72 72 65 64 20 75 6e 74 69 6c 20   deferred until 
68e0: 61 6c 6c 20 6c 6f 63 6b 73 20 63 6c 65 61 72 20  all locks clear 
68f0: 62 79 20 61 64 64 69 6e 67 20 74 68 65 0a 2a 2a  by adding the.**
6900: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
6910: 20 74 6f 20 62 65 20 63 6c 6f 73 65 64 20 74 6f   to be closed to
6920: 20 74 68 65 20 70 65 6e 64 69 6e 67 20 6c 69 73   the pending lis
6930: 74 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 20  t..**.** TODO:  
6940: 43 6f 6e 73 69 64 65 72 20 63 68 61 6e 67 69 6e  Consider changin
6950: 67 20 74 68 69 73 20 73 6f 20 74 68 61 74 20 74  g this so that t
6960: 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 61 20 73  here is only a s
6970: 69 6e 67 6c 65 20 66 69 6c 65 0a 2a 2a 20 64 65  ingle file.** de
6980: 73 63 72 69 70 74 6f 72 20 66 6f 72 20 65 61 63  scriptor for eac
6990: 68 20 6f 70 65 6e 20 66 69 6c 65 2c 20 65 76 65  h open file, eve
69a0: 6e 20 77 68 65 6e 20 69 74 20 69 73 20 6f 70 65  n when it is ope
69b0: 6e 65 64 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d  ned multiple tim
69c0: 65 73 2e 0a 2a 2a 20 54 68 65 20 63 6c 6f 73 65  es..** The close
69d0: 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 77  () system call w
69e0: 6f 75 6c 64 20 6f 6e 6c 79 20 6f 63 63 75 72 20  ould only occur 
69f0: 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20 64 61  when the last da
6a00: 74 61 62 61 73 65 0a 2a 2a 20 75 73 69 6e 67 20  tabase.** using 
6a10: 74 68 65 20 66 69 6c 65 20 63 6c 6f 73 65 73 2e  the file closes.
6a20: 0a 2a 2f 0a 73 74 72 75 63 74 20 75 6e 69 78 4f  .*/.struct unixO
6a30: 70 65 6e 43 6e 74 20 7b 0a 20 20 73 74 72 75 63  penCnt {.  struc
6a40: 74 20 75 6e 69 78 46 69 6c 65 49 64 20 66 69 6c  t unixFileId fil
6a50: 65 49 64 3b 20 20 20 2f 2a 20 54 68 65 20 6c 6f  eId;   /* The lo
6a60: 6f 6b 75 70 20 6b 65 79 20 2a 2f 0a 20 20 69 6e  okup key */.  in
6a70: 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20  t nRef;         
6a80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
6a90: 62 65 72 20 6f 66 20 70 6f 69 6e 74 65 72 73 20  ber of pointers 
6aa0: 74 6f 20 74 68 69 73 20 73 74 72 75 63 74 75 72  to this structur
6ab0: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f 63 6b  e */.  int nLock
6ac0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
6ad0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
6ae0: 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b  outstanding lock
6af0: 73 20 2a 2f 0a 20 20 55 6e 69 78 55 6e 75 73 65  s */.  UnixUnuse
6b00: 64 46 64 20 2a 70 55 6e 75 73 65 64 3b 20 20 20  dFd *pUnused;   
6b10: 20 20 20 2f 2a 20 55 6e 75 73 65 64 20 66 69 6c     /* Unused fil
6b20: 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 74 6f  e descriptors to
6b30: 20 63 6c 6f 73 65 20 2a 2f 0a 23 69 66 20 4f 53   close */.#if OS
6b40: 5f 56 58 57 4f 52 4b 53 0a 20 20 73 65 6d 5f 74  _VXWORKS.  sem_t
6b50: 20 2a 70 53 65 6d 3b 20 20 20 20 20 20 20 20 20   *pSem;         
6b60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
6b70: 61 6d 65 64 20 50 4f 53 49 58 20 73 65 6d 61 70  amed POSIX semap
6b80: 68 6f 72 65 20 2a 2f 0a 20 20 63 68 61 72 20 61  hore */.  char a
6b90: 53 65 6d 4e 61 6d 65 5b 4d 41 58 5f 50 41 54 48  SemName[MAX_PATH
6ba0: 4e 41 4d 45 2b 32 5d 3b 20 20 20 2f 2a 20 4e 61  NAME+2];   /* Na
6bb0: 6d 65 20 6f 66 20 74 68 61 74 20 73 65 6d 61 70  me of that semap
6bc0: 68 6f 72 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 20  hore */.#endif. 
6bd0: 20 73 74 72 75 63 74 20 75 6e 69 78 4f 70 65 6e   struct unixOpen
6be0: 43 6e 74 20 2a 70 4e 65 78 74 2c 20 2a 70 50 72  Cnt *pNext, *pPr
6bf0: 65 76 3b 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66  ev;   /* List of
6c00: 20 61 6c 6c 20 75 6e 69 78 4f 70 65 6e 43 6e 74   all unixOpenCnt
6c10: 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 7d 3b 0a 0a   objects */.};..
6c20: 2f 2a 0a 2a 2a 20 4c 69 73 74 73 20 6f 66 20 61  /*.** Lists of a
6c30: 6c 6c 20 75 6e 69 78 4c 6f 63 6b 49 6e 66 6f 20  ll unixLockInfo 
6c40: 61 6e 64 20 75 6e 69 78 4f 70 65 6e 43 6e 74 20  and unixOpenCnt 
6c50: 6f 62 6a 65 63 74 73 2e 20 20 54 68 65 73 65 20  objects.  These 
6c60: 75 73 65 64 20 74 6f 20 62 65 20 68 61 73 68 0a  used to be hash.
6c70: 2a 2a 20 74 61 62 6c 65 73 2e 20 20 42 75 74 20  ** tables.  But 
6c80: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f 62  the number of ob
6c90: 6a 65 63 74 73 20 69 73 20 72 61 72 65 6c 79 20  jects is rarely 
6ca0: 6d 6f 72 65 20 74 68 61 6e 20 61 20 64 6f 7a 65  more than a doze
6cb0: 6e 20 61 6e 64 0a 2a 2a 20 6e 65 76 65 72 20 65  n and.** never e
6cc0: 78 63 65 65 64 73 20 61 20 66 65 77 20 74 68 6f  xceeds a few tho
6cd0: 75 73 61 6e 64 2e 20 20 41 6e 64 20 6c 6f 6f 6b  usand.  And look
6ce0: 75 70 20 69 73 20 6e 6f 74 20 6f 6e 20 61 20 63  up is not on a c
6cf0: 72 69 74 69 63 61 6c 0a 2a 2a 20 70 61 74 68 20  ritical.** path 
6d00: 73 6f 20 61 20 73 69 6d 70 6c 65 20 6c 69 6e 6b  so a simple link
6d10: 65 64 20 6c 69 73 74 20 77 69 6c 6c 20 73 75 66  ed list will suf
6d20: 66 69 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  fice..*/.static 
6d30: 73 74 72 75 63 74 20 75 6e 69 78 4c 6f 63 6b 49  struct unixLockI
6d40: 6e 66 6f 20 2a 6c 6f 63 6b 4c 69 73 74 20 3d 20  nfo *lockList = 
6d50: 30 3b 0a 73 74 61 74 69 63 20 73 74 72 75 63 74  0;.static struct
6d60: 20 75 6e 69 78 4f 70 65 6e 43 6e 74 20 2a 6f 70   unixOpenCnt *op
6d70: 65 6e 4c 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a 0a  enList = 0;../*.
6d80: 2a 2a 20 54 68 69 73 20 76 61 72 69 61 62 6c 65  ** This variable
6d90: 20 72 65 6d 65 6d 62 65 72 73 20 77 68 65 74 68   remembers wheth
6da0: 65 72 20 6f 72 20 6e 6f 74 20 74 68 72 65 61 64  er or not thread
6db0: 73 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20 65  s can override e
6dc0: 61 63 68 20 6f 74 68 65 72 73 0a 2a 2a 20 6c 6f  ach others.** lo
6dd0: 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 30 3a  cks..**.**    0:
6de0: 20 20 4e 6f 2e 20 20 54 68 72 65 61 64 73 20 63    No.  Threads c
6df0: 61 6e 6e 6f 74 20 6f 76 65 72 72 69 64 65 20 65  annot override e
6e00: 61 63 68 20 6f 74 68 65 72 73 20 6c 6f 63 6b 73  ach others locks
6e10: 2e 20 20 28 4c 69 6e 75 78 54 68 72 65 61 64 73  .  (LinuxThreads
6e20: 29 0a 2a 2a 20 20 20 20 31 3a 20 20 59 65 73 2e  ).**    1:  Yes.
6e30: 20 20 54 68 72 65 61 64 73 20 63 61 6e 20 6f 76    Threads can ov
6e40: 65 72 72 69 64 65 20 65 61 63 68 20 6f 74 68 65  erride each othe
6e50: 72 73 20 6c 6f 63 6b 73 2e 20 20 28 50 6f 73 69  rs locks.  (Posi
6e60: 78 20 26 20 4e 4c 50 54 29 0a 2a 2a 20 20 20 2d  x & NLPT).**   -
6e70: 31 3a 20 20 57 65 20 64 6f 6e 27 74 20 6b 6e 6f  1:  We don't kno
6e80: 77 20 79 65 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20  w yet..**.** On 
6e90: 73 6f 6d 65 20 73 79 73 74 65 6d 73 2c 20 77 65  some systems, we
6ea0: 20 6b 6e 6f 77 20 61 74 20 63 6f 6d 70 69 6c 65   know at compile
6eb0: 2d 74 69 6d 65 20 69 66 20 74 68 72 65 61 64 73  -time if threads
6ec0: 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20 65 61   can override ea
6ed0: 63 68 0a 2a 2a 20 6f 74 68 65 72 73 20 6c 6f 63  ch.** others loc
6ee0: 6b 73 2e 20 20 4f 6e 20 74 68 6f 73 65 20 73 79  ks.  On those sy
6ef0: 73 74 65 6d 73 2c 20 74 68 65 20 53 51 4c 49 54  stems, the SQLIT
6f00: 45 5f 54 48 52 45 41 44 5f 4f 56 45 52 52 49 44  E_THREAD_OVERRID
6f10: 45 5f 4c 4f 43 4b 20 6d 61 63 72 6f 0a 2a 2a 20  E_LOCK macro.** 
6f20: 77 69 6c 6c 20 62 65 20 73 65 74 20 61 70 70 72  will be set appr
6f30: 6f 70 72 69 61 74 65 6c 79 2e 20 20 4f 6e 20 6f  opriately.  On o
6f40: 74 68 65 72 20 73 79 73 74 65 6d 73 2c 20 77 65  ther systems, we
6f50: 20 68 61 76 65 20 74 6f 20 63 68 65 63 6b 20 61   have to check a
6f60: 74 0a 2a 2a 20 72 75 6e 74 69 6d 65 2e 20 20 4f  t.** runtime.  O
6f70: 6e 20 74 68 65 73 65 20 6c 61 74 74 65 72 20 73  n these latter s
6f80: 79 73 74 65 6d 73 2c 20 53 51 4c 54 49 45 5f 54  ystems, SQLTIE_T
6f90: 48 52 45 41 44 5f 4f 56 45 52 52 49 44 45 5f 4c  HREAD_OVERRIDE_L
6fa0: 4f 43 4b 20 69 73 0a 2a 2a 20 75 6e 64 65 66 69  OCK is.** undefi
6fb0: 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ned..**.** This 
6fc0: 76 61 72 69 61 62 6c 65 20 6e 6f 72 6d 61 6c 6c  variable normall
6fd0: 79 20 68 61 73 20 66 69 6c 65 20 73 63 6f 70 65  y has file scope
6fe0: 20 6f 6e 6c 79 2e 20 20 42 75 74 20 64 75 72 69   only.  But duri
6ff0: 6e 67 20 74 65 73 74 69 6e 67 2c 20 77 65 20 6d  ng testing, we m
7000: 61 6b 65 0a 2a 2a 20 69 74 20 61 20 67 6c 6f 62  ake.** it a glob
7010: 61 6c 20 73 6f 20 74 68 61 74 20 74 68 65 20 74  al so that the t
7020: 65 73 74 20 63 6f 64 65 20 63 61 6e 20 63 68 61  est code can cha
7030: 6e 67 65 20 69 74 73 20 76 61 6c 75 65 20 69 6e  nge its value in
7040: 20 6f 72 64 65 72 20 74 6f 20 76 65 72 69 66 79   order to verify
7050: 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 72 69 67  .** that the rig
7060: 68 74 20 73 74 75 66 66 20 68 61 70 70 65 6e 73  ht stuff happens
7070: 20 69 6e 20 65 69 74 68 65 72 20 63 61 73 65 2e   in either case.
7080: 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 54  .*/.#if SQLITE_T
7090: 48 52 45 41 44 53 41 46 45 20 26 26 20 64 65 66  HREADSAFE && def
70a0: 69 6e 65 64 28 5f 5f 6c 69 6e 75 78 5f 5f 29 0a  ined(__linux__).
70b0: 23 20 20 69 66 6e 64 65 66 20 53 51 4c 49 54 45  #  ifndef SQLITE
70c0: 5f 54 48 52 45 41 44 5f 4f 56 45 52 52 49 44 45  _THREAD_OVERRIDE
70d0: 5f 4c 4f 43 4b 0a 23 20 20 20 20 64 65 66 69 6e  _LOCK.#    defin
70e0: 65 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 5f  e SQLITE_THREAD_
70f0: 4f 56 45 52 52 49 44 45 5f 4c 4f 43 4b 20 2d 31  OVERRIDE_LOCK -1
7100: 0a 23 20 20 65 6e 64 69 66 0a 23 20 20 69 66 64  .#  endif.#  ifd
7110: 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69  ef SQLITE_TEST.i
7120: 6e 74 20 74 68 72 65 61 64 73 4f 76 65 72 72 69  nt threadsOverri
7130: 64 65 45 61 63 68 4f 74 68 65 72 73 4c 6f 63 6b  deEachOthersLock
7140: 73 20 3d 20 53 51 4c 49 54 45 5f 54 48 52 45 41  s = SQLITE_THREA
7150: 44 5f 4f 56 45 52 52 49 44 45 5f 4c 4f 43 4b 3b  D_OVERRIDE_LOCK;
7160: 0a 23 20 20 65 6c 73 65 0a 73 74 61 74 69 63 20  .#  else.static 
7170: 69 6e 74 20 74 68 72 65 61 64 73 4f 76 65 72 72  int threadsOverr
7180: 69 64 65 45 61 63 68 4f 74 68 65 72 73 4c 6f 63  ideEachOthersLoc
7190: 6b 73 20 3d 20 53 51 4c 49 54 45 5f 54 48 52 45  ks = SQLITE_THRE
71a0: 41 44 5f 4f 56 45 52 52 49 44 45 5f 4c 4f 43 4b  AD_OVERRIDE_LOCK
71b0: 3b 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69  ;.#  endif.#endi
71c0: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 73 74  f../*.** This st
71d0: 72 75 63 74 75 72 65 20 68 6f 6c 64 73 20 69 6e  ructure holds in
71e0: 66 6f 72 6d 61 74 69 6f 6e 20 70 61 73 73 65 64  formation passed
71f0: 20 69 6e 74 6f 20 69 6e 64 69 76 69 64 75 61 6c   into individual
7200: 20 74 65 73 74 0a 2a 2a 20 74 68 72 65 61 64 73   test.** threads
7210: 20 62 79 20 74 68 65 20 74 65 73 74 54 68 72 65   by the testThre
7220: 61 64 4c 6f 63 6b 69 6e 67 42 65 68 61 76 69 6f  adLockingBehavio
7230: 72 28 29 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a  r() routine..*/.
7240: 73 74 72 75 63 74 20 74 68 72 65 61 64 54 65 73  struct threadTes
7250: 74 44 61 74 61 20 7b 0a 20 20 69 6e 74 20 66 64  tData {.  int fd
7260: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7270: 20 2f 2a 20 46 69 6c 65 20 74 6f 20 62 65 20 6c   /* File to be l
7280: 6f 63 6b 65 64 20 2a 2f 0a 20 20 73 74 72 75 63  ocked */.  struc
7290: 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 20 20 20  t flock lock;   
72a0: 20 20 2f 2a 20 54 68 65 20 6c 6f 63 6b 69 6e 67    /* The locking
72b0: 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20   operation */.  
72c0: 69 6e 74 20 72 65 73 75 6c 74 3b 20 20 20 20 20  int result;     
72d0: 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
72e0: 20 6f 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   of the locking 
72f0: 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 7d 3b 0a  operation */.};.
7300: 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45  .#if SQLITE_THRE
7310: 41 44 53 41 46 45 20 26 26 20 64 65 66 69 6e 65  ADSAFE && define
7320: 64 28 5f 5f 6c 69 6e 75 78 5f 5f 29 0a 2f 2a 0a  d(__linux__)./*.
7330: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
7340: 20 69 73 20 75 73 65 64 20 61 73 20 74 68 65 20   is used as the 
7350: 6d 61 69 6e 20 72 6f 75 74 69 6e 65 20 66 6f 72  main routine for
7360: 20 61 20 74 68 72 65 61 64 20 6c 61 75 6e 63 68   a thread launch
7370: 65 64 20 62 79 0a 2a 2a 20 74 65 73 74 54 68 72  ed by.** testThr
7380: 65 61 64 4c 6f 63 6b 69 6e 67 42 65 68 61 76 69  eadLockingBehavi
7390: 6f 72 28 29 2e 20 49 74 20 74 65 73 74 73 20 77  or(). It tests w
73a0: 68 65 74 68 65 72 20 74 68 65 20 73 68 61 72 65  hether the share
73b0: 64 2d 6c 6f 63 6b 20 6f 62 74 61 69 6e 65 64 0a  d-lock obtained.
73c0: 2a 2a 20 62 79 20 74 68 65 20 6d 61 69 6e 20 74  ** by the main t
73d0: 68 72 65 61 64 20 69 6e 20 74 65 73 74 54 68 72  hread in testThr
73e0: 65 61 64 4c 6f 63 6b 69 6e 67 42 65 68 61 76 69  eadLockingBehavi
73f0: 6f 72 28 29 20 63 6f 6e 66 6c 69 63 74 73 20 77  or() conflicts w
7400: 69 74 68 20 61 0a 2a 2a 20 68 79 70 6f 74 68 65  ith a.** hypothe
7410: 74 69 63 61 6c 20 77 72 69 74 65 2d 6c 6f 63 6b  tical write-lock
7420: 20 6f 62 74 61 69 6e 65 64 20 62 79 20 74 68 69   obtained by thi
7430: 73 20 74 68 72 65 61 64 20 6f 6e 20 74 68 65 20  s thread on the 
7440: 73 61 6d 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  same file..**.**
7450: 20 54 68 65 20 77 72 69 74 65 2d 6c 6f 63 6b 20   The write-lock 
7460: 69 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20  is not actually 
7470: 61 63 71 75 69 72 65 64 2c 20 61 73 20 74 68 69  acquired, as thi
7480: 73 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  s is not possibl
7490: 65 20 69 66 20 0a 2a 2a 20 74 68 65 20 66 69 6c  e if .** the fil
74a0: 65 20 69 73 20 6f 70 65 6e 20 69 6e 20 72 65 61  e is open in rea
74b0: 64 2d 6f 6e 6c 79 20 6d 6f 64 65 20 28 73 65 65  d-only mode (see
74c0: 20 74 69 63 6b 65 74 20 23 33 34 37 32 29 2e 0a   ticket #3472)..
74d0: 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20  */ .static void 
74e0: 2a 74 68 72 65 61 64 4c 6f 63 6b 69 6e 67 54 65  *threadLockingTe
74f0: 73 74 28 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a  st(void *pArg){.
7500: 20 20 73 74 72 75 63 74 20 74 68 72 65 61 64 54    struct threadT
7510: 65 73 74 44 61 74 61 20 2a 70 44 61 74 61 20 3d  estData *pData =
7520: 20 28 73 74 72 75 63 74 20 74 68 72 65 61 64 54   (struct threadT
7530: 65 73 74 44 61 74 61 2a 29 70 41 72 67 3b 0a 20  estData*)pArg;. 
7540: 20 70 44 61 74 61 2d 3e 72 65 73 75 6c 74 20 3d   pData->result =
7550: 20 66 63 6e 74 6c 28 70 44 61 74 61 2d 3e 66 64   fcntl(pData->fd
7560: 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 70 44 61 74  , F_GETLK, &pDat
7570: 61 2d 3e 6c 6f 63 6b 29 3b 0a 20 20 72 65 74 75  a->lock);.  retu
7580: 72 6e 20 70 41 72 67 3b 0a 7d 0a 23 65 6e 64 69  rn pArg;.}.#endi
7590: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 54 48 52 45  f /* SQLITE_THRE
75a0: 41 44 53 41 46 45 20 26 26 20 64 65 66 69 6e 65  ADSAFE && define
75b0: 64 28 5f 5f 6c 69 6e 75 78 5f 5f 29 20 2a 2f 0a  d(__linux__) */.
75c0: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52  ..#if SQLITE_THR
75d0: 45 41 44 53 41 46 45 20 26 26 20 64 65 66 69 6e  EADSAFE && defin
75e0: 65 64 28 5f 5f 6c 69 6e 75 78 5f 5f 29 0a 2f 2a  ed(__linux__)./*
75f0: 0a 2a 2a 20 54 68 69 73 20 70 72 6f 63 65 64 75  .** This procedu
7600: 72 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20 64  re attempts to d
7610: 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72  etermine whether
7620: 20 6f 72 20 6e 6f 74 20 74 68 72 65 61 64 73 0a   or not threads.
7630: 2a 2a 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20  ** can override 
7640: 65 61 63 68 20 6f 74 68 65 72 73 20 6c 6f 63 6b  each others lock
7650: 73 20 74 68 65 6e 20 73 65 74 73 20 74 68 65 20  s then sets the 
7660: 0a 2a 2a 20 74 68 72 65 61 64 73 4f 76 65 72 72  .** threadsOverr
7670: 69 64 65 45 61 63 68 4f 74 68 65 72 73 4c 6f 63  ideEachOthersLoc
7680: 6b 73 20 76 61 72 69 61 62 6c 65 20 61 70 70 72  ks variable appr
7690: 6f 70 72 69 61 74 65 6c 79 2e 0a 2a 2f 0a 73 74  opriately..*/.st
76a0: 61 74 69 63 20 76 6f 69 64 20 74 65 73 74 54 68  atic void testTh
76b0: 72 65 61 64 4c 6f 63 6b 69 6e 67 42 65 68 61 76  readLockingBehav
76c0: 69 6f 72 28 69 6e 74 20 66 64 5f 6f 72 69 67 29  ior(int fd_orig)
76d0: 7b 0a 20 20 69 6e 74 20 66 64 3b 0a 20 20 69 6e  {.  int fd;.  in
76e0: 74 20 72 63 3b 0a 20 20 73 74 72 75 63 74 20 74  t rc;.  struct t
76f0: 68 72 65 61 64 54 65 73 74 44 61 74 61 20 64 3b  hreadTestData d;
7700: 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20  .  struct flock 
7710: 6c 3b 0a 20 20 70 74 68 72 65 61 64 5f 74 20 74  l;.  pthread_t t
7720: 3b 0a 0a 20 20 66 64 20 3d 20 64 75 70 28 66 64  ;..  fd = dup(fd
7730: 5f 6f 72 69 67 29 3b 0a 20 20 69 66 28 20 66 64  _orig);.  if( fd
7740: 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 6d  <0 ) return;.  m
7750: 65 6d 73 65 74 28 26 6c 2c 20 30 2c 20 73 69 7a  emset(&l, 0, siz
7760: 65 6f 66 28 6c 29 29 3b 0a 20 20 6c 2e 6c 5f 74  eof(l));.  l.l_t
7770: 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20  ype = F_RDLCK;. 
7780: 20 6c 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20   l.l_len = 1;.  
7790: 6c 2e 6c 5f 73 74 61 72 74 20 3d 20 30 3b 0a 20  l.l_start = 0;. 
77a0: 20 6c 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45   l.l_whence = SE
77b0: 45 4b 5f 53 45 54 3b 0a 20 20 72 63 20 3d 20 66  EK_SET;.  rc = f
77c0: 63 6e 74 6c 28 66 64 5f 6f 72 69 67 2c 20 46 5f  cntl(fd_orig, F_
77d0: 53 45 54 4c 4b 2c 20 26 6c 29 3b 0a 20 20 69 66  SETLK, &l);.  if
77e0: 28 20 72 63 21 3d 30 20 29 20 72 65 74 75 72 6e  ( rc!=0 ) return
77f0: 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 2c 20 30  ;.  memset(&d, 0
7800: 2c 20 73 69 7a 65 6f 66 28 64 29 29 3b 0a 20 20  , sizeof(d));.  
7810: 64 2e 66 64 20 3d 20 66 64 3b 0a 20 20 64 2e 6c  d.fd = fd;.  d.l
7820: 6f 63 6b 20 3d 20 6c 3b 0a 20 20 64 2e 6c 6f 63  ock = l;.  d.loc
7830: 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57 52 4c  k.l_type = F_WRL
7840: 43 4b 3b 0a 20 20 69 66 28 20 70 74 68 72 65 61  CK;.  if( pthrea
7850: 64 5f 63 72 65 61 74 65 28 26 74 2c 20 30 2c 20  d_create(&t, 0, 
7860: 74 68 72 65 61 64 4c 6f 63 6b 69 6e 67 54 65 73  threadLockingTes
7870: 74 2c 20 26 64 29 3d 3d 30 20 29 7b 0a 20 20 20  t, &d)==0 ){.   
7880: 20 70 74 68 72 65 61 64 5f 6a 6f 69 6e 28 74 2c   pthread_join(t,
7890: 20 30 29 3b 0a 20 20 7d 0a 20 20 63 6c 6f 73 65   0);.  }.  close
78a0: 28 66 64 29 3b 0a 20 20 69 66 28 20 64 2e 72 65  (fd);.  if( d.re
78b0: 73 75 6c 74 21 3d 30 20 29 20 72 65 74 75 72 6e  sult!=0 ) return
78c0: 3b 0a 20 20 74 68 72 65 61 64 73 4f 76 65 72 72  ;.  threadsOverr
78d0: 69 64 65 45 61 63 68 4f 74 68 65 72 73 4c 6f 63  ideEachOthersLoc
78e0: 6b 73 20 3d 20 28 64 2e 6c 6f 63 6b 2e 6c 5f 74  ks = (d.lock.l_t
78f0: 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 29 3b 0a 7d  ype==F_UNLCK);.}
7900: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
7910: 45 5f 54 48 52 45 41 44 53 41 46 45 20 26 26 20  E_THREADSAFE && 
7920: 64 65 66 69 6e 65 64 28 5f 5f 6c 69 6e 75 78 5f  defined(__linux_
7930: 5f 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c  _) */../*.** Rel
7940: 65 61 73 65 20 61 20 75 6e 69 78 4c 6f 63 6b 49  ease a unixLockI
7950: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 70 72  nfo structure pr
7960: 65 76 69 6f 75 73 6c 79 20 61 6c 6c 6f 63 61 74  eviously allocat
7970: 65 64 20 62 79 20 66 69 6e 64 4c 6f 63 6b 49 6e  ed by findLockIn
7980: 66 6f 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  fo()..**.** The 
7990: 6d 75 74 65 78 20 65 6e 74 65 72 65 64 20 75 73  mutex entered us
79a0: 69 6e 67 20 74 68 65 20 75 6e 69 78 45 6e 74 65  ing the unixEnte
79b0: 72 4d 75 74 65 78 28 29 20 66 75 6e 63 74 69 6f  rMutex() functio
79c0: 6e 20 6d 75 73 74 20 62 65 20 68 65 6c 64 0a 2a  n must be held.*
79d0: 2a 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  * when this func
79e0: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a  tion is called..
79f0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
7a00: 65 6c 65 61 73 65 4c 6f 63 6b 49 6e 66 6f 28 73  eleaseLockInfo(s
7a10: 74 72 75 63 74 20 75 6e 69 78 4c 6f 63 6b 49 6e  truct unixLockIn
7a20: 66 6f 20 2a 70 4c 6f 63 6b 29 7b 0a 20 20 61 73  fo *pLock){.  as
7a30: 73 65 72 74 28 20 75 6e 69 78 4d 75 74 65 78 48  sert( unixMutexH
7a40: 65 6c 64 28 29 20 29 3b 0a 20 20 69 66 28 20 70  eld() );.  if( p
7a50: 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70 4c 6f 63  Lock ){.    pLoc
7a60: 6b 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 69  k->nRef--;.    i
7a70: 66 28 20 70 4c 6f 63 6b 2d 3e 6e 52 65 66 3d 3d  f( pLock->nRef==
7a80: 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  0 ){.      if( p
7a90: 4c 6f 63 6b 2d 3e 70 50 72 65 76 20 29 7b 0a 20  Lock->pPrev ){. 
7aa0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
7ab0: 4c 6f 63 6b 2d 3e 70 50 72 65 76 2d 3e 70 4e 65  Lock->pPrev->pNe
7ac0: 78 74 3d 3d 70 4c 6f 63 6b 20 29 3b 0a 20 20 20  xt==pLock );.   
7ad0: 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 70 50 72 65       pLock->pPre
7ae0: 76 2d 3e 70 4e 65 78 74 20 3d 20 70 4c 6f 63 6b  v->pNext = pLock
7af0: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  ->pNext;.      }
7b00: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73  else{.        as
7b10: 73 65 72 74 28 20 6c 6f 63 6b 4c 69 73 74 3d 3d  sert( lockList==
7b20: 70 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 20 20 20  pLock );.       
7b30: 20 6c 6f 63 6b 4c 69 73 74 20 3d 20 70 4c 6f 63   lockList = pLoc
7b40: 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  k->pNext;.      
7b50: 7d 0a 20 20 20 20 20 20 69 66 28 20 70 4c 6f 63  }.      if( pLoc
7b60: 6b 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20  k->pNext ){.    
7b70: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63      assert( pLoc
7b80: 6b 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 3d  k->pNext->pPrev=
7b90: 3d 70 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 20 20  =pLock );.      
7ba0: 20 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 2d 3e    pLock->pNext->
7bb0: 70 50 72 65 76 20 3d 20 70 4c 6f 63 6b 2d 3e 70  pPrev = pLock->p
7bc0: 50 72 65 76 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Prev;.      }.  
7bd0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
7be0: 28 70 4c 6f 63 6b 29 3b 0a 20 20 20 20 7d 0a 20  (pLock);.    }. 
7bf0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65   }.}../*.** Rele
7c00: 61 73 65 20 61 20 75 6e 69 78 4f 70 65 6e 43 6e  ase a unixOpenCn
7c10: 74 20 73 74 72 75 63 74 75 72 65 20 70 72 65 76  t structure prev
7c20: 69 6f 75 73 6c 79 20 61 6c 6c 6f 63 61 74 65 64  iously allocated
7c30: 20 62 79 20 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f   by findLockInfo
7c40: 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 75  ()..**.** The mu
7c50: 74 65 78 20 65 6e 74 65 72 65 64 20 75 73 69 6e  tex entered usin
7c60: 67 20 74 68 65 20 75 6e 69 78 45 6e 74 65 72 4d  g the unixEnterM
7c70: 75 74 65 78 28 29 20 66 75 6e 63 74 69 6f 6e 20  utex() function 
7c80: 6d 75 73 74 20 62 65 20 68 65 6c 64 0a 2a 2a 20  must be held.** 
7c90: 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
7ca0: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f  on is called..*/
7cb0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c  .static void rel
7cc0: 65 61 73 65 4f 70 65 6e 43 6e 74 28 73 74 72 75  easeOpenCnt(stru
7cd0: 63 74 20 75 6e 69 78 4f 70 65 6e 43 6e 74 20 2a  ct unixOpenCnt *
7ce0: 70 4f 70 65 6e 29 7b 0a 20 20 61 73 73 65 72 74  pOpen){.  assert
7cf0: 28 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28  ( unixMutexHeld(
7d00: 29 20 29 3b 0a 20 20 69 66 28 20 70 4f 70 65 6e  ) );.  if( pOpen
7d10: 20 29 7b 0a 20 20 20 20 70 4f 70 65 6e 2d 3e 6e   ){.    pOpen->n
7d20: 52 65 66 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70  Ref--;.    if( p
7d30: 4f 70 65 6e 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b  Open->nRef==0 ){
7d40: 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70 65 6e  .      if( pOpen
7d50: 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20 20  ->pPrev ){.     
7d60: 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 65 6e     assert( pOpen
7d70: 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 3d 3d  ->pPrev->pNext==
7d80: 70 4f 70 65 6e 20 29 3b 0a 20 20 20 20 20 20 20  pOpen );.       
7d90: 20 70 4f 70 65 6e 2d 3e 70 50 72 65 76 2d 3e 70   pOpen->pPrev->p
7da0: 4e 65 78 74 20 3d 20 70 4f 70 65 6e 2d 3e 70 4e  Next = pOpen->pN
7db0: 65 78 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ext;.      }else
7dc0: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
7dd0: 28 20 6f 70 65 6e 4c 69 73 74 3d 3d 70 4f 70 65  ( openList==pOpe
7de0: 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 6f 70 65  n );.        ope
7df0: 6e 4c 69 73 74 20 3d 20 70 4f 70 65 6e 2d 3e 70  nList = pOpen->p
7e00: 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Next;.      }.  
7e10: 20 20 20 20 69 66 28 20 70 4f 70 65 6e 2d 3e 70      if( pOpen->p
7e20: 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Next ){.        
7e30: 61 73 73 65 72 74 28 20 70 4f 70 65 6e 2d 3e 70  assert( pOpen->p
7e40: 4e 65 78 74 2d 3e 70 50 72 65 76 3d 3d 70 4f 70  Next->pPrev==pOp
7e50: 65 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4f  en );.        pO
7e60: 70 65 6e 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65  pen->pNext->pPre
7e70: 76 20 3d 20 70 4f 70 65 6e 2d 3e 70 50 72 65 76  v = pOpen->pPrev
7e80: 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 20 53 51  ;.      }.#if SQ
7e90: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 20  LITE_THREADSAFE 
7ea0: 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 6c 69 6e  && defined(__lin
7eb0: 75 78 5f 5f 29 0a 20 20 20 20 20 20 61 73 73 65  ux__).      asse
7ec0: 72 74 28 20 21 70 4f 70 65 6e 2d 3e 70 55 6e 75  rt( !pOpen->pUnu
7ed0: 73 65 64 20 7c 7c 20 74 68 72 65 61 64 73 4f 76  sed || threadsOv
7ee0: 65 72 72 69 64 65 45 61 63 68 4f 74 68 65 72 73  errideEachOthers
7ef0: 4c 6f 63 6b 73 3d 3d 30 20 29 3b 0a 23 65 6e 64  Locks==0 );.#end
7f00: 69 66 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  if..      /* If 
7f10: 70 4f 70 65 6e 2d 3e 70 55 6e 75 73 65 64 20 69  pOpen->pUnused i
7f20: 73 20 6e 6f 74 20 6e 75 6c 6c 2c 20 74 68 65 6e  s not null, then
7f30: 20 6d 65 6d 6f 72 79 20 61 6e 64 20 66 69 6c 65   memory and file
7f40: 2d 64 65 73 63 72 69 70 74 6f 72 73 0a 20 20 20  -descriptors.   
7f50: 20 20 20 2a 2a 20 61 72 65 20 6c 65 61 6b 65 64     ** are leaked
7f60: 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
7f70: 20 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 6f 6e   ** This will on
7f80: 6c 79 20 68 61 70 70 65 6e 20 69 66 2c 20 75 6e  ly happen if, un
7f90: 64 65 72 20 4c 69 6e 75 78 74 68 72 65 61 64 73  der Linuxthreads
7fa0: 2c 20 74 68 65 20 75 73 65 72 20 68 61 73 20 6f  , the user has o
7fb0: 70 65 6e 65 64 0a 20 20 20 20 20 20 2a 2a 20 61  pened.      ** a
7fc0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20   transaction in 
7fd0: 6f 6e 65 20 74 68 72 65 61 64 2c 20 74 68 65 6e  one thread, then
7fe0: 20 61 74 74 65 6d 70 74 73 20 74 6f 20 63 6c 6f   attempts to clo
7ff0: 73 65 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  se the database.
8000: 20 20 20 20 20 20 2a 2a 20 68 61 6e 64 6c 65 20        ** handle 
8010: 66 72 6f 6d 20 61 6e 6f 74 68 65 72 20 74 68 72  from another thr
8020: 65 61 64 20 28 77 69 74 68 6f 75 74 20 66 69 72  ead (without fir
8030: 73 74 20 75 6e 6c 6f 63 6b 69 6e 67 20 74 68 65  st unlocking the
8040: 20 64 62 20 66 69 6c 65 29 2e 0a 20 20 20 20 20   db file)..     
8050: 20 2a 2a 20 54 68 69 73 20 69 73 20 61 20 6d 69   ** This is a mi
8060: 73 75 73 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20  suse.  */.      
8070: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4f 70  sqlite3_free(pOp
8080: 65 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  en);.    }.  }.}
8090: 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20  ../*.** Given a 
80a0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2c  file descriptor,
80b0: 20 6c 6f 63 61 74 65 20 75 6e 69 78 4c 6f 63 6b   locate unixLock
80c0: 49 6e 66 6f 20 61 6e 64 20 75 6e 69 78 4f 70 65  Info and unixOpe
80d0: 6e 43 6e 74 20 73 74 72 75 63 74 75 72 65 73 20  nCnt structures 
80e0: 74 68 61 74 0a 2a 2a 20 64 65 73 63 72 69 62 65  that.** describe
80f0: 73 20 74 68 61 74 20 66 69 6c 65 20 64 65 73 63  s that file desc
8100: 72 69 70 74 6f 72 2e 20 20 43 72 65 61 74 65 20  riptor.  Create 
8110: 6e 65 77 20 6f 6e 65 73 20 69 66 20 6e 65 63 65  new ones if nece
8120: 73 73 61 72 79 2e 20 20 54 68 65 0a 2a 2a 20 72  ssary.  The.** r
8130: 65 74 75 72 6e 20 76 61 6c 75 65 73 20 6d 69 67  eturn values mig
8140: 68 74 20 62 65 20 75 6e 69 6e 69 74 69 61 6c 69  ht be uninitiali
8150: 7a 65 64 20 69 66 20 61 6e 20 65 72 72 6f 72 20  zed if an error 
8160: 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  occurs..**.** Th
8170: 65 20 6d 75 74 65 78 20 65 6e 74 65 72 65 64 20  e mutex entered 
8180: 75 73 69 6e 67 20 74 68 65 20 75 6e 69 78 45 6e  using the unixEn
8190: 74 65 72 4d 75 74 65 78 28 29 20 66 75 6e 63 74  terMutex() funct
81a0: 69 6f 6e 20 6d 75 73 74 20 62 65 20 68 65 6c 64  ion must be held
81b0: 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73 20 66 75  .** when this fu
81c0: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
81d0: 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ..**.** Return a
81e0: 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72  n appropriate er
81f0: 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61  ror code..*/.sta
8200: 74 69 63 20 69 6e 74 20 66 69 6e 64 4c 6f 63 6b  tic int findLock
8210: 49 6e 66 6f 28 0a 20 20 75 6e 69 78 46 69 6c 65  Info(.  unixFile
8220: 20 2a 70 46 69 6c 65 2c 20 20 20 20 20 20 20 20   *pFile,        
8230: 20 20 20 20 20 20 20 2f 2a 20 55 6e 69 78 20 66         /* Unix f
8240: 69 6c 65 20 77 69 74 68 20 66 69 6c 65 20 64 65  ile with file de
8250: 73 63 20 75 73 65 64 20 69 6e 20 74 68 65 20 6b  sc used in the k
8260: 65 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 75  ey */.  struct u
8270: 6e 69 78 4c 6f 63 6b 49 6e 66 6f 20 2a 2a 70 70  nixLockInfo **pp
8280: 4c 6f 63 6b 2c 20 20 2f 2a 20 52 65 74 75 72 6e  Lock,  /* Return
8290: 20 74 68 65 20 75 6e 69 78 4c 6f 63 6b 49 6e 66   the unixLockInf
82a0: 6f 20 73 74 72 75 63 74 75 72 65 20 68 65 72 65  o structure here
82b0: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 75 6e 69   */.  struct uni
82c0: 78 4f 70 65 6e 43 6e 74 20 2a 2a 70 70 4f 70 65  xOpenCnt **ppOpe
82d0: 6e 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74  n    /* Return t
82e0: 68 65 20 75 6e 69 78 4f 70 65 6e 43 6e 74 20 73  he unixOpenCnt s
82f0: 74 72 75 63 74 75 72 65 20 68 65 72 65 20 2a 2f  tructure here */
8300: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  .){.  int rc;   
8310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8320: 20 20 20 20 20 2f 2a 20 53 79 73 74 65 6d 20 63       /* System c
8330: 61 6c 6c 20 72 65 74 75 72 6e 20 63 6f 64 65 20  all return code 
8340: 2a 2f 0a 20 20 69 6e 74 20 66 64 3b 20 20 20 20  */.  int fd;    
8350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8360: 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20      /* The file 
8370: 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20 70  descriptor for p
8380: 46 69 6c 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  File */.  struct
8390: 20 75 6e 69 78 4c 6f 63 6b 4b 65 79 20 6c 6f 63   unixLockKey loc
83a0: 6b 4b 65 79 3b 20 20 20 20 2f 2a 20 4c 6f 6f 6b  kKey;    /* Look
83b0: 75 70 20 6b 65 79 20 66 6f 72 20 74 68 65 20 75  up key for the u
83c0: 6e 69 78 4c 6f 63 6b 49 6e 66 6f 20 73 74 72 75  nixLockInfo stru
83d0: 63 74 75 72 65 20 2a 2f 0a 20 20 73 74 72 75 63  cture */.  struc
83e0: 74 20 75 6e 69 78 46 69 6c 65 49 64 20 66 69 6c  t unixFileId fil
83f0: 65 49 64 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 6f  eId;      /* Loo
8400: 6b 75 70 20 6b 65 79 20 66 6f 72 20 74 68 65 20  kup key for the 
8410: 75 6e 69 78 4f 70 65 6e 43 6e 74 20 73 74 72 75  unixOpenCnt stru
8420: 63 74 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73  ct */.  struct s
8430: 74 61 74 20 73 74 61 74 62 75 66 3b 20 20 20 20  tat statbuf;    
8440: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 77 2d 6c 65         /* Low-le
8450: 76 65 6c 20 66 69 6c 65 20 69 6e 66 6f 72 6d 61  vel file informa
8460: 74 69 6f 6e 20 2a 2f 0a 20 20 73 74 72 75 63 74  tion */.  struct
8470: 20 75 6e 69 78 4c 6f 63 6b 49 6e 66 6f 20 2a 70   unixLockInfo *p
8480: 4c 6f 63 6b 20 3d 20 30 3b 2f 2a 20 43 61 6e 64  Lock = 0;/* Cand
8490: 69 64 61 74 65 20 75 6e 69 78 4c 6f 63 6b 49 6e  idate unixLockIn
84a0: 66 6f 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 73  fo object */.  s
84b0: 74 72 75 63 74 20 75 6e 69 78 4f 70 65 6e 43 6e  truct unixOpenCn
84c0: 74 20 2a 70 4f 70 65 6e 3b 20 20 20 20 20 2f 2a  t *pOpen;     /*
84d0: 20 43 61 6e 64 69 64 61 74 65 20 75 6e 69 78 4f   Candidate unixO
84e0: 70 65 6e 43 6e 74 20 6f 62 6a 65 63 74 20 2a 2f  penCnt object */
84f0: 0a 0a 20 20 61 73 73 65 72 74 28 20 75 6e 69 78  ..  assert( unix
8500: 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 0a  MutexHeld() );..
8510: 20 20 2f 2a 20 47 65 74 20 6c 6f 77 2d 6c 65 76    /* Get low-lev
8520: 65 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  el information a
8530: 62 6f 75 74 20 74 68 65 20 66 69 6c 65 20 74 68  bout the file th
8540: 61 74 20 77 65 20 63 61 6e 20 75 73 65 64 20 74  at we can used t
8550: 6f 0a 20 20 2a 2a 20 63 72 65 61 74 65 20 61 20  o.  ** create a 
8560: 75 6e 69 71 75 65 20 6e 61 6d 65 20 66 6f 72 20  unique name for 
8570: 74 68 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20  the file..  */. 
8580: 20 66 64 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a   fd = pFile->h;.
8590: 20 20 72 63 20 3d 20 66 73 74 61 74 28 66 64 2c    rc = fstat(fd,
85a0: 20 26 73 74 61 74 62 75 66 29 3b 0a 20 20 69 66   &statbuf);.  if
85b0: 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 70  ( rc!=0 ){.    p
85c0: 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
85d0: 3d 20 65 72 72 6e 6f 3b 0a 23 69 66 64 65 66 20  = errno;.#ifdef 
85e0: 45 4f 56 45 52 46 4c 4f 57 0a 20 20 20 20 69 66  EOVERFLOW.    if
85f0: 28 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  ( pFile->lastErr
8600: 6e 6f 3d 3d 45 4f 56 45 52 46 4c 4f 57 20 29 20  no==EOVERFLOW ) 
8610: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
8620: 4c 46 53 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  LFS;.#endif.    
8630: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
8640: 45 52 52 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66  ERR;.  }..#ifdef
8650: 20 5f 5f 41 50 50 4c 45 5f 5f 0a 20 20 2f 2a 20   __APPLE__.  /* 
8660: 4f 6e 20 4f 53 20 58 20 6f 6e 20 61 6e 20 6d 73  On OS X on an ms
8670: 64 6f 73 20 66 69 6c 65 73 79 73 74 65 6d 2c 20  dos filesystem, 
8680: 74 68 65 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72  the inode number
8690: 20 69 73 20 72 65 70 6f 72 74 65 64 0a 20 20 2a   is reported.  *
86a0: 2a 20 69 6e 63 6f 72 72 65 63 74 6c 79 20 66 6f  * incorrectly fo
86b0: 72 20 7a 65 72 6f 2d 73 69 7a 65 20 66 69 6c 65  r zero-size file
86c0: 73 2e 20 20 53 65 65 20 74 69 63 6b 65 74 20 23  s.  See ticket #
86d0: 33 32 36 30 2e 20 20 54 6f 20 77 6f 72 6b 0a 20  3260.  To work. 
86e0: 20 2a 2a 20 61 72 6f 75 6e 64 20 74 68 69 73 20   ** around this 
86f0: 70 72 6f 62 6c 65 6d 20 28 77 65 20 63 6f 6e 73  problem (we cons
8700: 69 64 65 72 20 69 74 20 61 20 62 75 67 20 69 6e  ider it a bug in
8710: 20 4f 53 20 58 2c 20 6e 6f 74 20 53 51 4c 69 74   OS X, not SQLit
8720: 65 29 0a 20 20 2a 2a 20 77 65 20 61 6c 77 61 79  e).  ** we alway
8730: 73 20 69 6e 63 72 65 61 73 65 20 74 68 65 20 66  s increase the f
8740: 69 6c 65 20 73 69 7a 65 20 74 6f 20 31 20 62 79  ile size to 1 by
8750: 20 77 72 69 74 69 6e 67 20 61 20 73 69 6e 67 6c   writing a singl
8760: 65 20 62 79 74 65 0a 20 20 2a 2a 20 70 72 69 6f  e byte.  ** prio
8770: 72 20 74 6f 20 61 63 63 65 73 73 69 6e 67 20 74  r to accessing t
8780: 68 65 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72 2e  he inode number.
8790: 20 20 54 68 65 20 6f 6e 65 20 62 79 74 65 20 77    The one byte w
87a0: 72 69 74 74 65 6e 20 69 73 0a 20 20 2a 2a 20 61  ritten is.  ** a
87b0: 6e 20 41 53 43 49 49 20 27 53 27 20 63 68 61 72  n ASCII 'S' char
87c0: 61 63 74 65 72 20 77 68 69 63 68 20 61 6c 73 6f  acter which also
87d0: 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20 74   happens to be t
87e0: 68 65 20 66 69 72 73 74 20 62 79 74 65 0a 20 20  he first byte.  
87f0: 2a 2a 20 69 6e 20 74 68 65 20 68 65 61 64 65 72  ** in the header
8800: 20 6f 66 20 65 76 65 72 79 20 53 51 4c 69 74 65   of every SQLite
8810: 20 64 61 74 61 62 61 73 65 2e 20 20 49 6e 20 74   database.  In t
8820: 68 69 73 20 77 61 79 2c 20 69 66 20 74 68 65 72  his way, if ther
8830: 65 0a 20 20 2a 2a 20 69 73 20 61 20 72 61 63 65  e.  ** is a race
8840: 20 63 6f 6e 64 69 74 69 6f 6e 20 73 75 63 68 20   condition such 
8850: 74 68 61 74 20 61 6e 6f 74 68 65 72 20 74 68 72  that another thr
8860: 65 61 64 20 68 61 73 20 61 6c 72 65 61 64 79 20  ead has already 
8870: 70 6f 70 75 6c 61 74 65 64 0a 20 20 2a 2a 20 74  populated.  ** t
8880: 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66  he first page of
8890: 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 6e   the database, n
88a0: 6f 20 64 61 6d 61 67 65 20 69 73 20 64 6f 6e 65  o damage is done
88b0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 74 61  ..  */.  if( sta
88c0: 74 62 75 66 2e 73 74 5f 73 69 7a 65 3d 3d 30 20  tbuf.st_size==0 
88d0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 77 72 69 74  ){.    rc = writ
88e0: 65 28 66 64 2c 20 22 53 22 2c 20 31 29 3b 0a 20  e(fd, "S", 1);. 
88f0: 20 20 20 69 66 28 20 72 63 21 3d 31 20 29 7b 0a     if( rc!=1 ){.
8900: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
8910: 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20 7d  ITE_IOERR;.    }
8920: 0a 20 20 20 20 72 63 20 3d 20 66 73 74 61 74 28  .    rc = fstat(
8930: 66 64 2c 20 26 73 74 61 74 62 75 66 29 3b 0a 20  fd, &statbuf);. 
8940: 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a     if( rc!=0 ){.
8950: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
8960: 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
8970: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
8980: 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20 7d  ITE_IOERR;.    }
8990: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 6d  .  }.#endif..  m
89a0: 65 6d 73 65 74 28 26 6c 6f 63 6b 4b 65 79 2c 20  emset(&lockKey, 
89b0: 30 2c 20 73 69 7a 65 6f 66 28 6c 6f 63 6b 4b 65  0, sizeof(lockKe
89c0: 79 29 29 3b 0a 20 20 6c 6f 63 6b 4b 65 79 2e 66  y));.  lockKey.f
89d0: 69 64 2e 64 65 76 20 3d 20 73 74 61 74 62 75 66  id.dev = statbuf
89e0: 2e 73 74 5f 64 65 76 3b 0a 23 69 66 20 4f 53 5f  .st_dev;.#if OS_
89f0: 56 58 57 4f 52 4b 53 0a 20 20 6c 6f 63 6b 4b 65  VXWORKS.  lockKe
8a00: 79 2e 66 69 64 2e 70 49 64 20 3d 20 70 46 69 6c  y.fid.pId = pFil
8a10: 65 2d 3e 70 49 64 3b 0a 23 65 6c 73 65 0a 20 20  e->pId;.#else.  
8a20: 6c 6f 63 6b 4b 65 79 2e 66 69 64 2e 69 6e 6f 20  lockKey.fid.ino 
8a30: 3d 20 73 74 61 74 62 75 66 2e 73 74 5f 69 6e 6f  = statbuf.st_ino
8a40: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  ;.#endif.#if SQL
8a50: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 20 26  ITE_THREADSAFE &
8a60: 26 20 64 65 66 69 6e 65 64 28 5f 5f 6c 69 6e 75  & defined(__linu
8a70: 78 5f 5f 29 0a 20 20 69 66 28 20 74 68 72 65 61  x__).  if( threa
8a80: 64 73 4f 76 65 72 72 69 64 65 45 61 63 68 4f 74  dsOverrideEachOt
8a90: 68 65 72 73 4c 6f 63 6b 73 3c 30 20 29 7b 0a 20  hersLocks<0 ){. 
8aa0: 20 20 20 74 65 73 74 54 68 72 65 61 64 4c 6f 63     testThreadLoc
8ab0: 6b 69 6e 67 42 65 68 61 76 69 6f 72 28 66 64 29  kingBehavior(fd)
8ac0: 3b 0a 20 20 7d 0a 20 20 6c 6f 63 6b 4b 65 79 2e  ;.  }.  lockKey.
8ad0: 74 69 64 20 3d 20 74 68 72 65 61 64 73 4f 76 65  tid = threadsOve
8ae0: 72 72 69 64 65 45 61 63 68 4f 74 68 65 72 73 4c  rrideEachOthersL
8af0: 6f 63 6b 73 20 3f 20 30 20 3a 20 70 74 68 72 65  ocks ? 0 : pthre
8b00: 61 64 5f 73 65 6c 66 28 29 3b 0a 23 65 6e 64 69  ad_self();.#endi
8b10: 66 0a 20 20 66 69 6c 65 49 64 20 3d 20 6c 6f 63  f.  fileId = loc
8b20: 6b 4b 65 79 2e 66 69 64 3b 0a 20 20 69 66 28 20  kKey.fid;.  if( 
8b30: 70 70 4c 6f 63 6b 21 3d 30 20 29 7b 0a 20 20 20  ppLock!=0 ){.   
8b40: 20 70 4c 6f 63 6b 20 3d 20 6c 6f 63 6b 4c 69 73   pLock = lockLis
8b50: 74 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 4c  t;.    while( pL
8b60: 6f 63 6b 20 26 26 20 6d 65 6d 63 6d 70 28 26 6c  ock && memcmp(&l
8b70: 6f 63 6b 4b 65 79 2c 20 26 70 4c 6f 63 6b 2d 3e  ockKey, &pLock->
8b80: 6c 6f 63 6b 4b 65 79 2c 20 73 69 7a 65 6f 66 28  lockKey, sizeof(
8b90: 6c 6f 63 6b 4b 65 79 29 29 20 29 7b 0a 20 20 20  lockKey)) ){.   
8ba0: 20 20 20 70 4c 6f 63 6b 20 3d 20 70 4c 6f 63 6b     pLock = pLock
8bb0: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20  ->pNext;.    }. 
8bc0: 20 20 20 69 66 28 20 70 4c 6f 63 6b 3d 3d 30 20     if( pLock==0 
8bd0: 29 7b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 20 3d  ){.      pLock =
8be0: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
8bf0: 20 73 69 7a 65 6f 66 28 2a 70 4c 6f 63 6b 29 20   sizeof(*pLock) 
8c00: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 6f  );.      if( pLo
8c10: 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ck==0 ){.       
8c20: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
8c30: 45 4d 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  EM;.        goto
8c40: 20 65 78 69 74 5f 66 69 6e 64 6c 6f 63 6b 69 6e   exit_findlockin
8c50: 66 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  fo;.      }.    
8c60: 20 20 6d 65 6d 63 70 79 28 26 70 4c 6f 63 6b 2d    memcpy(&pLock-
8c70: 3e 6c 6f 63 6b 4b 65 79 2c 26 6c 6f 63 6b 4b 65  >lockKey,&lockKe
8c80: 79 2c 73 69 7a 65 6f 66 28 6c 6f 63 6b 4b 65 79  y,sizeof(lockKey
8c90: 29 29 3b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 2d  ));.      pLock-
8ca0: 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 20  >nRef = 1;.     
8cb0: 20 70 4c 6f 63 6b 2d 3e 63 6e 74 20 3d 20 30 3b   pLock->cnt = 0;
8cc0: 0a 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 6c 6f  .      pLock->lo
8cd0: 63 6b 74 79 70 65 20 3d 20 30 3b 0a 20 20 20 20  cktype = 0;.    
8ce0: 20 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 20 3d    pLock->pNext =
8cf0: 20 6c 6f 63 6b 4c 69 73 74 3b 0a 20 20 20 20 20   lockList;.     
8d00: 20 70 4c 6f 63 6b 2d 3e 70 50 72 65 76 20 3d 20   pLock->pPrev = 
8d10: 30 3b 0a 20 20 20 20 20 20 69 66 28 20 6c 6f 63  0;.      if( loc
8d20: 6b 4c 69 73 74 20 29 20 6c 6f 63 6b 4c 69 73 74  kList ) lockList
8d30: 2d 3e 70 50 72 65 76 20 3d 20 70 4c 6f 63 6b 3b  ->pPrev = pLock;
8d40: 0a 20 20 20 20 20 20 6c 6f 63 6b 4c 69 73 74 20  .      lockList 
8d50: 3d 20 70 4c 6f 63 6b 3b 0a 20 20 20 20 7d 65 6c  = pLock;.    }el
8d60: 73 65 7b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 2d  se{.      pLock-
8d70: 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 7d 0a 20  >nRef++;.    }. 
8d80: 20 20 20 2a 70 70 4c 6f 63 6b 20 3d 20 70 4c 6f     *ppLock = pLo
8d90: 63 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 70  ck;.  }.  if( pp
8da0: 4f 70 65 6e 21 3d 30 20 29 7b 0a 20 20 20 20 70  Open!=0 ){.    p
8db0: 4f 70 65 6e 20 3d 20 6f 70 65 6e 4c 69 73 74 3b  Open = openList;
8dc0: 0a 20 20 20 20 77 68 69 6c 65 28 20 70 4f 70 65  .    while( pOpe
8dd0: 6e 20 26 26 20 6d 65 6d 63 6d 70 28 26 66 69 6c  n && memcmp(&fil
8de0: 65 49 64 2c 20 26 70 4f 70 65 6e 2d 3e 66 69 6c  eId, &pOpen->fil
8df0: 65 49 64 2c 20 73 69 7a 65 6f 66 28 66 69 6c 65  eId, sizeof(file
8e00: 49 64 29 29 20 29 7b 0a 20 20 20 20 20 20 70 4f  Id)) ){.      pO
8e10: 70 65 6e 20 3d 20 70 4f 70 65 6e 2d 3e 70 4e 65  pen = pOpen->pNe
8e20: 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  xt;.    }.    if
8e30: 28 20 70 4f 70 65 6e 3d 3d 30 20 29 7b 0a 20 20  ( pOpen==0 ){.  
8e40: 20 20 20 20 70 4f 70 65 6e 20 3d 20 73 71 6c 69      pOpen = sqli
8e50: 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65  te3_malloc( size
8e60: 6f 66 28 2a 70 4f 70 65 6e 29 20 29 3b 0a 20 20  of(*pOpen) );.  
8e70: 20 20 20 20 69 66 28 20 70 4f 70 65 6e 3d 3d 30      if( pOpen==0
8e80: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65   ){.        rele
8e90: 61 73 65 4c 6f 63 6b 49 6e 66 6f 28 70 4c 6f 63  aseLockInfo(pLoc
8ea0: 6b 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  k);.        rc =
8eb0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
8ec0: 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74         goto exit
8ed0: 5f 66 69 6e 64 6c 6f 63 6b 69 6e 66 6f 3b 0a 20  _findlockinfo;. 
8ee0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d       }.      mem
8ef0: 73 65 74 28 70 4f 70 65 6e 2c 20 30 2c 20 73 69  set(pOpen, 0, si
8f00: 7a 65 6f 66 28 2a 70 4f 70 65 6e 29 29 3b 0a 20  zeof(*pOpen));. 
8f10: 20 20 20 20 20 70 4f 70 65 6e 2d 3e 66 69 6c 65       pOpen->file
8f20: 49 64 20 3d 20 66 69 6c 65 49 64 3b 0a 20 20 20  Id = fileId;.   
8f30: 20 20 20 70 4f 70 65 6e 2d 3e 6e 52 65 66 20 3d     pOpen->nRef =
8f40: 20 31 3b 0a 20 20 20 20 20 20 70 4f 70 65 6e 2d   1;.      pOpen-
8f50: 3e 70 4e 65 78 74 20 3d 20 6f 70 65 6e 4c 69 73  >pNext = openLis
8f60: 74 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 70 65  t;.      if( ope
8f70: 6e 4c 69 73 74 20 29 20 6f 70 65 6e 4c 69 73 74  nList ) openList
8f80: 2d 3e 70 50 72 65 76 20 3d 20 70 4f 70 65 6e 3b  ->pPrev = pOpen;
8f90: 0a 20 20 20 20 20 20 6f 70 65 6e 4c 69 73 74 20  .      openList 
8fa0: 3d 20 70 4f 70 65 6e 3b 0a 20 20 20 20 7d 65 6c  = pOpen;.    }el
8fb0: 73 65 7b 0a 20 20 20 20 20 20 70 4f 70 65 6e 2d  se{.      pOpen-
8fc0: 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 7d 0a 20  >nRef++;.    }. 
8fd0: 20 20 20 2a 70 70 4f 70 65 6e 20 3d 20 70 4f 70     *ppOpen = pOp
8fe0: 65 6e 3b 0a 20 20 7d 0a 0a 65 78 69 74 5f 66 69  en;.  }..exit_fi
8ff0: 6e 64 6c 6f 63 6b 69 6e 66 6f 3a 0a 20 20 72 65  ndlockinfo:.  re
9000: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
9010: 2a 20 49 66 20 77 65 20 61 72 65 20 63 75 72 72  * If we are curr
9020: 65 6e 74 6c 79 20 69 6e 20 61 20 64 69 66 66 65  ently in a diffe
9030: 72 65 6e 74 20 74 68 72 65 61 64 20 74 68 61 6e  rent thread than
9040: 20 74 68 65 20 74 68 72 65 61 64 20 74 68 61 74   the thread that
9050: 20 74 68 65 0a 2a 2a 20 75 6e 69 78 46 69 6c 65   the.** unixFile
9060: 20 61 72 67 75 6d 65 6e 74 20 62 65 6c 6f 6e 67   argument belong
9070: 73 20 74 6f 2c 20 74 68 65 6e 20 74 72 61 6e 73  s to, then trans
9080: 66 65 72 20 6f 77 6e 65 72 73 68 69 70 20 6f 66  fer ownership of
9090: 20 74 68 65 20 75 6e 69 78 46 69 6c 65 0a 2a 2a   the unixFile.**
90a0: 20 6f 76 65 72 20 74 6f 20 74 68 65 20 63 75 72   over to the cur
90b0: 72 65 6e 74 20 74 68 72 65 61 64 2e 0a 2a 2a 0a  rent thread..**.
90c0: 2a 2a 20 41 20 75 6e 69 78 46 69 6c 65 20 69 73  ** A unixFile is
90d0: 20 6f 6e 6c 79 20 6f 77 6e 65 64 20 62 79 20 61   only owned by a
90e0: 20 74 68 72 65 61 64 20 6f 6e 20 73 79 73 74 65   thread on syste
90f0: 6d 73 20 74 68 61 74 20 75 73 65 20 4c 69 6e 75  ms that use Linu
9100: 78 54 68 72 65 61 64 73 2e 0a 2a 2a 0a 2a 2a 20  xThreads..**.** 
9110: 4f 77 6e 65 72 73 68 69 70 20 74 72 61 6e 73 66  Ownership transf
9120: 65 72 20 69 73 20 6f 6e 6c 79 20 61 6c 6c 6f 77  er is only allow
9130: 65 64 20 69 66 20 74 68 65 20 75 6e 69 78 46 69  ed if the unixFi
9140: 6c 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  le is currently 
9150: 75 6e 6c 6f 63 6b 65 64 2e 0a 2a 2a 20 49 66 20  unlocked..** If 
9160: 74 68 65 20 75 6e 69 78 46 69 6c 65 20 69 73 20  the unixFile is 
9170: 6c 6f 63 6b 65 64 20 61 6e 64 20 61 6e 20 6f 77  locked and an ow
9180: 6e 65 72 73 68 69 70 20 69 73 20 77 72 6f 6e 67  nership is wrong
9190: 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 0a 2a 2a  , then return.**
91a0: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 2e 20   SQLITE_MISUSE. 
91b0: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
91c0: 74 75 72 6e 65 64 20 69 66 20 65 76 65 72 79 74  turned if everyt
91d0: 68 69 6e 67 20 77 6f 72 6b 73 2e 0a 2a 2f 0a 23  hing works..*/.#
91e0: 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44  if SQLITE_THREAD
91f0: 53 41 46 45 20 26 26 20 64 65 66 69 6e 65 64 28  SAFE && defined(
9200: 5f 5f 6c 69 6e 75 78 5f 5f 29 0a 73 74 61 74 69  __linux__).stati
9210: 63 20 69 6e 74 20 74 72 61 6e 73 66 65 72 4f 77  c int transferOw
9220: 6e 65 72 73 68 69 70 28 75 6e 69 78 46 69 6c 65  nership(unixFile
9230: 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20   *pFile){.  int 
9240: 72 63 3b 0a 20 20 70 74 68 72 65 61 64 5f 74 20  rc;.  pthread_t 
9250: 68 53 65 6c 66 3b 0a 20 20 69 66 28 20 74 68 72  hSelf;.  if( thr
9260: 65 61 64 73 4f 76 65 72 72 69 64 65 45 61 63 68  eadsOverrideEach
9270: 4f 74 68 65 72 73 4c 6f 63 6b 73 20 29 7b 0a 20  OthersLocks ){. 
9280: 20 20 20 2f 2a 20 4f 77 6e 65 72 73 68 69 70 20     /* Ownership 
9290: 74 72 61 6e 73 66 65 72 73 20 6e 6f 74 20 6e 65  transfers not ne
92a0: 65 64 65 64 20 6f 6e 20 74 68 69 73 20 73 79 73  eded on this sys
92b0: 74 65 6d 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  tem */.    retur
92c0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
92d0: 0a 20 20 68 53 65 6c 66 20 3d 20 70 74 68 72 65  .  hSelf = pthre
92e0: 61 64 5f 73 65 6c 66 28 29 3b 0a 20 20 69 66 28  ad_self();.  if(
92f0: 20 70 74 68 72 65 61 64 5f 65 71 75 61 6c 28 70   pthread_equal(p
9300: 46 69 6c 65 2d 3e 74 69 64 2c 20 68 53 65 6c 66  File->tid, hSelf
9310: 29 20 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20 61  ) ){.    /* We a
9320: 72 65 20 73 74 69 6c 6c 20 69 6e 20 74 68 65 20  re still in the 
9330: 73 61 6d 65 20 74 68 72 65 61 64 20 2a 2f 0a 20  same thread */. 
9340: 20 20 20 4f 53 54 52 41 43 45 31 28 22 4e 6f 2d     OSTRACE1("No-
9350: 74 72 61 6e 73 66 65 72 2c 20 73 61 6d 65 20 74  transfer, same t
9360: 68 72 65 61 64 5c 6e 22 29 3b 0a 20 20 20 20 72  hread\n");.    r
9370: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
9380: 0a 20 20 7d 0a 20 20 69 66 28 20 70 46 69 6c 65  .  }.  if( pFile
9390: 2d 3e 6c 6f 63 6b 74 79 70 65 21 3d 4e 4f 5f 4c  ->locktype!=NO_L
93a0: 4f 43 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 57 65  OCK ){.    /* We
93b0: 20 63 61 6e 6e 6f 74 20 63 68 61 6e 67 65 20 6f   cannot change o
93c0: 77 6e 65 72 73 68 69 70 20 77 68 69 6c 65 20 77  wnership while w
93d0: 65 20 61 72 65 20 68 6f 6c 64 69 6e 67 20 61 20  e are holding a 
93e0: 6c 6f 63 6b 21 20 2a 2f 0a 20 20 20 20 72 65 74  lock! */.    ret
93f0: 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
9400: 45 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45  E;.  }.  OSTRACE
9410: 34 28 22 54 72 61 6e 73 66 65 72 20 6f 77 6e 65  4("Transfer owne
9420: 72 73 68 69 70 20 6f 66 20 25 64 20 66 72 6f 6d  rship of %d from
9430: 20 25 64 20 74 6f 20 25 64 5c 6e 22 2c 0a 20 20   %d to %d\n",.  
9440: 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
9450: 3e 68 2c 20 70 46 69 6c 65 2d 3e 74 69 64 2c 20  >h, pFile->tid, 
9460: 68 53 65 6c 66 29 3b 0a 20 20 70 46 69 6c 65 2d  hSelf);.  pFile-
9470: 3e 74 69 64 20 3d 20 68 53 65 6c 66 3b 0a 20 20  >tid = hSelf;.  
9480: 69 66 20 28 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b  if (pFile->pLock
9490: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 20 20 20 20   != NULL) {.    
94a0: 72 65 6c 65 61 73 65 4c 6f 63 6b 49 6e 66 6f 28  releaseLockInfo(
94b0: 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 29 3b 0a 20  pFile->pLock);. 
94c0: 20 20 20 72 63 20 3d 20 66 69 6e 64 4c 6f 63 6b     rc = findLock
94d0: 49 6e 66 6f 28 70 46 69 6c 65 2c 20 26 70 46 69  Info(pFile, &pFi
94e0: 6c 65 2d 3e 70 4c 6f 63 6b 2c 20 30 29 3b 0a 20  le->pLock, 0);. 
94f0: 20 20 20 4f 53 54 52 41 43 45 35 28 22 4c 4f 43     OSTRACE5("LOC
9500: 4b 20 20 20 20 25 64 20 69 73 20 6e 6f 77 20 25  K    %d is now %
9510: 73 28 25 73 2c 25 64 29 5c 6e 22 2c 20 70 46 69  s(%s,%d)\n", pFi
9520: 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20  le->h,.         
9530: 20 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28 70    locktypeName(p
9540: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 2c  File->locktype),
9550: 0a 20 20 20 20 20 20 20 20 20 20 20 6c 6f 63 6b  .           lock
9560: 74 79 70 65 4e 61 6d 65 28 70 46 69 6c 65 2d 3e  typeName(pFile->
9570: 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 29  pLock->locktype)
9580: 2c 20 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 2d 3e  , pFile->pLock->
9590: 63 6e 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  cnt);.    return
95a0: 20 72 63 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a   rc;.  } else {.
95b0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
95c0: 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73  E_OK;.  }.}.#els
95d0: 65 20 20 2f 2a 20 69 66 20 6e 6f 74 20 53 51 4c  e  /* if not SQL
95e0: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 20 2a  ITE_THREADSAFE *
95f0: 2f 0a 20 20 2f 2a 20 4f 6e 20 73 69 6e 67 6c 65  /.  /* On single
9600: 2d 74 68 72 65 61 64 65 64 20 62 75 69 6c 64 73  -threaded builds
9610: 2c 20 6f 77 6e 65 72 73 68 69 70 20 74 72 61 6e  , ownership tran
9620: 73 66 65 72 20 69 73 20 61 20 6e 6f 2d 6f 70 20  sfer is a no-op 
9630: 2a 2f 0a 23 20 64 65 66 69 6e 65 20 74 72 61 6e  */.# define tran
9640: 73 66 65 72 4f 77 6e 65 72 73 68 69 70 28 58 29  sferOwnership(X)
9650: 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64 69   SQLITE_OK.#endi
9660: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 54 48 52 45  f /* SQLITE_THRE
9670: 41 44 53 41 46 45 20 2a 2f 0a 0a 0a 2f 2a 0a 2a  ADSAFE */.../*.*
9680: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
9690: 68 65 63 6b 73 20 69 66 20 74 68 65 72 65 20 69  hecks if there i
96a0: 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  s a RESERVED loc
96b0: 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70  k held on the sp
96c0: 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20  ecified.** file 
96d0: 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f  by this or any o
96e0: 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66  ther process. If
96f0: 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20   such a lock is 
9700: 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f  held, set *pResO
9710: 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a  ut.** to a non-z
9720: 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77  ero value otherw
9730: 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20  ise *pResOut is 
9740: 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68  set to zero.  Th
9750: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a  e return value.*
9760: 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49  * is set to SQLI
9770: 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20  TE_OK unless an 
9780: 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73  I/O error occurs
9790: 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65   during lock che
97a0: 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  cking..*/.static
97b0: 20 69 6e 74 20 75 6e 69 78 43 68 65 63 6b 52 65   int unixCheckRe
97c0: 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74  servedLock(sqlit
97d0: 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
97e0: 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e   *pResOut){.  in
97f0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
9800: 3b 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65 64  ;.  int reserved
9810: 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65   = 0;.  unixFile
9820: 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
9830: 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75  ile*)id;..  Simu
9840: 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74  lateIOError( ret
9850: 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
9860: 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f  _CHECKRESERVEDLO
9870: 43 4b 3b 20 29 3b 0a 0a 20 20 61 73 73 65 72 74  CK; );..  assert
9880: 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 75 6e 69  ( pFile );.  uni
9890: 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 20 2f  xEnterMutex(); /
98a0: 2a 20 42 65 63 61 75 73 65 20 70 46 69 6c 65 2d  * Because pFile-
98b0: 3e 70 4c 6f 63 6b 20 69 73 20 73 68 61 72 65 64  >pLock is shared
98c0: 20 61 63 72 6f 73 73 20 74 68 72 65 61 64 73 20   across threads 
98d0: 2a 2f 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69  */..  /* Check i
98e0: 66 20 61 20 74 68 72 65 61 64 20 69 6e 20 74 68  f a thread in th
98f0: 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73  is process holds
9900: 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a   such a lock */.
9910: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 4c 6f    if( pFile->pLo
9920: 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 3e 53 48 41  ck->locktype>SHA
9930: 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RED_LOCK ){.    
9940: 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20  reserved = 1;.  
9950: 7d 0a 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69 73  }..  /* Otherwis
9960: 65 20 73 65 65 20 69 66 20 73 6f 6d 65 20 6f 74  e see if some ot
9970: 68 65 72 20 70 72 6f 63 65 73 73 20 68 6f 6c 64  her process hold
9980: 73 20 69 74 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64  s it..  */.#ifnd
9990: 65 66 20 5f 5f 44 4a 47 50 50 5f 5f 0a 20 20 69  ef __DJGPP__.  i
99a0: 66 28 20 21 72 65 73 65 72 76 65 64 20 29 7b 0a  f( !reserved ){.
99b0: 20 20 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b      struct flock
99c0: 20 6c 6f 63 6b 3b 0a 20 20 20 20 6c 6f 63 6b 2e   lock;.    lock.
99d0: 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f  l_whence = SEEK_
99e0: 53 45 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  SET;.    lock.l_
99f0: 73 74 61 72 74 20 3d 20 52 45 53 45 52 56 45 44  start = RESERVED
9a00: 5f 42 59 54 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e  _BYTE;.    lock.
9a10: 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20 20 20 6c  l_len = 1;.    l
9a20: 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57  ock.l_type = F_W
9a30: 52 4c 43 4b 3b 0a 20 20 20 20 69 66 20 28 2d 31  RLCK;.    if (-1
9a40: 20 3d 3d 20 66 63 6e 74 6c 28 70 46 69 6c 65 2d   == fcntl(pFile-
9a50: 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f  >h, F_GETLK, &lo
9a60: 63 6b 29 29 20 7b 0a 20 20 20 20 20 20 69 6e 74  ck)) {.      int
9a70: 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
9a80: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
9a90: 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78  teErrorFromPosix
9aa0: 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51  Error(tErrno, SQ
9ab0: 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b  LITE_IOERR_CHECK
9ac0: 52 45 53 45 52 56 45 44 4c 4f 43 4b 29 3b 0a 20  RESERVEDLOCK);. 
9ad0: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
9ae0: 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a  Errno = tErrno;.
9af0: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 28 20 6c      } else if( l
9b00: 6f 63 6b 2e 6c 5f 74 79 70 65 21 3d 46 5f 55 4e  ock.l_type!=F_UN
9b10: 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 73  LCK ){.      res
9b20: 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d  erved = 1;.    }
9b30: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20  .  }.#endif.  . 
9b40: 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
9b50: 29 3b 0a 20 20 4f 53 54 52 41 43 45 34 28 22 54  );.  OSTRACE4("T
9b60: 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25  EST WR-LOCK %d %
9b70: 64 20 25 64 20 28 75 6e 69 78 29 5c 6e 22 2c 20  d %d (unix)\n", 
9b80: 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65  pFile->h, rc, re
9b90: 73 65 72 76 65 64 29 3b 0a 0a 20 20 2a 70 52 65  served);..  *pRe
9ba0: 73 4f 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b  sOut = reserved;
9bb0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
9bc0: 0a 2f 2a 0a 2a 2a 20 50 65 72 66 6f 72 6d 20 61  ./*.** Perform a
9bd0: 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 6f 70   file locking op
9be0: 65 72 61 74 69 6f 6e 20 6f 6e 20 61 20 72 61 6e  eration on a ran
9bf0: 67 65 20 6f 66 20 62 79 74 65 73 20 69 6e 20 61  ge of bytes in a
9c00: 20 66 69 6c 65 2e 0a 2a 2a 20 54 68 65 20 22 6f   file..** The "o
9c10: 70 22 20 70 61 72 61 6d 65 74 65 72 20 73 68 6f  p" parameter sho
9c20: 75 6c 64 20 62 65 20 6f 6e 65 20 6f 66 20 46 5f  uld be one of F_
9c30: 52 44 4c 43 4b 2c 20 46 5f 57 52 4c 43 4b 2c 20  RDLCK, F_WRLCK, 
9c40: 6f 72 20 46 5f 55 4e 4c 43 4b 2e 0a 2a 2a 20 52  or F_UNLCK..** R
9c50: 65 74 75 72 6e 20 30 20 6f 6e 20 73 75 63 63 65  eturn 0 on succe
9c60: 73 73 20 6f 72 20 2d 31 20 66 6f 72 20 66 61 69  ss or -1 for fai
9c70: 6c 75 72 65 2e 20 20 4f 6e 20 66 61 69 6c 75 72  lure.  On failur
9c80: 65 2c 20 77 72 69 74 65 20 74 68 65 20 65 72 72  e, write the err
9c90: 6f 72 0a 2a 2a 20 63 6f 64 65 20 69 6e 74 6f 20  or.** code into 
9ca0: 2a 70 45 72 72 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a  *pErrcode..**.**
9cb0: 20 49 66 20 74 68 65 20 53 51 4c 49 54 45 5f 57   If the SQLITE_W
9cc0: 48 4f 4c 45 5f 46 49 4c 45 5f 4c 4f 43 4b 49 4e  HOLE_FILE_LOCKIN
9cd0: 47 20 62 69 74 20 69 73 20 63 6c 65 61 72 2c 20  G bit is clear, 
9ce0: 74 68 65 6e 20 6f 6e 6c 79 20 6c 6f 63 6b 0a 2a  then only lock.*
9cf0: 2a 20 74 68 65 20 72 61 6e 67 65 20 6f 66 20 62  * the range of b
9d00: 79 74 65 73 20 6f 6e 20 74 68 65 20 6c 6f 63 6b  ytes on the lock
9d10: 69 6e 67 20 70 61 67 65 20 62 65 74 77 65 65 6e  ing page between
9d20: 20 53 48 41 52 45 44 5f 46 49 52 53 54 20 61 6e   SHARED_FIRST an
9d30: 64 0a 2a 2a 20 53 48 41 52 45 44 5f 53 49 5a 45  d.** SHARED_SIZE
9d40: 2e 20 20 49 66 20 53 51 4c 49 54 45 5f 57 48 4f  .  If SQLITE_WHO
9d50: 4c 45 5f 46 49 4c 45 5f 4c 4f 43 4b 49 4e 47 20  LE_FILE_LOCKING 
9d60: 69 73 20 73 65 74 2c 20 74 68 65 6e 20 6c 6f 63  is set, then loc
9d70: 6b 20 61 6c 6c 0a 2a 2a 20 62 79 74 65 73 20 66  k all.** bytes f
9d80: 72 6f 6d 20 30 20 75 70 20 74 6f 20 62 75 74 20  rom 0 up to but 
9d90: 6e 6f 74 20 69 6e 63 6c 75 64 69 6e 67 20 50 45  not including PE
9da0: 4e 44 49 4e 47 5f 42 59 54 45 2c 20 61 6e 64 20  NDING_BYTE, and 
9db0: 61 6c 6c 20 62 79 74 65 73 0a 2a 2a 20 74 68 61  all bytes.** tha
9dc0: 74 20 66 6f 6c 6c 6f 77 20 53 48 41 52 45 44 5f  t follow SHARED_
9dd0: 46 49 52 53 54 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20  FIRST..**.** In 
9de0: 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 6f 66 20  other words, of 
9df0: 53 51 4c 49 54 45 5f 57 48 4f 4c 45 5f 46 49 4c  SQLITE_WHOLE_FIL
9e00: 45 5f 4c 4f 43 4b 49 4e 47 20 69 66 20 66 61 6c  E_LOCKING if fal
9e10: 73 65 20 28 74 68 65 20 68 69 73 74 6f 72 69 63  se (the historic
9e20: 61 6c 0a 2a 2a 20 64 65 66 61 75 6c 74 20 63 61  al.** default ca
9e30: 73 65 29 20 74 68 65 6e 20 6f 6e 6c 79 20 6c 6f  se) then only lo
9e40: 63 6b 20 61 20 73 6d 61 6c 6c 20 72 61 6e 67 65  ck a small range
9e50: 20 6f 66 20 62 79 74 65 73 20 66 72 6f 6d 20 53   of bytes from S
9e60: 48 41 52 45 44 5f 46 49 52 53 54 0a 2a 2a 20 74  HARED_FIRST.** t
9e70: 68 72 6f 75 67 68 20 53 48 41 52 45 44 5f 46 49  hrough SHARED_FI
9e80: 52 53 54 2b 53 48 41 52 45 44 5f 53 49 5a 45 2d  RST+SHARED_SIZE-
9e90: 31 2e 20 20 42 75 74 20 69 66 20 53 51 4c 49 54  1.  But if SQLIT
9ea0: 45 5f 57 48 4f 4c 45 5f 46 49 4c 45 5f 4c 4f 43  E_WHOLE_FILE_LOC
9eb0: 4b 49 4e 47 20 69 73 0a 2a 2a 20 74 72 75 65 20  KING is.** true 
9ec0: 74 68 65 6e 20 6c 6f 63 6b 20 65 76 65 72 79 20  then lock every 
9ed0: 62 79 74 65 20 69 6e 20 74 68 65 20 66 69 6c 65  byte in the file
9ee0: 20 65 78 63 65 70 74 20 66 6f 72 20 50 45 4e 44   except for PEND
9ef0: 49 4e 47 5f 42 59 54 45 20 61 6e 64 0a 2a 2a 20  ING_BYTE and.** 
9f00: 52 45 53 45 52 56 45 44 5f 42 59 54 45 2e 0a 2a  RESERVED_BYTE..*
9f10: 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 57 48 4f 4c  *.** SQLITE_WHOL
9f20: 45 5f 46 49 4c 45 5f 4c 4f 43 4b 49 4e 47 3d 74  E_FILE_LOCKING=t
9f30: 72 75 65 20 6f 76 65 72 6c 61 70 73 20 53 51 4c  rue overlaps SQL
9f40: 49 54 45 5f 57 48 4f 4c 45 5f 46 49 4c 45 5f 4c  ITE_WHOLE_FILE_L
9f50: 4f 43 4b 49 4e 47 3d 66 61 6c 73 65 0a 2a 2a 20  OCKING=false.** 
9f60: 61 6e 64 20 73 6f 20 74 68 65 20 6c 6f 63 6b 69  and so the locki
9f70: 6e 67 20 73 63 68 65 6d 65 73 20 61 72 65 20 63  ng schemes are c
9f80: 6f 6d 70 61 74 69 62 6c 65 2e 20 20 4f 6e 65 20  ompatible.  One 
9f90: 74 79 70 65 20 6f 66 20 6c 6f 63 6b 20 77 69 6c  type of lock wil
9fa0: 6c 0a 2a 2a 20 65 66 66 65 63 74 69 76 65 6c 79  l.** effectively
9fb0: 20 65 78 63 6c 75 64 65 20 74 68 65 20 6f 74 68   exclude the oth
9fc0: 65 72 20 74 79 70 65 2e 20 20 54 68 65 20 72 65  er type.  The re
9fd0: 61 73 6f 6e 20 66 6f 72 20 75 73 69 6e 67 20 74  ason for using t
9fe0: 68 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 57 48 4f  he.** SQLITE_WHO
9ff0: 4c 45 5f 46 49 4c 45 5f 4c 4f 43 4b 49 4e 47 3d  LE_FILE_LOCKING=
a000: 74 72 75 65 20 69 73 20 74 68 61 74 20 62 79 20  true is that by 
a010: 69 6e 64 69 63 61 74 69 6e 67 20 74 68 65 20 66  indicating the f
a020: 75 6c 6c 20 72 61 6e 67 65 0a 2a 2a 20 6f 66 20  ull range.** of 
a030: 62 79 74 65 73 20 74 6f 20 62 65 20 72 65 61 64  bytes to be read
a040: 20 6f 72 20 77 72 69 74 74 65 6e 2c 20 77 65 20   or written, we 
a050: 67 69 76 65 20 68 69 6e 74 73 20 74 6f 20 4e 46  give hints to NF
a060: 53 20 74 6f 20 68 65 6c 70 20 69 74 0a 2a 2a 20  S to help it.** 
a070: 6d 61 69 6e 74 61 69 6e 20 63 61 63 68 65 20 63  maintain cache c
a080: 6f 68 65 72 65 6e 63 79 2e 20 20 4f 6e 20 74 68  oherency.  On th
a090: 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 77 68  e other hand, wh
a0a0: 6f 6c 65 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67  ole file locking
a0b0: 0a 2a 2a 20 69 73 20 73 6c 6f 77 65 72 2c 20 73  .** is slower, s
a0c0: 6f 20 77 65 20 64 6f 6e 27 74 20 77 61 6e 74 20  o we don't want 
a0d0: 74 6f 20 75 73 65 20 69 74 20 65 78 63 65 70 74  to use it except
a0e0: 20 66 6f 72 20 4e 46 53 2e 0a 2a 2f 0a 73 74 61   for NFS..*/.sta
a0f0: 74 69 63 20 69 6e 74 20 72 61 6e 67 65 4c 6f 63  tic int rangeLoc
a100: 6b 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c  k(unixFile *pFil
a110: 65 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 2a  e, int op, int *
a120: 70 45 72 72 63 6f 64 65 29 7b 0a 20 20 73 74 72  pErrcode){.  str
a130: 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a  uct flock lock;.
a140: 20 20 69 6e 74 20 72 63 3b 0a 20 20 6c 6f 63 6b    int rc;.  lock
a150: 2e 6c 5f 74 79 70 65 20 3d 20 6f 70 3b 0a 20 20  .l_type = op;.  
a160: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53  lock.l_start = S
a170: 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 6c  HARED_FIRST;.  l
a180: 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53  ock.l_whence = S
a190: 45 45 4b 5f 53 45 54 3b 0a 20 20 69 66 28 20 28  EEK_SET;.  if( (
a1a0: 70 46 69 6c 65 2d 3e 66 69 6c 65 46 6c 61 67 73  pFile->fileFlags
a1b0: 20 26 20 53 51 4c 49 54 45 5f 57 48 4f 4c 45 5f   & SQLITE_WHOLE_
a1c0: 46 49 4c 45 5f 4c 4f 43 4b 49 4e 47 29 3d 3d 30  FILE_LOCKING)==0
a1d0: 20 29 7b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c   ){.    lock.l_l
a1e0: 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45  en = SHARED_SIZE
a1f0: 3b 0a 20 20 20 20 72 63 20 3d 20 66 63 6e 74 6c  ;.    rc = fcntl
a200: 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54  (pFile->h, F_SET
a210: 4c 4b 2c 20 26 6c 6f 63 6b 29 3b 0a 20 20 20 20  LK, &lock);.    
a220: 2a 70 45 72 72 63 6f 64 65 20 3d 20 65 72 72 6e  *pErrcode = errn
a230: 6f 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  o;.  }else{.    
a240: 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 30 3b 0a  lock.l_len = 0;.
a250: 20 20 20 20 72 63 20 3d 20 66 63 6e 74 6c 28 70      rc = fcntl(p
a260: 46 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b  File->h, F_SETLK
a270: 2c 20 26 6c 6f 63 6b 29 3b 0a 20 20 20 20 2a 70  , &lock);.    *p
a280: 45 72 72 63 6f 64 65 20 3d 20 65 72 72 6e 6f 3b  Errcode = errno;
a290: 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 6f  .    if( NEVER(o
a2a0: 70 3d 3d 46 5f 55 4e 4c 43 4b 29 20 7c 7c 20 72  p==F_UNLCK) || r
a2b0: 63 21 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20  c!=(-1) ){.     
a2c0: 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
a2d0: 30 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  0;.      lock.l_
a2e0: 6c 65 6e 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59  len = PENDING_BY
a2f0: 54 45 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 66  TE;.      rc = f
a300: 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46  cntl(pFile->h, F
a310: 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3b 0a  _SETLK, &lock);.
a320: 20 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53        if( ALWAYS
a330: 28 6f 70 21 3d 46 5f 55 4e 4c 43 4b 29 20 26 26  (op!=F_UNLCK) &&
a340: 20 72 63 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20   rc==(-1) ){.   
a350: 20 20 20 20 20 2a 70 45 72 72 63 6f 64 65 20 3d       *pErrcode =
a360: 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20   errno;.        
a370: 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f  lock.l_type = F_
a380: 55 4e 4c 43 4b 3b 0a 20 20 20 20 20 20 20 20 6c  UNLCK;.        l
a390: 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48  ock.l_start = SH
a3a0: 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20  ARED_FIRST;.    
a3b0: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d      lock.l_len =
a3c0: 20 30 3b 0a 20 20 20 20 20 20 20 20 66 63 6e 74   0;.        fcnt
a3d0: 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53 45  l(pFile->h, F_SE
a3e0: 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3b 0a 20 20 20  TLK, &lock);.   
a3f0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
a400: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
a410: 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69  *.** Lock the fi
a420: 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b  le with the lock
a430: 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61   specified by pa
a440: 72 61 6d 65 74 65 72 20 6c 6f 63 6b 74 79 70 65  rameter locktype
a450: 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65   - one.** of the
a460: 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
a470: 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45 44  *     (1) SHARED
a480: 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29  _LOCK.**     (2)
a490: 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a   RESERVED_LOCK.*
a4a0: 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e  *     (3) PENDIN
a4b0: 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34  G_LOCK.**     (4
a4c0: 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ) EXCLUSIVE_LOCK
a4d0: 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73  .**.** Sometimes
a4e0: 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67   when requesting
a4f0: 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c   one lock state,
a500: 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b   additional lock
a510: 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69   states.** are i
a520: 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77 65  nserted in betwe
a530: 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67  en.  The locking
a540: 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f   might fail on o
a550: 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a  ne of the later.
a560: 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c  ** transitions l
a570: 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20  eaving the lock 
a580: 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74 20  state different 
a590: 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61  from what it sta
a5a0: 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c  rted but.** stil
a5b0: 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67  l short of its g
a5c0: 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  oal.  The follow
a5d0: 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73 20  ing chart shows 
a5e0: 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74  the allowed.** t
a5f0: 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74  ransitions and t
a600: 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65  he inserted inte
a610: 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73 3a  rmediate states:
a620: 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b  .**.**    UNLOCK
a630: 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20  ED -> SHARED.** 
a640: 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53     SHARED -> RES
a650: 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52  ERVED.**    SHAR
a660: 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20  ED -> (PENDING) 
a670: 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  -> EXCLUSIVE.** 
a680: 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28     RESERVED -> (
a690: 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c  PENDING) -> EXCL
a6a0: 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44  USIVE.**    PEND
a6b0: 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  ING -> EXCLUSIVE
a6c0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
a6d0: 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e  ine will only in
a6e0: 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20  crease a lock.  
a6f0: 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 4f  Use the sqlite3O
a700: 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75  sUnlock().** rou
a710: 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61 20  tine to lower a 
a720: 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a  locking level..*
a730: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
a740: 78 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  xLock(sqlite3_fi
a750: 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b  le *id, int lock
a760: 74 79 70 65 29 7b 0a 20 20 2f 2a 20 54 68 65 20  type){.  /* The 
a770: 66 6f 6c 6c 6f 77 69 6e 67 20 64 65 73 63 72 69  following descri
a780: 62 65 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e  bes the implemen
a790: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 76 61  tation of the va
a7a0: 72 69 6f 75 73 20 6c 6f 63 6b 73 20 61 6e 64 0a  rious locks and.
a7b0: 20 20 2a 2a 20 6c 6f 63 6b 20 74 72 61 6e 73 69    ** lock transi
a7c0: 74 69 6f 6e 73 20 69 6e 20 74 65 72 6d 73 20 6f  tions in terms o
a7d0: 66 20 74 68 65 20 50 4f 53 49 58 20 61 64 76 69  f the POSIX advi
a7e0: 73 6f 72 79 20 73 68 61 72 65 64 20 61 6e 64 20  sory shared and 
a7f0: 65 78 63 6c 75 73 69 76 65 0a 20 20 2a 2a 20 6c  exclusive.  ** l
a800: 6f 63 6b 20 70 72 69 6d 69 74 69 76 65 73 20 28  ock primitives (
a810: 63 61 6c 6c 65 64 20 72 65 61 64 2d 6c 6f 63 6b  called read-lock
a820: 73 20 61 6e 64 20 77 72 69 74 65 2d 6c 6f 63 6b  s and write-lock
a830: 73 20 62 65 6c 6f 77 2c 20 74 6f 20 61 76 6f 69  s below, to avoi
a840: 64 0a 20 20 2a 2a 20 63 6f 6e 66 75 73 69 6f 6e  d.  ** confusion
a850: 20 77 69 74 68 20 53 51 4c 69 74 65 20 6c 6f 63   with SQLite loc
a860: 6b 20 6e 61 6d 65 73 29 2e 20 54 68 65 20 61 6c  k names). The al
a870: 67 6f 72 69 74 68 6d 73 20 61 72 65 20 63 6f 6d  gorithms are com
a880: 70 6c 69 63 61 74 65 64 0a 20 20 2a 2a 20 73 6c  plicated.  ** sl
a890: 69 67 68 74 6c 79 20 69 6e 20 6f 72 64 65 72 20  ightly in order 
a8a0: 74 6f 20 62 65 20 63 6f 6d 70 61 74 69 62 6c 65  to be compatible
a8b0: 20 77 69 74 68 20 77 69 6e 64 6f 77 73 20 73 79   with windows sy
a8c0: 73 74 65 6d 73 20 73 69 6d 75 6c 74 61 6e 65 6f  stems simultaneo
a8d0: 75 73 6c 79 0a 20 20 2a 2a 20 61 63 63 65 73 73  usly.  ** access
a8e0: 69 6e 67 20 74 68 65 20 73 61 6d 65 20 64 61 74  ing the same dat
a8f0: 61 62 61 73 65 20 66 69 6c 65 2c 20 69 6e 20 63  abase file, in c
a900: 61 73 65 20 74 68 61 74 20 69 73 20 65 76 65 72  ase that is ever
a910: 20 72 65 71 75 69 72 65 64 2e 0a 20 20 2a 2a 0a   required..  **.
a920: 20 20 2a 2a 20 53 79 6d 62 6f 6c 73 20 64 65 66    ** Symbols def
a930: 69 6e 65 64 20 69 6e 20 6f 73 2e 68 20 69 6e 64  ined in os.h ind
a940: 65 6e 74 69 66 79 20 74 68 65 20 27 70 65 6e 64  entify the 'pend
a950: 69 6e 67 20 62 79 74 65 27 20 61 6e 64 20 74 68  ing byte' and th
a960: 65 20 27 72 65 73 65 72 76 65 64 0a 20 20 2a 2a  e 'reserved.  **
a970: 20 62 79 74 65 27 2c 20 65 61 63 68 20 73 69 6e   byte', each sin
a980: 67 6c 65 20 62 79 74 65 73 20 61 74 20 77 65 6c  gle bytes at wel
a990: 6c 20 6b 6e 6f 77 6e 20 6f 66 66 73 65 74 73 2c  l known offsets,
a9a0: 20 61 6e 64 20 74 68 65 20 27 73 68 61 72 65 64   and the 'shared
a9b0: 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65   byte.  ** range
a9c0: 27 2c 20 61 20 72 61 6e 67 65 20 6f 66 20 35 31  ', a range of 51
a9d0: 30 20 62 79 74 65 73 20 61 74 20 61 20 77 65 6c  0 bytes at a wel
a9e0: 6c 20 6b 6e 6f 77 6e 20 6f 66 66 73 65 74 2e 0a  l known offset..
a9f0: 20 20 2a 2a 0a 20 20 2a 2a 20 54 6f 20 6f 62 74    **.  ** To obt
aa00: 61 69 6e 20 61 20 53 48 41 52 45 44 20 6c 6f 63  ain a SHARED loc
aa10: 6b 2c 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69  k, a read-lock i
aa20: 73 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68  s obtained on th
aa30: 65 20 27 70 65 6e 64 69 6e 67 0a 20 20 2a 2a 20  e 'pending.  ** 
aa40: 62 79 74 65 27 2e 20 20 49 66 20 74 68 69 73 20  byte'.  If this 
aa50: 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 61  is successful, a
aa60: 20 72 61 6e 64 6f 6d 20 62 79 74 65 20 66 72 6f   random byte fro
aa70: 6d 20 74 68 65 20 27 73 68 61 72 65 64 20 62 79  m the 'shared by
aa80: 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27 20 69  te.  ** range' i
aa90: 73 20 72 65 61 64 2d 6c 6f 63 6b 65 64 20 61 6e  s read-locked an
aaa0: 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  d the lock on th
aab0: 65 20 27 70 65 6e 64 69 6e 67 20 62 79 74 65 27  e 'pending byte'
aac0: 20 72 65 6c 65 61 73 65 64 2e 0a 20 20 2a 2a 0a   released..  **.
aad0: 20 20 2a 2a 20 41 20 70 72 6f 63 65 73 73 20 6d    ** A process m
aae0: 61 79 20 6f 6e 6c 79 20 6f 62 74 61 69 6e 20 61  ay only obtain a
aaf0: 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 61   RESERVED lock a
ab00: 66 74 65 72 20 69 74 20 68 61 73 20 61 20 53 48  fter it has a SH
ab10: 41 52 45 44 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20  ARED lock..  ** 
ab20: 41 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  A RESERVED lock 
ab30: 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62  is implemented b
ab40: 79 20 67 72 61 62 62 69 6e 67 20 61 20 77 72 69  y grabbing a wri
ab50: 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20  te-lock on the. 
ab60: 20 2a 2a 20 27 72 65 73 65 72 76 65 64 20 62 79   ** 'reserved by
ab70: 74 65 27 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  te'. .  **.  ** 
ab80: 41 20 70 72 6f 63 65 73 73 20 6d 61 79 20 6f 6e  A process may on
ab90: 6c 79 20 6f 62 74 61 69 6e 20 61 20 50 45 4e 44  ly obtain a PEND
aba0: 49 4e 47 20 6c 6f 63 6b 20 61 66 74 65 72 20 69  ING lock after i
abb0: 74 20 68 61 73 20 6f 62 74 61 69 6e 65 64 20 61  t has obtained a
abc0: 0a 20 20 2a 2a 20 53 48 41 52 45 44 20 6c 6f 63  .  ** SHARED loc
abd0: 6b 2e 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63  k. A PENDING loc
abe0: 6b 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64  k is implemented
abf0: 20 62 79 20 6f 62 74 61 69 6e 69 6e 67 20 61 20   by obtaining a 
ac00: 77 72 69 74 65 2d 6c 6f 63 6b 0a 20 20 2a 2a 20  write-lock.  ** 
ac10: 6f 6e 20 74 68 65 20 27 70 65 6e 64 69 6e 67 20  on the 'pending 
ac20: 62 79 74 65 27 2e 20 54 68 69 73 20 65 6e 73 75  byte'. This ensu
ac30: 72 65 73 20 74 68 61 74 20 6e 6f 20 6e 65 77 20  res that no new 
ac40: 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 63 61 6e  SHARED locks can
ac50: 20 62 65 0a 20 20 2a 2a 20 6f 62 74 61 69 6e 65   be.  ** obtaine
ac60: 64 2c 20 62 75 74 20 65 78 69 73 74 69 6e 67 20  d, but existing 
ac70: 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 61 72 65  SHARED locks are
ac80: 20 61 6c 6c 6f 77 65 64 20 74 6f 20 70 65 72 73   allowed to pers
ac90: 69 73 74 2e 20 41 20 70 72 6f 63 65 73 73 0a 20  ist. A process. 
aca0: 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 68 61 76   ** does not hav
acb0: 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 52 45  e to obtain a RE
acc0: 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74  SERVED lock on t
acd0: 68 65 20 77 61 79 20 74 6f 20 61 20 50 45 4e 44  he way to a PEND
ace0: 49 4e 47 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 54  ING lock..  ** T
acf0: 68 69 73 20 70 72 6f 70 65 72 74 79 20 69 73 20  his property is 
ad00: 75 73 65 64 20 62 79 20 74 68 65 20 61 6c 67 6f  used by the algo
ad10: 72 69 74 68 6d 20 66 6f 72 20 72 6f 6c 6c 69 6e  rithm for rollin
ad20: 67 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c  g back a journal
ad30: 20 66 69 6c 65 0a 20 20 2a 2a 20 61 66 74 65 72   file.  ** after
ad40: 20 61 20 63 72 61 73 68 2e 0a 20 20 2a 2a 0a 20   a crash..  **. 
ad50: 20 2a 2a 20 41 6e 20 45 58 43 4c 55 53 49 56 45   ** An EXCLUSIVE
ad60: 20 6c 6f 63 6b 2c 20 6f 62 74 61 69 6e 65 64 20   lock, obtained 
ad70: 61 66 74 65 72 20 61 20 50 45 4e 44 49 4e 47 20  after a PENDING 
ad80: 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 69 73  lock is held, is
ad90: 0a 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 65  .  ** implemente
ada0: 64 20 62 79 20 6f 62 74 61 69 6e 69 6e 67 20 61  d by obtaining a
adb0: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74   write-lock on t
adc0: 68 65 20 65 6e 74 69 72 65 20 27 73 68 61 72 65  he entire 'share
add0: 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67  d byte.  ** rang
ade0: 65 27 2e 20 53 69 6e 63 65 20 61 6c 6c 20 6f 74  e'. Since all ot
adf0: 68 65 72 20 6c 6f 63 6b 73 20 72 65 71 75 69 72  her locks requir
ae00: 65 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e  e a read-lock on
ae10: 20 6f 6e 65 20 6f 66 20 74 68 65 20 62 79 74 65   one of the byte
ae20: 73 0a 20 20 2a 2a 20 77 69 74 68 69 6e 20 74 68  s.  ** within th
ae30: 69 73 20 72 61 6e 67 65 2c 20 74 68 69 73 20 65  is range, this e
ae40: 6e 73 75 72 65 73 20 74 68 61 74 20 6e 6f 20 6f  nsures that no o
ae50: 74 68 65 72 20 6c 6f 63 6b 73 20 61 72 65 20 68  ther locks are h
ae60: 65 6c 64 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20  eld on the.  ** 
ae70: 64 61 74 61 62 61 73 65 2e 20 0a 20 20 2a 2a 0a  database. .  **.
ae80: 20 20 2a 2a 20 54 68 65 20 72 65 61 73 6f 6e 20    ** The reason 
ae90: 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20 63 61  a single byte ca
aea0: 6e 6e 6f 74 20 62 65 20 75 73 65 64 20 69 6e 73  nnot be used ins
aeb0: 74 65 61 64 20 6f 66 20 74 68 65 20 27 73 68 61  tead of the 'sha
aec0: 72 65 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61  red byte.  ** ra
aed0: 6e 67 65 27 20 69 73 20 74 68 61 74 20 73 6f 6d  nge' is that som
aee0: 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 77 69  e versions of wi
aef0: 6e 64 6f 77 73 20 64 6f 20 6e 6f 74 20 73 75 70  ndows do not sup
af00: 70 6f 72 74 20 72 65 61 64 2d 6c 6f 63 6b 73 2e  port read-locks.
af10: 20 42 79 0a 20 20 2a 2a 20 6c 6f 63 6b 69 6e 67   By.  ** locking
af20: 20 61 20 72 61 6e 64 6f 6d 20 62 79 74 65 20 66   a random byte f
af30: 72 6f 6d 20 61 20 72 61 6e 67 65 2c 20 63 6f 6e  rom a range, con
af40: 63 75 72 72 65 6e 74 20 53 48 41 52 45 44 20 6c  current SHARED l
af50: 6f 63 6b 73 20 6d 61 79 20 65 78 69 73 74 0a 20  ocks may exist. 
af60: 20 2a 2a 20 65 76 65 6e 20 69 66 20 74 68 65 20   ** even if the 
af70: 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69 74 69 76  locking primitiv
af80: 65 20 75 73 65 64 20 69 73 20 61 6c 77 61 79 73  e used is always
af90: 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 2e 0a 20   a write-lock.. 
afa0: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
afb0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78  QLITE_OK;.  unix
afc0: 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
afd0: 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 73  nixFile*)id;.  s
afe0: 74 72 75 63 74 20 75 6e 69 78 4c 6f 63 6b 49 6e  truct unixLockIn
aff0: 66 6f 20 2a 70 4c 6f 63 6b 20 3d 20 70 46 69 6c  fo *pLock = pFil
b000: 65 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 73 74 72 75  e->pLock;.  stru
b010: 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20  ct flock lock;. 
b020: 20 69 6e 74 20 73 20 3d 20 30 3b 0a 20 20 69 6e   int s = 0;.  in
b030: 74 20 74 45 72 72 6e 6f 3b 0a 0a 20 20 61 73 73  t tErrno;..  ass
b040: 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
b050: 4f 53 54 52 41 43 45 37 28 22 4c 4f 43 4b 20 20  OSTRACE7("LOCK  
b060: 20 20 25 64 20 25 73 20 77 61 73 20 25 73 28 25    %d %s was %s(%
b070: 73 2c 25 64 29 20 70 69 64 3d 25 64 20 28 75 6e  s,%d) pid=%d (un
b080: 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  ix)\n", pFile->h
b090: 2c 0a 20 20 20 20 20 20 6c 6f 63 6b 74 79 70 65  ,.      locktype
b0a0: 4e 61 6d 65 28 6c 6f 63 6b 74 79 70 65 29 2c 20  Name(locktype), 
b0b0: 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28 70 46 69  locktypeName(pFi
b0c0: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 2c 0a 20  le->locktype),. 
b0d0: 20 20 20 20 20 6c 6f 63 6b 74 79 70 65 4e 61 6d       locktypeNam
b0e0: 65 28 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70  e(pLock->locktyp
b0f0: 65 29 2c 20 70 4c 6f 63 6b 2d 3e 63 6e 74 20 2c  e), pLock->cnt ,
b100: 20 67 65 74 70 69 64 28 29 29 3b 0a 0a 20 20 2f   getpid());..  /
b110: 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6c  * If there is al
b120: 72 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20  ready a lock of 
b130: 74 68 69 73 20 74 79 70 65 20 6f 72 20 6d 6f 72  this type or mor
b140: 65 20 72 65 73 74 72 69 63 74 69 76 65 20 6f 6e  e restrictive on
b150: 20 74 68 65 0a 20 20 2a 2a 20 75 6e 69 78 46 69   the.  ** unixFi
b160: 6c 65 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20  le, do nothing. 
b170: 44 6f 6e 27 74 20 75 73 65 20 74 68 65 20 65 6e  Don't use the en
b180: 64 5f 6c 6f 63 6b 3a 20 65 78 69 74 20 70 61 74  d_lock: exit pat
b190: 68 2c 20 61 73 0a 20 20 2a 2a 20 75 6e 69 78 45  h, as.  ** unixE
b1a0: 6e 74 65 72 4d 75 74 65 78 28 29 20 68 61 73 6e  nterMutex() hasn
b1b0: 27 74 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 79  't been called y
b1c0: 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  et..  */.  if( p
b1d0: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d  File->locktype>=
b1e0: 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20  locktype ){.    
b1f0: 4f 53 54 52 41 43 45 33 28 22 4c 4f 43 4b 20 20  OSTRACE3("LOCK  
b200: 20 20 25 64 20 25 73 20 6f 6b 20 28 61 6c 72 65    %d %s ok (alre
b210: 61 64 79 20 68 65 6c 64 29 20 28 75 6e 69 78 29  ady held) (unix)
b220: 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20  \n", pFile->h,. 
b230: 20 20 20 20 20 20 20 20 20 20 20 6c 6f 63 6b 74             lockt
b240: 79 70 65 4e 61 6d 65 28 6c 6f 63 6b 74 79 70 65  ypeName(locktype
b250: 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ));.    return S
b260: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
b270: 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68   /* Make sure th
b280: 65 20 6c 6f 63 6b 69 6e 67 20 73 65 71 75 65 6e  e locking sequen
b290: 63 65 20 69 73 20 63 6f 72 72 65 63 74 2e 0a 20  ce is correct.. 
b2a0: 20 2a 2a 20 20 28 31 29 20 57 65 20 6e 65 76 65   **  (1) We neve
b2b0: 72 20 6d 6f 76 65 20 66 72 6f 6d 20 75 6e 6c 6f  r move from unlo
b2c0: 63 6b 65 64 20 74 6f 20 61 6e 79 74 68 69 6e 67  cked to anything
b2d0: 20 68 69 67 68 65 72 20 74 68 61 6e 20 73 68 61   higher than sha
b2e0: 72 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20  red lock..  **  
b2f0: 28 32 29 20 53 51 4c 69 74 65 20 6e 65 76 65 72  (2) SQLite never
b300: 20 65 78 70 6c 69 63 69 74 6c 79 20 72 65 71 75   explicitly requ
b310: 65 73 74 73 20 61 20 70 65 6e 64 69 67 20 6c 6f  ests a pendig lo
b320: 63 6b 2e 0a 20 20 2a 2a 20 20 28 33 29 20 41 20  ck..  **  (3) A 
b330: 73 68 61 72 65 64 20 6c 6f 63 6b 20 69 73 20 61  shared lock is a
b340: 6c 77 61 79 73 20 68 65 6c 64 20 77 68 65 6e 20  lways held when 
b350: 61 20 72 65 73 65 72 76 65 20 6c 6f 63 6b 20 69  a reserve lock i
b360: 73 20 72 65 71 75 65 73 74 65 64 2e 0a 20 20 2a  s requested..  *
b370: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  /.  assert( pFil
b380: 65 2d 3e 6c 6f 63 6b 74 79 70 65 21 3d 4e 4f 5f  e->locktype!=NO_
b390: 4c 4f 43 4b 20 7c 7c 20 6c 6f 63 6b 74 79 70 65  LOCK || locktype
b3a0: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  ==SHARED_LOCK );
b3b0: 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74  .  assert( lockt
b3c0: 79 70 65 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43  ype!=PENDING_LOC
b3d0: 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6c  K );.  assert( l
b3e0: 6f 63 6b 74 79 70 65 21 3d 52 45 53 45 52 56 45  ocktype!=RESERVE
b3f0: 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c 65 2d  D_LOCK || pFile-
b400: 3e 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45  >locktype==SHARE
b410: 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20  D_LOCK );..  /* 
b420: 54 68 69 73 20 6d 75 74 65 78 20 69 73 20 6e 65  This mutex is ne
b430: 65 64 65 64 20 62 65 63 61 75 73 65 20 70 46 69  eded because pFi
b440: 6c 65 2d 3e 70 4c 6f 63 6b 20 69 73 20 73 68 61  le->pLock is sha
b450: 72 65 64 20 61 63 72 6f 73 73 20 74 68 72 65 61  red across threa
b460: 64 73 0a 20 20 2a 2f 0a 20 20 75 6e 69 78 45 6e  ds.  */.  unixEn
b470: 74 65 72 4d 75 74 65 78 28 29 3b 0a 0a 20 20 2f  terMutex();..  /
b480: 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
b490: 63 75 72 72 65 6e 74 20 74 68 72 65 61 64 20 6f  current thread o
b4a0: 77 6e 73 20 74 68 65 20 70 46 69 6c 65 2e 0a 20  wns the pFile.. 
b4b0: 20 2a 2f 0a 20 20 72 63 20 3d 20 74 72 61 6e 73   */.  rc = trans
b4c0: 66 65 72 4f 77 6e 65 72 73 68 69 70 28 70 46 69  ferOwnership(pFi
b4d0: 6c 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  le);.  if( rc!=S
b4e0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
b4f0: 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
b500: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
b510: 0a 20 20 7d 0a 20 20 70 4c 6f 63 6b 20 3d 20 70  .  }.  pLock = p
b520: 46 69 6c 65 2d 3e 70 4c 6f 63 6b 3b 0a 0a 20 20  File->pLock;..  
b530: 2f 2a 20 49 66 20 73 6f 6d 65 20 74 68 72 65 61  /* If some threa
b540: 64 20 75 73 69 6e 67 20 74 68 69 73 20 50 49 44  d using this PID
b550: 20 68 61 73 20 61 20 6c 6f 63 6b 20 76 69 61 20   has a lock via 
b560: 61 20 64 69 66 66 65 72 65 6e 74 20 75 6e 69 78  a different unix
b570: 46 69 6c 65 2a 0a 20 20 2a 2a 20 68 61 6e 64 6c  File*.  ** handl
b580: 65 20 74 68 61 74 20 70 72 65 63 6c 75 64 65 73  e that precludes
b590: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
b5a0: 6f 63 6b 2c 20 72 65 74 75 72 6e 20 42 55 53 59  ock, return BUSY
b5b0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 46  ..  */.  if( (pF
b5c0: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 21 3d 70  ile->locktype!=p
b5d0: 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 20 26  Lock->locktype &
b5e0: 26 20 0a 20 20 20 20 20 20 20 20 20 20 28 70 4c  & .          (pL
b5f0: 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 50  ock->locktype>=P
b600: 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 7c 7c 20 6c  ENDING_LOCK || l
b610: 6f 63 6b 74 79 70 65 3e 53 48 41 52 45 44 5f 4c  ocktype>SHARED_L
b620: 4f 43 4b 29 29 0a 20 20 29 7b 0a 20 20 20 20 72  OCK)).  ){.    r
b630: 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
b640: 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f  .    goto end_lo
b650: 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  ck;.  }..  /* If
b660: 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69   a SHARED lock i
b670: 73 20 72 65 71 75 65 73 74 65 64 2c 20 61 6e 64  s requested, and
b680: 20 73 6f 6d 65 20 74 68 72 65 61 64 20 75 73 69   some thread usi
b690: 6e 67 20 74 68 69 73 20 50 49 44 20 61 6c 72 65  ng this PID alre
b6a0: 61 64 79 0a 20 20 2a 2a 20 68 61 73 20 61 20 53  ady.  ** has a S
b6b0: 48 41 52 45 44 20 6f 72 20 52 45 53 45 52 56 45  HARED or RESERVE
b6c0: 44 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 69 6e 63  D lock, then inc
b6d0: 72 65 6d 65 6e 74 20 72 65 66 65 72 65 6e 63 65  rement reference
b6e0: 20 63 6f 75 6e 74 73 20 61 6e 64 0a 20 20 2a 2a   counts and.  **
b6f0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
b700: 4b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f  K..  */.  if( lo
b710: 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c  cktype==SHARED_L
b720: 4f 43 4b 20 26 26 20 0a 20 20 20 20 20 20 28 70  OCK && .      (p
b730: 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d  Lock->locktype==
b740: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70  SHARED_LOCK || p
b750: 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d  Lock->locktype==
b760: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 20 29  RESERVED_LOCK) )
b770: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6c 6f  {.    assert( lo
b780: 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c  cktype==SHARED_L
b790: 4f 43 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72  OCK );.    asser
b7a0: 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  t( pFile->lockty
b7b0: 70 65 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  pe==0 );.    ass
b7c0: 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 63 6e 74 3e  ert( pLock->cnt>
b7d0: 30 20 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  0 );.    pFile->
b7e0: 6c 6f 63 6b 74 79 70 65 20 3d 20 53 48 41 52 45  locktype = SHARE
b7f0: 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 4c 6f 63  D_LOCK;.    pLoc
b800: 6b 2d 3e 63 6e 74 2b 2b 3b 0a 20 20 20 20 70 46  k->cnt++;.    pF
b810: 69 6c 65 2d 3e 70 4f 70 65 6e 2d 3e 6e 4c 6f 63  ile->pOpen->nLoc
b820: 6b 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  k++;.    goto en
b830: 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 0a 20 20  d_lock;.  }...  
b840: 2f 2a 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63  /* A PENDING loc
b850: 6b 20 69 73 20 6e 65 65 64 65 64 20 62 65 66 6f  k is needed befo
b860: 72 65 20 61 63 71 75 69 72 69 6e 67 20 61 20 53  re acquiring a S
b870: 48 41 52 45 44 20 6c 6f 63 6b 20 61 6e 64 20 62  HARED lock and b
b880: 65 66 6f 72 65 0a 20 20 2a 2a 20 61 63 71 75 69  efore.  ** acqui
b890: 72 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56  ring an EXCLUSIV
b8a0: 45 20 6c 6f 63 6b 2e 20 20 46 6f 72 20 74 68 65  E lock.  For the
b8b0: 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68   SHARED lock, th
b8c0: 65 20 50 45 4e 44 49 4e 47 20 77 69 6c 6c 0a 20  e PENDING will. 
b8d0: 20 2a 2a 20 62 65 20 72 65 6c 65 61 73 65 64 2e   ** be released.
b8e0: 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b 2e 6c 5f 6c  .  */.  lock.l_l
b8f0: 65 6e 20 3d 20 31 4c 3b 0a 20 20 6c 6f 63 6b 2e  en = 1L;.  lock.
b900: 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f  l_whence = SEEK_
b910: 53 45 54 3b 0a 20 20 69 66 28 20 6c 6f 63 6b 74  SET;.  if( lockt
b920: 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype==SHARED_LOCK
b930: 20 0a 20 20 20 20 20 20 7c 7c 20 28 6c 6f 63 6b   .      || (lock
b940: 74 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f  type==EXCLUSIVE_
b950: 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e 6c  LOCK && pFile->l
b960: 6f 63 6b 74 79 70 65 3c 50 45 4e 44 49 4e 47 5f  ocktype<PENDING_
b970: 4c 4f 43 4b 29 0a 20 20 29 7b 0a 20 20 20 20 6c  LOCK).  ){.    l
b980: 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 28 6c 6f  ock.l_type = (lo
b990: 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c  cktype==SHARED_L
b9a0: 4f 43 4b 3f 46 5f 52 44 4c 43 4b 3a 46 5f 57 52  OCK?F_RDLCK:F_WR
b9b0: 4c 43 4b 29 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c  LCK);.    lock.l
b9c0: 5f 73 74 61 72 74 20 3d 20 50 45 4e 44 49 4e 47  _start = PENDING
b9d0: 5f 42 59 54 45 3b 0a 20 20 20 20 73 20 3d 20 66  _BYTE;.    s = f
b9e0: 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46  cntl(pFile->h, F
b9f0: 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3b 0a  _SETLK, &lock);.
ba00: 20 20 20 20 69 66 28 20 73 3d 3d 28 2d 31 29 20      if( s==(-1) 
ba10: 29 7b 0a 20 20 20 20 20 20 74 45 72 72 6e 6f 20  ){.      tErrno 
ba20: 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72  = errno;.      r
ba30: 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  c = sqliteErrorF
ba40: 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
ba50: 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45  rrno, SQLITE_IOE
ba60: 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  RR_LOCK);.      
ba70: 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  if( IS_LOCK_ERRO
ba80: 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20  R(rc) ){.       
ba90: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
baa0: 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20  o = tErrno;.    
bab0: 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65    }.      goto e
bac0: 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20  nd_lock;.    }. 
bad0: 20 7d 0a 0a 0a 20 20 2f 2a 20 49 66 20 63 6f 6e   }...  /* If con
bae0: 74 72 6f 6c 20 67 65 74 73 20 74 6f 20 74 68 69  trol gets to thi
baf0: 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 61 63  s point, then ac
bb00: 74 75 61 6c 6c 79 20 67 6f 20 61 68 65 61 64 20  tually go ahead 
bb10: 61 6e 64 20 6d 61 6b 65 0a 20 20 2a 2a 20 6f 70  and make.  ** op
bb20: 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 63  erating system c
bb30: 61 6c 6c 73 20 66 6f 72 20 74 68 65 20 73 70 65  alls for the spe
bb40: 63 69 66 69 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a  cified lock..  *
bb50: 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65  /.  if( locktype
bb60: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b  ==SHARED_LOCK ){
bb70: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f  .    assert( pLo
bb80: 63 6b 2d 3e 63 6e 74 3d 3d 30 20 29 3b 0a 20 20  ck->cnt==0 );.  
bb90: 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d    assert( pLock-
bba0: 3e 6c 6f 63 6b 74 79 70 65 3d 3d 30 20 29 3b 0a  >locktype==0 );.
bbb0: 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 67 65 74 20  .    /* Now get 
bbc0: 74 68 65 20 72 65 61 64 2d 6c 6f 63 6b 20 2a 2f  the read-lock */
bbd0: 0a 20 20 20 20 73 20 3d 20 72 61 6e 67 65 4c 6f  .    s = rangeLo
bbe0: 63 6b 28 70 46 69 6c 65 2c 20 46 5f 52 44 4c 43  ck(pFile, F_RDLC
bbf0: 4b 2c 20 26 74 45 72 72 6e 6f 29 3b 0a 0a 20 20  K, &tErrno);..  
bc00: 20 20 2f 2a 20 44 72 6f 70 20 74 68 65 20 74 65    /* Drop the te
bc10: 6d 70 6f 72 61 72 79 20 50 45 4e 44 49 4e 47 20  mporary PENDING 
bc20: 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c 6f 63 6b  lock */.    lock
bc30: 2e 6c 5f 73 74 61 72 74 20 3d 20 50 45 4e 44 49  .l_start = PENDI
bc40: 4e 47 5f 42 59 54 45 3b 0a 20 20 20 20 6c 6f 63  NG_BYTE;.    loc
bc50: 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 20 20  k.l_len = 1L;.  
bc60: 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20    lock.l_type = 
bc70: 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 69 66 28  F_UNLCK;.    if(
bc80: 20 66 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c   fcntl(pFile->h,
bc90: 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29   F_SETLK, &lock)
bca0: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  !=0 ){.      if(
bcb0: 20 73 20 21 3d 20 2d 31 20 29 7b 0a 20 20 20 20   s != -1 ){.    
bcc0: 20 20 20 20 2f 2a 20 54 68 69 73 20 63 6f 75 6c      /* This coul
bcd0: 64 20 68 61 70 70 65 6e 20 77 69 74 68 20 61 20  d happen with a 
bce0: 6e 65 74 77 6f 72 6b 20 6d 6f 75 6e 74 20 2a 2f  network mount */
bcf0: 0a 20 20 20 20 20 20 20 20 74 45 72 72 6e 6f 20  .        tErrno 
bd00: 3d 20 65 72 72 6e 6f 3b 20 0a 20 20 20 20 20 20  = errno; .      
bd10: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72    rc = sqliteErr
bd20: 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72  orFromPosixError
bd30: 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f  (tErrno, SQLITE_
bd40: 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 20 0a  IOERR_UNLOCK); .
bd50: 20 20 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c          if( IS_L
bd60: 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b  OCK_ERROR(rc) ){
bd70: 0a 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65  .          pFile
bd80: 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45  ->lastErrno = tE
bd90: 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 7d 0a  rrno;.        }.
bda0: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
bdb0: 5f 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  _lock;.      }. 
bdc0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 3d 3d     }.    if( s==
bdd0: 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 72 63  (-1) ){.      rc
bde0: 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
bdf0: 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
be00: 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
be10: 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69  R_LOCK);.      i
be20: 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
be30: 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20  (rc) ){.        
be40: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
be50: 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20   = tErrno;.     
be60: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
be70: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74      pFile->lockt
be80: 79 70 65 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43  ype = SHARED_LOC
be90: 4b 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  K;.      pFile->
bea0: 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a  pOpen->nLock++;.
beb0: 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 63 6e 74        pLock->cnt
bec0: 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65   = 1;.    }.  }e
bed0: 6c 73 65 20 69 66 28 20 6c 6f 63 6b 74 79 70 65  lse if( locktype
bee0: 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
bef0: 20 26 26 20 70 4c 6f 63 6b 2d 3e 63 6e 74 3e 31   && pLock->cnt>1
bf00: 20 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20 61 72   ){.    /* We ar
bf10: 65 20 74 72 79 69 6e 67 20 66 6f 72 20 61 6e 20  e trying for an 
bf20: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 62  exclusive lock b
bf30: 75 74 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61  ut another threa
bf40: 64 20 69 6e 20 74 68 69 73 0a 20 20 20 20 2a 2a  d in this.    **
bf50: 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 69 73   same process is
bf60: 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61   still holding a
bf70: 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f   shared lock. */
bf80: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
bf90: 5f 42 55 53 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _BUSY;.  }else{.
bfa0: 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65      /* The reque
bfb0: 73 74 20 77 61 73 20 66 6f 72 20 61 20 52 45 53  st was for a RES
bfc0: 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49  ERVED or EXCLUSI
bfd0: 56 45 20 6c 6f 63 6b 2e 20 20 49 74 20 69 73 0a  VE lock.  It is.
bfe0: 20 20 20 20 2a 2a 20 61 73 73 75 6d 65 64 20 74      ** assumed t
bff0: 68 61 74 20 74 68 65 72 65 20 69 73 20 61 20 53  hat there is a S
c000: 48 41 52 45 44 20 6f 72 20 67 72 65 61 74 65 72  HARED or greater
c010: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c   lock on the fil
c020: 65 0a 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79  e.    ** already
c030: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
c040: 65 72 74 28 20 30 21 3d 70 46 69 6c 65 2d 3e 6c  ert( 0!=pFile->l
c050: 6f 63 6b 74 79 70 65 20 29 3b 0a 20 20 20 20 6c  ocktype );.    l
c060: 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57  ock.l_type = F_W
c070: 52 4c 43 4b 3b 0a 20 20 20 20 73 77 69 74 63 68  RLCK;.    switch
c080: 28 20 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20  ( locktype ){.  
c090: 20 20 20 20 63 61 73 65 20 52 45 53 45 52 56 45      case RESERVE
c0a0: 44 5f 4c 4f 43 4b 3a 0a 20 20 20 20 20 20 20 20  D_LOCK:.        
c0b0: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 52  lock.l_start = R
c0c0: 45 53 45 52 56 45 44 5f 42 59 54 45 3b 0a 20 20  ESERVED_BYTE;.  
c0d0: 20 20 20 20 20 20 73 20 3d 20 66 63 6e 74 6c 28        s = fcntl(
c0e0: 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c  pFile->h, F_SETL
c0f0: 4b 2c 20 26 6c 6f 63 6b 29 3b 0a 20 20 20 20 20  K, &lock);.     
c100: 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e     tErrno = errn
c110: 6f 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  o;.        break
c120: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 45 58 43  ;.      case EXC
c130: 4c 55 53 49 56 45 5f 4c 4f 43 4b 3a 0a 20 20 20  LUSIVE_LOCK:.   
c140: 20 20 20 20 20 73 20 3d 20 72 61 6e 67 65 4c 6f       s = rangeLo
c150: 63 6b 28 70 46 69 6c 65 2c 20 46 5f 57 52 4c 43  ck(pFile, F_WRLC
c160: 4b 2c 20 26 74 45 72 72 6e 6f 29 3b 0a 20 20 20  K, &tErrno);.   
c170: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
c180: 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
c190: 20 20 20 61 73 73 65 72 74 28 30 29 3b 0a 20 20     assert(0);.  
c1a0: 20 20 7d 0a 20 20 20 20 69 66 28 20 73 3d 3d 28    }.    if( s==(
c1b0: 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20  -1) ){.      rc 
c1c0: 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  = sqliteErrorFro
c1d0: 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72  mPosixError(tErr
c1e0: 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  no, SQLITE_IOERR
c1f0: 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66  _LOCK);.      if
c200: 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  ( IS_LOCK_ERROR(
c210: 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  rc) ){.        p
c220: 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
c230: 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20  = tErrno;.      
c240: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 0a  }.    }.  }.  ..
c250: 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
c260: 20 2f 2a 20 53 65 74 20 75 70 20 74 68 65 20 74   /* Set up the t
c270: 72 61 6e 73 61 63 74 69 6f 6e 2d 63 6f 75 6e 74  ransaction-count
c280: 65 72 20 63 68 61 6e 67 65 20 63 68 65 63 6b 69  er change checki
c290: 6e 67 20 66 6c 61 67 73 20 77 68 65 6e 0a 20 20  ng flags when.  
c2a0: 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 69 6e 67  ** transitioning
c2b0: 20 66 72 6f 6d 20 61 20 53 48 41 52 45 44 20 74   from a SHARED t
c2c0: 6f 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  o a RESERVED loc
c2d0: 6b 2e 20 20 54 68 65 20 63 68 61 6e 67 65 0a 20  k.  The change. 
c2e0: 20 2a 2a 20 66 72 6f 6d 20 53 48 41 52 45 44 20   ** from SHARED 
c2f0: 74 6f 20 52 45 53 45 52 56 45 44 20 6d 61 72 6b  to RESERVED mark
c300: 73 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  s the beginning 
c310: 6f 66 20 61 20 6e 6f 72 6d 61 6c 0a 20 20 2a 2a  of a normal.  **
c320: 20 77 72 69 74 65 20 6f 70 65 72 61 74 69 6f 6e   write operation
c330: 20 28 6e 6f 74 20 61 20 68 6f 74 20 6a 6f 75 72   (not a hot jour
c340: 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 29 2e 0a 20  nal rollback).. 
c350: 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   */.  if( rc==SQ
c360: 4c 49 54 45 5f 4f 4b 0a 20 20 20 26 26 20 70 46  LITE_OK.   && pF
c370: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3c 3d 53  ile->locktype<=S
c380: 48 41 52 45 44 5f 4c 4f 43 4b 0a 20 20 20 26 26  HARED_LOCK.   &&
c390: 20 6c 6f 63 6b 74 79 70 65 3d 3d 52 45 53 45 52   locktype==RESER
c3a0: 56 45 44 5f 4c 4f 43 4b 0a 20 20 29 7b 0a 20 20  VED_LOCK.  ){.  
c3b0: 20 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e    pFile->transCn
c3c0: 74 72 43 68 6e 67 20 3d 20 30 3b 0a 20 20 20 20  trChng = 0;.    
c3d0: 70 46 69 6c 65 2d 3e 64 62 55 70 64 61 74 65 20  pFile->dbUpdate 
c3e0: 3d 20 30 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  = 0;.    pFile->
c3f0: 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 3d 20  inNormalWrite = 
c400: 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 0a  1;.  }.#endif...
c410: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
c420: 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  _OK ){.    pFile
c430: 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63  ->locktype = loc
c440: 6b 74 79 70 65 3b 0a 20 20 20 20 70 4c 6f 63 6b  ktype;.    pLock
c450: 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63  ->locktype = loc
c460: 6b 74 79 70 65 3b 0a 20 20 7d 65 6c 73 65 20 69  ktype;.  }else i
c470: 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43  f( locktype==EXC
c480: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20  LUSIVE_LOCK ){. 
c490: 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79     pFile->lockty
c4a0: 70 65 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43  pe = PENDING_LOC
c4b0: 4b 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 6c 6f  K;.    pLock->lo
c4c0: 63 6b 74 79 70 65 20 3d 20 50 45 4e 44 49 4e 47  cktype = PENDING
c4d0: 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a 0a 65 6e 64 5f  _LOCK;.  }..end_
c4e0: 6c 6f 63 6b 3a 0a 20 20 75 6e 69 78 4c 65 61 76  lock:.  unixLeav
c4f0: 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53 54 52  eMutex();.  OSTR
c500: 41 43 45 34 28 22 4c 4f 43 4b 20 20 20 20 25 64  ACE4("LOCK    %d
c510: 20 25 73 20 25 73 20 28 75 6e 69 78 29 5c 6e 22   %s %s (unix)\n"
c520: 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b  , pFile->h, lock
c530: 74 79 70 65 4e 61 6d 65 28 6c 6f 63 6b 74 79 70  typeName(locktyp
c540: 65 29 2c 20 0a 20 20 20 20 20 20 72 63 3d 3d 53  e), .      rc==S
c550: 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20  QLITE_OK ? "ok" 
c560: 3a 20 22 66 61 69 6c 65 64 22 29 3b 0a 20 20 72  : "failed");.  r
c570: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
c580: 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 66 69 6c  ** Close all fil
c590: 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 61 63  e descriptors ac
c5a0: 63 75 6d 75 61 74 65 64 20 69 6e 20 74 68 65 20  cumuated in the 
c5b0: 75 6e 69 78 4f 70 65 6e 43 6e 74 2d 3e 70 55 6e  unixOpenCnt->pUn
c5c0: 75 73 65 64 20 6c 69 73 74 2e 0a 2a 2a 20 49 66  used list..** If
c5d0: 20 61 6c 6c 20 73 75 63 68 20 66 69 6c 65 20 64   all such file d
c5e0: 65 73 63 72 69 70 74 6f 72 73 20 61 72 65 20 63  escriptors are c
c5f0: 6c 6f 73 65 64 20 77 69 74 68 6f 75 74 20 65 72  losed without er
c600: 72 6f 72 2c 20 74 68 65 20 6c 69 73 74 20 69 73  ror, the list is
c610: 0a 2a 2a 20 63 6c 65 61 72 65 64 20 61 6e 64 20  .** cleared and 
c620: 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
c630: 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77  ed..**.** Otherw
c640: 69 73 65 2c 20 69 66 20 61 6e 20 65 72 72 6f 72  ise, if an error
c650: 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 73 75   occurs, then su
c660: 63 63 65 73 73 66 75 6c 6c 79 20 63 6c 6f 73 65  ccessfully close
c670: 64 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  d file descripto
c680: 72 0a 2a 2a 20 65 6e 74 72 69 65 73 20 61 72 65  r.** entries are
c690: 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68   removed from th
c6a0: 65 20 6c 69 73 74 2c 20 61 6e 64 20 53 51 4c 49  e list, and SQLI
c6b0: 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53 45 20 72  TE_IOERR_CLOSE r
c6c0: 65 74 75 72 6e 65 64 2e 20 0a 2a 2a 20 6e 6f 74  eturned. .** not
c6d0: 20 64 65 6c 65 74 65 64 20 61 6e 64 20 53 51 4c   deleted and SQL
c6e0: 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53 45 20  ITE_IOERR_CLOSE 
c6f0: 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 20 0a 73 74  returned..*/ .st
c700: 61 74 69 63 20 69 6e 74 20 63 6c 6f 73 65 50 65  atic int closePe
c710: 6e 64 69 6e 67 46 64 73 28 75 6e 69 78 46 69 6c  ndingFds(unixFil
c720: 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69 6e 74  e *pFile){.  int
c730: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
c740: 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78 4f 70  .  struct unixOp
c750: 65 6e 43 6e 74 20 2a 70 4f 70 65 6e 20 3d 20 70  enCnt *pOpen = p
c760: 46 69 6c 65 2d 3e 70 4f 70 65 6e 3b 0a 20 20 55  File->pOpen;.  U
c770: 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70 45 72  nixUnusedFd *pEr
c780: 72 6f 72 20 3d 20 30 3b 0a 20 20 55 6e 69 78 55  ror = 0;.  UnixU
c790: 6e 75 73 65 64 46 64 20 2a 70 3b 0a 20 20 55 6e  nusedFd *p;.  Un
c7a0: 69 78 55 6e 75 73 65 64 46 64 20 2a 70 4e 65 78  ixUnusedFd *pNex
c7b0: 74 3b 0a 20 20 66 6f 72 28 70 3d 70 4f 70 65 6e  t;.  for(p=pOpen
c7c0: 2d 3e 70 55 6e 75 73 65 64 3b 20 70 3b 20 70 3d  ->pUnused; p; p=
c7d0: 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78  pNext){.    pNex
c7e0: 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20  t = p->pNext;.  
c7f0: 20 20 69 66 28 20 63 6c 6f 73 65 28 70 2d 3e 66    if( close(p->f
c800: 64 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  d) ){.      pFil
c810: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65  e->lastErrno = e
c820: 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d  rrno;.      rc =
c830: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c   SQLITE_IOERR_CL
c840: 4f 53 45 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4e  OSE;.      p->pN
c850: 65 78 74 20 3d 20 70 45 72 72 6f 72 3b 0a 20 20  ext = pError;.  
c860: 20 20 20 20 70 45 72 72 6f 72 20 3d 20 70 3b 0a      pError = p;.
c870: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
c880: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
c890: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 4f  ;.    }.  }.  pO
c8a0: 70 65 6e 2d 3e 70 55 6e 75 73 65 64 20 3d 20 70  pen->pUnused = p
c8b0: 45 72 72 6f 72 3b 0a 20 20 72 65 74 75 72 6e 20  Error;.  return 
c8c0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  rc;.}../*.** Add
c8d0: 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
c8e0: 70 74 6f 72 20 75 73 65 64 20 62 79 20 66 69 6c  ptor used by fil
c8f0: 65 20 68 61 6e 64 6c 65 20 70 46 69 6c 65 20 74  e handle pFile t
c900: 6f 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  o the correspond
c910: 69 6e 67 0a 2a 2a 20 70 55 6e 75 73 65 64 20 6c  ing.** pUnused l
c920: 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ist..*/.static v
c930: 6f 69 64 20 73 65 74 50 65 6e 64 69 6e 67 46 64  oid setPendingFd
c940: 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65  (unixFile *pFile
c950: 29 7b 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78  ){.  struct unix
c960: 4f 70 65 6e 43 6e 74 20 2a 70 4f 70 65 6e 20 3d  OpenCnt *pOpen =
c970: 20 70 46 69 6c 65 2d 3e 70 4f 70 65 6e 3b 0a 20   pFile->pOpen;. 
c980: 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70   UnixUnusedFd *p
c990: 20 3d 20 70 46 69 6c 65 2d 3e 70 55 6e 75 73 65   = pFile->pUnuse
c9a0: 64 3b 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20  d;.  p->pNext = 
c9b0: 70 4f 70 65 6e 2d 3e 70 55 6e 75 73 65 64 3b 0a  pOpen->pUnused;.
c9c0: 20 20 70 4f 70 65 6e 2d 3e 70 55 6e 75 73 65 64    pOpen->pUnused
c9d0: 20 3d 20 70 3b 0a 20 20 70 46 69 6c 65 2d 3e 68   = p;.  pFile->h
c9e0: 20 3d 20 2d 31 3b 0a 20 20 70 46 69 6c 65 2d 3e   = -1;.  pFile->
c9f0: 70 55 6e 75 73 65 64 20 3d 20 30 3b 0a 7d 0a 0a  pUnused = 0;.}..
ca00: 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20  /*.** Lower the 
ca10: 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e  locking level on
ca20: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
ca30: 20 70 46 69 6c 65 20 74 6f 20 6c 6f 63 6b 74 79   pFile to lockty
ca40: 70 65 2e 20 20 6c 6f 63 6b 74 79 70 65 0a 2a 2a  pe.  locktype.**
ca50: 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20   must be either 
ca60: 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45  NO_LOCK or SHARE
ca70: 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66  D_LOCK..**.** If
ca80: 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
ca90: 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64  el of the file d
caa0: 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72  escriptor is alr
cab0: 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77  eady at or below
cac0: 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65  .** the requeste
cad0: 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c  d locking level,
cae0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
caf0: 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61   a no-op..*/.sta
cb00: 74 69 63 20 69 6e 74 20 75 6e 69 78 55 6e 6c 6f  tic int unixUnlo
cb10: 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
cb20: 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70  *id, int locktyp
cb30: 65 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  e){.  unixFile *
cb40: 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
cb50: 65 2a 29 69 64 3b 20 2f 2a 20 54 68 65 20 6f 70  e*)id; /* The op
cb60: 65 6e 20 66 69 6c 65 20 2a 2f 0a 20 20 73 74 72  en file */.  str
cb70: 75 63 74 20 75 6e 69 78 4c 6f 63 6b 49 6e 66 6f  uct unixLockInfo
cb80: 20 2a 70 4c 6f 63 6b 3b 20 20 20 20 20 20 2f 2a   *pLock;      /*
cb90: 20 53 74 72 75 63 74 75 72 65 20 64 65 73 63 72   Structure descr
cba0: 69 62 69 6e 67 20 63 75 72 72 65 6e 74 20 6c 6f  ibing current lo
cbb0: 63 6b 20 73 74 61 74 65 20 2a 2f 0a 20 20 73 74  ck state */.  st
cbc0: 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b  ruct flock lock;
cbd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
cbe0: 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 70 61  * Information pa
cbf0: 73 73 65 64 20 69 6e 74 6f 20 66 63 6e 74 6c 28  ssed into fcntl(
cc00: 29 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  ) */.  int rc = 
cc10: 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
cc20: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
cc30: 6e 20 63 6f 64 65 20 66 72 6f 6d 20 74 68 69 73  n code from this
cc40: 20 69 6e 74 65 72 66 61 63 65 20 2a 2f 0a 20 20   interface */.  
cc50: 69 6e 74 20 68 3b 20 20 20 20 20 20 20 20 20 20  int h;          
cc60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc70: 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69   /* The underlyi
cc80: 6e 67 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ng file descript
cc90: 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 74 45 72 72  or */.  int tErr
cca0: 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  no;             
ccb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f           /* Erro
ccc0: 72 20 63 6f 64 65 20 66 72 6f 6d 20 73 79 73 74  r code from syst
ccd0: 65 6d 20 63 61 6c 6c 20 65 72 72 6f 72 73 20 2a  em call errors *
cce0: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  /..  assert( pFi
ccf0: 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 37  le );.  OSTRACE7
cd00: 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20  ("UNLOCK  %d %d 
cd10: 77 61 73 20 25 64 28 25 64 2c 25 64 29 20 70 69  was %d(%d,%d) pi
cd20: 64 3d 25 64 20 28 75 6e 69 78 29 5c 6e 22 2c 20  d=%d (unix)\n", 
cd30: 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79  pFile->h, lockty
cd40: 70 65 2c 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  pe,.      pFile-
cd50: 3e 6c 6f 63 6b 74 79 70 65 2c 20 70 46 69 6c 65  >locktype, pFile
cd60: 2d 3e 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70  ->pLock->locktyp
cd70: 65 2c 20 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 2d  e, pFile->pLock-
cd80: 3e 63 6e 74 2c 20 67 65 74 70 69 64 28 29 29 3b  >cnt, getpid());
cd90: 0a 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b  ..  assert( lock
cda0: 74 79 70 65 3c 3d 53 48 41 52 45 44 5f 4c 4f 43  type<=SHARED_LOC
cdb0: 4b 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65  K );.  if( pFile
cdc0: 2d 3e 6c 6f 63 6b 74 79 70 65 3c 3d 6c 6f 63 6b  ->locktype<=lock
cdd0: 74 79 70 65 20 29 7b 0a 20 20 20 20 72 65 74 75  type ){.    retu
cde0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
cdf0: 7d 0a 20 20 69 66 28 20 43 48 45 43 4b 5f 54 48  }.  if( CHECK_TH
ce00: 52 45 41 44 49 44 28 70 46 69 6c 65 29 20 29 7b  READID(pFile) ){
ce10: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
ce20: 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20 7d 0a 20  TE_MISUSE;.  }. 
ce30: 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
ce40: 29 3b 0a 20 20 68 20 3d 20 70 46 69 6c 65 2d 3e  );.  h = pFile->
ce50: 68 3b 0a 20 20 70 4c 6f 63 6b 20 3d 20 70 46 69  h;.  pLock = pFi
ce60: 6c 65 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 61 73 73  le->pLock;.  ass
ce70: 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 63 6e 74 21  ert( pLock->cnt!
ce80: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c  =0 );.  if( pFil
ce90: 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 53 48 41 52  e->locktype>SHAR
cea0: 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61  ED_LOCK ){.    a
ceb0: 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 6c 6f  ssert( pLock->lo
cec0: 63 6b 74 79 70 65 3d 3d 70 46 69 6c 65 2d 3e 6c  cktype==pFile->l
ced0: 6f 63 6b 74 79 70 65 20 29 3b 0a 20 20 20 20 53  ocktype );.    S
cee0: 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65  imulateIOErrorBe
cef0: 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 53 69 6d  nign(1);.    Sim
cf00: 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 68 3d  ulateIOError( h=
cf10: 28 2d 31 29 20 29 0a 20 20 20 20 53 69 6d 75 6c  (-1) ).    Simul
cf20: 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e  ateIOErrorBenign
cf30: 28 30 29 3b 0a 0a 23 69 66 6e 64 65 66 20 4e 44  (0);..#ifndef ND
cf40: 45 42 55 47 0a 20 20 20 20 2f 2a 20 57 68 65 6e  EBUG.    /* When
cf50: 20 72 65 64 75 63 69 6e 67 20 61 20 6c 6f 63 6b   reducing a lock
cf60: 20 73 75 63 68 20 74 68 61 74 20 6f 74 68 65 72   such that other
cf70: 20 70 72 6f 63 65 73 73 65 73 20 63 61 6e 20 73   processes can s
cf80: 74 61 72 74 0a 20 20 20 20 2a 2a 20 72 65 61 64  tart.    ** read
cf90: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
cfa0: 20 66 69 6c 65 20 61 67 61 69 6e 2c 20 6d 61 6b   file again, mak
cfb0: 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65 0a  e sure that the.
cfc0: 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
cfd0: 6f 6e 20 63 6f 75 6e 74 65 72 20 77 61 73 20 75  on counter was u
cfe0: 70 64 61 74 65 64 20 69 66 20 61 6e 79 20 70 61  pdated if any pa
cff0: 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  rt of the databa
d000: 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 63  se.    ** file c
d010: 68 61 6e 67 65 64 2e 20 20 49 66 20 74 68 65 20  hanged.  If the 
d020: 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e  transaction coun
d030: 74 65 72 20 69 73 20 6e 6f 74 20 75 70 64 61 74  ter is not updat
d040: 65 64 2c 0a 20 20 20 20 2a 2a 20 6f 74 68 65 72  ed,.    ** other
d050: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 6f 20   connections to 
d060: 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20 6d 69  the same file mi
d070: 67 68 74 20 6e 6f 74 20 72 65 61 6c 69 7a 65 20  ght not realize 
d080: 74 68 61 74 0a 20 20 20 20 2a 2a 20 74 68 65 20  that.    ** the 
d090: 66 69 6c 65 20 68 61 73 20 63 68 61 6e 67 65 64  file has changed
d0a0: 20 61 6e 64 20 68 65 6e 63 65 20 6d 69 67 68 74   and hence might
d0b0: 20 6e 6f 74 20 6b 6e 6f 77 20 74 6f 20 66 6c 75   not know to flu
d0c0: 73 68 20 74 68 65 69 72 0a 20 20 20 20 2a 2a 20  sh their.    ** 
d0d0: 63 61 63 68 65 2e 20 20 54 68 65 20 75 73 65 20  cache.  The use 
d0e0: 6f 66 20 61 20 73 74 61 6c 65 20 63 61 63 68 65  of a stale cache
d0f0: 20 63 61 6e 20 6c 65 61 64 20 74 6f 20 64 61 74   can lead to dat
d100: 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
d110: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
d120: 65 72 74 28 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f  ert( pFile->inNo
d130: 72 6d 61 6c 57 72 69 74 65 3d 3d 30 0a 20 20 20  rmalWrite==0.   
d140: 20 20 20 20 20 20 7c 7c 20 70 46 69 6c 65 2d 3e        || pFile->
d150: 64 62 55 70 64 61 74 65 3d 3d 30 0a 20 20 20 20  dbUpdate==0.    
d160: 20 20 20 20 20 7c 7c 20 70 46 69 6c 65 2d 3e 74       || pFile->t
d170: 72 61 6e 73 43 6e 74 72 43 68 6e 67 3d 3d 31 20  ransCntrChng==1 
d180: 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 69 6e  );.    pFile->in
d190: 4e 6f 72 6d 61 6c 57 72 69 74 65 20 3d 20 30 3b  NormalWrite = 0;
d1a0: 0a 23 65 6e 64 69 66 0a 0a 0a 20 20 20 20 69 66  .#endif...    if
d1b0: 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52  ( locktype==SHAR
d1c0: 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20  ED_LOCK ){.     
d1d0: 20 69 66 28 20 72 61 6e 67 65 4c 6f 63 6b 28 70   if( rangeLock(p
d1e0: 46 69 6c 65 2c 20 46 5f 52 44 4c 43 4b 2c 20 26  File, F_RDLCK, &
d1f0: 74 45 72 72 6e 6f 29 3d 3d 28 2d 31 29 20 29 7b  tErrno)==(-1) ){
d200: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
d210: 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73  liteErrorFromPos
d220: 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20  ixError(tErrno, 
d230: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c  SQLITE_IOERR_RDL
d240: 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 69 66  OCK);.        if
d250: 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  ( IS_LOCK_ERROR(
d260: 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rc) ){.         
d270: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
d280: 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20  o = tErrno;.    
d290: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 67 6f      }.        go
d2a0: 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20  to end_unlock;. 
d2b0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
d2c0: 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46   lock.l_type = F
d2d0: 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 6c 6f 63 6b  _UNLCK;.    lock
d2e0: 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b  .l_whence = SEEK
d2f0: 5f 53 45 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c  _SET;.    lock.l
d300: 5f 73 74 61 72 74 20 3d 20 50 45 4e 44 49 4e 47  _start = PENDING
d310: 5f 42 59 54 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e  _BYTE;.    lock.
d320: 6c 5f 6c 65 6e 20 3d 20 32 4c 3b 20 20 61 73 73  l_len = 2L;  ass
d330: 65 72 74 28 20 50 45 4e 44 49 4e 47 5f 42 59 54  ert( PENDING_BYT
d340: 45 2b 31 3d 3d 52 45 53 45 52 56 45 44 5f 42 59  E+1==RESERVED_BY
d350: 54 45 20 29 3b 0a 20 20 20 20 69 66 28 20 66 63  TE );.    if( fc
d360: 6e 74 6c 28 68 2c 20 46 5f 53 45 54 4c 4b 2c 20  ntl(h, F_SETLK, 
d370: 26 6c 6f 63 6b 29 21 3d 28 2d 31 29 20 29 7b 0a  &lock)!=(-1) ){.
d380: 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 6c 6f 63        pLock->loc
d390: 6b 74 79 70 65 20 3d 20 53 48 41 52 45 44 5f 4c  ktype = SHARED_L
d3a0: 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  OCK;.    }else{.
d3b0: 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65        tErrno = e
d3c0: 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d  rrno;.      rc =
d3d0: 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d   sqliteErrorFrom
d3e0: 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e  PosixError(tErrn
d3f0: 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  o, SQLITE_IOERR_
d400: 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69  UNLOCK);.      i
d410: 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
d420: 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20  (rc) ){.        
d430: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
d440: 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20   = tErrno;.     
d450: 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e   }.      goto en
d460: 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a  d_unlock;.    }.
d470: 20 20 7d 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79    }.  if( lockty
d480: 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20  pe==NO_LOCK ){. 
d490: 20 20 20 73 74 72 75 63 74 20 75 6e 69 78 4f 70     struct unixOp
d4a0: 65 6e 43 6e 74 20 2a 70 4f 70 65 6e 3b 0a 0a 20  enCnt *pOpen;.. 
d4b0: 20 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20     /* Decrement 
d4c0: 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  the shared lock 
d4d0: 63 6f 75 6e 74 65 72 2e 20 20 52 65 6c 65 61 73  counter.  Releas
d4e0: 65 20 74 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67  e the lock using
d4f0: 20 61 6e 0a 20 20 20 20 2a 2a 20 4f 53 20 63 61   an.    ** OS ca
d500: 6c 6c 20 6f 6e 6c 79 20 77 68 65 6e 20 61 6c 6c  ll only when all
d510: 20 74 68 72 65 61 64 73 20 69 6e 20 74 68 69 73   threads in this
d520: 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 68 61   same process ha
d530: 76 65 20 72 65 6c 65 61 73 65 64 0a 20 20 20 20  ve released.    
d540: 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 0a 20 20 20  ** the lock..   
d550: 20 2a 2f 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 63   */.    pLock->c
d560: 6e 74 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 4c  nt--;.    if( pL
d570: 6f 63 6b 2d 3e 63 6e 74 3d 3d 30 20 29 7b 0a 20  ock->cnt==0 ){. 
d580: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65       lock.l_type
d590: 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20   = F_UNLCK;.    
d5a0: 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20    lock.l_whence 
d5b0: 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20  = SEEK_SET;.    
d5c0: 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
d5d0: 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 30 4c   lock.l_len = 0L
d5e0: 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65  ;.      Simulate
d5f0: 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29  IOErrorBenign(1)
d600: 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65  ;.      Simulate
d610: 49 4f 45 72 72 6f 72 28 20 68 3d 28 2d 31 29 20  IOError( h=(-1) 
d620: 29 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65  ).      Simulate
d630: 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29  IOErrorBenign(0)
d640: 3b 0a 20 20 20 20 20 20 69 66 28 20 66 63 6e 74  ;.      if( fcnt
d650: 6c 28 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c  l(h, F_SETLK, &l
d660: 6f 63 6b 29 21 3d 28 2d 31 29 20 29 7b 0a 20 20  ock)!=(-1) ){.  
d670: 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 6c 6f 63        pLock->loc
d680: 6b 74 79 70 65 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b  ktype = NO_LOCK;
d690: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
d6a0: 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65        tErrno = e
d6b0: 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 72 63  rrno;.        rc
d6c0: 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
d6d0: 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
d6e0: 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
d6f0: 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  R_UNLOCK);.     
d700: 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
d710: 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20  RROR(rc) ){.    
d720: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
d730: 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b  tErrno = tErrno;
d740: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
d750: 20 20 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79     pLock->lockty
d760: 70 65 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20  pe = NO_LOCK;.  
d770: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63        pFile->loc
d780: 6b 74 79 70 65 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b  ktype = NO_LOCK;
d790: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
d7a0: 20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74      /* Decrement
d7b0: 20 74 68 65 20 63 6f 75 6e 74 20 6f 66 20 6c 6f   the count of lo
d7c0: 63 6b 73 20 61 67 61 69 6e 73 74 20 74 68 69 73  cks against this
d7d0: 20 73 61 6d 65 20 66 69 6c 65 2e 20 20 57 68 65   same file.  Whe
d7e0: 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f 75  n the.    ** cou
d7f0: 6e 74 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2c  nt reaches zero,
d800: 20 63 6c 6f 73 65 20 61 6e 79 20 6f 74 68 65 72   close any other
d810: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
d820: 73 20 77 68 6f 73 65 20 63 6c 6f 73 65 0a 20 20  s whose close.  
d830: 20 20 2a 2a 20 77 61 73 20 64 65 66 65 72 72 65    ** was deferre
d840: 64 20 62 65 63 61 75 73 65 20 6f 66 20 6f 75 74  d because of out
d850: 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 2e 0a  standing locks..
d860: 20 20 20 20 2a 2f 0a 20 20 20 20 70 4f 70 65 6e      */.    pOpen
d870: 20 3d 20 70 46 69 6c 65 2d 3e 70 4f 70 65 6e 3b   = pFile->pOpen;
d880: 0a 20 20 20 20 70 4f 70 65 6e 2d 3e 6e 4c 6f 63  .    pOpen->nLoc
d890: 6b 2d 2d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  k--;.    assert(
d8a0: 20 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 3e 3d 30   pOpen->nLock>=0
d8b0: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 70 65   );.    if( pOpe
d8c0: 6e 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20  n->nLock==0 ){. 
d8d0: 20 20 20 20 20 69 6e 74 20 72 63 32 20 3d 20 63       int rc2 = c
d8e0: 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64 73 28 70  losePendingFds(p
d8f0: 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 69 66 28  File);.      if(
d900: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
d910: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 72  {.        rc = r
d920: 63 32 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  c2;.      }.    
d930: 7d 0a 20 20 7d 0a 09 0a 65 6e 64 5f 75 6e 6c 6f  }.  }...end_unlo
d940: 63 6b 3a 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d  ck:.  unixLeaveM
d950: 75 74 65 78 28 29 3b 0a 20 20 69 66 28 20 72 63  utex();.  if( rc
d960: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70 46  ==SQLITE_OK ) pF
d970: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20  ile->locktype = 
d980: 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 72 65 74 75  locktype;.  retu
d990: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
d9a0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 70 65  This function pe
d9b0: 72 66 6f 72 6d 73 20 74 68 65 20 70 61 72 74 73  rforms the parts
d9c0: 20 6f 66 20 74 68 65 20 22 63 6c 6f 73 65 20 66   of the "close f
d9d0: 69 6c 65 22 20 6f 70 65 72 61 74 69 6f 6e 20 0a  ile" operation .
d9e0: 2a 2a 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c  ** common to all
d9f0: 20 6c 6f 63 6b 69 6e 67 20 73 63 68 65 6d 65 73   locking schemes
da00: 2e 20 49 74 20 63 6c 6f 73 65 73 20 74 68 65 20  . It closes the 
da10: 64 69 72 65 63 74 6f 72 79 20 61 6e 64 20 66 69  directory and fi
da20: 6c 65 0a 2a 2a 20 68 61 6e 64 6c 65 73 2c 20 69  le.** handles, i
da30: 66 20 74 68 65 79 20 61 72 65 20 76 61 6c 69 64  f they are valid
da40: 2c 20 61 6e 64 20 73 65 74 73 20 61 6c 6c 20 66  , and sets all f
da50: 69 65 6c 64 73 20 6f 66 20 74 68 65 20 75 6e 69  ields of the uni
da60: 78 46 69 6c 65 0a 2a 2a 20 73 74 72 75 63 74 75  xFile.** structu
da70: 72 65 20 74 6f 20 30 2e 0a 2a 2a 0a 2a 2a 20 49  re to 0..**.** I
da80: 74 20 69 73 20 2a 6e 6f 74 2a 20 6e 65 63 65 73  t is *not* neces
da90: 73 61 72 79 20 74 6f 20 68 6f 6c 64 20 74 68 65  sary to hold the
daa0: 20 6d 75 74 65 78 20 77 68 65 6e 20 74 68 69 73   mutex when this
dab0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
dac0: 65 64 2c 0a 2a 2a 20 65 76 65 6e 20 6f 6e 20 56  ed,.** even on V
dad0: 78 57 6f 72 6b 73 2e 20 20 41 20 6d 75 74 65 78  xWorks.  A mutex
dae0: 20 77 69 6c 6c 20 62 65 20 61 63 71 75 69 72 65   will be acquire
daf0: 64 20 6f 6e 20 56 78 57 6f 72 6b 73 20 62 79 20  d on VxWorks by 
db00: 74 68 65 0a 2a 2a 20 76 78 77 6f 72 6b 73 52 65  the.** vxworksRe
db10: 6c 65 61 73 65 46 69 6c 65 49 64 28 29 20 72 6f  leaseFileId() ro
db20: 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  utine..*/.static
db30: 20 69 6e 74 20 63 6c 6f 73 65 55 6e 69 78 46 69   int closeUnixFi
db40: 6c 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  le(sqlite3_file 
db50: 2a 69 64 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65  *id){.  unixFile
db60: 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
db70: 69 6c 65 2a 29 69 64 3b 0a 20 20 69 66 28 20 70  ile*)id;.  if( p
db80: 46 69 6c 65 20 29 7b 0a 20 20 20 20 69 66 28 20  File ){.    if( 
db90: 70 46 69 6c 65 2d 3e 64 69 72 66 64 3e 3d 30 20  pFile->dirfd>=0 
dba0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 65 72 72  ){.      int err
dbb0: 20 3d 20 63 6c 6f 73 65 28 70 46 69 6c 65 2d 3e   = close(pFile->
dbc0: 64 69 72 66 64 29 3b 0a 20 20 20 20 20 20 69 66  dirfd);.      if
dbd0: 28 20 65 72 72 20 29 7b 0a 20 20 20 20 20 20 20  ( err ){.       
dbe0: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
dbf0: 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
dc00: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
dc10: 5f 49 4f 45 52 52 5f 44 49 52 5f 43 4c 4f 53 45  _IOERR_DIR_CLOSE
dc20: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
dc30: 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 64 69         pFile->di
dc40: 72 66 64 3d 2d 31 3b 0a 20 20 20 20 20 20 7d 0a  rfd=-1;.      }.
dc50: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 46      }.    if( pF
dc60: 69 6c 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20  ile->h>=0 ){.   
dc70: 20 20 20 69 6e 74 20 65 72 72 20 3d 20 63 6c 6f     int err = clo
dc80: 73 65 28 70 46 69 6c 65 2d 3e 68 29 3b 0a 20 20  se(pFile->h);.  
dc90: 20 20 20 20 69 66 28 20 65 72 72 20 29 7b 0a 20      if( err ){. 
dca0: 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61         pFile->la
dcb0: 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b  stErrno = errno;
dcc0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
dcd0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f  SQLITE_IOERR_CLO
dce0: 53 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  SE;.      }.    
dcf0: 7d 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  }.#if OS_VXWORKS
dd00: 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  .    if( pFile->
dd10: 70 49 64 20 29 7b 0a 20 20 20 20 20 20 69 66 28  pId ){.      if(
dd20: 20 70 46 69 6c 65 2d 3e 69 73 44 65 6c 65 74 65   pFile->isDelete
dd30: 20 29 7b 0a 20 20 20 20 20 20 20 20 75 6e 6c 69   ){.        unli
dd40: 6e 6b 28 70 46 69 6c 65 2d 3e 70 49 64 2d 3e 7a  nk(pFile->pId->z
dd50: 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 29 3b 0a  CanonicalName);.
dd60: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 76 78        }.      vx
dd70: 77 6f 72 6b 73 52 65 6c 65 61 73 65 46 69 6c 65  worksReleaseFile
dd80: 49 64 28 70 46 69 6c 65 2d 3e 70 49 64 29 3b 0a  Id(pFile->pId);.
dd90: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 70 49 64        pFile->pId
dda0: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 23 65 6e 64   = 0;.    }.#end
ddb0: 69 66 0a 20 20 20 20 4f 53 54 52 41 43 45 32 28  if.    OSTRACE2(
ddc0: 22 43 4c 4f 53 45 20 20 20 25 2d 33 64 5c 6e 22  "CLOSE   %-3d\n"
ddd0: 2c 20 70 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 20  , pFile->h);.   
dde0: 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2d 31 29   OpenCounter(-1)
ddf0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
de00: 65 65 28 70 46 69 6c 65 2d 3e 70 55 6e 75 73 65  ee(pFile->pUnuse
de10: 64 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70  d);.    memset(p
de20: 46 69 6c 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28  File, 0, sizeof(
de30: 75 6e 69 78 46 69 6c 65 29 29 3b 0a 20 20 7d 0a  unixFile));.  }.
de40: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
de50: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  OK;.}../*.** Clo
de60: 73 65 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74  se a file..*/.st
de70: 61 74 69 63 20 69 6e 74 20 75 6e 69 78 43 6c 6f  atic int unixClo
de80: 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  se(sqlite3_file 
de90: 2a 69 64 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  *id){.  int rc =
dea0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
deb0: 28 20 69 64 20 29 7b 0a 20 20 20 20 75 6e 69 78  ( id ){.    unix
dec0: 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
ded0: 6e 69 78 46 69 6c 65 20 2a 29 69 64 3b 0a 20 20  nixFile *)id;.  
dee0: 20 20 75 6e 69 78 55 6e 6c 6f 63 6b 28 69 64 2c    unixUnlock(id,
def0: 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 75   NO_LOCK);.    u
df00: 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
df10: 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  .    if( pFile->
df20: 70 4f 70 65 6e 20 26 26 20 70 46 69 6c 65 2d 3e  pOpen && pFile->
df30: 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 20 29 7b 0a  pOpen->nLock ){.
df40: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72        /* If ther
df50: 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e  e are outstandin
df60: 67 20 6c 6f 63 6b 73 2c 20 64 6f 20 6e 6f 74 20  g locks, do not 
df70: 61 63 74 75 61 6c 6c 79 20 63 6c 6f 73 65 20 74  actually close t
df80: 68 65 20 66 69 6c 65 20 6a 75 73 74 0a 20 20 20  he file just.   
df90: 20 20 20 2a 2a 20 79 65 74 20 62 65 63 61 75 73     ** yet becaus
dfa0: 65 20 74 68 61 74 20 77 6f 75 6c 64 20 63 6c 65  e that would cle
dfb0: 61 72 20 74 68 6f 73 65 20 6c 6f 63 6b 73 2e 20  ar those locks. 
dfc0: 20 49 6e 73 74 65 61 64 2c 20 61 64 64 20 74 68   Instead, add th
dfd0: 65 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20  e file.      ** 
dfe0: 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 70 4f  descriptor to pO
dff0: 70 65 6e 2d 3e 70 55 6e 75 73 65 64 20 6c 69 73  pen->pUnused lis
e000: 74 2e 20 20 49 74 20 77 69 6c 6c 20 62 65 20 61  t.  It will be a
e010: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6c 6f  utomatically clo
e020: 73 65 64 20 0a 20 20 20 20 20 20 2a 2a 20 77 68  sed .      ** wh
e030: 65 6e 20 74 68 65 20 6c 61 73 74 20 6c 6f 63 6b  en the last lock
e040: 20 69 73 20 63 6c 65 61 72 65 64 2e 0a 20 20 20   is cleared..   
e050: 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 65 74 50     */.      setP
e060: 65 6e 64 69 6e 67 46 64 28 70 46 69 6c 65 29 3b  endingFd(pFile);
e070: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6c 65 61  .    }.    relea
e080: 73 65 4c 6f 63 6b 49 6e 66 6f 28 70 46 69 6c 65  seLockInfo(pFile
e090: 2d 3e 70 4c 6f 63 6b 29 3b 0a 20 20 20 20 72 65  ->pLock);.    re
e0a0: 6c 65 61 73 65 4f 70 65 6e 43 6e 74 28 70 46 69  leaseOpenCnt(pFi
e0b0: 6c 65 2d 3e 70 4f 70 65 6e 29 3b 0a 20 20 20 20  le->pOpen);.    
e0c0: 72 63 20 3d 20 63 6c 6f 73 65 55 6e 69 78 46 69  rc = closeUnixFi
e0d0: 6c 65 28 69 64 29 3b 0a 20 20 20 20 75 6e 69 78  le(id);.    unix
e0e0: 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
e0f0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
e100: 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
e110: 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 70 6f 73  * End of the pos
e120: 69 78 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b  ix advisory lock
e130: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
e140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e150: 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
e160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e170: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e180: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e190: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e1a0: 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /../************
e1b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e1c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e1d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e1e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e1f0: 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
e200: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e210: 2a 20 4e 6f 2d 6f 70 20 4c 6f 63 6b 69 6e 67 20  * No-op Locking 
e220: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e230: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e240: 2a 2a 0a 2a 2a 0a 2a 2a 20 4f 66 20 74 68 65 20  **.**.** Of the 
e250: 76 61 72 69 6f 75 73 20 6c 6f 63 6b 69 6e 67 20  various locking 
e260: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20  implementations 
e270: 61 76 61 69 6c 61 62 6c 65 2c 20 74 68 69 73 20  available, this 
e280: 69 73 20 62 79 20 66 61 72 20 74 68 65 0a 2a 2a  is by far the.**
e290: 20 73 69 6d 70 6c 65 73 74 3a 20 20 6c 6f 63 6b   simplest:  lock
e2a0: 69 6e 67 20 69 73 20 69 67 6e 6f 72 65 64 2e 20  ing is ignored. 
e2b0: 20 4e 6f 20 61 74 74 65 6d 70 74 20 69 73 20 6d   No attempt is m
e2c0: 61 64 65 20 74 6f 20 6c 6f 63 6b 20 74 68 65 20  ade to lock the 
e2d0: 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65  database.** file
e2e0: 20 66 6f 72 20 72 65 61 64 69 6e 67 20 6f 72 20   for reading or 
e2f0: 77 72 69 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54  writing..**.** T
e300: 68 69 73 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65  his locking mode
e310: 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 20   is appropriate 
e320: 66 6f 72 20 75 73 65 20 6f 6e 20 72 65 61 64 2d  for use on read-
e330: 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 73 0a 2a  only databases.*
e340: 2a 20 28 65 78 3a 20 64 61 74 61 62 61 73 65 73  * (ex: databases
e350: 20 74 68 61 74 20 61 72 65 20 62 75 72 6e 65 64   that are burned
e360: 20 69 6e 74 6f 20 43 44 2d 52 4f 4d 2c 20 66 6f   into CD-ROM, fo
e370: 72 20 65 78 61 6d 70 6c 65 2e 29 20 20 49 74 20  r example.)  It 
e380: 63 61 6e 0a 2a 2a 20 61 6c 73 6f 20 62 65 20 75  can.** also be u
e390: 73 65 64 20 69 66 20 74 68 65 20 61 70 70 6c 69  sed if the appli
e3a0: 63 61 74 69 6f 6e 20 65 6d 70 6c 6f 79 73 20 73  cation employs s
e3b0: 6f 6d 65 20 65 78 74 65 72 6e 61 6c 20 6d 65 63  ome external mec
e3c0: 68 61 6e 69 73 6d 20 74 6f 0a 2a 2a 20 70 72 65  hanism to.** pre
e3d0: 76 65 6e 74 20 73 69 6d 75 6c 74 61 6e 65 6f 75  vent simultaneou
e3e0: 73 20 61 63 63 65 73 73 20 6f 66 20 74 68 65 20  s access of the 
e3f0: 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 62 79  same database by
e400: 20 74 77 6f 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20   two or more.** 
e410: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
e420: 69 6f 6e 73 2e 20 20 42 75 74 20 74 68 65 72 65  ions.  But there
e430: 20 69 73 20 61 20 73 65 72 69 6f 75 73 20 72 69   is a serious ri
e440: 73 6b 20 6f 66 20 64 61 74 61 62 61 73 65 0a 2a  sk of database.*
e450: 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 66 20  * corruption if 
e460: 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64  this locking mod
e470: 65 20 69 73 20 75 73 65 64 20 69 6e 20 73 69 74  e is used in sit
e480: 75 61 74 69 6f 6e 73 20 77 68 65 72 65 20 6d 75  uations where mu
e490: 6c 74 69 70 6c 65 0a 2a 2a 20 64 61 74 61 62 61  ltiple.** databa
e4a0: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61  se connections a
e4b0: 72 65 20 61 63 63 65 73 73 69 6e 67 20 74 68 65  re accessing the
e4c0: 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 66   same database f
e4d0: 69 6c 65 20 61 74 20 74 68 65 20 73 61 6d 65 0a  ile at the same.
e4e0: 2a 2a 20 74 69 6d 65 20 61 6e 64 20 6f 6e 65 20  ** time and one 
e4f0: 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 6f 73 65  or more of those
e500: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72 65   connections are
e510: 20 77 72 69 74 69 6e 67 2e 0a 2a 2f 0a 0a 73 74   writing..*/..st
e520: 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 43  atic int nolockC
e530: 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
e540: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e  (sqlite3_file *N
e550: 6f 74 55 73 65 64 2c 20 69 6e 74 20 2a 70 52 65  otUsed, int *pRe
e560: 73 4f 75 74 29 7b 0a 20 20 55 4e 55 53 45 44 5f  sOut){.  UNUSED_
e570: 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
e580: 64 29 3b 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d  d);.  *pResOut =
e590: 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   0;.  return SQL
e5a0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 73 74 61 74 69 63  ITE_OK;.}.static
e5b0: 20 69 6e 74 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b 28   int nolockLock(
e5c0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f  sqlite3_file *No
e5d0: 74 55 73 65 64 2c 20 69 6e 74 20 4e 6f 74 55 73  tUsed, int NotUs
e5e0: 65 64 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  ed2){.  UNUSED_P
e5f0: 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73 65  ARAMETER2(NotUse
e600: 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20  d, NotUsed2);.  
e610: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
e620: 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 6e  ;.}.static int n
e630: 6f 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71 6c 69  olockUnlock(sqli
e640: 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65  te3_file *NotUse
e650: 64 2c 20 69 6e 74 20 4e 6f 74 55 73 65 64 32 29  d, int NotUsed2)
e660: 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
e670: 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e  ETER2(NotUsed, N
e680: 6f 74 55 73 65 64 32 29 3b 0a 20 20 72 65 74 75  otUsed2);.  retu
e690: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
e6a0: 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 74 68 65  ./*.** Close the
e6b0: 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
e6c0: 20 69 6e 74 20 6e 6f 6c 6f 63 6b 43 6c 6f 73 65   int nolockClose
e6d0: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
e6e0: 64 29 20 7b 0a 20 20 72 65 74 75 72 6e 20 63 6c  d) {.  return cl
e6f0: 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b  oseUnixFile(id);
e700: 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .}../***********
e710: 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20  ******** End of 
e720: 74 68 65 20 6e 6f 2d 6f 70 20 6c 6f 63 6b 20 69  the no-op lock i
e730: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a  mplementation **
e740: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e750: 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
e760: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e770: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e780: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e790: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e7a0: 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **/../**********
e7b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e7c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e7d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e7e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e7f0: 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
e800: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42  ************** B
e810: 65 67 69 6e 20 64 6f 74 2d 66 69 6c 65 20 4c 6f  egin dot-file Lo
e820: 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  cking **********
e830: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e840: 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64  ****.**.** The d
e850: 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69  otfile locking i
e860: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 75 73  mplementation us
e870: 65 73 20 74 68 65 20 65 78 69 73 74 61 6e 63 65  es the existance
e880: 20 6f 66 20 73 65 70 61 72 61 74 65 20 6c 6f 63   of separate loc
e890: 6b 0a 2a 2a 20 66 69 6c 65 73 20 69 6e 20 6f 72  k.** files in or
e8a0: 64 65 72 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 61  der to control a
e8b0: 63 63 65 73 73 20 74 6f 20 74 68 65 20 64 61 74  ccess to the dat
e8c0: 61 62 61 73 65 2e 20 20 54 68 69 73 20 77 6f 72  abase.  This wor
e8d0: 6b 73 20 6f 6e 20 6a 75 73 74 0a 2a 2a 20 61 62  ks on just.** ab
e8e0: 6f 75 74 20 65 76 65 72 79 20 66 69 6c 65 73 79  out every filesy
e8f0: 73 74 65 6d 20 69 6d 61 67 69 6e 61 62 6c 65 2e  stem imaginable.
e900: 20 20 42 75 74 20 74 68 65 72 65 20 61 72 65 20    But there are 
e910: 73 65 72 69 6f 75 73 20 64 6f 77 6e 73 69 64 65  serious downside
e920: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20  s:.**.**    (1) 
e930: 20 54 68 65 72 65 20 69 73 20 7a 65 72 6f 20 63   There is zero c
e940: 6f 6e 63 75 72 72 65 6e 63 79 2e 20 20 41 20 73  oncurrency.  A s
e950: 69 6e 67 6c 65 20 72 65 61 64 65 72 20 62 6c 6f  ingle reader blo
e960: 63 6b 73 20 61 6c 6c 20 6f 74 68 65 72 0a 2a 2a  cks all other.**
e970: 20 20 20 20 20 20 20 20 20 63 6f 6e 6e 65 63 74           connect
e980: 69 6f 6e 73 20 66 72 6f 6d 20 72 65 61 64 69 6e  ions from readin
e990: 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65  g or writing the
e9a0: 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a   database..**.**
e9b0: 20 20 20 20 28 32 29 20 20 41 6e 20 61 70 70 6c      (2)  An appl
e9c0: 69 63 61 74 69 6f 6e 20 63 72 61 73 68 20 6f 72  ication crash or
e9d0: 20 70 6f 77 65 72 20 6c 6f 73 73 20 63 61 6e 20   power loss can 
e9e0: 6c 65 61 76 65 20 73 74 61 6c 65 20 6c 6f 63 6b  leave stale lock
e9f0: 20 66 69 6c 65 73 0a 2a 2a 20 20 20 20 20 20 20   files.**       
ea00: 20 20 73 69 74 74 69 6e 67 20 61 72 6f 75 6e 64    sitting around
ea10: 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65   that need to be
ea20: 20 63 6c 65 61 72 65 64 20 6d 61 6e 75 61 6c 6c   cleared manuall
ea30: 79 2e 0a 2a 2a 0a 2a 2a 20 4e 65 76 65 72 74 68  y..**.** Neverth
ea40: 65 6c 65 73 73 2c 20 61 20 64 6f 74 6c 6f 63 6b  eless, a dotlock
ea50: 20 69 73 20 61 6e 20 61 70 70 72 6f 70 72 69 61   is an appropria
ea60: 74 65 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20  te locking mode 
ea70: 66 6f 72 20 75 73 65 20 69 66 20 6e 6f 0a 2a 2a  for use if no.**
ea80: 20 6f 74 68 65 72 20 6c 6f 63 6b 69 6e 67 20 73   other locking s
ea90: 74 72 61 74 65 67 79 20 69 73 20 61 76 61 69 6c  trategy is avail
eaa0: 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 44 6f 74 66  able..**.** Dotf
eab0: 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 77 6f 72 6b  ile locking work
eac0: 73 20 62 79 20 63 72 65 61 74 69 6e 67 20 61 20  s by creating a 
ead0: 66 69 6c 65 20 69 6e 20 74 68 65 20 73 61 6d 65  file in the same
eae0: 20 64 69 72 65 63 74 6f 72 79 20 61 73 20 74 68   directory as th
eaf0: 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 61 6e  e.** database an
eb00: 64 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  d with the same 
eb10: 6e 61 6d 65 20 62 75 74 20 77 69 74 68 20 61 20  name but with a 
eb20: 22 2e 6c 6f 63 6b 22 20 65 78 74 65 6e 73 69 6f  ".lock" extensio
eb30: 6e 20 61 64 64 65 64 2e 0a 2a 2a 20 54 68 65 20  n added..** The 
eb40: 65 78 69 73 74 61 6e 63 65 20 6f 66 20 61 20 6c  existance of a l
eb50: 6f 63 6b 20 66 69 6c 65 20 69 6d 70 6c 69 65 73  ock file implies
eb60: 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
eb70: 63 6b 2e 20 20 41 6c 6c 20 6f 74 68 65 72 20 6c  ck.  All other l
eb80: 6f 63 6b 0a 2a 2a 20 74 79 70 65 73 20 28 53 48  ock.** types (SH
eb90: 41 52 45 44 2c 20 52 45 53 45 52 56 45 44 2c 20  ARED, RESERVED, 
eba0: 50 45 4e 44 49 4e 47 29 20 61 72 65 20 6d 61 70  PENDING) are map
ebb0: 70 65 64 20 69 6e 74 6f 20 45 58 43 4c 55 53 49  ped into EXCLUSI
ebc0: 56 45 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68  VE..*/../*.** Th
ebd0: 65 20 66 69 6c 65 20 73 75 66 66 69 78 20 61 64  e file suffix ad
ebe0: 64 65 64 20 74 6f 20 74 68 65 20 64 61 74 61 20  ded to the data 
ebf0: 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 20 69 6e  base filename in
ec00: 20 6f 72 64 65 72 20 74 6f 20 63 72 65 61 74 65   order to create
ec10: 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 20 66 69 6c   the.** lock fil
ec20: 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 44 4f  e..*/.#define DO
ec30: 54 4c 4f 43 4b 5f 53 55 46 46 49 58 20 22 2e 6c  TLOCK_SUFFIX ".l
ec40: 6f 63 6b 22 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ock"../*.** This
ec50: 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20   routine checks 
ec60: 69 66 20 74 68 65 72 65 20 69 73 20 61 20 52 45  if there is a RE
ec70: 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64  SERVED lock held
ec80: 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65   on the specifie
ec90: 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69  d.** file by thi
eca0: 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70  s or any other p
ecb0: 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68 20  rocess. If such 
ecc0: 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20  a lock is held, 
ecd0: 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20  set *pResOut.** 
ece0: 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61  to a non-zero va
ecf0: 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70  lue otherwise *p
ed00: 52 65 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f  ResOut is set to
ed10: 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75   zero.  The retu
ed20: 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73  rn value.** is s
ed30: 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20  et to SQLITE_OK 
ed40: 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72  unless an I/O er
ed50: 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ror occurs durin
ed60: 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e  g lock checking.
ed70: 0a 2a 2a 0a 2a 2a 20 49 6e 20 64 6f 74 66 69 6c  .**.** In dotfil
ed80: 65 20 6c 6f 63 6b 69 6e 67 2c 20 65 69 74 68 65  e locking, eithe
ed90: 72 20 61 20 6c 6f 63 6b 20 65 78 69 73 74 73 20  r a lock exists 
eda0: 6f 72 20 69 74 20 64 6f 65 73 20 6e 6f 74 2e 20  or it does not. 
edb0: 20 53 6f 20 69 6e 20 74 68 69 73 0a 2a 2a 20 76   So in this.** v
edc0: 61 72 69 61 74 69 6f 6e 20 6f 66 20 43 68 65 63  ariation of Chec
edd0: 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 29 2c  kReservedLock(),
ede0: 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65 74   *pResOut is set
edf0: 20 74 6f 20 74 72 75 65 20 69 66 20 61 6e 79 20   to true if any 
ee00: 6c 6f 63 6b 0a 2a 2a 20 69 73 20 68 65 6c 64 20  lock.** is held 
ee10: 6f 6e 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20  on the file and 
ee20: 66 61 6c 73 65 20 69 66 20 74 68 65 20 66 69 6c  false if the fil
ee30: 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 2e 0a 2a  e is unlocked..*
ee40: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f 74  /.static int dot
ee50: 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65  lockCheckReserve
ee60: 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  dLock(sqlite3_fi
ee70: 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65  le *id, int *pRe
ee80: 73 4f 75 74 29 20 7b 0a 20 20 69 6e 74 20 72 63  sOut) {.  int rc
ee90: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
eea0: 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d 20 30  int reserved = 0
eeb0: 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  ;.  unixFile *pF
eec0: 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
eed0: 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65  )id;..  Simulate
eee0: 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  IOError( return 
eef0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45  SQLITE_IOERR_CHE
ef00: 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20  CKRESERVEDLOCK; 
ef10: 29 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20  );.  .  assert( 
ef20: 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 43  pFile );..  /* C
ef30: 68 65 63 6b 20 69 66 20 61 20 74 68 72 65 61 64  heck if a thread
ef40: 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73   in this process
ef50: 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c 6f   holds such a lo
ef60: 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  ck */.  if( pFil
ef70: 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 53 48 41 52  e->locktype>SHAR
ef80: 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 2f  ED_LOCK ){.    /
ef90: 2a 20 45 69 74 68 65 72 20 74 68 69 73 20 63 6f  * Either this co
efa0: 6e 6e 65 63 74 69 6f 6e 20 6f 72 20 73 6f 6d 65  nnection or some
efb0: 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f   other connectio
efc0: 6e 20 69 6e 20 74 68 65 20 73 61 6d 65 20 70 72  n in the same pr
efd0: 6f 63 65 73 73 0a 20 20 20 20 2a 2a 20 68 6f 6c  ocess.    ** hol
efe0: 64 73 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  ds a lock on the
eff0: 20 66 69 6c 65 2e 20 20 4e 6f 20 6e 65 65 64 20   file.  No need 
f000: 74 6f 20 63 68 65 63 6b 20 66 75 72 74 68 65 72  to check further
f010: 2e 20 2a 2f 0a 20 20 20 20 72 65 73 65 72 76 65  . */.    reserve
f020: 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  d = 1;.  }else{.
f030: 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 63 6b 20      /* The lock 
f040: 69 73 20 68 65 6c 64 20 69 66 20 61 6e 64 20 6f  is held if and o
f050: 6e 6c 79 20 69 66 20 74 68 65 20 6c 6f 63 6b 66  nly if the lockf
f060: 69 6c 65 20 65 78 69 73 74 73 20 2a 2f 0a 20 20  ile exists */.  
f070: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c    const char *zL
f080: 6f 63 6b 46 69 6c 65 20 3d 20 28 63 6f 6e 73 74  ockFile = (const
f090: 20 63 68 61 72 2a 29 70 46 69 6c 65 2d 3e 6c 6f   char*)pFile->lo
f0a0: 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20  ckingContext;.  
f0b0: 20 20 72 65 73 65 72 76 65 64 20 3d 20 61 63 63    reserved = acc
f0c0: 65 73 73 28 7a 4c 6f 63 6b 46 69 6c 65 2c 20 30  ess(zLockFile, 0
f0d0: 29 3d 3d 30 3b 0a 20 20 7d 0a 20 20 4f 53 54 52  )==0;.  }.  OSTR
f0e0: 41 43 45 34 28 22 54 45 53 54 20 57 52 2d 4c 4f  ACE4("TEST WR-LO
f0f0: 43 4b 20 25 64 20 25 64 20 25 64 20 28 64 6f 74  CK %d %d %d (dot
f100: 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  lock)\n", pFile-
f110: 3e 68 2c 20 72 63 2c 20 72 65 73 65 72 76 65 64  >h, rc, reserved
f120: 29 3b 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20  );.  *pResOut = 
f130: 72 65 73 65 72 76 65 64 3b 0a 20 20 72 65 74 75  reserved;.  retu
f140: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
f150: 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69  Lock the file wi
f160: 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63  th the lock spec
f170: 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74  ified by paramet
f180: 65 72 20 6c 6f 63 6b 74 79 70 65 20 2d 20 6f 6e  er locktype - on
f190: 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c  e.** of the foll
f1a0: 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  owing:.**.**    
f1b0: 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b   (1) SHARED_LOCK
f1c0: 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53 45  .**     (2) RESE
f1d0: 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  RVED_LOCK.**    
f1e0: 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43   (3) PENDING_LOC
f1f0: 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43  K.**     (4) EXC
f200: 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a  LUSIVE_LOCK.**.*
f210: 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e  * Sometimes when
f220: 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20   requesting one 
f230: 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69  lock state, addi
f240: 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74  tional lock stat
f250: 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74  es.** are insert
f260: 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20  ed in between.  
f270: 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68  The locking migh
f280: 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66  t fail on one of
f290: 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72   the later.** tr
f2a0: 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e  ansitions leavin
f2b0: 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65  g the lock state
f2c0: 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20   different from 
f2d0: 77 68 61 74 20 69 74 20 73 74 61 72 74 65 64 20  what it started 
f2e0: 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f  but.** still sho
f2f0: 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20  rt of its goal. 
f300: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   The following c
f310: 68 61 72 74 20 73 68 6f 77 73 20 74 68 65 20 61  hart shows the a
f320: 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69  llowed.** transi
f330: 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e  tions and the in
f340: 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69  serted intermedi
f350: 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a  ate states:.**.*
f360: 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e  *    UNLOCKED ->
f370: 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48   SHARED.**    SH
f380: 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44  ARED -> RESERVED
f390: 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e  .**    SHARED ->
f3a0: 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58   (PENDING) -> EX
f3b0: 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45  CLUSIVE.**    RE
f3c0: 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49  SERVED -> (PENDI
f3d0: 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  NG) -> EXCLUSIVE
f3e0: 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d  .**    PENDING -
f3f0: 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a  > EXCLUSIVE.**.*
f400: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
f410: 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73  ill only increas
f420: 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74  e a lock.  Use t
f430: 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f  he sqlite3OsUnlo
f440: 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  ck().** routine 
f450: 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69  to lower a locki
f460: 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2a 0a 2a 2a 20  ng level..**.** 
f470: 57 69 74 68 20 64 6f 74 66 69 6c 65 20 6c 6f 63  With dotfile loc
f480: 6b 69 6e 67 2c 20 77 65 20 72 65 61 6c 6c 79 20  king, we really 
f490: 6f 6e 6c 79 20 73 75 70 70 6f 72 74 20 73 74 61  only support sta
f4a0: 74 65 20 28 34 29 3a 20 45 58 43 4c 55 53 49 56  te (4): EXCLUSIV
f4b0: 45 2e 0a 2a 2a 20 42 75 74 20 77 65 20 74 72 61  E..** But we tra
f4c0: 63 6b 20 74 68 65 20 6f 74 68 65 72 20 6c 6f 63  ck the other loc
f4d0: 6b 69 6e 67 20 6c 65 76 65 6c 73 20 69 6e 74 65  king levels inte
f4e0: 72 6e 61 6c 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69  rnally..*/.stati
f4f0: 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 4c 6f 63  c int dotlockLoc
f500: 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
f510: 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65  id, int locktype
f520: 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  ) {.  unixFile *
f530: 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
f540: 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20 66 64 3b  e*)id;.  int fd;
f550: 0a 20 20 63 68 61 72 20 2a 7a 4c 6f 63 6b 46 69  .  char *zLockFi
f560: 6c 65 20 3d 20 28 63 68 61 72 20 2a 29 70 46 69  le = (char *)pFi
f570: 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
f580: 78 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  xt;.  int rc = S
f590: 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 0a 20 20 2f 2a  QLITE_OK;...  /*
f5a0: 20 49 66 20 77 65 20 68 61 76 65 20 61 6e 79 20   If we have any 
f5b0: 6c 6f 63 6b 2c 20 74 68 65 6e 20 74 68 65 20 6c  lock, then the l
f5c0: 6f 63 6b 20 66 69 6c 65 20 61 6c 72 65 61 64 79  ock file already
f5d0: 20 65 78 69 73 74 73 2e 20 20 41 6c 6c 20 77 65   exists.  All we
f5e0: 20 68 61 76 65 0a 20 20 2a 2a 20 74 6f 20 64 6f   have.  ** to do
f5f0: 20 69 73 20 61 64 6a 75 73 74 20 6f 75 72 20 69   is adjust our i
f600: 6e 74 65 72 6e 61 6c 20 72 65 63 6f 72 64 20 6f  nternal record o
f610: 66 20 74 68 65 20 6c 6f 63 6b 20 6c 65 76 65 6c  f the lock level
f620: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ..  */.  if( pFi
f630: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3e 20 4e  le->locktype > N
f640: 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46  O_LOCK ){.    pF
f650: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20  ile->locktype = 
f660: 6c 6f 63 6b 74 79 70 65 3b 0a 23 69 66 20 21 4f  locktype;.#if !O
f670: 53 5f 56 58 57 4f 52 4b 53 0a 20 20 20 20 2f 2a  S_VXWORKS.    /*
f680: 20 41 6c 77 61 79 73 20 75 70 64 61 74 65 20 74   Always update t
f690: 68 65 20 74 69 6d 65 73 74 61 6d 70 20 6f 6e 20  he timestamp on 
f6a0: 74 68 65 20 6f 6c 64 20 66 69 6c 65 20 2a 2f 0a  the old file */.
f6b0: 20 20 20 20 75 74 69 6d 65 73 28 7a 4c 6f 63 6b      utimes(zLock
f6c0: 46 69 6c 65 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6e  File, NULL);.#en
f6d0: 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20 53  dif.    return S
f6e0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
f6f0: 0a 20 20 2f 2a 20 67 72 61 62 20 61 6e 20 65 78  .  /* grab an ex
f700: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a  clusive lock */.
f710: 20 20 66 64 20 3d 20 6f 70 65 6e 28 7a 4c 6f 63    fd = open(zLoc
f720: 6b 46 69 6c 65 2c 4f 5f 52 44 4f 4e 4c 59 7c 4f  kFile,O_RDONLY|O
f730: 5f 43 52 45 41 54 7c 4f 5f 45 58 43 4c 2c 30 36  _CREAT|O_EXCL,06
f740: 30 30 29 3b 0a 20 20 69 66 28 20 66 64 3c 30 20  00);.  if( fd<0 
f750: 29 7b 0a 20 20 20 20 2f 2a 20 66 61 69 6c 65 64  ){.    /* failed
f760: 20 74 6f 20 6f 70 65 6e 2f 63 72 65 61 74 65 20   to open/create 
f770: 74 68 65 20 66 69 6c 65 2c 20 73 6f 6d 65 6f 6e  the file, someon
f780: 65 20 65 6c 73 65 20 6d 61 79 20 68 61 76 65 20  e else may have 
f790: 73 74 6f 6c 65 6e 20 74 68 65 20 6c 6f 63 6b 20  stolen the lock 
f7a0: 2a 2f 0a 20 20 20 20 69 6e 74 20 74 45 72 72 6e  */.    int tErrn
f7b0: 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 69  o = errno;.    i
f7c0: 66 28 20 45 45 58 49 53 54 20 3d 3d 20 74 45 72  f( EEXIST == tEr
f7d0: 72 6e 6f 20 29 7b 0a 20 20 20 20 20 20 72 63 20  rno ){.      rc 
f7e0: 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
f7f0: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
f800: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72    rc = sqliteErr
f810: 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72  orFromPosixError
f820: 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f  (tErrno, SQLITE_
f830: 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20  IOERR_LOCK);.   
f840: 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
f850: 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20  RROR(rc) ){.    
f860: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
f870: 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20  rrno = tErrno;. 
f880: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
f890: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 20   return rc;.  } 
f8a0: 0a 20 20 69 66 28 20 63 6c 6f 73 65 28 66 64 29  .  if( close(fd)
f8b0: 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c   ){.    pFile->l
f8c0: 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  astErrno = errno
f8d0: 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
f8e0: 45 5f 49 4f 45 52 52 5f 43 4c 4f 53 45 3b 0a 20  E_IOERR_CLOSE;. 
f8f0: 20 7d 0a 20 20 0a 20 20 2f 2a 20 67 6f 74 20 69   }.  .  /* got i
f900: 74 2c 20 73 65 74 20 74 68 65 20 74 79 70 65 20  t, set the type 
f910: 61 6e 64 20 72 65 74 75 72 6e 20 6f 6b 20 2a 2f  and return ok */
f920: 0a 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  .  pFile->lockty
f930: 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20  pe = locktype;. 
f940: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
f950: 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c  *.** Lower the l
f960: 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20  ocking level on 
f970: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
f980: 70 46 69 6c 65 20 74 6f 20 6c 6f 63 6b 74 79 70  pFile to locktyp
f990: 65 2e 20 20 6c 6f 63 6b 74 79 70 65 0a 2a 2a 20  e.  locktype.** 
f9a0: 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e  must be either N
f9b0: 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44  O_LOCK or SHARED
f9c0: 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  _LOCK..**.** If 
f9d0: 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
f9e0: 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65  l of the file de
f9f0: 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65  scriptor is alre
fa00: 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a  ady at or below.
fa10: 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ** the requested
fa20: 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20   locking level, 
fa30: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
fa40: 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 57  a no-op..**.** W
fa50: 68 65 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  hen the locking 
fa60: 6c 65 76 65 6c 20 72 65 61 63 68 65 73 20 4e 4f  level reaches NO
fa70: 5f 4c 4f 43 4b 2c 20 64 65 6c 65 74 65 20 74 68  _LOCK, delete th
fa80: 65 20 6c 6f 63 6b 20 66 69 6c 65 2e 0a 2a 2f 0a  e lock file..*/.
fa90: 73 74 61 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f  static int dotlo
faa0: 63 6b 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33  ckUnlock(sqlite3
fab0: 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c  _file *id, int l
fac0: 6f 63 6b 74 79 70 65 29 20 7b 0a 20 20 75 6e 69  ocktype) {.  uni
fad0: 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
fae0: 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
faf0: 63 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20  char *zLockFile 
fb00: 3d 20 28 63 68 61 72 20 2a 29 70 46 69 6c 65 2d  = (char *)pFile-
fb10: 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  >lockingContext;
fb20: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  ..  assert( pFil
fb30: 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 35 28  e );.  OSTRACE5(
fb40: 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77  "UNLOCK  %d %d w
fb50: 61 73 20 25 64 20 70 69 64 3d 25 64 20 28 64 6f  as %d pid=%d (do
fb60: 74 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65  tlock)\n", pFile
fb70: 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70 65 2c 0a 09  ->h, locktype,..
fb80: 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79     pFile->lockty
fb90: 70 65 2c 20 67 65 74 70 69 64 28 29 29 3b 0a 20  pe, getpid());. 
fba0: 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70   assert( locktyp
fbb0: 65 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  e<=SHARED_LOCK )
fbc0: 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20  ;.  .  /* no-op 
fbd0: 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 20  if possible */. 
fbe0: 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b   if( pFile->lock
fbf0: 74 79 70 65 3d 3d 6c 6f 63 6b 74 79 70 65 20 29  type==locktype )
fc00: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
fc10: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f  ITE_OK;.  }..  /
fc20: 2a 20 54 6f 20 64 6f 77 6e 67 72 61 64 65 20 74  * To downgrade t
fc30: 6f 20 73 68 61 72 65 64 2c 20 73 69 6d 70 6c 79  o shared, simply
fc40: 20 75 70 64 61 74 65 20 6f 75 72 20 69 6e 74 65   update our inte
fc50: 72 6e 61 6c 20 6e 6f 74 69 6f 6e 20 6f 66 20 74  rnal notion of t
fc60: 68 65 0a 20 20 2a 2a 20 6c 6f 63 6b 20 73 74 61  he.  ** lock sta
fc70: 74 65 2e 20 20 4e 6f 20 6e 65 65 64 20 74 6f 20  te.  No need to 
fc80: 6d 65 73 73 20 77 69 74 68 20 74 68 65 20 66 69  mess with the fi
fc90: 6c 65 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f  le on disk..  */
fca0: 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d  .  if( locktype=
fcb0: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  =SHARED_LOCK ){.
fcc0: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74      pFile->lockt
fcd0: 79 70 65 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43  ype = SHARED_LOC
fce0: 4b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  K;.    return SQ
fcf0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a  LITE_OK;.  }.  .
fd00: 20 20 2f 2a 20 54 6f 20 66 75 6c 6c 79 20 75 6e    /* To fully un
fd10: 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73  lock the databas
fd20: 65 2c 20 64 65 6c 65 74 65 20 74 68 65 20 6c 6f  e, delete the lo
fd30: 63 6b 20 66 69 6c 65 20 2a 2f 0a 20 20 61 73 73  ck file */.  ass
fd40: 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 4e  ert( locktype==N
fd50: 4f 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20  O_LOCK );.  if( 
fd60: 75 6e 6c 69 6e 6b 28 7a 4c 6f 63 6b 46 69 6c 65  unlink(zLockFile
fd70: 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 20  ) ){.    int rc 
fd80: 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 74 45 72  = 0;.    int tEr
fd90: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
fda0: 20 69 66 28 20 45 4e 4f 45 4e 54 20 21 3d 20 74   if( ENOENT != t
fdb0: 45 72 72 6e 6f 20 29 7b 0a 20 20 20 20 20 20 72  Errno ){.      r
fdc0: 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  c = sqliteErrorF
fdd0: 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
fde0: 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45  rrno, SQLITE_IOE
fdf0: 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20  RR_UNLOCK);.    
fe00: 7d 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43  }.    if( IS_LOC
fe10: 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20  K_ERROR(rc) ){. 
fe20: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
fe30: 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a  Errno = tErrno;.
fe40: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
fe50: 20 72 63 3b 20 0a 20 20 7d 0a 20 20 70 46 69 6c   rc; .  }.  pFil
fe60: 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 4e 4f  e->locktype = NO
fe70: 5f 4c 4f 43 4b 3b 0a 20 20 72 65 74 75 72 6e 20  _LOCK;.  return 
fe80: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
fe90: 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65  .** Close a file
fea0: 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  .  Make sure the
feb0: 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 72   lock has been r
fec0: 65 6c 65 61 73 65 64 20 62 65 66 6f 72 65 20 63  eleased before c
fed0: 6c 6f 73 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  losing..*/.stati
fee0: 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 43 6c 6f  c int dotlockClo
fef0: 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  se(sqlite3_file 
ff00: 2a 69 64 29 20 7b 0a 20 20 69 6e 74 20 72 63 3b  *id) {.  int rc;
ff10: 0a 20 20 69 66 28 20 69 64 20 29 7b 0a 20 20 20  .  if( id ){.   
ff20: 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
ff30: 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
ff40: 3b 0a 20 20 20 20 64 6f 74 6c 6f 63 6b 55 6e 6c  ;.    dotlockUnl
ff50: 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29  ock(id, NO_LOCK)
ff60: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
ff70: 65 65 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e  ee(pFile->lockin
ff80: 67 43 6f 6e 74 65 78 74 29 3b 0a 20 20 7d 0a 20  gContext);.  }. 
ff90: 20 72 63 20 3d 20 63 6c 6f 73 65 55 6e 69 78 46   rc = closeUnixF
ffa0: 69 6c 65 28 69 64 29 3b 0a 20 20 72 65 74 75 72  ile(id);.  retur
ffb0: 6e 20 72 63 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a  n rc;.}./*******
ffc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20  *********** End 
ffd0: 6f 66 20 74 68 65 20 64 6f 74 2d 66 69 6c 65 20  of the dot-file 
ffe0: 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74  lock implementat
fff0: 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ion ************
10000 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
10010 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10020 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10030 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10040 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10050 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a  ******/../******
10060 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10070 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10080 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10090 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
100a0 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
100b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
100c0 2a 2a 2a 20 42 65 67 69 6e 20 66 6c 6f 63 6b 20  *** Begin flock 
100d0 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a  Locking ********
100e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
100f0 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 55  ********.**.** U
10100 73 65 20 74 68 65 20 66 6c 6f 63 6b 28 29 20 73  se the flock() s
10110 79 73 74 65 6d 20 63 61 6c 6c 20 74 6f 20 64 6f  ystem call to do
10120 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2e 0a 2a   file locking..*
10130 2a 0a 2a 2a 20 66 6c 6f 63 6b 28 29 20 6c 6f 63  *.** flock() loc
10140 6b 69 6e 67 20 69 73 20 6c 69 6b 65 20 64 6f 74  king is like dot
10150 2d 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 6e  -file locking in
10160 20 74 68 61 74 20 74 68 65 20 76 61 72 69 6f 75   that the variou
10170 73 0a 2a 2a 20 66 69 6e 65 2d 67 72 61 69 6e 20  s.** fine-grain 
10180 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 73 20 73  locking levels s
10190 75 70 70 6f 72 74 65 64 20 62 79 20 53 51 4c 69  upported by SQLi
101a0 74 65 20 61 72 65 20 63 6f 6c 6c 61 70 73 65 64  te are collapsed
101b0 20 69 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c   into.** a singl
101c0 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  e exclusive lock
101d0 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
101e0 73 2c 20 53 48 41 52 45 44 2c 20 52 45 53 45 52  s, SHARED, RESER
101f0 56 45 44 2c 20 61 6e 64 0a 2a 2a 20 50 45 4e 44  VED, and.** PEND
10200 49 4e 47 20 6c 6f 63 6b 73 20 61 72 65 20 74 68  ING locks are th
10210 65 20 73 61 6d 65 20 74 68 69 6e 67 20 61 73 20  e same thing as 
10220 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
10230 6b 2e 20 20 53 51 4c 69 74 65 0a 2a 2a 20 73 74  k.  SQLite.** st
10240 69 6c 6c 20 77 6f 72 6b 73 20 77 68 65 6e 20 79  ill works when y
10250 6f 75 20 64 6f 20 74 68 69 73 2c 20 62 75 74 20  ou do this, but 
10260 63 6f 6e 63 75 72 72 65 6e 63 79 20 69 73 20 72  concurrency is r
10270 65 64 75 63 65 64 20 73 69 6e 63 65 0a 2a 2a 20  educed since.** 
10280 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 70 72  only a single pr
10290 6f 63 65 73 73 20 63 61 6e 20 62 65 20 72 65 61  ocess can be rea
102a0 64 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ding the databas
102b0 65 20 61 74 20 61 20 74 69 6d 65 2e 0a 2a 2a 0a  e at a time..**.
102c0 2a 2a 20 4f 6d 69 74 20 74 68 69 73 20 73 65 63  ** Omit this sec
102d0 74 69 6f 6e 20 69 66 20 53 51 4c 49 54 45 5f 45  tion if SQLITE_E
102e0 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
102f0 59 4c 45 20 69 73 20 74 75 72 6e 65 64 20 6f 66  YLE is turned of
10300 66 20 6f 72 20 69 66 0a 2a 2a 20 63 6f 6d 70 69  f or if.** compi
10310 6c 69 6e 67 20 66 6f 72 20 56 58 57 4f 52 4b 53  ling for VXWORKS
10320 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  ..*/.#if SQLITE_
10330 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
10340 54 59 4c 45 20 26 26 20 21 4f 53 5f 56 58 57 4f  TYLE && !OS_VXWO
10350 52 4b 53 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  RKS../*.** This 
10360 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69  routine checks i
10370 66 20 74 68 65 72 65 20 69 73 20 61 20 52 45 53  f there is a RES
10380 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20  ERVED lock held 
10390 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64  on the specified
103a0 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73  .** file by this
103b0 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72   or any other pr
103c0 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68 20 61  ocess. If such a
103d0 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 73   lock is held, s
103e0 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74  et *pResOut.** t
103f0 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c  o a non-zero val
10400 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70 52  ue otherwise *pR
10410 65 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20  esOut is set to 
10420 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75 72  zero.  The retur
10430 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65  n value.** is se
10440 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75  t to SQLITE_OK u
10450 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72 72  nless an I/O err
10460 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  or occurs during
10470 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a   lock checking..
10480 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c  */.static int fl
10490 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64  ockCheckReserved
104a0 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
104b0 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73  e *id, int *pRes
104c0 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  Out){.  int rc =
104d0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
104e0 74 20 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a  t reserved = 0;.
104f0 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
10500 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
10510 64 3b 0a 20 20 0a 20 20 53 69 6d 75 6c 61 74 65  d;.  .  Simulate
10520 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  IOError( return 
10530 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45  SQLITE_IOERR_CHE
10540 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20  CKRESERVEDLOCK; 
10550 29 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20  );.  .  assert( 
10560 70 46 69 6c 65 20 29 3b 0a 20 20 0a 20 20 2f 2a  pFile );.  .  /*
10570 20 43 68 65 63 6b 20 69 66 20 61 20 74 68 72 65   Check if a thre
10580 61 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65  ad in this proce
10590 73 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20  ss holds such a 
105a0 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46  lock */.  if( pF
105b0 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 53 48  ile->locktype>SH
105c0 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
105d0 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20   reserved = 1;. 
105e0 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74 68 65 72   }.  .  /* Other
105f0 77 69 73 65 20 73 65 65 20 69 66 20 73 6f 6d 65  wise see if some
10600 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 68   other process h
10610 6f 6c 64 73 20 69 74 2e 20 2a 2f 0a 20 20 69 66  olds it. */.  if
10620 28 20 21 72 65 73 65 72 76 65 64 20 29 7b 0a 20  ( !reserved ){. 
10630 20 20 20 2f 2a 20 61 74 74 65 6d 70 74 20 74 6f     /* attempt to
10640 20 67 65 74 20 74 68 65 20 6c 6f 63 6b 20 2a 2f   get the lock */
10650 0a 20 20 20 20 69 6e 74 20 6c 72 63 20 3d 20 66  .    int lrc = f
10660 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c  lock(pFile->h, L
10670 4f 43 4b 5f 45 58 20 7c 20 4c 4f 43 4b 5f 4e 42  OCK_EX | LOCK_NB
10680 29 3b 0a 20 20 20 20 69 66 28 20 21 6c 72 63 20  );.    if( !lrc 
10690 29 7b 0a 20 20 20 20 20 20 2f 2a 20 67 6f 74 20  ){.      /* got 
106a0 74 68 65 20 6c 6f 63 6b 2c 20 75 6e 6c 6f 63 6b  the lock, unlock
106b0 20 69 74 20 2a 2f 0a 20 20 20 20 20 20 6c 72 63   it */.      lrc
106c0 20 3d 20 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e   = flock(pFile->
106d0 68 2c 20 4c 4f 43 4b 5f 55 4e 29 3b 0a 20 20 20  h, LOCK_UN);.   
106e0 20 20 20 69 66 20 28 20 6c 72 63 20 29 20 7b 0a     if ( lrc ) {.
106f0 20 20 20 20 20 20 20 20 69 6e 74 20 74 45 72 72          int tErr
10700 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
10710 20 20 20 20 2f 2a 20 75 6e 6c 6f 63 6b 20 66 61      /* unlock fa
10720 69 6c 65 64 20 77 69 74 68 20 61 6e 20 65 72 72  iled with an err
10730 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 6c 72  or */.        lr
10740 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  c = sqliteErrorF
10750 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
10760 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45  rrno, SQLITE_IOE
10770 52 52 5f 55 4e 4c 4f 43 4b 29 3b 20 0a 20 20 20  RR_UNLOCK); .   
10780 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b       if( IS_LOCK
10790 5f 45 52 52 4f 52 28 6c 72 63 29 20 29 7b 0a 20  _ERROR(lrc) ){. 
107a0 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e           pFile->
107b0 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72  lastErrno = tErr
107c0 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  no;.          rc
107d0 20 3d 20 6c 72 63 3b 0a 20 20 20 20 20 20 20 20   = lrc;.        
107e0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20  }.      }.    } 
107f0 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 69 6e 74  else {.      int
10800 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
10810 0a 20 20 20 20 20 20 72 65 73 65 72 76 65 64 20  .      reserved 
10820 3d 20 31 3b 0a 20 20 20 20 20 20 2f 2a 20 73 6f  = 1;.      /* so
10830 6d 65 6f 6e 65 20 65 6c 73 65 20 6d 69 67 68 74  meone else might
10840 20 68 61 76 65 20 69 74 20 72 65 73 65 72 76 65   have it reserve
10850 64 20 2a 2f 0a 20 20 20 20 20 20 6c 72 63 20 3d  d */.      lrc =
10860 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d   sqliteErrorFrom
10870 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e  PosixError(tErrn
10880 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  o, SQLITE_IOERR_
10890 4c 4f 43 4b 29 3b 20 0a 20 20 20 20 20 20 69 66  LOCK); .      if
108a0 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  ( IS_LOCK_ERROR(
108b0 6c 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20  lrc) ){.        
108c0 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
108d0 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20   = tErrno;.     
108e0 20 20 20 72 63 20 3d 20 6c 72 63 3b 0a 20 20 20     rc = lrc;.   
108f0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
10900 20 4f 53 54 52 41 43 45 34 28 22 54 45 53 54 20   OSTRACE4("TEST 
10910 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64  WR-LOCK %d %d %d
10920 20 28 66 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69   (flock)\n", pFi
10930 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72  le->h, rc, reser
10940 76 65 64 29 3b 0a 0a 23 69 66 64 65 66 20 53 51  ved);..#ifdef SQ
10950 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43  LITE_IGNORE_FLOC
10960 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20 20  K_LOCK_ERRORS.  
10970 69 66 28 20 28 72 63 20 26 20 53 51 4c 49 54 45  if( (rc & SQLITE
10980 5f 49 4f 45 52 52 29 20 3d 3d 20 53 51 4c 49 54  _IOERR) == SQLIT
10990 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20 20 72  E_IOERR ){.    r
109a0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
109b0 20 20 20 72 65 73 65 72 76 65 64 3d 31 3b 0a 20     reserved=1;. 
109c0 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
109d0 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b  ITE_IGNORE_FLOCK
109e0 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a  _LOCK_ERRORS */.
109f0 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73    *pResOut = res
10a00 65 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20  erved;.  return 
10a10 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63  rc;.}../*.** Loc
10a20 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74 68 20  k the file with 
10a30 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69  the lock specifi
10a40 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20  ed by parameter 
10a50 6c 6f 63 6b 74 79 70 65 20 2d 20 6f 6e 65 0a 2a  locktype - one.*
10a60 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  * of the followi
10a70 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31  ng:.**.**     (1
10a80 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a  ) SHARED_LOCK.**
10a90 20 20 20 20 20 28 32 29 20 52 45 53 45 52 56 45       (2) RESERVE
10aa0 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33  D_LOCK.**     (3
10ab0 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a  ) PENDING_LOCK.*
10ac0 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c 55 53  *     (4) EXCLUS
10ad0 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53  IVE_LOCK.**.** S
10ae0 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65  ometimes when re
10af0 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63  questing one loc
10b00 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f  k state, additio
10b10 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a  nal lock states.
10b20 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64 20  ** are inserted 
10b30 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65  in between.  The
10b40 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66   locking might f
10b50 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68  ail on one of th
10b60 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73  e later.** trans
10b70 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74  itions leaving t
10b80 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69  he lock state di
10b90 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61  fferent from wha
10ba0 74 20 69 74 20 73 74 61 72 74 65 64 20 62 75 74  t it started but
10bb0 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20  .** still short 
10bc0 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68  of its goal.  Th
10bd0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72  e following char
10be0 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f  t shows the allo
10bf0 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  wed.** transitio
10c00 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72  ns and the inser
10c10 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65  ted intermediate
10c20 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20   states:.**.**  
10c30 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48    UNLOCKED -> SH
10c40 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  ARED.**    SHARE
10c50 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a  D -> RESERVED.**
10c60 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50      SHARED -> (P
10c70 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
10c80 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52  SIVE.**    RESER
10c90 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  VED -> (PENDING)
10ca0 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
10cb0 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45      PENDING -> E
10cc0 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 66  XCLUSIVE.**.** f
10cd0 6c 6f 63 6b 28 29 20 6f 6e 6c 79 20 72 65 61 6c  lock() only real
10ce0 6c 79 20 73 75 70 70 6f 72 74 20 45 58 43 4c 55  ly support EXCLU
10cf0 53 49 56 45 20 6c 6f 63 6b 73 2e 20 20 57 65 20  SIVE locks.  We 
10d00 74 72 61 63 6b 20 69 6e 74 65 72 6d 65 64 69 61  track intermedia
10d10 74 65 0a 2a 2a 20 6c 6f 63 6b 20 73 74 61 74 65  te.** lock state
10d20 73 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65 33  s in the sqlite3
10d30 5f 66 69 6c 65 20 73 74 72 75 63 74 75 72 65 2c  _file structure,
10d40 20 62 75 74 20 61 6c 6c 20 6c 6f 63 6b 73 20 53   but all locks S
10d50 48 41 52 45 44 20 6f 72 0a 2a 2a 20 61 62 6f 76  HARED or.** abov
10d60 65 20 61 72 65 20 72 65 61 6c 6c 79 20 45 58 43  e are really EXC
10d70 4c 55 53 49 56 45 20 6c 6f 63 6b 73 20 61 6e 64  LUSIVE locks and
10d80 20 65 78 63 6c 75 64 65 20 61 6c 6c 20 6f 74 68   exclude all oth
10d90 65 72 20 70 72 6f 63 65 73 73 65 73 20 66 72 6f  er processes fro
10da0 6d 0a 2a 2a 20 61 63 63 65 73 73 20 74 68 65 20  m.** access the 
10db0 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  file..**.** This
10dc0 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e   routine will on
10dd0 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f  ly increase a lo
10de0 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c  ck.  Use the sql
10df0 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a  ite3OsUnlock().*
10e00 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77  * routine to low
10e10 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  er a locking lev
10e20 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  el..*/.static in
10e30 74 20 66 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69  t flockLock(sqli
10e40 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
10e50 74 20 6c 6f 63 6b 74 79 70 65 29 20 7b 0a 20 20  t locktype) {.  
10e60 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
10e70 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  OK;.  unixFile *
10e80 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
10e90 65 2a 29 69 64 3b 0a 0a 20 20 61 73 73 65 72 74  e*)id;..  assert
10ea0 28 20 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a  ( pFile );..  /*
10eb0 20 69 66 20 77 65 20 61 6c 72 65 61 64 79 20 68   if we already h
10ec0 61 76 65 20 61 20 6c 6f 63 6b 2c 20 69 74 20 69  ave a lock, it i
10ed0 73 20 65 78 63 6c 75 73 69 76 65 2e 20 20 0a 20  s exclusive.  . 
10ee0 20 2a 2a 20 4a 75 73 74 20 61 64 6a 75 73 74 20   ** Just adjust 
10ef0 6c 65 76 65 6c 20 61 6e 64 20 70 75 6e 74 20 6f  level and punt o
10f00 6e 20 6f 75 74 74 61 20 68 65 72 65 2e 20 2a 2f  n outta here. */
10f10 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f  .  if (pFile->lo
10f20 63 6b 74 79 70 65 20 3e 20 4e 4f 5f 4c 4f 43 4b  cktype > NO_LOCK
10f30 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c  ) {.    pFile->l
10f40 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79  ocktype = lockty
10f50 70 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  pe;.    return S
10f60 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
10f70 0a 20 20 2f 2a 20 67 72 61 62 20 61 6e 20 65 78  .  /* grab an ex
10f80 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a  clusive lock */.
10f90 20 20 0a 20 20 69 66 20 28 66 6c 6f 63 6b 28 70    .  if (flock(p
10fa0 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 45 58  File->h, LOCK_EX
10fb0 20 7c 20 4c 4f 43 4b 5f 4e 42 29 29 20 7b 0a 20   | LOCK_NB)) {. 
10fc0 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20     int tErrno = 
10fd0 65 72 72 6e 6f 3b 0a 20 20 20 20 2f 2a 20 64 69  errno;.    /* di
10fe0 64 6e 27 74 20 67 65 74 2c 20 6d 75 73 74 20 62  dn't get, must b
10ff0 65 20 62 75 73 79 20 2a 2f 0a 20 20 20 20 72 63  e busy */.    rc
11000 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
11010 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
11020 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
11030 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28  R_LOCK);.    if(
11040 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72   IS_LOCK_ERROR(r
11050 63 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  c) ){.      pFil
11060 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74  e->lastErrno = t
11070 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d  Errno;.    }.  }
11080 20 65 6c 73 65 20 7b 0a 20 20 20 20 2f 2a 20 67   else {.    /* g
11090 6f 74 20 69 74 2c 20 73 65 74 20 74 68 65 20 74  ot it, set the t
110a0 79 70 65 20 61 6e 64 20 72 65 74 75 72 6e 20 6f  ype and return o
110b0 6b 20 2a 2f 0a 20 20 20 20 70 46 69 6c 65 2d 3e  k */.    pFile->
110c0 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74  locktype = lockt
110d0 79 70 65 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41  ype;.  }.  OSTRA
110e0 43 45 34 28 22 4c 4f 43 4b 20 20 20 20 25 64 20  CE4("LOCK    %d 
110f0 25 73 20 25 73 20 28 66 6c 6f 63 6b 29 5c 6e 22  %s %s (flock)\n"
11100 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b  , pFile->h, lock
11110 74 79 70 65 4e 61 6d 65 28 6c 6f 63 6b 74 79 70  typeName(locktyp
11120 65 29 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  e), .           
11130 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20  rc==SQLITE_OK ? 
11140 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29  "ok" : "failed")
11150 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
11160 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43  IGNORE_FLOCK_LOC
11170 4b 5f 45 52 52 4f 52 53 0a 20 20 69 66 28 20 28  K_ERRORS.  if( (
11180 72 63 20 26 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc & SQLITE_IOER
11190 52 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45  R) == SQLITE_IOE
111a0 52 52 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  RR ){.    rc = S
111b0 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a  QLITE_BUSY;.  }.
111c0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
111d0 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f  _IGNORE_FLOCK_LO
111e0 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20 72  CK_ERRORS */.  r
111f0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
11200 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f  .** Lower the lo
11210 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66  cking level on f
11220 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 70  ile descriptor p
11230 46 69 6c 65 20 74 6f 20 6c 6f 63 6b 74 79 70 65  File to locktype
11240 2e 20 20 6c 6f 63 6b 74 79 70 65 0a 2a 2a 20 6d  .  locktype.** m
11250 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f  ust be either NO
11260 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f  _LOCK or SHARED_
11270 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  LOCK..**.** If t
11280 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
11290 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73   of the file des
112a0 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61  criptor is alrea
112b0 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a  dy at or below.*
112c0 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  * the requested 
112d0 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74  locking level, t
112e0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
112f0 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
11300 63 20 69 6e 74 20 66 6c 6f 63 6b 55 6e 6c 6f 63  c int flockUnloc
11310 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
11320 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65  id, int locktype
11330 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  ) {.  unixFile *
11340 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
11350 65 2a 29 69 64 3b 0a 20 20 0a 20 20 61 73 73 65  e*)id;.  .  asse
11360 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f  rt( pFile );.  O
11370 53 54 52 41 43 45 35 28 22 55 4e 4c 4f 43 4b 20  STRACE5("UNLOCK 
11380 20 25 64 20 25 64 20 77 61 73 20 25 64 20 70 69   %d %d was %d pi
11390 64 3d 25 64 20 28 66 6c 6f 63 6b 29 5c 6e 22 2c  d=%d (flock)\n",
113a0 20 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74   pFile->h, lockt
113b0 79 70 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ype,.           
113c0 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c  pFile->locktype,
113d0 20 67 65 74 70 69 64 28 29 29 3b 0a 20 20 61 73   getpid());.  as
113e0 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 3c 3d  sert( locktype<=
113f0 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
11400 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20   .  /* no-op if 
11410 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 20 20 69 66  possible */.  if
11420 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  ( pFile->locktyp
11430 65 3d 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20  e==locktype ){. 
11440 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
11450 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  _OK;.  }.  .  /*
11460 20 73 68 61 72 65 64 20 63 61 6e 20 6a 75 73 74   shared can just
11470 20 62 65 20 73 65 74 20 62 65 63 61 75 73 65 20   be set because 
11480 77 65 20 61 6c 77 61 79 73 20 68 61 76 65 20 61  we always have a
11490 6e 20 65 78 63 6c 75 73 69 76 65 20 2a 2f 0a 20  n exclusive */. 
114a0 20 69 66 20 28 6c 6f 63 6b 74 79 70 65 3d 3d 53   if (locktype==S
114b0 48 41 52 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20  HARED_LOCK) {.  
114c0 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70    pFile->locktyp
114d0 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20  e = locktype;.  
114e0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
114f0 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  OK;.  }.  .  /* 
11500 6e 6f 2c 20 72 65 61 6c 6c 79 2c 20 75 6e 6c 6f  no, really, unlo
11510 63 6b 2e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ck. */.  int rc 
11520 3d 20 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68  = flock(pFile->h
11530 2c 20 4c 4f 43 4b 5f 55 4e 29 3b 0a 20 20 69 66  , LOCK_UN);.  if
11540 20 28 72 63 29 20 7b 0a 20 20 20 20 69 6e 74 20   (rc) {.    int 
11550 72 2c 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  r, tErrno = errn
11560 6f 3b 0a 20 20 20 20 72 20 3d 20 73 71 6c 69 74  o;.    r = sqlit
11570 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45  eErrorFromPosixE
11580 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c  rror(tErrno, SQL
11590 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
115a0 29 3b 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f  );.    if( IS_LO
115b0 43 4b 5f 45 52 52 4f 52 28 72 29 20 29 7b 0a 20  CK_ERROR(r) ){. 
115c0 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
115d0 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a  Errno = tErrno;.
115e0 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c      }.#ifdef SQL
115f0 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b  ITE_IGNORE_FLOCK
11600 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20 20 20  _LOCK_ERRORS.   
11610 20 69 66 28 20 28 72 20 26 20 53 51 4c 49 54 45   if( (r & SQLITE
11620 5f 49 4f 45 52 52 29 20 3d 3d 20 53 51 4c 49 54  _IOERR) == SQLIT
11630 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20 20 20  E_IOERR ){.     
11640 20 72 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59   r = SQLITE_BUSY
11650 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f  ;.    }.#endif /
11660 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f  * SQLITE_IGNORE_
11670 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52  FLOCK_LOCK_ERROR
11680 53 20 2a 2f 0a 20 20 20 20 0a 20 20 20 20 72 65  S */.    .    re
11690 74 75 72 6e 20 72 3b 0a 20 20 7d 20 65 6c 73 65  turn r;.  } else
116a0 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f   {.    pFile->lo
116b0 63 6b 74 79 70 65 20 3d 20 4e 4f 5f 4c 4f 43 4b  cktype = NO_LOCK
116c0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
116d0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ITE_OK;.  }.}../
116e0 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c  *.** Close a fil
116f0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
11700 20 66 6c 6f 63 6b 43 6c 6f 73 65 28 73 71 6c 69   flockClose(sqli
11710 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a  te3_file *id) {.
11720 20 20 69 66 28 20 69 64 20 29 7b 0a 20 20 20 20    if( id ){.    
11730 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 69 64 2c 20  flockUnlock(id, 
11740 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 7d 0a 20 20  NO_LOCK);.  }.  
11750 72 65 74 75 72 6e 20 63 6c 6f 73 65 55 6e 69 78  return closeUnix
11760 46 69 6c 65 28 69 64 29 3b 0a 7d 0a 0a 23 65 6e  File(id);.}..#en
11770 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e  dif /* SQLITE_EN
11780 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
11790 4c 45 20 26 26 20 21 4f 53 5f 56 58 57 4f 52 4b  LE && !OS_VXWORK
117a0 20 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   */../**********
117b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66  ********* End of
117c0 20 74 68 65 20 66 6c 6f 63 6b 20 6c 6f 63 6b 20   the flock lock 
117d0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a  implementation *
117e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
117f0 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
11800 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11810 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11820 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11830 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11840 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***/../*********
11850 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11860 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11870 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11880 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11890 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
118a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42  ************** B
118b0 65 67 69 6e 20 4e 61 6d 65 64 20 53 65 6d 61 70  egin Named Semap
118c0 68 6f 72 65 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a  hore Locking ***
118d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
118e0 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4e 61 6d 65  *****.**.** Name
118f0 64 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b  d semaphore lock
11900 69 6e 67 20 69 73 20 6f 6e 6c 79 20 73 75 70 70  ing is only supp
11910 6f 72 74 65 64 20 6f 6e 20 56 78 57 6f 72 6b 73  orted on VxWorks
11920 2e 0a 2a 2a 0a 2a 2a 20 53 65 6d 61 70 68 6f 72  ..**.** Semaphor
11930 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6c 69 6b  e locking is lik
11940 65 20 64 6f 74 2d 6c 6f 63 6b 20 61 6e 64 20 66  e dot-lock and f
11950 6c 6f 63 6b 20 69 6e 20 74 68 61 74 20 69 74 20  lock in that it 
11960 72 65 61 6c 6c 79 20 6f 6e 6c 79 0a 2a 2a 20 73  really only.** s
11970 75 70 70 6f 72 74 73 20 45 58 43 4c 55 53 49 56  upports EXCLUSIV
11980 45 20 6c 6f 63 6b 69 6e 67 2e 20 20 4f 6e 6c 79  E locking.  Only
11990 20 61 20 73 69 6e 67 6c 65 20 70 72 6f 63 65 73   a single proces
119a0 73 20 63 61 6e 20 72 65 61 64 20 6f 72 20 77 72  s can read or wr
119b0 69 74 65 0a 2a 2a 20 74 68 65 20 64 61 74 61 62  ite.** the datab
119c0 61 73 65 20 66 69 6c 65 20 61 74 20 61 20 74 69  ase file at a ti
119d0 6d 65 2e 20 20 54 68 69 73 20 72 65 64 75 63 65  me.  This reduce
119e0 73 20 70 6f 74 65 6e 74 69 61 6c 20 63 6f 6e 63  s potential conc
119f0 75 72 72 65 6e 63 79 2c 20 62 75 74 0a 2a 2a 20  urrency, but.** 
11a00 6d 61 6b 65 73 20 74 68 65 20 6c 6f 63 6b 20 69  makes the lock i
11a10 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6d 75  mplementation mu
11a20 63 68 20 65 61 73 69 65 72 2e 0a 2a 2f 0a 23 69  ch easier..*/.#i
11a30 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 0a 2f 2a  f OS_VXWORKS../*
11a40 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
11a50 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 72 65   checks if there
11a60 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20 6c   is a RESERVED l
11a70 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20  ock held on the 
11a80 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c  specified.** fil
11a90 65 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79  e by this or any
11aa0 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20   other process. 
11ab0 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69  If such a lock i
11ac0 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65  s held, set *pRe
11ad0 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e  sOut.** to a non
11ae0 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65  -zero value othe
11af0 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69  rwise *pResOut i
11b00 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20  s set to zero.  
11b10 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  The return value
11b20 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51  .** is set to SQ
11b30 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61  LITE_OK unless a
11b40 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75  n I/O error occu
11b50 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63  rs during lock c
11b60 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  hecking..*/.stat
11b70 69 63 20 69 6e 74 20 73 65 6d 43 68 65 63 6b 52  ic int semCheckR
11b80 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69  eservedLock(sqli
11b90 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
11ba0 74 20 2a 70 52 65 73 4f 75 74 29 20 7b 0a 20 20  t *pResOut) {.  
11bb0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
11bc0 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65 72 76  OK;.  int reserv
11bd0 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69  ed = 0;.  unixFi
11be0 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
11bf0 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53 69  xFile*)id;..  Si
11c00 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
11c10 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
11c20 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44  RR_CHECKRESERVED
11c30 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73  LOCK; );.  .  as
11c40 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 0a  sert( pFile );..
11c50 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20    /* Check if a 
11c60 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 20 70  thread in this p
11c70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63  rocess holds suc
11c80 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66  h a lock */.  if
11c90 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  ( pFile->locktyp
11ca0 65 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b  e>SHARED_LOCK ){
11cb0 0a 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20  .    reserved = 
11cc0 31 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f  1;.  }.  .  /* O
11cd0 74 68 65 72 77 69 73 65 20 73 65 65 20 69 66 20  therwise see if 
11ce0 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65  some other proce
11cf0 73 73 20 68 6f 6c 64 73 20 69 74 2e 20 2a 2f 0a  ss holds it. */.
11d00 20 20 69 66 28 20 21 72 65 73 65 72 76 65 64 20    if( !reserved 
11d10 29 7b 0a 20 20 20 20 73 65 6d 5f 74 20 2a 70 53  ){.    sem_t *pS
11d20 65 6d 20 3d 20 70 46 69 6c 65 2d 3e 70 4f 70 65  em = pFile->pOpe
11d30 6e 2d 3e 70 53 65 6d 3b 0a 20 20 20 20 73 74 72  n->pSem;.    str
11d40 75 63 74 20 73 74 61 74 20 73 74 61 74 42 75 66  uct stat statBuf
11d50 3b 0a 0a 20 20 20 20 69 66 28 20 73 65 6d 5f 74  ;..    if( sem_t
11d60 72 79 77 61 69 74 28 70 53 65 6d 29 3d 3d 2d 31  rywait(pSem)==-1
11d70 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 45   ){.      int tE
11d80 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
11d90 20 20 20 20 69 66 28 20 45 41 47 41 49 4e 20 21      if( EAGAIN !
11da0 3d 20 74 45 72 72 6e 6f 20 29 7b 0a 20 20 20 20  = tErrno ){.    
11db0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45      rc = sqliteE
11dc0 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
11dd0 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54  or(tErrno, SQLIT
11de0 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53  E_IOERR_CHECKRES
11df0 45 52 56 45 44 4c 4f 43 4b 29 3b 0a 20 20 20 20  ERVEDLOCK);.    
11e00 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
11e10 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20  rrno = tErrno;. 
11e20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20       } else {.  
11e30 20 20 20 20 20 20 2f 2a 20 73 6f 6d 65 6f 6e 65        /* someone
11e40 20 65 6c 73 65 20 68 61 73 20 74 68 65 20 6c 6f   else has the lo
11e50 63 6b 20 77 68 65 6e 20 77 65 20 61 72 65 20 69  ck when we are i
11e60 6e 20 4e 4f 5f 4c 4f 43 4b 20 2a 2f 0a 20 20 20  n NO_LOCK */.   
11e70 20 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20       reserved = 
11e80 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65  (pFile->locktype
11e90 20 3c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b   < SHARED_LOCK);
11ea0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
11eb0 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 77 65 20  se{.      /* we 
11ec0 63 6f 75 6c 64 20 68 61 76 65 20 69 74 20 69 66  could have it if
11ed0 20 77 65 20 77 61 6e 74 20 69 74 20 2a 2f 0a 20   we want it */. 
11ee0 20 20 20 20 20 73 65 6d 5f 70 6f 73 74 28 70 53       sem_post(pS
11ef0 65 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  em);.    }.  }. 
11f00 20 4f 53 54 52 41 43 45 34 28 22 54 45 53 54 20   OSTRACE4("TEST 
11f10 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64  WR-LOCK %d %d %d
11f20 20 28 73 65 6d 29 5c 6e 22 2c 20 70 46 69 6c 65   (sem)\n", pFile
11f30 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72 76 65  ->h, rc, reserve
11f40 64 29 3b 0a 0a 20 20 2a 70 52 65 73 4f 75 74 20  d);..  *pResOut 
11f50 3d 20 72 65 73 65 72 76 65 64 3b 0a 20 20 72 65  = reserved;.  re
11f60 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
11f70 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20  * Lock the file 
11f80 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70  with the lock sp
11f90 65 63 69 66 69 65 64 20 62 79 20 70 61 72 61 6d  ecified by param
11fa0 65 74 65 72 20 6c 6f 63 6b 74 79 70 65 20 2d 20  eter locktype - 
11fb0 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f  one.** of the fo
11fc0 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
11fd0 20 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f     (1) SHARED_LO
11fe0 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45  CK.**     (2) RE
11ff0 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20  SERVED_LOCK.**  
12000 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c     (3) PENDING_L
12010 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45  OCK.**     (4) E
12020 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a  XCLUSIVE_LOCK.**
12030 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68  .** Sometimes wh
12040 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e  en requesting on
12050 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64  e lock state, ad
12060 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74  ditional lock st
12070 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65  ates.** are inse
12080 72 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e  rted in between.
12090 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69    The locking mi
120a0 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20  ght fail on one 
120b0 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20  of the later.** 
120c0 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76  transitions leav
120d0 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61  ing the lock sta
120e0 74 65 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f  te different fro
120f0 6d 20 77 68 61 74 20 69 74 20 73 74 61 72 74 65  m what it starte
12100 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73  d but.** still s
12110 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c  hort of its goal
12120 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  The following
12130 20 63 68 61 72 74 20 73 68 6f 77 73 20 74 68 65   chart shows the
12140 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e   allowed.** tran
12150 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20  sitions and the 
12160 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65  inserted interme
12170 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a  diate states:.**
12180 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20  .**    UNLOCKED 
12190 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20  -> SHARED.**    
121a0 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56  SHARED -> RESERV
121b0 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20  ED.**    SHARED 
121c0 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20  -> (PENDING) -> 
121d0 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20  EXCLUSIVE.**    
121e0 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e  RESERVED -> (PEN
121f0 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49  DING) -> EXCLUSI
12200 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47  VE.**    PENDING
12210 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
12220 0a 2a 2a 20 53 65 6d 61 70 68 6f 72 65 20 6c 6f  .** Semaphore lo
12230 63 6b 73 20 6f 6e 6c 79 20 72 65 61 6c 6c 79 20  cks only really 
12240 73 75 70 70 6f 72 74 20 45 58 43 4c 55 53 49 56  support EXCLUSIV
12250 45 20 6c 6f 63 6b 73 2e 20 20 57 65 20 74 72 61  E locks.  We tra
12260 63 6b 20 69 6e 74 65 72 6d 65 64 69 61 74 65 0a  ck intermediate.
12270 2a 2a 20 6c 6f 63 6b 20 73 74 61 74 65 73 20 69  ** lock states i
12280 6e 20 74 68 65 20 73 71 6c 69 74 65 33 5f 66 69  n the sqlite3_fi
12290 6c 65 20 73 74 72 75 63 74 75 72 65 2c 20 62 75  le structure, bu
122a0 74 20 61 6c 6c 20 6c 6f 63 6b 73 20 53 48 41 52  t all locks SHAR
122b0 45 44 20 6f 72 0a 2a 2a 20 61 62 6f 76 65 20 61  ED or.** above a
122c0 72 65 20 72 65 61 6c 6c 79 20 45 58 43 4c 55 53  re really EXCLUS
122d0 49 56 45 20 6c 6f 63 6b 73 20 61 6e 64 20 65 78  IVE locks and ex
122e0 63 6c 75 64 65 20 61 6c 6c 20 6f 74 68 65 72 20  clude all other 
122f0 70 72 6f 63 65 73 73 65 73 20 66 72 6f 6d 0a 2a  processes from.*
12300 2a 20 61 63 63 65 73 73 20 74 68 65 20 66 69 6c  * access the fil
12310 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
12320 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20  utine will only 
12330 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e  increase a lock.
12340 20 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65    Use the sqlite
12350 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72  3OsUnlock().** r
12360 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20  outine to lower 
12370 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e  a locking level.
12380 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
12390 65 6d 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  emLock(sqlite3_f
123a0 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63  ile *id, int loc
123b0 6b 74 79 70 65 29 20 7b 0a 20 20 75 6e 69 78 46  ktype) {.  unixF
123c0 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
123d0 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e  ixFile*)id;.  in
123e0 74 20 66 64 3b 0a 20 20 73 65 6d 5f 74 20 2a 70  t fd;.  sem_t *p
123f0 53 65 6d 20 3d 20 70 46 69 6c 65 2d 3e 70 4f 70  Sem = pFile->pOp
12400 65 6e 2d 3e 70 53 65 6d 3b 0a 20 20 69 6e 74 20  en->pSem;.  int 
12410 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
12420 0a 20 20 2f 2a 20 69 66 20 77 65 20 61 6c 72 65  .  /* if we alre
12430 61 64 79 20 68 61 76 65 20 61 20 6c 6f 63 6b 2c  ady have a lock,
12440 20 69 74 20 69 73 20 65 78 63 6c 75 73 69 76 65   it is exclusive
12450 2e 20 20 0a 20 20 2a 2a 20 4a 75 73 74 20 61 64  .  .  ** Just ad
12460 6a 75 73 74 20 6c 65 76 65 6c 20 61 6e 64 20 70  just level and p
12470 75 6e 74 20 6f 6e 20 6f 75 74 74 61 20 68 65 72  unt on outta her
12480 65 2e 20 2a 2f 0a 20 20 69 66 20 28 70 46 69 6c  e. */.  if (pFil
12490 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3e 20 4e 4f  e->locktype > NO
124a0 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46 69  _LOCK) {.    pFi
124b0 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c  le->locktype = l
124c0 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20 72 63 20  ocktype;.    rc 
124d0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
124e0 20 67 6f 74 6f 20 73 65 6d 5f 65 6e 64 5f 6c 6f   goto sem_end_lo
124f0 63 6b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  ck;.  }.  .  /* 
12500 6c 6f 63 6b 20 73 65 6d 61 70 68 6f 72 65 20 6e  lock semaphore n
12510 6f 77 20 62 75 74 20 62 61 69 6c 20 6f 75 74 20  ow but bail out 
12520 77 68 65 6e 20 61 6c 72 65 61 64 79 20 6c 6f 63  when already loc
12530 6b 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 73 65  ked. */.  if( se
12540 6d 5f 74 72 79 77 61 69 74 28 70 53 65 6d 29 3d  m_trywait(pSem)=
12550 3d 2d 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  =-1 ){.    rc = 
12560 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
12570 20 67 6f 74 6f 20 73 65 6d 5f 65 6e 64 5f 6c 6f   goto sem_end_lo
12580 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 67 6f  ck;.  }..  /* go
12590 74 20 69 74 2c 20 73 65 74 20 74 68 65 20 74 79  t it, set the ty
125a0 70 65 20 61 6e 64 20 72 65 74 75 72 6e 20 6f 6b  pe and return ok
125b0 20 2a 2f 0a 20 20 70 46 69 6c 65 2d 3e 6c 6f 63   */.  pFile->loc
125c0 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65  ktype = locktype
125d0 3b 0a 0a 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b  ;.. sem_end_lock
125e0 3a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  :.  return rc;.}
125f0 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68  ../*.** Lower th
12600 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
12610 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  on file descript
12620 6f 72 20 70 46 69 6c 65 20 74 6f 20 6c 6f 63 6b  or pFile to lock
12630 74 79 70 65 2e 20 20 6c 6f 63 6b 74 79 70 65 0a  type.  locktype.
12640 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65  ** must be eithe
12650 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41  r NO_LOCK or SHA
12660 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20  RED_LOCK..**.** 
12670 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  If the locking l
12680 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65  evel of the file
12690 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61   descriptor is a
126a0 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c  lready at or bel
126b0 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73  ow.** the reques
126c0 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  ted locking leve
126d0 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  l, this routine 
126e0 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
126f0 74 61 74 69 63 20 69 6e 74 20 73 65 6d 55 6e 6c  tatic int semUnl
12700 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
12710 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79   *id, int lockty
12720 70 65 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65  pe) {.  unixFile
12730 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
12740 69 6c 65 2a 29 69 64 3b 0a 20 20 73 65 6d 5f 74  ile*)id;.  sem_t
12750 20 2a 70 53 65 6d 20 3d 20 70 46 69 6c 65 2d 3e   *pSem = pFile->
12760 70 4f 70 65 6e 2d 3e 70 53 65 6d 3b 0a 0a 20 20  pOpen->pSem;..  
12770 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
12780 0a 20 20 61 73 73 65 72 74 28 20 70 53 65 6d 20  .  assert( pSem 
12790 29 3b 0a 20 20 4f 53 54 52 41 43 45 35 28 22 55  );.  OSTRACE5("U
127a0 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73  NLOCK  %d %d was
127b0 20 25 64 20 70 69 64 3d 25 64 20 28 73 65 6d 29   %d pid=%d (sem)
127c0 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6c  \n", pFile->h, l
127d0 6f 63 6b 74 79 70 65 2c 0a 09 20 20 20 70 46 69  ocktype,..   pFi
127e0 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 67 65  le->locktype, ge
127f0 74 70 69 64 28 29 29 3b 0a 20 20 61 73 73 65 72  tpid());.  asser
12800 74 28 20 6c 6f 63 6b 74 79 70 65 3c 3d 53 48 41  t( locktype<=SHA
12810 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20  RED_LOCK );.  . 
12820 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20 70 6f 73   /* no-op if pos
12830 73 69 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70  sible */.  if( p
12840 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d  File->locktype==
12850 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20  locktype ){.    
12860 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
12870 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 73 68  ;.  }.  .  /* sh
12880 61 72 65 64 20 63 61 6e 20 6a 75 73 74 20 62 65  ared can just be
12890 20 73 65 74 20 62 65 63 61 75 73 65 20 77 65 20   set because we 
128a0 61 6c 77 61 79 73 20 68 61 76 65 20 61 6e 20 65  always have an e
128b0 78 63 6c 75 73 69 76 65 20 2a 2f 0a 20 20 69 66  xclusive */.  if
128c0 20 28 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52   (locktype==SHAR
128d0 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70  ED_LOCK) {.    p
128e0 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d  File->locktype =
128f0 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20 72   locktype;.    r
12900 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
12910 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2c  .  }.  .  /* no,
12920 20 72 65 61 6c 6c 79 20 75 6e 6c 6f 63 6b 2e 20   really unlock. 
12930 2a 2f 0a 20 20 69 66 20 28 20 73 65 6d 5f 70 6f  */.  if ( sem_po
12940 73 74 28 70 53 65 6d 29 3d 3d 2d 31 20 29 20 7b  st(pSem)==-1 ) {
12950 0a 20 20 20 20 69 6e 74 20 72 63 2c 20 74 45 72  .    int rc, tEr
12960 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
12970 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f   rc = sqliteErro
12980 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28  rFromPosixError(
12990 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49  tErrno, SQLITE_I
129a0 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20 20  OERR_UNLOCK);.  
129b0 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52    if( IS_LOCK_ER
129c0 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20  ROR(rc) ){.     
129d0 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
129e0 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20  o = tErrno;.    
129f0 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  }.    return rc;
12a00 20 0a 20 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 6c   .  }.  pFile->l
12a10 6f 63 6b 74 79 70 65 20 3d 20 4e 4f 5f 4c 4f 43  ocktype = NO_LOC
12a20 4b 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  K;.  return SQLI
12a30 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2a  TE_OK;.}../*. **
12a40 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 20   Close a file.. 
12a50 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
12a60 6d 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66  mClose(sqlite3_f
12a70 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69 66 28  ile *id) {.  if(
12a80 20 69 64 20 29 7b 0a 20 20 20 20 75 6e 69 78 46   id ){.    unixF
12a90 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
12aa0 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20  ixFile*)id;.    
12ab0 73 65 6d 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f  semUnlock(id, NO
12ac0 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 61 73 73 65  _LOCK);.    asse
12ad0 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 20  rt( pFile );.   
12ae0 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
12af0 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 4c 6f  );.    releaseLo
12b00 63 6b 49 6e 66 6f 28 70 46 69 6c 65 2d 3e 70 4c  ckInfo(pFile->pL
12b10 6f 63 6b 29 3b 0a 20 20 20 20 72 65 6c 65 61 73  ock);.    releas
12b20 65 4f 70 65 6e 43 6e 74 28 70 46 69 6c 65 2d 3e  eOpenCnt(pFile->
12b30 70 4f 70 65 6e 29 3b 0a 20 20 20 20 75 6e 69 78  pOpen);.    unix
12b40 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
12b50 20 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28    closeUnixFile(
12b60 69 64 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  id);.  }.  retur
12b70 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
12b80 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57  #endif /* OS_VXW
12b90 4f 52 4b 53 20 2a 2f 0a 2f 2a 0a 2a 2a 20 4e 61  ORKS */./*.** Na
12ba0 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f  med semaphore lo
12bb0 63 6b 69 6e 67 20 69 73 20 6f 6e 6c 79 20 61 76  cking is only av
12bc0 61 69 6c 61 62 6c 65 20 6f 6e 20 56 78 57 6f 72  ailable on VxWor
12bd0 6b 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ks..**.*********
12be0 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68  ****** End of th
12bf0 65 20 6e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72  e named semaphor
12c00 65 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74  e lock implement
12c10 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ation **********
12c20 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
12c30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12c40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12c50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12c60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12c70 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a  *****/.../******
12c80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12c90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12ca0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12cb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12cc0 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
12cd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12ce0 2a 2a 2a 2a 20 42 65 67 69 6e 20 41 46 50 20 4c  **** Begin AFP L
12cf0 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ocking *********
12d00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12d10 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 41  ********.**.** A
12d20 46 50 20 69 73 20 74 68 65 20 41 70 70 6c 65 20  FP is the Apple 
12d30 46 69 6c 69 6e 67 20 50 72 6f 74 6f 63 6f 6c 2e  Filing Protocol.
12d40 20 20 41 46 50 20 69 73 20 61 20 6e 65 74 77 6f    AFP is a netwo
12d50 72 6b 20 66 69 6c 65 73 79 73 74 65 6d 20 66 6f  rk filesystem fo
12d60 75 6e 64 0a 2a 2a 20 6f 6e 20 41 70 70 6c 65 20  und.** on Apple 
12d70 4d 61 63 69 6e 74 6f 73 68 20 63 6f 6d 70 75 74  Macintosh comput
12d80 65 72 73 20 2d 20 62 6f 74 68 20 4f 53 39 20 61  ers - both OS9 a
12d90 6e 64 20 4f 53 58 2e 0a 2a 2a 0a 2a 2a 20 54 68  nd OSX..**.** Th
12da0 69 72 64 2d 70 61 72 74 79 20 69 6d 70 6c 65 6d  ird-party implem
12db0 65 6e 74 61 74 69 6f 6e 73 20 6f 66 20 41 46 50  entations of AFP
12dc0 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 2e 20   are available. 
12dd0 20 42 75 74 20 74 68 69 73 20 63 6f 64 65 20 68   But this code h
12de0 65 72 65 0a 2a 2a 20 6f 6e 6c 79 20 77 6f 72 6b  ere.** only work
12df0 73 20 6f 6e 20 4f 53 58 2e 0a 2a 2f 0a 0a 23 69  s on OSX..*/..#i
12e00 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
12e10 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45  E__) && SQLITE_E
12e20 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
12e30 59 4c 45 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 66  YLE./*.** The af
12e40 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  pLockingContext 
12e50 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69  structure contai
12e60 6e 73 20 61 6c 6c 20 61 66 70 20 6c 6f 63 6b 20  ns all afp lock 
12e70 73 70 65 63 69 66 69 63 20 73 74 61 74 65 0a 2a  specific state.*
12e80 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
12e90 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65   afpLockingConte
12ea0 78 74 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e  xt afpLockingCon
12eb0 74 65 78 74 3b 0a 73 74 72 75 63 74 20 61 66 70  text;.struct afp
12ec0 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 7b  LockingContext {
12ed0 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  .  unsigned long
12ee0 20 6c 6f 6e 67 20 73 68 61 72 65 64 42 79 74 65   long sharedByte
12ef0 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
12f00 64 62 50 61 74 68 3b 20 20 20 20 20 20 20 20 20  dbPath;         
12f10 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
12f20 68 65 20 6f 70 65 6e 20 66 69 6c 65 20 2a 2f 0a  he open file */.
12f30 7d 3b 0a 0a 73 74 72 75 63 74 20 42 79 74 65 52  };..struct ByteR
12f40 61 6e 67 65 4c 6f 63 6b 50 42 32 0a 7b 0a 20 20  angeLockPB2.{.  
12f50 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f  unsigned long lo
12f60 6e 67 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20  ng offset;      
12f70 20 20 2f 2a 20 6f 66 66 73 65 74 20 74 6f 20 66    /* offset to f
12f80 69 72 73 74 20 62 79 74 65 20 74 6f 20 6c 6f 63  irst byte to loc
12f90 6b 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  k */.  unsigned 
12fa0 6c 6f 6e 67 20 6c 6f 6e 67 20 6c 65 6e 67 74 68  long long length
12fb0 3b 20 20 20 20 20 20 20 20 2f 2a 20 6e 62 72 20  ;        /* nbr 
12fc0 6f 66 20 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b  of bytes to lock
12fd0 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c   */.  unsigned l
12fe0 6f 6e 67 20 6c 6f 6e 67 20 72 65 74 52 61 6e 67  ong long retRang
12ff0 65 53 74 61 72 74 3b 20 2f 2a 20 6e 62 72 20 6f  eStart; /* nbr o
13000 66 20 31 73 74 20 62 79 74 65 20 6c 6f 63 6b 65  f 1st byte locke
13010 64 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 20  d if successful 
13020 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
13030 61 72 20 75 6e 4c 6f 63 6b 46 6c 61 67 3b 20 20  ar unLockFlag;  
13040 20 20 20 20 20 20 20 2f 2a 20 31 20 3d 20 75 6e         /* 1 = un
13050 6c 6f 63 6b 2c 20 30 20 3d 20 6c 6f 63 6b 20 2a  lock, 0 = lock *
13060 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
13070 72 20 73 74 61 72 74 45 6e 64 46 6c 61 67 3b 20  r startEndFlag; 
13080 20 20 20 20 20 20 2f 2a 20 31 3d 72 65 6c 20 74        /* 1=rel t
13090 6f 20 65 6e 64 20 6f 66 20 66 6f 72 6b 2c 20 30  o end of fork, 0
130a0 3d 72 65 6c 20 74 6f 20 73 74 61 72 74 20 2a 2f  =rel to start */
130b0 0a 20 20 69 6e 74 20 66 64 3b 20 20 20 20 20 20  .  int fd;      
130c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
130d0 20 20 20 20 20 2f 2a 20 66 69 6c 65 20 64 65 73       /* file des
130e0 63 20 74 6f 20 61 73 73 6f 63 20 74 68 69 73 20  c to assoc this 
130f0 6c 6f 63 6b 20 77 69 74 68 20 2a 2f 0a 7d 3b 0a  lock with */.};.
13100 0a 23 64 65 66 69 6e 65 20 61 66 70 66 73 42 79  .#define afpfsBy
13110 74 65 52 61 6e 67 65 4c 6f 63 6b 32 46 53 43 54  teRangeLock2FSCT
13120 4c 20 20 20 20 20 20 20 20 5f 49 4f 57 52 28 27  L        _IOWR('
13130 7a 27 2c 20 32 33 2c 20 73 74 72 75 63 74 20 42  z', 23, struct B
13140 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32 29  yteRangeLockPB2)
13150 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ../*.** This is 
13160 61 20 75 74 69 6c 69 74 79 20 66 6f 72 20 73 65  a utility for se
13170 74 74 69 6e 67 20 6f 72 20 63 6c 65 61 72 69 6e  tting or clearin
13180 67 20 61 20 62 69 74 2d 72 61 6e 67 65 20 6c 6f  g a bit-range lo
13190 63 6b 20 6f 6e 20 61 6e 0a 2a 2a 20 41 46 50 20  ck on an.** AFP 
131a0 66 69 6c 65 73 79 73 74 65 6d 2e 0a 2a 2a 20 0a  filesystem..** .
131b0 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
131c0 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2c 20  _OK on success, 
131d0 53 51 4c 49 54 45 5f 42 55 53 59 20 6f 6e 20 66  SQLITE_BUSY on f
131e0 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69  ailure..*/.stati
131f0 63 20 69 6e 74 20 61 66 70 53 65 74 4c 6f 63 6b  c int afpSetLock
13200 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  (.  const char *
13210 70 61 74 68 2c 20 20 20 20 20 20 20 20 20 20 20  path,           
13220 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
13230 65 20 66 69 6c 65 20 74 6f 20 62 65 20 6c 6f 63  e file to be loc
13240 6b 65 64 20 6f 72 20 75 6e 6c 6f 63 6b 65 64 20  ked or unlocked 
13250 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  */.  unixFile *p
13260 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20  File,           
13270 20 20 20 20 2f 2a 20 4f 70 65 6e 20 66 69 6c 65      /* Open file
13280 20 64 65 73 63 72 69 70 74 6f 72 20 6f 6e 20 70   descriptor on p
13290 61 74 68 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ath */.  unsigne
132a0 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6f 66 66 73  d long long offs
132b0 65 74 2c 20 20 20 20 20 2f 2a 20 46 69 72 73 74  et,     /* First
132c0 20 62 79 74 65 20 74 6f 20 62 65 20 6c 6f 63 6b   byte to be lock
132d0 65 64 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ed */.  unsigned
132e0 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6c 65 6e 67 74   long long lengt
132f0 68 2c 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  h,     /* Number
13300 20 6f 66 20 62 79 74 65 73 20 74 6f 20 6c 6f 63   of bytes to loc
13310 6b 20 2a 2f 0a 20 20 69 6e 74 20 73 65 74 4c 6f  k */.  int setLo
13320 63 6b 46 6c 61 67 20 20 20 20 20 20 20 20 20 20  ckFlag          
13330 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
13340 20 73 65 74 20 6c 6f 63 6b 2e 20 20 46 61 6c 73   set lock.  Fals
13350 65 20 74 6f 20 63 6c 65 61 72 20 6c 6f 63 6b 20  e to clear lock 
13360 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 42  */.){.  struct B
13370 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32 20  yteRangeLockPB2 
13380 70 62 3b 0a 20 20 69 6e 74 20 65 72 72 3b 0a 20  pb;.  int err;. 
13390 20 0a 20 20 70 62 2e 75 6e 4c 6f 63 6b 46 6c 61   .  pb.unLockFla
133a0 67 20 3d 20 73 65 74 4c 6f 63 6b 46 6c 61 67 20  g = setLockFlag 
133b0 3f 20 30 20 3a 20 31 3b 0a 20 20 70 62 2e 73 74  ? 0 : 1;.  pb.st
133c0 61 72 74 45 6e 64 46 6c 61 67 20 3d 20 30 3b 0a  artEndFlag = 0;.
133d0 20 20 70 62 2e 6f 66 66 73 65 74 20 3d 20 6f 66    pb.offset = of
133e0 66 73 65 74 3b 0a 20 20 70 62 2e 6c 65 6e 67 74  fset;.  pb.lengt
133f0 68 20 3d 20 6c 65 6e 67 74 68 3b 20 0a 20 20 70  h = length; .  p
13400 62 2e 66 64 20 3d 20 70 46 69 6c 65 2d 3e 68 3b  b.fd = pFile->h;
13410 0a 20 20 0a 20 20 4f 53 54 52 41 43 45 36 28 22  .  .  OSTRACE6("
13420 41 46 50 53 45 54 4c 4f 43 4b 20 5b 25 73 5d 20  AFPSETLOCK [%s] 
13430 66 6f 72 20 25 64 25 73 20 69 6e 20 72 61 6e 67  for %d%s in rang
13440 65 20 25 6c 6c 78 3a 25 6c 6c 78 5c 6e 22 2c 20  e %llx:%llx\n", 
13450 0a 20 20 20 20 28 73 65 74 4c 6f 63 6b 46 6c 61  .    (setLockFla
13460 67 3f 22 4f 4e 22 3a 22 4f 46 46 22 29 2c 20 70  g?"ON":"OFF"), p
13470 46 69 6c 65 2d 3e 68 2c 20 28 70 62 2e 66 64 3d  File->h, (pb.fd=
13480 3d 2d 31 3f 22 5b 74 65 73 74 76 61 6c 2d 31 5d  =-1?"[testval-1]
13490 22 3a 22 22 29 2c 0a 20 20 20 20 6f 66 66 73 65  ":""),.    offse
134a0 74 2c 20 6c 65 6e 67 74 68 29 3b 0a 20 20 65 72  t, length);.  er
134b0 72 20 3d 20 66 73 63 74 6c 28 70 61 74 68 2c 20  r = fsctl(path, 
134c0 61 66 70 66 73 42 79 74 65 52 61 6e 67 65 4c 6f  afpfsByteRangeLo
134d0 63 6b 32 46 53 43 54 4c 2c 20 26 70 62 2c 20 30  ck2FSCTL, &pb, 0
134e0 29 3b 0a 20 20 69 66 20 28 20 65 72 72 3d 3d 2d  );.  if ( err==-
134f0 31 20 29 20 7b 0a 20 20 20 20 69 6e 74 20 72 63  1 ) {.    int rc
13500 3b 0a 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f  ;.    int tErrno
13510 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 4f 53   = errno;.    OS
13520 54 52 41 43 45 34 28 22 41 46 50 53 45 54 4c 4f  TRACE4("AFPSETLO
13530 43 4b 20 66 61 69 6c 65 64 20 74 6f 20 66 73 63  CK failed to fsc
13540 74 6c 28 29 20 27 25 73 27 20 25 64 20 25 73 5c  tl() '%s' %d %s\
13550 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
13560 20 70 61 74 68 2c 20 74 45 72 72 6e 6f 2c 20 73   path, tErrno, s
13570 74 72 65 72 72 6f 72 28 74 45 72 72 6e 6f 29 29  trerror(tErrno))
13580 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
13590 49 47 4e 4f 52 45 5f 41 46 50 5f 4c 4f 43 4b 5f  IGNORE_AFP_LOCK_
135a0 45 52 52 4f 52 53 0a 20 20 20 20 72 63 20 3d 20  ERRORS.    rc = 
135b0 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 23 65 6c  SQLITE_BUSY;.#el
135c0 73 65 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  se.    rc = sqli
135d0 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78  teErrorFromPosix
135e0 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 0a 20 20  Error(tErrno,.  
135f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13600 20 20 73 65 74 4c 6f 63 6b 46 6c 61 67 20 3f 20    setLockFlag ? 
13610 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43  SQLITE_IOERR_LOC
13620 4b 20 3a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  K : SQLITE_IOERR
13630 5f 55 4e 4c 4f 43 4b 29 3b 0a 23 65 6e 64 69 66  _UNLOCK);.#endif
13640 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52   /* SQLITE_IGNOR
13650 45 5f 41 46 50 5f 4c 4f 43 4b 5f 45 52 52 4f 52  E_AFP_LOCK_ERROR
13660 53 20 2a 2f 0a 20 20 20 20 69 66 28 20 49 53 5f  S */.    if( IS_
13670 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29  LOCK_ERROR(rc) )
13680 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  {.      pFile->l
13690 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e  astErrno = tErrn
136a0 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  o;.    }.    ret
136b0 75 72 6e 20 72 63 3b 0a 20 20 7d 20 65 6c 73 65  urn rc;.  } else
136c0 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51   {.    return SQ
136d0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a  LITE_OK;.  }.}..
136e0 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
136f0 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74 68 65  ne checks if the
13700 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44  re is a RESERVED
13710 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68   lock held on th
13720 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66  e specified.** f
13730 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20 61  ile by this or a
13740 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  ny other process
13750 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b  . If such a lock
13760 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70   is held, set *p
13770 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e  ResOut.** to a n
13780 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74  on-zero value ot
13790 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74  herwise *pResOut
137a0 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e   is set to zero.
137b0 20 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c    The return val
137c0 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20  ue.** is set to 
137d0 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73  SQLITE_OK unless
137e0 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63   an I/O error oc
137f0 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b  curs during lock
13800 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74   checking..*/.st
13810 61 74 69 63 20 69 6e 74 20 61 66 70 43 68 65 63  atic int afpChec
13820 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71  kReservedLock(sq
13830 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
13840 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20  int *pResOut){. 
13850 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
13860 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65 72  _OK;.  int reser
13870 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46  ved = 0;.  unixF
13880 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
13890 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 0a 20  ixFile*)id;.  . 
138a0 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
138b0 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ( return SQLITE_
138c0 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52  IOERR_CHECKRESER
138d0 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20  VEDLOCK; );.  . 
138e0 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
138f0 3b 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f  ;.  afpLockingCo
13900 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 20 3d  ntext *context =
13910 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74   (afpLockingCont
13920 65 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f  ext *) pFile->lo
13930 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20  ckingContext;.  
13940 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61  .  /* Check if a
13950 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 20   thread in this 
13960 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75  process holds su
13970 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69  ch a lock */.  i
13980 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  f( pFile->lockty
13990 70 65 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  pe>SHARED_LOCK )
139a0 7b 0a 20 20 20 20 72 65 73 65 72 76 65 64 20 3d  {.    reserved =
139b0 20 31 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20   1;.  }.  .  /* 
139c0 4f 74 68 65 72 77 69 73 65 20 73 65 65 20 69 66  Otherwise see if
139d0 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63   some other proc
139e0 65 73 73 20 68 6f 6c 64 73 20 69 74 2e 0a 20 20  ess holds it..  
139f0 20 2a 2f 0a 20 20 69 66 28 20 21 72 65 73 65 72   */.  if( !reser
13a00 76 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20 6c 6f  ved ){.    /* lo
13a10 63 6b 20 74 68 65 20 52 45 53 45 52 56 45 44 20  ck the RESERVED 
13a20 62 79 74 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20  byte */.    int 
13a30 6c 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b  lrc = afpSetLock
13a40 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
13a50 2c 20 70 46 69 6c 65 2c 20 52 45 53 45 52 56 45  , pFile, RESERVE
13a60 44 5f 42 59 54 45 2c 20 31 2c 31 29 3b 20 20 0a  D_BYTE, 1,1);  .
13a70 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f      if( SQLITE_O
13a80 4b 3d 3d 6c 72 63 20 29 7b 0a 20 20 20 20 20 20  K==lrc ){.      
13a90 2f 2a 20 69 66 20 77 65 20 73 75 63 63 65 65 64  /* if we succeed
13aa0 65 64 20 69 6e 20 74 61 6b 69 6e 67 20 74 68 65  ed in taking the
13ab0 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 2c 20   reserved lock, 
13ac0 75 6e 6c 6f 63 6b 20 69 74 20 74 6f 20 72 65 73  unlock it to res
13ad0 74 6f 72 65 0a 20 20 20 20 20 20 2a 2a 20 74 68  tore.      ** th
13ae0 65 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65  e original state
13af0 20 2a 2f 0a 20 20 20 20 20 20 6c 72 63 20 3d 20   */.      lrc = 
13b00 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  afpSetLock(conte
13b10 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  xt->dbPath, pFil
13b20 65 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45  e, RESERVED_BYTE
13b30 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d 20 65  , 1, 0);.    } e
13b40 6c 73 65 20 7b 0a 20 20 20 20 20 20 2f 2a 20 69  lse {.      /* i
13b50 66 20 77 65 20 66 61 69 6c 65 64 20 74 6f 20 67  f we failed to g
13b60 65 74 20 74 68 65 20 6c 6f 63 6b 20 74 68 65 6e  et the lock then
13b70 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 6d 75   someone else mu
13b80 73 74 20 68 61 76 65 20 69 74 20 2a 2f 0a 20 20  st have it */.  
13b90 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31      reserved = 1
13ba0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
13bb0 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72  IS_LOCK_ERROR(lr
13bc0 63 29 20 29 7b 0a 20 20 20 20 20 20 72 63 3d 6c  c) ){.      rc=l
13bd0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  rc;.    }.  }.  
13be0 0a 20 20 4f 53 54 52 41 43 45 34 28 22 54 45 53  .  OSTRACE4("TES
13bf0 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20  T WR-LOCK %d %d 
13c00 25 64 20 28 61 66 70 29 5c 6e 22 2c 20 70 46 69  %d (afp)\n", pFi
13c10 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72  le->h, rc, reser
13c20 76 65 64 29 3b 0a 20 20 0a 20 20 2a 70 52 65 73  ved);.  .  *pRes
13c30 4f 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a  Out = reserved;.
13c40 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
13c50 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66  /*.** Lock the f
13c60 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63  ile with the loc
13c70 6b 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70  k specified by p
13c80 61 72 61 6d 65 74 65 72 20 6c 6f 63 6b 74 79 70  arameter locktyp
13c90 65 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68  e - one.** of th
13ca0 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
13cb0 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45  **     (1) SHARE
13cc0 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32  D_LOCK.**     (2
13cd0 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a  ) RESERVED_LOCK.
13ce0 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49  **     (3) PENDI
13cf0 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  NG_LOCK.**     (
13d00 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  4) EXCLUSIVE_LOC
13d10 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65  K.**.** Sometime
13d20 73 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e  s when requestin
13d30 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65  g one lock state
13d40 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63  , additional loc
13d50 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20  k states.** are 
13d60 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77  inserted in betw
13d70 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e  een.  The lockin
13d80 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20  g might fail on 
13d90 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72  one of the later
13da0 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  .** transitions 
13db0 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b  leaving the lock
13dc0 20 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74   state different
13dd0 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74   from what it st
13de0 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69  arted but.** sti
13df0 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20  ll short of its 
13e00 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  goal.  The follo
13e10 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73  wing chart shows
13e20 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20   the allowed.** 
13e30 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20  transitions and 
13e40 74 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74  the inserted int
13e50 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73  ermediate states
13e60 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43  :.**.**    UNLOC
13e70 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a  KED -> SHARED.**
13e80 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45      SHARED -> RE
13e90 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41  SERVED.**    SHA
13ea0 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  RED -> (PENDING)
13eb0 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
13ec0 20 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20      RESERVED -> 
13ed0 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43  (PENDING) -> EXC
13ee0 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e  LUSIVE.**    PEN
13ef0 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56  DING -> EXCLUSIV
13f00 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  E.**.** This rou
13f10 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69  tine will only i
13f20 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20  ncrease a lock. 
13f30 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33   Use the sqlite3
13f40 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f  OsUnlock().** ro
13f50 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61  utine to lower a
13f60 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a   locking level..
13f70 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66  */.static int af
13f80 70 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  pLock(sqlite3_fi
13f90 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b  le *id, int lock
13fa0 74 79 70 65 29 7b 0a 20 20 69 6e 74 20 72 63 20  type){.  int rc 
13fb0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75  = SQLITE_OK;.  u
13fc0 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
13fd0 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
13fe0 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74    afpLockingCont
13ff0 65 78 74 20 2a 63 6f 6e 74 65 78 74 20 3d 20 28  ext *context = (
14000 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
14010 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  t *) pFile->lock
14020 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 0a 20  ingContext;.  . 
14030 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
14040 3b 0a 20 20 4f 53 54 52 41 43 45 35 28 22 4c 4f  ;.  OSTRACE5("LO
14050 43 4b 20 20 20 20 25 64 20 25 73 20 77 61 73 20  CK    %d %s was 
14060 25 73 20 70 69 64 3d 25 64 20 28 61 66 70 29 5c  %s pid=%d (afp)\
14070 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20  n", pFile->h,.  
14080 20 20 20 20 20 20 20 6c 6f 63 6b 74 79 70 65 4e         locktypeN
14090 61 6d 65 28 6c 6f 63 6b 74 79 70 65 29 2c 20 6c  ame(locktype), l
140a0 6f 63 6b 74 79 70 65 4e 61 6d 65 28 70 46 69 6c  ocktypeName(pFil
140b0 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 2c 20 67 65  e->locktype), ge
140c0 74 70 69 64 28 29 29 3b 0a 0a 20 20 2f 2a 20 49  tpid());..  /* I
140d0 66 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61  f there is alrea
140e0 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20 74 68 69  dy a lock of thi
140f0 73 20 74 79 70 65 20 6f 72 20 6d 6f 72 65 20 72  s type or more r
14100 65 73 74 72 69 63 74 69 76 65 20 6f 6e 20 74 68  estrictive on th
14110 65 0a 20 20 2a 2a 20 75 6e 69 78 46 69 6c 65 2c  e.  ** unixFile,
14120 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e   do nothing. Don
14130 27 74 20 75 73 65 20 74 68 65 20 61 66 70 5f 65  't use the afp_e
14140 6e 64 5f 6c 6f 63 6b 3a 20 65 78 69 74 20 70 61  nd_lock: exit pa
14150 74 68 2c 20 61 73 0a 20 20 2a 2a 20 75 6e 69 78  th, as.  ** unix
14160 45 6e 74 65 72 4d 75 74 65 78 28 29 20 68 61 73  EnterMutex() has
14170 6e 27 74 20 62 65 65 6e 20 63 61 6c 6c 65 64 20  n't been called 
14180 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  yet..  */.  if( 
14190 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e  pFile->locktype>
141a0 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20  =locktype ){.   
141b0 20 4f 53 54 52 41 43 45 33 28 22 4c 4f 43 4b 20   OSTRACE3("LOCK 
141c0 20 20 20 25 64 20 25 73 20 6f 6b 20 28 61 6c 72     %d %s ok (alr
141d0 65 61 64 79 20 68 65 6c 64 29 20 28 61 66 70 29  eady held) (afp)
141e0 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20  \n", pFile->h,. 
141f0 20 20 20 20 20 20 20 20 20 20 6c 6f 63 6b 74 79            lockty
14200 70 65 4e 61 6d 65 28 6c 6f 63 6b 74 79 70 65 29  peName(locktype)
14210 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
14220 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
14230 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
14240 20 6c 6f 63 6b 69 6e 67 20 73 65 71 75 65 6e 63   locking sequenc
14250 65 20 69 73 20 63 6f 72 72 65 63 74 0a 20 20 2a  e is correct.  *
14260 2f 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  /.  assert( pFil
14270 65 2d 3e 6c 6f 63 6b 74 79 70 65 21 3d 4e 4f 5f  e->locktype!=NO_
14280 4c 4f 43 4b 20 7c 7c 20 6c 6f 63 6b 74 79 70 65  LOCK || locktype
14290 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  ==SHARED_LOCK );
142a0 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74  .  assert( lockt
142b0 79 70 65 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43  ype!=PENDING_LOC
142c0 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6c  K );.  assert( l
142d0 6f 63 6b 74 79 70 65 21 3d 52 45 53 45 52 56 45  ocktype!=RESERVE
142e0 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c 65 2d  D_LOCK || pFile-
142f0 3e 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45  >locktype==SHARE
14300 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f  D_LOCK );.  .  /
14310 2a 20 54 68 69 73 20 6d 75 74 65 78 20 69 73 20  * This mutex is 
14320 6e 65 65 64 65 64 20 62 65 63 61 75 73 65 20 70  needed because p
14330 46 69 6c 65 2d 3e 70 4c 6f 63 6b 20 69 73 20 73  File->pLock is s
14340 68 61 72 65 64 20 61 63 72 6f 73 73 20 74 68 72  hared across thr
14350 65 61 64 73 0a 20 20 2a 2f 0a 20 20 75 6e 69 78  eads.  */.  unix
14360 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 0a 20  EnterMutex();.. 
14370 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68   /* Make sure th
14380 65 20 63 75 72 72 65 6e 74 20 74 68 72 65 61 64  e current thread
14390 20 6f 77 6e 73 20 74 68 65 20 70 46 69 6c 65 2e   owns the pFile.
143a0 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 74 72 61  .  */.  rc = tra
143b0 6e 73 66 65 72 4f 77 6e 65 72 73 68 69 70 28 70  nsferOwnership(p
143c0 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 72 63 21  File);.  if( rc!
143d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
143e0 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
143f0 28 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  ();.    return r
14400 63 3b 0a 20 20 7d 0a 20 20 20 20 0a 20 20 2f 2a  c;.  }.    .  /*
14410 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20   A PENDING lock 
14420 69 73 20 6e 65 65 64 65 64 20 62 65 66 6f 72 65  is needed before
14430 20 61 63 71 75 69 72 69 6e 67 20 61 20 53 48 41   acquiring a SHA
14440 52 45 44 20 6c 6f 63 6b 20 61 6e 64 20 62 65 66  RED lock and bef
14450 6f 72 65 0a 20 20 2a 2a 20 61 63 71 75 69 72 69  ore.  ** acquiri
14460 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  ng an EXCLUSIVE 
14470 6c 6f 63 6b 2e 20 20 46 6f 72 20 74 68 65 20 53  lock.  For the S
14480 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20  HARED lock, the 
14490 50 45 4e 44 49 4e 47 20 77 69 6c 6c 0a 20 20 2a  PENDING will.  *
144a0 2a 20 62 65 20 72 65 6c 65 61 73 65 64 2e 0a 20  * be released.. 
144b0 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79   */.  if( lockty
144c0 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  pe==SHARED_LOCK 
144d0 0a 20 20 20 20 20 20 7c 7c 20 28 6c 6f 63 6b 74  .      || (lockt
144e0 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ype==EXCLUSIVE_L
144f0 4f 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e 6c 6f  OCK && pFile->lo
14500 63 6b 74 79 70 65 3c 50 45 4e 44 49 4e 47 5f 4c  cktype<PENDING_L
14510 4f 43 4b 29 0a 20 20 29 7b 0a 20 20 20 20 69 6e  OCK).  ){.    in
14520 74 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 66 61  t failed;.    fa
14530 69 6c 65 64 20 3d 20 61 66 70 53 65 74 4c 6f 63  iled = afpSetLoc
14540 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74  k(context->dbPat
14550 68 2c 20 70 46 69 6c 65 2c 20 50 45 4e 44 49 4e  h, pFile, PENDIN
14560 47 5f 42 59 54 45 2c 20 31 2c 20 31 29 3b 0a 20  G_BYTE, 1, 1);. 
14570 20 20 20 69 66 20 28 66 61 69 6c 65 64 29 20 7b     if (failed) {
14580 0a 20 20 20 20 20 20 72 63 20 3d 20 66 61 69 6c  .      rc = fail
14590 65 64 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61  ed;.      goto a
145a0 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20  fp_end_lock;.   
145b0 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 49   }.  }.  .  /* I
145c0 66 20 63 6f 6e 74 72 6f 6c 20 67 65 74 73 20 74  f control gets t
145d0 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68  o this point, th
145e0 65 6e 20 61 63 74 75 61 6c 6c 79 20 67 6f 20 61  en actually go a
145f0 68 65 61 64 20 61 6e 64 20 6d 61 6b 65 0a 20 20  head and make.  
14600 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  ** operating sys
14610 74 65 6d 20 63 61 6c 6c 73 20 66 6f 72 20 74 68  tem calls for th
14620 65 20 73 70 65 63 69 66 69 65 64 20 6c 6f 63 6b  e specified lock
14630 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63  ..  */.  if( loc
14640 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f  ktype==SHARED_LO
14650 43 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 6c 6b  CK ){.    int lk
14660 2c 20 6c 72 63 31 2c 20 6c 72 63 32 3b 0a 20 20  , lrc1, lrc2;.  
14670 20 20 69 6e 74 20 6c 72 63 31 45 72 72 6e 6f 20    int lrc1Errno 
14680 3d 20 30 3b 0a 20 20 20 20 0a 20 20 20 20 2f 2a  = 0;.    .    /*
14690 20 4e 6f 77 20 67 65 74 20 74 68 65 20 72 65 61   Now get the rea
146a0 64 2d 6c 6f 63 6b 20 53 48 41 52 45 44 5f 4c 4f  d-lock SHARED_LO
146b0 43 4b 20 2a 2f 0a 20 20 20 20 2f 2a 20 6e 6f 74  CK */.    /* not
146c0 65 20 74 68 61 74 20 74 68 65 20 71 75 61 6c 69  e that the quali
146d0 74 79 20 6f 66 20 74 68 65 20 72 61 6e 64 6f 6d  ty of the random
146e0 6e 65 73 73 20 64 6f 65 73 6e 27 74 20 6d 61 74  ness doesn't mat
146f0 74 65 72 20 74 68 61 74 20 6d 75 63 68 20 2a 2f  ter that much */
14700 0a 20 20 20 20 6c 6b 20 3d 20 72 61 6e 64 6f 6d  .    lk = random
14710 28 29 3b 20 0a 20 20 20 20 63 6f 6e 74 65 78 74  (); .    context
14720 2d 3e 73 68 61 72 65 64 42 79 74 65 20 3d 20 28  ->sharedByte = (
14730 6c 6b 20 26 20 30 78 37 66 66 66 66 66 66 66 29  lk & 0x7fffffff)
14740 25 28 53 48 41 52 45 44 5f 53 49 5a 45 20 2d 20  %(SHARED_SIZE - 
14750 31 29 3b 0a 20 20 20 20 6c 72 63 31 20 3d 20 61  1);.    lrc1 = a
14760 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78  fpSetLock(contex
14770 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65  t->dbPath, pFile
14780 2c 20 0a 20 20 20 20 20 20 20 20 20 20 53 48 41  , .          SHA
14790 52 45 44 5f 46 49 52 53 54 2b 63 6f 6e 74 65 78  RED_FIRST+contex
147a0 74 2d 3e 73 68 61 72 65 64 42 79 74 65 2c 20 31  t->sharedByte, 1
147b0 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20 49 53  , 1);.    if( IS
147c0 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 31  _LOCK_ERROR(lrc1
147d0 29 20 29 7b 0a 20 20 20 20 20 20 6c 72 63 31 45  ) ){.      lrc1E
147e0 72 72 6e 6f 20 3d 20 70 46 69 6c 65 2d 3e 6c 61  rrno = pFile->la
147f0 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20  stErrno;.    }. 
14800 20 20 20 2f 2a 20 44 72 6f 70 20 74 68 65 20 74     /* Drop the t
14810 65 6d 70 6f 72 61 72 79 20 50 45 4e 44 49 4e 47  emporary PENDING
14820 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c 72 63   lock */.    lrc
14830 32 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63  2 = afpSetLock(c
14840 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20  ontext->dbPath, 
14850 70 46 69 6c 65 2c 20 50 45 4e 44 49 4e 47 5f 42  pFile, PENDING_B
14860 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  YTE, 1, 0);.    
14870 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b  .    if( IS_LOCK
14880 5f 45 52 52 4f 52 28 6c 72 63 31 29 20 29 20 7b  _ERROR(lrc1) ) {
14890 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  .      pFile->la
148a0 73 74 45 72 72 6e 6f 20 3d 20 6c 72 63 31 45 72  stErrno = lrc1Er
148b0 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  rno;.      rc = 
148c0 6c 72 63 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f  lrc1;.      goto
148d0 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20   afp_end_lock;. 
148e0 20 20 20 7d 20 65 6c 73 65 20 69 66 28 20 49 53     } else if( IS
148f0 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 32  _LOCK_ERROR(lrc2
14900 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
14910 6c 72 63 32 3b 0a 20 20 20 20 20 20 67 6f 74 6f  lrc2;.      goto
14920 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20   afp_end_lock;. 
14930 20 20 20 7d 20 65 6c 73 65 20 69 66 28 20 6c 72     } else if( lr
14940 63 31 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 20  c1 != SQLITE_OK 
14950 29 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6c  ) {.      rc = l
14960 72 63 31 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  rc1;.    } else 
14970 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  {.      pFile->l
14980 6f 63 6b 74 79 70 65 20 3d 20 53 48 41 52 45 44  ocktype = SHARED
14990 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 70 46 69  _LOCK;.      pFi
149a0 6c 65 2d 3e 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b  le->pOpen->nLock
149b0 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  ++;.    }.  }els
149c0 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65  e{.    /* The re
149d0 71 75 65 73 74 20 77 61 73 20 66 6f 72 20 61 20  quest was for a 
149e0 52 45 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c  RESERVED or EXCL
149f0 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 49 74 20  USIVE lock.  It 
14a00 69 73 0a 20 20 20 20 2a 2a 20 61 73 73 75 6d 65  is.    ** assume
14a10 64 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20  d that there is 
14a20 61 20 53 48 41 52 45 44 20 6f 72 20 67 72 65 61  a SHARED or grea
14a30 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ter lock on the 
14a40 66 69 6c 65 0a 20 20 20 20 2a 2a 20 61 6c 72 65  file.    ** alre
14a50 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ady..    */.    
14a60 69 6e 74 20 66 61 69 6c 65 64 20 3d 20 30 3b 0a  int failed = 0;.
14a70 20 20 20 20 61 73 73 65 72 74 28 20 30 21 3d 70      assert( 0!=p
14a80 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 29  File->locktype )
14a90 3b 0a 20 20 20 20 69 66 20 28 6c 6f 63 6b 74 79  ;.    if (lockty
14aa0 70 65 20 3e 3d 20 52 45 53 45 52 56 45 44 5f 4c  pe >= RESERVED_L
14ab0 4f 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e 6c 6f  OCK && pFile->lo
14ac0 63 6b 74 79 70 65 20 3c 20 52 45 53 45 52 56 45  cktype < RESERVE
14ad0 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 20 20  D_LOCK) {.      
14ae0 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61 20 52    /* Acquire a R
14af0 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 2a 2f 0a  ESERVED lock */.
14b00 20 20 20 20 20 20 20 20 66 61 69 6c 65 64 20 3d          failed =
14b10 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74   afpSetLock(cont
14b20 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69  ext->dbPath, pFi
14b30 6c 65 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54  le, RESERVED_BYT
14b40 45 2c 20 31 2c 31 29 3b 0a 20 20 20 20 7d 0a 20  E, 1,1);.    }. 
14b50 20 20 20 69 66 20 28 21 66 61 69 6c 65 64 20 26     if (!failed &
14b60 26 20 6c 6f 63 6b 74 79 70 65 20 3d 3d 20 45 58  & locktype == EX
14b70 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 20 7b 0a  CLUSIVE_LOCK) {.
14b80 20 20 20 20 20 20 2f 2a 20 41 63 71 75 69 72 65        /* Acquire
14b90 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
14ba0 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 0a 20  ck */.        . 
14bb0 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74       /* Remove t
14bc0 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 62  he shared lock b
14bd0 65 66 6f 72 65 20 74 72 79 69 6e 67 20 74 68 65  efore trying the
14be0 20 72 61 6e 67 65 2e 20 20 77 65 27 6c 6c 20 6e   range.  we'll n
14bf0 65 65 64 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a  eed to .      **
14c00 20 72 65 65 73 74 61 62 6c 69 73 68 20 74 68 65   reestablish the
14c10 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 69 66 20   shared lock if 
14c20 77 65 20 63 61 6e 27 74 20 67 65 74 20 74 68 65  we can't get the
14c30 20 20 61 66 70 55 6e 6c 6f 63 6b 0a 20 20 20 20    afpUnlock.    
14c40 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21    */.      if( !
14c50 28 66 61 69 6c 65 64 20 3d 20 61 66 70 53 65 74  (failed = afpSet
14c60 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62  Lock(context->db
14c70 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 53 48 41  Path, pFile, SHA
14c80 52 45 44 5f 46 49 52 53 54 20 2b 0a 20 20 20 20  RED_FIRST +.    
14c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ca0 20 20 20 20 20 63 6f 6e 74 65 78 74 2d 3e 73 68       context->sh
14cb0 61 72 65 64 42 79 74 65 2c 20 31 2c 20 30 29 29  aredByte, 1, 0))
14cc0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
14cd0 66 61 69 6c 65 64 32 20 3d 20 53 51 4c 49 54 45  failed2 = SQLITE
14ce0 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  _OK;.        /* 
14cf0 6e 6f 77 20 61 74 74 65 6d 6d 70 74 20 74 6f 20  now attemmpt to 
14d00 67 65 74 20 74 68 65 20 65 78 63 6c 75 73 69 76  get the exclusiv
14d10 65 20 6c 6f 63 6b 20 72 61 6e 67 65 20 2a 2f 0a  e lock range */.
14d20 20 20 20 20 20 20 20 20 66 61 69 6c 65 64 20 3d          failed =
14d30 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74   afpSetLock(cont
14d40 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69  ext->dbPath, pFi
14d50 6c 65 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54  le, SHARED_FIRST
14d60 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
14d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14d80 20 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 31    SHARED_SIZE, 1
14d90 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 66  );.        if( f
14da0 61 69 6c 65 64 20 26 26 20 28 66 61 69 6c 65 64  ailed && (failed
14db0 32 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63  2 = afpSetLock(c
14dc0 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20  ontext->dbPath, 
14dd0 70 46 69 6c 65 2c 20 0a 20 20 20 20 20 20 20 20  pFile, .        
14de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
14df0 48 41 52 45 44 5f 46 49 52 53 54 20 2b 20 63 6f  HARED_FIRST + co
14e00 6e 74 65 78 74 2d 3e 73 68 61 72 65 64 42 79 74  ntext->sharedByt
14e10 65 2c 20 31 2c 20 31 29 29 20 29 7b 0a 20 20 20  e, 1, 1)) ){.   
14e20 20 20 20 20 20 20 20 2f 2a 20 43 61 6e 27 74 20         /* Can't 
14e30 72 65 65 73 74 61 62 6c 69 73 68 20 74 68 65 20  reestablish the 
14e40 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20 20 53 71  shared lock.  Sq
14e50 6c 69 74 65 20 63 61 6e 27 74 20 64 65 61 6c 2c  lite can't deal,
14e60 20 74 68 69 73 20 69 73 0a 20 20 20 20 20 20 20   this is.       
14e70 20 20 20 2a 2a 20 61 20 63 72 69 74 69 63 61 6c     ** a critical
14e80 20 49 2f 4f 20 65 72 72 6f 72 0a 20 20 20 20 20   I/O error.     
14e90 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
14ea0 20 20 72 63 20 3d 20 28 28 66 61 69 6c 65 64 20    rc = ((failed 
14eb0 26 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 20  & SQLITE_IOERR) 
14ec0 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29  == SQLITE_IOERR)
14ed0 20 3f 20 66 61 69 6c 65 64 32 20 3a 20 0a 20 20   ? failed2 : .  
14ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
14ef0 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a  ITE_IOERR_LOCK;.
14f00 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 61            goto a
14f10 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20  fp_end_lock;.   
14f20 20 20 20 20 20 7d 20 0a 20 20 20 20 20 20 7d 65       } .      }e
14f30 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20  lse{.        rc 
14f40 3d 20 66 61 69 6c 65 64 3b 20 0a 20 20 20 20 20  = failed; .     
14f50 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
14f60 20 66 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20   failed ){.     
14f70 20 72 63 20 3d 20 66 61 69 6c 65 64 3b 0a 20 20   rc = failed;.  
14f80 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 69 66 28    }.  }.  .  if(
14f90 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
14fa0 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63  {.    pFile->loc
14fb0 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65  ktype = locktype
14fc0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f  ;.  }else if( lo
14fd0 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53 49 56  cktype==EXCLUSIV
14fe0 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46  E_LOCK ){.    pF
14ff0 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20  ile->locktype = 
15000 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20  PENDING_LOCK;.  
15010 7d 0a 20 20 0a 61 66 70 5f 65 6e 64 5f 6c 6f 63  }.  .afp_end_loc
15020 6b 3a 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75  k:.  unixLeaveMu
15030 74 65 78 28 29 3b 0a 20 20 4f 53 54 52 41 43 45  tex();.  OSTRACE
15040 34 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73  4("LOCK    %d %s
15050 20 25 73 20 28 61 66 70 29 5c 6e 22 2c 20 70 46   %s (afp)\n", pF
15060 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70 65  ile->h, locktype
15070 4e 61 6d 65 28 6c 6f 63 6b 74 79 70 65 29 2c 20  Name(locktype), 
15080 0a 20 20 20 20 20 20 20 20 20 72 63 3d 3d 53 51  .         rc==SQ
15090 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a  LITE_OK ? "ok" :
150a0 20 22 66 61 69 6c 65 64 22 29 3b 0a 20 20 72 65   "failed");.  re
150b0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
150c0 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b  * Lower the lock
150d0 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c  ing level on fil
150e0 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69  e descriptor pFi
150f0 6c 65 20 74 6f 20 6c 6f 63 6b 74 79 70 65 2e 20  le to locktype. 
15100 20 6c 6f 63 6b 74 79 70 65 0a 2a 2a 20 6d 75 73   locktype.** mus
15110 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c  t be either NO_L
15120 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f  OCK or SHARED_LO
15130 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  CK..**.** If the
15140 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
15150 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  f the file descr
15160 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79  iptor is already
15170 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20   at or below.** 
15180 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
15190 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69  cking level, thi
151a0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
151b0 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
151c0 69 6e 74 20 61 66 70 55 6e 6c 6f 63 6b 28 73 71  int afpUnlock(sq
151d0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
151e0 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 20 7b 0a  int locktype) {.
151f0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
15200 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65  E_OK;.  unixFile
15210 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
15220 69 6c 65 2a 29 69 64 3b 0a 20 20 61 66 70 4c 6f  ile*)id;.  afpLo
15230 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43  ckingContext *pC
15240 74 78 20 3d 20 28 61 66 70 4c 6f 63 6b 69 6e 67  tx = (afpLocking
15250 43 6f 6e 74 65 78 74 20 2a 29 20 70 46 69 6c 65  Context *) pFile
15260 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
15270 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  ;..  assert( pFi
15280 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 35  le );.  OSTRACE5
15290 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20  ("UNLOCK  %d %d 
152a0 77 61 73 20 25 64 20 70 69 64 3d 25 64 20 28 61  was %d pid=%d (a
152b0 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  fp)\n", pFile->h
152c0 2c 20 6c 6f 63 6b 74 79 70 65 2c 0a 20 20 20 20  , locktype,.    
152d0 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b       pFile->lock
152e0 74 79 70 65 2c 20 67 65 74 70 69 64 28 29 29 3b  type, getpid());
152f0 0a 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b  ..  assert( lock
15300 74 79 70 65 3c 3d 53 48 41 52 45 44 5f 4c 4f 43  type<=SHARED_LOC
15310 4b 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65  K );.  if( pFile
15320 2d 3e 6c 6f 63 6b 74 79 70 65 3c 3d 6c 6f 63 6b  ->locktype<=lock
15330 74 79 70 65 20 29 7b 0a 20 20 20 20 72 65 74 75  type ){.    retu
15340 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
15350 7d 0a 20 20 69 66 28 20 43 48 45 43 4b 5f 54 48  }.  if( CHECK_TH
15360 52 45 41 44 49 44 28 70 46 69 6c 65 29 20 29 7b  READID(pFile) ){
15370 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
15380 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20 7d 0a 20  TE_MISUSE;.  }. 
15390 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
153a0 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  );.  if( pFile->
153b0 6c 6f 63 6b 74 79 70 65 3e 53 48 41 52 45 44 5f  locktype>SHARED_
153c0 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 0a 20 20 20  LOCK ){.    .   
153d0 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b   if( pFile->lock
153e0 74 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f  type==EXCLUSIVE_
153f0 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  LOCK ){.      rc
15400 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 70 43   = afpSetLock(pC
15410 74 78 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  tx->dbPath, pFil
15420 65 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c  e, SHARED_FIRST,
15430 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 29   SHARED_SIZE, 0)
15440 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
15450 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6c 6f 63  SQLITE_OK && loc
15460 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f  ktype==SHARED_LO
15470 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  CK ){.        /*
15480 20 6f 6e 6c 79 20 72 65 2d 65 73 74 61 62 6c 69   only re-establi
15490 73 68 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f  sh the shared lo
154a0 63 6b 20 69 66 20 6e 65 63 65 73 73 61 72 79 20  ck if necessary 
154b0 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 73  */.        int s
154c0 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 20 3d 20  haredLockByte = 
154d0 53 48 41 52 45 44 5f 46 49 52 53 54 2b 70 43 74  SHARED_FIRST+pCt
154e0 78 2d 3e 73 68 61 72 65 64 42 79 74 65 3b 0a 20  x->sharedByte;. 
154f0 20 20 20 20 20 20 20 72 63 20 3d 20 61 66 70 53         rc = afpS
15500 65 74 4c 6f 63 6b 28 70 43 74 78 2d 3e 64 62 50  etLock(pCtx->dbP
15510 61 74 68 2c 20 70 46 69 6c 65 2c 20 73 68 61 72  ath, pFile, shar
15520 65 64 4c 6f 63 6b 42 79 74 65 2c 20 31 2c 20 31  edLockByte, 1, 1
15530 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
15540 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
15550 49 54 45 5f 4f 4b 20 26 26 20 70 46 69 6c 65 2d  ITE_OK && pFile-
15560 3e 6c 6f 63 6b 74 79 70 65 3e 3d 50 45 4e 44 49  >locktype>=PENDI
15570 4e 47 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20  NG_LOCK ){.     
15580 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b   rc = afpSetLock
15590 28 70 43 74 78 2d 3e 64 62 50 61 74 68 2c 20 70  (pCtx->dbPath, p
155a0 46 69 6c 65 2c 20 50 45 4e 44 49 4e 47 5f 42 59  File, PENDING_BY
155b0 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d  TE, 1, 0);.    }
155c0 20 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51   .    if( rc==SQ
155d0 4c 49 54 45 5f 4f 4b 20 26 26 20 70 46 69 6c 65  LITE_OK && pFile
155e0 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 52 45 53 45  ->locktype>=RESE
155f0 52 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  RVED_LOCK ){.   
15600 20 20 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f     rc = afpSetLo
15610 63 6b 28 70 43 74 78 2d 3e 64 62 50 61 74 68 2c  ck(pCtx->dbPath,
15620 20 70 46 69 6c 65 2c 20 52 45 53 45 52 56 45 44   pFile, RESERVED
15630 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20  _BYTE, 1, 0);.  
15640 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
15650 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43  locktype==NO_LOC
15660 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 63 6c 65 61  K ){.    /* clea
15670 72 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63  r the shared loc
15680 6b 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 68 61  k */.    int sha
15690 72 65 64 4c 6f 63 6b 42 79 74 65 20 3d 20 53 48  redLockByte = SH
156a0 41 52 45 44 5f 46 49 52 53 54 2b 70 43 74 78 2d  ARED_FIRST+pCtx-
156b0 3e 73 68 61 72 65 64 42 79 74 65 3b 0a 20 20 20  >sharedByte;.   
156c0 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b   rc = afpSetLock
156d0 28 70 43 74 78 2d 3e 64 62 50 61 74 68 2c 20 70  (pCtx->dbPath, p
156e0 46 69 6c 65 2c 20 73 68 61 72 65 64 4c 6f 63 6b  File, sharedLock
156f0 42 79 74 65 2c 20 31 2c 20 30 29 3b 0a 20 20 7d  Byte, 1, 0);.  }
15700 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
15710 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
15720 20 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f   locktype==NO_LO
15730 43 4b 20 29 7b 0a 20 20 20 20 20 20 73 74 72 75  CK ){.      stru
15740 63 74 20 75 6e 69 78 4f 70 65 6e 43 6e 74 20 2a  ct unixOpenCnt *
15750 70 4f 70 65 6e 20 3d 20 70 46 69 6c 65 2d 3e 70  pOpen = pFile->p
15760 4f 70 65 6e 3b 0a 20 20 20 20 20 20 70 4f 70 65  Open;.      pOpe
15770 6e 2d 3e 6e 4c 6f 63 6b 2d 2d 3b 0a 20 20 20 20  n->nLock--;.    
15780 20 20 61 73 73 65 72 74 28 20 70 4f 70 65 6e 2d    assert( pOpen-
15790 3e 6e 4c 6f 63 6b 3e 3d 30 20 29 3b 0a 20 20 20  >nLock>=0 );.   
157a0 20 20 20 69 66 28 20 70 4f 70 65 6e 2d 3e 6e 4c     if( pOpen->nL
157b0 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ock==0 ){.      
157c0 20 20 72 63 20 3d 20 63 6c 6f 73 65 50 65 6e 64    rc = closePend
157d0 69 6e 67 46 64 73 28 70 46 69 6c 65 29 3b 0a 20  ingFds(pFile);. 
157e0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
157f0 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65  .  unixLeaveMute
15800 78 28 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  x();.  if( rc==S
15810 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
15820 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20  pFile->locktype 
15830 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 7d 0a  = locktype;.  }.
15840 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
15850 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69  /*.** Close a fi
15860 6c 65 20 26 20 63 6c 65 61 6e 75 70 20 41 46 50  le & cleanup AFP
15870 20 73 70 65 63 69 66 69 63 20 6c 6f 63 6b 69 6e   specific lockin
15880 67 20 63 6f 6e 74 65 78 74 20 0a 2a 2f 0a 73 74  g context .*/.st
15890 61 74 69 63 20 69 6e 74 20 61 66 70 43 6c 6f 73  atic int afpClos
158a0 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
158b0 69 64 29 20 7b 0a 20 20 69 66 28 20 69 64 20 29  id) {.  if( id )
158c0 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a  {.    unixFile *
158d0 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
158e0 65 2a 29 69 64 3b 0a 20 20 20 20 61 66 70 55 6e  e*)id;.    afpUn
158f0 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b  lock(id, NO_LOCK
15900 29 3b 0a 20 20 20 20 75 6e 69 78 45 6e 74 65 72  );.    unixEnter
15910 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 69 66 28  Mutex();.    if(
15920 20 70 46 69 6c 65 2d 3e 70 4f 70 65 6e 20 26 26   pFile->pOpen &&
15930 20 70 46 69 6c 65 2d 3e 70 4f 70 65 6e 2d 3e 6e   pFile->pOpen->n
15940 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Lock ){.      /*
15950 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6f 75   If there are ou
15960 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 2c  tstanding locks,
15970 20 64 6f 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79   do not actually
15980 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20   close the file 
15990 6a 75 73 74 0a 20 20 20 20 20 20 2a 2a 20 79 65  just.      ** ye
159a0 74 20 62 65 63 61 75 73 65 20 74 68 61 74 20 77  t because that w
159b0 6f 75 6c 64 20 63 6c 65 61 72 20 74 68 6f 73 65  ould clear those
159c0 20 6c 6f 63 6b 73 2e 20 20 49 6e 73 74 65 61 64   locks.  Instead
159d0 2c 20 61 64 64 20 74 68 65 20 66 69 6c 65 0a 20  , add the file. 
159e0 20 20 20 20 20 2a 2a 20 64 65 73 63 72 69 70 74       ** descript
159f0 6f 72 20 74 6f 20 70 4f 70 65 6e 2d 3e 61 50 65  or to pOpen->aPe
15a00 6e 64 69 6e 67 2e 20 20 49 74 20 77 69 6c 6c 20  nding.  It will 
15a10 62 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  be automatically
15a20 20 63 6c 6f 73 65 64 20 77 68 65 6e 0a 20 20 20   closed when.   
15a30 20 20 20 2a 2a 20 74 68 65 20 6c 61 73 74 20 6c     ** the last l
15a40 6f 63 6b 20 69 73 20 63 6c 65 61 72 65 64 2e 0a  ock is cleared..
15a50 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
15a60 65 74 50 65 6e 64 69 6e 67 46 64 28 70 46 69 6c  etPendingFd(pFil
15a70 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  e);.    }.    re
15a80 6c 65 61 73 65 4f 70 65 6e 43 6e 74 28 70 46 69  leaseOpenCnt(pFi
15a90 6c 65 2d 3e 70 4f 70 65 6e 29 3b 0a 20 20 20 20  le->pOpen);.    
15aa0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 46 69  sqlite3_free(pFi
15ab0 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
15ac0 78 74 29 3b 0a 20 20 20 20 63 6c 6f 73 65 55 6e  xt);.    closeUn
15ad0 69 78 46 69 6c 65 28 69 64 29 3b 0a 20 20 20 20  ixFile(id);.    
15ae0 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
15af0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
15b00 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e  QLITE_OK;.}..#en
15b10 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f  dif /* defined(_
15b20 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c  _APPLE__) && SQL
15b30 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
15b40 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 2f 2a 0a 2a  NG_STYLE */./*.*
15b50 2a 20 54 68 65 20 63 6f 64 65 20 61 62 6f 76 65  * The code above
15b60 20 69 73 20 74 68 65 20 41 46 50 20 6c 6f 63 6b   is the AFP lock
15b70 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e   implementation.
15b80 20 20 54 68 65 20 63 6f 64 65 20 69 73 20 73 70    The code is sp
15b90 65 63 69 66 69 63 0a 2a 2a 20 74 6f 20 4d 61 63  ecific.** to Mac
15ba0 4f 53 58 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74  OSX and does not
15bb0 20 77 6f 72 6b 20 6f 6e 20 6f 74 68 65 72 20 75   work on other u
15bc0 6e 69 78 20 70 6c 61 74 66 6f 72 6d 73 2e 20 20  nix platforms.  
15bd0 4e 6f 20 61 6c 74 65 72 6e 61 74 69 76 65 0a 2a  No alternative.*
15be0 2a 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 20  * is available. 
15bf0 20 49 66 20 79 6f 75 20 64 6f 6e 27 74 20 63 6f   If you don't co
15c00 6d 70 69 6c 65 20 66 6f 72 20 61 20 6d 61 63 2c  mpile for a mac,
15c10 20 74 68 65 6e 20 74 68 65 20 22 75 6e 69 78 2d   then the "unix-
15c20 61 66 70 22 0a 2a 2a 20 56 46 53 20 69 73 20 6e  afp".** VFS is n
15c30 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a  ot available..**
15c40 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
15c50 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68  ****** End of th
15c60 65 20 41 46 50 20 6c 6f 63 6b 20 69 6d 70 6c 65  e AFP lock imple
15c70 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a  mentation ******
15c80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15c90 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
15ca0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15cb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15cc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15cd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
15ce0 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .../************
15cf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15d00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15d10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15d20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15d30 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
15d40 2a 2a 2a 20 4e 6f 6e 2d 6c 6f 63 6b 69 6e 67 20  *** Non-locking 
15d50 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 6d 65 74  sqlite3_file met
15d60 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  hods ***********
15d70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15d80 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 78  **.**.** The nex
15d90 74 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74 61  t division conta
15da0 69 6e 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ins implementati
15db0 6f 6e 73 20 66 6f 72 20 61 6c 6c 20 6d 65 74 68  ons for all meth
15dc0 6f 64 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20 73  ods of the .** s
15dd0 71 6c 69 74 65 33 5f 66 69 6c 65 20 6f 62 6a 65  qlite3_file obje
15de0 63 74 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68  ct other than th
15df0 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64  e locking method
15e00 73 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 0a  s.  The locking.
15e10 2a 2a 20 6d 65 74 68 6f 64 73 20 77 65 72 65 20  ** methods were 
15e20 64 65 66 69 6e 65 64 20 69 6e 20 64 69 76 69 73  defined in divis
15e30 69 6f 6e 73 20 61 62 6f 76 65 20 28 6f 6e 65 20  ions above (one 
15e40 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 20 70  locking method p
15e50 65 72 0a 2a 2a 20 64 69 76 69 73 69 6f 6e 29 2e  er.** division).
15e60 20 20 54 68 6f 73 65 20 6d 65 74 68 6f 64 73 20    Those methods 
15e70 74 68 61 74 20 61 72 65 20 63 6f 6d 6d 6f 6e 20  that are common 
15e80 74 6f 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6d  to all locking m
15e90 6f 64 65 73 0a 2a 2a 20 61 72 65 20 67 61 74 68  odes.** are gath
15ea0 65 72 20 74 6f 67 65 74 68 65 72 20 69 6e 74 6f  er together into
15eb0 20 74 68 69 73 20 64 69 76 69 73 69 6f 6e 2e 0a   this division..
15ec0 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74  */../*.** Seek t
15ed0 6f 20 74 68 65 20 6f 66 66 73 65 74 20 70 61 73  o the offset pas
15ee0 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
15ef0 64 20 61 72 67 75 6d 65 6e 74 2c 20 74 68 65 6e  d argument, then
15f00 20 72 65 61 64 20 63 6e 74 20 0a 2a 2a 20 62 79   read cnt .** by
15f10 74 65 73 20 69 6e 74 6f 20 70 42 75 66 2e 20 52  tes into pBuf. R
15f20 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
15f30 20 6f 66 20 62 79 74 65 73 20 61 63 74 75 61 6c   of bytes actual
15f40 6c 79 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 4e  ly read..**.** N
15f50 42 3a 20 20 49 66 20 79 6f 75 20 64 65 66 69 6e  B:  If you defin
15f60 65 20 55 53 45 5f 50 52 45 41 44 20 6f 72 20 55  e USE_PREAD or U
15f70 53 45 5f 50 52 45 41 44 36 34 2c 20 74 68 65 6e  SE_PREAD64, then
15f80 20 69 74 20 6d 69 67 68 74 20 61 6c 73 6f 0a 2a   it might also.*
15f90 2a 20 62 65 20 6e 65 63 65 73 73 61 72 79 20 74  * be necessary t
15fa0 6f 20 64 65 66 69 6e 65 20 5f 58 4f 50 45 4e 5f  o define _XOPEN_
15fb0 53 4f 55 52 43 45 20 74 6f 20 62 65 20 35 30 30  SOURCE to be 500
15fc0 2e 20 20 54 68 69 73 20 76 61 72 69 65 73 20 66  .  This varies f
15fd0 72 6f 6d 0a 2a 2a 20 6f 6e 65 20 73 79 73 74 65  rom.** one syste
15fe0 6d 20 74 6f 20 61 6e 6f 74 68 65 72 2e 20 20 53  m to another.  S
15ff0 69 6e 63 65 20 53 51 4c 69 74 65 20 64 6f 65 73  ince SQLite does
16000 20 6e 6f 74 20 64 65 66 69 6e 65 20 55 53 45 5f   not define USE_
16010 50 52 45 41 44 0a 2a 2a 20 61 6e 79 20 61 6e 79  PREAD.** any any
16020 20 66 6f 72 6d 20 62 79 20 64 65 66 61 75 6c 74   form by default
16030 2c 20 77 65 20 77 69 6c 6c 20 6e 6f 74 20 61 74  , we will not at
16040 74 65 6d 70 74 20 74 6f 20 64 65 66 69 6e 65 20  tempt to define 
16050 5f 58 4f 50 45 4e 5f 53 4f 55 52 43 45 2e 0a 2a  _XOPEN_SOURCE..*
16060 2a 20 53 65 65 20 74 69 63 6b 65 74 73 20 23 32  * See tickets #2
16070 37 34 31 20 61 6e 64 20 23 32 36 38 31 2e 0a 2a  741 and #2681..*
16080 2a 0a 2a 2a 20 54 6f 20 61 76 6f 69 64 20 73 74  *.** To avoid st
16090 6f 6d 70 69 6e 67 20 74 68 65 20 65 72 72 6e 6f  omping the errno
160a0 20 76 61 6c 75 65 20 6f 6e 20 61 20 66 61 69 6c   value on a fail
160b0 65 64 20 72 65 61 64 20 74 68 65 20 6c 61 73 74  ed read the last
160c0 45 72 72 6e 6f 20 76 61 6c 75 65 0a 2a 2a 20 69  Errno value.** i
160d0 73 20 73 65 74 20 62 65 66 6f 72 65 20 72 65 74  s set before ret
160e0 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  urning..*/.stati
160f0 63 20 69 6e 74 20 73 65 65 6b 41 6e 64 52 65 61  c int seekAndRea
16100 64 28 75 6e 69 78 46 69 6c 65 20 2a 69 64 2c 20  d(unixFile *id, 
16110 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66  sqlite3_int64 of
16120 66 73 65 74 2c 20 76 6f 69 64 20 2a 70 42 75 66  fset, void *pBuf
16130 2c 20 69 6e 74 20 63 6e 74 29 7b 0a 20 20 69 6e  , int cnt){.  in
16140 74 20 67 6f 74 3b 0a 20 20 69 36 34 20 6e 65 77  t got;.  i64 new
16150 4f 66 66 73 65 74 3b 0a 20 20 54 49 4d 45 52 5f  Offset;.  TIMER_
16160 53 54 41 52 54 3b 0a 23 69 66 20 64 65 66 69 6e  START;.#if defin
16170 65 64 28 55 53 45 5f 50 52 45 41 44 29 0a 20 20  ed(USE_PREAD).  
16180 67 6f 74 20 3d 20 70 72 65 61 64 28 69 64 2d 3e  got = pread(id->
16190 68 2c 20 70 42 75 66 2c 20 63 6e 74 2c 20 6f 66  h, pBuf, cnt, of
161a0 66 73 65 74 29 3b 0a 20 20 53 69 6d 75 6c 61 74  fset);.  Simulat
161b0 65 49 4f 45 72 72 6f 72 28 20 67 6f 74 20 3d 20  eIOError( got = 
161c0 2d 31 20 29 3b 0a 23 65 6c 69 66 20 64 65 66 69  -1 );.#elif defi
161d0 6e 65 64 28 55 53 45 5f 50 52 45 41 44 36 34 29  ned(USE_PREAD64)
161e0 0a 20 20 67 6f 74 20 3d 20 70 72 65 61 64 36 34  .  got = pread64
161f0 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e  (id->h, pBuf, cn
16200 74 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 53 69  t, offset);.  Si
16210 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 67  mulateIOError( g
16220 6f 74 20 3d 20 2d 31 20 29 3b 0a 23 65 6c 73 65  ot = -1 );.#else
16230 0a 20 20 6e 65 77 4f 66 66 73 65 74 20 3d 20 6c  .  newOffset = l
16240 73 65 65 6b 28 69 64 2d 3e 68 2c 20 6f 66 66 73  seek(id->h, offs
16250 65 74 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20  et, SEEK_SET);. 
16260 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
16270 28 20 6e 65 77 4f 66 66 73 65 74 2d 2d 20 29 3b  ( newOffset-- );
16280 0a 20 20 69 66 28 20 6e 65 77 4f 66 66 73 65 74  .  if( newOffset
16290 21 3d 6f 66 66 73 65 74 20 29 7b 0a 20 20 20 20  !=offset ){.    
162a0 69 66 28 20 6e 65 77 4f 66 66 73 65 74 20 3d 3d  if( newOffset ==
162b0 20 2d 31 20 29 7b 0a 20 20 20 20 20 20 28 28 75   -1 ){.      ((u
162c0 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61  nixFile*)id)->la
162d0 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b  stErrno = errno;
162e0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
162f0 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64    ((unixFile*)id
16300 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30  )->lastErrno = 0
16310 3b 09 09 09 0a 20 20 20 20 7d 0a 20 20 20 20 72  ;....    }.    r
16320 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20 20  eturn -1;.  }.  
16330 67 6f 74 20 3d 20 72 65 61 64 28 69 64 2d 3e 68  got = read(id->h
16340 2c 20 70 42 75 66 2c 20 63 6e 74 29 3b 0a 23 65  , pBuf, cnt);.#e
16350 6e 64 69 66 0a 20 20 54 49 4d 45 52 5f 45 4e 44  ndif.  TIMER_END
16360 3b 0a 20 20 69 66 28 20 67 6f 74 3c 30 20 29 7b  ;.  if( got<0 ){
16370 0a 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a  .    ((unixFile*
16380 29 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  )id)->lastErrno 
16390 3d 20 65 72 72 6e 6f 3b 0a 20 20 7d 0a 20 20 4f  = errno;.  }.  O
163a0 53 54 52 41 43 45 35 28 22 52 45 41 44 20 20 20  STRACE5("READ   
163b0 20 25 2d 33 64 20 25 35 64 20 25 37 6c 6c 64 20   %-3d %5d %7lld 
163c0 25 6c 6c 75 5c 6e 22 2c 20 69 64 2d 3e 68 2c 20  %llu\n", id->h, 
163d0 67 6f 74 2c 20 6f 66 66 73 65 74 2c 20 54 49 4d  got, offset, TIM
163e0 45 52 5f 45 4c 41 50 53 45 44 29 3b 0a 20 20 72  ER_ELAPSED);.  r
163f0 65 74 75 72 6e 20 67 6f 74 3b 0a 7d 0a 0a 2f 2a  eturn got;.}../*
16400 0a 2a 2a 20 52 65 61 64 20 64 61 74 61 20 66 72  .** Read data fr
16410 6f 6d 20 61 20 66 69 6c 65 20 69 6e 74 6f 20 61  om a file into a
16420 20 62 75 66 66 65 72 2e 20 20 52 65 74 75 72 6e   buffer.  Return
16430 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 61 6c   SQLITE_OK if al
16440 6c 0a 2a 2a 20 62 79 74 65 73 20 77 65 72 65 20  l.** bytes were 
16450 72 65 61 64 20 73 75 63 63 65 73 73 66 75 6c 6c  read successfull
16460 79 20 61 6e 64 20 53 51 4c 49 54 45 5f 49 4f 45  y and SQLITE_IOE
16470 52 52 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67  RR if anything g
16480 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 0a 2a 2f  oes.** wrong..*/
16490 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
164a0 52 65 61 64 28 0a 20 20 73 71 6c 69 74 65 33 5f  Read(.  sqlite3_
164b0 66 69 6c 65 20 2a 69 64 2c 20 0a 20 20 76 6f 69  file *id, .  voi
164c0 64 20 2a 70 42 75 66 2c 20 0a 20 20 69 6e 74 20  d *pBuf, .  int 
164d0 61 6d 74 2c 0a 20 20 73 71 6c 69 74 65 33 5f 69  amt,.  sqlite3_i
164e0 6e 74 36 34 20 6f 66 66 73 65 74 0a 29 7b 0a 20  nt64 offset.){. 
164f0 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
16500 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 69   = (unixFile *)i
16510 64 3b 0a 20 20 69 6e 74 20 67 6f 74 3b 0a 20 20  d;.  int got;.  
16520 61 73 73 65 72 74 28 20 69 64 20 29 3b 0a 0a 20  assert( id );.. 
16530 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
16540 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28   database file (
16550 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 2c 20 6d  not a journal, m
16560 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6f 72  aster-journal or
16570 20 74 65 6d 70 0a 20 20 2a 2a 20 66 69 6c 65 29   temp.  ** file)
16580 2c 20 74 68 65 20 62 79 74 65 73 20 69 6e 20 74  , the bytes in t
16590 68 65 20 6c 6f 63 6b 69 6e 67 20 72 61 6e 67 65  he locking range
165a0 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 62 65   should never be
165b0 20 72 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e   read or written
165c0 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  . */.  assert( p
165d0 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64 3d 3d 30  File->pUnused==0
165e0 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66 66 73 65  .       || offse
165f0 74 3e 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 2b  t>=PENDING_BYTE+
16600 35 31 32 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66  512.       || of
16610 66 73 65 74 2b 61 6d 74 3c 3d 50 45 4e 44 49 4e  fset+amt<=PENDIN
16620 47 5f 42 59 54 45 20 0a 20 20 29 3b 0a 0a 20 20  G_BYTE .  );..  
16630 67 6f 74 20 3d 20 73 65 65 6b 41 6e 64 52 65 61  got = seekAndRea
16640 64 28 70 46 69 6c 65 2c 20 6f 66 66 73 65 74 2c  d(pFile, offset,
16650 20 70 42 75 66 2c 20 61 6d 74 29 3b 0a 20 20 69   pBuf, amt);.  i
16660 66 28 20 67 6f 74 3d 3d 61 6d 74 20 29 7b 0a 20  f( got==amt ){. 
16670 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
16680 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  _OK;.  }else if(
16690 20 67 6f 74 3c 30 20 29 7b 0a 20 20 20 20 2f 2a   got<0 ){.    /*
166a0 20 6c 61 73 74 45 72 72 6e 6f 20 73 65 74 20 62   lastErrno set b
166b0 79 20 73 65 65 6b 41 6e 64 52 65 61 64 20 2a 2f  y seekAndRead */
166c0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
166d0 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 3b 0a 20  TE_IOERR_READ;. 
166e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46 69 6c   }else{.    pFil
166f0 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30  e->lastErrno = 0
16700 3b 20 2f 2a 20 6e 6f 74 20 61 20 73 79 73 74 65  ; /* not a syste
16710 6d 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 2f  m error */.    /
16720 2a 20 55 6e 72 65 61 64 20 70 61 72 74 73 20 6f  * Unread parts o
16730 66 20 74 68 65 20 62 75 66 66 65 72 20 6d 75 73  f the buffer mus
16740 74 20 62 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64  t be zero-filled
16750 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26   */.    memset(&
16760 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b 67 6f  ((char*)pBuf)[go
16770 74 5d 2c 20 30 2c 20 61 6d 74 2d 67 6f 74 29 3b  t], 0, amt-got);
16780 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
16790 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52  TE_IOERR_SHORT_R
167a0 45 41 44 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  EAD;.  }.}../*.*
167b0 2a 20 53 65 65 6b 20 74 6f 20 74 68 65 20 6f 66  * Seek to the of
167c0 66 73 65 74 20 69 6e 20 69 64 2d 3e 6f 66 66 73  fset in id->offs
167d0 65 74 20 74 68 65 6e 20 72 65 61 64 20 63 6e 74  et then read cnt
167e0 20 62 79 74 65 73 20 69 6e 74 6f 20 70 42 75 66   bytes into pBuf
167f0 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  ..** Return the 
16800 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
16810 61 63 74 75 61 6c 6c 79 20 72 65 61 64 2e 20 20  actually read.  
16820 55 70 64 61 74 65 20 74 68 65 20 6f 66 66 73 65  Update the offse
16830 74 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 76 6f 69  t..**.** To avoi
16840 64 20 73 74 6f 6d 70 69 6e 67 20 74 68 65 20 65  d stomping the e
16850 72 72 6e 6f 20 76 61 6c 75 65 20 6f 6e 20 61 20  rrno value on a 
16860 66 61 69 6c 65 64 20 77 72 69 74 65 20 74 68 65  failed write the
16870 20 6c 61 73 74 45 72 72 6e 6f 20 76 61 6c 75 65   lastErrno value
16880 0a 2a 2a 20 69 73 20 73 65 74 20 62 65 66 6f 72  .** is set befor
16890 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a  e returning..*/.
168a0 73 74 61 74 69 63 20 69 6e 74 20 73 65 65 6b 41  static int seekA
168b0 6e 64 57 72 69 74 65 28 75 6e 69 78 46 69 6c 65  ndWrite(unixFile
168c0 20 2a 69 64 2c 20 69 36 34 20 6f 66 66 73 65 74   *id, i64 offset
168d0 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42  , const void *pB
168e0 75 66 2c 20 69 6e 74 20 63 6e 74 29 7b 0a 20 20  uf, int cnt){.  
168f0 69 6e 74 20 67 6f 74 3b 0a 20 20 69 36 34 20 6e  int got;.  i64 n
16900 65 77 4f 66 66 73 65 74 3b 0a 20 20 54 49 4d 45  ewOffset;.  TIME
16910 52 5f 53 54 41 52 54 3b 0a 23 69 66 20 64 65 66  R_START;.#if def
16920 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29 0a  ined(USE_PREAD).
16930 20 20 67 6f 74 20 3d 20 70 77 72 69 74 65 28 69    got = pwrite(i
16940 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 2c  d->h, pBuf, cnt,
16950 20 6f 66 66 73 65 74 29 3b 0a 23 65 6c 69 66 20   offset);.#elif 
16960 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41  defined(USE_PREA
16970 44 36 34 29 0a 20 20 67 6f 74 20 3d 20 70 77 72  D64).  got = pwr
16980 69 74 65 36 34 28 69 64 2d 3e 68 2c 20 70 42 75  ite64(id->h, pBu
16990 66 2c 20 63 6e 74 2c 20 6f 66 66 73 65 74 29 3b  f, cnt, offset);
169a0 0a 23 65 6c 73 65 0a 20 20 6e 65 77 4f 66 66 73  .#else.  newOffs
169b0 65 74 20 3d 20 6c 73 65 65 6b 28 69 64 2d 3e 68  et = lseek(id->h
169c0 2c 20 6f 66 66 73 65 74 2c 20 53 45 45 4b 5f 53  , offset, SEEK_S
169d0 45 54 29 3b 0a 20 20 69 66 28 20 6e 65 77 4f 66  ET);.  if( newOf
169e0 66 73 65 74 21 3d 6f 66 66 73 65 74 20 29 7b 0a  fset!=offset ){.
169f0 20 20 20 20 69 66 28 20 6e 65 77 4f 66 66 73 65      if( newOffse
16a00 74 20 3d 3d 20 2d 31 20 29 7b 0a 20 20 20 20 20  t == -1 ){.     
16a10 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29   ((unixFile*)id)
16a20 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72  ->lastErrno = er
16a30 72 6e 6f 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  rno;.    }else{.
16a40 20 20 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65        ((unixFile
16a50 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f  *)id)->lastErrno
16a60 20 3d 20 30 3b 09 09 09 0a 20 20 20 20 7d 0a 20   = 0;....    }. 
16a70 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20     return -1;.  
16a80 7d 0a 20 20 67 6f 74 20 3d 20 77 72 69 74 65 28  }.  got = write(
16a90 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74  id->h, pBuf, cnt
16aa0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 54 49 4d 45  );.#endif.  TIME
16ab0 52 5f 45 4e 44 3b 0a 20 20 69 66 28 20 67 6f 74  R_END;.  if( got
16ac0 3c 30 20 29 7b 0a 20 20 20 20 28 28 75 6e 69 78  <0 ){.    ((unix
16ad0 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45  File*)id)->lastE
16ae0 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
16af0 7d 0a 0a 20 20 4f 53 54 52 41 43 45 35 28 22 57  }..  OSTRACE5("W
16b00 52 49 54 45 20 20 20 25 2d 33 64 20 25 35 64 20  RITE   %-3d %5d 
16b10 25 37 6c 6c 64 20 25 6c 6c 75 5c 6e 22 2c 20 69  %7lld %llu\n", i
16b20 64 2d 3e 68 2c 20 67 6f 74 2c 20 6f 66 66 73 65  d->h, got, offse
16b30 74 2c 20 54 49 4d 45 52 5f 45 4c 41 50 53 45 44  t, TIMER_ELAPSED
16b40 29 3b 0a 20 20 72 65 74 75 72 6e 20 67 6f 74 3b  );.  return got;
16b50 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  .}.../*.** Write
16b60 20 64 61 74 61 20 66 72 6f 6d 20 61 20 62 75 66   data from a buf
16b70 66 65 72 20 69 6e 74 6f 20 61 20 66 69 6c 65 2e  fer into a file.
16b80 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
16b90 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 0a 2a 2a  OK on success.**
16ba0 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 65   or some other e
16bb0 72 72 6f 72 20 63 6f 64 65 20 6f 6e 20 66 61 69  rror code on fai
16bc0 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lure..*/.static 
16bd0 69 6e 74 20 75 6e 69 78 57 72 69 74 65 28 0a 20  int unixWrite(. 
16be0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69   sqlite3_file *i
16bf0 64 2c 20 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64  d, .  const void
16c00 20 2a 70 42 75 66 2c 20 0a 20 20 69 6e 74 20 61   *pBuf, .  int a
16c10 6d 74 2c 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  mt,.  sqlite3_in
16c20 74 36 34 20 6f 66 66 73 65 74 20 0a 29 7b 0a 20  t64 offset .){. 
16c30 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
16c40 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
16c50 3b 0a 20 20 69 6e 74 20 77 72 6f 74 65 20 3d 20  ;.  int wrote = 
16c60 30 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 20  0;.  assert( id 
16c70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 6d 74  );.  assert( amt
16c80 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  >0 );..  /* If t
16c90 68 69 73 20 69 73 20 61 20 64 61 74 61 62 61 73  his is a databas
16ca0 65 20 66 69 6c 65 20 28 6e 6f 74 20 61 20 6a 6f  e file (not a jo
16cb0 75 72 6e 61 6c 2c 20 6d 61 73 74 65 72 2d 6a 6f  urnal, master-jo
16cc0 75 72 6e 61 6c 20 6f 72 20 74 65 6d 70 0a 20 20  urnal or temp.  
16cd0 2a 2a 20 66 69 6c 65 29 2c 20 74 68 65 20 62 79  ** file), the by
16ce0 74 65 73 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69  tes in the locki
16cf0 6e 67 20 72 61 6e 67 65 20 73 68 6f 75 6c 64 20  ng range should 
16d00 6e 65 76 65 72 20 62 65 20 72 65 61 64 20 6f 72  never be read or
16d10 20 77 72 69 74 74 65 6e 2e 20 2a 2f 0a 20 20 61   written. */.  a
16d20 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 70 55  ssert( pFile->pU
16d30 6e 75 73 65 64 3d 3d 30 0a 20 20 20 20 20 20 20  nused==0.       
16d40 7c 7c 20 6f 66 66 73 65 74 3e 3d 50 45 4e 44 49  || offset>=PENDI
16d50 4e 47 5f 42 59 54 45 2b 35 31 32 0a 20 20 20 20  NG_BYTE+512.    
16d60 20 20 20 7c 7c 20 6f 66 66 73 65 74 2b 61 6d 74     || offset+amt
16d70 3c 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 0a  <=PENDING_BYTE .
16d80 20 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 4e 44    );..#ifndef ND
16d90 45 42 55 47 0a 20 20 2f 2a 20 49 66 20 77 65 20  EBUG.  /* If we 
16da0 61 72 65 20 64 6f 69 6e 67 20 61 20 6e 6f 72 6d  are doing a norm
16db0 61 6c 20 77 72 69 74 65 20 74 6f 20 61 20 64 61  al write to a da
16dc0 74 61 62 61 73 65 20 66 69 6c 65 20 28 61 73 20  tabase file (as 
16dd0 6f 70 70 6f 73 65 64 20 74 6f 0a 20 20 2a 2a 20  opposed to.  ** 
16de0 64 6f 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72  doing a hot-jour
16df0 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20  nal rollback or 
16e00 61 20 77 72 69 74 65 20 74 6f 20 73 6f 6d 65 20  a write to some 
16e10 66 69 6c 65 20 6f 74 68 65 72 20 74 68 61 6e 20  file other than 
16e20 61 0a 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20 64 61  a.  ** normal da
16e30 74 61 62 61 73 65 20 66 69 6c 65 29 20 74 68 65  tabase file) the
16e40 6e 20 72 65 63 6f 72 64 20 74 68 65 20 66 61 63  n record the fac
16e50 74 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62  t that the datab
16e60 61 73 65 0a 20 20 2a 2a 20 68 61 73 20 63 68 61  ase.  ** has cha
16e70 6e 67 65 64 2e 20 20 49 66 20 74 68 65 20 74 72  nged.  If the tr
16e80 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65  ansaction counte
16e90 72 20 69 73 20 6d 6f 64 69 66 69 65 64 2c 20 72  r is modified, r
16ea0 65 63 6f 72 64 20 74 68 61 74 0a 20 20 2a 2a 20  ecord that.  ** 
16eb0 66 61 63 74 20 74 6f 6f 2e 0a 20 20 2a 2f 0a 20  fact too..  */. 
16ec0 20 69 66 28 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f   if( pFile->inNo
16ed0 72 6d 61 6c 57 72 69 74 65 20 29 7b 0a 20 20 20  rmalWrite ){.   
16ee0 20 70 46 69 6c 65 2d 3e 64 62 55 70 64 61 74 65   pFile->dbUpdate
16ef0 20 3d 20 31 3b 20 20 2f 2a 20 54 68 65 20 64 61   = 1;  /* The da
16f00 74 61 62 61 73 65 20 68 61 73 20 62 65 65 6e 20  tabase has been 
16f10 6d 6f 64 69 66 69 65 64 20 2a 2f 0a 20 20 20 20  modified */.    
16f20 69 66 28 20 6f 66 66 73 65 74 3c 3d 32 34 20 26  if( offset<=24 &
16f30 26 20 6f 66 66 73 65 74 2b 61 6d 74 3e 3d 32 37  & offset+amt>=27
16f40 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63   ){.      int rc
16f50 3b 0a 20 20 20 20 20 20 63 68 61 72 20 6f 6c 64  ;.      char old
16f60 43 6e 74 72 5b 34 5d 3b 0a 20 20 20 20 20 20 53  Cntr[4];.      S
16f70 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65  imulateIOErrorBe
16f80 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 72  nign(1);.      r
16f90 63 20 3d 20 73 65 65 6b 41 6e 64 52 65 61 64 28  c = seekAndRead(
16fa0 70 46 69 6c 65 2c 20 32 34 2c 20 6f 6c 64 43 6e  pFile, 24, oldCn
16fb0 74 72 2c 20 34 29 3b 0a 20 20 20 20 20 20 53 69  tr, 4);.      Si
16fc0 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
16fd0 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 69 66  ign(0);.      if
16fe0 28 20 72 63 21 3d 34 20 7c 7c 20 6d 65 6d 63 6d  ( rc!=4 || memcm
16ff0 70 28 6f 6c 64 43 6e 74 72 2c 20 26 28 28 63 68  p(oldCntr, &((ch
17000 61 72 2a 29 70 42 75 66 29 5b 32 34 2d 6f 66 66  ar*)pBuf)[24-off
17010 73 65 74 5d 2c 20 34 29 21 3d 30 20 29 7b 0a 20  set], 4)!=0 ){. 
17020 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 74 72         pFile->tr
17030 61 6e 73 43 6e 74 72 43 68 6e 67 20 3d 20 31 3b  ansCntrChng = 1;
17040 20 20 2f 2a 20 54 68 65 20 74 72 61 6e 73 61 63    /* The transac
17050 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 68 61 73  tion counter has
17060 20 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20 20 20   changed */.    
17070 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65    }.    }.  }.#e
17080 6e 64 69 66 0a 0a 20 20 77 68 69 6c 65 28 20 61  ndif..  while( a
17090 6d 74 3e 30 20 26 26 20 28 77 72 6f 74 65 20 3d  mt>0 && (wrote =
170a0 20 73 65 65 6b 41 6e 64 57 72 69 74 65 28 70 46   seekAndWrite(pF
170b0 69 6c 65 2c 20 6f 66 66 73 65 74 2c 20 70 42 75  ile, offset, pBu
170c0 66 2c 20 61 6d 74 29 29 3e 30 20 29 7b 0a 20 20  f, amt))>0 ){.  
170d0 20 20 61 6d 74 20 2d 3d 20 77 72 6f 74 65 3b 0a    amt -= wrote;.
170e0 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 77 72      offset += wr
170f0 6f 74 65 3b 0a 20 20 20 20 70 42 75 66 20 3d 20  ote;.    pBuf = 
17100 26 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b 77  &((char*)pBuf)[w
17110 72 6f 74 65 5d 3b 0a 20 20 7d 0a 20 20 53 69 6d  rote];.  }.  Sim
17120 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 28 20 77  ulateIOError(( w
17130 72 6f 74 65 3d 28 2d 31 29 2c 20 61 6d 74 3d 31  rote=(-1), amt=1
17140 20 29 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 44   ));.  SimulateD
17150 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28 28 20 77  iskfullError(( w
17160 72 6f 74 65 3d 30 2c 20 61 6d 74 3d 31 20 29 29  rote=0, amt=1 ))
17170 3b 0a 20 20 69 66 28 20 61 6d 74 3e 30 20 29 7b  ;.  if( amt>0 ){
17180 0a 20 20 20 20 69 66 28 20 77 72 6f 74 65 3c 30  .    if( wrote<0
17190 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6c 61 73   ){.      /* las
171a0 74 45 72 72 6e 6f 20 73 65 74 20 62 79 20 73 65  tErrno set by se
171b0 65 6b 41 6e 64 57 72 69 74 65 20 2a 2f 0a 20 20  ekAndWrite */.  
171c0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
171d0 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b 0a 20  E_IOERR_WRITE;. 
171e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
171f0 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
17200 20 3d 20 30 3b 20 2f 2a 20 6e 6f 74 20 61 20 73   = 0; /* not a s
17210 79 73 74 65 6d 20 65 72 72 6f 72 20 2a 2f 0a 20  ystem error */. 
17220 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
17230 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20  TE_FULL;.    }. 
17240 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
17250 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66  TE_OK;.}..#ifdef
17260 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a   SQLITE_TEST./*.
17270 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d  ** Count the num
17280 62 65 72 20 6f 66 20 66 75 6c 6c 73 79 6e 63 73  ber of fullsyncs
17290 20 61 6e 64 20 6e 6f 72 6d 61 6c 20 73 79 6e 63   and normal sync
172a0 73 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64  s.  This is used
172b0 20 74 6f 20 74 65 73 74 0a 2a 2a 20 74 68 61 74   to test.** that
172c0 20 73 79 6e 63 73 20 61 6e 64 20 66 75 6c 6c 73   syncs and fulls
172d0 79 6e 63 73 20 61 72 65 20 6f 63 63 75 72 72 69  yncs are occurri
172e0 6e 67 20 61 74 20 74 68 65 20 72 69 67 68 74 20  ng at the right 
172f0 74 69 6d 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  times..*/.int sq
17300 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74  lite3_sync_count
17310 20 3d 20 30 3b 0a 69 6e 74 20 73 71 6c 69 74 65   = 0;.int sqlite
17320 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74  3_fullsync_count
17330 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a   = 0;.#endif../*
17340 0a 2a 2a 20 57 65 20 64 6f 20 6e 6f 74 20 74 72  .** We do not tr
17350 75 73 74 20 73 79 73 74 65 6d 73 20 74 6f 20 70  ust systems to p
17360 72 6f 76 69 64 65 20 61 20 77 6f 72 6b 69 6e 67  rovide a working
17370 20 66 64 61 74 61 73 79 6e 63 28 29 2e 20 20 53   fdatasync().  S
17380 6f 6d 65 20 64 6f 2e 0a 2a 2a 20 4f 74 68 65 72  ome do..** Other
17390 73 20 64 6f 20 6e 6f 2e 20 20 54 6f 20 62 65 20  s do no.  To be 
173a0 73 61 66 65 2c 20 77 65 20 77 69 6c 6c 20 73 74  safe, we will st
173b0 69 63 6b 20 77 69 74 68 20 74 68 65 20 28 73 6c  ick with the (sl
173c0 6f 77 65 72 29 20 66 73 79 6e 63 28 29 2e 0a 2a  ower) fsync()..*
173d0 2a 20 49 66 20 79 6f 75 20 6b 6e 6f 77 20 74 68  * If you know th
173e0 61 74 20 79 6f 75 72 20 73 79 73 74 65 6d 20 64  at your system d
173f0 6f 65 73 20 73 75 70 70 6f 72 74 20 66 64 61 74  oes support fdat
17400 61 73 79 6e 63 28 29 20 63 6f 72 72 65 63 74 6c  async() correctl
17410 79 2c 0a 2a 2a 20 74 68 65 6e 20 73 69 6d 70 6c  y,.** then simpl
17420 79 20 63 6f 6d 70 69 6c 65 20 77 69 74 68 20 2d  y compile with -
17430 44 66 64 61 74 61 73 79 6e 63 3d 66 64 61 74 61  Dfdatasync=fdata
17440 73 79 6e 63 0a 2a 2f 0a 23 69 66 20 21 64 65 66  sync.*/.#if !def
17450 69 6e 65 64 28 66 64 61 74 61 73 79 6e 63 29 20  ined(fdatasync) 
17460 26 26 20 21 64 65 66 69 6e 65 64 28 5f 5f 6c 69  && !defined(__li
17470 6e 75 78 5f 5f 29 0a 23 20 64 65 66 69 6e 65 20  nux__).# define 
17480 66 64 61 74 61 73 79 6e 63 20 66 73 79 6e 63 0a  fdatasync fsync.
17490 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65  #endif../*.** De
174a0 66 69 6e 65 20 48 41 56 45 5f 46 55 4c 4c 46 53  fine HAVE_FULLFS
174b0 59 4e 43 20 74 6f 20 30 20 6f 72 20 31 20 64 65  YNC to 0 or 1 de
174c0 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 68  pending on wheth
174d0 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20 74 68 65  er or not.** the
174e0 20 46 5f 46 55 4c 4c 46 53 59 4e 43 20 6d 61 63   F_FULLFSYNC mac
174f0 72 6f 20 69 73 20 64 65 66 69 6e 65 64 2e 20 20  ro is defined.  
17500 46 5f 46 55 4c 4c 46 53 59 4e 43 20 69 73 20 63  F_FULLFSYNC is c
17510 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 6f 6e 6c 79  urrently.** only
17520 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 4d 61   available on Ma
17530 63 20 4f 53 20 58 2e 20 20 42 75 74 20 74 68 61  c OS X.  But tha
17540 74 20 63 6f 75 6c 64 20 63 68 61 6e 67 65 2e 0a  t could change..
17550 2a 2f 0a 23 69 66 64 65 66 20 46 5f 46 55 4c 4c  */.#ifdef F_FULL
17560 46 53 59 4e 43 0a 23 20 64 65 66 69 6e 65 20 48  FSYNC.# define H
17570 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 31 0a  AVE_FULLFSYNC 1.
17580 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 48  #else.# define H
17590 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 30 0a  AVE_FULLFSYNC 0.
175a0 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54  #endif.../*.** T
175b0 68 65 20 66 73 79 6e 63 28 29 20 73 79 73 74 65  he fsync() syste
175c0 6d 20 63 61 6c 6c 20 64 6f 65 73 20 6e 6f 74 20  m call does not 
175d0 77 6f 72 6b 20 61 73 20 61 64 76 65 72 74 69 73  work as advertis
175e0 65 64 20 6f 6e 20 6d 61 6e 79 0a 2a 2a 20 75 6e  ed on many.** un
175f0 69 78 20 73 79 73 74 65 6d 73 2e 20 20 54 68 65  ix systems.  The
17600 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 72 6f 63 65   following proce
17610 64 75 72 65 20 69 73 20 61 6e 20 61 74 74 65 6d  dure is an attem
17620 70 74 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20 69 74  pt to make.** it
17630 20 77 6f 72 6b 20 62 65 74 74 65 72 2e 0a 2a 2a   work better..**
17640 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 4e  .** The SQLITE_N
17650 4f 5f 53 59 4e 43 20 6d 61 63 72 6f 20 64 69 73  O_SYNC macro dis
17660 61 62 6c 65 73 20 61 6c 6c 20 66 73 79 6e 63 28  ables all fsync(
17670 29 73 2e 20 20 54 68 69 73 20 69 73 20 75 73 65  )s.  This is use
17680 66 75 6c 0a 2a 2a 20 66 6f 72 20 74 65 73 74 69  ful.** for testi
17690 6e 67 20 77 68 65 6e 20 77 65 20 77 61 6e 74 20  ng when we want 
176a0 74 6f 20 72 75 6e 20 74 68 72 6f 75 67 68 20 74  to run through t
176b0 68 65 20 74 65 73 74 20 73 75 69 74 65 20 71 75  he test suite qu
176c0 69 63 6b 6c 79 2e 0a 2a 2a 20 59 6f 75 20 61 72  ickly..** You ar
176d0 65 20 73 74 72 6f 6e 67 6c 79 20 61 64 76 69 73  e strongly advis
176e0 65 64 20 2a 6e 6f 74 2a 20 74 6f 20 64 65 70 6c  ed *not* to depl
176f0 6f 79 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4e  oy with SQLITE_N
17700 4f 5f 53 59 4e 43 0a 2a 2a 20 65 6e 61 62 6c 65  O_SYNC.** enable
17710 64 2c 20 68 6f 77 65 76 65 72 2c 20 73 69 6e 63  d, however, sinc
17720 65 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4e 4f  e with SQLITE_NO
17730 5f 53 59 4e 43 20 65 6e 61 62 6c 65 64 2c 20 61  _SYNC enabled, a
17740 6e 20 4f 53 20 63 72 61 73 68 0a 2a 2a 20 6f 72  n OS crash.** or
17750 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 77   power failure w
17760 69 6c 6c 20 6c 69 6b 65 6c 79 20 63 6f 72 72 75  ill likely corru
17770 70 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  pt the database 
17780 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69  file..**.** SQLi
17790 74 65 20 73 65 74 73 20 74 68 65 20 64 61 74 61  te sets the data
177a0 4f 6e 6c 79 20 66 6c 61 67 20 69 66 20 74 68 65  Only flag if the
177b0 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c   size of the fil
177c0 65 20 69 73 20 75 6e 63 68 61 6e 67 65 64 2e 0a  e is unchanged..
177d0 2a 2a 20 54 68 65 20 69 64 65 61 20 62 65 68 69  ** The idea behi
177e0 6e 64 20 64 61 74 61 4f 6e 6c 79 20 69 73 20 74  nd dataOnly is t
177f0 68 61 74 20 69 74 20 73 68 6f 75 6c 64 20 6f 6e  hat it should on
17800 6c 79 20 77 72 69 74 65 20 74 68 65 20 66 69 6c  ly write the fil
17810 65 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20 74 6f 20  e content.** to 
17820 64 69 73 6b 2c 20 6e 6f 74 20 74 68 65 20 69 6e  disk, not the in
17830 6f 64 65 2e 20 20 57 65 20 6f 6e 6c 79 20 73 65  ode.  We only se
17840 74 20 64 61 74 61 4f 6e 6c 79 20 69 66 20 74 68  t dataOnly if th
17850 65 20 66 69 6c 65 20 73 69 7a 65 20 69 73 20 0a  e file size is .
17860 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20 73 69 6e  ** unchanged sin
17870 63 65 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65  ce the file size
17880 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   is part of the 
17890 69 6e 6f 64 65 2e 20 20 48 6f 77 65 76 65 72 2c  inode.  However,
178a0 20 0a 2a 2a 20 54 65 64 20 54 73 27 6f 20 74 65   .** Ted Ts'o te
178b0 6c 6c 73 20 75 73 20 74 68 61 74 20 66 64 61 74  lls us that fdat
178c0 61 73 79 6e 63 28 29 20 77 69 6c 6c 20 61 6c 73  async() will als
178d0 6f 20 77 72 69 74 65 20 74 68 65 20 69 6e 6f 64  o write the inod
178e0 65 20 69 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65  e if the.** file
178f0 20 73 69 7a 65 20 68 61 73 20 63 68 61 6e 67 65   size has change
17900 64 2e 20 20 54 68 65 20 6f 6e 6c 79 20 72 65 61  d.  The only rea
17910 6c 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74  l difference bet
17920 77 65 65 6e 20 66 64 61 74 61 73 79 6e 63 28 29  ween fdatasync()
17930 0a 2a 2a 20 61 6e 64 20 66 73 79 6e 63 28 29 2c  .** and fsync(),
17940 20 54 65 64 20 74 65 6c 6c 73 20 75 73 2c 20 69   Ted tells us, i
17950 73 20 74 68 61 74 20 66 64 61 74 61 73 79 6e 63  s that fdatasync
17960 28 29 20 77 69 6c 6c 20 6e 6f 74 20 66 6c 75 73  () will not flus
17970 68 20 74 68 65 0a 2a 2a 20 69 6e 6f 64 65 20 69  h the.** inode i
17980 66 20 74 68 65 20 6d 74 69 6d 65 20 6f 72 20 6f  f the mtime or o
17990 77 6e 65 72 20 6f 72 20 6f 74 68 65 72 20 69 6e  wner or other in
179a0 6f 64 65 20 61 74 74 72 69 62 75 74 65 73 20 68  ode attributes h
179b0 61 76 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 20  ave changed..** 
179c0 57 65 20 6f 6e 6c 79 20 63 61 72 65 20 61 62 6f  We only care abo
179d0 75 74 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65  ut the file size
179e0 2c 20 6e 6f 74 20 74 68 65 20 6f 74 68 65 72 20  , not the other 
179f0 66 69 6c 65 20 61 74 74 72 69 62 75 74 65 73 2c  file attributes,
17a00 20 73 6f 0a 2a 2a 20 61 73 20 66 61 72 20 61 73   so.** as far as
17a10 20 53 51 4c 69 74 65 20 69 73 20 63 6f 6e 63 65   SQLite is conce
17a20 72 6e 65 64 2c 20 61 6e 20 66 64 61 74 61 73 79  rned, an fdatasy
17a30 6e 63 28 29 20 69 73 20 61 6c 77 61 79 73 20 61  nc() is always a
17a40 64 65 71 75 61 74 65 2e 0a 2a 2a 20 53 6f 2c 20  dequate..** So, 
17a50 77 65 20 61 6c 77 61 79 73 20 75 73 65 20 66 64  we always use fd
17a60 61 74 61 73 79 6e 63 28 29 20 69 66 20 69 74 20  atasync() if it 
17a70 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 72 65  is available, re
17a80 67 61 72 64 6c 65 73 73 20 6f 66 0a 2a 2a 20 74  gardless of.** t
17a90 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
17aa0 64 61 74 61 4f 6e 6c 79 20 66 6c 61 67 2e 0a 2a  dataOnly flag..*
17ab0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 75 6c  /.static int ful
17ac0 6c 5f 66 73 79 6e 63 28 69 6e 74 20 66 64 2c 20  l_fsync(int fd, 
17ad0 69 6e 74 20 66 75 6c 6c 53 79 6e 63 2c 20 69 6e  int fullSync, in
17ae0 74 20 64 61 74 61 4f 6e 6c 79 29 7b 0a 20 20 69  t dataOnly){.  i
17af0 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 54 68 65  nt rc;..  /* The
17b00 20 66 6f 6c 6c 6f 77 69 6e 67 20 22 69 66 64 65   following "ifde
17b10 66 2f 65 6c 69 66 2f 65 6c 73 65 2f 22 20 62 6c  f/elif/else/" bl
17b20 6f 63 6b 20 68 61 73 20 74 68 65 20 73 61 6d 65  ock has the same
17b30 20 73 74 72 75 63 74 75 72 65 20 61 73 0a 20 20   structure as.  
17b40 2a 2a 20 74 68 65 20 6f 6e 65 20 62 65 6c 6f 77  ** the one below
17b50 2e 20 49 74 20 69 73 20 72 65 70 6c 69 63 61 74  . It is replicat
17b60 65 64 20 68 65 72 65 20 73 6f 6c 65 6c 79 20 74  ed here solely t
17b70 6f 20 61 76 6f 69 64 20 63 6c 75 74 74 65 72 69  o avoid clutteri
17b80 6e 67 20 0a 20 20 2a 2a 20 75 70 20 74 68 65 20  ng .  ** up the 
17b90 72 65 61 6c 20 63 6f 64 65 20 77 69 74 68 20 74  real code with t
17ba0 68 65 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  he UNUSED_PARAME
17bb0 54 45 52 28 29 20 6d 61 63 72 6f 73 2e 0a 20 20  TER() macros..  
17bc0 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
17bd0 5f 4e 4f 5f 53 59 4e 43 0a 20 20 55 4e 55 53 45  _NO_SYNC.  UNUSE
17be0 44 5f 50 41 52 41 4d 45 54 45 52 28 66 64 29 3b  D_PARAMETER(fd);
17bf0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
17c00 54 45 52 28 66 75 6c 6c 53 79 6e 63 29 3b 0a 20  TER(fullSync);. 
17c10 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
17c20 52 28 64 61 74 61 4f 6e 6c 79 29 3b 0a 23 65 6c  R(dataOnly);.#el
17c30 69 66 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e  if HAVE_FULLFSYN
17c40 43 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  C.  UNUSED_PARAM
17c50 45 54 45 52 28 64 61 74 61 4f 6e 6c 79 29 3b 0a  ETER(dataOnly);.
17c60 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50  #else.  UNUSED_P
17c70 41 52 41 4d 45 54 45 52 28 66 75 6c 6c 53 79 6e  ARAMETER(fullSyn
17c80 63 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  c);.  UNUSED_PAR
17c90 41 4d 45 54 45 52 28 64 61 74 61 4f 6e 6c 79 29  AMETER(dataOnly)
17ca0 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52  ;.#endif..  /* R
17cb0 65 63 6f 72 64 20 74 68 65 20 6e 75 6d 62 65 72  ecord the number
17cc0 20 6f 66 20 74 69 6d 65 73 20 74 68 61 74 20 77   of times that w
17cd0 65 20 64 6f 20 61 20 6e 6f 72 6d 61 6c 20 66 73  e do a normal fs
17ce0 79 6e 63 28 29 20 61 6e 64 20 0a 20 20 2a 2a 20  ync() and .  ** 
17cf0 46 55 4c 4c 53 59 4e 43 2e 20 20 54 68 69 73 20  FULLSYNC.  This 
17d00 69 73 20 75 73 65 64 20 64 75 72 69 6e 67 20 74  is used during t
17d10 65 73 74 69 6e 67 20 74 6f 20 76 65 72 69 66 79  esting to verify
17d20 20 74 68 61 74 20 74 68 69 73 20 70 72 6f 63 65   that this proce
17d30 64 75 72 65 0a 20 20 2a 2a 20 67 65 74 73 20 63  dure.  ** gets c
17d40 61 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 63  alled with the c
17d50 6f 72 72 65 63 74 20 61 72 67 75 6d 65 6e 74 73  orrect arguments
17d60 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ..  */.#ifdef SQ
17d70 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 66 28 20  LITE_TEST.  if( 
17d80 66 75 6c 6c 53 79 6e 63 20 29 20 73 71 6c 69 74  fullSync ) sqlit
17d90 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e  e3_fullsync_coun
17da0 74 2b 2b 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  t++;.  sqlite3_s
17db0 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e  ync_count++;.#en
17dc0 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20  dif..  /* If we 
17dd0 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 74 68  compiled with th
17de0 65 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43  e SQLITE_NO_SYNC
17df0 20 66 6c 61 67 2c 20 74 68 65 6e 20 73 79 6e 63   flag, then sync
17e00 69 6e 67 20 69 73 20 61 0a 20 20 2a 2a 20 6e 6f  ing is a.  ** no
17e10 2d 6f 70 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20  -op.  */.#ifdef 
17e20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20  SQLITE_NO_SYNC. 
17e30 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
17e40 0a 23 65 6c 69 66 20 48 41 56 45 5f 46 55 4c 4c  .#elif HAVE_FULL
17e50 46 53 59 4e 43 0a 20 20 69 66 28 20 66 75 6c 6c  FSYNC.  if( full
17e60 53 79 6e 63 20 29 7b 0a 20 20 20 20 72 63 20 3d  Sync ){.    rc =
17e70 20 66 63 6e 74 6c 28 66 64 2c 20 46 5f 46 55 4c   fcntl(fd, F_FUL
17e80 4c 46 53 59 4e 43 2c 20 30 29 3b 0a 20 20 7d 65  LFSYNC, 0);.  }e
17e90 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 31 3b  lse{.    rc = 1;
17ea0 0a 20 20 7d 0a 20 20 2f 2a 20 49 66 20 74 68 65  .  }.  /* If the
17eb0 20 46 55 4c 4c 46 53 59 4e 43 20 66 61 69 6c 65   FULLFSYNC faile
17ec0 64 2c 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20  d, fall back to 
17ed0 61 74 74 65 6d 70 74 69 6e 67 20 61 6e 20 66 73  attempting an fs
17ee0 79 6e 63 28 29 2e 0a 20 20 2a 2a 20 49 74 20 73  ync()..  ** It s
17ef0 68 6f 75 6c 64 6e 27 74 20 62 65 20 70 6f 73 73  houldn't be poss
17f00 69 62 6c 65 20 66 6f 72 20 66 75 6c 6c 66 73 79  ible for fullfsy
17f10 6e 63 20 74 6f 20 66 61 69 6c 20 6f 6e 20 74 68  nc to fail on th
17f20 65 20 6c 6f 63 61 6c 20 0a 20 20 2a 2a 20 66 69  e local .  ** fi
17f30 6c 65 20 73 79 73 74 65 6d 20 28 6f 6e 20 4f 53  le system (on OS
17f40 58 29 2c 20 73 6f 20 66 61 69 6c 75 72 65 20 69  X), so failure i
17f50 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 46 55  ndicates that FU
17f60 4c 4c 46 53 59 4e 43 0a 20 20 2a 2a 20 69 73 6e  LLFSYNC.  ** isn
17f70 27 74 20 73 75 70 70 6f 72 74 65 64 20 66 6f 72  't supported for
17f80 20 74 68 69 73 20 66 69 6c 65 20 73 79 73 74 65   this file syste
17f90 6d 2e 20 53 6f 2c 20 61 74 74 65 6d 70 74 20 61  m. So, attempt a
17fa0 6e 20 66 73 79 6e 63 20 0a 20 20 2a 2a 20 61 6e  n fsync .  ** an
17fb0 64 20 28 66 6f 72 20 6e 6f 77 29 20 69 67 6e 6f  d (for now) igno
17fc0 72 65 20 74 68 65 20 6f 76 65 72 68 65 61 64 20  re the overhead 
17fd0 6f 66 20 61 20 73 75 70 65 72 66 6c 75 6f 75 73  of a superfluous
17fe0 20 66 63 6e 74 6c 20 63 61 6c 6c 2e 20 20 0a 20   fcntl call.  . 
17ff0 20 2a 2a 20 49 74 27 64 20 62 65 20 62 65 74 74   ** It'd be bett
18000 65 72 20 74 6f 20 64 65 74 65 63 74 20 66 75 6c  er to detect ful
18010 6c 66 73 79 6e 63 20 73 75 70 70 6f 72 74 20 6f  lfsync support o
18020 6e 63 65 20 61 6e 64 20 61 76 6f 69 64 20 0a 20  nce and avoid . 
18030 20 2a 2a 20 74 68 65 20 66 63 6e 74 6c 20 63 61   ** the fcntl ca
18040 6c 6c 20 65 76 65 72 79 20 74 69 6d 65 20 73 79  ll every time sy
18050 6e 63 20 69 73 20 63 61 6c 6c 65 64 2e 0a 20 20  nc is called..  
18060 2a 2f 0a 20 20 69 66 28 20 72 63 20 29 20 72 63  */.  if( rc ) rc
18070 20 3d 20 66 73 79 6e 63 28 66 64 29 3b 0a 0a 23   = fsync(fd);..#
18080 65 6c 73 65 20 0a 20 20 72 63 20 3d 20 66 64 61  else .  rc = fda
18090 74 61 73 79 6e 63 28 66 64 29 3b 0a 23 69 66 20  tasync(fd);.#if 
180a0 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 69 66 28  OS_VXWORKS.  if(
180b0 20 72 63 3d 3d 2d 31 20 26 26 20 65 72 72 6e 6f   rc==-1 && errno
180c0 3d 3d 45 4e 4f 54 53 55 50 20 29 7b 0a 20 20 20  ==ENOTSUP ){.   
180d0 20 72 63 20 3d 20 66 73 79 6e 63 28 66 64 29 3b   rc = fsync(fd);
180e0 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 4f  .  }.#endif /* O
180f0 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 23 65 6e  S_VXWORKS */.#en
18100 64 69 66 20 2f 2a 20 69 66 64 65 66 20 53 51 4c  dif /* ifdef SQL
18110 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 65 6c 69 66  ITE_NO_SYNC elif
18120 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20   HAVE_FULLFSYNC 
18130 2a 2f 0a 0a 20 20 69 66 28 20 4f 53 5f 56 58 57  */..  if( OS_VXW
18140 4f 52 4b 53 20 26 26 20 72 63 21 3d 20 2d 31 20  ORKS && rc!= -1 
18150 29 7b 0a 20 20 20 20 72 63 20 3d 20 30 3b 0a 20  ){.    rc = 0;. 
18160 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
18170 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75  }../*.** Make su
18180 72 65 20 61 6c 6c 20 77 72 69 74 65 73 20 74 6f  re all writes to
18190 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 66 69   a particular fi
181a0 6c 65 20 61 72 65 20 63 6f 6d 6d 69 74 74 65 64  le are committed
181b0 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20   to disk..**.** 
181c0 49 66 20 64 61 74 61 4f 6e 6c 79 3d 3d 30 20 74  If dataOnly==0 t
181d0 68 65 6e 20 62 6f 74 68 20 74 68 65 20 66 69 6c  hen both the fil
181e0 65 20 69 74 73 65 6c 66 20 61 6e 64 20 69 74 73  e itself and its
181f0 20 6d 65 74 61 64 61 74 61 20 28 66 69 6c 65 0a   metadata (file.
18200 2a 2a 20 73 69 7a 65 2c 20 61 63 63 65 73 73 20  ** size, access 
18210 74 69 6d 65 2c 20 65 74 63 29 20 61 72 65 20 73  time, etc) are s
18220 79 6e 63 65 64 2e 20 20 49 66 20 64 61 74 61 4f  ynced.  If dataO
18230 6e 6c 79 21 3d 30 20 74 68 65 6e 20 6f 6e 6c 79  nly!=0 then only
18240 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 64 61 74   the.** file dat
18250 61 20 69 73 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a  a is synced..**.
18260 2a 2a 20 55 6e 64 65 72 20 55 6e 69 78 2c 20 61  ** Under Unix, a
18270 6c 73 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68  lso make sure th
18280 61 74 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  at the directory
18290 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 66   entry for the f
182a0 69 6c 65 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20  ile.** has been 
182b0 63 72 65 61 74 65 64 20 62 79 20 66 73 79 6e 63  created by fsync
182c0 2d 69 6e 67 20 74 68 65 20 64 69 72 65 63 74 6f  -ing the directo
182d0 72 79 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ry that contains
182e0 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 20 49 66   the file..** If
182f0 20 77 65 20 64 6f 20 6e 6f 74 20 64 6f 20 74 68   we do not do th
18300 69 73 20 61 6e 64 20 77 65 20 65 6e 63 6f 75 6e  is and we encoun
18310 74 65 72 20 61 20 70 6f 77 65 72 20 66 61 69 6c  ter a power fail
18320 75 72 65 2c 20 74 68 65 20 64 69 72 65 63 74 6f  ure, the directo
18330 72 79 0a 2a 2a 20 65 6e 74 72 79 20 66 6f 72 20  ry.** entry for 
18340 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68  the journal migh
18350 74 20 6e 6f 74 20 65 78 69 73 74 20 61 66 74 65  t not exist afte
18360 72 20 77 65 20 72 65 62 6f 6f 74 2e 20 20 54 68  r we reboot.  Th
18370 65 20 6e 65 78 74 0a 2a 2a 20 53 51 4c 69 74 65  e next.** SQLite
18380 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 66   to access the f
18390 69 6c 65 20 77 69 6c 6c 20 6e 6f 74 20 6b 6e 6f  ile will not kno
183a0 77 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e  w that the journ
183b0 61 6c 20 65 78 69 73 74 73 20 28 62 65 63 61 75  al exists (becau
183c0 73 65 0a 2a 2a 20 74 68 65 20 64 69 72 65 63 74  se.** the direct
183d0 6f 72 79 20 65 6e 74 72 79 20 66 6f 72 20 74 68  ory entry for th
183e0 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 6e 65  e journal was ne
183f0 76 65 72 20 63 72 65 61 74 65 64 29 20 61 6e 64  ver created) and
18400 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
18410 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 72 6f 6c  .** will not rol
18420 6c 20 62 61 63 6b 20 2d 20 70 6f 73 73 69 62 6c  l back - possibl
18430 79 20 6c 65 61 64 69 6e 67 20 74 6f 20 64 61 74  y leading to dat
18440 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
18450 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
18460 75 6e 69 78 53 79 6e 63 28 73 71 6c 69 74 65 33  unixSync(sqlite3
18470 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 66  _file *id, int f
18480 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b  lags){.  int rc;
18490 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
184a0 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
184b0 69 64 3b 0a 0a 20 20 69 6e 74 20 69 73 44 61 74  id;..  int isDat
184c0 61 4f 6e 6c 79 20 3d 20 28 66 6c 61 67 73 26 53  aOnly = (flags&S
184d0 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f  QLITE_SYNC_DATAO
184e0 4e 4c 59 29 3b 0a 20 20 69 6e 74 20 69 73 46 75  NLY);.  int isFu
184f0 6c 6c 73 79 6e 63 20 3d 20 28 66 6c 61 67 73 26  llsync = (flags&
18500 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59  0x0F)==SQLITE_SY
18510 4e 43 5f 46 55 4c 4c 3b 0a 0a 20 20 2f 2a 20 43  NC_FULL;..  /* C
18520 68 65 63 6b 20 74 68 61 74 20 6f 6e 65 20 6f 66  heck that one of
18530 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52   SQLITE_SYNC_NOR
18540 4d 41 4c 20 6f 72 20 46 55 4c 4c 20 77 61 73 20  MAL or FULL was 
18550 70 61 73 73 65 64 20 2a 2f 0a 20 20 61 73 73 65  passed */.  asse
18560 72 74 28 28 66 6c 61 67 73 26 30 78 30 46 29 3d  rt((flags&0x0F)=
18570 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52  =SQLITE_SYNC_NOR
18580 4d 41 4c 0a 20 20 20 20 20 20 7c 7c 20 28 66 6c  MAL.      || (fl
18590 61 67 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54  ags&0x0F)==SQLIT
185a0 45 5f 53 59 4e 43 5f 46 55 4c 4c 0a 20 20 29 3b  E_SYNC_FULL.  );
185b0 0a 0a 20 20 2f 2a 20 55 6e 69 78 20 63 61 6e 6e  ..  /* Unix cann
185c0 6f 74 2c 20 62 75 74 20 73 6f 6d 65 20 73 79 73  ot, but some sys
185d0 74 65 6d 73 20 6d 61 79 20 72 65 74 75 72 6e 20  tems may return 
185e0 53 51 4c 49 54 45 5f 46 55 4c 4c 20 66 72 6f 6d  SQLITE_FULL from
185f0 20 68 65 72 65 2e 20 54 68 69 73 0a 20 20 2a 2a   here. This.  **
18600 20 6c 69 6e 65 20 69 73 20 74 6f 20 74 65 73 74   line is to test
18610 20 74 68 61 74 20 64 6f 69 6e 67 20 73 6f 20 64   that doing so d
18620 6f 65 73 20 6e 6f 74 20 63 61 75 73 65 20 61 6e  oes not cause an
18630 79 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 2a 2f  y problems..  */
18640 0a 20 20 53 69 6d 75 6c 61 74 65 44 69 73 6b 66  .  SimulateDiskf
18650 75 6c 6c 45 72 72 6f 72 28 20 72 65 74 75 72 6e  ullError( return
18660 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 3b 0a   SQLITE_FULL );.
18670 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
18680 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 32 28 22   );.  OSTRACE2("
18690 53 59 4e 43 20 20 20 20 25 2d 33 64 5c 6e 22 2c  SYNC    %-3d\n",
186a0 20 70 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 72 63   pFile->h);.  rc
186b0 20 3d 20 66 75 6c 6c 5f 66 73 79 6e 63 28 70 46   = full_fsync(pF
186c0 69 6c 65 2d 3e 68 2c 20 69 73 46 75 6c 6c 73 79  ile->h, isFullsy
186d0 6e 63 2c 20 69 73 44 61 74 61 4f 6e 6c 79 29 3b  nc, isDataOnly);
186e0 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
186f0 6f 72 28 20 72 63 3d 31 20 29 3b 0a 20 20 69 66  or( rc=1 );.  if
18700 28 20 72 63 20 29 7b 0a 20 20 20 20 70 46 69 6c  ( rc ){.    pFil
18710 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65  e->lastErrno = e
18720 72 72 6e 6f 3b 0a 20 20 20 20 72 65 74 75 72 6e  rrno;.    return
18730 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53   SQLITE_IOERR_FS
18740 59 4e 43 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  YNC;.  }.  if( p
18750 46 69 6c 65 2d 3e 64 69 72 66 64 3e 3d 30 20 29  File->dirfd>=0 )
18760 7b 0a 20 20 20 20 69 6e 74 20 65 72 72 3b 0a 20  {.    int err;. 
18770 20 20 20 4f 53 54 52 41 43 45 34 28 22 44 49 52     OSTRACE4("DIR
18780 53 59 4e 43 20 25 2d 33 64 20 28 68 61 76 65 5f  SYNC %-3d (have_
18790 66 75 6c 6c 66 73 79 6e 63 3d 25 64 20 66 75 6c  fullfsync=%d ful
187a0 6c 73 79 6e 63 3d 25 64 29 5c 6e 22 2c 20 70 46  lsync=%d)\n", pF
187b0 69 6c 65 2d 3e 64 69 72 66 64 2c 0a 20 20 20 20  ile->dirfd,.    
187c0 20 20 20 20 20 20 20 20 48 41 56 45 5f 46 55 4c          HAVE_FUL
187d0 4c 46 53 59 4e 43 2c 20 69 73 46 75 6c 6c 73 79  LFSYNC, isFullsy
187e0 6e 63 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  nc);.#ifndef SQL
187f0 49 54 45 5f 44 49 53 41 42 4c 45 5f 44 49 52 53  ITE_DISABLE_DIRS
18800 59 4e 43 0a 20 20 20 20 2f 2a 20 54 68 65 20 64  YNC.    /* The d
18810 69 72 65 63 74 6f 72 79 20 73 79 6e 63 20 69 73  irectory sync is
18820 20 6f 6e 6c 79 20 61 74 74 65 6d 70 74 65 64 20   only attempted 
18830 69 66 20 66 75 6c 6c 5f 66 73 79 6e 63 20 69 73  if full_fsync is
18840 0a 20 20 20 20 2a 2a 20 74 75 72 6e 65 64 20 6f  .    ** turned o
18850 66 66 20 6f 72 20 75 6e 61 76 61 69 6c 61 62 6c  ff or unavailabl
18860 65 2e 20 20 49 66 20 61 20 66 75 6c 6c 5f 66 73  e.  If a full_fs
18870 79 6e 63 20 6f 63 63 75 72 72 65 64 20 61 62 6f  ync occurred abo
18880 76 65 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20  ve,.    ** then 
18890 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 73 79  the directory sy
188a0 6e 63 20 69 73 20 73 75 70 65 72 66 6c 75 6f 75  nc is superfluou
188b0 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  s..    */.    if
188c0 28 20 28 21 48 41 56 45 5f 46 55 4c 4c 46 53 59  ( (!HAVE_FULLFSY
188d0 4e 43 20 7c 7c 20 21 69 73 46 75 6c 6c 73 79 6e  NC || !isFullsyn
188e0 63 29 20 26 26 20 66 75 6c 6c 5f 66 73 79 6e 63  c) && full_fsync
188f0 28 70 46 69 6c 65 2d 3e 64 69 72 66 64 2c 30 2c  (pFile->dirfd,0,
18900 30 29 20 29 7b 0a 20 20 20 20 20 20 20 2f 2a 0a  0) ){.       /*.
18910 20 20 20 20 20 20 20 2a 2a 20 57 65 20 68 61 76         ** We hav
18920 65 20 72 65 63 65 69 76 65 64 20 6d 75 6c 74 69  e received multi
18930 70 6c 65 20 72 65 70 6f 72 74 73 20 6f 66 20 66  ple reports of f
18940 73 79 6e 63 28 29 20 72 65 74 75 72 6e 69 6e 67  sync() returning
18950 0a 20 20 20 20 20 20 20 2a 2a 20 65 72 72 6f 72  .       ** error
18960 73 20 77 68 65 6e 20 61 70 70 6c 69 65 64 20 74  s when applied t
18970 6f 20 64 69 72 65 63 74 6f 72 69 65 73 20 6f 6e  o directories on
18980 20 63 65 72 74 61 69 6e 20 66 69 6c 65 20 73 79   certain file sy
18990 73 74 65 6d 73 2e 0a 20 20 20 20 20 20 20 2a 2a  stems..       **
189a0 20 41 20 66 61 69 6c 65 64 20 64 69 72 65 63 74   A failed direct
189b0 6f 72 79 20 73 79 6e 63 20 69 73 20 6e 6f 74 20  ory sync is not 
189c0 61 20 62 69 67 20 64 65 61 6c 2e 20 20 53 6f 20  a big deal.  So 
189d0 69 74 20 73 65 65 6d 73 0a 20 20 20 20 20 20 20  it seems.       
189e0 2a 2a 20 62 65 74 74 65 72 20 74 6f 20 69 67 6e  ** better to ign
189f0 6f 72 65 20 74 68 65 20 65 72 72 6f 72 2e 20 20  ore the error.  
18a00 54 69 63 6b 65 74 20 23 31 36 35 37 0a 20 20 20  Ticket #1657.   
18a10 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 2f 2a      */.       /*
18a20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
18a30 6f 20 3d 20 65 72 72 6e 6f 3b 20 2a 2f 0a 20 20  o = errno; */.  
18a40 20 20 20 20 20 2f 2a 20 72 65 74 75 72 6e 20 53       /* return S
18a50 51 4c 49 54 45 5f 49 4f 45 52 52 3b 20 2a 2f 0a  QLITE_IOERR; */.
18a60 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
18a70 20 65 72 72 20 3d 20 63 6c 6f 73 65 28 70 46 69   err = close(pFi
18a80 6c 65 2d 3e 64 69 72 66 64 29 3b 20 2f 2a 20 4f  le->dirfd); /* O
18a90 6e 6c 79 20 6e 65 65 64 20 74 6f 20 73 79 6e 63  nly need to sync
18aa0 20 6f 6e 63 65 2c 20 73 6f 20 63 6c 6f 73 65 20   once, so close 
18ab0 74 68 65 20 2a 2f 0a 20 20 20 20 69 66 28 20 65  the */.    if( e
18ac0 72 72 3d 3d 30 20 29 7b 20 20 20 20 20 20 20 20  rr==0 ){        
18ad0 20 20 20 20 20 20 2f 2a 20 64 69 72 65 63 74 6f        /* directo
18ae0 72 79 20 77 68 65 6e 20 77 65 20 61 72 65 20 64  ry when we are d
18af0 6f 6e 65 20 2a 2f 0a 20 20 20 20 20 20 70 46 69  one */.      pFi
18b00 6c 65 2d 3e 64 69 72 66 64 20 3d 20 2d 31 3b 0a  le->dirfd = -1;.
18b10 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
18b20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
18b30 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
18b40 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
18b50 52 52 5f 44 49 52 5f 43 4c 4f 53 45 3b 0a 20 20  RR_DIR_CLOSE;.  
18b60 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
18b70 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72   rc;.}../*.** Tr
18b80 75 6e 63 61 74 65 20 61 6e 20 6f 70 65 6e 20 66  uncate an open f
18b90 69 6c 65 20 74 6f 20 61 20 73 70 65 63 69 66 69  ile to a specifi
18ba0 65 64 20 73 69 7a 65 0a 2a 2f 0a 73 74 61 74 69  ed size.*/.stati
18bb0 63 20 69 6e 74 20 75 6e 69 78 54 72 75 6e 63 61  c int unixTrunca
18bc0 74 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  te(sqlite3_file 
18bd0 2a 69 64 2c 20 69 36 34 20 6e 42 79 74 65 29 7b  *id, i64 nByte){
18be0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73  .  int rc;.  ass
18bf0 65 72 74 28 20 69 64 20 29 3b 0a 20 20 53 69 6d  ert( id );.  Sim
18c00 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65  ulateIOError( re
18c10 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
18c20 52 5f 54 52 55 4e 43 41 54 45 20 29 3b 0a 20 20  R_TRUNCATE );.  
18c30 72 63 20 3d 20 66 74 72 75 6e 63 61 74 65 28 28  rc = ftruncate((
18c40 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e  (unixFile*)id)->
18c50 68 2c 20 28 6f 66 66 5f 74 29 6e 42 79 74 65 29  h, (off_t)nByte)
18c60 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
18c70 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64    ((unixFile*)id
18c80 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65  )->lastErrno = e
18c90 72 72 6e 6f 3b 0a 20 20 20 20 72 65 74 75 72 6e  rrno;.    return
18ca0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52   SQLITE_IOERR_TR
18cb0 55 4e 43 41 54 45 3b 0a 20 20 7d 65 6c 73 65 7b  UNCATE;.  }else{
18cc0 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
18cd0 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65      /* If we are
18ce0 20 64 6f 69 6e 67 20 61 20 6e 6f 72 6d 61 6c 20   doing a normal 
18cf0 77 72 69 74 65 20 74 6f 20 61 20 64 61 74 61 62  write to a datab
18d00 61 73 65 20 66 69 6c 65 20 28 61 73 20 6f 70 70  ase file (as opp
18d10 6f 73 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 64  osed to.    ** d
18d20 6f 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  oing a hot-journ
18d30 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 61  al rollback or a
18d40 20 77 72 69 74 65 20 74 6f 20 73 6f 6d 65 20 66   write to some f
18d50 69 6c 65 20 6f 74 68 65 72 20 74 68 61 6e 20 61  ile other than a
18d60 0a 20 20 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20 64  .    ** normal d
18d70 61 74 61 62 61 73 65 20 66 69 6c 65 29 20 61 6e  atabase file) an
18d80 64 20 77 65 20 74 72 75 6e 63 61 74 65 20 74 68  d we truncate th
18d90 65 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20 6c  e file to zero l
18da0 65 6e 67 74 68 2c 0a 20 20 20 20 2a 2a 20 74 68  ength,.    ** th
18db0 61 74 20 65 66 66 65 63 74 69 76 65 6c 79 20 75  at effectively u
18dc0 70 64 61 74 65 73 20 74 68 65 20 63 68 61 6e 67  pdates the chang
18dd0 65 20 63 6f 75 6e 74 65 72 2e 20 20 54 68 69 73  e counter.  This
18de0 20 6d 69 67 68 74 20 68 61 70 70 65 6e 0a 20 20   might happen.  
18df0 20 20 2a 2a 20 77 68 65 6e 20 72 65 73 74 6f 72    ** when restor
18e00 69 6e 67 20 61 20 64 61 74 61 62 61 73 65 20 75  ing a database u
18e10 73 69 6e 67 20 74 68 65 20 62 61 63 6b 75 70 20  sing the backup 
18e20 41 50 49 20 66 72 6f 6d 20 61 20 7a 65 72 6f 2d  API from a zero-
18e30 6c 65 6e 67 74 68 0a 20 20 20 20 2a 2a 20 73 6f  length.    ** so
18e40 75 72 63 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  urce..    */.   
18e50 20 69 66 28 20 28 28 75 6e 69 78 46 69 6c 65 2a   if( ((unixFile*
18e60 29 69 64 29 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72  )id)->inNormalWr
18e70 69 74 65 20 26 26 20 6e 42 79 74 65 3d 3d 30 20  ite && nByte==0 
18e80 29 7b 0a 20 20 20 20 20 20 28 28 75 6e 69 78 46  ){.      ((unixF
18e90 69 6c 65 2a 29 69 64 29 2d 3e 74 72 61 6e 73 43  ile*)id)->transC
18ea0 6e 74 72 43 68 6e 67 20 3d 20 31 3b 0a 20 20 20  ntrChng = 1;.   
18eb0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 72   }.#endif..    r
18ec0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
18ed0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  .  }.}../*.** De
18ee0 74 65 72 6d 69 6e 65 20 74 68 65 20 63 75 72 72  termine the curr
18ef0 65 6e 74 20 73 69 7a 65 20 6f 66 20 61 20 66 69  ent size of a fi
18f00 6c 65 20 69 6e 20 62 79 74 65 73 0a 2a 2f 0a 73  le in bytes.*/.s
18f10 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 46 69  tatic int unixFi
18f20 6c 65 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66  leSize(sqlite3_f
18f30 69 6c 65 20 2a 69 64 2c 20 69 36 34 20 2a 70 53  ile *id, i64 *pS
18f40 69 7a 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ize){.  int rc;.
18f50 20 20 73 74 72 75 63 74 20 73 74 61 74 20 62 75    struct stat bu
18f60 66 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 20  f;.  assert( id 
18f70 29 3b 0a 20 20 72 63 20 3d 20 66 73 74 61 74 28  );.  rc = fstat(
18f80 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d  ((unixFile*)id)-
18f90 3e 68 2c 20 26 62 75 66 29 3b 0a 20 20 53 69 6d  >h, &buf);.  Sim
18fa0 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 63  ulateIOError( rc
18fb0 3d 31 20 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  =1 );.  if( rc!=
18fc0 30 20 29 7b 0a 20 20 20 20 28 28 75 6e 69 78 46  0 ){.    ((unixF
18fd0 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72  ile*)id)->lastEr
18fe0 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
18ff0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
19000 4f 45 52 52 5f 46 53 54 41 54 3b 0a 20 20 7d 0a  OERR_FSTAT;.  }.
19010 20 20 2a 70 53 69 7a 65 20 3d 20 62 75 66 2e 73    *pSize = buf.s
19020 74 5f 73 69 7a 65 3b 0a 0a 20 20 2f 2a 20 57 68  t_size;..  /* Wh
19030 65 6e 20 6f 70 65 6e 69 6e 67 20 61 20 7a 65 72  en opening a zer
19040 6f 2d 73 69 7a 65 20 64 61 74 61 62 61 73 65 2c  o-size database,
19050 20 74 68 65 20 66 69 6e 64 4c 6f 63 6b 49 6e 66   the findLockInf
19060 6f 28 29 20 70 72 6f 63 65 64 75 72 65 0a 20 20  o() procedure.  
19070 2a 2a 20 77 72 69 74 65 73 20 61 20 73 69 6e 67  ** writes a sing
19080 6c 65 20 62 79 74 65 20 69 6e 74 6f 20 74 68 61  le byte into tha
19090 74 20 66 69 6c 65 20 69 6e 20 6f 72 64 65 72 20  t file in order 
190a0 74 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 61  to work around a
190b0 20 62 75 67 0a 20 20 2a 2a 20 69 6e 20 74 68 65   bug.  ** in the
190c0 20 4f 53 2d 58 20 6d 73 64 6f 73 20 66 69 6c 65   OS-X msdos file
190d0 73 79 73 74 65 6d 2e 20 20 49 6e 20 6f 72 64 65  system.  In orde
190e0 72 20 74 6f 20 61 76 6f 69 64 20 70 72 6f 62 6c  r to avoid probl
190f0 65 6d 73 20 77 69 74 68 20 75 70 70 65 72 0a 20  ems with upper. 
19100 20 2a 2a 20 6c 61 79 65 72 73 2c 20 77 65 20 6e   ** layers, we n
19110 65 65 64 20 74 6f 20 72 65 70 6f 72 74 20 74 68  eed to report th
19120 69 73 20 66 69 6c 65 20 73 69 7a 65 20 61 73 20  is file size as 
19130 7a 65 72 6f 20 65 76 65 6e 20 74 68 6f 75 67 68  zero even though
19140 20 69 74 20 69 73 0a 20 20 2a 2a 20 72 65 61 6c   it is.  ** real
19150 6c 79 20 31 2e 20 20 20 54 69 63 6b 65 74 20 23  ly 1.   Ticket #
19160 33 32 36 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  3260..  */.  if(
19170 20 2a 70 53 69 7a 65 3d 3d 31 20 29 20 2a 70 53   *pSize==1 ) *pS
19180 69 7a 65 20 3d 20 30 3b 0a 0a 0a 20 20 72 65 74  ize = 0;...  ret
19190 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
191a0 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  ..#if SQLITE_ENA
191b0 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
191c0 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41  E && defined(__A
191d0 50 50 4c 45 5f 5f 29 0a 2f 2a 0a 2a 2a 20 48 61  PPLE__)./*.** Ha
191e0 6e 64 6c 65 72 20 66 6f 72 20 70 72 6f 78 79 2d  ndler for proxy-
191f0 6c 6f 63 6b 69 6e 67 20 66 69 6c 65 2d 63 6f 6e  locking file-con
19200 74 72 6f 6c 20 76 65 72 62 73 2e 20 20 44 65 66  trol verbs.  Def
19210 69 6e 65 64 20 62 65 6c 6f 77 20 69 6e 20 74 68  ined below in th
19220 65 0a 2a 2a 20 70 72 6f 78 79 69 6e 67 20 6c 6f  e.** proxying lo
19230 63 6b 69 6e 67 20 64 69 76 69 73 69 6f 6e 2e 0a  cking division..
19240 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  */.static int pr
19250 6f 78 79 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 73  oxyFileControl(s
19260 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 69 6e 74  qlite3_file*,int
19270 2c 76 6f 69 64 2a 29 3b 0a 23 65 6e 64 69 66 0a  ,void*);.#endif.
19280 0a 0a 2f 2a 0a 2a 2a 20 49 6e 66 6f 72 6d 61 74  ../*.** Informat
19290 69 6f 6e 20 61 6e 64 20 63 6f 6e 74 72 6f 6c 20  ion and control 
192a0 6f 66 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20  of an open file 
192b0 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  handle..*/.stati
192c0 63 20 69 6e 74 20 75 6e 69 78 46 69 6c 65 43 6f  c int unixFileCo
192d0 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69  ntrol(sqlite3_fi
192e0 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6f 70 2c 20  le *id, int op, 
192f0 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 73  void *pArg){.  s
19300 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20  witch( op ){.   
19310 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
19320 54 4c 5f 4c 4f 43 4b 53 54 41 54 45 3a 20 7b 0a  TL_LOCKSTATE: {.
19330 20 20 20 20 20 20 2a 28 69 6e 74 2a 29 70 41 72        *(int*)pAr
19340 67 20 3d 20 28 28 75 6e 69 78 46 69 6c 65 2a 29  g = ((unixFile*)
19350 69 64 29 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a 20  id)->locktype;. 
19360 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
19370 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
19380 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4c 41 53   case SQLITE_LAS
19390 54 5f 45 52 52 4e 4f 3a 20 7b 0a 20 20 20 20 20  T_ERRNO: {.     
193a0 20 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d 20 28   *(int*)pArg = (
193b0 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e  (unixFile*)id)->
193c0 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20  lastErrno;.     
193d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
193e0 4b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  K;.    }.#ifndef
193f0 20 4e 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 54   NDEBUG.    /* T
19400 68 65 20 70 61 67 65 72 20 63 61 6c 6c 73 20 74  he pager calls t
19410 68 69 73 20 6d 65 74 68 6f 64 20 74 6f 20 73 69  his method to si
19420 67 6e 61 6c 20 74 68 61 74 20 69 74 20 68 61 73  gnal that it has
19430 20 64 6f 6e 65 0a 20 20 20 20 2a 2a 20 61 20 72   done.    ** a r
19440 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 74 68 61 74  ollback and that
19450 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
19460 20 74 68 65 72 65 66 6f 72 65 20 75 6e 63 68 61   therefore uncha
19470 6e 67 65 64 20 61 6e 64 0a 20 20 20 20 2a 2a 20  nged and.    ** 
19480 69 74 20 68 65 6e 63 65 20 69 74 20 69 73 20 4f  it hence it is O
19490 4b 20 66 6f 72 20 74 68 65 20 74 72 61 6e 73 61  K for the transa
194a0 63 74 69 6f 6e 20 63 68 61 6e 67 65 20 63 6f 75  ction change cou
194b0 6e 74 65 72 20 74 6f 20 62 65 0a 20 20 20 20 2a  nter to be.    *
194c0 2a 20 75 6e 63 68 61 6e 67 65 64 2e 0a 20 20 20  * unchanged..   
194d0 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
194e0 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e 43  ITE_FCNTL_DB_UNC
194f0 48 41 4e 47 45 44 3a 20 7b 0a 20 20 20 20 20 20  HANGED: {.      
19500 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d  ((unixFile*)id)-
19510 3e 64 62 55 70 64 61 74 65 20 3d 20 30 3b 0a 20  >dbUpdate = 0;. 
19520 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
19530 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 23 65 6e  TE_OK;.    }.#en
19540 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 45  dif.#if SQLITE_E
19550 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
19560 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f  YLE && defined(_
19570 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 20 20 63 61  _APPLE__).    ca
19580 73 65 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f  se SQLITE_SET_LO
19590 43 4b 50 52 4f 58 59 46 49 4c 45 3a 0a 20 20 20  CKPROXYFILE:.   
195a0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 47 45 54   case SQLITE_GET
195b0 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 3a 20  _LOCKPROXYFILE: 
195c0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  {.      return p
195d0 72 6f 78 79 46 69 6c 65 43 6f 6e 74 72 6f 6c 28  roxyFileControl(
195e0 69 64 2c 6f 70 2c 70 41 72 67 29 3b 0a 20 20 20  id,op,pArg);.   
195f0 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
19600 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
19610 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69  NG_STYLE && defi
19620 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 2a  ned(__APPLE__) *
19630 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  /.  }.  return S
19640 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 7d 0a 0a  QLITE_ERROR;.}..
19650 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
19660 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69 6e 20   sector size in 
19670 62 79 74 65 73 20 6f 66 20 74 68 65 20 75 6e 64  bytes of the und
19680 65 72 6c 79 69 6e 67 20 62 6c 6f 63 6b 20 64 65  erlying block de
19690 76 69 63 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20  vice for.** the 
196a0 73 70 65 63 69 66 69 65 64 20 66 69 6c 65 2e 20  specified file. 
196b0 54 68 69 73 20 69 73 20 61 6c 6d 6f 73 74 20 61  This is almost a
196c0 6c 77 61 79 73 20 35 31 32 20 62 79 74 65 73 2c  lways 512 bytes,
196d0 20 62 75 74 20 6d 61 79 20 62 65 0a 2a 2a 20 6c   but may be.** l
196e0 61 72 67 65 72 20 66 6f 72 20 73 6f 6d 65 20 64  arger for some d
196f0 65 76 69 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 51  evices..**.** SQ
19700 4c 69 74 65 20 63 6f 64 65 20 61 73 73 75 6d 65  Lite code assume
19710 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  s this function 
19720 63 61 6e 6e 6f 74 20 66 61 69 6c 2e 20 49 74 20  cannot fail. It 
19730 61 6c 73 6f 20 61 73 73 75 6d 65 73 20 74 68 61  also assumes tha
19740 74 0a 2a 2a 20 69 66 20 74 77 6f 20 66 69 6c 65  t.** if two file
19750 73 20 61 72 65 20 63 72 65 61 74 65 64 20 69 6e  s are created in
19760 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 2d 73   the same file-s
19770 79 73 74 65 6d 20 64 69 72 65 63 74 6f 72 79 20  ystem directory 
19780 28 69 2e 65 2e 0a 2a 2a 20 61 20 64 61 74 61 62  (i.e..** a datab
19790 61 73 65 20 61 6e 64 20 69 74 73 20 6a 6f 75 72  ase and its jour
197a0 6e 61 6c 20 66 69 6c 65 29 20 74 68 61 74 20 74  nal file) that t
197b0 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 77  he sector size w
197c0 69 6c 6c 20 62 65 20 74 68 65 0a 2a 2a 20 73 61  ill be the.** sa
197d0 6d 65 20 66 6f 72 20 62 6f 74 68 2e 0a 2a 2f 0a  me for both..*/.
197e0 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53  static int unixS
197f0 65 63 74 6f 72 53 69 7a 65 28 73 71 6c 69 74 65  ectorSize(sqlite
19800 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64 29  3_file *NotUsed)
19810 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
19820 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
19830 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
19840 45 46 41 55 4c 54 5f 53 45 43 54 4f 52 5f 53 49  EFAULT_SECTOR_SI
19850 5a 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ZE;.}../*.** Ret
19860 75 72 6e 20 74 68 65 20 64 65 76 69 63 65 20 63  urn the device c
19870 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20 66  haracteristics f
19880 6f 72 20 74 68 65 20 66 69 6c 65 2e 20 54 68 69  or the file. Thi
19890 73 20 69 73 20 61 6c 77 61 79 73 20 30 20 66 6f  s is always 0 fo
198a0 72 20 75 6e 69 78 2e 0a 2a 2f 0a 73 74 61 74 69  r unix..*/.stati
198b0 63 20 69 6e 74 20 75 6e 69 78 44 65 76 69 63 65  c int unixDevice
198c0 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
198d0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f  sqlite3_file *No
198e0 74 55 73 65 64 29 7b 0a 20 20 55 4e 55 53 45 44  tUsed){.  UNUSED
198f0 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
19900 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  ed);.  return 0;
19910 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65 20 65  .}../*.** Here e
19920 6e 64 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e  nds the implemen
19930 74 61 74 69 6f 6e 20 6f 66 20 61 6c 6c 20 73 71  tation of all sq
19940 6c 69 74 65 33 5f 66 69 6c 65 20 6d 65 74 68 6f  lite3_file metho
19950 64 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ds..**.*********
19960 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e  ************* En
19970 64 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 4d  d sqlite3_file M
19980 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ethods *********
19990 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
199a0 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
199b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
199c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
199d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
199e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
199f0 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68  *****/../*.** Th
19a00 69 73 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74  is division cont
19a10 61 69 6e 73 20 64 65 66 69 6e 69 74 69 6f 6e 73  ains definitions
19a20 20 6f 66 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d   of sqlite3_io_m
19a30 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 73 20 74  ethods objects t
19a40 68 61 74 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74  hat.** implement
19a50 20 76 61 72 69 6f 75 73 20 66 69 6c 65 20 6c 6f   various file lo
19a60 63 6b 69 6e 67 20 73 74 72 61 74 65 67 69 65 73  cking strategies
19a70 2e 20 20 49 74 20 61 6c 73 6f 20 63 6f 6e 74 61  .  It also conta
19a80 69 6e 73 20 64 65 66 69 6e 69 74 69 6f 6e 73 0a  ins definitions.
19a90 2a 2a 20 6f 66 20 22 66 69 6e 64 65 72 22 20 66  ** of "finder" f
19aa0 75 6e 63 74 69 6f 6e 73 2e 20 20 41 20 66 69 6e  unctions.  A fin
19ab0 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 69 73 20  der-function is 
19ac0 75 73 65 64 20 74 6f 20 6c 6f 63 61 74 65 20 74  used to locate t
19ad0 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 0a 2a  he appropriate.*
19ae0 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  * sqlite3_io_met
19af0 68 6f 64 73 20 6f 62 6a 65 63 74 20 66 6f 72 20  hods object for 
19b00 61 20 70 61 72 74 69 63 75 6c 61 72 20 64 61 74  a particular dat
19b10 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68 65  abase file.  The
19b20 20 70 41 70 70 44 61 74 61 0a 2a 2a 20 66 69 65   pAppData.** fie
19b30 6c 64 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65  ld of the sqlite
19b40 33 5f 76 66 73 20 56 46 53 20 6f 62 6a 65 63 74  3_vfs VFS object
19b50 73 20 61 72 65 20 69 6e 69 74 69 61 6c 69 7a 65  s are initialize
19b60 64 20 74 6f 20 62 65 20 70 6f 69 6e 74 65 72 73  d to be pointers
19b70 20 74 6f 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65   to.** the corre
19b80 63 74 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69  ct finder-functi
19b90 6f 6e 20 66 6f 72 20 74 68 61 74 20 56 46 53 2e  on for that VFS.
19ba0 0a 2a 2a 0a 2a 2a 20 4d 6f 73 74 20 66 69 6e 64  .**.** Most find
19bb0 65 72 20 66 75 6e 63 74 69 6f 6e 73 20 72 65 74  er functions ret
19bc0 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
19bd0 20 61 20 66 69 78 65 64 20 73 71 6c 69 74 65 33   a fixed sqlite3
19be0 5f 69 6f 5f 6d 65 74 68 6f 64 73 0a 2a 2a 20 6f  _io_methods.** o
19bf0 62 6a 65 63 74 2e 20 20 54 68 65 20 6f 6e 6c 79  bject.  The only
19c00 20 69 6e 74 65 72 65 73 74 69 6e 67 20 66 69 6e   interesting fin
19c10 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 69 73 20  der-function is 
19c20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72  autolockIoFinder
19c30 2c 20 77 68 69 63 68 0a 2a 2a 20 6c 6f 6f 6b 73  , which.** looks
19c40 20 61 74 20 74 68 65 20 66 69 6c 65 73 79 73 74   at the filesyst
19c50 65 6d 20 74 79 70 65 20 61 6e 64 20 74 72 69 65  em type and trie
19c60 73 20 74 6f 20 67 75 65 73 73 20 74 68 65 20 62  s to guess the b
19c70 65 73 74 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73  est locking.** s
19c80 74 72 61 74 65 67 79 20 66 72 6f 6d 20 74 68 61  trategy from tha
19c90 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 66 69 6e  t..**.** For fin
19ca0 64 65 72 2d 66 75 6e 74 69 6f 6e 20 46 2c 20 74  der-funtion F, t
19cb0 77 6f 20 6f 62 6a 65 63 74 73 20 61 72 65 20 63  wo objects are c
19cc0 72 65 61 74 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20  reated:.**.**   
19cd0 20 28 31 29 20 54 68 65 20 72 65 61 6c 20 66 69   (1) The real fi
19ce0 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 6e 61  nder-function na
19cf0 6d 65 64 20 22 46 49 6d 70 74 28 29 22 2e 0a 2a  med "FImpt()"..*
19d00 2a 0a 2a 2a 20 20 20 20 28 32 29 20 41 20 63 6f  *.**    (2) A co
19d10 6e 73 74 61 6e 74 20 70 6f 69 6e 74 65 72 20 74  nstant pointer t
19d20 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  o this function 
19d30 6e 61 6d 65 64 20 6a 75 73 74 20 22 46 22 2e 0a  named just "F"..
19d40 2a 2a 0a 2a 2a 0a 2a 2a 20 41 20 70 6f 69 6e 74  **.**.** A point
19d50 65 72 20 74 6f 20 74 68 65 20 46 20 70 6f 69 6e  er to the F poin
19d60 74 65 72 20 69 73 20 75 73 65 64 20 61 73 20 74  ter is used as t
19d70 68 65 20 70 41 70 70 44 61 74 61 20 76 61 6c 75  he pAppData valu
19d80 65 20 66 6f 72 20 56 46 53 0a 2a 2a 20 6f 62 6a  e for VFS.** obj
19d90 65 63 74 73 2e 20 20 57 65 20 68 61 76 65 20 74  ects.  We have t
19da0 6f 20 64 6f 20 74 68 69 73 20 69 6e 73 74 65 61  o do this instea
19db0 64 20 6f 66 20 6c 65 74 74 69 6e 67 20 70 41 70  d of letting pAp
19dc0 70 44 61 74 61 20 70 6f 69 6e 74 0a 2a 2a 20 64  pData point.** d
19dd0 69 72 65 63 74 6c 79 20 61 74 20 74 68 65 20 66  irectly at the f
19de0 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 73  inder-function s
19df0 69 6e 63 65 20 43 39 30 20 72 75 6c 65 73 20 70  ince C90 rules p
19e00 72 65 76 65 6e 74 20 61 20 76 6f 69 64 2a 0a 2a  revent a void*.*
19e10 2a 20 66 72 6f 6d 20 62 65 20 63 61 73 74 20 69  * from be cast i
19e20 6e 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 70  nto a function p
19e30 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a  ointer..**.**.**
19e40 20 45 61 63 68 20 69 6e 73 74 61 6e 63 65 20 6f   Each instance o
19e50 66 20 74 68 69 73 20 6d 61 63 72 6f 20 67 65 6e  f this macro gen
19e60 65 72 61 74 65 73 20 74 77 6f 20 6f 62 6a 65 63  erates two objec
19e70 74 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 41  ts:.**.**   *  A
19e80 20 63 6f 6e 73 74 61 6e 74 20 73 71 6c 69 74 65   constant sqlite
19e90 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a  3_io_methods obj
19ea0 65 63 74 20 63 61 6c 6c 20 4d 45 54 48 4f 44 20  ect call METHOD 
19eb0 74 68 61 74 20 68 61 73 20 6c 6f 63 6b 69 6e 67  that has locking
19ec0 0a 2a 2a 20 20 20 20 20 20 6d 65 74 68 6f 64 73  .**      methods
19ed0 20 43 4c 4f 53 45 2c 20 4c 4f 43 4b 2c 20 55 4e   CLOSE, LOCK, UN
19ee0 4c 4f 43 4b 2c 20 43 4b 52 45 53 4c 4f 43 4b 2e  LOCK, CKRESLOCK.
19ef0 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 41 6e 20 49  .**.**   *  An I
19f00 2f 4f 20 6d 65 74 68 6f 64 20 66 69 6e 64 65 72  /O method finder
19f10 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64   function called
19f20 20 46 49 4e 44 45 52 20 74 68 61 74 20 72 65 74   FINDER that ret
19f30 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 0a 2a  urns a pointer.*
19f40 2a 20 20 20 20 20 20 74 6f 20 74 68 65 20 4d 45  *      to the ME
19f50 54 48 4f 44 20 6f 62 6a 65 63 74 20 69 6e 20 74  THOD object in t
19f60 68 65 20 70 72 65 76 69 6f 75 73 20 62 75 6c 6c  he previous bull
19f70 65 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 49  et..*/.#define I
19f80 4f 4d 45 54 48 4f 44 53 28 46 49 4e 44 45 52 2c  OMETHODS(FINDER,
19f90 20 4d 45 54 48 4f 44 2c 20 43 4c 4f 53 45 2c 20   METHOD, CLOSE, 
19fa0 4c 4f 43 4b 2c 20 55 4e 4c 4f 43 4b 2c 20 43 4b  LOCK, UNLOCK, CK
19fb0 4c 4f 43 4b 29 20 20 20 20 20 20 20 20 20 20 20  LOCK)           
19fc0 20 20 20 20 5c 0a 73 74 61 74 69 63 20 63 6f 6e      \.static con
19fd0 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  st sqlite3_io_me
19fe0 74 68 6f 64 73 20 4d 45 54 48 4f 44 20 3d 20 7b  thods METHOD = {
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 20 20 20 20 20                  
1a010 20 20 20 5c 0a 20 20 20 31 2c 20 20 20 20 20 20     \.   1,      
1a020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a030 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20      /* iVersion 
1a040 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
1a050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a060 20 20 5c 0a 20 20 20 43 4c 4f 53 45 2c 20 20 20    \.   CLOSE,   
1a070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a080 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 2a 2f 20     /* xClose */ 
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 20 20 20 20 20 20 20                  
1a0b0 20 5c 0a 20 20 20 75 6e 69 78 52 65 61 64 2c 20   \.   unixRead, 
1a0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a0d0 20 20 2f 2a 20 78 52 65 61 64 20 2a 2f 20 20 20    /* xRead */   
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 20 20 20 20 20 20 20 20                  
1a100 5c 0a 20 20 20 75 6e 69 78 57 72 69 74 65 2c 20  \.   unixWrite, 
1a110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a120 20 2f 2a 20 78 57 72 69 74 65 20 2a 2f 20 20 20   /* xWrite */   
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 20 20 20 20 20 20 20 20 5c                 \
1a150 0a 20 20 20 75 6e 69 78 54 72 75 6e 63 61 74 65  .   unixTruncate
1a160 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1a170 2f 2a 20 78 54 72 75 6e 63 61 74 65 20 2a 2f 20  /* xTruncate */ 
1a180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
1a1a0 20 20 20 75 6e 69 78 53 79 6e 63 2c 20 20 20 20     unixSync,    
1a1b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1a1c0 2a 20 78 53 79 6e 63 20 2a 2f 20 20 20 20 20 20  * xSync */      
1a1d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a1e0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
1a1f0 20 20 75 6e 69 78 46 69 6c 65 53 69 7a 65 2c 20    unixFileSize, 
1a200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a210 20 78 46 69 6c 65 53 69 7a 65 20 2a 2f 20 20 20   xFileSize */   
1a220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a230 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
1a240 20 4c 4f 43 4b 2c 20 20 20 20 20 20 20 20 20 20   LOCK,          
1a250 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a260 78 4c 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20 20  xLock */        
1a270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a280 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
1a290 55 4e 4c 4f 43 4b 2c 20 20 20 20 20 20 20 20 20  UNLOCK,         
1a2a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
1a2b0 55 6e 6c 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20  Unlock */       
1a2c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a2d0 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 43            \.   C
1a2e0 4b 4c 4f 43 4b 2c 20 20 20 20 20 20 20 20 20 20  KLOCK,          
1a2f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
1a300 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
1a310 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
1a320 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e           \.   un
1a330 69 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 2c 20 20  ixFileControl,  
1a340 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69            /* xFi
1a350 6c 65 43 6f 6e 74 72 6f 6c 20 2a 2f 20 20 20 20  leControl */    
1a360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a370 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69          \.   uni
1a380 78 53 65 63 74 6f 72 53 69 7a 65 2c 20 20 20 20  xSectorSize,    
1a390 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 65 63           /* xSec
1a3a0 74 6f 72 53 69 7a 65 20 2a 2f 20 20 20 20 20 20  torSize */      
1a3b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a3c0 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78         \.   unix
1a3d0 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
1a3e0 73 74 69 63 73 20 20 20 2f 2a 20 78 44 65 76 69  stics   /* xDevi
1a3f0 63 65 43 61 70 61 62 69 6c 69 74 69 65 73 20 2a  ceCapabilities *
1a400 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
1a410 20 20 20 20 20 20 5c 0a 7d 3b 20 20 20 20 20 20        \.};      
1a420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a460 20 20 20 20 20 5c 0a 73 74 61 74 69 63 20 63 6f       \.static co
1a470 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  nst sqlite3_io_m
1a480 65 74 68 6f 64 73 20 2a 46 49 4e 44 45 52 23 23  ethods *FINDER##
1a490 49 6d 70 6c 28 63 6f 6e 73 74 20 63 68 61 72 20  Impl(const char 
1a4a0 2a 7a 2c 20 75 6e 69 78 46 69 6c 65 20 2a 70 29  *z, unixFile *p)
1a4b0 7b 20 20 20 5c 0a 20 20 55 4e 55 53 45 44 5f 50  {   \.  UNUSED_P
1a4c0 41 52 41 4d 45 54 45 52 28 7a 29 3b 20 55 4e 55  ARAMETER(z); UNU
1a4d0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29  SED_PARAMETER(p)
1a4e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1a4f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a500 20 20 20 5c 0a 20 20 72 65 74 75 72 6e 20 26 4d     \.  return &M
1a510 45 54 48 4f 44 3b 20 20 20 20 20 20 20 20 20 20  ETHOD;          
1a520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a550 20 20 5c 0a 7d 20 20 20 20 20 20 20 20 20 20 20    \.}           
1a560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a5a0 20 5c 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20   \.static const 
1a5b0 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
1a5c0 64 73 20 2a 28 2a 63 6f 6e 73 74 20 46 49 4e 44  ds *(*const FIND
1a5d0 45 52 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c  ER)(const char*,
1a5e0 75 6e 69 78 46 69 6c 65 20 2a 70 29 20 20 20 20  unixFile *p)    
1a5f0 5c 0a 20 20 20 20 3d 20 46 49 4e 44 45 52 23 23  \.    = FINDER##
1a600 49 6d 70 6c 3b 0a 0a 2f 2a 0a 2a 2a 20 48 65 72  Impl;../*.** Her
1a610 65 20 61 72 65 20 61 6c 6c 20 6f 66 20 74 68 65  e are all of the
1a620 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
1a630 6f 64 73 20 6f 62 6a 65 63 74 73 20 66 6f 72 20  ods objects for 
1a640 65 61 63 68 20 6f 66 20 74 68 65 0a 2a 2a 20 6c  each of the.** l
1a650 6f 63 6b 69 6e 67 20 73 74 72 61 74 65 67 69 65  ocking strategie
1a660 73 2e 20 20 46 75 6e 63 74 69 6f 6e 73 20 74 68  s.  Functions th
1a670 61 74 20 72 65 74 75 72 6e 20 70 6f 69 6e 74 65  at return pointe
1a680 72 73 20 74 6f 20 74 68 65 73 65 20 6d 65 74 68  rs to these meth
1a690 6f 64 73 0a 2a 2a 20 61 72 65 20 61 6c 73 6f 20  ods.** are also 
1a6a0 63 72 65 61 74 65 64 2e 0a 2a 2f 0a 49 4f 4d 45  created..*/.IOME
1a6b0 54 48 4f 44 53 28 0a 20 20 70 6f 73 69 78 49 6f  THODS(.  posixIo
1a6c0 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20  Finder,         
1a6d0 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e     /* Finder fun
1a6e0 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  ction name */.  
1a6f0 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 2c 20  posixIoMethods, 
1a700 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c            /* sql
1a710 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
1a720 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20  object name */. 
1a730 20 75 6e 69 78 43 6c 6f 73 65 2c 20 20 20 20 20   unixClose,     
1a740 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
1a750 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lose method */. 
1a760 20 75 6e 69 78 4c 6f 63 6b 2c 20 20 20 20 20 20   unixLock,      
1a770 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c             /* xL
1a780 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
1a790 75 6e 69 78 55 6e 6c 6f 63 6b 2c 20 20 20 20 20  unixUnlock,     
1a7a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e            /* xUn
1a7b0 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lock method */. 
1a7c0 20 75 6e 69 78 43 68 65 63 6b 52 65 73 65 72 76   unixCheckReserv
1a7d0 65 64 4c 6f 63 6b 20 20 20 20 20 2f 2a 20 78 43  edLock     /* xC
1a7e0 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
1a7f0 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 49 4f 4d   method */.).IOM
1a800 45 54 48 4f 44 53 28 0a 20 20 6e 6f 6c 6f 63 6b  ETHODS(.  nolock
1a810 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20  IoFinder,       
1a820 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75      /* Finder fu
1a830 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20  nction name */. 
1a840 20 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73   nolockIoMethods
1a850 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71  ,          /* sq
1a860 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
1a870 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a   object name */.
1a880 20 20 6e 6f 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20    nolockClose,  
1a890 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
1a8a0 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a  Close method */.
1a8b0 20 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20    nolockLock,   
1a8c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
1a8d0 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  Lock method */. 
1a8e0 20 6e 6f 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20   nolockUnlock,  
1a8f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55             /* xU
1a900 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  nlock method */.
1a910 20 20 6e 6f 6c 6f 63 6b 43 68 65 63 6b 52 65 73    nolockCheckRes
1a920 65 72 76 65 64 4c 6f 63 6b 20 20 20 2f 2a 20 78  ervedLock   /* x
1a930 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
1a940 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 49 4f  k method */.).IO
1a950 4d 45 54 48 4f 44 53 28 0a 20 20 64 6f 74 6c 6f  METHODS(.  dotlo
1a960 63 6b 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20  ckIoFinder,     
1a970 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66       /* Finder f
1a980 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a  unction name */.
1a990 20 20 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f    dotlockIoMetho
1a9a0 64 73 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 73  ds,         /* s
1a9b0 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
1a9c0 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f  s object name */
1a9d0 0a 20 20 64 6f 74 6c 6f 63 6b 43 6c 6f 73 65 2c  .  dotlockClose,
1a9e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a9f0 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f  xClose method */
1aa00 0a 20 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 2c 20  .  dotlockLock, 
1aa10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1aa20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  xLock method */.
1aa30 20 20 64 6f 74 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c    dotlockUnlock,
1aa40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
1aa50 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f  Unlock method */
1aa60 0a 20 20 64 6f 74 6c 6f 63 6b 43 68 65 63 6b 52  .  dotlockCheckR
1aa70 65 73 65 72 76 65 64 4c 6f 63 6b 20 20 2f 2a 20  eservedLock  /* 
1aa80 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
1aa90 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 0a  ck method */.)..
1aaa0 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  #if SQLITE_ENABL
1aab0 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
1aac0 26 26 20 21 4f 53 5f 56 58 57 4f 52 4b 53 0a 49  && !OS_VXWORKS.I
1aad0 4f 4d 45 54 48 4f 44 53 28 0a 20 20 66 6c 6f 63  OMETHODS(.  floc
1aae0 6b 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20  kIoFinder,      
1aaf0 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20        /* Finder 
1ab00 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f  function name */
1ab10 0a 20 20 66 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64  .  flockIoMethod
1ab20 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  s,           /* 
1ab30 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
1ab40 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a  ds object name *
1ab50 2f 0a 20 20 66 6c 6f 63 6b 43 6c 6f 73 65 2c 20  /.  flockClose, 
1ab60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ab70 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a   xClose method *
1ab80 2f 0a 20 20 66 6c 6f 63 6b 4c 6f 63 6b 2c 20 20  /.  flockLock,  
1ab90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1aba0 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f   xLock method */
1abb0 0a 20 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20  .  flockUnlock, 
1abc0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1abd0 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  xUnlock method *
1abe0 2f 0a 20 20 66 6c 6f 63 6b 43 68 65 63 6b 52 65  /.  flockCheckRe
1abf0 73 65 72 76 65 64 4c 6f 63 6b 20 20 20 20 2f 2a  servedLock    /*
1ac00 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
1ac10 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a  ock method */.).
1ac20 23 65 6e 64 69 66 0a 0a 23 69 66 20 4f 53 5f 56  #endif..#if OS_V
1ac30 58 57 4f 52 4b 53 0a 49 4f 4d 45 54 48 4f 44 53  XWORKS.IOMETHODS
1ac40 28 0a 20 20 73 65 6d 49 6f 46 69 6e 64 65 72 2c  (.  semIoFinder,
1ac50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ac60 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e   Finder function
1ac70 20 6e 61 6d 65 20 2a 2f 0a 20 20 73 65 6d 49 6f   name */.  semIo
1ac80 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20  Methods,        
1ac90 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f       /* sqlite3_
1aca0 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63  io_methods objec
1acb0 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 73 65 6d 43  t name */.  semC
1acc0 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  lose,           
1acd0 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20        /* xClose 
1ace0 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 73 65 6d 4c  method */.  semL
1acf0 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
1ad00 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d        /* xLock m
1ad10 65 74 68 6f 64 20 2a 2f 0a 20 20 73 65 6d 55 6e  ethod */.  semUn
1ad20 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  lock,           
1ad30 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20       /* xUnlock 
1ad40 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 73 65 6d 43  method */.  semC
1ad50 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
1ad60 20 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52        /* xCheckR
1ad70 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68  eservedLock meth
1ad80 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a  od */.).#endif..
1ad90 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50  #if defined(__AP
1ada0 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45  PLE__) && SQLITE
1adb0 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
1adc0 53 54 59 4c 45 0a 49 4f 4d 45 54 48 4f 44 53 28  STYLE.IOMETHODS(
1add0 0a 20 20 61 66 70 49 6f 46 69 6e 64 65 72 2c 20  .  afpIoFinder, 
1ade0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1adf0 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20  Finder function 
1ae00 6e 61 6d 65 20 2a 2f 0a 20 20 61 66 70 49 6f 4d  name */.  afpIoM
1ae10 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20  ethods,         
1ae20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69      /* sqlite3_i
1ae30 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74  o_methods object
1ae40 20 6e 61 6d 65 20 2a 2f 0a 20 20 61 66 70 43 6c   name */.  afpCl
1ae50 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ose,            
1ae60 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d       /* xClose m
1ae70 65 74 68 6f 64 20 2a 2f 0a 20 20 61 66 70 4c 6f  ethod */.  afpLo
1ae80 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
1ae90 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65       /* xLock me
1aea0 74 68 6f 64 20 2a 2f 0a 20 20 61 66 70 55 6e 6c  thod */.  afpUnl
1aeb0 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
1aec0 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d      /* xUnlock m
1aed0 65 74 68 6f 64 20 2a 2f 0a 20 20 61 66 70 43 68  ethod */.  afpCh
1aee0 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20  eckReservedLock 
1aef0 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65       /* xCheckRe
1af00 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f  servedLock metho
1af10 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 2f  d */.).#endif../
1af20 2a 0a 2a 2a 20 54 68 65 20 22 57 68 6f 6c 65 20  *.** The "Whole 
1af30 46 69 6c 65 20 4c 6f 63 6b 69 6e 67 22 20 66 69  File Locking" fi
1af40 6e 64 65 72 20 72 65 74 75 72 6e 73 20 74 68 65  nder returns the
1af50 20 73 61 6d 65 20 73 65 74 20 6f 66 20 6d 65 74   same set of met
1af60 68 6f 64 73 20 61 73 0a 2a 2a 20 74 68 65 20 70  hods as.** the p
1af70 6f 73 69 78 20 6c 6f 63 6b 69 6e 67 20 66 69 6e  osix locking fin
1af80 64 65 72 2e 20 20 42 75 74 20 69 74 20 61 6c 73  der.  But it als
1af90 6f 20 73 65 74 73 20 74 68 65 20 53 51 4c 49 54  o sets the SQLIT
1afa0 45 5f 57 48 4f 4c 45 5f 46 49 4c 45 5f 4c 4f 43  E_WHOLE_FILE_LOC
1afb0 4b 49 4e 47 0a 2a 2a 20 66 6c 61 67 20 74 6f 20  KING.** flag to 
1afc0 66 6f 72 63 65 20 74 68 65 20 70 6f 73 69 78 20  force the posix 
1afd0 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20 74  advisory locks t
1afe0 6f 20 63 6f 76 65 72 20 74 68 65 20 77 68 6f 6c  o cover the whol
1aff0 65 20 66 69 6c 65 20 69 6e 73 74 65 61 64 0a 2a  e file instead.*
1b000 2a 20 6f 66 20 6a 75 73 74 20 61 20 73 6d 61 6c  * of just a smal
1b010 6c 20 73 70 61 6e 20 6f 66 20 62 79 74 65 73 20  l span of bytes 
1b020 6e 65 61 72 20 74 68 65 20 31 47 69 42 20 62 6f  near the 1GiB bo
1b030 75 6e 64 61 72 79 2e 20 20 57 68 6f 6c 65 20 46  undary.  Whole F
1b040 69 6c 65 20 4c 6f 63 6b 69 6e 67 0a 2a 2a 20 69  ile Locking.** i
1b050 73 20 75 73 65 66 75 6c 20 6f 6e 20 4e 46 53 2d  s useful on NFS-
1b060 6d 6f 75 6e 74 65 64 20 66 69 6c 65 73 20 73 69  mounted files si
1b070 6e 63 65 20 69 74 20 68 65 6c 70 73 20 4e 46 53  nce it helps NFS
1b080 20 74 6f 20 6d 61 69 6e 74 61 69 6e 20 63 61 63   to maintain cac
1b090 68 65 0a 2a 2a 20 63 6f 68 65 72 65 6e 63 79 2e  he.** coherency.
1b0a0 20 20 42 75 74 20 69 74 20 69 73 20 61 20 64 65    But it is a de
1b0b0 74 72 69 6d 65 6e 74 20 74 6f 20 6f 74 68 65 72  triment to other
1b0c0 20 66 69 6c 65 73 79 73 74 65 6d 73 20 73 69 6e   filesystems sin
1b0d0 63 65 20 69 74 20 72 75 6e 73 0a 2a 2a 20 73 6c  ce it runs.** sl
1b0e0 6f 77 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ower..*/.static 
1b0f0 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f  const sqlite3_io
1b100 5f 6d 65 74 68 6f 64 73 20 2a 70 6f 73 69 78 57  _methods *posixW
1b110 66 6c 49 6f 46 69 6e 64 65 72 49 6d 70 6c 28 63  flIoFinderImpl(c
1b120 6f 6e 73 74 20 63 68 61 72 2a 7a 2c 20 75 6e 69  onst char*z, uni
1b130 78 46 69 6c 65 2a 70 29 7b 0a 20 20 55 4e 55 53  xFile*p){.  UNUS
1b140 45 44 5f 50 41 52 41 4d 45 54 45 52 28 7a 29 3b  ED_PARAMETER(z);
1b150 0a 20 20 70 2d 3e 66 69 6c 65 46 6c 61 67 73 20  .  p->fileFlags 
1b160 3d 20 53 51 4c 49 54 45 5f 57 48 4f 4c 45 5f 46  = SQLITE_WHOLE_F
1b170 49 4c 45 5f 4c 4f 43 4b 49 4e 47 3b 0a 20 20 72  ILE_LOCKING;.  r
1b180 65 74 75 72 6e 20 26 70 6f 73 69 78 49 6f 4d 65  eturn &posixIoMe
1b190 74 68 6f 64 73 3b 0a 7d 0a 73 74 61 74 69 63 20  thods;.}.static 
1b1a0 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f  const sqlite3_io
1b1b0 5f 6d 65 74 68 6f 64 73 20 0a 20 20 2a 28 2a 63  _methods .  *(*c
1b1c0 6f 6e 73 74 20 70 6f 73 69 78 57 66 6c 49 6f 46  onst posixWflIoF
1b1d0 69 6e 64 65 72 29 28 63 6f 6e 73 74 20 63 68 61  inder)(const cha
1b1e0 72 2a 2c 75 6e 69 78 46 69 6c 65 20 2a 70 29 20  r*,unixFile *p) 
1b1f0 3d 20 70 6f 73 69 78 57 66 6c 49 6f 46 69 6e 64  = posixWflIoFind
1b200 65 72 49 6d 70 6c 3b 0a 0a 2f 2a 0a 2a 2a 20 54  erImpl;../*.** T
1b210 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67  he proxy locking
1b220 20 6d 65 74 68 6f 64 20 69 73 20 61 20 22 73 75   method is a "su
1b230 70 65 72 2d 6d 65 74 68 6f 64 22 20 69 6e 20 74  per-method" in t
1b240 68 65 20 73 65 6e 73 65 20 74 68 61 74 20 69 74  he sense that it
1b250 0a 2a 2a 20 6f 70 65 6e 73 20 73 65 63 6f 6e 64  .** opens second
1b260 61 72 79 20 66 69 6c 65 20 64 65 73 63 72 69 70  ary file descrip
1b270 74 6f 72 73 20 66 6f 72 20 74 68 65 20 63 6f 6e  tors for the con
1b280 63 68 20 61 6e 64 20 6c 6f 63 6b 20 66 69 6c 65  ch and lock file
1b290 73 20 61 6e 64 0a 2a 2a 20 69 74 20 75 73 65 73  s and.** it uses
1b2a0 20 70 72 6f 78 79 2c 20 64 6f 74 2d 66 69 6c 65   proxy, dot-file
1b2b0 2c 20 41 46 50 2c 20 61 6e 64 20 66 6c 6f 63 6b  , AFP, and flock
1b2c0 28 29 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f  () locking metho
1b2d0 64 73 20 6f 6e 20 74 68 6f 73 65 0a 2a 2a 20 73  ds on those.** s
1b2e0 65 63 6f 6e 64 61 72 79 20 66 69 6c 65 73 2e 20  econdary files. 
1b2f0 20 46 6f 72 20 74 68 69 73 20 72 65 61 73 6f 6e   For this reason
1b300 2c 20 74 68 65 20 64 69 76 69 73 69 6f 6e 20 74  , the division t
1b310 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 0a 2a  hat implements.*
1b320 2a 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20  * proxy locking 
1b330 69 73 20 6c 6f 63 61 74 65 64 20 6d 75 63 68 20  is located much 
1b340 66 75 72 74 68 65 72 20 64 6f 77 6e 20 69 6e 20  further down in 
1b350 74 68 65 20 66 69 6c 65 2e 20 20 42 75 74 20 77  the file.  But w
1b360 65 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 67 6f 20  e need.** to go 
1b370 61 68 65 61 64 20 61 6e 64 20 64 65 66 69 6e 65  ahead and define
1b380 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f   the sqlite3_io_
1b390 6d 65 74 68 6f 64 73 20 61 6e 64 20 66 69 6e 64  methods and find
1b3a0 65 72 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 66  er function.** f
1b3b0 6f 72 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67  or proxy locking
1b3c0 20 68 65 72 65 2e 20 20 53 6f 20 77 65 20 66 6f   here.  So we fo
1b3d0 72 77 61 72 64 20 64 65 63 6c 61 72 65 20 74 68  rward declare th
1b3e0 65 20 49 2f 4f 20 6d 65 74 68 6f 64 73 2e 0a 2a  e I/O methods..*
1b3f0 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  /.#if defined(__
1b400 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
1b410 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
1b420 47 5f 53 54 59 4c 45 0a 73 74 61 74 69 63 20 69  G_STYLE.static i
1b430 6e 74 20 70 72 6f 78 79 43 6c 6f 73 65 28 73 71  nt proxyClose(sq
1b440 6c 69 74 65 33 5f 66 69 6c 65 2a 29 3b 0a 73 74  lite3_file*);.st
1b450 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 4c 6f  atic int proxyLo
1b460 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  ck(sqlite3_file*
1b470 2c 20 69 6e 74 29 3b 0a 73 74 61 74 69 63 20 69  , int);.static i
1b480 6e 74 20 70 72 6f 78 79 55 6e 6c 6f 63 6b 28 73  nt proxyUnlock(s
1b490 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e  qlite3_file*, in
1b4a0 74 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 70  t);.static int p
1b4b0 72 6f 78 79 43 68 65 63 6b 52 65 73 65 72 76 65  roxyCheckReserve
1b4c0 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  dLock(sqlite3_fi
1b4d0 6c 65 2a 2c 20 69 6e 74 2a 29 3b 0a 49 4f 4d 45  le*, int*);.IOME
1b4e0 54 48 4f 44 53 28 0a 20 20 70 72 6f 78 79 49 6f  THODS(.  proxyIo
1b4f0 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20  Finder,         
1b500 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e     /* Finder fun
1b510 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  ction name */.  
1b520 70 72 6f 78 79 49 6f 4d 65 74 68 6f 64 73 2c 20  proxyIoMethods, 
1b530 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c            /* sql
1b540 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
1b550 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20  object name */. 
1b560 20 70 72 6f 78 79 43 6c 6f 73 65 2c 20 20 20 20   proxyClose,    
1b570 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
1b580 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lose method */. 
1b590 20 70 72 6f 78 79 4c 6f 63 6b 2c 20 20 20 20 20   proxyLock,     
1b5a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c             /* xL
1b5b0 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
1b5c0 70 72 6f 78 79 55 6e 6c 6f 63 6b 2c 20 20 20 20  proxyUnlock,    
1b5d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e            /* xUn
1b5e0 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lock method */. 
1b5f0 20 70 72 6f 78 79 43 68 65 63 6b 52 65 73 65 72   proxyCheckReser
1b600 76 65 64 4c 6f 63 6b 20 20 20 20 2f 2a 20 78 43  vedLock    /* xC
1b610 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
1b620 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e   method */.).#en
1b630 64 69 66 0a 0a 0a 23 69 66 20 64 65 66 69 6e 65  dif...#if define
1b640 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20  d(__APPLE__) && 
1b650 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
1b660 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 20 0a  CKING_STYLE./* .
1b670 2a 2a 20 54 68 69 73 20 22 66 69 6e 64 65 72 22  ** This "finder"
1b680 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70   function attemp
1b690 74 73 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ts to determine 
1b6a0 74 68 65 20 62 65 73 74 20 6c 6f 63 6b 69 6e 67  the best locking
1b6b0 20 73 74 72 61 74 65 67 79 20 0a 2a 2a 20 66 6f   strategy .** fo
1b6c0 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  r the database f
1b6d0 69 6c 65 20 22 66 69 6c 65 50 61 74 68 22 2e 20  ile "filePath". 
1b6e0 20 49 74 20 74 68 65 6e 20 72 65 74 75 72 6e 73   It then returns
1b6f0 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f   the sqlite3_io_
1b700 6d 65 74 68 6f 64 73 0a 2a 2a 20 6f 62 6a 65 63  methods.** objec
1b710 74 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74  t that implement
1b720 73 20 74 68 61 74 20 73 74 72 61 74 65 67 79 2e  s that strategy.
1b730 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 66  .**.** This is f
1b740 6f 72 20 4d 61 63 4f 53 58 20 6f 6e 6c 79 2e 0a  or MacOSX only..
1b750 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
1b760 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
1b770 64 73 20 2a 61 75 74 6f 6c 6f 63 6b 49 6f 46 69  ds *autolockIoFi
1b780 6e 64 65 72 49 6d 70 6c 28 0a 20 20 63 6f 6e 73  nderImpl(.  cons
1b790 74 20 63 68 61 72 20 2a 66 69 6c 65 50 61 74 68  t char *filePath
1b7a0 2c 20 20 20 20 2f 2a 20 6e 61 6d 65 20 6f 66 20  ,    /* name of 
1b7b0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1b7c0 65 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20  e */.  unixFile 
1b7d0 2a 70 4e 65 77 20 20 20 20 20 20 20 20 20 20 20  *pNew           
1b7e0 2f 2a 20 6f 70 65 6e 20 66 69 6c 65 20 6f 62 6a  /* open file obj
1b7f0 65 63 74 20 66 6f 72 20 74 68 65 20 64 61 74 61  ect for the data
1b800 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a  base file */.){.
1b810 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73    static const s
1b820 74 72 75 63 74 20 4d 61 70 70 69 6e 67 20 7b 0a  truct Mapping {.
1b830 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
1b840 7a 46 69 6c 65 73 79 73 74 65 6d 3b 20 20 20 20  zFilesystem;    
1b850 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
1b860 65 73 79 73 74 65 6d 20 74 79 70 65 20 6e 61 6d  esystem type nam
1b870 65 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 73  e */.    const s
1b880 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
1b890 73 20 2a 70 4d 65 74 68 6f 64 73 3b 20 20 20 2f  s *pMethods;   /
1b8a0 2a 20 41 70 70 72 6f 70 72 69 61 74 65 20 6c 6f  * Appropriate lo
1b8b0 63 6b 69 6e 67 20 6d 65 74 68 6f 64 20 2a 2f 0a  cking method */.
1b8c0 20 20 7d 20 61 4d 61 70 5b 5d 20 3d 20 7b 0a 20    } aMap[] = {. 
1b8d0 20 20 20 7b 20 22 68 66 73 22 2c 20 20 20 20 26     { "hfs",    &
1b8e0 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 20 7d  posixIoMethods }
1b8f0 2c 0a 20 20 20 20 7b 20 22 75 66 73 22 2c 20 20  ,.    { "ufs",  
1b900 20 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64    &posixIoMethod
1b910 73 20 7d 2c 0a 20 20 20 20 7b 20 22 61 66 70 66  s },.    { "afpf
1b920 73 22 2c 20 20 26 61 66 70 49 6f 4d 65 74 68 6f  s",  &afpIoMetho
1b930 64 73 20 7d 2c 0a 23 69 66 64 65 66 20 53 51 4c  ds },.#ifdef SQL
1b940 49 54 45 5f 45 4e 41 42 4c 45 5f 41 46 50 5f 4c  ITE_ENABLE_AFP_L
1b950 4f 43 4b 49 4e 47 5f 53 4d 42 0a 20 20 20 20 7b  OCKING_SMB.    {
1b960 20 22 73 6d 62 66 73 22 2c 20 20 26 61 66 70 49   "smbfs",  &afpI
1b970 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 23 65 6c 73  oMethods },.#els
1b980 65 0a 20 20 20 20 7b 20 22 73 6d 62 66 73 22 2c  e.    { "smbfs",
1b990 20 20 26 66 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64    &flockIoMethod
1b9a0 73 20 7d 2c 0a 23 65 6e 64 69 66 0a 20 20 20 20  s },.#endif.    
1b9b0 7b 20 22 77 65 62 64 61 76 22 2c 20 26 6e 6f 6c  { "webdav", &nol
1b9c0 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a  ockIoMethods },.
1b9d0 20 20 20 20 7b 20 30 2c 20 30 20 7d 0a 20 20 7d      { 0, 0 }.  }
1b9e0 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72  ;.  int i;.  str
1b9f0 75 63 74 20 73 74 61 74 66 73 20 66 73 49 6e 66  uct statfs fsInf
1ba00 6f 3b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63  o;.  struct floc
1ba10 6b 20 6c 6f 63 6b 49 6e 66 6f 3b 0a 0a 20 20 69  k lockInfo;..  i
1ba20 66 28 20 21 66 69 6c 65 50 61 74 68 20 29 7b 0a  f( !filePath ){.
1ba30 20 20 20 20 2f 2a 20 49 66 20 66 69 6c 65 50 61      /* If filePa
1ba40 74 68 3d 3d 4e 55 4c 4c 20 74 68 61 74 20 6d 65  th==NULL that me
1ba50 61 6e 73 20 77 65 20 61 72 65 20 64 65 61 6c 69  ans we are deali
1ba60 6e 67 20 77 69 74 68 20 61 20 74 72 61 6e 73 69  ng with a transi
1ba70 65 6e 74 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20  ent file.    ** 
1ba80 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65  that does not ne
1ba90 65 64 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 2e  ed to be locked.
1baa0 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 26   */.    return &
1bab0 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b  nolockIoMethods;
1bac0 0a 20 20 7d 0a 20 20 69 66 28 20 73 74 61 74 66  .  }.  if( statf
1bad0 73 28 66 69 6c 65 50 61 74 68 2c 20 26 66 73 49  s(filePath, &fsI
1bae0 6e 66 6f 29 20 21 3d 20 2d 31 20 29 7b 0a 20 20  nfo) != -1 ){.  
1baf0 20 20 69 66 28 20 66 73 49 6e 66 6f 2e 66 5f 66    if( fsInfo.f_f
1bb00 6c 61 67 73 20 26 20 4d 4e 54 5f 52 44 4f 4e 4c  lags & MNT_RDONL
1bb10 59 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  Y ){.      retur
1bb20 6e 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f  n &nolockIoMetho
1bb30 64 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  ds;.    }.    fo
1bb40 72 28 69 3d 30 3b 20 61 4d 61 70 5b 69 5d 2e 7a  r(i=0; aMap[i].z
1bb50 46 69 6c 65 73 79 73 74 65 6d 3b 20 69 2b 2b 29  Filesystem; i++)
1bb60 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63  {.      if( strc
1bb70 6d 70 28 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79  mp(fsInfo.f_fsty
1bb80 70 65 6e 61 6d 65 2c 20 61 4d 61 70 5b 69 5d 2e  pename, aMap[i].
1bb90 7a 46 69 6c 65 73 79 73 74 65 6d 29 3d 3d 30 20  zFilesystem)==0 
1bba0 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
1bbb0 6e 20 61 4d 61 70 5b 69 5d 2e 70 4d 65 74 68 6f  n aMap[i].pMetho
1bbc0 64 73 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ds;.      }.    
1bbd0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 66 61  }.  }..  /* Defa
1bbe0 75 6c 74 20 63 61 73 65 2e 20 48 61 6e 64 6c 65  ult case. Handle
1bbf0 73 2c 20 61 6d 6f 6e 67 73 74 20 6f 74 68 65 72  s, amongst other
1bc00 73 2c 20 22 6e 66 73 22 2e 0a 20 20 2a 2a 20 54  s, "nfs"..  ** T
1bc10 65 73 74 20 62 79 74 65 2d 72 61 6e 67 65 20 6c  est byte-range l
1bc20 6f 63 6b 20 75 73 69 6e 67 20 66 63 6e 74 6c 28  ock using fcntl(
1bc30 29 2e 20 49 66 20 74 68 65 20 63 61 6c 6c 20 73  ). If the call s
1bc40 75 63 63 65 65 64 73 2c 20 0a 20 20 2a 2a 20 61  ucceeds, .  ** a
1bc50 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 20 66  ssume that the f
1bc60 69 6c 65 2d 73 79 73 74 65 6d 20 73 75 70 70 6f  ile-system suppo
1bc70 72 74 73 20 50 4f 53 49 58 20 73 74 79 6c 65 20  rts POSIX style 
1bc80 6c 6f 63 6b 73 2e 20 0a 20 20 2a 2f 0a 20 20 6c  locks. .  */.  l
1bc90 6f 63 6b 49 6e 66 6f 2e 6c 5f 6c 65 6e 20 3d 20  ockInfo.l_len = 
1bca0 31 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f  1;.  lockInfo.l_
1bcb0 73 74 61 72 74 20 3d 20 30 3b 0a 20 20 6c 6f 63  start = 0;.  loc
1bcc0 6b 49 6e 66 6f 2e 6c 5f 77 68 65 6e 63 65 20 3d  kInfo.l_whence =
1bcd0 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 6c 6f 63   SEEK_SET;.  loc
1bce0 6b 49 6e 66 6f 2e 6c 5f 74 79 70 65 20 3d 20 46  kInfo.l_type = F
1bcf0 5f 52 44 4c 43 4b 3b 0a 20 20 69 66 28 20 66 63  _RDLCK;.  if( fc
1bd00 6e 74 6c 28 70 4e 65 77 2d 3e 68 2c 20 46 5f 47  ntl(pNew->h, F_G
1bd10 45 54 4c 4b 2c 20 26 6c 6f 63 6b 49 6e 66 6f 29  ETLK, &lockInfo)
1bd20 21 3d 2d 31 20 29 20 7b 0a 20 20 20 20 70 4e 65  !=-1 ) {.    pNe
1bd30 77 2d 3e 66 69 6c 65 46 6c 61 67 73 20 3d 20 53  w->fileFlags = S
1bd40 51 4c 49 54 45 5f 57 48 4f 4c 45 5f 46 49 4c 45  QLITE_WHOLE_FILE
1bd50 5f 4c 4f 43 4b 49 4e 47 3b 0a 20 20 20 20 72 65  _LOCKING;.    re
1bd60 74 75 72 6e 20 26 70 6f 73 69 78 49 6f 4d 65 74  turn &posixIoMet
1bd70 68 6f 64 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  hods;.  }else{. 
1bd80 20 20 20 72 65 74 75 72 6e 20 26 64 6f 74 6c 6f     return &dotlo
1bd90 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d  ckIoMethods;.  }
1bda0 0a 7d 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .}.static const 
1bdb0 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
1bdc0 64 73 20 0a 20 20 2a 28 2a 63 6f 6e 73 74 20 61  ds .  *(*const a
1bdd0 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 29  utolockIoFinder)
1bde0 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69  (const char*,uni
1bdf0 78 46 69 6c 65 2a 29 20 3d 20 61 75 74 6f 6c 6f  xFile*) = autolo
1be00 63 6b 49 6f 46 69 6e 64 65 72 49 6d 70 6c 3b 0a  ckIoFinderImpl;.
1be10 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e  .#endif /* defin
1be20 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26  ed(__APPLE__) &&
1be30 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
1be40 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a  OCKING_STYLE */.
1be50 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 20  .#if OS_VXWORKS 
1be60 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
1be70 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f  _LOCKING_STYLE./
1be80 2a 20 0a 2a 2a 20 54 68 69 73 20 22 66 69 6e 64  * .** This "find
1be90 65 72 22 20 66 75 6e 63 74 69 6f 6e 20 61 74 74  er" function att
1bea0 65 6d 70 74 73 20 74 6f 20 64 65 74 65 72 6d 69  empts to determi
1beb0 6e 65 20 74 68 65 20 62 65 73 74 20 6c 6f 63 6b  ne the best lock
1bec0 69 6e 67 20 73 74 72 61 74 65 67 79 20 0a 2a 2a  ing strategy .**
1bed0 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73   for the databas
1bee0 65 20 66 69 6c 65 20 22 66 69 6c 65 50 61 74 68  e file "filePath
1bef0 22 2e 20 20 49 74 20 74 68 65 6e 20 72 65 74 75  ".  It then retu
1bf00 72 6e 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f  rns the sqlite3_
1bf10 69 6f 5f 6d 65 74 68 6f 64 73 0a 2a 2a 20 6f 62  io_methods.** ob
1bf20 6a 65 63 74 20 74 68 61 74 20 69 6d 70 6c 65 6d  ject that implem
1bf30 65 6e 74 73 20 74 68 61 74 20 73 74 72 61 74 65  ents that strate
1bf40 67 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  gy..**.** This i
1bf50 73 20 66 6f 72 20 56 58 57 6f 72 6b 73 20 6f 6e  s for VXWorks on
1bf60 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  ly..*/.static co
1bf70 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  nst sqlite3_io_m
1bf80 65 74 68 6f 64 73 20 2a 61 75 74 6f 6c 6f 63 6b  ethods *autolock
1bf90 49 6f 46 69 6e 64 65 72 49 6d 70 6c 28 0a 20 20  IoFinderImpl(.  
1bfa0 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 69 6c 65  const char *file
1bfb0 50 61 74 68 2c 20 20 20 20 2f 2a 20 6e 61 6d 65  Path,    /* name
1bfc0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1bfd0 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 46   file */.  unixF
1bfe0 69 6c 65 20 2a 70 4e 65 77 20 20 20 20 20 20 20  ile *pNew       
1bff0 20 20 20 20 2f 2a 20 74 68 65 20 6f 70 65 6e 20      /* the open 
1c000 66 69 6c 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 29  file object */.)
1c010 7b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b  {.  struct flock
1c020 20 6c 6f 63 6b 49 6e 66 6f 3b 0a 0a 20 20 69 66   lockInfo;..  if
1c030 28 20 21 66 69 6c 65 50 61 74 68 20 29 7b 0a 20  ( !filePath ){. 
1c040 20 20 20 2f 2a 20 49 66 20 66 69 6c 65 50 61 74     /* If filePat
1c050 68 3d 3d 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61  h==NULL that mea
1c060 6e 73 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e  ns we are dealin
1c070 67 20 77 69 74 68 20 61 20 74 72 61 6e 73 69 65  g with a transie
1c080 6e 74 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 74  nt file.    ** t
1c090 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65  hat does not nee
1c0a0 64 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 2e 20  d to be locked. 
1c0b0 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 26 6e  */.    return &n
1c0c0 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a  olockIoMethods;.
1c0d0 20 20 7d 0a 0a 20 20 2f 2a 20 54 65 73 74 20 69    }..  /* Test i
1c0e0 66 20 66 63 6e 74 6c 28 29 20 69 73 20 73 75 70  f fcntl() is sup
1c0f0 70 6f 72 74 65 64 20 61 6e 64 20 75 73 65 20 50  ported and use P
1c100 4f 53 49 58 20 73 74 79 6c 65 20 6c 6f 63 6b 73  OSIX style locks
1c110 2e 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65  ..  ** Otherwise
1c120 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 74 68   fall back to th
1c130 65 20 6e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72  e named semaphor
1c140 65 20 6d 65 74 68 6f 64 2e 0a 20 20 2a 2f 0a 20  e method..  */. 
1c150 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 6c 65 6e 20   lockInfo.l_len 
1c160 3d 20 31 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e  = 1;.  lockInfo.
1c170 6c 5f 73 74 61 72 74 20 3d 20 30 3b 0a 20 20 6c  l_start = 0;.  l
1c180 6f 63 6b 49 6e 66 6f 2e 6c 5f 77 68 65 6e 63 65  ockInfo.l_whence
1c190 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 6c   = SEEK_SET;.  l
1c1a0 6f 63 6b 49 6e 66 6f 2e 6c 5f 74 79 70 65 20 3d  ockInfo.l_type =
1c1b0 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 69 66 28 20   F_RDLCK;.  if( 
1c1c0 66 63 6e 74 6c 28 70 4e 65 77 2d 3e 68 2c 20 46  fcntl(pNew->h, F
1c1d0 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63 6b 49 6e 66  _GETLK, &lockInf
1c1e0 6f 29 21 3d 2d 31 20 29 20 7b 0a 20 20 20 20 72  o)!=-1 ) {.    r
1c1f0 65 74 75 72 6e 20 26 70 6f 73 69 78 49 6f 4d 65  eturn &posixIoMe
1c200 74 68 6f 64 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a  thods;.  }else{.
1c210 20 20 20 20 72 65 74 75 72 6e 20 26 73 65 6d 49      return &semI
1c220 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 7d 0a  oMethods;.  }.}.
1c230 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c  static const sql
1c240 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
1c250 0a 20 20 2a 28 2a 63 6f 6e 73 74 20 61 75 74 6f  .  *(*const auto
1c260 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 29 28 63 6f  lockIoFinder)(co
1c270 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69 78 46 69  nst char*,unixFi
1c280 6c 65 2a 29 20 3d 20 61 75 74 6f 6c 6f 63 6b 49  le*) = autolockI
1c290 6f 46 69 6e 64 65 72 49 6d 70 6c 3b 0a 0a 23 65  oFinderImpl;..#e
1c2a0 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52  ndif /* OS_VXWOR
1c2b0 4b 53 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  KS && SQLITE_ENA
1c2c0 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
1c2d0 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 61  E */../*.** An a
1c2e0 62 73 74 72 61 63 74 20 74 79 70 65 20 66 6f 72  bstract type for
1c2f0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
1c300 49 4f 20 6d 65 74 68 6f 64 20 66 69 6e 64 65 72  IO method finder
1c310 20 66 75 6e 63 74 69 6f 6e 3a 0a 2a 2f 0a 74 79   function:.*/.ty
1c320 70 65 64 65 66 20 63 6f 6e 73 74 20 73 71 6c 69  pedef const sqli
1c330 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a  te3_io_methods *
1c340 28 2a 66 69 6e 64 65 72 5f 74 79 70 65 29 28 63  (*finder_type)(c
1c350 6f 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69 78 46  onst char*,unixF
1c360 69 6c 65 2a 29 3b 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a  ile*);.../******
1c370 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c380 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c390 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c3a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c3b0 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
1c3c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c3d0 2a 2a 2a 20 73 71 6c 69 74 65 33 5f 76 66 73 20  *** sqlite3_vfs 
1c3e0 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a  methods ********
1c3f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c400 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ****.**.** This 
1c410 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74 61 69 6e  division contain
1c420 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
1c430 74 69 6f 6e 20 6f 66 20 6d 65 74 68 6f 64 73 20  tion of methods 
1c440 6f 6e 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65  on the.** sqlite
1c450 33 5f 76 66 73 20 6f 62 6a 65 63 74 2e 0a 2a 2f  3_vfs object..*/
1c460 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69  ../*.** Initiali
1c470 7a 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  ze the contents 
1c480 6f 66 20 74 68 65 20 75 6e 69 78 46 69 6c 65 20  of the unixFile 
1c490 73 74 72 75 63 74 75 72 65 20 70 6f 69 6e 74 65  structure pointe
1c4a0 64 20 74 6f 20 62 79 20 70 49 64 2e 0a 2a 2f 0a  d to by pId..*/.
1c4b0 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 6c 49  static int fillI
1c4c0 6e 55 6e 69 78 46 69 6c 65 28 0a 20 20 73 71 6c  nUnixFile(.  sql
1c4d0 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
1c4e0 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
1c4f0 74 6f 20 76 66 73 20 6f 62 6a 65 63 74 20 2a 2f  to vfs object */
1c500 0a 20 20 69 6e 74 20 68 2c 20 20 20 20 20 20 20  .  int h,       
1c510 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70             /* Op
1c520 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  en file descript
1c530 6f 72 20 6f 66 20 66 69 6c 65 20 62 65 69 6e 67  or of file being
1c540 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 69 6e 74   opened */.  int
1c550 20 64 69 72 66 64 2c 20 20 20 20 20 20 20 20 20   dirfd,         
1c560 20 20 20 20 20 2f 2a 20 44 69 72 65 63 74 6f 72       /* Director
1c570 79 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  y file descripto
1c580 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  r */.  sqlite3_f
1c590 69 6c 65 20 2a 70 49 64 2c 20 20 20 20 20 20 2f  ile *pId,      /
1c5a0 2a 20 57 72 69 74 65 20 74 6f 20 74 68 65 20 75  * Write to the u
1c5b0 6e 69 78 46 69 6c 65 20 73 74 72 75 63 74 75 72  nixFile structur
1c5c0 65 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73  e here */.  cons
1c5d0 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
1c5e0 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74  e,  /* Name of t
1c5f0 68 65 20 66 69 6c 65 20 62 65 69 6e 67 20 6f 70  he file being op
1c600 65 6e 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f  ened */.  int no
1c610 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Lock,           
1c620 20 20 2f 2a 20 4f 6d 69 74 20 6c 6f 63 6b 69 6e    /* Omit lockin
1c630 67 20 69 66 20 74 72 75 65 20 2a 2f 0a 20 20 69  g if true */.  i
1c640 6e 74 20 69 73 44 65 6c 65 74 65 20 20 20 20 20  nt isDelete     
1c650 20 20 20 20 20 20 20 2f 2a 20 44 65 6c 65 74 65         /* Delete
1c660 20 6f 6e 20 63 6c 6f 73 65 20 69 66 20 74 72 75   on close if tru
1c670 65 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  e */.){.  const 
1c680 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
1c690 64 73 20 2a 70 4c 6f 63 6b 69 6e 67 53 74 79 6c  ds *pLockingStyl
1c6a0 65 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  e;.  unixFile *p
1c6b0 4e 65 77 20 3d 20 28 75 6e 69 78 46 69 6c 65 20  New = (unixFile 
1c6c0 2a 29 70 49 64 3b 0a 20 20 69 6e 74 20 72 63 20  *)pId;.  int rc 
1c6d0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
1c6e0 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 70 4c  assert( pNew->pL
1c6f0 6f 63 6b 3d 3d 4e 55 4c 4c 20 29 3b 0a 20 20 61  ock==NULL );.  a
1c700 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 70 4f 70  ssert( pNew->pOp
1c710 65 6e 3d 3d 4e 55 4c 4c 20 29 3b 0a 0a 20 20 2f  en==NULL );..  /
1c720 2a 20 50 61 72 61 6d 65 74 65 72 20 69 73 44 65  * Parameter isDe
1c730 6c 65 74 65 20 69 73 20 6f 6e 6c 79 20 75 73 65  lete is only use
1c740 64 20 6f 6e 20 76 78 77 6f 72 6b 73 2e 20 45 78  d on vxworks. Ex
1c750 70 72 65 73 73 20 74 68 69 73 20 65 78 70 6c 69  press this expli
1c760 63 69 74 6c 79 20 0a 20 20 2a 2a 20 68 65 72 65  citly .  ** here
1c770 20 74 6f 20 70 72 65 76 65 6e 74 20 63 6f 6d 70   to prevent comp
1c780 69 6c 65 72 20 77 61 72 6e 69 6e 67 73 20 61 62  iler warnings ab
1c790 6f 75 74 20 75 6e 75 73 65 64 20 70 61 72 61 6d  out unused param
1c7a0 65 74 65 72 73 2e 0a 20 20 2a 2f 0a 20 20 55 4e  eters..  */.  UN
1c7b0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 69  USED_PARAMETER(i
1c7c0 73 44 65 6c 65 74 65 29 3b 0a 0a 20 20 4f 53 54  sDelete);..  OST
1c7d0 52 41 43 45 33 28 22 4f 50 45 4e 20 20 20 20 25  RACE3("OPEN    %
1c7e0 2d 33 64 20 25 73 5c 6e 22 2c 20 68 2c 20 7a 46  -3d %s\n", h, zF
1c7f0 69 6c 65 6e 61 6d 65 29 3b 20 20 20 20 0a 20 20  ilename);    .  
1c800 70 4e 65 77 2d 3e 68 20 3d 20 68 3b 0a 20 20 70  pNew->h = h;.  p
1c810 4e 65 77 2d 3e 64 69 72 66 64 20 3d 20 64 69 72  New->dirfd = dir
1c820 66 64 3b 0a 20 20 53 45 54 5f 54 48 52 45 41 44  fd;.  SET_THREAD
1c830 49 44 28 70 4e 65 77 29 3b 0a 20 20 70 4e 65 77  ID(pNew);.  pNew
1c840 2d 3e 66 69 6c 65 46 6c 61 67 73 20 3d 20 30 3b  ->fileFlags = 0;
1c850 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  ..#if OS_VXWORKS
1c860 0a 20 20 70 4e 65 77 2d 3e 70 49 64 20 3d 20 76  .  pNew->pId = v
1c870 78 77 6f 72 6b 73 46 69 6e 64 46 69 6c 65 49 64  xworksFindFileId
1c880 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69  (zFilename);.  i
1c890 66 28 20 70 4e 65 77 2d 3e 70 49 64 3d 3d 30 20  f( pNew->pId==0 
1c8a0 29 7b 0a 20 20 20 20 6e 6f 4c 6f 63 6b 20 3d 20  ){.    noLock = 
1c8b0 31 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  1;.    rc = SQLI
1c8c0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 23 65  TE_NOMEM;.  }.#e
1c8d0 6e 64 69 66 0a 0a 20 20 69 66 28 20 6e 6f 4c 6f  ndif..  if( noLo
1c8e0 63 6b 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 69  ck ){.    pLocki
1c8f0 6e 67 53 74 79 6c 65 20 3d 20 26 6e 6f 6c 6f 63  ngStyle = &noloc
1c900 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 65  kIoMethods;.  }e
1c910 6c 73 65 7b 0a 20 20 20 20 70 4c 6f 63 6b 69 6e  lse{.    pLockin
1c920 67 53 74 79 6c 65 20 3d 20 28 2a 2a 28 66 69 6e  gStyle = (**(fin
1c930 64 65 72 5f 74 79 70 65 2a 29 70 56 66 73 2d 3e  der_type*)pVfs->
1c940 70 41 70 70 44 61 74 61 29 28 7a 46 69 6c 65 6e  pAppData)(zFilen
1c950 61 6d 65 2c 20 70 4e 65 77 29 3b 0a 23 69 66 20  ame, pNew);.#if 
1c960 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
1c970 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20  CKING_STYLE.    
1c980 2f 2a 20 43 61 63 68 65 20 7a 46 69 6c 65 6e 61  /* Cache zFilena
1c990 6d 65 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e  me in the lockin
1c9a0 67 20 63 6f 6e 74 65 78 74 20 28 41 46 50 20 61  g context (AFP a
1c9b0 6e 64 20 64 6f 74 6c 6f 63 6b 20 6f 76 65 72 72  nd dotlock overr
1c9c0 69 64 65 29 20 66 6f 72 0a 20 20 20 20 2a 2a 20  ide) for.    ** 
1c9d0 70 72 6f 78 79 4c 6f 63 6b 20 61 63 74 69 76 61  proxyLock activa
1c9e0 74 69 6f 6e 20 69 73 20 70 6f 73 73 69 62 6c 65  tion is possible
1c9f0 20 28 72 65 6d 6f 74 65 20 70 72 6f 78 79 20 69   (remote proxy i
1ca00 73 20 62 61 73 65 64 20 6f 6e 20 64 62 20 6e 61  s based on db na
1ca10 6d 65 29 0a 20 20 20 20 2a 2a 20 7a 46 69 6c 65  me).    ** zFile
1ca20 6e 61 6d 65 20 72 65 6d 61 69 6e 73 20 76 61 6c  name remains val
1ca30 69 64 20 75 6e 74 69 6c 20 66 69 6c 65 20 69 73  id until file is
1ca40 20 63 6c 6f 73 65 64 2c 20 74 6f 20 73 75 70 70   closed, to supp
1ca50 6f 72 74 20 2a 2f 0a 20 20 20 20 70 4e 65 77 2d  ort */.    pNew-
1ca60 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  >lockingContext 
1ca70 3d 20 28 76 6f 69 64 2a 29 7a 46 69 6c 65 6e 61  = (void*)zFilena
1ca80 6d 65 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a  me;.#endif.  }..
1ca90 20 20 69 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74    if( pLockingSt
1caa0 79 6c 65 20 3d 3d 20 26 70 6f 73 69 78 49 6f 4d  yle == &posixIoM
1cab0 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 75 6e  ethods ){.    un
1cac0 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
1cad0 20 20 20 20 72 63 20 3d 20 66 69 6e 64 4c 6f 63      rc = findLoc
1cae0 6b 49 6e 66 6f 28 70 4e 65 77 2c 20 26 70 4e 65  kInfo(pNew, &pNe
1caf0 77 2d 3e 70 4c 6f 63 6b 2c 20 26 70 4e 65 77 2d  w->pLock, &pNew-
1cb00 3e 70 4f 70 65 6e 29 3b 0a 20 20 20 20 69 66 28  >pOpen);.    if(
1cb10 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1cb20 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6e  {.      /* If an
1cb30 20 65 72 72 6f 72 20 6f 63 63 75 72 65 64 20 69   error occured i
1cb40 6e 20 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28 29  n findLockInfo()
1cb50 2c 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65  , close the file
1cb60 20 64 65 73 63 72 69 70 74 6f 72 0a 20 20 20 20   descriptor.    
1cb70 20 20 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79    ** immediately
1cb80 2c 20 62 65 66 6f 72 65 20 72 65 6c 65 61 73 69  , before releasi
1cb90 6e 67 20 74 68 65 20 6d 75 74 65 78 2e 20 66 69  ng the mutex. fi
1cba0 6e 64 4c 6f 63 6b 49 6e 66 6f 28 29 20 6d 61 79  ndLockInfo() may
1cbb0 20 66 61 69 6c 0a 20 20 20 20 20 20 2a 2a 20 69   fail.      ** i
1cbc0 6e 20 74 77 6f 20 73 63 65 6e 61 72 69 6f 73 3a  n two scenarios:
1cbd0 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
1cbe0 2a 2a 20 20 20 28 61 29 20 41 20 63 61 6c 6c 20  **   (a) A call 
1cbf0 74 6f 20 66 73 74 61 74 28 29 20 66 61 69 6c 65  to fstat() faile
1cc00 64 2e 0a 20 20 20 20 20 20 2a 2a 20 20 20 28 62  d..      **   (b
1cc10 29 20 41 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 65  ) A malloc faile
1cc20 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  d..      **.    
1cc30 20 20 2a 2a 20 53 63 65 6e 61 72 69 6f 20 28 62    ** Scenario (b
1cc40 29 20 6d 61 79 20 6f 6e 6c 79 20 6f 63 63 75 72  ) may only occur
1cc50 20 69 66 20 74 68 65 20 70 72 6f 63 65 73 73 20   if the process 
1cc60 69 73 20 68 6f 6c 64 69 6e 67 20 6e 6f 20 6f 74  is holding no ot
1cc70 68 65 72 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c  her.      ** fil
1cc80 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 6f 70  e descriptors op
1cc90 65 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 66  en on the same f
1cca0 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20 77 65  ile. If there we
1ccb0 72 65 20 6f 74 68 65 72 20 66 69 6c 65 0a 20 20  re other file.  
1ccc0 20 20 20 20 2a 2a 20 64 65 73 63 72 69 70 74 6f      ** descripto
1ccd0 72 73 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 2c  rs on this file,
1cce0 20 74 68 65 6e 20 6e 6f 20 6d 61 6c 6c 6f 63 20   then no malloc 
1ccf0 77 6f 75 6c 64 20 62 65 20 72 65 71 75 69 72 65  would be require
1cd00 64 20 62 79 0a 20 20 20 20 20 20 2a 2a 20 66 69  d by.      ** fi
1cd10 6e 64 4c 6f 63 6b 49 6e 66 6f 28 29 2e 20 49 66  ndLockInfo(). If
1cd20 20 74 68 69 73 20 69 73 20 74 68 65 20 63 61 73   this is the cas
1cd30 65 2c 20 69 74 20 69 73 20 71 75 69 74 65 20 73  e, it is quite s
1cd40 61 66 65 20 74 6f 20 63 6c 6f 73 65 0a 20 20 20  afe to close.   
1cd50 20 20 20 2a 2a 20 68 61 6e 64 6c 65 20 68 20 2d     ** handle h -
1cd60 20 61 73 20 69 74 20 69 73 20 67 75 61 72 61 6e   as it is guaran
1cd70 74 65 65 64 20 74 68 61 74 20 6e 6f 20 70 6f 73  teed that no pos
1cd80 69 78 20 6c 6f 63 6b 73 20 77 69 6c 6c 20 62 65  ix locks will be
1cd90 20 72 65 6c 65 61 73 65 64 0a 20 20 20 20 20 20   released.      
1cda0 2a 2a 20 62 79 20 64 6f 69 6e 67 20 73 6f 2e 0a  ** by doing so..
1cdb0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
1cdc0 2a 20 49 66 20 73 63 65 6e 61 72 69 6f 20 28 61  * If scenario (a
1cdd0 29 20 63 61 75 73 65 64 20 74 68 65 20 65 72 72  ) caused the err
1cde0 6f 72 20 74 68 65 6e 20 74 68 69 6e 67 73 20 61  or then things a
1cdf0 72 65 20 6e 6f 74 20 73 6f 20 73 61 66 65 2e 20  re not so safe. 
1ce00 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70  The.      ** imp
1ce10 6c 69 63 69 74 20 61 73 73 75 6d 70 74 69 6f 6e  licit assumption
1ce20 20 68 65 72 65 20 69 73 20 74 68 61 74 20 69 66   here is that if
1ce30 20 66 73 74 61 74 28 29 20 66 61 69 6c 73 2c 20   fstat() fails, 
1ce40 74 68 69 6e 67 73 20 61 72 65 20 69 6e 0a 20 20  things are in.  
1ce50 20 20 20 20 2a 2a 20 73 75 63 68 20 62 61 64 20      ** such bad 
1ce60 73 68 61 70 65 20 74 68 61 74 20 64 72 6f 70 70  shape that dropp
1ce70 69 6e 67 20 61 20 6c 6f 63 6b 20 6f 72 20 74 77  ing a lock or tw
1ce80 6f 20 64 6f 65 73 6e 27 74 20 6d 61 74 74 65 72  o doesn't matter
1ce90 20 6d 75 63 68 2e 0a 20 20 20 20 20 20 2a 2f 0a   much..      */.
1cea0 20 20 20 20 20 20 63 6c 6f 73 65 28 68 29 3b 0a        close(h);.
1ceb0 20 20 20 20 20 20 68 20 3d 20 2d 31 3b 0a 20 20        h = -1;.  
1cec0 20 20 7d 0a 20 20 20 20 75 6e 69 78 4c 65 61 76    }.    unixLeav
1ced0 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a 0a 23  eMutex();.  }..#
1cee0 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
1cef0 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26  _LOCKING_STYLE &
1cf00 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  & defined(__APPL
1cf10 45 5f 5f 29 0a 20 20 65 6c 73 65 20 69 66 28 20  E__).  else if( 
1cf20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d  pLockingStyle ==
1cf30 20 26 61 66 70 49 6f 4d 65 74 68 6f 64 73 20 29   &afpIoMethods )
1cf40 7b 0a 20 20 20 20 2f 2a 20 41 46 50 20 6c 6f 63  {.    /* AFP loc
1cf50 6b 69 6e 67 20 75 73 65 73 20 74 68 65 20 66 69  king uses the fi
1cf60 6c 65 20 70 61 74 68 20 73 6f 20 69 74 20 6e 65  le path so it ne
1cf70 65 64 73 20 74 6f 20 62 65 20 69 6e 63 6c 75 64  eds to be includ
1cf80 65 64 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65  ed in.    ** the
1cf90 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65   afpLockingConte
1cfa0 78 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  xt..    */.    a
1cfb0 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
1cfc0 20 2a 70 43 74 78 3b 0a 20 20 20 20 70 4e 65 77   *pCtx;.    pNew
1cfd0 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
1cfe0 20 3d 20 70 43 74 78 20 3d 20 73 71 6c 69 74 65   = pCtx = sqlite
1cff0 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  3_malloc( sizeof
1d000 28 2a 70 43 74 78 29 20 29 3b 0a 20 20 20 20 69  (*pCtx) );.    i
1d010 66 28 20 70 43 74 78 3d 3d 30 20 29 7b 0a 20 20  f( pCtx==0 ){.  
1d020 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1d030 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65  NOMEM;.    }else
1d040 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 42 3a 20 7a  {.      /* NB: z
1d050 46 69 6c 65 6e 61 6d 65 20 65 78 69 73 74 73 20  Filename exists 
1d060 61 6e 64 20 72 65 6d 61 69 6e 73 20 76 61 6c 69  and remains vali
1d070 64 20 75 6e 74 69 6c 20 74 68 65 20 66 69 6c 65  d until the file
1d080 20 69 73 20 63 6c 6f 73 65 64 0a 20 20 20 20 20   is closed.     
1d090 20 2a 2a 20 61 63 63 6f 72 64 69 6e 67 20 74 6f   ** according to
1d0a0 20 72 65 71 75 69 72 65 6d 65 6e 74 20 46 31 31   requirement F11
1d0b0 31 34 31 2e 20 20 53 6f 20 77 65 20 64 6f 20 6e  141.  So we do n
1d0c0 6f 74 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65 20  ot need to make 
1d0d0 61 0a 20 20 20 20 20 20 2a 2a 20 63 6f 70 79 20  a.      ** copy 
1d0e0 6f 66 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 2e  of the filename.
1d0f0 20 2a 2f 0a 20 20 20 20 20 20 70 43 74 78 2d 3e   */.      pCtx->
1d100 64 62 50 61 74 68 20 3d 20 7a 46 69 6c 65 6e 61  dbPath = zFilena
1d110 6d 65 3b 0a 20 20 20 20 20 20 73 72 61 6e 64 6f  me;.      srando
1d120 6d 64 65 76 28 29 3b 0a 20 20 20 20 20 20 75 6e  mdev();.      un
1d130 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
1d140 20 20 20 20 20 20 72 63 20 3d 20 66 69 6e 64 4c        rc = findL
1d150 6f 63 6b 49 6e 66 6f 28 70 4e 65 77 2c 20 4e 55  ockInfo(pNew, NU
1d160 4c 4c 2c 20 26 70 4e 65 77 2d 3e 70 4f 70 65 6e  LL, &pNew->pOpen
1d170 29 3b 0a 20 20 20 20 20 20 75 6e 69 78 4c 65 61  );.      unixLea
1d180 76 65 4d 75 74 65 78 28 29 3b 20 20 20 20 20 20  veMutex();      
1d190 20 20 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e    .    }.  }.#en
1d1a0 64 69 66 0a 0a 20 20 65 6c 73 65 20 69 66 28 20  dif..  else if( 
1d1b0 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d  pLockingStyle ==
1d1c0 20 26 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f   &dotlockIoMetho
1d1d0 64 73 20 29 7b 0a 20 20 20 20 2f 2a 20 44 6f 74  ds ){.    /* Dot
1d1e0 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 75 73 65  file locking use
1d1f0 73 20 74 68 65 20 66 69 6c 65 20 70 61 74 68 20  s the file path 
1d200 73 6f 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62  so it needs to b
1d210 65 20 69 6e 63 6c 75 64 65 64 20 69 6e 0a 20 20  e included in.  
1d220 20 20 2a 2a 20 74 68 65 20 64 6f 74 6c 6f 63 6b    ** the dotlock
1d230 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 0a  LockingContext .
1d240 20 20 20 20 2a 2f 0a 20 20 20 20 63 68 61 72 20      */.    char 
1d250 2a 7a 4c 6f 63 6b 46 69 6c 65 3b 0a 20 20 20 20  *zLockFile;.    
1d260 69 6e 74 20 6e 46 69 6c 65 6e 61 6d 65 3b 0a 20  int nFilename;. 
1d270 20 20 20 6e 46 69 6c 65 6e 61 6d 65 20 3d 20 28     nFilename = (
1d280 69 6e 74 29 73 74 72 6c 65 6e 28 7a 46 69 6c 65  int)strlen(zFile
1d290 6e 61 6d 65 29 20 2b 20 36 3b 0a 20 20 20 20 7a  name) + 6;.    z
1d2a0 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63 68 61 72  LockFile = (char
1d2b0 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   *)sqlite3_mallo
1d2c0 63 28 6e 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  c(nFilename);.  
1d2d0 20 20 69 66 28 20 7a 4c 6f 63 6b 46 69 6c 65 3d    if( zLockFile=
1d2e0 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
1d2f0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
1d300 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1d310 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
1d320 28 6e 46 69 6c 65 6e 61 6d 65 2c 20 7a 4c 6f 63  (nFilename, zLoc
1d330 6b 46 69 6c 65 2c 20 22 25 73 22 20 44 4f 54 4c  kFile, "%s" DOTL
1d340 4f 43 4b 5f 53 55 46 46 49 58 2c 20 7a 46 69 6c  OCK_SUFFIX, zFil
1d350 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  ename);.    }.  
1d360 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43    pNew->lockingC
1d370 6f 6e 74 65 78 74 20 3d 20 7a 4c 6f 63 6b 46 69  ontext = zLockFi
1d380 6c 65 3b 0a 20 20 7d 0a 0a 23 69 66 20 4f 53 5f  le;.  }..#if OS_
1d390 56 58 57 4f 52 4b 53 0a 20 20 65 6c 73 65 20 69  VXWORKS.  else i
1d3a0 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65  f( pLockingStyle
1d3b0 20 3d 3d 20 26 73 65 6d 49 6f 4d 65 74 68 6f 64   == &semIoMethod
1d3c0 73 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 61 6d 65  s ){.    /* Name
1d3d0 64 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b  d semaphore lock
1d3e0 69 6e 67 20 75 73 65 73 20 74 68 65 20 66 69 6c  ing uses the fil
1d3f0 65 20 70 61 74 68 20 73 6f 20 69 74 20 6e 65 65  e path so it nee
1d400 64 73 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20  ds to be.    ** 
1d410 69 6e 63 6c 75 64 65 64 20 69 6e 20 74 68 65 20  included in the 
1d420 73 65 6d 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  semLockingContex
1d430 74 0a 20 20 20 20 2a 2f 0a 20 20 20 20 75 6e 69  t.    */.    uni
1d440 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  xEnterMutex();. 
1d450 20 20 20 72 63 20 3d 20 66 69 6e 64 4c 6f 63 6b     rc = findLock
1d460 49 6e 66 6f 28 70 4e 65 77 2c 20 26 70 4e 65 77  Info(pNew, &pNew
1d470 2d 3e 70 4c 6f 63 6b 2c 20 26 70 4e 65 77 2d 3e  ->pLock, &pNew->
1d480 70 4f 70 65 6e 29 3b 0a 20 20 20 20 69 66 28 20  pOpen);.    if( 
1d490 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20  (rc==SQLITE_OK) 
1d4a0 26 26 20 28 70 4e 65 77 2d 3e 70 4f 70 65 6e 2d  && (pNew->pOpen-
1d4b0 3e 70 53 65 6d 3d 3d 4e 55 4c 4c 29 20 29 7b 0a  >pSem==NULL) ){.
1d4c0 20 20 20 20 20 20 63 68 61 72 20 2a 7a 53 65 6d        char *zSem
1d4d0 4e 61 6d 65 20 3d 20 70 4e 65 77 2d 3e 70 4f 70  Name = pNew->pOp
1d4e0 65 6e 2d 3e 61 53 65 6d 4e 61 6d 65 3b 0a 20 20  en->aSemName;.  
1d4f0 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20      int n;.     
1d500 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
1d510 66 28 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2c 20  f(MAX_PATHNAME, 
1d520 7a 53 65 6d 4e 61 6d 65 2c 20 22 2f 25 73 2e 73  zSemName, "/%s.s
1d530 65 6d 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  em",.           
1d540 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 65 77              pNew
1d550 2d 3e 70 49 64 2d 3e 7a 43 61 6e 6f 6e 69 63 61  ->pId->zCanonica
1d560 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 66 6f  lName);.      fo
1d570 72 28 20 6e 3d 31 3b 20 7a 53 65 6d 4e 61 6d 65  r( n=1; zSemName
1d580 5b 6e 5d 3b 20 6e 2b 2b 20 29 0a 20 20 20 20 20  [n]; n++ ).     
1d590 20 20 20 69 66 28 20 7a 53 65 6d 4e 61 6d 65 5b     if( zSemName[
1d5a0 6e 5d 3d 3d 27 2f 27 20 29 20 7a 53 65 6d 4e 61  n]=='/' ) zSemNa
1d5b0 6d 65 5b 6e 5d 20 3d 20 27 5f 27 3b 0a 20 20 20  me[n] = '_';.   
1d5c0 20 20 20 70 4e 65 77 2d 3e 70 4f 70 65 6e 2d 3e     pNew->pOpen->
1d5d0 70 53 65 6d 20 3d 20 73 65 6d 5f 6f 70 65 6e 28  pSem = sem_open(
1d5e0 7a 53 65 6d 4e 61 6d 65 2c 20 4f 5f 43 52 45 41  zSemName, O_CREA
1d5f0 54 2c 20 30 36 36 36 2c 20 31 29 3b 0a 20 20 20  T, 0666, 1);.   
1d600 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 70 4f 70     if( pNew->pOp
1d610 65 6e 2d 3e 70 53 65 6d 20 3d 3d 20 53 45 4d 5f  en->pSem == SEM_
1d620 46 41 49 4c 45 44 20 29 7b 0a 20 20 20 20 20 20  FAILED ){.      
1d630 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
1d640 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  MEM;.        pNe
1d650 77 2d 3e 70 4f 70 65 6e 2d 3e 61 53 65 6d 4e 61  w->pOpen->aSemNa
1d660 6d 65 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 20 20  me[0] = '\0';.  
1d670 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1d680 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
1d690 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a  ;.  }.#endif.  .
1d6a0 20 20 70 4e 65 77 2d 3e 6c 61 73 74 45 72 72 6e    pNew->lastErrn
1d6b0 6f 20 3d 20 30 3b 0a 23 69 66 20 4f 53 5f 56 58  o = 0;.#if OS_VX
1d6c0 57 4f 52 4b 53 0a 20 20 69 66 28 20 72 63 21 3d  WORKS.  if( rc!=
1d6d0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1d6e0 20 75 6e 6c 69 6e 6b 28 7a 46 69 6c 65 6e 61 6d   unlink(zFilenam
1d6f0 65 29 3b 0a 20 20 20 20 69 73 44 65 6c 65 74 65  e);.    isDelete
1d700 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 4e 65 77   = 0;.  }.  pNew
1d710 2d 3e 69 73 44 65 6c 65 74 65 20 3d 20 69 73 44  ->isDelete = isD
1d720 65 6c 65 74 65 3b 0a 23 65 6e 64 69 66 0a 20 20  elete;.#endif.  
1d730 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1d740 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 64 69 72  K ){.    if( dir
1d750 66 64 3e 3d 30 20 29 20 63 6c 6f 73 65 28 64 69  fd>=0 ) close(di
1d760 72 66 64 29 3b 20 2f 2a 20 73 69 6c 65 6e 74 20  rfd); /* silent 
1d770 6c 65 61 6b 20 69 66 20 66 61 69 6c 2c 20 61 6c  leak if fail, al
1d780 72 65 61 64 79 20 69 6e 20 65 72 72 6f 72 20 2a  ready in error *
1d790 2f 0a 20 20 20 20 69 66 28 20 68 3e 3d 30 20 29  /.    if( h>=0 )
1d7a0 20 63 6c 6f 73 65 28 68 29 3b 0a 20 20 7d 65 6c   close(h);.  }el
1d7b0 73 65 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 4d  se{.    pNew->pM
1d7c0 65 74 68 6f 64 20 3d 20 70 4c 6f 63 6b 69 6e 67  ethod = pLocking
1d7d0 53 74 79 6c 65 3b 0a 20 20 20 20 4f 70 65 6e 43  Style;.    OpenC
1d7e0 6f 75 6e 74 65 72 28 2b 31 29 3b 0a 20 20 7d 0a  ounter(+1);.  }.
1d7f0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1d800 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 66 69 6c  /*.** Open a fil
1d810 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20  e descriptor to 
1d820 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 63 6f  the directory co
1d830 6e 74 61 69 6e 69 6e 67 20 66 69 6c 65 20 7a 46  ntaining file zF
1d840 69 6c 65 6e 61 6d 65 2e 0a 2a 2a 20 49 66 20 73  ilename..** If s
1d850 75 63 63 65 73 73 66 75 6c 2c 20 2a 70 46 64 20  uccessful, *pFd 
1d860 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6f 70  is set to the op
1d870 65 6e 65 64 20 66 69 6c 65 20 64 65 73 63 72 69  ened file descri
1d880 70 74 6f 72 20 61 6e 64 0a 2a 2a 20 53 51 4c 49  ptor and.** SQLI
1d890 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
1d8a0 64 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  d. If an error o
1d8b0 63 63 75 72 73 2c 20 65 69 74 68 65 72 20 53 51  ccurs, either SQ
1d8c0 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 6f 72  LITE_NOMEM.** or
1d8d0 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
1d8e0 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
1d8f0 20 2a 70 46 64 20 69 73 20 73 65 74 20 74 6f 20   *pFd is set to 
1d900 61 6e 20 75 6e 64 65 66 69 6e 65 64 0a 2a 2a 20  an undefined.** 
1d910 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  value..**.** If 
1d920 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
1d930 75 72 6e 65 64 2c 20 74 68 65 20 63 61 6c 6c 65  urned, the calle
1d940 72 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  r is responsible
1d950 20 66 6f 72 20 63 6c 6f 73 69 6e 67 0a 2a 2a 20   for closing.** 
1d960 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
1d970 74 6f 72 20 2a 70 46 64 20 75 73 69 6e 67 20 63  tor *pFd using c
1d980 6c 6f 73 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  lose()..*/.stati
1d990 63 20 69 6e 74 20 6f 70 65 6e 44 69 72 65 63 74  c int openDirect
1d9a0 6f 72 79 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ory(const char *
1d9b0 7a 46 69 6c 65 6e 61 6d 65 2c 20 69 6e 74 20 2a  zFilename, int *
1d9c0 70 46 64 29 7b 0a 20 20 69 6e 74 20 69 69 3b 0a  pFd){.  int ii;.
1d9d0 20 20 69 6e 74 20 66 64 20 3d 20 2d 31 3b 0a 20    int fd = -1;. 
1d9e0 20 63 68 61 72 20 7a 44 69 72 6e 61 6d 65 5b 4d   char zDirname[M
1d9f0 41 58 5f 50 41 54 48 4e 41 4d 45 2b 31 5d 3b 0a  AX_PATHNAME+1];.
1da00 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69  .  sqlite3_snpri
1da10 6e 74 66 28 4d 41 58 5f 50 41 54 48 4e 41 4d 45  ntf(MAX_PATHNAME
1da20 2c 20 7a 44 69 72 6e 61 6d 65 2c 20 22 25 73 22  , zDirname, "%s"
1da30 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  , zFilename);.  
1da40 66 6f 72 28 69 69 3d 28 69 6e 74 29 73 74 72 6c  for(ii=(int)strl
1da50 65 6e 28 7a 44 69 72 6e 61 6d 65 29 3b 20 69 69  en(zDirname); ii
1da60 3e 31 20 26 26 20 7a 44 69 72 6e 61 6d 65 5b 69  >1 && zDirname[i
1da70 69 5d 21 3d 27 2f 27 3b 20 69 69 2d 2d 29 3b 0a  i]!='/'; ii--);.
1da80 20 20 69 66 28 20 69 69 3e 30 20 29 7b 0a 20 20    if( ii>0 ){.  
1da90 20 20 7a 44 69 72 6e 61 6d 65 5b 69 69 5d 20 3d    zDirname[ii] =
1daa0 20 27 5c 30 27 3b 0a 20 20 20 20 66 64 20 3d 20   '\0';.    fd = 
1dab0 6f 70 65 6e 28 7a 44 69 72 6e 61 6d 65 2c 20 4f  open(zDirname, O
1dac0 5f 52 44 4f 4e 4c 59 7c 4f 5f 42 49 4e 41 52 59  _RDONLY|O_BINARY
1dad0 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 66 64  , 0);.    if( fd
1dae0 3e 3d 30 20 29 7b 0a 23 69 66 64 65 66 20 46 44  >=0 ){.#ifdef FD
1daf0 5f 43 4c 4f 45 58 45 43 0a 20 20 20 20 20 20 66  _CLOEXEC.      f
1db00 63 6e 74 6c 28 66 64 2c 20 46 5f 53 45 54 46 44  cntl(fd, F_SETFD
1db10 2c 20 66 63 6e 74 6c 28 66 64 2c 20 46 5f 47 45  , fcntl(fd, F_GE
1db20 54 46 44 2c 20 30 29 20 7c 20 46 44 5f 43 4c 4f  TFD, 0) | FD_CLO
1db30 45 58 45 43 29 3b 0a 23 65 6e 64 69 66 0a 20 20  EXEC);.#endif.  
1db40 20 20 20 20 4f 53 54 52 41 43 45 33 28 22 4f 50      OSTRACE3("OP
1db50 45 4e 44 49 52 20 25 2d 33 64 20 25 73 5c 6e 22  ENDIR %-3d %s\n"
1db60 2c 20 66 64 2c 20 7a 44 69 72 6e 61 6d 65 29 3b  , fd, zDirname);
1db70 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 46  .    }.  }.  *pF
1db80 64 20 3d 20 66 64 3b 0a 20 20 72 65 74 75 72 6e  d = fd;.  return
1db90 20 28 66 64 3e 3d 30 3f 53 51 4c 49 54 45 5f 4f   (fd>=0?SQLITE_O
1dba0 4b 3a 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  K:SQLITE_CANTOPE
1dbb0 4e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  N);.}../*.** Cre
1dbc0 61 74 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20  ate a temporary 
1dbd0 66 69 6c 65 20 6e 61 6d 65 20 69 6e 20 7a 42 75  file name in zBu
1dbe0 66 2e 20 20 7a 42 75 66 20 6d 75 73 74 20 62 65  f.  zBuf must be
1dbf0 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 62 79   allocated.** by
1dc00 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f   the calling pro
1dc10 63 65 73 73 20 61 6e 64 20 6d 75 73 74 20 62 65  cess and must be
1dc20 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 68   big enough to h
1dc30 6f 6c 64 20 61 74 20 6c 65 61 73 74 0a 2a 2a 20  old at least.** 
1dc40 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
1dc50 20 62 79 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69   bytes..*/.stati
1dc60 63 20 69 6e 74 20 67 65 74 54 65 6d 70 6e 61 6d  c int getTempnam
1dc70 65 28 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72  e(int nBuf, char
1dc80 20 2a 7a 42 75 66 29 7b 0a 20 20 73 74 61 74 69   *zBuf){.  stati
1dc90 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a  c const char *az
1dca0 44 69 72 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  Dirs[] = {.     
1dcb0 30 2c 0a 20 20 20 20 20 30 2c 0a 20 20 20 20 20  0,.     0,.     
1dcc0 22 2f 76 61 72 2f 74 6d 70 22 2c 0a 20 20 20 20  "/var/tmp",.    
1dcd0 20 22 2f 75 73 72 2f 74 6d 70 22 2c 0a 20 20 20   "/usr/tmp",.   
1dce0 20 20 22 2f 74 6d 70 22 2c 0a 20 20 20 20 20 22    "/tmp",.     "
1dcf0 2e 22 2c 0a 20 20 7d 3b 0a 20 20 73 74 61 74 69  .",.  };.  stati
1dd00 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64  c const unsigned
1dd10 20 63 68 61 72 20 7a 43 68 61 72 73 5b 5d 20 3d   char zChars[] =
1dd20 0a 20 20 20 20 22 61 62 63 64 65 66 67 68 69 6a  .    "abcdefghij
1dd30 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a  klmnopqrstuvwxyz
1dd40 22 0a 20 20 20 20 22 41 42 43 44 45 46 47 48 49  ".    "ABCDEFGHI
1dd50 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58 59  JKLMNOPQRSTUVWXY
1dd60 5a 22 0a 20 20 20 20 22 30 31 32 33 34 35 36 37  Z".    "01234567
1dd70 38 39 22 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  89";.  unsigned 
1dd80 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 73 74 72 75  int i, j;.  stru
1dd90 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20 63  ct stat buf;.  c
1dda0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 69 72 20  onst char *zDir 
1ddb0 3d 20 22 2e 22 3b 0a 0a 20 20 2f 2a 20 49 74 27  = ".";..  /* It'
1ddc0 73 20 6f 64 64 20 74 6f 20 73 69 6d 75 6c 61 74  s odd to simulat
1ddd0 65 20 61 6e 20 69 6f 2d 65 72 72 6f 72 20 68 65  e an io-error he
1dde0 72 65 2c 20 62 75 74 20 72 65 61 6c 6c 79 20 74  re, but really t
1ddf0 68 69 73 20 69 73 20 6a 75 73 74 0a 20 20 2a 2a  his is just.  **
1de00 20 75 73 69 6e 67 20 74 68 65 20 69 6f 2d 65 72   using the io-er
1de10 72 6f 72 20 69 6e 66 72 61 73 74 72 75 63 74 75  ror infrastructu
1de20 72 65 20 74 6f 20 74 65 73 74 20 74 68 61 74 20  re to test that 
1de30 53 51 4c 69 74 65 20 68 61 6e 64 6c 65 73 20 74  SQLite handles t
1de40 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f  his.  ** functio
1de50 6e 20 66 61 69 6c 69 6e 67 2e 20 0a 20 20 2a 2f  n failing. .  */
1de60 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
1de70 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54  or( return SQLIT
1de80 45 5f 49 4f 45 52 52 20 29 3b 0a 0a 20 20 61 7a  E_IOERR );..  az
1de90 44 69 72 73 5b 30 5d 20 3d 20 73 71 6c 69 74 65  Dirs[0] = sqlite
1dea0 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79  3_temp_directory
1deb0 3b 0a 20 20 69 66 20 28 4e 55 4c 4c 20 3d 3d 20  ;.  if (NULL == 
1dec0 61 7a 44 69 72 73 5b 31 5d 29 20 7b 0a 20 20 20  azDirs[1]) {.   
1ded0 20 61 7a 44 69 72 73 5b 31 5d 20 3d 20 67 65 74   azDirs[1] = get
1dee0 65 6e 76 28 22 54 4d 50 44 49 52 22 29 3b 0a 20  env("TMPDIR");. 
1def0 20 7d 0a 20 20 0a 20 20 66 6f 72 28 69 3d 30 3b   }.  .  for(i=0;
1df00 20 69 3c 73 69 7a 65 6f 66 28 61 7a 44 69 72 73   i<sizeof(azDirs
1df10 29 2f 73 69 7a 65 6f 66 28 61 7a 44 69 72 73 5b  )/sizeof(azDirs[
1df20 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  0]); i++){.    i
1df30 66 28 20 61 7a 44 69 72 73 5b 69 5d 3d 3d 30 20  f( azDirs[i]==0 
1df40 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
1df50 69 66 28 20 73 74 61 74 28 61 7a 44 69 72 73 5b  if( stat(azDirs[
1df60 69 5d 2c 20 26 62 75 66 29 20 29 20 63 6f 6e 74  i], &buf) ) cont
1df70 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 21 53  inue;.    if( !S
1df80 5f 49 53 44 49 52 28 62 75 66 2e 73 74 5f 6d 6f  _ISDIR(buf.st_mo
1df90 64 65 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  de) ) continue;.
1dfa0 20 20 20 20 69 66 28 20 61 63 63 65 73 73 28 61      if( access(a
1dfb0 7a 44 69 72 73 5b 69 5d 2c 20 30 37 29 20 29 20  zDirs[i], 07) ) 
1dfc0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7a 44  continue;.    zD
1dfd0 69 72 20 3d 20 61 7a 44 69 72 73 5b 69 5d 3b 0a  ir = azDirs[i];.
1dfe0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
1dff0 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
1e000 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66 65  the output buffe
1e010 72 20 69 73 20 6c 61 72 67 65 20 65 6e 6f 75 67  r is large enoug
1e020 68 20 66 6f 72 20 74 68 65 20 74 65 6d 70 6f 72  h for the tempor
1e030 61 72 79 20 66 69 6c 65 20 0a 20 20 2a 2a 20 6e  ary file .  ** n
1e040 61 6d 65 2e 20 49 66 20 69 74 20 69 73 20 6e 6f  ame. If it is no
1e050 74 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  t, return SQLITE
1e060 5f 45 52 52 4f 52 2e 0a 20 20 2a 2f 0a 20 20 69  _ERROR..  */.  i
1e070 66 28 20 28 73 74 72 6c 65 6e 28 7a 44 69 72 29  f( (strlen(zDir)
1e080 20 2b 20 73 74 72 6c 65 6e 28 53 51 4c 49 54 45   + strlen(SQLITE
1e090 5f 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49  _TEMP_FILE_PREFI
1e0a0 58 29 20 2b 20 31 37 29 20 3e 3d 20 28 73 69 7a  X) + 17) >= (siz
1e0b0 65 5f 74 29 6e 42 75 66 20 29 7b 0a 20 20 20 20  e_t)nBuf ){.    
1e0c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
1e0d0 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 64 6f 7b 0a  ROR;.  }..  do{.
1e0e0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
1e0f0 69 6e 74 66 28 6e 42 75 66 2d 31 37 2c 20 7a 42  intf(nBuf-17, zB
1e100 75 66 2c 20 22 25 73 2f 22 53 51 4c 49 54 45 5f  uf, "%s/"SQLITE_
1e110 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49 58  TEMP_FILE_PREFIX
1e120 2c 20 7a 44 69 72 29 3b 0a 20 20 20 20 6a 20 3d  , zDir);.    j =
1e130 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 42 75   (int)strlen(zBu
1e140 66 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  f);.    sqlite3_
1e150 72 61 6e 64 6f 6d 6e 65 73 73 28 31 35 2c 20 26  randomness(15, &
1e160 7a 42 75 66 5b 6a 5d 29 3b 0a 20 20 20 20 66 6f  zBuf[j]);.    fo
1e170 72 28 69 3d 30 3b 20 69 3c 31 35 3b 20 69 2b 2b  r(i=0; i<15; i++
1e180 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 7a 42  , j++){.      zB
1e190 75 66 5b 6a 5d 20 3d 20 28 63 68 61 72 29 7a 43  uf[j] = (char)zC
1e1a0 68 61 72 73 5b 20 28 28 75 6e 73 69 67 6e 65 64  hars[ ((unsigned
1e1b0 20 63 68 61 72 29 7a 42 75 66 5b 6a 5d 29 25 28   char)zBuf[j])%(
1e1c0 73 69 7a 65 6f 66 28 7a 43 68 61 72 73 29 2d 31  sizeof(zChars)-1
1e1d0 29 20 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a  ) ];.    }.    z
1e1e0 42 75 66 5b 6a 5d 20 3d 20 30 3b 0a 20 20 7d 77  Buf[j] = 0;.  }w
1e1f0 68 69 6c 65 28 20 61 63 63 65 73 73 28 7a 42 75  hile( access(zBu
1e200 66 2c 30 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74  f,0)==0 );.  ret
1e210 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1e220 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  ..#if SQLITE_ENA
1e230 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
1e240 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41  E && defined(__A
1e250 50 50 4c 45 5f 5f 29 0a 2f 2a 0a 2a 2a 20 52 6f  PPLE__)./*.** Ro
1e260 75 74 69 6e 65 20 74 6f 20 74 72 61 6e 73 66 6f  utine to transfo
1e270 72 6d 20 61 20 75 6e 69 78 46 69 6c 65 20 69 6e  rm a unixFile in
1e280 74 6f 20 61 20 70 72 6f 78 79 2d 6c 6f 63 6b 69  to a proxy-locki
1e290 6e 67 20 75 6e 69 78 46 69 6c 65 2e 0a 2a 2a 20  ng unixFile..** 
1e2a0 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69  Implementation i
1e2b0 6e 20 74 68 65 20 70 72 6f 78 79 2d 6c 6f 63 6b  n the proxy-lock
1e2c0 20 64 69 76 69 73 69 6f 6e 2c 20 62 75 74 20 75   division, but u
1e2d0 73 65 64 20 62 79 20 75 6e 69 78 4f 70 65 6e 28  sed by unixOpen(
1e2e0 29 0a 2a 2a 20 69 66 20 53 51 4c 49 54 45 5f 50  ).** if SQLITE_P
1e2f0 52 45 46 45 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b  REFER_PROXY_LOCK
1e300 49 4e 47 20 69 73 20 64 65 66 69 6e 65 64 2e 0a  ING is defined..
1e310 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  */.static int pr
1e320 6f 78 79 54 72 61 6e 73 66 6f 72 6d 55 6e 69 78  oxyTransformUnix
1e330 46 69 6c 65 28 75 6e 69 78 46 69 6c 65 2a 2c 20  File(unixFile*, 
1e340 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a 23 65  const char*);.#e
1e350 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72  ndif../*.** Sear
1e360 63 68 20 66 6f 72 20 61 6e 20 75 6e 75 73 65 64  ch for an unused
1e370 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
1e380 20 74 68 61 74 20 77 61 73 20 6f 70 65 6e 65 64   that was opened
1e390 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
1e3a0 20 0a 2a 2a 20 66 69 6c 65 20 28 6e 6f 74 20 61   .** file (not a
1e3b0 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 6d 61 73 74   journal or mast
1e3c0 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29  er-journal file)
1e3d0 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 70   identified by p
1e3e0 61 74 68 6e 61 6d 65 0a 2a 2a 20 7a 50 61 74 68  athname.** zPath
1e3f0 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4f 50 45   with SQLITE_OPE
1e400 4e 5f 58 58 58 20 66 6c 61 67 73 20 6d 61 74 63  N_XXX flags matc
1e410 68 69 6e 67 20 74 68 6f 73 65 20 70 61 73 73 65  hing those passe
1e420 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 0a  d as the second.
1e430 2a 2a 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  ** argument to t
1e440 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  his function..**
1e450 0a 2a 2a 20 53 75 63 68 20 61 20 66 69 6c 65 20  .** Such a file 
1e460 64 65 73 63 72 69 70 74 6f 72 20 6d 61 79 20 65  descriptor may e
1e470 78 69 73 74 20 69 66 20 61 20 64 61 74 61 62 61  xist if a databa
1e480 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 61  se connection wa
1e490 73 20 63 6c 6f 73 65 64 0a 2a 2a 20 62 75 74 20  s closed.** but 
1e4a0 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 66  the associated f
1e4b0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 63  ile descriptor c
1e4c0 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63 6c 6f 73  ould not be clos
1e4d0 65 64 20 62 65 63 61 75 73 65 20 73 6f 6d 65 0a  ed because some.
1e4e0 2a 2a 20 6f 74 68 65 72 20 66 69 6c 65 20 64 65  ** other file de
1e4f0 73 63 72 69 70 74 6f 72 20 6f 70 65 6e 20 6f 6e  scriptor open on
1e500 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20 69   the same file i
1e510 73 20 68 6f 6c 64 69 6e 67 20 61 20 66 69 6c 65  s holding a file
1e520 2d 6c 6f 63 6b 2e 0a 2a 2a 20 52 65 66 65 72 20  -lock..** Refer 
1e530 74 6f 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 74  to comments in t
1e540 68 65 20 75 6e 69 78 43 6c 6f 73 65 28 29 20 66  he unixClose() f
1e550 75 6e 63 74 69 6f 6e 20 61 6e 64 20 74 68 65 20  unction and the 
1e560 6c 65 6e 67 74 68 79 20 63 6f 6d 6d 65 6e 74 0a  lengthy comment.
1e570 2a 2a 20 64 65 73 63 72 69 62 69 6e 67 20 22 50  ** describing "P
1e580 6f 73 69 78 20 41 64 76 69 73 6f 72 79 20 4c 6f  osix Advisory Lo
1e590 63 6b 69 6e 67 22 20 61 74 20 74 68 65 20 73 74  cking" at the st
1e5a0 61 72 74 20 6f 66 20 74 68 69 73 20 66 69 6c 65  art of this file
1e5b0 20 66 6f 72 20 0a 2a 2a 20 66 75 72 74 68 65 72   for .** further
1e5c0 20 64 65 74 61 69 6c 73 2e 20 41 6c 73 6f 2c 20   details. Also, 
1e5d0 74 69 63 6b 65 74 20 23 34 30 31 38 2e 0a 2a 2a  ticket #4018..**
1e5e0 0a 2a 2a 20 49 66 20 61 20 73 75 69 74 61 62 6c  .** If a suitabl
1e5f0 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
1e600 72 20 69 73 20 66 6f 75 6e 64 2c 20 74 68 65 6e  r is found, then
1e610 20 69 74 20 69 73 20 72 65 74 75 72 6e 65 64 2e   it is returned.
1e620 20 49 66 20 6e 6f 0a 2a 2a 20 73 75 63 68 20 66   If no.** such f
1e630 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
1e640 73 20 6c 6f 63 61 74 65 64 2c 20 2d 31 20 69 73  s located, -1 is
1e650 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
1e660 61 74 69 63 20 55 6e 69 78 55 6e 75 73 65 64 46  atic UnixUnusedF
1e670 64 20 2a 66 69 6e 64 52 65 75 73 61 62 6c 65 46  d *findReusableF
1e680 64 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50  d(const char *zP
1e690 61 74 68 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b  ath, int flags){
1e6a0 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20  .  UnixUnusedFd 
1e6b0 2a 70 55 6e 75 73 65 64 20 3d 20 30 3b 0a 0a 20  *pUnused = 0;.. 
1e6c0 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 65 61 72 63   /* Do not searc
1e6d0 68 20 66 6f 72 20 61 6e 20 75 6e 75 73 65 64 20  h for an unused 
1e6e0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
1e6f0 6f 6e 20 76 78 77 6f 72 6b 73 2e 20 4e 6f 74 20  on vxworks. Not 
1e700 62 65 63 61 75 73 65 0a 20 20 2a 2a 20 76 78 77  because.  ** vxw
1e710 6f 72 6b 73 20 77 6f 75 6c 64 20 6e 6f 74 20 62  orks would not b
1e720 65 6e 65 66 69 74 20 66 72 6f 6d 20 74 68 65 20  enefit from the 
1e730 63 68 61 6e 67 65 20 28 69 74 20 6d 69 67 68 74  change (it might
1e740 2c 20 77 65 27 72 65 20 6e 6f 74 20 73 75 72 65  , we're not sure
1e750 29 2c 0a 20 20 2a 2a 20 62 75 74 20 62 65 63 61  ),.  ** but beca
1e760 75 73 65 20 6e 6f 20 77 61 79 20 74 6f 20 74 65  use no way to te
1e770 73 74 20 69 74 20 69 73 20 63 75 72 72 65 6e 74  st it is current
1e780 6c 79 20 61 76 61 69 6c 61 62 6c 65 2e 20 49 74  ly available. It
1e790 20 69 73 20 62 65 74 74 65 72 20 0a 20 20 2a 2a   is better .  **
1e7a0 20 6e 6f 74 20 74 6f 20 72 69 73 6b 20 62 72 65   not to risk bre
1e7b0 61 6b 69 6e 67 20 76 78 77 6f 72 6b 73 20 73 75  aking vxworks su
1e7c0 70 70 6f 72 74 20 66 6f 72 20 74 68 65 20 73 61  pport for the sa
1e7d0 6b 65 20 6f 66 20 73 75 63 68 20 61 6e 20 6f 62  ke of such an ob
1e7e0 73 63 75 72 65 20 0a 20 20 2a 2a 20 66 65 61 74  scure .  ** feat
1e7f0 75 72 65 2e 20 20 2a 2f 0a 23 69 66 20 21 4f 53  ure.  */.#if !OS
1e800 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74 72 75 63  _VXWORKS.  struc
1e810 74 20 73 74 61 74 20 73 53 74 61 74 3b 20 20 20  t stat sStat;   
1e820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e830 2f 2a 20 52 65 73 75 6c 74 73 20 6f 66 20 73 74  /* Results of st
1e840 61 74 28 29 20 63 61 6c 6c 20 2a 2f 0a 0a 20 20  at() call */..  
1e850 2f 2a 20 41 20 73 74 61 74 28 29 20 63 61 6c 6c  /* A stat() call
1e860 20 6d 61 79 20 66 61 69 6c 20 66 6f 72 20 76 61   may fail for va
1e870 72 69 6f 75 73 20 72 65 61 73 6f 6e 73 2e 20 49  rious reasons. I
1e880 66 20 74 68 69 73 20 68 61 70 70 65 6e 73 2c 20  f this happens, 
1e890 69 74 20 69 73 0a 20 20 2a 2a 20 61 6c 6d 6f 73  it is.  ** almos
1e8a0 74 20 63 65 72 74 61 69 6e 20 74 68 61 74 20 61  t certain that a
1e8b0 6e 20 6f 70 65 6e 28 29 20 63 61 6c 6c 20 6f 6e  n open() call on
1e8c0 20 74 68 65 20 73 61 6d 65 20 70 61 74 68 20 77   the same path w
1e8d0 69 6c 6c 20 61 6c 73 6f 20 66 61 69 6c 2e 0a 20  ill also fail.. 
1e8e0 20 2a 2a 20 46 6f 72 20 74 68 69 73 20 72 65 61   ** For this rea
1e8f0 73 6f 6e 2c 20 69 66 20 61 6e 20 65 72 72 6f 72  son, if an error
1e900 20 6f 63 63 75 72 73 20 69 6e 20 74 68 65 20 73   occurs in the s
1e910 74 61 74 28 29 20 63 61 6c 6c 20 68 65 72 65 2c  tat() call here,
1e920 20 69 74 20 69 73 0a 20 20 2a 2a 20 69 67 6e 6f   it is.  ** igno
1e930 72 65 64 20 61 6e 64 20 2d 31 20 69 73 20 72 65  red and -1 is re
1e940 74 75 72 6e 65 64 2e 20 54 68 65 20 63 61 6c 6c  turned. The call
1e950 65 72 20 77 69 6c 6c 20 74 72 79 20 74 6f 20 6f  er will try to o
1e960 70 65 6e 20 61 20 6e 65 77 20 66 69 6c 65 0a 20  pen a new file. 
1e970 20 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20 6f   ** descriptor o
1e980 6e 20 74 68 65 20 73 61 6d 65 20 70 61 74 68 2c  n the same path,
1e990 20 66 61 69 6c 2c 20 61 6e 64 20 72 65 74 75 72   fail, and retur
1e9a0 6e 20 61 6e 20 65 72 72 6f 72 20 74 6f 20 53 51  n an error to SQ
1e9b0 4c 69 74 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  Lite..  **.  ** 
1e9c0 45 76 65 6e 20 69 66 20 61 20 73 75 62 73 65 71  Even if a subseq
1e9d0 75 65 6e 74 20 6f 70 65 6e 28 29 20 63 61 6c 6c  uent open() call
1e9e0 20 64 6f 65 73 20 73 75 63 63 65 65 64 2c 20 74   does succeed, t
1e9f0 68 65 20 63 6f 6e 73 65 71 75 65 6e 63 65 73 20  he consequences 
1ea00 6f 66 0a 20 20 2a 2a 20 6e 6f 74 20 73 65 61 72  of.  ** not sear
1ea10 63 68 69 6e 67 20 66 6f 72 20 61 20 72 65 73 75  ching for a resu
1ea20 73 61 62 6c 65 20 66 69 6c 65 20 64 65 73 63 72  sable file descr
1ea30 69 70 74 6f 72 20 61 72 65 20 6e 6f 74 20 64 69  iptor are not di
1ea40 72 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 30 3d  re.  */.  if( 0=
1ea50 3d 73 74 61 74 28 7a 50 61 74 68 2c 20 26 73 53  =stat(zPath, &sS
1ea60 74 61 74 29 20 29 7b 0a 20 20 20 20 73 74 72 75  tat) ){.    stru
1ea70 63 74 20 75 6e 69 78 4f 70 65 6e 43 6e 74 20 2a  ct unixOpenCnt *
1ea80 70 4f 3b 0a 20 20 20 20 73 74 72 75 63 74 20 75  pO;.    struct u
1ea90 6e 69 78 46 69 6c 65 49 64 20 69 64 3b 0a 20 20  nixFileId id;.  
1eaa0 20 20 69 64 2e 64 65 76 20 3d 20 73 53 74 61 74    id.dev = sStat
1eab0 2e 73 74 5f 64 65 76 3b 0a 20 20 20 20 69 64 2e  .st_dev;.    id.
1eac0 69 6e 6f 20 3d 20 73 53 74 61 74 2e 73 74 5f 69  ino = sStat.st_i
1ead0 6e 6f 3b 0a 0a 20 20 20 20 75 6e 69 78 45 6e 74  no;..    unixEnt
1eae0 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 66  erMutex();.    f
1eaf0 6f 72 28 70 4f 3d 6f 70 65 6e 4c 69 73 74 3b 20  or(pO=openList; 
1eb00 70 4f 20 26 26 20 6d 65 6d 63 6d 70 28 26 69 64  pO && memcmp(&id
1eb10 2c 20 26 70 4f 2d 3e 66 69 6c 65 49 64 2c 20 73  , &pO->fileId, s
1eb20 69 7a 65 6f 66 28 69 64 29 29 3b 20 70 4f 3d 70  izeof(id)); pO=p
1eb30 4f 2d 3e 70 4e 65 78 74 29 3b 0a 20 20 20 20 69  O->pNext);.    i
1eb40 66 28 20 70 4f 20 29 7b 0a 20 20 20 20 20 20 55  f( pO ){.      U
1eb50 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 2a 70 70  nixUnusedFd **pp
1eb60 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 70 3d 26  ;.      for(pp=&
1eb70 70 4f 2d 3e 70 55 6e 75 73 65 64 3b 20 2a 70 70  pO->pUnused; *pp
1eb80 20 26 26 20 28 2a 70 70 29 2d 3e 66 6c 61 67 73   && (*pp)->flags
1eb90 21 3d 66 6c 61 67 73 3b 20 70 70 3d 26 28 28 2a  !=flags; pp=&((*
1eba0 70 70 29 2d 3e 70 4e 65 78 74 29 29 3b 0a 20 20  pp)->pNext));.  
1ebb0 20 20 20 20 70 55 6e 75 73 65 64 20 3d 20 2a 70      pUnused = *p
1ebc0 70 3b 0a 20 20 20 20 20 20 69 66 28 20 70 55 6e  p;.      if( pUn
1ebd0 75 73 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20  used ){.        
1ebe0 2a 70 70 20 3d 20 70 55 6e 75 73 65 64 2d 3e 70  *pp = pUnused->p
1ebf0 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Next;.      }.  
1ec00 20 20 7d 0a 20 20 20 20 75 6e 69 78 4c 65 61 76    }.    unixLeav
1ec10 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a 23 65  eMutex();.  }.#e
1ec20 6e 64 69 66 20 20 20 20 2f 2a 20 69 66 20 21 4f  ndif    /* if !O
1ec30 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 20 20 72  S_VXWORKS */.  r
1ec40 65 74 75 72 6e 20 70 55 6e 75 73 65 64 3b 0a 7d  eturn pUnused;.}
1ec50 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65  ../*.** Open the
1ec60 20 66 69 6c 65 20 7a 50 61 74 68 2e 0a 2a 2a 20   file zPath..** 
1ec70 0a 2a 2a 20 50 72 65 76 69 6f 75 73 6c 79 2c 20  .** Previously, 
1ec80 74 68 65 20 53 51 4c 69 74 65 20 4f 53 20 6c 61  the SQLite OS la
1ec90 79 65 72 20 75 73 65 64 20 74 68 72 65 65 20 66  yer used three f
1eca0 75 6e 63 74 69 6f 6e 73 20 69 6e 20 70 6c 61 63  unctions in plac
1ecb0 65 20 6f 66 20 74 68 69 73 0a 2a 2a 20 6f 6e 65  e of this.** one
1ecc0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73 71 6c 69  :.**.**     sqli
1ecd0 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 57 72 69  te3OsOpenReadWri
1ece0 74 65 28 29 3b 0a 2a 2a 20 20 20 20 20 73 71 6c  te();.**     sql
1ecf0 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 4f 6e  ite3OsOpenReadOn
1ed00 6c 79 28 29 3b 0a 2a 2a 20 20 20 20 20 73 71 6c  ly();.**     sql
1ed10 69 74 65 33 4f 73 4f 70 65 6e 45 78 63 6c 75 73  ite3OsOpenExclus
1ed20 69 76 65 28 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65  ive();.**.** The
1ed30 73 65 20 63 61 6c 6c 73 20 63 6f 72 72 65 73 70  se calls corresp
1ed40 6f 6e 64 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f  ond to the follo
1ed50 77 69 6e 67 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  wing combination
1ed60 73 20 6f 66 20 66 6c 61 67 73 3a 0a 2a 2a 0a 2a  s of flags:.**.*
1ed70 2a 20 20 20 20 20 52 65 61 64 57 72 69 74 65 28  *     ReadWrite(
1ed80 29 20 2d 3e 20 20 20 20 20 28 52 45 41 44 57 52  ) ->     (READWR
1ed90 49 54 45 20 7c 20 43 52 45 41 54 45 29 0a 2a 2a  ITE | CREATE).**
1eda0 20 20 20 20 20 52 65 61 64 4f 6e 6c 79 28 29 20       ReadOnly() 
1edb0 20 2d 3e 20 20 20 20 20 28 52 45 41 44 4f 4e 4c   ->     (READONL
1edc0 59 29 20 0a 2a 2a 20 20 20 20 20 4f 70 65 6e 45  Y) .**     OpenE
1edd0 78 63 6c 75 73 69 76 65 28 29 20 2d 3e 20 28 52  xclusive() -> (R
1ede0 45 41 44 57 52 49 54 45 20 7c 20 43 52 45 41 54  EADWRITE | CREAT
1edf0 45 20 7c 20 45 58 43 4c 55 53 49 56 45 29 0a 2a  E | EXCLUSIVE).*
1ee00 2a 0a 2a 2a 20 54 68 65 20 6f 6c 64 20 4f 70 65  *.** The old Ope
1ee10 6e 45 78 63 6c 75 73 69 76 65 28 29 20 61 63 63  nExclusive() acc
1ee20 65 70 74 65 64 20 61 20 62 6f 6f 6c 65 61 6e 20  epted a boolean 
1ee30 61 72 67 75 6d 65 6e 74 20 2d 20 22 64 65 6c 46  argument - "delF
1ee40 6c 61 67 22 2e 20 49 66 0a 2a 2a 20 74 72 75 65  lag". If.** true
1ee50 2c 20 74 68 65 20 66 69 6c 65 20 77 61 73 20 63  , the file was c
1ee60 6f 6e 66 69 67 75 72 65 64 20 74 6f 20 62 65 20  onfigured to be 
1ee70 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65  automatically de
1ee80 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65 0a 2a  leted when the.*
1ee90 2a 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 63 6c  * file handle cl
1eea0 6f 73 65 64 2e 20 54 6f 20 61 63 68 69 65 76 65  osed. To achieve
1eeb0 20 74 68 65 20 73 61 6d 65 20 65 66 66 65 63 74   the same effect
1eec0 20 75 73 69 6e 67 20 74 68 69 73 20 6e 65 77 20   using this new 
1eed0 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65 2c 20 61  .** interface, a
1eee0 64 64 20 74 68 65 20 44 45 4c 45 54 45 4f 4e 43  dd the DELETEONC
1eef0 4c 4f 53 45 20 66 6c 61 67 20 74 6f 20 74 68 6f  LOSE flag to tho
1ef00 73 65 20 73 70 65 63 69 66 69 65 64 20 61 62 6f  se specified abo
1ef10 76 65 20 66 6f 72 20 0a 2a 2a 20 4f 70 65 6e 45  ve for .** OpenE
1ef20 78 63 6c 75 73 69 76 65 28 29 2e 0a 2a 2f 0a 73  xclusive()..*/.s
1ef30 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4f 70  tatic int unixOp
1ef40 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  en(.  sqlite3_vf
1ef50 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20  s *pVfs,        
1ef60 20 20 20 2f 2a 20 54 68 65 20 56 46 53 20 66 6f     /* The VFS fo
1ef70 72 20 77 68 69 63 68 20 74 68 69 73 20 69 73 20  r which this is 
1ef80 74 68 65 20 78 4f 70 65 6e 20 6d 65 74 68 6f 64  the xOpen method
1ef90 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
1efa0 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20   *zPath,        
1efb0 20 20 20 2f 2a 20 50 61 74 68 6e 61 6d 65 20 6f     /* Pathname o
1efc0 66 20 66 69 6c 65 20 74 6f 20 62 65 20 6f 70 65  f file to be ope
1efd0 6e 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ned */.  sqlite3
1efe0 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 20  _file *pFile,   
1eff0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c        /* The fil
1f000 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20  e descriptor to 
1f010 62 65 20 66 69 6c 6c 65 64 20 69 6e 20 2a 2f 0a  be filled in */.
1f020 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20    int flags,    
1f030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f040 2a 20 49 6e 70 75 74 20 66 6c 61 67 73 20 74 6f  * Input flags to
1f050 20 63 6f 6e 74 72 6f 6c 20 74 68 65 20 6f 70 65   control the ope
1f060 6e 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  ning */.  int *p
1f070 4f 75 74 46 6c 61 67 73 20 20 20 20 20 20 20 20  OutFlags        
1f080 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74         /* Output
1f090 20 66 6c 61 67 73 20 72 65 74 75 72 6e 65 64 20   flags returned 
1f0a0 74 6f 20 53 51 4c 69 74 65 20 63 6f 72 65 20 2a  to SQLite core *
1f0b0 2f 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  /.){.  unixFile 
1f0c0 2a 70 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a  *p = (unixFile *
1f0d0 29 70 46 69 6c 65 3b 0a 20 20 69 6e 74 20 66 64  )pFile;.  int fd
1f0e0 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20 20   = -1;          
1f0f0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
1f100 20 64 65 73 63 72 69 70 74 6f 72 20 72 65 74 75   descriptor retu
1f110 72 6e 65 64 20 62 79 20 6f 70 65 6e 28 29 20 2a  rned by open() *
1f120 2f 0a 20 20 69 6e 74 20 64 69 72 66 64 20 3d 20  /.  int dirfd = 
1f130 2d 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  -1;             
1f140 20 20 20 2f 2a 20 44 69 72 65 63 74 6f 72 79 20     /* Directory 
1f150 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
1f160 2a 2f 0a 20 20 69 6e 74 20 6f 70 65 6e 46 6c 61  */.  int openFla
1f170 67 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  gs = 0;         
1f180 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 74 6f 20      /* Flags to 
1f190 70 61 73 73 20 74 6f 20 6f 70 65 6e 28 29 20 2a  pass to open() *
1f1a0 2f 0a 20 20 69 6e 74 20 65 54 79 70 65 20 3d 20  /.  int eType = 
1f1b0 66 6c 61 67 73 26 30 78 46 46 46 46 46 46 30 30  flags&0xFFFFFF00
1f1c0 3b 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 66 69  ;  /* Type of fi
1f1d0 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20  le to open */.  
1f1e0 69 6e 74 20 6e 6f 4c 6f 63 6b 3b 20 20 20 20 20  int noLock;     
1f1f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f200 2a 20 54 72 75 65 20 74 6f 20 6f 6d 69 74 20 6c  * True to omit l
1f210 6f 63 6b 69 6e 67 20 70 72 69 6d 69 74 69 76 65  ocking primitive
1f220 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  s */.  int rc = 
1f230 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
1f240 20 20 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f        /* Functio
1f250 6e 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f  n Return Code */
1f260 0a 0a 20 20 69 6e 74 20 69 73 45 78 63 6c 75 73  ..  int isExclus
1f270 69 76 65 20 20 3d 20 28 66 6c 61 67 73 20 26 20  ive  = (flags & 
1f280 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c  SQLITE_OPEN_EXCL
1f290 55 53 49 56 45 29 3b 0a 20 20 69 6e 74 20 69 73  USIVE);.  int is
1f2a0 44 65 6c 65 74 65 20 20 20 20 20 3d 20 28 66 6c  Delete     = (fl
1f2b0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
1f2c0 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 29  N_DELETEONCLOSE)
1f2d0 3b 0a 20 20 69 6e 74 20 69 73 43 72 65 61 74 65  ;.  int isCreate
1f2e0 20 20 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20       = (flags & 
1f2f0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
1f300 54 45 29 3b 0a 20 20 69 6e 74 20 69 73 52 65 61  TE);.  int isRea
1f310 64 6f 6e 6c 79 20 20 20 3d 20 28 66 6c 61 67 73  donly   = (flags
1f320 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   & SQLITE_OPEN_R
1f330 45 41 44 4f 4e 4c 59 29 3b 0a 20 20 69 6e 74 20  EADONLY);.  int 
1f340 69 73 52 65 61 64 57 72 69 74 65 20 20 3d 20 28  isReadWrite  = (
1f350 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
1f360 50 45 4e 5f 52 45 41 44 57 52 49 54 45 29 3b 0a  PEN_READWRITE);.
1f370 0a 20 20 2f 2a 20 49 66 20 63 72 65 61 74 69 6e  .  /* If creatin
1f380 67 20 61 20 6d 61 73 74 65 72 20 6f 72 20 6d 61  g a master or ma
1f390 69 6e 2d 66 69 6c 65 20 6a 6f 75 72 6e 61 6c 2c  in-file journal,
1f3a0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   this function w
1f3b0 69 6c 6c 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20  ill open.  ** a 
1f3c0 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 20  file-descriptor 
1f3d0 6f 6e 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  on the directory
1f3e0 20 74 6f 6f 2e 20 54 68 65 20 66 69 72 73 74 20   too. The first 
1f3f0 74 69 6d 65 20 75 6e 69 78 53 79 6e 63 28 29 0a  time unixSync().
1f400 20 20 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 74    ** is called t
1f410 68 65 20 64 69 72 65 63 74 6f 72 79 20 66 69 6c  he directory fil
1f420 65 20 64 65 73 63 72 69 70 74 6f 72 20 77 69 6c  e descriptor wil
1f430 6c 20 62 65 20 66 73 79 6e 63 28 29 65 64 20 61  l be fsync()ed a
1f440 6e 64 20 63 6c 6f 73 65 28 29 64 2e 0a 20 20 2a  nd close()d..  *
1f450 2f 0a 20 20 69 6e 74 20 69 73 4f 70 65 6e 44 69  /.  int isOpenDi
1f460 72 65 63 74 6f 72 79 20 3d 20 28 69 73 43 72 65  rectory = (isCre
1f470 61 74 65 20 26 26 20 0a 20 20 20 20 20 20 28 65  ate && .      (e
1f480 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
1f490 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c  N_MASTER_JOURNAL
1f4a0 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
1f4b0 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
1f4c0 4e 41 4c 29 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20  NAL).  );..  /* 
1f4d0 49 66 20 61 72 67 75 6d 65 6e 74 20 7a 50 61 74  If argument zPat
1f4e0 68 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e  h is a NULL poin
1f4f0 74 65 72 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ter, this functi
1f500 6f 6e 20 69 73 20 72 65 71 75 69 72 65 64 20 74  on is required t
1f510 6f 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 74 65  o open.  ** a te
1f520 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 55 73  mporary file. Us
1f530 65 20 74 68 69 73 20 62 75 66 66 65 72 20 74 6f  e this buffer to
1f540 20 73 74 6f 72 65 20 74 68 65 20 66 69 6c 65 20   store the file 
1f550 6e 61 6d 65 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20  name in..  */.  
1f560 63 68 61 72 20 7a 54 6d 70 6e 61 6d 65 5b 4d 41  char zTmpname[MA
1f570 58 5f 50 41 54 48 4e 41 4d 45 2b 31 5d 3b 0a 20  X_PATHNAME+1];. 
1f580 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
1f590 6d 65 20 3d 20 7a 50 61 74 68 3b 0a 0a 20 20 2f  me = zPath;..  /
1f5a0 2a 20 43 68 65 63 6b 20 74 68 65 20 66 6f 6c 6c  * Check the foll
1f5b0 6f 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73  owing statements
1f5c0 20 61 72 65 20 74 72 75 65 3a 20 0a 20 20 2a 2a   are true: .  **
1f5d0 0a 20 20 2a 2a 20 20 20 28 61 29 20 45 78 61 63  .  **   (a) Exac
1f5e0 74 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 52  tly one of the R
1f5f0 45 41 44 57 52 49 54 45 20 61 6e 64 20 52 45 41  EADWRITE and REA
1f600 44 4f 4e 4c 59 20 66 6c 61 67 73 20 6d 75 73 74  DONLY flags must
1f610 20 62 65 20 73 65 74 2c 20 61 6e 64 20 0a 20 20   be set, and .  
1f620 2a 2a 20 20 20 28 62 29 20 69 66 20 43 52 45 41  **   (b) if CREA
1f630 54 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20  TE is set, then 
1f640 52 45 41 44 57 52 49 54 45 20 6d 75 73 74 20 61  READWRITE must a
1f650 6c 73 6f 20 62 65 20 73 65 74 2c 20 61 6e 64 0a  lso be set, and.
1f660 20 20 2a 2a 20 20 20 28 63 29 20 69 66 20 45 58    **   (c) if EX
1f670 43 4c 55 53 49 56 45 20 69 73 20 73 65 74 2c 20  CLUSIVE is set, 
1f680 74 68 65 6e 20 43 52 45 41 54 45 20 6d 75 73 74  then CREATE must
1f690 20 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20 20   also be set..  
1f6a0 2a 2a 20 20 20 28 64 29 20 69 66 20 44 45 4c 45  **   (d) if DELE
1f6b0 54 45 4f 4e 43 4c 4f 53 45 20 69 73 20 73 65 74  TEONCLOSE is set
1f6c0 2c 20 74 68 65 6e 20 43 52 45 41 54 45 20 6d 75  , then CREATE mu
1f6d0 73 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a  st also be set..
1f6e0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 28 69    */.  assert((i
1f6f0 73 52 65 61 64 6f 6e 6c 79 3d 3d 30 20 7c 7c 20  sReadonly==0 || 
1f700 69 73 52 65 61 64 57 72 69 74 65 3d 3d 30 29 20  isReadWrite==0) 
1f710 26 26 20 28 69 73 52 65 61 64 57 72 69 74 65 20  && (isReadWrite 
1f720 7c 7c 20 69 73 52 65 61 64 6f 6e 6c 79 29 29 3b  || isReadonly));
1f730 0a 20 20 61 73 73 65 72 74 28 69 73 43 72 65 61  .  assert(isCrea
1f740 74 65 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64 57  te==0 || isReadW
1f750 72 69 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28  rite);.  assert(
1f760 69 73 45 78 63 6c 75 73 69 76 65 3d 3d 30 20 7c  isExclusive==0 |
1f770 7c 20 69 73 43 72 65 61 74 65 29 3b 0a 20 20 61  | isCreate);.  a
1f780 73 73 65 72 74 28 69 73 44 65 6c 65 74 65 3d 3d  ssert(isDelete==
1f790 30 20 7c 7c 20 69 73 43 72 65 61 74 65 29 3b 0a  0 || isCreate);.
1f7a0 0a 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 44  .  /* The main D
1f7b0 42 2c 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c  B, main journal,
1f7c0 20 61 6e 64 20 6d 61 73 74 65 72 20 6a 6f 75 72   and master jour
1f7d0 6e 61 6c 20 61 72 65 20 6e 65 76 65 72 20 61 75  nal are never au
1f7e0 74 6f 6d 61 74 69 63 61 6c 6c 79 0a 20 20 2a 2a  tomatically.  **
1f7f0 20 64 65 6c 65 74 65 64 2e 20 4e 6f 72 20 61 72   deleted. Nor ar
1f800 65 20 74 68 65 79 20 65 76 65 72 20 74 65 6d 70  e they ever temp
1f810 6f 72 61 72 79 20 66 69 6c 65 73 2e 20 20 2a 2f  orary files.  */
1f820 0a 20 20 61 73 73 65 72 74 28 20 28 21 69 73 44  .  assert( (!isD
1f830 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20  elete && zName) 
1f840 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45  || eType!=SQLITE
1f850 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 29 3b  _OPEN_MAIN_DB );
1f860 0a 20 20 61 73 73 65 72 74 28 20 28 21 69 73 44  .  assert( (!isD
1f870 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20  elete && zName) 
1f880 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45  || eType!=SQLITE
1f890 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
1f8a0 41 4c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  AL );.  assert( 
1f8b0 28 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e  (!isDelete && zN
1f8c0 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53  ame) || eType!=S
1f8d0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45  QLITE_OPEN_MASTE
1f8e0 52 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 0a 20 20  R_JOURNAL );..  
1f8f0 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74 20 74  /* Assert that t
1f900 68 65 20 75 70 70 65 72 20 6c 61 79 65 72 20 68  he upper layer h
1f910 61 73 20 73 65 74 20 6f 6e 65 20 6f 66 20 74 68  as set one of th
1f920 65 20 22 66 69 6c 65 2d 74 79 70 65 22 20 66 6c  e "file-type" fl
1f930 61 67 73 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74  ags. */.  assert
1f940 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  ( eType==SQLITE_
1f950 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 20 20 20  OPEN_MAIN_DB    
1f960 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49    || eType==SQLI
1f970 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 20  TE_OPEN_TEMP_DB 
1f980 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65  .       || eType
1f990 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  ==SQLITE_OPEN_MA
1f9a0 49 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 7c 20 65 54  IN_JOURNAL || eT
1f9b0 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
1f9c0 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 20 0a 20  _TEMP_JOURNAL . 
1f9d0 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d        || eType==
1f9e0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a  SQLITE_OPEN_SUBJ
1f9f0 4f 55 52 4e 41 4c 20 20 20 7c 7c 20 65 54 79 70  OURNAL   || eTyp
1fa00 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e==SQLITE_OPEN_M
1fa10 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 0a 20  ASTER_JOURNAL . 
1fa20 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d        || eType==
1fa30 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 52 41 4e  SQLITE_OPEN_TRAN
1fa40 53 49 45 4e 54 5f 44 42 0a 20 20 29 3b 0a 0a 20  SIENT_DB.  );.. 
1fa50 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69   memset(p, 0, si
1fa60 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65 29 29 3b  zeof(unixFile));
1fa70 0a 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 53  ..  if( eType==S
1fa80 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
1fa90 44 42 20 29 7b 0a 20 20 20 20 55 6e 69 78 55 6e  DB ){.    UnixUn
1faa0 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64 3b  usedFd *pUnused;
1fab0 0a 20 20 20 20 70 55 6e 75 73 65 64 20 3d 20 66  .    pUnused = f
1fac0 69 6e 64 52 65 75 73 61 62 6c 65 46 64 28 7a 4e  indReusableFd(zN
1fad0 61 6d 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20  ame, flags);.   
1fae0 20 69 66 28 20 70 55 6e 75 73 65 64 20 29 7b 0a   if( pUnused ){.
1faf0 20 20 20 20 20 20 66 64 20 3d 20 70 55 6e 75 73        fd = pUnus
1fb00 65 64 2d 3e 66 64 3b 0a 20 20 20 20 7d 65 6c 73  ed->fd;.    }els
1fb10 65 7b 0a 20 20 20 20 20 20 70 55 6e 75 73 65 64  e{.      pUnused
1fb20 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
1fb30 63 28 73 69 7a 65 6f 66 28 2a 70 55 6e 75 73 65  c(sizeof(*pUnuse
1fb40 64 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  d));.      if( !
1fb50 70 55 6e 75 73 65 64 20 29 7b 0a 20 20 20 20 20  pUnused ){.     
1fb60 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1fb70 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a  _NOMEM;.      }.
1fb80 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 70 55 6e      }.    p->pUn
1fb90 75 73 65 64 20 3d 20 70 55 6e 75 73 65 64 3b 0a  used = pUnused;.
1fba0 20 20 7d 65 6c 73 65 20 69 66 28 20 21 7a 4e 61    }else if( !zNa
1fbb0 6d 65 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  me ){.    /* If 
1fbc0 7a 4e 61 6d 65 20 69 73 20 4e 55 4c 4c 2c 20 74  zName is NULL, t
1fbd0 68 65 20 75 70 70 65 72 20 6c 61 79 65 72 20 69  he upper layer i
1fbe0 73 20 72 65 71 75 65 73 74 69 6e 67 20 61 20 74  s requesting a t
1fbf0 65 6d 70 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20  emp file. */.   
1fc00 20 61 73 73 65 72 74 28 69 73 44 65 6c 65 74 65   assert(isDelete
1fc10 20 26 26 20 21 69 73 4f 70 65 6e 44 69 72 65 63   && !isOpenDirec
1fc20 74 6f 72 79 29 3b 0a 20 20 20 20 72 63 20 3d 20  tory);.    rc = 
1fc30 67 65 74 54 65 6d 70 6e 61 6d 65 28 4d 41 58 5f  getTempname(MAX_
1fc40 50 41 54 48 4e 41 4d 45 2b 31 2c 20 7a 54 6d 70  PATHNAME+1, zTmp
1fc50 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 72  name);.    if( r
1fc60 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1fc70 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1fc80 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4e 61 6d 65  .    }.    zName
1fc90 20 3d 20 7a 54 6d 70 6e 61 6d 65 3b 0a 20 20 7d   = zTmpname;.  }
1fca0 0a 0a 20 20 2f 2a 20 44 65 74 65 72 6d 69 6e 65  ..  /* Determine
1fcb0 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
1fcc0 65 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65  e flags paramete
1fcd0 72 20 70 61 73 73 65 64 20 74 6f 20 50 4f 53 49  r passed to POSI
1fce0 58 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20  X function.  ** 
1fcf0 6f 70 65 6e 28 29 2e 20 54 68 65 73 65 20 6d 75  open(). These mu
1fd00 73 74 20 62 65 20 63 61 6c 63 75 6c 61 74 65 64  st be calculated
1fd10 20 65 76 65 6e 20 69 66 20 6f 70 65 6e 28 29 20   even if open() 
1fd20 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64 2c 20 61  is not called, a
1fd30 73 0a 20 20 2a 2a 20 74 68 65 79 20 6d 61 79 20  s.  ** they may 
1fd40 62 65 20 73 74 6f 72 65 64 20 61 73 20 70 61 72  be stored as par
1fd50 74 20 6f 66 20 74 68 65 20 66 69 6c 65 20 68 61  t of the file ha
1fd60 6e 64 6c 65 20 61 6e 64 20 75 73 65 64 20 62 79  ndle and used by
1fd70 20 74 68 65 20 0a 20 20 2a 2a 20 27 63 6f 6e 63   the .  ** 'conc
1fd80 68 20 66 69 6c 65 27 20 6c 6f 63 6b 69 6e 67 20  h file' locking 
1fd90 66 75 6e 63 74 69 6f 6e 73 20 6c 61 74 65 72 20  functions later 
1fda0 6f 6e 2e 20 20 2a 2f 0a 20 20 69 66 28 20 69 73  on.  */.  if( is
1fdb0 52 65 61 64 6f 6e 6c 79 20 29 20 20 6f 70 65 6e  Readonly )  open
1fdc0 46 6c 61 67 73 20 7c 3d 20 4f 5f 52 44 4f 4e 4c  Flags |= O_RDONL
1fdd0 59 3b 0a 20 20 69 66 28 20 69 73 52 65 61 64 57  Y;.  if( isReadW
1fde0 72 69 74 65 20 29 20 6f 70 65 6e 46 6c 61 67 73  rite ) openFlags
1fdf0 20 7c 3d 20 4f 5f 52 44 57 52 3b 0a 20 20 69 66   |= O_RDWR;.  if
1fe00 28 20 69 73 43 72 65 61 74 65 20 29 20 20 20 20  ( isCreate )    
1fe10 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f 43  openFlags |= O_C
1fe20 52 45 41 54 3b 0a 20 20 69 66 28 20 69 73 45 78  REAT;.  if( isEx
1fe30 63 6c 75 73 69 76 65 20 29 20 6f 70 65 6e 46 6c  clusive ) openFl
1fe40 61 67 73 20 7c 3d 20 28 4f 5f 45 58 43 4c 7c 4f  ags |= (O_EXCL|O
1fe50 5f 4e 4f 46 4f 4c 4c 4f 57 29 3b 0a 20 20 6f 70  _NOFOLLOW);.  op
1fe60 65 6e 46 6c 61 67 73 20 7c 3d 20 28 4f 5f 4c 41  enFlags |= (O_LA
1fe70 52 47 45 46 49 4c 45 7c 4f 5f 42 49 4e 41 52 59  RGEFILE|O_BINARY
1fe80 29 3b 0a 0a 20 20 69 66 28 20 66 64 3c 30 20 29  );..  if( fd<0 )
1fe90 7b 0a 20 20 20 20 6d 6f 64 65 5f 74 20 6f 70 65  {.    mode_t ope
1fea0 6e 4d 6f 64 65 20 3d 20 28 69 73 44 65 6c 65 74  nMode = (isDelet
1feb0 65 3f 30 36 30 30 3a 53 51 4c 49 54 45 5f 44 45  e?0600:SQLITE_DE
1fec0 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49  FAULT_FILE_PERMI
1fed0 53 53 49 4f 4e 53 29 3b 0a 20 20 20 20 66 64 20  SSIONS);.    fd 
1fee0 3d 20 6f 70 65 6e 28 7a 4e 61 6d 65 2c 20 6f 70  = open(zName, op
1fef0 65 6e 46 6c 61 67 73 2c 20 6f 70 65 6e 4d 6f 64  enFlags, openMod
1ff00 65 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 34  e);.    OSTRACE4
1ff10 28 22 4f 50 45 4e 58 20 20 20 25 2d 33 64 20 25  ("OPENX   %-3d %
1ff20 73 20 30 25 6f 5c 6e 22 2c 20 66 64 2c 20 7a 4e  s 0%o\n", fd, zN
1ff30 61 6d 65 2c 20 6f 70 65 6e 46 6c 61 67 73 29 3b  ame, openFlags);
1ff40 0a 20 20 20 20 69 66 28 20 66 64 3c 30 20 26 26  .    if( fd<0 &&
1ff50 20 65 72 72 6e 6f 21 3d 45 49 53 44 49 52 20 26   errno!=EISDIR &
1ff60 26 20 69 73 52 65 61 64 57 72 69 74 65 20 26 26  & isReadWrite &&
1ff70 20 21 69 73 45 78 63 6c 75 73 69 76 65 20 29 7b   !isExclusive ){
1ff80 0a 20 20 20 20 20 20 2f 2a 20 46 61 69 6c 65 64  .      /* Failed
1ff90 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 66 69 6c   to open the fil
1ffa0 65 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65  e for read/write
1ffb0 20 61 63 63 65 73 73 2e 20 54 72 79 20 72 65 61   access. Try rea
1ffc0 64 2d 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20 20 20  d-only. */.     
1ffd0 20 66 6c 61 67 73 20 26 3d 20 7e 28 53 51 4c 49   flags &= ~(SQLI
1ffe0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
1fff0 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  E|SQLITE_OPEN_CR
20000 45 41 54 45 29 3b 0a 20 20 20 20 20 20 6f 70 65  EATE);.      ope
20010 6e 46 6c 61 67 73 20 26 3d 20 7e 28 4f 5f 52 44  nFlags &= ~(O_RD
20020 57 52 7c 4f 5f 43 52 45 41 54 29 3b 0a 20 20 20  WR|O_CREAT);.   
20030 20 20 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49     flags |= SQLI
20040 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
20050 3b 0a 20 20 20 20 20 20 6f 70 65 6e 46 6c 61 67  ;.      openFlag
20060 73 20 7c 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20  s |= O_RDONLY;. 
20070 20 20 20 20 20 66 64 20 3d 20 6f 70 65 6e 28 7a       fd = open(z
20080 4e 61 6d 65 2c 20 6f 70 65 6e 46 6c 61 67 73 2c  Name, openFlags,
20090 20 6f 70 65 6e 4d 6f 64 65 29 3b 0a 20 20 20 20   openMode);.    
200a0 7d 0a 20 20 20 20 69 66 28 20 66 64 3c 30 20 29  }.    if( fd<0 )
200b0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
200c0 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20  ITE_CANTOPEN;.  
200d0 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 5f 66 69      goto open_fi
200e0 6e 69 73 68 65 64 3b 0a 20 20 20 20 7d 0a 20 20  nished;.    }.  
200f0 7d 0a 20 20 61 73 73 65 72 74 28 20 66 64 3e 3d  }.  assert( fd>=
20100 30 20 29 3b 0a 20 20 69 66 28 20 70 4f 75 74 46  0 );.  if( pOutF
20110 6c 61 67 73 20 29 7b 0a 20 20 20 20 2a 70 4f 75  lags ){.    *pOu
20120 74 46 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a  tFlags = flags;.
20130 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 70 55    }..  if( p->pU
20140 6e 75 73 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e  nused ){.    p->
20150 70 55 6e 75 73 65 64 2d 3e 66 64 20 3d 20 66 64  pUnused->fd = fd
20160 3b 0a 20 20 20 20 70 2d 3e 70 55 6e 75 73 65 64  ;.    p->pUnused
20170 2d 3e 66 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b  ->flags = flags;
20180 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69 73 44 65  .  }..  if( isDe
20190 6c 65 74 65 20 29 7b 0a 23 69 66 20 4f 53 5f 56  lete ){.#if OS_V
201a0 58 57 4f 52 4b 53 0a 20 20 20 20 7a 50 61 74 68  XWORKS.    zPath
201b0 20 3d 20 7a 4e 61 6d 65 3b 0a 23 65 6c 73 65 0a   = zName;.#else.
201c0 20 20 20 20 75 6e 6c 69 6e 6b 28 7a 4e 61 6d 65      unlink(zName
201d0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 69  );.#endif.  }.#i
201e0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
201f0 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20  LOCKING_STYLE.  
20200 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 6f 70 65  else{.    p->ope
20210 6e 46 6c 61 67 73 20 3d 20 6f 70 65 6e 46 6c 61  nFlags = openFla
20220 67 73 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  gs;.  }.#endif..
20230 20 20 69 66 28 20 69 73 4f 70 65 6e 44 69 72 65    if( isOpenDire
20240 63 74 6f 72 79 20 29 7b 0a 20 20 20 20 72 63 20  ctory ){.    rc 
20250 3d 20 6f 70 65 6e 44 69 72 65 63 74 6f 72 79 28  = openDirectory(
20260 7a 50 61 74 68 2c 20 26 64 69 72 66 64 29 3b 0a  zPath, &dirfd);.
20270 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
20280 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f  TE_OK ){.      /
20290 2a 20 49 74 20 69 73 20 73 61 66 65 20 74 6f 20  * It is safe to 
202a0 63 6c 6f 73 65 20 66 64 20 61 74 20 74 68 69 73  close fd at this
202b0 20 70 6f 69 6e 74 2c 20 62 65 63 61 75 73 65 20   point, because 
202c0 69 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  it is guaranteed
202d0 20 6e 6f 74 0a 20 20 20 20 20 20 2a 2a 20 74 6f   not.      ** to
202e0 20 62 65 20 6f 70 65 6e 20 6f 6e 20 61 20 64 61   be open on a da
202f0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20  tabase file. If 
20300 69 74 20 77 65 72 65 20 6f 70 65 6e 20 6f 6e 20  it were open on 
20310 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  a database file,
20320 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 77 6f 75  .      ** it wou
20330 6c 64 20 6e 6f 74 20 62 65 20 73 61 66 65 20 74  ld not be safe t
20340 6f 20 63 6c 6f 73 65 20 61 73 20 74 68 69 73 20  o close as this 
20350 77 6f 75 6c 64 20 72 65 6c 65 61 73 65 20 61 6e  would release an
20360 79 20 6c 6f 63 6b 73 20 68 65 6c 64 0a 20 20 20  y locks held.   
20370 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 66 69 6c     ** on the fil
20380 65 20 62 79 20 74 68 69 73 20 70 72 6f 63 65 73  e by this proces
20390 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  s.  */.      ass
203a0 65 72 74 28 20 65 54 79 70 65 21 3d 53 51 4c 49  ert( eType!=SQLI
203b0 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20  TE_OPEN_MAIN_DB 
203c0 29 3b 0a 20 20 20 20 20 20 63 6c 6f 73 65 28 66  );.      close(f
203d0 64 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  d);             
203e0 2f 2a 20 73 69 6c 65 6e 74 6c 79 20 6c 65 61 6b  /* silently leak
203f0 20 69 66 20 66 61 69 6c 2c 20 61 6c 72 65 61 64   if fail, alread
20400 79 20 69 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20  y in error */.  
20410 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 5f 66 69      goto open_fi
20420 6e 69 73 68 65 64 3b 0a 20 20 20 20 7d 0a 20 20  nished;.    }.  
20430 7d 0a 0a 23 69 66 64 65 66 20 46 44 5f 43 4c 4f  }..#ifdef FD_CLO
20440 45 58 45 43 0a 20 20 66 63 6e 74 6c 28 66 64 2c  EXEC.  fcntl(fd,
20450 20 46 5f 53 45 54 46 44 2c 20 66 63 6e 74 6c 28   F_SETFD, fcntl(
20460 66 64 2c 20 46 5f 47 45 54 46 44 2c 20 30 29 20  fd, F_GETFD, 0) 
20470 7c 20 46 44 5f 43 4c 4f 45 58 45 43 29 3b 0a 23  | FD_CLOEXEC);.#
20480 65 6e 64 69 66 0a 0a 20 20 6e 6f 4c 6f 63 6b 20  endif..  noLock 
20490 3d 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f  = eType!=SQLITE_
204a0 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 3b 0a 0a 23  OPEN_MAIN_DB;..#
204b0 69 66 20 53 51 4c 49 54 45 5f 50 52 45 46 45 52  if SQLITE_PREFER
204c0 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 0a 20  _PROXY_LOCKING. 
204d0 20 69 66 28 20 7a 50 61 74 68 21 3d 4e 55 4c 4c   if( zPath!=NULL
204e0 20 26 26 20 21 6e 6f 4c 6f 63 6b 20 26 26 20 70   && !noLock && p
204f0 56 66 73 2d 3e 78 4f 70 65 6e 20 29 7b 0a 20 20  Vfs->xOpen ){.  
20500 20 20 63 68 61 72 20 2a 65 6e 76 66 6f 72 63 65    char *envforce
20510 20 3d 20 67 65 74 65 6e 76 28 22 53 51 4c 49 54   = getenv("SQLIT
20520 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f 4c 4f  E_FORCE_PROXY_LO
20530 43 4b 49 4e 47 22 29 3b 0a 20 20 20 20 69 6e 74  CKING");.    int
20540 20 75 73 65 50 72 6f 78 79 20 3d 20 30 3b 0a 0a   useProxy = 0;..
20550 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 46 4f      /* SQLITE_FO
20560 52 43 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e  RCE_PROXY_LOCKIN
20570 47 3d 3d 31 20 6d 65 61 6e 73 20 66 6f 72 63 65  G==1 means force
20580 20 61 6c 77 61 79 73 20 75 73 65 20 70 72 6f 78   always use prox
20590 79 2c 20 30 20 6d 65 61 6e 73 20 0a 20 20 20 20  y, 0 means .    
205a0 2a 2a 20 6e 65 76 65 72 20 75 73 65 20 70 72 6f  ** never use pro
205b0 78 79 2c 20 4e 55 4c 4c 20 6d 65 61 6e 73 20 75  xy, NULL means u
205c0 73 65 20 70 72 6f 78 79 20 66 6f 72 20 6e 6f 6e  se proxy for non
205d0 2d 6c 6f 63 61 6c 20 66 69 6c 65 73 20 6f 6e 6c  -local files onl
205e0 79 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 65  y.  */.    if( e
205f0 6e 76 66 6f 72 63 65 21 3d 4e 55 4c 4c 20 29 7b  nvforce!=NULL ){
20600 0a 20 20 20 20 20 20 75 73 65 50 72 6f 78 79 20  .      useProxy 
20610 3d 20 61 74 6f 69 28 65 6e 76 66 6f 72 63 65 29  = atoi(envforce)
20620 3e 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  >0;.    }else{. 
20630 20 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74       struct stat
20640 66 73 20 66 73 49 6e 66 6f 3b 0a 20 20 20 20 20  fs fsInfo;.     
20650 20 69 66 28 20 73 74 61 74 66 73 28 7a 50 61 74   if( statfs(zPat
20660 68 2c 20 26 66 73 49 6e 66 6f 29 20 3d 3d 20 2d  h, &fsInfo) == -
20670 31 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  1 ){.        /* 
20680 49 6e 20 74 68 65 6f 72 79 2c 20 74 68 65 20 63  In theory, the c
20690 6c 6f 73 65 28 66 64 29 20 63 61 6c 6c 20 69 73  lose(fd) call is
206a0 20 73 75 62 2d 6f 70 74 69 6d 61 6c 2e 20 49 66   sub-optimal. If
206b0 20 74 68 65 20 66 69 6c 65 20 6f 70 65 6e 65 64   the file opened
206c0 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 69 74 68  .        ** with
206d0 20 66 64 20 69 73 20 61 20 64 61 74 61 62 61 73   fd is a databas
206e0 65 20 66 69 6c 65 2c 20 61 6e 64 20 74 68 65 72  e file, and ther
206f0 65 20 61 72 65 20 6f 74 68 65 72 20 63 6f 6e 6e  e are other conn
20700 65 63 74 69 6f 6e 73 20 6f 70 65 6e 0a 20 20 20  ections open.   
20710 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 61 74 20       ** on that 
20720 66 69 6c 65 20 74 68 61 74 20 61 72 65 20 63 75  file that are cu
20730 72 72 65 6e 74 6c 79 20 68 6f 6c 64 69 6e 67 20  rrently holding 
20740 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20 6f  advisory locks o
20750 6e 20 69 74 2c 0a 20 20 20 20 20 20 20 20 2a 2a  n it,.        **
20760 20 74 68 65 6e 20 74 68 65 20 63 61 6c 6c 20 74   then the call t
20770 6f 20 63 6c 6f 73 65 28 29 20 77 69 6c 6c 20 63  o close() will c
20780 61 6e 63 65 6c 20 74 68 6f 73 65 20 6c 6f 63 6b  ancel those lock
20790 73 2e 20 49 6e 20 70 72 61 63 74 69 63 65 2c 0a  s. In practice,.
207a0 20 20 20 20 20 20 20 20 2a 2a 20 77 65 27 72 65          ** we're
207b0 20 61 73 73 75 6d 69 6e 67 20 74 68 61 74 20 73   assuming that s
207c0 74 61 74 66 73 28 29 20 64 6f 65 73 6e 27 74 20  tatfs() doesn't 
207d0 66 61 69 6c 20 76 65 72 79 20 6f 66 74 65 6e 2e  fail very often.
207e0 20 41 74 20 6c 65 61 73 74 0a 20 20 20 20 20 20   At least.      
207f0 20 20 2a 2a 20 6e 6f 74 20 77 68 69 6c 65 20 6f    ** not while o
20800 74 68 65 72 20 66 69 6c 65 20 64 65 73 63 72 69  ther file descri
20810 70 74 6f 72 73 20 6f 70 65 6e 65 64 20 62 79 20  ptors opened by 
20820 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73  the same process
20830 20 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74   on.        ** t
20840 68 65 20 73 61 6d 65 20 66 69 6c 65 20 61 72 65  he same file are
20850 20 77 6f 72 6b 69 6e 67 2e 20 20 2a 2f 0a 20 20   working.  */.  
20860 20 20 20 20 20 20 70 2d 3e 6c 61 73 74 45 72 72        p->lastErr
20870 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
20880 20 20 20 20 69 66 28 20 64 69 72 66 64 3e 3d 30      if( dirfd>=0
20890 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6c   ){.          cl
208a0 6f 73 65 28 64 69 72 66 64 29 3b 20 2f 2a 20 73  ose(dirfd); /* s
208b0 69 6c 65 6e 74 6c 79 20 6c 65 61 6b 20 69 66 20  ilently leak if 
208c0 66 61 69 6c 2c 20 69 6e 20 65 72 72 6f 72 20 2a  fail, in error *
208d0 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  /.        }.    
208e0 20 20 20 20 63 6c 6f 73 65 28 66 64 29 3b 20 2f      close(fd); /
208f0 2a 20 73 69 6c 65 6e 74 6c 79 20 6c 65 61 6b 20  * silently leak 
20900 69 66 20 66 61 69 6c 2c 20 69 6e 20 65 72 72 6f  if fail, in erro
20910 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20  r */.        rc 
20920 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41  = SQLITE_IOERR_A
20930 43 43 45 53 53 3b 0a 20 20 20 20 20 20 20 20 67  CCESS;.        g
20940 6f 74 6f 20 6f 70 65 6e 5f 66 69 6e 69 73 68 65  oto open_finishe
20950 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  d;.      }.     
20960 20 75 73 65 50 72 6f 78 79 20 3d 20 21 28 66 73   useProxy = !(fs
20970 49 6e 66 6f 2e 66 5f 66 6c 61 67 73 26 4d 4e 54  Info.f_flags&MNT
20980 5f 4c 4f 43 41 4c 29 3b 0a 20 20 20 20 7d 0a 20  _LOCAL);.    }. 
20990 20 20 20 69 66 28 20 75 73 65 50 72 6f 78 79 20     if( useProxy 
209a0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 69  ){.      rc = fi
209b0 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 28 70 56 66  llInUnixFile(pVf
209c0 73 2c 20 66 64 2c 20 64 69 72 66 64 2c 20 70 46  s, fd, dirfd, pF
209d0 69 6c 65 2c 20 7a 50 61 74 68 2c 20 6e 6f 4c 6f  ile, zPath, noLo
209e0 63 6b 2c 20 69 73 44 65 6c 65 74 65 29 3b 0a 20  ck, isDelete);. 
209f0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
20a00 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
20a10 20 20 72 63 20 3d 20 70 72 6f 78 79 54 72 61 6e    rc = proxyTran
20a20 73 66 6f 72 6d 55 6e 69 78 46 69 6c 65 28 28 75  sformUnixFile((u
20a30 6e 69 78 46 69 6c 65 2a 29 70 46 69 6c 65 2c 20  nixFile*)pFile, 
20a40 22 3a 61 75 74 6f 3a 22 29 3b 0a 20 20 20 20 20  ":auto:");.     
20a50 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f 70   }.      goto op
20a60 65 6e 5f 66 69 6e 69 73 68 65 64 3b 0a 20 20 20  en_finished;.   
20a70 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20   }.  }.#endif.  
20a80 0a 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e 55 6e  .  rc = fillInUn
20a90 69 78 46 69 6c 65 28 70 56 66 73 2c 20 66 64 2c  ixFile(pVfs, fd,
20aa0 20 64 69 72 66 64 2c 20 70 46 69 6c 65 2c 20 7a   dirfd, pFile, z
20ab0 50 61 74 68 2c 20 6e 6f 4c 6f 63 6b 2c 20 69 73  Path, noLock, is
20ac0 44 65 6c 65 74 65 29 3b 0a 6f 70 65 6e 5f 66 69  Delete);.open_fi
20ad0 6e 69 73 68 65 64 3a 0a 20 20 69 66 28 20 72 63  nished:.  if( rc
20ae0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
20af0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
20b00 70 2d 3e 70 55 6e 75 73 65 64 29 3b 0a 20 20 7d  p->pUnused);.  }
20b10 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
20b20 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74  ../*.** Delete t
20b30 68 65 20 66 69 6c 65 20 61 74 20 7a 50 61 74 68  he file at zPath
20b40 2e 20 49 66 20 74 68 65 20 64 69 72 53 79 6e 63  . If the dirSync
20b50 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 72 75   argument is tru
20b60 65 2c 20 66 73 79 6e 63 28 29 0a 2a 2a 20 74 68  e, fsync().** th
20b70 65 20 64 69 72 65 63 74 6f 72 79 20 61 66 74 65  e directory afte
20b80 72 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20 66  r deleting the f
20b90 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
20ba0 6e 74 20 75 6e 69 78 44 65 6c 65 74 65 28 0a 20  nt unixDelete(. 
20bb0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f   sqlite3_vfs *No
20bc0 74 55 73 65 64 2c 20 20 20 20 20 2f 2a 20 56 46  tUsed,     /* VF
20bd0 53 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 69  S containing thi
20be0 73 20 61 73 20 74 68 65 20 78 44 65 6c 65 74 65  s as the xDelete
20bf0 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 63 6f 6e   method */.  con
20c00 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20  st char *zPath, 
20c10 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
20c20 66 20 66 69 6c 65 20 74 6f 20 62 65 20 64 65 6c  f file to be del
20c30 65 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 64 69  eted */.  int di
20c40 72 53 79 6e 63 20 20 20 20 20 20 20 20 20 20 20  rSync           
20c50 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20      /* If true, 
20c60 66 73 79 6e 63 28 29 20 64 69 72 65 63 74 6f 72  fsync() director
20c70 79 20 61 66 74 65 72 20 64 65 6c 65 74 69 6e 67  y after deleting
20c80 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   file */.){.  in
20c90 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
20ca0 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
20cb0 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
20cc0 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
20cd0 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49  (return SQLITE_I
20ce0 4f 45 52 52 5f 44 45 4c 45 54 45 29 3b 0a 20 20  OERR_DELETE);.  
20cf0 75 6e 6c 69 6e 6b 28 7a 50 61 74 68 29 3b 0a 23  unlink(zPath);.#
20d00 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 49  ifndef SQLITE_DI
20d10 53 41 42 4c 45 5f 44 49 52 53 59 4e 43 0a 20 20  SABLE_DIRSYNC.  
20d20 69 66 28 20 64 69 72 53 79 6e 63 20 29 7b 0a 20  if( dirSync ){. 
20d30 20 20 20 69 6e 74 20 66 64 3b 0a 20 20 20 20 72     int fd;.    r
20d40 63 20 3d 20 6f 70 65 6e 44 69 72 65 63 74 6f 72  c = openDirector
20d50 79 28 7a 50 61 74 68 2c 20 26 66 64 29 3b 0a 20  y(zPath, &fd);. 
20d60 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
20d70 45 5f 4f 4b 20 29 7b 0a 23 69 66 20 4f 53 5f 56  E_OK ){.#if OS_V
20d80 58 57 4f 52 4b 53 0a 20 20 20 20 20 20 69 66 28  XWORKS.      if(
20d90 20 66 73 79 6e 63 28 66 64 29 3d 3d 2d 31 20 29   fsync(fd)==-1 )
20da0 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 69 66 28  .#else.      if(
20db0 20 66 73 79 6e 63 28 66 64 29 20 29 0a 23 65 6e   fsync(fd) ).#en
20dc0 64 69 66 0a 20 20 20 20 20 20 7b 0a 20 20 20 20  dif.      {.    
20dd0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
20de0 49 4f 45 52 52 5f 44 49 52 5f 46 53 59 4e 43 3b  IOERR_DIR_FSYNC;
20df0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
20e00 66 28 20 63 6c 6f 73 65 28 66 64 29 26 26 21 72  f( close(fd)&&!r
20e10 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  c ){.        rc 
20e20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44  = SQLITE_IOERR_D
20e30 49 52 5f 43 4c 4f 53 45 3b 0a 20 20 20 20 20 20  IR_CLOSE;.      
20e40 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  }.    }.  }.#end
20e50 69 66 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  if.  return rc;.
20e60 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65 73 74 20 74 68  }../*.** Test th
20e70 65 20 65 78 69 73 74 61 6e 63 65 20 6f 66 20 6f  e existance of o
20e80 72 20 61 63 63 65 73 73 20 70 65 72 6d 69 73 73  r access permiss
20e90 69 6f 6e 73 20 6f 66 20 66 69 6c 65 20 7a 50 61  ions of file zPa
20ea0 74 68 2e 20 54 68 65 0a 2a 2a 20 74 65 73 74 20  th. The.** test 
20eb0 70 65 72 66 6f 72 6d 65 64 20 64 65 70 65 6e 64  performed depend
20ec0 73 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 20 6f  s on the value o
20ed0 66 20 66 6c 61 67 73 3a 0a 2a 2a 0a 2a 2a 20 20  f flags:.**.**  
20ee0 20 20 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53     SQLITE_ACCESS
20ef0 5f 45 58 49 53 54 53 3a 20 52 65 74 75 72 6e 20  _EXISTS: Return 
20f00 31 20 69 66 20 74 68 65 20 66 69 6c 65 20 65 78  1 if the file ex
20f10 69 73 74 73 0a 2a 2a 20 20 20 20 20 53 51 4c 49  ists.**     SQLI
20f20 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44 57 52  TE_ACCESS_READWR
20f30 49 54 45 3a 20 52 65 74 75 72 6e 20 31 20 69 66  ITE: Return 1 if
20f40 20 74 68 65 20 66 69 6c 65 20 69 73 20 72 65 61   the file is rea
20f50 64 20 61 6e 64 20 77 72 69 74 61 62 6c 65 2e 0a  d and writable..
20f60 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 41 43  **     SQLITE_AC
20f70 43 45 53 53 5f 52 45 41 44 4f 4e 4c 59 3a 20 52  CESS_READONLY: R
20f80 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 66  eturn 1 if the f
20f90 69 6c 65 20 69 73 20 72 65 61 64 61 62 6c 65 2e  ile is readable.
20fa0 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  .**.** Otherwise
20fb0 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74   return 0..*/.st
20fc0 61 74 69 63 20 69 6e 74 20 75 6e 69 78 41 63 63  atic int unixAcc
20fd0 65 73 73 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  ess(.  sqlite3_v
20fe0 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 20 20 2f  fs *NotUsed,   /
20ff0 2a 20 54 68 65 20 56 46 53 20 63 6f 6e 74 61 69  * The VFS contai
21000 6e 69 6e 67 20 74 68 69 73 20 78 41 63 63 65 73  ning this xAcces
21010 73 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 63 6f  s method */.  co
21020 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c  nst char *zPath,
21030 20 20 20 20 20 20 2f 2a 20 50 61 74 68 20 6f 66        /* Path of
21040 20 74 68 65 20 66 69 6c 65 20 74 6f 20 65 78 61   the file to exa
21050 6d 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  mine */.  int fl
21060 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ags,            
21070 20 20 2f 2a 20 57 68 61 74 20 64 6f 20 77 65 20    /* What do we 
21080 77 61 6e 74 20 74 6f 20 6c 65 61 72 6e 20 61 62  want to learn ab
21090 6f 75 74 20 74 68 65 20 7a 50 61 74 68 20 66 69  out the zPath fi
210a0 6c 65 3f 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52  le? */.  int *pR
210b0 65 73 4f 75 74 20 20 20 20 20 20 20 20 20 20 20  esOut           
210c0 20 2f 2a 20 57 72 69 74 65 20 72 65 73 75 6c 74   /* Write result
210d0 20 62 6f 6f 6c 65 61 6e 20 68 65 72 65 20 2a 2f   boolean here */
210e0 0a 29 7b 0a 20 20 69 6e 74 20 61 6d 6f 64 65 20  .){.  int amode 
210f0 3d 20 30 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  = 0;.  UNUSED_PA
21100 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
21110 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ;.  SimulateIOEr
21120 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
21130 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 3b  TE_IOERR_ACCESS;
21140 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20 66 6c   );.  switch( fl
21150 61 67 73 20 29 7b 0a 20 20 20 20 63 61 73 65 20  ags ){.    case 
21160 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
21170 49 53 54 53 3a 0a 20 20 20 20 20 20 61 6d 6f 64  ISTS:.      amod
21180 65 20 3d 20 46 5f 4f 4b 3b 0a 20 20 20 20 20 20  e = F_OK;.      
21190 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
211a0 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45  SQLITE_ACCESS_RE
211b0 41 44 57 52 49 54 45 3a 0a 20 20 20 20 20 20 61  ADWRITE:.      a
211c0 6d 6f 64 65 20 3d 20 57 5f 4f 4b 7c 52 5f 4f 4b  mode = W_OK|R_OK
211d0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
211e0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41     case SQLITE_A
211f0 43 43 45 53 53 5f 52 45 41 44 3a 0a 20 20 20 20  CCESS_READ:.    
21200 20 20 61 6d 6f 64 65 20 3d 20 52 5f 4f 4b 3b 0a    amode = R_OK;.
21210 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20        break;..  
21220 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
21230 20 61 73 73 65 72 74 28 21 22 49 6e 76 61 6c 69   assert(!"Invali
21240 64 20 66 6c 61 67 73 20 61 72 67 75 6d 65 6e 74  d flags argument
21250 22 29 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73 4f  ");.  }.  *pResO
21260 75 74 20 3d 20 28 61 63 63 65 73 73 28 7a 50 61  ut = (access(zPa
21270 74 68 2c 20 61 6d 6f 64 65 29 3d 3d 30 29 3b 0a  th, amode)==0);.
21280 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
21290 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 75  OK;.}.../*.** Tu
212a0 72 6e 20 61 20 72 65 6c 61 74 69 76 65 20 70 61  rn a relative pa
212b0 74 68 6e 61 6d 65 20 69 6e 74 6f 20 61 20 66 75  thname into a fu
212c0 6c 6c 20 70 61 74 68 6e 61 6d 65 2e 20 54 68 65  ll pathname. The
212d0 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 0a 2a   relative path.*
212e0 2a 20 69 73 20 73 74 6f 72 65 64 20 61 73 20 61  * is stored as a
212f0 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20   nul-terminated 
21300 73 74 72 69 6e 67 20 69 6e 20 74 68 65 20 62 75  string in the bu
21310 66 66 65 72 20 70 6f 69 6e 74 65 64 20 74 6f 20  ffer pointed to 
21320 62 79 0a 2a 2a 20 7a 50 61 74 68 2e 20 0a 2a 2a  by.** zPath. .**
21330 0a 2a 2a 20 7a 4f 75 74 20 70 6f 69 6e 74 73 20  .** zOut points 
21340 74 6f 20 61 20 62 75 66 66 65 72 20 6f 66 20 61  to a buffer of a
21350 74 20 6c 65 61 73 74 20 73 71 6c 69 74 65 33 5f  t least sqlite3_
21360 76 66 73 2e 6d 78 50 61 74 68 6e 61 6d 65 20 62  vfs.mxPathname b
21370 79 74 65 73 20 0a 2a 2a 20 28 69 6e 20 74 68 69  ytes .** (in thi
21380 73 20 63 61 73 65 2c 20 4d 41 58 5f 50 41 54 48  s case, MAX_PATH
21390 4e 41 4d 45 20 62 79 74 65 73 29 2e 20 54 68 65  NAME bytes). The
213a0 20 66 75 6c 6c 2d 70 61 74 68 20 69 73 20 77 72   full-path is wr
213b0 69 74 74 65 6e 20 74 6f 0a 2a 2a 20 74 68 69 73  itten to.** this
213c0 20 62 75 66 66 65 72 20 62 65 66 6f 72 65 20 72   buffer before r
213d0 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61  eturning..*/.sta
213e0 74 69 63 20 69 6e 74 20 75 6e 69 78 46 75 6c 6c  tic int unixFull
213f0 50 61 74 68 6e 61 6d 65 28 0a 20 20 73 71 6c 69  Pathname(.  sqli
21400 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20  te3_vfs *pVfs,  
21410 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
21420 6e 74 65 72 20 74 6f 20 76 66 73 20 6f 62 6a 65  nter to vfs obje
21430 63 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ct */.  const ch
21440 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20  ar *zPath,      
21450 20 20 20 20 20 20 2f 2a 20 50 6f 73 73 69 62 6c        /* Possibl
21460 79 20 72 65 6c 61 74 69 76 65 20 69 6e 70 75 74  y relative input
21470 20 70 61 74 68 20 2a 2f 0a 20 20 69 6e 74 20 6e   path */.  int n
21480 4f 75 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  Out,            
21490 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
214a0 20 6f 66 20 6f 75 74 70 75 74 20 62 75 66 66 65   of output buffe
214b0 72 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  r in bytes */.  
214c0 63 68 61 72 20 2a 7a 4f 75 74 20 20 20 20 20 20  char *zOut      
214d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
214e0 20 4f 75 74 70 75 74 20 62 75 66 66 65 72 20 2a   Output buffer *
214f0 2f 0a 29 7b 0a 0a 20 20 2f 2a 20 49 74 27 73 20  /.){..  /* It's 
21500 6f 64 64 20 74 6f 20 73 69 6d 75 6c 61 74 65 20  odd to simulate 
21510 61 6e 20 69 6f 2d 65 72 72 6f 72 20 68 65 72 65  an io-error here
21520 2c 20 62 75 74 20 72 65 61 6c 6c 79 20 74 68 69  , but really thi
21530 73 20 69 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75  s is just.  ** u
21540 73 69 6e 67 20 74 68 65 20 69 6f 2d 65 72 72 6f  sing the io-erro
21550 72 20 69 6e 66 72 61 73 74 72 75 63 74 75 72 65  r infrastructure
21560 20 74 6f 20 74 65 73 74 20 74 68 61 74 20 53 51   to test that SQ
21570 4c 69 74 65 20 68 61 6e 64 6c 65 73 20 74 68 69  Lite handles thi
21580 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  s.  ** function 
21590 66 61 69 6c 69 6e 67 2e 20 54 68 69 73 20 66 75  failing. This fu
215a0 6e 63 74 69 6f 6e 20 63 6f 75 6c 64 20 66 61 69  nction could fai
215b0 6c 20 69 66 2c 20 66 6f 72 20 65 78 61 6d 70 6c  l if, for exampl
215c0 65 2c 20 74 68 65 0a 20 20 2a 2a 20 63 75 72 72  e, the.  ** curr
215d0 65 6e 74 20 77 6f 72 6b 69 6e 67 20 64 69 72 65  ent working dire
215e0 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20 75  ctory has been u
215f0 6e 6c 69 6e 6b 65 64 2e 0a 20 20 2a 2f 0a 20 20  nlinked..  */.  
21600 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
21610 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
21620 52 52 4f 52 20 29 3b 0a 0a 20 20 61 73 73 65 72  RROR );..  asser
21630 74 28 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  t( pVfs->mxPathn
21640 61 6d 65 3d 3d 4d 41 58 5f 50 41 54 48 4e 41 4d  ame==MAX_PATHNAM
21650 45 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  E );.  UNUSED_PA
21660 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 0a  RAMETER(pVfs);..
21670 20 20 7a 4f 75 74 5b 6e 4f 75 74 2d 31 5d 20 3d    zOut[nOut-1] =
21680 20 27 5c 30 27 3b 0a 20 20 69 66 28 20 7a 50 61   '\0';.  if( zPa
21690 74 68 5b 30 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20  th[0]=='/' ){.  
216a0 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
216b0 74 66 28 6e 4f 75 74 2c 20 7a 4f 75 74 2c 20 22  tf(nOut, zOut, "
216c0 25 73 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20 7d  %s", zPath);.  }
216d0 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 43  else{.    int nC
216e0 77 64 3b 0a 20 20 20 20 69 66 28 20 67 65 74 63  wd;.    if( getc
216f0 77 64 28 7a 4f 75 74 2c 20 6e 4f 75 74 2d 31 29  wd(zOut, nOut-1)
21700 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ==0 ){.      ret
21710 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  urn SQLITE_CANTO
21720 50 45 4e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  PEN;.    }.    n
21730 43 77 64 20 3d 20 28 69 6e 74 29 73 74 72 6c 65  Cwd = (int)strle
21740 6e 28 7a 4f 75 74 29 3b 0a 20 20 20 20 73 71 6c  n(zOut);.    sql
21750 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4f  ite3_snprintf(nO
21760 75 74 2d 6e 43 77 64 2c 20 26 7a 4f 75 74 5b 6e  ut-nCwd, &zOut[n
21770 43 77 64 5d 2c 20 22 2f 25 73 22 2c 20 7a 50 61  Cwd], "/%s", zPa
21780 74 68 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  th);.  }.  retur
21790 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
217a0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
217b0 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53  OMIT_LOAD_EXTENS
217c0 49 4f 4e 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66  ION./*.** Interf
217d0 61 63 65 73 20 66 6f 72 20 6f 70 65 6e 69 6e 67  aces for opening
217e0 20 61 20 73 68 61 72 65 64 20 6c 69 62 72 61 72   a shared librar
217f0 79 2c 20 66 69 6e 64 69 6e 67 20 65 6e 74 72 79  y, finding entry
21800 20 70 6f 69 6e 74 73 0a 2a 2a 20 77 69 74 68 69   points.** withi
21810 6e 20 74 68 65 20 73 68 61 72 65 64 20 6c 69 62  n the shared lib
21820 72 61 72 79 2c 20 61 6e 64 20 63 6c 6f 73 69 6e  rary, and closin
21830 67 20 74 68 65 20 73 68 61 72 65 64 20 6c 69 62  g the shared lib
21840 72 61 72 79 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64  rary..*/.#includ
21850 65 20 3c 64 6c 66 63 6e 2e 68 3e 0a 73 74 61 74  e <dlfcn.h>.stat
21860 69 63 20 76 6f 69 64 20 2a 75 6e 69 78 44 6c 4f  ic void *unixDlO
21870 70 65 6e 28 73 71 6c 69 74 65 33 5f 76 66 73 20  pen(sqlite3_vfs 
21880 2a 4e 6f 74 55 73 65 64 2c 20 63 6f 6e 73 74 20  *NotUsed, const 
21890 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29  char *zFilename)
218a0 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
218b0 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
218c0 20 72 65 74 75 72 6e 20 64 6c 6f 70 65 6e 28 7a   return dlopen(z
218d0 46 69 6c 65 6e 61 6d 65 2c 20 52 54 4c 44 5f 4e  Filename, RTLD_N
218e0 4f 57 20 7c 20 52 54 4c 44 5f 47 4c 4f 42 41 4c  OW | RTLD_GLOBAL
218f0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 51 4c 69  );.}../*.** SQLi
21900 74 65 20 63 61 6c 6c 73 20 74 68 69 73 20 66 75  te calls this fu
21910 6e 63 74 69 6f 6e 20 69 6d 6d 65 64 69 61 74 65  nction immediate
21920 6c 79 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20  ly after a call 
21930 74 6f 20 75 6e 69 78 44 6c 53 79 6d 28 29 20 6f  to unixDlSym() o
21940 72 0a 2a 2a 20 75 6e 69 78 44 6c 4f 70 65 6e 28  r.** unixDlOpen(
21950 29 20 66 61 69 6c 73 20 28 72 65 74 75 72 6e 73  ) fails (returns
21960 20 61 20 6e 75 6c 6c 20 70 6f 69 6e 74 65 72 29   a null pointer)
21970 2e 20 49 66 20 61 20 6d 6f 72 65 20 64 65 74 61  . If a more deta
21980 69 6c 65 64 20 65 72 72 6f 72 0a 2a 2a 20 6d 65  iled error.** me
21990 73 73 61 67 65 20 69 73 20 61 76 61 69 6c 61 62  ssage is availab
219a0 6c 65 2c 20 69 74 20 69 73 20 77 72 69 74 74 65  le, it is writte
219b0 6e 20 74 6f 20 7a 42 75 66 4f 75 74 2e 20 49 66  n to zBufOut. If
219c0 20 6e 6f 20 65 72 72 6f 72 20 6d 65 73 73 61 67   no error messag
219d0 65 0a 2a 2a 20 69 73 20 61 76 61 69 6c 61 62 6c  e.** is availabl
219e0 65 2c 20 7a 42 75 66 4f 75 74 20 69 73 20 6c 65  e, zBufOut is le
219f0 66 74 20 75 6e 6d 6f 64 69 66 69 65 64 20 61 6e  ft unmodified an
21a00 64 20 53 51 4c 69 74 65 20 75 73 65 73 20 61 20  d SQLite uses a 
21a10 64 65 66 61 75 6c 74 0a 2a 2a 20 65 72 72 6f 72  default.** error
21a20 20 6d 65 73 73 61 67 65 2e 0a 2a 2f 0a 73 74 61   message..*/.sta
21a30 74 69 63 20 76 6f 69 64 20 75 6e 69 78 44 6c 45  tic void unixDlE
21a40 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73  rror(sqlite3_vfs
21a50 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 6e   *NotUsed, int n
21a60 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 4f  Buf, char *zBufO
21a70 75 74 29 7b 0a 20 20 63 68 61 72 20 2a 7a 45 72  ut){.  char *zEr
21a80 72 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  r;.  UNUSED_PARA
21a90 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
21aa0 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
21ab0 28 29 3b 0a 20 20 7a 45 72 72 20 3d 20 64 6c 65  ();.  zErr = dle
21ac0 72 72 6f 72 28 29 3b 0a 20 20 69 66 28 20 7a 45  rror();.  if( zE
21ad0 72 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  rr ){.    sqlite
21ae0 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2c  3_snprintf(nBuf,
21af0 20 7a 42 75 66 4f 75 74 2c 20 22 25 73 22 2c 20   zBufOut, "%s", 
21b00 7a 45 72 72 29 3b 0a 20 20 7d 0a 20 20 75 6e 69  zErr);.  }.  uni
21b10 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 7d  xLeaveMutex();.}
21b20 0a 73 74 61 74 69 63 20 76 6f 69 64 20 28 2a 75  .static void (*u
21b30 6e 69 78 44 6c 53 79 6d 28 73 71 6c 69 74 65 33  nixDlSym(sqlite3
21b40 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 76  _vfs *NotUsed, v
21b50 6f 69 64 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68  oid *p, const ch
21b60 61 72 2a 7a 53 79 6d 29 29 28 76 6f 69 64 29 7b  ar*zSym))(void){
21b70 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 47 43 43 20  .  /* .  ** GCC 
21b80 77 69 74 68 20 2d 70 65 64 61 6e 74 69 63 2d 65  with -pedantic-e
21b90 72 72 6f 72 73 20 73 61 79 73 20 74 68 61 74 20  rrors says that 
21ba0 43 39 30 20 64 6f 65 73 20 6e 6f 74 20 61 6c 6c  C90 does not all
21bb0 6f 77 20 61 20 76 6f 69 64 2a 20 74 6f 20 62 65  ow a void* to be
21bc0 0a 20 20 2a 2a 20 63 61 73 74 20 69 6e 74 6f 20  .  ** cast into 
21bd0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66  a pointer to a f
21be0 75 6e 63 74 69 6f 6e 2e 20 20 41 6e 64 20 79 65  unction.  And ye
21bf0 74 20 74 68 65 20 6c 69 62 72 61 72 79 20 64 6c  t the library dl
21c00 73 79 6d 28 29 20 72 6f 75 74 69 6e 65 0a 20 20  sym() routine.  
21c10 2a 2a 20 72 65 74 75 72 6e 73 20 61 20 76 6f 69  ** returns a voi
21c20 64 2a 20 77 68 69 63 68 20 69 73 20 72 65 61 6c  d* which is real
21c30 6c 79 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ly a pointer to 
21c40 61 20 66 75 6e 63 74 69 6f 6e 2e 20 20 53 6f 20  a function.  So 
21c50 68 6f 77 20 64 6f 20 77 65 0a 20 20 2a 2a 20 75  how do we.  ** u
21c60 73 65 20 64 6c 73 79 6d 28 29 20 77 69 74 68 20  se dlsym() with 
21c70 2d 70 65 64 61 6e 74 69 63 2d 65 72 72 6f 72 73  -pedantic-errors
21c80 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 56 61 72 69  ?.  **.  ** Vari
21c90 61 62 6c 65 20 78 20 62 65 6c 6f 77 20 69 73 20  able x below is 
21ca0 64 65 66 69 6e 65 64 20 74 6f 20 62 65 20 61 20  defined to be a 
21cb0 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e  pointer to a fun
21cc0 63 74 69 6f 6e 20 74 61 6b 69 6e 67 0a 20 20 2a  ction taking.  *
21cd0 2a 20 70 61 72 61 6d 65 74 65 72 73 20 76 6f 69  * parameters voi
21ce0 64 2a 20 61 6e 64 20 63 6f 6e 73 74 20 63 68 61  d* and const cha
21cf0 72 2a 20 61 6e 64 20 72 65 74 75 72 6e 69 6e 67  r* and returning
21d00 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
21d10 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 57  function..  ** W
21d20 65 20 69 6e 69 74 69 61 6c 69 7a 65 20 78 20 62  e initialize x b
21d30 79 20 61 73 73 69 67 6e 69 6e 67 20 69 74 20 61  y assigning it a
21d40 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
21d50 64 6c 73 79 6d 28 29 20 66 75 6e 63 74 69 6f 6e  dlsym() function
21d60 2e 0a 20 20 2a 2a 20 28 54 68 61 74 20 61 73 73  ..  ** (That ass
21d70 69 67 6e 6d 65 6e 74 20 72 65 71 75 69 72 65 73  ignment requires
21d80 20 61 20 63 61 73 74 2e 29 20 20 54 68 65 6e 20   a cast.)  Then 
21d90 77 65 20 63 61 6c 6c 20 74 68 65 20 66 75 6e 63  we call the func
21da0 74 69 6f 6e 20 74 68 61 74 0a 20 20 2a 2a 20 78  tion that.  ** x
21db0 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20 0a 20 20   points to.  .  
21dc0 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 77 6f 72  **.  ** This wor
21dd0 6b 2d 61 72 6f 75 6e 64 20 69 73 20 75 6e 6c 69  k-around is unli
21de0 6b 65 6c 79 20 74 6f 20 77 6f 72 6b 20 63 6f 72  kely to work cor
21df0 72 65 63 74 6c 79 20 6f 6e 20 61 6e 79 20 73 79  rectly on any sy
21e00 73 74 65 6d 20 77 68 65 72 65 0a 20 20 2a 2a 20  stem where.  ** 
21e10 79 6f 75 20 72 65 61 6c 6c 79 20 63 61 6e 6e 6f  you really canno
21e20 74 20 63 61 73 74 20 61 20 66 75 6e 63 74 69 6f  t cast a functio
21e30 6e 20 70 6f 69 6e 74 65 72 20 69 6e 74 6f 20 76  n pointer into v
21e40 6f 69 64 2a 2e 20 20 42 75 74 20 74 68 65 6e 2c  oid*.  But then,
21e50 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 6f 74 68   on the.  ** oth
21e60 65 72 20 68 61 6e 64 2c 20 64 6c 73 79 6d 28 29  er hand, dlsym()
21e70 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20 6f   will not work o
21e80 6e 20 73 75 63 68 20 61 20 73 79 73 74 65 6d 20  n such a system 
21e90 65 69 74 68 65 72 2c 20 73 6f 20 77 65 20 68 61  either, so we ha
21ea0 76 65 0a 20 20 2a 2a 20 6e 6f 74 20 72 65 61 6c  ve.  ** not real
21eb0 6c 79 20 6c 6f 73 74 20 61 6e 79 74 68 69 6e 67  ly lost anything
21ec0 2e 0a 20 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a  ..  */.  void (*
21ed0 28 2a 78 29 28 76 6f 69 64 2a 2c 63 6f 6e 73 74  (*x)(void*,const
21ee0 20 63 68 61 72 2a 29 29 28 76 6f 69 64 29 3b 0a   char*))(void);.
21ef0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
21f00 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 78  ER(NotUsed);.  x
21f10 20 3d 20 28 76 6f 69 64 28 2a 28 2a 29 28 76 6f   = (void(*(*)(vo
21f20 69 64 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29  id*,const char*)
21f30 29 28 76 6f 69 64 29 29 64 6c 73 79 6d 3b 0a 20  )(void))dlsym;. 
21f40 20 72 65 74 75 72 6e 20 28 2a 78 29 28 70 2c 20   return (*x)(p, 
21f50 7a 53 79 6d 29 3b 0a 7d 0a 73 74 61 74 69 63 20  zSym);.}.static 
21f60 76 6f 69 64 20 75 6e 69 78 44 6c 43 6c 6f 73 65  void unixDlClose
21f70 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f  (sqlite3_vfs *No
21f80 74 55 73 65 64 2c 20 76 6f 69 64 20 2a 70 48 61  tUsed, void *pHa
21f90 6e 64 6c 65 29 7b 0a 20 20 55 4e 55 53 45 44 5f  ndle){.  UNUSED_
21fa0 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
21fb0 64 29 3b 0a 20 20 64 6c 63 6c 6f 73 65 28 70 48  d);.  dlclose(pH
21fc0 61 6e 64 6c 65 29 3b 0a 7d 0a 23 65 6c 73 65 20  andle);.}.#else 
21fd0 2f 2a 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49  /* if SQLITE_OMI
21fe0 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e  T_LOAD_EXTENSION
21ff0 20 69 73 20 64 65 66 69 6e 65 64 3a 20 2a 2f 0a   is defined: */.
22000 20 20 23 64 65 66 69 6e 65 20 75 6e 69 78 44 6c    #define unixDl
22010 4f 70 65 6e 20 20 30 0a 20 20 23 64 65 66 69 6e  Open  0.  #defin
22020 65 20 75 6e 69 78 44 6c 45 72 72 6f 72 20 30 0a  e unixDlError 0.
22030 20 20 23 64 65 66 69 6e 65 20 75 6e 69 78 44 6c    #define unixDl
22040 53 79 6d 20 20 20 30 0a 20 20 23 64 65 66 69 6e  Sym   0.  #defin
22050 65 20 75 6e 69 78 44 6c 43 6c 6f 73 65 20 30 0a  e unixDlClose 0.
22060 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72  #endif../*.** Wr
22070 69 74 65 20 6e 42 75 66 20 62 79 74 65 73 20 6f  ite nBuf bytes o
22080 66 20 72 61 6e 64 6f 6d 20 64 61 74 61 20 74 6f  f random data to
22090 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 62 75   the supplied bu
220a0 66 66 65 72 20 7a 42 75 66 2e 0a 2a 2f 0a 73 74  ffer zBuf..*/.st
220b0 61 74 69 63 20 69 6e 74 20 75 6e 69 78 52 61 6e  atic int unixRan
220c0 64 6f 6d 6e 65 73 73 28 73 71 6c 69 74 65 33 5f  domness(sqlite3_
220d0 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e  vfs *NotUsed, in
220e0 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42  t nBuf, char *zB
220f0 75 66 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  uf){.  UNUSED_PA
22100 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
22110 3b 0a 20 20 61 73 73 65 72 74 28 28 73 69 7a 65  ;.  assert((size
22120 5f 74 29 6e 42 75 66 3e 3d 28 73 69 7a 65 6f 66  _t)nBuf>=(sizeof
22130 28 74 69 6d 65 5f 74 29 2b 73 69 7a 65 6f 66 28  (time_t)+sizeof(
22140 69 6e 74 29 29 29 3b 0a 0a 20 20 2f 2a 20 57 65  int)));..  /* We
22150 20 68 61 76 65 20 74 6f 20 69 6e 69 74 69 61 6c   have to initial
22160 69 7a 65 20 7a 42 75 66 20 74 6f 20 70 72 65 76  ize zBuf to prev
22170 65 6e 74 20 76 61 6c 67 72 69 6e 64 20 66 72 6f  ent valgrind fro
22180 6d 20 72 65 70 6f 72 74 69 6e 67 0a 20 20 2a 2a  m reporting.  **
22190 20 65 72 72 6f 72 73 2e 20 20 54 68 65 20 72 65   errors.  The re
221a0 70 6f 72 74 73 20 69 73 73 75 65 64 20 62 79 20  ports issued by 
221b0 76 61 6c 67 72 69 6e 64 20 61 72 65 20 69 6e 63  valgrind are inc
221c0 6f 72 72 65 63 74 20 2d 20 77 65 20 77 6f 75 6c  orrect - we woul
221d0 64 0a 20 20 2a 2a 20 70 72 65 66 65 72 20 74 68  d.  ** prefer th
221e0 61 74 20 74 68 65 20 72 61 6e 64 6f 6d 6e 65 73  at the randomnes
221f0 73 20 62 65 20 69 6e 63 72 65 61 73 65 64 20 62  s be increased b
22200 79 20 6d 61 6b 69 6e 67 20 75 73 65 20 6f 66 20  y making use of 
22210 74 68 65 0a 20 20 2a 2a 20 75 6e 69 6e 69 74 69  the.  ** uniniti
22220 61 6c 69 7a 65 64 20 73 70 61 63 65 20 69 6e 20  alized space in 
22230 7a 42 75 66 20 2d 20 62 75 74 20 76 61 6c 67 72  zBuf - but valgr
22240 69 6e 64 20 65 72 72 6f 72 73 20 74 65 6e 64 20  ind errors tend 
22250 74 6f 20 77 6f 72 72 79 0a 20 20 2a 2a 20 73 6f  to worry.  ** so
22260 6d 65 20 75 73 65 72 73 2e 20 20 52 61 74 68 65  me users.  Rathe
22270 72 20 74 68 61 6e 20 61 72 67 75 65 2c 20 69 74  r than argue, it
22280 20 73 65 65 6d 73 20 65 61 73 69 65 72 20 6a 75   seems easier ju
22290 73 74 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65  st to initialize
222a0 0a 20 20 2a 2a 20 74 68 65 20 77 68 6f 6c 65 20  .  ** the whole 
222b0 61 72 72 61 79 20 61 6e 64 20 73 69 6c 65 6e 63  array and silenc
222c0 65 20 76 61 6c 67 72 69 6e 64 2c 20 65 76 65 6e  e valgrind, even
222d0 20 69 66 20 74 68 61 74 20 6d 65 61 6e 73 20 6c   if that means l
222e0 65 73 73 20 72 61 6e 64 6f 6d 6e 65 73 73 0a 20  ess randomness. 
222f0 20 2a 2a 20 69 6e 20 74 68 65 20 72 61 6e 64 6f   ** in the rando
22300 6d 20 73 65 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a  m seed..  **.  *
22310 2a 20 57 68 65 6e 20 74 65 73 74 69 6e 67 2c 20  * When testing, 
22320 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 7a 42 75  initializing zBu
22330 66 5b 5d 20 74 6f 20 7a 65 72 6f 20 69 73 20 61  f[] to zero is a
22340 6c 6c 20 77 65 20 64 6f 2e 20 20 54 68 61 74 20  ll we do.  That 
22350 6d 65 61 6e 73 0a 20 20 2a 2a 20 74 68 61 74 20  means.  ** that 
22360 77 65 20 61 6c 77 61 79 73 20 75 73 65 20 74 68  we always use th
22370 65 20 73 61 6d 65 20 72 61 6e 64 6f 6d 20 6e 75  e same random nu
22380 6d 62 65 72 20 73 65 71 75 65 6e 63 65 2e 20 20  mber sequence.  
22390 54 68 69 73 20 6d 61 6b 65 73 20 74 68 65 0a 20  This makes the. 
223a0 20 2a 2a 20 74 65 73 74 73 20 72 65 70 65 61 74   ** tests repeat
223b0 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d  able..  */.  mem
223c0 73 65 74 28 7a 42 75 66 2c 20 30 2c 20 6e 42 75  set(zBuf, 0, nBu
223d0 66 29 3b 0a 23 69 66 20 21 64 65 66 69 6e 65 64  f);.#if !defined
223e0 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 20 20  (SQLITE_TEST).  
223f0 7b 0a 20 20 20 20 69 6e 74 20 70 69 64 2c 20 66  {.    int pid, f
22400 64 3b 0a 20 20 20 20 66 64 20 3d 20 6f 70 65 6e  d;.    fd = open
22410 28 22 2f 64 65 76 2f 75 72 61 6e 64 6f 6d 22 2c  ("/dev/urandom",
22420 20 4f 5f 52 44 4f 4e 4c 59 29 3b 0a 20 20 20 20   O_RDONLY);.    
22430 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20  if( fd<0 ){.    
22440 20 20 74 69 6d 65 5f 74 20 74 3b 0a 20 20 20 20    time_t t;.    
22450 20 20 74 69 6d 65 28 26 74 29 3b 0a 20 20 20 20    time(&t);.    
22460 20 20 6d 65 6d 63 70 79 28 7a 42 75 66 2c 20 26    memcpy(zBuf, &
22470 74 2c 20 73 69 7a 65 6f 66 28 74 29 29 3b 0a 20  t, sizeof(t));. 
22480 20 20 20 20 20 70 69 64 20 3d 20 67 65 74 70 69       pid = getpi
22490 64 28 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  d();.      memcp
224a0 79 28 26 7a 42 75 66 5b 73 69 7a 65 6f 66 28 74  y(&zBuf[sizeof(t
224b0 29 5d 2c 20 26 70 69 64 2c 20 73 69 7a 65 6f 66  )], &pid, sizeof
224c0 28 70 69 64 29 29 3b 0a 20 20 20 20 20 20 61 73  (pid));.      as
224d0 73 65 72 74 28 20 73 69 7a 65 6f 66 28 74 29 2b  sert( sizeof(t)+
224e0 73 69 7a 65 6f 66 28 70 69 64 29 3c 3d 28 73 69  sizeof(pid)<=(si
224f0 7a 65 5f 74 29 6e 42 75 66 20 29 3b 0a 20 20 20  ze_t)nBuf );.   
22500 20 20 20 6e 42 75 66 20 3d 20 73 69 7a 65 6f 66     nBuf = sizeof
22510 28 74 29 20 2b 20 73 69 7a 65 6f 66 28 70 69 64  (t) + sizeof(pid
22520 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
22530 20 20 20 20 6e 42 75 66 20 3d 20 72 65 61 64 28      nBuf = read(
22540 66 64 2c 20 7a 42 75 66 2c 20 6e 42 75 66 29 3b  fd, zBuf, nBuf);
22550 0a 20 20 20 20 20 20 63 6c 6f 73 65 28 66 64 29  .      close(fd)
22560 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
22570 69 66 0a 20 20 72 65 74 75 72 6e 20 6e 42 75 66  if.  return nBuf
22580 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65  ;.}.../*.** Slee
22590 70 20 66 6f 72 20 61 20 6c 69 74 74 6c 65 20 77  p for a little w
225a0 68 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 74 68  hile.  Return th
225b0 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65  e amount of time
225c0 20 73 6c 65 70 74 2e 0a 2a 2a 20 54 68 65 20 61   slept..** The a
225d0 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 6e  rgument is the n
225e0 75 6d 62 65 72 20 6f 66 20 6d 69 63 72 6f 73 65  umber of microse
225f0 63 6f 6e 64 73 20 77 65 20 77 61 6e 74 20 74 6f  conds we want to
22600 20 73 6c 65 65 70 2e 0a 2a 2a 20 54 68 65 20 72   sleep..** The r
22610 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74  eturn value is t
22620 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 63  he number of mic
22630 72 6f 73 65 63 6f 6e 64 73 20 6f 66 20 73 6c 65  roseconds of sle
22640 65 70 20 61 63 74 75 61 6c 6c 79 0a 2a 2a 20 72  ep actually.** r
22650 65 71 75 65 73 74 65 64 20 66 72 6f 6d 20 74 68  equested from th
22660 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 6f 70 65  e underlying ope
22670 72 61 74 69 6e 67 20 73 79 73 74 65 6d 2c 20 61  rating system, a
22680 20 6e 75 6d 62 65 72 20 77 68 69 63 68 0a 2a 2a   number which.**
22690 20 6d 69 67 68 74 20 62 65 20 67 72 65 61 74 65   might be greate
226a0 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  r than or equal 
226b0 74 6f 20 74 68 65 20 61 72 67 75 6d 65 6e 74 2c  to the argument,
226c0 20 62 75 74 20 6e 6f 74 20 6c 65 73 73 0a 2a 2a   but not less.**
226d0 20 74 68 61 6e 20 74 68 65 20 61 72 67 75 6d 65   than the argume
226e0 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nt..*/.static in
226f0 74 20 75 6e 69 78 53 6c 65 65 70 28 73 71 6c 69  t unixSleep(sqli
22700 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64  te3_vfs *NotUsed
22710 2c 20 69 6e 74 20 6d 69 63 72 6f 73 65 63 6f 6e  , int microsecon
22720 64 73 29 7b 0a 23 69 66 20 4f 53 5f 56 58 57 4f  ds){.#if OS_VXWO
22730 52 4b 53 0a 20 20 73 74 72 75 63 74 20 74 69 6d  RKS.  struct tim
22740 65 73 70 65 63 20 73 70 3b 0a 0a 20 20 73 70 2e  espec sp;..  sp.
22750 74 76 5f 73 65 63 20 3d 20 6d 69 63 72 6f 73 65  tv_sec = microse
22760 63 6f 6e 64 73 20 2f 20 31 30 30 30 30 30 30 3b  conds / 1000000;
22770 0a 20 20 73 70 2e 74 76 5f 6e 73 65 63 20 3d 20  .  sp.tv_nsec = 
22780 28 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20 25 20  (microseconds % 
22790 31 30 30 30 30 30 30 29 20 2a 20 31 30 30 30 3b  1000000) * 1000;
227a0 0a 20 20 6e 61 6e 6f 73 6c 65 65 70 28 26 73 70  .  nanosleep(&sp
227b0 2c 20 4e 55 4c 4c 29 3b 0a 20 20 55 4e 55 53 45  , NULL);.  UNUSE
227c0 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
227d0 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 6d  sed);.  return m
227e0 69 63 72 6f 73 65 63 6f 6e 64 73 3b 0a 23 65 6c  icroseconds;.#el
227f0 69 66 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f  if defined(HAVE_
22800 55 53 4c 45 45 50 29 20 26 26 20 48 41 56 45 5f  USLEEP) && HAVE_
22810 55 53 4c 45 45 50 0a 20 20 75 73 6c 65 65 70 28  USLEEP.  usleep(
22820 6d 69 63 72 6f 73 65 63 6f 6e 64 73 29 3b 0a 20  microseconds);. 
22830 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
22840 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65  R(NotUsed);.  re
22850 74 75 72 6e 20 6d 69 63 72 6f 73 65 63 6f 6e 64  turn microsecond
22860 73 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 73  s;.#else.  int s
22870 65 63 6f 6e 64 73 20 3d 20 28 6d 69 63 72 6f 73  econds = (micros
22880 65 63 6f 6e 64 73 2b 39 39 39 39 39 39 29 2f 31  econds+999999)/1
22890 30 30 30 30 30 30 3b 0a 20 20 73 6c 65 65 70 28  000000;.  sleep(
228a0 73 65 63 6f 6e 64 73 29 3b 0a 20 20 55 4e 55 53  seconds);.  UNUS
228b0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
228c0 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20  Used);.  return 
228d0 73 65 63 6f 6e 64 73 2a 31 30 30 30 30 30 30 3b  seconds*1000000;
228e0 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
228f0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76   The following v
22900 61 72 69 61 62 6c 65 2c 20 69 66 20 73 65 74 20  ariable, if set 
22910 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61  to a non-zero va
22920 6c 75 65 2c 20 69 73 20 69 6e 74 65 72 70 72 65  lue, is interpre
22930 74 65 64 20 61 73 0a 2a 2a 20 74 68 65 20 6e 75  ted as.** the nu
22940 6d 62 65 72 20 6f 66 20 73 65 63 6f 6e 64 73 20  mber of seconds 
22950 73 69 6e 63 65 20 31 39 37 30 20 61 6e 64 20 69  since 1970 and i
22960 73 20 75 73 65 64 20 74 6f 20 73 65 74 20 74 68  s used to set th
22970 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20 73  e result of.** s
22980 71 6c 69 74 65 33 4f 73 43 75 72 72 65 6e 74 54  qlite3OsCurrentT
22990 69 6d 65 28 29 20 64 75 72 69 6e 67 20 74 65 73  ime() during tes
229a0 74 69 6e 67 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  ting..*/.#ifdef 
229b0 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20  SQLITE_TEST.int 
229c0 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f  sqlite3_current_
229d0 74 69 6d 65 20 3d 20 30 3b 20 20 2f 2a 20 46 61  time = 0;  /* Fa
229e0 6b 65 20 73 79 73 74 65 6d 20 74 69 6d 65 20 69  ke system time i
229f0 6e 20 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20  n seconds since 
22a00 31 39 37 30 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a  1970. */.#endif.
22a10 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20  ./*.** Find the 
22a20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 28 69 6e  current time (in
22a30 20 55 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72 64   Universal Coord
22a40 69 6e 61 74 65 64 20 54 69 6d 65 29 2e 20 20 57  inated Time).  W
22a50 72 69 74 65 20 74 68 65 0a 2a 2a 20 63 75 72 72  rite the.** curr
22a60 65 6e 74 20 74 69 6d 65 20 61 6e 64 20 64 61 74  ent time and dat
22a70 65 20 61 73 20 61 20 4a 75 6c 69 61 6e 20 44 61  e as a Julian Da
22a80 79 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70  y number into *p
22a90 72 4e 6f 77 20 61 6e 64 0a 2a 2a 20 72 65 74 75  rNow and.** retu
22aa0 72 6e 20 30 2e 20 20 52 65 74 75 72 6e 20 31 20  rn 0.  Return 1 
22ab0 69 66 20 74 68 65 20 74 69 6d 65 20 61 6e 64 20  if the time and 
22ac0 64 61 74 65 20 63 61 6e 6e 6f 74 20 62 65 20 66  date cannot be f
22ad0 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ound..*/.static 
22ae0 69 6e 74 20 75 6e 69 78 43 75 72 72 65 6e 74 54  int unixCurrentT
22af0 69 6d 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20  ime(sqlite3_vfs 
22b00 2a 4e 6f 74 55 73 65 64 2c 20 64 6f 75 62 6c 65  *NotUsed, double
22b10 20 2a 70 72 4e 6f 77 29 7b 0a 23 69 66 20 64 65   *prNow){.#if de
22b20 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
22b30 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54  T_FLOATING_POINT
22b40 29 0a 20 20 74 69 6d 65 5f 74 20 74 3b 0a 20 20  ).  time_t t;.  
22b50 74 69 6d 65 28 26 74 29 3b 0a 20 20 2a 70 72 4e  time(&t);.  *prN
22b60 6f 77 20 3d 20 28 28 28 73 71 6c 69 74 65 33 5f  ow = (((sqlite3_
22b70 69 6e 74 36 34 29 74 29 2f 38 36 34 30 20 2b 20  int64)t)/8640 + 
22b80 32 34 34 30 35 38 37 35 29 2f 31 30 3b 0a 23 65  24405875)/10;.#e
22b90 6c 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 47  lif defined(NO_G
22ba0 45 54 54 4f 44 29 0a 20 20 74 69 6d 65 5f 74 20  ETTOD).  time_t 
22bb0 74 3b 0a 20 20 74 69 6d 65 28 26 74 29 3b 0a 20  t;.  time(&t);. 
22bc0 20 2a 70 72 4e 6f 77 20 3d 20 74 2f 38 36 34 30   *prNow = t/8640
22bd0 30 2e 30 20 2b 20 32 34 34 30 35 38 37 2e 35 3b  0.0 + 2440587.5;
22be0 0a 23 65 6c 69 66 20 4f 53 5f 56 58 57 4f 52 4b  .#elif OS_VXWORK
22bf0 53 0a 20 20 73 74 72 75 63 74 20 74 69 6d 65 73  S.  struct times
22c00 70 65 63 20 73 4e 6f 77 3b 0a 20 20 63 6c 6f 63  pec sNow;.  cloc
22c10 6b 5f 67 65 74 74 69 6d 65 28 43 4c 4f 43 4b 5f  k_gettime(CLOCK_
22c20 52 45 41 4c 54 49 4d 45 2c 20 26 73 4e 6f 77 29  REALTIME, &sNow)
22c30 3b 0a 20 20 2a 70 72 4e 6f 77 20 3d 20 32 34 34  ;.  *prNow = 244
22c40 30 35 38 37 2e 35 20 2b 20 73 4e 6f 77 2e 74 76  0587.5 + sNow.tv
22c50 5f 73 65 63 2f 38 36 34 30 30 2e 30 20 2b 20 73  _sec/86400.0 + s
22c60 4e 6f 77 2e 74 76 5f 6e 73 65 63 2f 38 36 34 30  Now.tv_nsec/8640
22c70 30 30 30 30 30 30 30 30 30 30 2e 30 3b 0a 23 65  0000000000.0;.#e
22c80 6c 73 65 0a 20 20 73 74 72 75 63 74 20 74 69 6d  lse.  struct tim
22c90 65 76 61 6c 20 73 4e 6f 77 3b 0a 20 20 67 65 74  eval sNow;.  get
22ca0 74 69 6d 65 6f 66 64 61 79 28 26 73 4e 6f 77 2c  timeofday(&sNow,
22cb0 20 30 29 3b 0a 20 20 2a 70 72 4e 6f 77 20 3d 20   0);.  *prNow = 
22cc0 32 34 34 30 35 38 37 2e 35 20 2b 20 73 4e 6f 77  2440587.5 + sNow
22cd0 2e 74 76 5f 73 65 63 2f 38 36 34 30 30 2e 30 20  .tv_sec/86400.0 
22ce0 2b 20 73 4e 6f 77 2e 74 76 5f 75 73 65 63 2f 38  + sNow.tv_usec/8
22cf0 36 34 30 30 30 30 30 30 30 30 2e 30 3b 0a 23 65  6400000000.0;.#e
22d00 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c  ndif..#ifdef SQL
22d10 49 54 45 5f 54 45 53 54 0a 20 20 69 66 28 20 73  ITE_TEST.  if( s
22d20 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74  qlite3_current_t
22d30 69 6d 65 20 29 7b 0a 20 20 20 20 2a 70 72 4e 6f  ime ){.    *prNo
22d40 77 20 3d 20 73 71 6c 69 74 65 33 5f 63 75 72 72  w = sqlite3_curr
22d50 65 6e 74 5f 74 69 6d 65 2f 38 36 34 30 30 2e 30  ent_time/86400.0
22d60 20 2b 20 32 34 34 30 35 38 37 2e 35 3b 0a 20 20   + 2440587.5;.  
22d70 7d 0a 23 65 6e 64 69 66 0a 20 20 55 4e 55 53 45  }.#endif.  UNUSE
22d80 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
22d90 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 30  sed);.  return 0
22da0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 65 20 61 64  ;.}../*.** We ad
22db0 64 65 64 20 74 68 65 20 78 47 65 74 4c 61 73 74  ded the xGetLast
22dc0 45 72 72 6f 72 28 29 20 6d 65 74 68 6f 64 20 77  Error() method w
22dd0 69 74 68 20 74 68 65 20 69 6e 74 65 6e 74 69 6f  ith the intentio
22de0 6e 20 6f 66 20 70 72 6f 76 69 64 69 6e 67 0a 2a  n of providing.*
22df0 2a 20 62 65 74 74 65 72 20 6c 6f 77 2d 6c 65 76  * better low-lev
22e00 65 6c 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  el error message
22e10 73 20 77 68 65 6e 20 6f 70 65 72 61 74 69 6e 67  s when operating
22e20 2d 73 79 73 74 65 6d 20 70 72 6f 62 6c 65 6d 73  -system problems
22e30 20 63 6f 6d 65 20 75 70 0a 2a 2a 20 64 75 72 69   come up.** duri
22e40 6e 67 20 53 51 4c 69 74 65 20 6f 70 65 72 61 74  ng SQLite operat
22e50 69 6f 6e 2e 20 20 42 75 74 20 73 6f 20 66 61 72  ion.  But so far
22e60 2c 20 6e 6f 6e 65 20 6f 66 20 74 68 61 74 20 68  , none of that h
22e70 61 73 20 62 65 65 6e 20 69 6d 70 6c 65 6d 65 6e  as been implemen
22e80 74 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 63 6f  ted.** in the co
22e90 72 65 2e 20 20 53 6f 20 74 68 69 73 20 72 6f 75  re.  So this rou
22ea0 74 69 6e 65 20 69 73 20 6e 65 76 65 72 20 63 61  tine is never ca
22eb0 6c 6c 65 64 2e 20 20 46 6f 72 20 6e 6f 77 2c 20  lled.  For now, 
22ec0 69 74 20 69 73 20 6d 65 72 65 6c 79 0a 2a 2a 20  it is merely.** 
22ed0 61 20 70 6c 61 63 65 2d 68 6f 6c 64 65 72 2e 0a  a place-holder..
22ee0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
22ef0 69 78 47 65 74 4c 61 73 74 45 72 72 6f 72 28 73  ixGetLastError(s
22f00 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55  qlite3_vfs *NotU
22f10 73 65 64 2c 20 69 6e 74 20 4e 6f 74 55 73 65 64  sed, int NotUsed
22f20 32 2c 20 63 68 61 72 20 2a 4e 6f 74 55 73 65 64  2, char *NotUsed
22f30 33 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  3){.  UNUSED_PAR
22f40 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b  AMETER(NotUsed);
22f50 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
22f60 54 45 52 28 4e 6f 74 55 73 65 64 32 29 3b 0a 20  TER(NotUsed2);. 
22f70 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
22f80 52 28 4e 6f 74 55 73 65 64 33 29 3b 0a 20 20 72  R(NotUsed3);.  r
22f90 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
22fa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22fb0 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 73  ******* End of s
22fc0 71 6c 69 74 65 33 5f 76 66 73 20 6d 65 74 68 6f  qlite3_vfs metho
22fd0 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ds *************
22fe0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
22ff0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23000 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23010 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23020 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23030 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
23040 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
23050 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23060 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23070 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23080 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
23090 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
230a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e  ********** Begin
230b0 20 50 72 6f 78 79 20 4c 6f 63 6b 69 6e 67 20 2a   Proxy Locking *
230c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
230d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
230e0 2a 2a 0a 2a 2a 20 50 72 6f 78 79 20 6c 6f 63 6b  **.** Proxy lock
230f0 69 6e 67 20 69 73 20 61 20 22 75 62 65 72 2d 6c  ing is a "uber-l
23100 6f 63 6b 69 6e 67 2d 6d 65 74 68 6f 64 22 20 69  ocking-method" i
23110 6e 20 74 68 69 73 20 73 65 6e 73 65 3a 20 20 49  n this sense:  I
23120 74 20 75 73 65 73 20 74 68 65 0a 2a 2a 20 6f 74  t uses the.** ot
23130 68 65 72 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68  her locking meth
23140 6f 64 73 20 6f 6e 20 73 65 63 6f 6e 64 61 72 79  ods on secondary
23150 20 6c 6f 63 6b 20 66 69 6c 65 73 2e 20 20 50 72   lock files.  Pr
23160 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20 61  oxy locking is a
23170 0a 2a 2a 20 6d 65 74 61 2d 6c 61 79 65 72 20 6f  .** meta-layer o
23180 76 65 72 20 74 6f 70 20 6f 66 20 74 68 65 20 70  ver top of the p
23190 72 69 6d 69 74 69 76 65 20 6c 6f 63 6b 69 6e 67  rimitive locking
231a0 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 62 6f   implemented abo
231b0 76 65 2e 20 20 46 6f 72 0a 2a 2a 20 74 68 69 73  ve.  For.** this
231c0 20 72 65 61 73 6f 6e 2c 20 74 68 65 20 64 69 76   reason, the div
231d0 69 73 69 6f 6e 20 74 68 61 74 20 69 6d 70 6c 65  ision that imple
231e0 6d 65 6e 74 73 20 6f 66 20 70 72 6f 78 79 20 6c  ments of proxy l
231f0 6f 63 6b 69 6e 67 20 69 73 20 64 65 66 65 72 72  ocking is deferr
23200 65 64 0a 2a 2a 20 75 6e 74 69 6c 20 6c 61 74 65  ed.** until late
23210 20 69 6e 20 74 68 65 20 66 69 6c 65 20 28 68 65   in the file (he
23220 72 65 29 20 61 66 74 65 72 20 61 6c 6c 20 6f 66  re) after all of
23230 20 74 68 65 20 6f 74 68 65 72 20 49 2f 4f 20 6d   the other I/O m
23240 65 74 68 6f 64 73 20 68 61 76 65 0a 2a 2a 20 62  ethods have.** b
23250 65 65 6e 20 64 65 66 69 6e 65 64 20 2d 20 73 6f  een defined - so
23260 20 74 68 61 74 20 74 68 65 20 70 72 69 6d 69 74   that the primit
23270 69 76 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68  ive locking meth
23280 6f 64 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c  ods are availabl
23290 65 0a 2a 2a 20 61 73 20 73 65 72 76 69 63 65 73  e.** as services
232a0 20 74 6f 20 68 65 6c 70 20 77 69 74 68 20 74 68   to help with th
232b0 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
232c0 20 6f 66 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e   of proxy lockin
232d0 67 2e 0a 2a 2a 0a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a  g..**.****.**.**
232e0 20 54 68 65 20 64 65 66 61 75 6c 74 20 6c 6f 63   The default loc
232f0 6b 69 6e 67 20 73 63 68 65 6d 65 73 20 69 6e 20  king schemes in 
23300 53 51 4c 69 74 65 20 75 73 65 20 62 79 74 65 2d  SQLite use byte-
23310 72 61 6e 67 65 20 6c 6f 63 6b 73 20 6f 6e 20 74  range locks on t
23320 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66  he.** database f
23330 69 6c 65 20 74 6f 20 63 6f 6f 72 64 69 6e 61 74  ile to coordinat
23340 65 20 73 61 66 65 2c 20 63 6f 6e 63 75 72 72 65  e safe, concurre
23350 6e 74 20 61 63 63 65 73 73 20 62 79 20 6d 75 6c  nt access by mul
23360 74 69 70 6c 65 20 72 65 61 64 65 72 73 0a 2a 2a  tiple readers.**
23370 20 61 6e 64 20 77 72 69 74 65 72 73 20 5b 68 74   and writers [ht
23380 74 70 3a 2f 2f 73 71 6c 69 74 65 2e 6f 72 67 2f  tp://sqlite.org/
23390 6c 6f 63 6b 69 6e 67 76 33 2e 68 74 6d 6c 5d 2e  lockingv3.html].
233a0 20 20 54 68 65 20 66 69 76 65 20 66 69 6c 65 20    The five file 
233b0 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73 74 61 74 65  locking.** state
233c0 73 20 28 55 4e 4c 4f 43 4b 45 44 2c 20 50 45 4e  s (UNLOCKED, PEN
233d0 44 49 4e 47 2c 20 53 48 41 52 45 44 2c 20 52 45  DING, SHARED, RE
233e0 53 45 52 56 45 44 2c 20 45 58 43 4c 55 53 49 56  SERVED, EXCLUSIV
233f0 45 29 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74  E) are implement
23400 65 64 0a 2a 2a 20 61 73 20 50 4f 53 49 58 20 72  ed.** as POSIX r
23410 65 61 64 20 26 20 77 72 69 74 65 20 6c 6f 63 6b  ead & write lock
23420 73 20 6f 76 65 72 20 66 69 78 65 64 20 73 65 74  s over fixed set
23430 20 6f 66 20 6c 6f 63 61 74 69 6f 6e 73 20 28 76   of locations (v
23440 69 61 20 66 73 63 74 6c 29 2c 0a 2a 2a 20 6f 6e  ia fsctl),.** on
23450 20 41 46 50 20 61 6e 64 20 53 4d 42 20 6f 6e 6c   AFP and SMB onl
23460 79 20 65 78 63 6c 75 73 69 76 65 20 62 79 74 65  y exclusive byte
23470 2d 72 61 6e 67 65 20 6c 6f 63 6b 73 20 61 72 65  -range locks are
23480 20 61 76 61 69 6c 61 62 6c 65 20 76 69 61 20 66   available via f
23490 73 63 74 6c 0a 2a 2a 20 77 69 74 68 20 5f 49 4f  sctl.** with _IO
234a0 57 52 28 27 7a 27 2c 20 32 33 2c 20 73 74 72 75  WR('z', 23, stru
234b0 63 74 20 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b  ct ByteRangeLock
234c0 50 42 32 29 20 74 6f 20 74 72 61 63 6b 20 74 68  PB2) to track th
234d0 65 20 73 61 6d 65 20 35 20 73 74 61 74 65 73 2e  e same 5 states.
234e0 0a 2a 2a 20 54 6f 20 73 69 6d 75 6c 61 74 65 20  .** To simulate 
234f0 61 20 46 5f 52 44 4c 43 4b 20 6f 6e 20 74 68 65  a F_RDLCK on the
23500 20 73 68 61 72 65 64 20 72 61 6e 67 65 2c 20 6f   shared range, o
23510 6e 20 41 46 50 20 61 20 72 61 6e 64 6f 6d 6c 79  n AFP a randomly
23520 20 73 65 6c 65 63 74 65 64 0a 2a 2a 20 61 64 64   selected.** add
23530 72 65 73 73 20 69 6e 20 74 68 65 20 73 68 61 72  ress in the shar
23540 65 64 20 72 61 6e 67 65 20 69 73 20 74 61 6b 65  ed range is take
23550 6e 20 66 6f 72 20 61 20 53 48 41 52 45 44 20 6c  n for a SHARED l
23560 6f 63 6b 2c 20 74 68 65 20 65 6e 74 69 72 65 0a  ock, the entire.
23570 2a 2a 20 73 68 61 72 65 64 20 72 61 6e 67 65 20  ** shared range 
23580 69 73 20 74 61 6b 65 6e 20 66 6f 72 20 61 6e 20  is taken for an 
23590 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 29 3a  EXCLUSIVE lock):
235a0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 50 45 4e 44  .**.**      PEND
235b0 49 4e 47 5f 42 59 54 45 20 20 20 20 20 20 20 20  ING_BYTE        
235c0 30 78 34 30 30 30 30 30 30 30 09 09 20 20 20 09  0x40000000..   .
235d0 0a 2a 2a 20 20 20 20 20 20 52 45 53 45 52 56 45  .**      RESERVE
235e0 44 5f 42 59 54 45 20 20 20 20 20 20 20 30 78 34  D_BYTE       0x4
235f0 30 30 30 30 30 30 31 0a 2a 2a 20 20 20 20 20 20  0000001.**      
23600 53 48 41 52 45 44 5f 52 41 4e 47 45 20 20 20 20  SHARED_RANGE    
23610 20 20 20 20 30 78 34 30 30 30 30 30 30 32 20 2d      0x40000002 -
23620 3e 20 30 78 34 30 30 30 30 32 30 30 0a 2a 2a 0a  > 0x40000200.**.
23630 2a 2a 20 54 68 69 73 20 77 6f 72 6b 73 20 77 65  ** This works we
23640 6c 6c 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20  ll on the local 
23650 66 69 6c 65 20 73 79 73 74 65 6d 2c 20 62 75 74  file system, but
23660 20 73 68 6f 77 73 20 61 20 6e 65 61 72 6c 79 20   shows a nearly 
23670 31 30 30 78 0a 2a 2a 20 73 6c 6f 77 64 6f 77 6e  100x.** slowdown
23680 20 69 6e 20 72 65 61 64 20 70 65 72 66 6f 72 6d   in read perform
23690 61 6e 63 65 20 6f 6e 20 41 46 50 20 62 65 63 61  ance on AFP beca
236a0 75 73 65 20 74 68 65 20 41 46 50 20 63 6c 69 65  use the AFP clie
236b0 6e 74 20 64 69 73 61 62 6c 65 73 0a 2a 2a 20 74  nt disables.** t
236c0 68 65 20 72 65 61 64 20 63 61 63 68 65 20 77 68  he read cache wh
236d0 65 6e 20 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f  en byte-range lo
236e0 63 6b 73 20 61 72 65 20 70 72 65 73 65 6e 74 2e  cks are present.
236f0 20 20 45 6e 61 62 6c 69 6e 67 20 74 68 65 20 72    Enabling the r
23700 65 61 64 0a 2a 2a 20 63 61 63 68 65 20 65 78 70  ead.** cache exp
23710 6f 73 65 73 20 61 20 63 61 63 68 65 20 63 6f 68  oses a cache coh
23720 65 72 65 6e 63 79 20 70 72 6f 62 6c 65 6d 20 74  erency problem t
23730 68 61 74 20 69 73 20 70 72 65 73 65 6e 74 20 6f  hat is present o
23740 6e 20 61 6c 6c 20 4f 53 20 58 0a 2a 2a 20 73 75  n all OS X.** su
23750 70 70 6f 72 74 65 64 20 6e 65 74 77 6f 72 6b 20  pported network 
23760 66 69 6c 65 20 73 79 73 74 65 6d 73 2e 20 20 4e  file systems.  N
23770 46 53 20 61 6e 64 20 41 46 50 20 62 6f 74 68 20  FS and AFP both 
23780 6f 62 73 65 72 76 65 20 74 68 65 0a 2a 2a 20 63  observe the.** c
23790 6c 6f 73 65 2d 74 6f 2d 6f 70 65 6e 20 73 65 6d  lose-to-open sem
237a0 61 6e 74 69 63 73 20 66 6f 72 20 65 6e 73 75 72  antics for ensur
237b0 69 6e 67 20 63 61 63 68 65 20 63 6f 68 65 72 65  ing cache cohere
237c0 6e 63 79 0a 2a 2a 20 5b 68 74 74 70 3a 2f 2f 6e  ncy.** [http://n
237d0 66 73 2e 73 6f 75 72 63 65 66 6f 72 67 65 2e 6e  fs.sourceforge.n
237e0 65 74 2f 23 66 61 71 5f 61 38 5d 2c 20 77 68 69  et/#faq_a8], whi
237f0 63 68 20 64 6f 65 73 20 6e 6f 74 20 65 66 66 65  ch does not effe
23800 63 74 69 76 65 6c 79 0a 2a 2a 20 61 64 64 72 65  ctively.** addre
23810 73 73 20 74 68 65 20 72 65 71 75 69 72 65 6d 65  ss the requireme
23820 6e 74 73 20 66 6f 72 20 63 6f 6e 63 75 72 72 65  nts for concurre
23830 6e 74 20 64 61 74 61 62 61 73 65 20 61 63 63 65  nt database acce
23840 73 73 20 62 79 20 6d 75 6c 74 69 70 6c 65 0a 2a  ss by multiple.*
23850 2a 20 72 65 61 64 65 72 73 20 61 6e 64 20 77 72  * readers and wr
23860 69 74 65 72 73 0a 2a 2a 20 5b 68 74 74 70 3a 2f  iters.** [http:/
23870 2f 77 77 77 2e 6e 61 62 62 6c 65 2e 63 6f 6d 2f  /www.nabble.com/
23880 53 51 4c 69 74 65 2d 6f 6e 2d 4e 46 53 2d 63 61  SQLite-on-NFS-ca
23890 63 68 65 2d 63 6f 68 65 72 65 6e 63 79 2d 74 64  che-coherency-td
238a0 31 35 36 35 35 37 30 31 2e 68 74 6d 6c 5d 2e 0a  15655701.html]..
238b0 2a 2a 0a 2a 2a 20 54 6f 20 61 64 64 72 65 73 73  **.** To address
238c0 20 74 68 65 20 70 65 72 66 6f 72 6d 61 6e 63 65   the performance
238d0 20 61 6e 64 20 63 61 63 68 65 20 63 6f 68 65 72   and cache coher
238e0 65 6e 63 79 20 69 73 73 75 65 73 2c 20 70 72 6f  ency issues, pro
238f0 78 79 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 0a  xy file locking.
23900 2a 2a 20 63 68 61 6e 67 65 73 20 74 68 65 20 77  ** changes the w
23910 61 79 20 64 61 74 61 62 61 73 65 20 61 63 63 65  ay database acce
23920 73 73 20 69 73 20 63 6f 6e 74 72 6f 6c 6c 65 64  ss is controlled
23930 20 62 79 20 6c 69 6d 69 74 69 6e 67 20 61 63 63   by limiting acc
23940 65 73 73 20 74 6f 20 61 0a 2a 2a 20 73 69 6e 67  ess to a.** sing
23950 6c 65 20 68 6f 73 74 20 61 74 20 61 20 74 69 6d  le host at a tim
23960 65 20 61 6e 64 20 6d 6f 76 69 6e 67 20 66 69 6c  e and moving fil
23970 65 20 6c 6f 63 6b 73 20 6f 66 66 20 6f 66 20 74  e locks off of t
23980 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
23990 0a 2a 2a 20 61 6e 64 20 6f 6e 74 6f 20 61 20 70  .** and onto a p
239a0 72 6f 78 79 20 66 69 6c 65 20 6f 6e 20 74 68 65  roxy file on the
239b0 20 6c 6f 63 61 6c 20 66 69 6c 65 20 73 79 73 74   local file syst
239c0 65 6d 2e 20 20 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 55  em.  .**.**.** U
239d0 73 69 6e 67 20 70 72 6f 78 79 20 6c 6f 63 6b 73  sing proxy locks
239e0 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .** ------------
239f0 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 43 20 41 50  -----.**.** C AP
23a00 49 73 0a 2a 2a 0a 2a 2a 20 20 73 71 6c 69 74 65  Is.**.**  sqlite
23a10 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64  3_file_control(d
23a20 62 2c 20 64 62 6e 61 6d 65 2c 20 53 51 4c 49 54  b, dbname, SQLIT
23a30 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46  E_SET_LOCKPROXYF
23a40 49 4c 45 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20  ILE,.**         
23a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3c 70                <p
23a60 72 6f 78 79 5f 70 61 74 68 3e 20 7c 20 22 3a 61  roxy_path> | ":a
23a70 75 74 6f 3a 22 29 3b 0a 2a 2a 20 20 73 71 6c 69  uto:");.**  sqli
23a80 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  te3_file_control
23a90 28 64 62 2c 20 64 62 6e 61 6d 65 2c 20 53 51 4c  (db, dbname, SQL
23aa0 49 54 45 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f 58  ITE_GET_LOCKPROX
23ab0 59 46 49 4c 45 2c 20 26 3c 70 72 6f 78 79 5f 70  YFILE, &<proxy_p
23ac0 61 74 68 3e 29 3b 0a 2a 2a 0a 2a 2a 0a 2a 2a 20  ath>);.**.**.** 
23ad0 53 51 4c 20 70 72 61 67 6d 61 73 0a 2a 2a 0a 2a  SQL pragmas.**.*
23ae0 2a 20 20 50 52 41 47 4d 41 20 5b 64 61 74 61 62  *  PRAGMA [datab
23af0 61 73 65 2e 5d 6c 6f 63 6b 5f 70 72 6f 78 79 5f  ase.]lock_proxy_
23b00 66 69 6c 65 3d 3c 70 72 6f 78 79 5f 70 61 74 68  file=<proxy_path
23b10 3e 20 7c 20 3a 61 75 74 6f 3a 0a 2a 2a 20 20 50  > | :auto:.**  P
23b20 52 41 47 4d 41 20 5b 64 61 74 61 62 61 73 65 2e  RAGMA [database.
23b30 5d 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66 69 6c 65  ]lock_proxy_file
23b40 0a 2a 2a 0a 2a 2a 20 53 70 65 63 69 66 79 69 6e  .**.** Specifyin
23b50 67 20 22 3a 61 75 74 6f 3a 22 20 6d 65 61 6e 73  g ":auto:" means
23b60 20 74 68 61 74 20 69 66 20 74 68 65 72 65 20 69   that if there i
23b70 73 20 61 20 63 6f 6e 63 68 20 66 69 6c 65 20 77  s a conch file w
23b80 69 74 68 20 61 20 6d 61 74 63 68 69 6e 67 0a 2a  ith a matching.*
23b90 2a 20 68 6f 73 74 20 49 44 20 69 6e 20 69 74 2c  * host ID in it,
23ba0 20 74 68 65 20 70 72 6f 78 79 20 70 61 74 68 20   the proxy path 
23bb0 69 6e 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c  in the conch fil
23bc0 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64 2c 20  e will be used, 
23bd0 6f 74 68 65 72 77 69 73 65 0a 2a 2a 20 61 20 70  otherwise.** a p
23be0 72 6f 78 79 20 70 61 74 68 20 62 61 73 65 64 20  roxy path based 
23bf0 6f 6e 20 74 68 65 20 75 73 65 72 27 73 20 74 65  on the user's te
23c00 6d 70 20 64 69 72 0a 2a 2a 20 28 76 69 61 20 63  mp dir.** (via c
23c10 6f 6e 66 73 74 72 28 5f 43 53 5f 44 41 52 57 49  onfstr(_CS_DARWI
23c20 4e 5f 55 53 45 52 5f 54 45 4d 50 5f 44 49 52 2c  N_USER_TEMP_DIR,
23c30 2e 2e 2e 29 29 20 77 69 6c 6c 20 62 65 20 75 73  ...)) will be us
23c40 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 61 63  ed and the.** ac
23c50 74 75 61 6c 20 70 72 6f 78 79 20 66 69 6c 65 20  tual proxy file 
23c60 6e 61 6d 65 20 69 73 20 67 65 6e 65 72 61 74 65  name is generate
23c70 64 20 66 72 6f 6d 20 74 68 65 20 6e 61 6d 65 20  d from the name 
23c80 61 6e 64 20 70 61 74 68 20 6f 66 20 74 68 65 0a  and path of the.
23c90 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
23ca0 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a  .  For example:.
23cb0 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 46 6f 72 20  **.**       For 
23cc0 64 61 74 61 62 61 73 65 20 70 61 74 68 20 22 2f  database path "/
23cd0 55 73 65 72 73 2f 6d 65 2f 66 6f 6f 2e 64 62 22  Users/me/foo.db"
23ce0 20 0a 2a 2a 20 20 20 20 20 20 20 54 68 65 20 6c   .**       The l
23cf0 6f 63 6b 20 70 61 74 68 20 77 69 6c 6c 20 62 65  ock path will be
23d00 20 22 3c 74 6d 70 64 69 72 3e 2f 73 71 6c 69 74   "<tmpdir>/sqlit
23d10 65 70 6c 6f 63 6b 73 2f 5f 55 73 65 72 73 5f 6d  eplocks/_Users_m
23d20 65 5f 66 6f 6f 2e 64 62 3a 61 75 74 6f 3a 22 29  e_foo.db:auto:")
23d30 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61 20 6c 6f  .**.** Once a lo
23d40 63 6b 20 70 72 6f 78 79 20 69 73 20 63 6f 6e 66  ck proxy is conf
23d50 69 67 75 72 65 64 20 66 6f 72 20 61 20 64 61 74  igured for a dat
23d60 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
23d70 2c 20 69 74 20 63 61 6e 20 6e 6f 74 0a 2a 2a 20  , it can not.** 
23d80 62 65 20 72 65 6d 6f 76 65 64 2c 20 68 6f 77 65  be removed, howe
23d90 76 65 72 20 69 74 20 6d 61 79 20 62 65 20 73 77  ver it may be sw
23da0 69 74 63 68 65 64 20 74 6f 20 61 20 64 69 66 66  itched to a diff
23db0 65 72 65 6e 74 20 70 72 6f 78 79 20 70 61 74 68  erent proxy path
23dc0 20 76 69 61 0a 2a 2a 20 74 68 65 20 61 62 6f 76   via.** the abov
23dd0 65 20 41 50 49 73 20 28 61 73 73 75 6d 69 6e 67  e APIs (assuming
23de0 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20   the conch file 
23df0 69 73 20 6e 6f 74 20 62 65 69 6e 67 20 68 65 6c  is not being hel
23e00 64 20 62 79 20 61 6e 6f 74 68 65 72 0a 2a 2a 20  d by another.** 
23e10 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 72 20 70 72  connection or pr
23e20 6f 63 65 73 73 29 2e 20 0a 2a 2a 0a 2a 2a 0a 2a  ocess). .**.**.*
23e30 2a 20 48 6f 77 20 70 72 6f 78 79 20 6c 6f 63 6b  * How proxy lock
23e40 69 6e 67 20 77 6f 72 6b 73 0a 2a 2a 20 2d 2d 2d  ing works.** ---
23e50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23e60 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 50 72 6f 78 79  ----.**.** Proxy
23e70 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 72 65   file locking re
23e80 6c 69 65 73 20 70 72 69 6d 61 72 69 6c 79 20 6f  lies primarily o
23e90 6e 20 74 77 6f 20 6e 65 77 20 73 75 70 70 6f 72  n two new suppor
23ea0 74 69 6e 67 20 66 69 6c 65 73 3a 20 0a 2a 2a 0a  ting files: .**.
23eb0 2a 2a 20 20 20 2a 20 20 63 6f 6e 63 68 20 66 69  **   *  conch fi
23ec0 6c 65 20 74 6f 20 6c 69 6d 69 74 20 61 63 63 65  le to limit acce
23ed0 73 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ss to the databa
23ee0 73 65 20 66 69 6c 65 20 74 6f 20 61 20 73 69 6e  se file to a sin
23ef0 67 6c 65 20 68 6f 73 74 0a 2a 2a 20 20 20 20 20  gle host.**     
23f00 20 61 74 20 61 20 74 69 6d 65 0a 2a 2a 0a 2a 2a   at a time.**.**
23f10 20 20 20 2a 20 20 70 72 6f 78 79 20 66 69 6c 65     *  proxy file
23f20 20 74 6f 20 61 63 74 20 61 73 20 61 20 70 72 6f   to act as a pro
23f30 78 79 20 66 6f 72 20 74 68 65 20 61 64 76 69 73  xy for the advis
23f40 6f 72 79 20 6c 6f 63 6b 73 20 6e 6f 72 6d 61 6c  ory locks normal
23f50 6c 79 0a 2a 2a 20 20 20 20 20 20 74 61 6b 65 6e  ly.**      taken
23f60 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
23f70 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e 63 68  .**.** The conch
23f80 20 66 69 6c 65 20 2d 20 74 6f 20 75 73 65 20 61   file - to use a
23f90 20 70 72 6f 78 79 20 66 69 6c 65 2c 20 73 71 6c   proxy file, sql
23fa0 69 74 65 20 6d 75 73 74 20 66 69 72 73 74 20 22  ite must first "
23fb0 68 6f 6c 64 20 74 68 65 20 63 6f 6e 63 68 22 0a  hold the conch".
23fc0 2a 2a 20 62 79 20 74 61 6b 69 6e 67 20 61 6e 20  ** by taking an 
23fd0 73 71 6c 69 74 65 2d 73 74 79 6c 65 20 73 68 61  sqlite-style sha
23fe0 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  red lock on the 
23ff0 63 6f 6e 63 68 20 66 69 6c 65 2c 20 72 65 61 64  conch file, read
24000 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65  ing the.** conte
24010 6e 74 73 20 61 6e 64 20 63 6f 6d 70 61 72 69 6e  nts and comparin
24020 67 20 74 68 65 20 68 6f 73 74 27 73 20 75 6e 69  g the host's uni
24030 71 75 65 20 68 6f 73 74 20 49 44 20 28 73 65 65  que host ID (see
24040 20 62 65 6c 6f 77 29 20 61 6e 64 20 6c 6f 63 6b   below) and lock
24050 0a 2a 2a 20 70 72 6f 78 79 20 70 61 74 68 20 61  .** proxy path a
24060 67 61 69 6e 73 74 20 74 68 65 20 76 61 6c 75 65  gainst the value
24070 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  s stored in the 
24080 63 6f 6e 63 68 2e 20 20 54 68 65 20 63 6f 6e 63  conch.  The conc
24090 68 20 66 69 6c 65 20 69 73 0a 2a 2a 20 73 74 6f  h file is.** sto
240a0 72 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20  red in the same 
240b0 64 69 72 65 63 74 6f 72 79 20 61 73 20 74 68 65  directory as the
240c0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
240d0 6e 64 20 74 68 65 20 66 69 6c 65 20 6e 61 6d 65  nd the file name
240e0 0a 2a 2a 20 69 73 20 70 61 74 74 65 72 6e 65 64  .** is patterned
240f0 20 61 66 74 65 72 20 74 68 65 20 64 61 74 61 62   after the datab
24100 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 61 73  ase file name as
24110 20 22 2e 3c 64 61 74 61 62 61 73 65 6e 61 6d 65   ".<databasename
24120 3e 2d 63 6f 6e 63 68 22 2e 0a 2a 2a 20 49 66 20  >-conch"..** If 
24130 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 64  the conch file d
24140 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 6f  oes not exist, o
24150 72 20 69 74 27 73 20 63 6f 6e 74 65 6e 74 73 20  r it's contents 
24160 64 6f 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65  do not match the
24170 0a 2a 2a 20 68 6f 73 74 20 49 44 20 61 6e 64 2f  .** host ID and/
24180 6f 72 20 70 72 6f 78 79 20 70 61 74 68 2c 20 74  or proxy path, t
24190 68 65 6e 20 74 68 65 20 6c 6f 63 6b 20 69 73 20  hen the lock is 
241a0 65 73 63 61 6c 61 74 65 64 20 74 6f 20 61 6e 20  escalated to an 
241b0 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20 6c 6f 63  exclusive.** loc
241c0 6b 20 61 6e 64 20 74 68 65 20 63 6f 6e 63 68 20  k and the conch 
241d0 66 69 6c 65 20 63 6f 6e 74 65 6e 74 73 20 69 73  file contents is
241e0 20 75 70 64 61 74 65 64 20 77 69 74 68 20 74 68   updated with th
241f0 65 20 68 6f 73 74 20 49 44 20 61 6e 64 20 70 72  e host ID and pr
24200 6f 78 79 0a 2a 2a 20 70 61 74 68 20 61 6e 64 20  oxy.** path and 
24210 74 68 65 20 6c 6f 63 6b 20 69 73 20 64 6f 77 6e  the lock is down
24220 67 72 61 64 65 64 20 74 6f 20 61 20 73 68 61 72  graded to a shar
24230 65 64 20 6c 6f 63 6b 20 61 67 61 69 6e 2e 20 20  ed lock again.  
24240 49 66 20 74 68 65 20 63 6f 6e 63 68 0a 2a 2a 20  If the conch.** 
24250 69 73 20 68 65 6c 64 20 62 79 20 61 6e 6f 74 68  is held by anoth
24260 65 72 20 70 72 6f 63 65 73 73 20 28 77 69 74 68  er process (with
24270 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 29 2c   a shared lock),
24280 20 74 68 65 20 65 78 63 6c 75 73 69 76 65 20 6c   the exclusive l
24290 6f 63 6b 0a 2a 2a 20 77 69 6c 6c 20 66 61 69 6c  ock.** will fail
242a0 20 61 6e 64 20 53 51 4c 49 54 45 5f 42 55 53 59   and SQLITE_BUSY
242b0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
242c0 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79 20 66 69  .** The proxy fi
242d0 6c 65 20 2d 20 61 20 73 69 6e 67 6c 65 2d 62 79  le - a single-by
242e0 74 65 20 66 69 6c 65 20 75 73 65 64 20 66 6f 72  te file used for
242f0 20 61 6c 6c 20 61 64 76 69 73 6f 72 79 20 66 69   all advisory fi
24300 6c 65 20 6c 6f 63 6b 73 0a 2a 2a 20 6e 6f 72 6d  le locks.** norm
24310 61 6c 6c 79 20 74 61 6b 65 6e 20 6f 6e 20 74 68  ally taken on th
24320 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
24330 20 20 20 54 68 69 73 20 61 6c 6c 6f 77 73 20 66     This allows f
24340 6f 72 20 73 61 66 65 20 73 68 61 72 69 6e 67 0a  or safe sharing.
24350 2a 2a 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ** of the databa
24360 73 65 20 66 69 6c 65 20 66 6f 72 20 6d 75 6c 74  se file for mult
24370 69 70 6c 65 20 72 65 61 64 65 72 73 20 61 6e 64  iple readers and
24380 20 77 72 69 74 65 72 73 20 6f 6e 20 74 68 65 20   writers on the 
24390 73 61 6d 65 0a 2a 2a 20 68 6f 73 74 20 28 74 68  same.** host (th
243a0 65 20 63 6f 6e 63 68 20 65 6e 73 75 72 65 73 20  e conch ensures 
243b0 74 68 61 74 20 74 68 65 79 20 61 6c 6c 20 75 73  that they all us
243c0 65 20 74 68 65 20 73 61 6d 65 20 6c 6f 63 61 6c  e the same local
243d0 20 6c 6f 63 6b 20 66 69 6c 65 29 2e 0a 2a 2a 0a   lock file)..**.
243e0 2a 2a 20 54 68 65 72 65 20 69 73 20 61 20 74 68  ** There is a th
243f0 69 72 64 20 66 69 6c 65 20 2d 20 74 68 65 20 68  ird file - the h
24400 6f 73 74 20 49 44 20 66 69 6c 65 20 2d 20 75 73  ost ID file - us
24410 65 64 20 61 73 20 61 20 70 65 72 73 69 73 74 65  ed as a persiste
24420 6e 74 20 72 65 63 6f 72 64 0a 2a 2a 20 6f 66 20  nt record.** of 
24430 61 20 75 6e 69 71 75 65 20 69 64 65 6e 74 69 66  a unique identif
24440 69 65 72 20 66 6f 72 20 74 68 65 20 68 6f 73 74  ier for the host
24450 2c 20 61 20 31 32 38 2d 62 79 74 65 20 75 6e 69  , a 128-byte uni
24460 71 75 65 20 68 6f 73 74 20 69 64 20 66 69 6c 65  que host id file
24470 0a 2a 2a 20 69 6e 20 74 68 65 20 70 61 74 68 20  .** in the path 
24480 64 65 66 69 6e 65 64 20 62 79 20 74 68 65 20 48  defined by the H
24490 4f 53 54 49 44 50 41 54 48 20 6d 61 63 72 6f 20  OSTIDPATH macro 
244a0 28 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 69  (default value i
244b0 73 0a 2a 2a 20 2f 4c 69 62 72 61 72 79 2f 43 61  s.** /Library/Ca
244c0 63 68 65 73 2f 2e 63 6f 6d 2e 61 70 70 6c 65 2e  ches/.com.apple.
244d0 73 71 6c 69 74 65 43 6f 6e 63 68 48 6f 73 74 49  sqliteConchHostI
244e0 64 29 2e 0a 2a 2a 0a 2a 2a 20 52 65 71 75 65 73  d)..**.** Reques
244f0 74 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 70 72  ting the lock pr
24500 6f 78 79 20 64 6f 65 73 20 6e 6f 74 20 69 6d 6d  oxy does not imm
24510 65 64 69 61 74 65 6c 79 20 74 61 6b 65 20 74 68  ediately take th
24520 65 20 63 6f 6e 63 68 2c 20 69 74 20 69 73 0a 2a  e conch, it is.*
24530 2a 20 6f 6e 6c 79 20 74 61 6b 65 6e 20 77 68 65  * only taken whe
24540 6e 20 74 68 65 20 66 69 72 73 74 20 72 65 71 75  n the first requ
24550 65 73 74 20 74 6f 20 6c 6f 63 6b 20 64 61 74 61  est to lock data
24560 62 61 73 65 20 66 69 6c 65 20 69 73 20 6d 61 64  base file is mad
24570 65 2e 20 20 0a 2a 2a 20 54 68 69 73 20 6d 61 74  e.  .** This mat
24580 63 68 65 73 20 74 68 65 20 73 65 6d 61 6e 74 69  ches the semanti
24590 63 73 20 6f 66 20 74 68 65 20 74 72 61 64 69 74  cs of the tradit
245a0 69 6f 6e 61 6c 20 6c 6f 63 6b 69 6e 67 20 62 65  ional locking be
245b0 68 61 76 69 6f 72 2c 20 77 68 65 72 65 0a 2a 2a  havior, where.**
245c0 20 6f 70 65 6e 69 6e 67 20 61 20 63 6f 6e 6e 65   opening a conne
245d0 63 74 69 6f 6e 20 74 6f 20 61 20 64 61 74 61 62  ction to a datab
245e0 61 73 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f  ase file does no
245f0 74 20 74 61 6b 65 20 61 20 6c 6f 63 6b 20 6f 6e  t take a lock on
24600 20 69 74 2e 0a 2a 2a 20 54 68 65 20 73 68 61 72   it..** The shar
24610 65 64 20 6c 6f 63 6b 20 61 6e 64 20 61 6e 20 6f  ed lock and an o
24620 70 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70  pen file descrip
24630 74 6f 72 20 61 72 65 20 6d 61 69 6e 74 61 69 6e  tor are maintain
24640 65 64 20 75 6e 74 69 6c 20 0a 2a 2a 20 74 68 65  ed until .** the
24650 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 74   connection to t
24660 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 63  he database is c
24670 6c 6f 73 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68  losed. .**.** Th
24680 65 20 70 72 6f 78 79 20 66 69 6c 65 20 61 6e 64  e proxy file and
24690 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65 20 61   the lock file a
246a0 72 65 20 6e 65 76 65 72 20 64 65 6c 65 74 65 64  re never deleted
246b0 20 73 6f 20 74 68 65 79 20 6f 6e 6c 79 20 6e 65   so they only ne
246c0 65 64 0a 2a 2a 20 74 6f 20 62 65 20 63 72 65 61  ed.** to be crea
246d0 74 65 64 20 74 68 65 20 66 69 72 73 74 20 74 69  ted the first ti
246e0 6d 65 20 74 68 65 79 20 61 72 65 20 75 73 65 64  me they are used
246f0 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72  ..**.** Configur
24700 61 74 69 6f 6e 20 6f 70 74 69 6f 6e 73 0a 2a 2a  ation options.**
24710 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
24720 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 20 53 51  ------.**.**  SQ
24730 4c 49 54 45 5f 50 52 45 46 45 52 5f 50 52 4f 58  LITE_PREFER_PROX
24740 59 5f 4c 4f 43 4b 49 4e 47 0a 2a 2a 0a 2a 2a 20  Y_LOCKING.**.** 
24750 20 20 20 20 20 20 44 61 74 61 62 61 73 65 20 66        Database f
24760 69 6c 65 73 20 61 63 63 65 73 73 65 64 20 6f 6e  iles accessed on
24770 20 6e 6f 6e 2d 6c 6f 63 61 6c 20 66 69 6c 65 20   non-local file 
24780 73 79 73 74 65 6d 73 20 61 72 65 0a 2a 2a 20 20  systems are.**  
24790 20 20 20 20 20 61 75 74 6f 6d 61 74 69 63 61 6c       automatical
247a0 6c 79 20 63 6f 6e 66 69 67 75 72 65 64 20 66 6f  ly configured fo
247b0 72 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 2c  r proxy locking,
247c0 20 6c 6f 63 6b 20 66 69 6c 65 73 20 61 72 65 0a   lock files are.
247d0 2a 2a 20 20 20 20 20 20 20 6e 61 6d 65 64 20 61  **       named a
247e0 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 75 73 69  utomatically usi
247f0 6e 67 20 74 68 65 20 73 61 6d 65 20 6c 6f 67 69  ng the same logi
24800 63 20 61 73 0a 2a 2a 20 20 20 20 20 20 20 50 52  c as.**       PR
24810 41 47 4d 41 20 6c 6f 63 6b 5f 70 72 6f 78 79 5f  AGMA lock_proxy_
24820 66 69 6c 65 3d 22 3a 61 75 74 6f 3a 22 0a 2a 2a  file=":auto:".**
24830 20 20 20 20 0a 2a 2a 20 20 53 51 4c 49 54 45 5f      .**  SQLITE_
24840 50 52 4f 58 59 5f 44 45 42 55 47 0a 2a 2a 0a 2a  PROXY_DEBUG.**.*
24850 2a 20 20 20 20 20 20 20 45 6e 61 62 6c 65 73 20  *       Enables 
24860 74 68 65 20 6c 6f 67 67 69 6e 67 20 6f 66 20 65  the logging of e
24870 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 64 75  rror messages du
24880 72 69 6e 67 20 68 6f 73 74 20 69 64 20 66 69 6c  ring host id fil
24890 65 0a 2a 2a 20 20 20 20 20 20 20 72 65 74 72 69  e.**       retri
248a0 65 76 61 6c 20 61 6e 64 20 63 72 65 61 74 69 6f  eval and creatio
248b0 6e 0a 2a 2a 0a 2a 2a 20 20 48 4f 53 54 49 44 50  n.**.**  HOSTIDP
248c0 41 54 48 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  ATH.**.**       
248d0 4f 76 65 72 72 69 64 65 73 20 74 68 65 20 64 65  Overrides the de
248e0 66 61 75 6c 74 20 68 6f 73 74 20 49 44 20 66 69  fault host ID fi
248f0 6c 65 20 70 61 74 68 20 6c 6f 63 61 74 69 6f 6e  le path location
24900 0a 2a 2a 0a 2a 2a 20 20 4c 4f 43 4b 50 52 4f 58  .**.**  LOCKPROX
24910 59 44 49 52 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  YDIR.**.**      
24920 20 4f 76 65 72 72 69 64 65 73 20 74 68 65 20 64   Overrides the d
24930 65 66 61 75 6c 74 20 64 69 72 65 63 74 6f 72 79  efault directory
24940 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 20 70   used for lock p
24950 72 6f 78 79 20 66 69 6c 65 73 20 74 68 61 74 0a  roxy files that.
24960 2a 2a 20 20 20 20 20 20 20 61 72 65 20 6e 61 6d  **       are nam
24970 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ed automatically
24980 20 76 69 61 20 74 68 65 20 22 3a 61 75 74 6f 3a   via the ":auto:
24990 22 20 73 65 74 74 69 6e 67 0a 2a 2a 0a 2a 2a 20  " setting.**.** 
249a0 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
249b0 50 52 4f 58 59 44 49 52 5f 50 45 52 4d 49 53 53  PROXYDIR_PERMISS
249c0 49 4f 4e 53 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  IONS.**.**      
249d0 20 50 65 72 6d 69 73 73 69 6f 6e 73 20 74 6f 20   Permissions to 
249e0 75 73 65 20 77 68 65 6e 20 63 72 65 61 74 69 6e  use when creatin
249f0 67 20 61 20 64 69 72 65 63 74 6f 72 79 20 66 6f  g a directory fo
24a00 72 20 73 74 6f 72 69 6e 67 20 74 68 65 0a 2a 2a  r storing the.**
24a10 20 20 20 20 20 20 20 6c 6f 63 6b 20 70 72 6f 78         lock prox
24a20 79 20 66 69 6c 65 73 2c 20 6f 6e 6c 79 20 75 73  y files, only us
24a30 65 64 20 77 68 65 6e 20 4c 4f 43 4b 50 52 4f 58  ed when LOCKPROX
24a40 59 44 49 52 20 69 73 20 6e 6f 74 20 73 65 74 2e  YDIR is not set.
24a50 0a 2a 2a 20 20 20 20 0a 2a 2a 20 20 20 20 0a 2a  .**    .**    .*
24a60 2a 20 41 73 20 6d 65 6e 74 69 6f 6e 65 64 20 61  * As mentioned a
24a70 62 6f 76 65 2c 20 77 68 65 6e 20 63 6f 6d 70 69  bove, when compi
24a80 6c 65 64 20 77 69 74 68 20 53 51 4c 49 54 45 5f  led with SQLITE_
24a90 50 52 45 46 45 52 5f 50 52 4f 58 59 5f 4c 4f 43  PREFER_PROXY_LOC
24aa0 4b 49 4e 47 2c 0a 2a 2a 20 73 65 74 74 69 6e 67  KING,.** setting
24ab0 20 74 68 65 20 65 6e 76 69 72 6f 6e 6d 65 6e 74   the environment
24ac0 20 76 61 72 69 61 62 6c 65 20 53 51 4c 49 54 45   variable SQLITE
24ad0 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f 4c 4f 43  _FORCE_PROXY_LOC
24ae0 4b 49 4e 47 20 74 6f 20 31 20 77 69 6c 6c 0a 2a  KING to 1 will.*
24af0 2a 20 66 6f 72 63 65 20 70 72 6f 78 79 20 6c 6f  * force proxy lo
24b00 63 6b 69 6e 67 20 74 6f 20 62 65 20 75 73 65 64  cking to be used
24b10 20 66 6f 72 20 65 76 65 72 79 20 64 61 74 61 62   for every datab
24b20 61 73 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 2c  ase file opened,
24b30 20 61 6e 64 20 30 0a 2a 2a 20 77 69 6c 6c 20 66   and 0.** will f
24b40 6f 72 63 65 20 61 75 74 6f 6d 61 74 69 63 20 70  orce automatic p
24b50 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 74 6f 20  roxy locking to 
24b60 62 65 20 64 69 73 61 62 6c 65 64 20 66 6f 72 20  be disabled for 
24b70 61 6c 6c 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  all database.** 
24b80 66 69 6c 65 73 20 28 65 78 70 6c 69 63 69 74 79  files (explicity
24b90 20 63 61 6c 6c 69 6e 67 20 74 68 65 20 53 51 4c   calling the SQL
24ba0 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58  ITE_SET_LOCKPROX
24bb0 59 46 49 4c 45 20 70 72 61 67 6d 61 20 6f 72 0a  YFILE pragma or.
24bc0 2a 2a 20 73 71 6c 69 74 65 5f 66 69 6c 65 5f 63  ** sqlite_file_c
24bd0 6f 6e 74 72 6f 6c 20 41 50 49 20 69 73 20 6e 6f  ontrol API is no
24be0 74 20 61 66 66 65 63 74 65 64 20 62 79 20 53 51  t affected by SQ
24bf0 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59  LITE_FORCE_PROXY
24c00 5f 4c 4f 43 4b 49 4e 47 29 2e 0a 2a 2f 0a 0a 2f  _LOCKING)..*/../
24c10 2a 0a 2a 2a 20 50 72 6f 78 79 20 6c 6f 63 6b 69  *.** Proxy locki
24c20 6e 67 20 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c  ng is only avail
24c30 61 62 6c 65 20 6f 6e 20 4d 61 63 4f 53 58 20 0a  able on MacOSX .
24c40 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  */.#if defined(_
24c50 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c  _APPLE__) && SQL
24c60 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
24c70 4e 47 5f 53 54 59 4c 45 0a 0a 23 69 66 64 65 66  NG_STYLE..#ifdef
24c80 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 20   SQLITE_TEST./* 
24c90 73 69 6d 75 6c 61 74 65 20 6d 75 6c 74 69 70 6c  simulate multipl
24ca0 65 20 68 6f 73 74 73 20 62 79 20 63 72 65 61 74  e hosts by creat
24cb0 69 6e 67 20 75 6e 69 71 75 65 20 68 6f 73 74 69  ing unique hosti
24cc0 64 20 66 69 6c 65 20 70 61 74 68 73 20 2a 2f 0a  d file paths */.
24cd0 69 6e 74 20 73 71 6c 69 74 65 33 5f 68 6f 73 74  int sqlite3_host
24ce0 69 64 5f 6e 75 6d 20 3d 20 30 3b 0a 23 65 6e 64  id_num = 0;.#end
24cf0 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 72  if../*.** The pr
24d00 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  oxyLockingContex
24d10 74 20 68 61 73 20 74 68 65 20 70 61 74 68 20 61  t has the path a
24d20 6e 64 20 66 69 6c 65 20 73 74 72 75 63 74 75 72  nd file structur
24d30 65 73 20 66 6f 72 20 74 68 65 20 72 65 6d 6f 74  es for the remot
24d40 65 20 0a 2a 2a 20 61 6e 64 20 6c 6f 63 61 6c 20  e .** and local 
24d50 70 72 6f 78 79 20 66 69 6c 65 73 20 69 6e 20 69  proxy files in i
24d60 74 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  t.*/.typedef str
24d70 75 63 74 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67  uct proxyLocking
24d80 43 6f 6e 74 65 78 74 20 70 72 6f 78 79 4c 6f 63  Context proxyLoc
24d90 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 73 74 72  kingContext;.str
24da0 75 63 74 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67  uct proxyLocking
24db0 43 6f 6e 74 65 78 74 20 7b 0a 20 20 75 6e 69 78  Context {.  unix
24dc0 46 69 6c 65 20 2a 63 6f 6e 63 68 46 69 6c 65 3b  File *conchFile;
24dd0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e           /* Open
24de0 20 63 6f 6e 63 68 20 66 69 6c 65 20 2a 2f 0a 20   conch file */. 
24df0 20 63 68 61 72 20 2a 63 6f 6e 63 68 46 69 6c 65   char *conchFile
24e00 50 61 74 68 3b 20 20 20 20 20 20 20 20 20 2f 2a  Path;         /*
24e10 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6e   Name of the con
24e20 63 68 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69  ch file */.  uni
24e30 78 46 69 6c 65 20 2a 6c 6f 63 6b 50 72 6f 78 79  xFile *lockProxy
24e40 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65  ;         /* Ope
24e50 6e 20 70 72 6f 78 79 20 6c 6f 63 6b 20 66 69 6c  n proxy lock fil
24e60 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 6c 6f 63  e */.  char *loc
24e70 6b 50 72 6f 78 79 50 61 74 68 3b 20 20 20 20 20  kProxyPath;     
24e80 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
24e90 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b 20 66 69  he proxy lock fi
24ea0 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 64 62  le */.  char *db
24eb0 50 61 74 68 3b 20 20 20 20 20 20 20 20 20 20 20  Path;           
24ec0 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
24ed0 74 68 65 20 6f 70 65 6e 20 66 69 6c 65 20 2a 2f  the open file */
24ee0 0a 20 20 69 6e 74 20 63 6f 6e 63 68 48 65 6c 64  .  int conchHeld
24ef0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
24f00 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 63  /* True if the c
24f10 6f 6e 63 68 20 69 73 20 63 75 72 72 65 6e 74 6c  onch is currentl
24f20 79 20 68 65 6c 64 20 2a 2f 0a 20 20 76 6f 69 64  y held */.  void
24f30 20 2a 6f 6c 64 4c 6f 63 6b 69 6e 67 43 6f 6e 74   *oldLockingCont
24f40 65 78 74 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67  ext;     /* Orig
24f50 69 6e 61 6c 20 6c 6f 63 6b 69 6e 67 63 6f 6e 74  inal lockingcont
24f60 65 78 74 20 74 6f 20 72 65 73 74 6f 72 65 20 6f  ext to restore o
24f70 6e 20 63 6c 6f 73 65 20 2a 2f 0a 20 20 73 71 6c  n close */.  sql
24f80 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
24f90 63 6f 6e 73 74 20 2a 70 4f 6c 64 4d 65 74 68 6f  const *pOldMetho
24fa0 64 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e  d;     /* Origin
24fb0 61 6c 20 49 2f 4f 20 6d 65 74 68 6f 64 73 20 66  al I/O methods f
24fc0 6f 72 20 63 6c 6f 73 65 20 2a 2f 0a 7d 3b 0a 0a  or close */.};..
24fd0 2f 2a 20 48 4f 53 54 49 44 4c 45 4e 20 61 6e 64  /* HOSTIDLEN and
24fe0 20 43 4f 4e 43 48 4c 45 4e 20 62 6f 74 68 20 69   CONCHLEN both i
24ff0 6e 63 6c 75 64 65 20 73 70 61 63 65 20 66 6f 72  nclude space for
25000 20 74 68 65 20 73 74 72 69 6e 67 20 0a 2a 2a 20   the string .** 
25010 74 65 72 6d 69 6e 61 74 69 6e 67 20 6e 75 6c 20  terminating nul 
25020 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 48 4f 53 54  .*/.#define HOST
25030 49 44 4c 45 4e 20 20 20 20 20 20 20 20 20 31 32  IDLEN         12
25040 38 0a 23 64 65 66 69 6e 65 20 43 4f 4e 43 48 4c  8.#define CONCHL
25050 45 4e 20 20 20 20 20 20 20 20 20 20 28 4d 41 58  EN          (MAX
25060 50 41 54 48 4c 45 4e 2b 48 4f 53 54 49 44 4c 45  PATHLEN+HOSTIDLE
25070 4e 2b 31 29 0a 23 69 66 6e 64 65 66 20 48 4f 53  N+1).#ifndef HOS
25080 54 49 44 50 41 54 48 0a 23 20 64 65 66 69 6e 65  TIDPATH.# define
25090 20 48 4f 53 54 49 44 50 41 54 48 20 20 20 20 20   HOSTIDPATH     
250a0 20 20 22 2f 4c 69 62 72 61 72 79 2f 43 61 63 68    "/Library/Cach
250b0 65 73 2f 2e 63 6f 6d 2e 61 70 70 6c 65 2e 73 71  es/.com.apple.sq
250c0 6c 69 74 65 43 6f 6e 63 68 48 6f 73 74 49 64 22  liteConchHostId"
250d0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 62 61 73 69  .#endif../* basi
250e0 63 61 6c 6c 79 20 61 20 63 6f 70 79 20 6f 66 20  cally a copy of 
250f0 75 6e 69 78 52 61 6e 64 6f 6d 6e 65 73 73 20 77  unixRandomness w
25100 69 74 68 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a  ith different.**
25110 20 74 65 73 74 20 62 65 68 61 76 69 6f 72 20 62   test behavior b
25120 75 69 6c 74 20 69 6e 20 2a 2f 0a 73 74 61 74 69  uilt in */.stati
25130 63 20 69 6e 74 20 70 72 6f 78 79 47 65 6e 65 72  c int proxyGener
25140 61 74 65 48 6f 73 74 49 44 28 63 68 61 72 20 2a  ateHostID(char *
25150 70 48 6f 73 74 49 44 29 7b 0a 20 20 69 6e 74 20  pHostID){.  int 
25160 70 69 64 2c 20 66 64 2c 20 6c 65 6e 3b 0a 20 20  pid, fd, len;.  
25170 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6b  unsigned char *k
25180 65 79 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63  ey = (unsigned c
25190 68 61 72 20 2a 29 70 48 6f 73 74 49 44 3b 0a 20  har *)pHostID;. 
251a0 20 0a 20 20 6d 65 6d 73 65 74 28 6b 65 79 2c 20   .  memset(key, 
251b0 30 2c 20 48 4f 53 54 49 44 4c 45 4e 29 3b 0a 20  0, HOSTIDLEN);. 
251c0 20 6c 65 6e 20 3d 20 30 3b 0a 20 20 66 64 20 3d   len = 0;.  fd =
251d0 20 6f 70 65 6e 28 22 2f 64 65 76 2f 75 72 61 6e   open("/dev/uran
251e0 64 6f 6d 22 2c 20 4f 5f 52 44 4f 4e 4c 59 29 3b  dom", O_RDONLY);
251f0 0a 20 20 69 66 28 20 66 64 3e 3d 30 20 29 7b 0a  .  if( fd>=0 ){.
25200 20 20 20 20 6c 65 6e 20 3d 20 72 65 61 64 28 66      len = read(f
25210 64 2c 20 6b 65 79 2c 20 48 4f 53 54 49 44 4c 45  d, key, HOSTIDLE
25220 4e 29 3b 0a 20 20 20 20 63 6c 6f 73 65 28 66 64  N);.    close(fd
25230 29 3b 20 2f 2a 20 73 69 6c 65 6e 74 6c 79 20 6c  ); /* silently l
25240 65 61 6b 20 74 68 65 20 66 64 20 69 66 20 69 74  eak the fd if it
25250 20 66 61 69 6c 73 20 2a 2f 0a 20 20 7d 0a 20 20   fails */.  }.  
25260 69 66 28 20 6c 65 6e 20 3c 20 48 4f 53 54 49 44  if( len < HOSTID
25270 4c 45 4e 20 29 7b 0a 20 20 20 20 74 69 6d 65 5f  LEN ){.    time_
25280 74 20 74 3b 0a 20 20 20 20 74 69 6d 65 28 26 74  t t;.    time(&t
25290 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 6b 65  );.    memcpy(ke
252a0 79 2c 20 26 74 2c 20 73 69 7a 65 6f 66 28 74 29  y, &t, sizeof(t)
252b0 29 3b 0a 20 20 20 20 70 69 64 20 3d 20 67 65 74  );.    pid = get
252c0 70 69 64 28 29 3b 0a 20 20 20 20 6d 65 6d 63 70  pid();.    memcp
252d0 79 28 26 6b 65 79 5b 73 69 7a 65 6f 66 28 74 29  y(&key[sizeof(t)
252e0 5d 2c 20 26 70 69 64 2c 20 73 69 7a 65 6f 66 28  ], &pid, sizeof(
252f0 70 69 64 29 29 3b 0a 20 20 7d 0a 20 20 0a 23 69  pid));.  }.  .#i
25300 66 64 65 66 20 4d 41 4b 45 5f 50 52 45 54 54 59  fdef MAKE_PRETTY
25310 5f 48 4f 53 54 49 44 0a 20 20 7b 0a 20 20 20 20  _HOSTID.  {.    
25320 69 6e 74 20 69 3b 0a 20 20 20 20 2f 2a 20 66 69  int i;.    /* fi
25330 6c 74 65 72 20 74 68 65 20 62 79 74 65 73 20 69  lter the bytes i
25340 6e 74 6f 20 70 72 69 6e 74 61 62 6c 65 20 61 73  nto printable as
25350 63 69 69 20 63 68 61 72 61 63 74 65 72 73 20 61  cii characters a
25360 6e 64 20 4e 55 4c 20 74 65 72 6d 69 6e 61 74 65  nd NUL terminate
25370 20 2a 2f 0a 20 20 20 20 6b 65 79 5b 28 48 4f 53   */.    key[(HOS
25380 54 49 44 4c 45 4e 2d 31 29 5d 20 3d 20 30 78 30  TIDLEN-1)] = 0x0
25390 30 3b 0a 20 20 20 20 66 6f 72 28 20 69 3d 30 3b  0;.    for( i=0;
253a0 20 69 3c 28 48 4f 53 54 49 44 4c 45 4e 2d 31 29   i<(HOSTIDLEN-1)
253b0 3b 20 69 2b 2b 20 29 7b 0a 20 20 20 20 20 20 75  ; i++ ){.      u
253c0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 70 61 20  nsigned char pa 
253d0 3d 20 6b 65 79 5b 69 5d 26 30 78 37 46 3b 0a 20  = key[i]&0x7F;. 
253e0 20 20 20 20 20 69 66 28 20 70 61 3c 30 78 32 30       if( pa<0x20
253f0 20 29 7b 0a 20 20 20 20 20 20 20 20 6b 65 79 5b   ){.        key[
25400 69 5d 20 3d 20 28 6b 65 79 5b 69 5d 26 30 78 38  i] = (key[i]&0x8
25410 30 20 3d 3d 20 30 78 38 30 29 20 3f 20 70 61 2b  0 == 0x80) ? pa+
25420 30 78 34 30 20 3a 20 70 61 2b 30 78 32 30 3b 0a  0x40 : pa+0x20;.
25430 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
25440 70 61 3d 3d 30 78 37 46 20 29 7b 0a 20 20 20 20  pa==0x7F ){.    
25450 20 20 20 20 6b 65 79 5b 69 5d 20 3d 20 28 6b 65      key[i] = (ke
25460 79 5b 69 5d 26 30 78 38 30 20 3d 3d 20 30 78 38  y[i]&0x80 == 0x8
25470 30 29 20 3f 20 70 61 3d 30 78 32 30 20 3a 20 70  0) ? pa=0x20 : p
25480 61 2b 30 78 37 45 3b 0a 20 20 20 20 20 20 7d 0a  a+0x7E;.      }.
25490 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
254a0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
254b0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 77 72 69 74 65  _OK;.}../* write
254c0 73 20 74 68 65 20 68 6f 73 74 20 69 64 20 70 61  s the host id pa
254d0 74 68 20 74 6f 20 70 61 74 68 2c 20 70 61 74 68  th to path, path
254e0 20 73 68 6f 75 6c 64 20 62 65 20 61 6e 20 70 72   should be an pr
254f0 65 2d 61 6c 6c 6f 63 61 74 65 64 20 62 75 66 66  e-allocated buff
25500 65 72 0a 2a 2a 20 77 69 74 68 20 65 6e 6f 75 67  er.** with enoug
25510 68 20 73 70 61 63 65 20 66 6f 72 20 61 20 70 61  h space for a pa
25520 74 68 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  th .*/.static vo
25530 69 64 20 70 72 6f 78 79 47 65 74 48 6f 73 74 49  id proxyGetHostI
25540 44 50 61 74 68 28 63 68 61 72 20 2a 70 61 74 68  DPath(char *path
25550 2c 20 73 69 7a 65 5f 74 20 6c 65 6e 29 7b 0a 20  , size_t len){. 
25560 20 73 74 72 6c 63 70 79 28 70 61 74 68 2c 20 48   strlcpy(path, H
25570 4f 53 54 49 44 50 41 54 48 2c 20 6c 65 6e 29 3b  OSTIDPATH, len);
25580 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
25590 45 53 54 0a 20 20 69 66 28 20 73 71 6c 69 74 65  EST.  if( sqlite
255a0 33 5f 68 6f 73 74 69 64 5f 6e 75 6d 3e 30 20 29  3_hostid_num>0 )
255b0 7b 0a 20 20 20 20 63 68 61 72 20 73 75 66 66 69  {.    char suffi
255c0 78 5b 32 5d 20 3d 20 22 31 22 3b 0a 20 20 20 20  x[2] = "1";.    
255d0 73 75 66 66 69 78 5b 30 5d 20 3d 20 73 75 66 66  suffix[0] = suff
255e0 69 78 5b 30 5d 20 2b 20 73 71 6c 69 74 65 33 5f  ix[0] + sqlite3_
255f0 68 6f 73 74 69 64 5f 6e 75 6d 3b 0a 20 20 20 20  hostid_num;.    
25600 73 74 72 6c 63 61 74 28 70 61 74 68 2c 20 73 75  strlcat(path, su
25610 66 66 69 78 2c 20 6c 65 6e 29 3b 0a 20 20 7d 0a  ffix, len);.  }.
25620 23 65 6e 64 69 66 0a 20 20 4f 53 54 52 41 43 45  #endif.  OSTRACE
25630 33 28 22 47 45 54 48 4f 53 54 49 44 50 41 54 48  3("GETHOSTIDPATH
25640 20 20 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c 20    %s pid=%d\n", 
25650 70 61 74 68 2c 20 67 65 74 70 69 64 28 29 29 3b  path, getpid());
25660 0a 7d 0a 0a 2f 2a 20 67 65 74 20 74 68 65 20 68  .}../* get the h
25670 6f 73 74 20 49 44 20 66 72 6f 6d 20 61 20 73 71  ost ID from a sq
25680 6c 69 74 65 20 68 6f 73 74 69 64 20 66 69 6c 65  lite hostid file
25690 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 0a   stored in the .
256a0 2a 2a 20 75 73 65 72 2d 73 70 65 63 69 66 69 63  ** user-specific
256b0 20 74 6d 70 20 64 69 72 65 63 74 6f 72 79 2c 20   tmp directory, 
256c0 63 72 65 61 74 65 20 74 68 65 20 49 44 20 69 66  create the ID if
256d0 20 69 74 27 73 20 6e 6f 74 20 74 68 65 72 65 20   it's not there 
256e0 61 6c 72 65 61 64 79 20 0a 2a 2f 0a 73 74 61 74  already .*/.stat
256f0 69 63 20 69 6e 74 20 70 72 6f 78 79 47 65 74 48  ic int proxyGetH
25700 6f 73 74 49 44 28 63 68 61 72 20 2a 70 48 6f 73  ostID(char *pHos
25710 74 49 44 2c 20 69 6e 74 20 2a 70 45 72 72 6f 72  tID, int *pError
25720 29 7b 0a 20 20 69 6e 74 20 66 64 3b 0a 20 20 63  ){.  int fd;.  c
25730 68 61 72 20 70 61 74 68 5b 4d 41 58 50 41 54 48  har path[MAXPATH
25740 4c 45 4e 5d 3b 20 0a 20 20 73 69 7a 65 5f 74 20  LEN]; .  size_t 
25750 6c 65 6e 3b 0a 20 20 69 6e 74 20 72 63 3d 53 51  len;.  int rc=SQ
25760 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 70 72 6f 78  LITE_OK;..  prox
25770 79 47 65 74 48 6f 73 74 49 44 50 61 74 68 28 70  yGetHostIDPath(p
25780 61 74 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29  ath, MAXPATHLEN)
25790 3b 0a 20 20 2f 2a 20 74 72 79 20 74 6f 20 63 72  ;.  /* try to cr
257a0 65 61 74 65 20 74 68 65 20 68 6f 73 74 20 49 44  eate the host ID
257b0 20 66 69 6c 65 2c 20 69 66 20 69 74 20 61 6c 72   file, if it alr
257c0 65 61 64 79 20 65 78 69 73 74 73 20 72 65 61 64  eady exists read
257d0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 2a 2f   the contents */
257e0 0a 20 20 66 64 20 3d 20 6f 70 65 6e 28 70 61 74  .  fd = open(pat
257f0 68 2c 20 4f 5f 43 52 45 41 54 7c 4f 5f 57 52 4f  h, O_CREAT|O_WRO
25800 4e 4c 59 7c 4f 5f 45 58 43 4c 2c 20 30 36 34 34  NLY|O_EXCL, 0644
25810 29 3b 0a 20 20 69 66 28 20 66 64 3c 30 20 29 7b  );.  if( fd<0 ){
25820 0a 20 20 20 20 69 6e 74 20 65 72 72 3d 65 72 72  .    int err=err
25830 6e 6f 3b 0a 09 09 0a 20 20 20 20 69 66 28 20 65  no;....    if( e
25840 72 72 21 3d 45 45 58 49 53 54 20 29 7b 0a 23 69  rr!=EEXIST ){.#i
25850 66 64 65 66 20 53 51 4c 49 54 45 5f 50 52 4f 58  fdef SQLITE_PROX
25860 59 5f 44 45 42 55 47 20 2f 2a 20 73 65 74 20 74  Y_DEBUG /* set t
25870 68 65 20 73 71 6c 69 74 65 20 65 72 72 6f 72 20  he sqlite error 
25880 6d 65 73 73 61 67 65 20 69 6e 73 74 65 61 64 20  message instead 
25890 2a 2f 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  */.      fprintf
258a0 28 73 74 64 65 72 72 2c 20 22 73 71 6c 69 74 65  (stderr, "sqlite
258b0 20 65 72 72 6f 72 20 63 72 65 61 74 69 6e 67 20   error creating 
258c0 68 6f 73 74 20 49 44 20 66 69 6c 65 20 25 73 3a  host ID file %s:
258d0 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20   %s\n",.        
258e0 20 20 20 20 20 20 70 61 74 68 2c 20 73 74 72 65        path, stre
258f0 72 72 6f 72 28 65 72 72 29 29 3b 0a 23 65 6e 64  rror(err));.#end
25900 69 66 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  if.      return 
25910 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20 20  SQLITE_PERM;.   
25920 20 7d 0a 20 20 20 20 2f 2a 20 63 6f 75 6c 64 6e   }.    /* couldn
25930 27 74 20 63 72 65 61 74 65 20 74 68 65 20 66 69  't create the fi
25940 6c 65 2c 20 72 65 61 64 20 69 74 20 69 6e 73 74  le, read it inst
25950 65 61 64 20 2a 2f 0a 20 20 20 20 66 64 20 3d 20  ead */.    fd = 
25960 6f 70 65 6e 28 70 61 74 68 2c 20 4f 5f 52 44 4f  open(path, O_RDO
25970 4e 4c 59 7c 4f 5f 45 58 43 4c 29 3b 0a 20 20 20  NLY|O_EXCL);.   
25980 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 23 69 66   if( fd<0 ){.#if
25990 64 65 66 20 53 51 4c 49 54 45 5f 50 52 4f 58 59  def SQLITE_PROXY
259a0 5f 44 45 42 55 47 20 2f 2a 20 73 65 74 20 74 68  _DEBUG /* set th
259b0 65 20 73 71 6c 69 74 65 20 65 72 72 6f 72 20 6d  e sqlite error m
259c0 65 73 73 61 67 65 20 69 6e 73 74 65 61 64 20 2a  essage instead *
259d0 2f 0a 20 20 20 20 20 20 69 6e 74 20 65 72 72 20  /.      int err 
259e0 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 66  = errno;.      f
259f0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
25a00 73 71 6c 69 74 65 20 65 72 72 6f 72 20 6f 70 65  sqlite error ope
25a10 6e 69 6e 67 20 68 6f 73 74 20 49 44 20 66 69 6c  ning host ID fil
25a20 65 20 25 73 3a 20 25 73 5c 6e 22 2c 0a 20 20 20  e %s: %s\n",.   
25a30 20 20 20 20 20 20 20 20 20 20 20 70 61 74 68 2c             path,
25a40 20 73 74 72 65 72 72 6f 72 28 65 72 72 29 29 3b   strerror(err));
25a50 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 72 65  .#endif.      re
25a60 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d  turn SQLITE_PERM
25a70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20  ;.    }.    len 
25a80 3d 20 70 72 65 61 64 28 66 64 2c 20 70 48 6f 73  = pread(fd, pHos
25a90 74 49 44 2c 20 48 4f 53 54 49 44 4c 45 4e 2c 20  tID, HOSTIDLEN, 
25aa0 30 29 3b 0a 20 20 20 20 69 66 28 20 6c 65 6e 3c  0);.    if( len<
25ab0 30 20 29 7b 0a 20 20 20 20 20 20 2a 70 45 72 72  0 ){.      *pErr
25ac0 6f 72 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  or = errno;.    
25ad0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
25ae0 45 52 52 5f 52 45 41 44 3b 0a 20 20 20 20 7d 65  ERR_READ;.    }e
25af0 6c 73 65 20 69 66 28 20 6c 65 6e 3c 48 4f 53 54  lse if( len<HOST
25b00 49 44 4c 45 4e 20 29 7b 0a 20 20 20 20 20 20 2a  IDLEN ){.      *
25b10 70 45 72 72 6f 72 20 3d 20 30 3b 0a 20 20 20 20  pError = 0;.    
25b20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
25b30 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 3b 0a  ERR_SHORT_READ;.
25b40 20 20 20 20 7d 0a 20 20 20 20 63 6c 6f 73 65 28      }.    close(
25b50 66 64 29 3b 20 2f 2a 20 73 69 6c 65 6e 74 6c 79  fd); /* silently
25b60 20 6c 65 61 6b 20 74 68 65 20 66 64 20 69 66 20   leak the fd if 
25b70 69 74 20 66 61 69 6c 73 20 2a 2f 0a 20 20 20 20  it fails */.    
25b80 4f 53 54 52 41 43 45 33 28 22 47 45 54 48 4f 53  OSTRACE3("GETHOS
25b90 54 49 44 20 20 72 65 61 64 20 25 73 20 70 69 64  TID  read %s pid
25ba0 3d 25 64 5c 6e 22 2c 20 70 48 6f 73 74 49 44 2c  =%d\n", pHostID,
25bb0 20 67 65 74 70 69 64 28 29 29 3b 0a 20 20 20 20   getpid());.    
25bc0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 65 6c  return rc;.  }el
25bd0 73 65 7b 0a 20 20 20 20 2f 2a 20 77 65 27 72 65  se{.    /* we're
25be0 20 63 72 65 61 74 69 6e 67 20 74 68 65 20 68 6f   creating the ho
25bf0 73 74 20 49 44 20 66 69 6c 65 20 28 75 73 65 20  st ID file (use 
25c00 61 20 72 61 6e 64 6f 6d 20 73 74 72 69 6e 67 20  a random string 
25c10 6f 66 20 62 79 74 65 73 29 20 2a 2f 0a 20 20 20  of bytes) */.   
25c20 20 70 72 6f 78 79 47 65 6e 65 72 61 74 65 48 6f   proxyGenerateHo
25c30 73 74 49 44 28 70 48 6f 73 74 49 44 29 3b 0a 20  stID(pHostID);. 
25c40 20 20 20 6c 65 6e 20 3d 20 70 77 72 69 74 65 28     len = pwrite(
25c50 66 64 2c 20 70 48 6f 73 74 49 44 2c 20 48 4f 53  fd, pHostID, HOS
25c60 54 49 44 4c 45 4e 2c 20 30 29 3b 0a 20 20 20 20  TIDLEN, 0);.    
25c70 69 66 28 20 6c 65 6e 3c 30 20 29 7b 0a 20 20 20  if( len<0 ){.   
25c80 20 20 20 2a 70 45 72 72 6f 72 20 3d 20 65 72 72     *pError = err
25c90 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  no;.      rc = S
25ca0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54  QLITE_IOERR_WRIT
25cb0 45 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  E;.    }else if(
25cc0 20 6c 65 6e 3c 48 4f 53 54 49 44 4c 45 4e 20 29   len<HOSTIDLEN )
25cd0 7b 0a 20 20 20 20 20 20 2a 70 45 72 72 6f 72 20  {.      *pError 
25ce0 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = 0;.      rc = 
25cf0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52 49  SQLITE_IOERR_WRI
25d00 54 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 6c  TE;.    }.    cl
25d10 6f 73 65 28 66 64 29 3b 20 2f 2a 20 73 69 6c 65  ose(fd); /* sile
25d20 6e 74 6c 79 20 6c 65 61 6b 20 74 68 65 20 66 64  ntly leak the fd
25d30 20 69 66 20 69 74 20 66 61 69 6c 73 20 2a 2f 0a   if it fails */.
25d40 20 20 20 20 4f 53 54 52 41 43 45 33 28 22 47 45      OSTRACE3("GE
25d50 54 48 4f 53 54 49 44 20 20 77 72 6f 74 65 20 25  THOSTID  wrote %
25d60 73 20 70 69 64 3d 25 64 5c 6e 22 2c 20 70 48 6f  s pid=%d\n", pHo
25d70 73 74 49 44 2c 20 67 65 74 70 69 64 28 29 29 3b  stID, getpid());
25d80 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
25d90 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e    }.}..static in
25da0 74 20 70 72 6f 78 79 47 65 74 4c 6f 63 6b 50 61  t proxyGetLockPa
25db0 74 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 64  th(const char *d
25dc0 62 50 61 74 68 2c 20 63 68 61 72 20 2a 6c 50 61  bPath, char *lPa
25dd0 74 68 2c 20 73 69 7a 65 5f 74 20 6d 61 78 4c 65  th, size_t maxLe
25de0 6e 29 7b 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a 20  n){.  int len;. 
25df0 20 69 6e 74 20 64 62 4c 65 6e 3b 0a 20 20 69 6e   int dbLen;.  in
25e00 74 20 69 3b 0a 0a 23 69 66 64 65 66 20 4c 4f 43  t i;..#ifdef LOC
25e10 4b 50 52 4f 58 59 44 49 52 0a 20 20 6c 65 6e 20  KPROXYDIR.  len 
25e20 3d 20 73 74 72 6c 63 70 79 28 6c 50 61 74 68 2c  = strlcpy(lPath,
25e30 20 4c 4f 43 4b 50 52 4f 58 59 44 49 52 2c 20 6d   LOCKPROXYDIR, m
25e40 61 78 4c 65 6e 29 3b 0a 23 65 6c 73 65 0a 23 20  axLen);.#else.# 
25e50 69 66 64 65 66 20 5f 43 53 5f 44 41 52 57 49 4e  ifdef _CS_DARWIN
25e60 5f 55 53 45 52 5f 54 45 4d 50 5f 44 49 52 0a 20  _USER_TEMP_DIR. 
25e70 20 7b 0a 20 20 20 20 63 6f 6e 66 73 74 72 28 5f   {.    confstr(_
25e80 43 53 5f 44 41 52 57 49 4e 5f 55 53 45 52 5f 54  CS_DARWIN_USER_T
25e90 45 4d 50 5f 44 49 52 2c 20 6c 50 61 74 68 2c 20  EMP_DIR, lPath, 
25ea0 6d 61 78 4c 65 6e 29 3b 0a 20 20 20 20 6c 65 6e  maxLen);.    len
25eb0 20 3d 20 73 74 72 6c 63 61 74 28 6c 50 61 74 68   = strlcat(lPath
25ec0 2c 20 22 73 71 6c 69 74 65 70 6c 6f 63 6b 73 22  , "sqliteplocks"
25ed0 2c 20 6d 61 78 4c 65 6e 29 3b 0a 20 20 20 20 69  , maxLen);.    i
25ee0 66 28 20 6d 6b 64 69 72 28 6c 50 61 74 68 2c 20  f( mkdir(lPath, 
25ef0 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50  SQLITE_DEFAULT_P
25f00 52 4f 58 59 44 49 52 5f 50 45 52 4d 49 53 53 49  ROXYDIR_PERMISSI
25f10 4f 4e 53 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  ONS) ){.      /*
25f20 20 69 66 20 6d 6b 64 69 72 20 66 61 69 6c 73 2c   if mkdir fails,
25f30 20 68 61 6e 64 6c 65 20 61 73 20 6c 6f 63 6b 20   handle as lock 
25f40 66 69 6c 65 20 63 72 65 61 74 69 6f 6e 20 66 61  file creation fa
25f50 69 6c 75 72 65 20 2a 2f 0a 23 20 20 69 66 64 65  ilure */.#  ifde
25f60 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
25f70 20 20 20 20 20 69 6e 74 20 65 72 72 20 3d 20 65       int err = e
25f80 72 72 6e 6f 3b 0a 20 20 20 20 20 20 69 66 28 20  rrno;.      if( 
25f90 65 72 72 21 3d 45 45 58 49 53 54 20 29 7b 0a 20  err!=EEXIST ){. 
25fa0 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73         fprintf(s
25fb0 74 64 65 72 72 2c 20 22 70 72 6f 78 79 47 65 74  tderr, "proxyGet
25fc0 4c 6f 63 6b 50 61 74 68 3a 20 6d 6b 64 69 72 28  LockPath: mkdir(
25fd0 25 73 2c 30 25 6f 29 20 65 72 72 6f 72 20 25 64  %s,0%o) error %d
25fe0 20 25 73 5c 6e 22 2c 20 6c 50 61 74 68 2c 0a 20   %s\n", lPath,. 
25ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
26000 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 52  QLITE_DEFAULT_PR
26010 4f 58 59 44 49 52 5f 50 45 52 4d 49 53 53 49 4f  OXYDIR_PERMISSIO
26020 4e 53 2c 20 65 72 72 2c 20 73 74 72 65 72 72 6f  NS, err, strerro
26030 72 28 65 72 72 29 29 3b 0a 20 20 20 20 20 20 7d  r(err));.      }
26040 0a 23 20 20 65 6e 64 69 66 0a 20 20 20 20 7d 65  .#  endif.    }e
26050 6c 73 65 7b 0a 20 20 20 20 20 20 4f 53 54 52 41  lse{.      OSTRA
26060 43 45 33 28 22 47 45 54 4c 4f 43 4b 50 41 54 48  CE3("GETLOCKPATH
26070 20 20 6d 6b 64 69 72 20 25 73 20 70 69 64 3d 25    mkdir %s pid=%
26080 64 5c 6e 22 2c 20 6c 50 61 74 68 2c 20 67 65 74  d\n", lPath, get
26090 70 69 64 28 29 29 3b 0a 20 20 20 20 7d 0a 20 20  pid());.    }.  
260a0 20 20 0a 20 20 7d 0a 23 20 65 6c 73 65 0a 20 20    .  }.# else.  
260b0 6c 65 6e 20 3d 20 73 74 72 6c 63 70 79 28 6c 50  len = strlcpy(lP
260c0 61 74 68 2c 20 22 2f 74 6d 70 2f 22 2c 20 6d 61  ath, "/tmp/", ma
260d0 78 4c 65 6e 29 3b 0a 23 20 65 6e 64 69 66 0a 23  xLen);.# endif.#
260e0 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 6c 50 61  endif..  if( lPa
260f0 74 68 5b 6c 65 6e 2d 31 5d 21 3d 27 2f 27 20 29  th[len-1]!='/' )
26100 7b 0a 20 20 20 20 6c 65 6e 20 3d 20 73 74 72 6c  {.    len = strl
26110 63 61 74 28 6c 50 61 74 68 2c 20 22 2f 22 2c 20  cat(lPath, "/", 
26120 6d 61 78 4c 65 6e 29 3b 0a 20 20 7d 0a 20 20 0a  maxLen);.  }.  .
26130 20 20 2f 2a 20 74 72 61 6e 73 66 6f 72 6d 20 74    /* transform t
26140 68 65 20 64 62 20 70 61 74 68 20 74 6f 20 61 20  he db path to a 
26150 75 6e 69 71 75 65 20 63 61 63 68 65 20 6e 61 6d  unique cache nam
26160 65 20 2a 2f 0a 20 20 64 62 4c 65 6e 20 3d 20 28  e */.  dbLen = (
26170 69 6e 74 29 73 74 72 6c 65 6e 28 64 62 50 61 74  int)strlen(dbPat
26180 68 29 3b 0a 20 20 66 6f 72 28 20 69 3d 30 3b 20  h);.  for( i=0; 
26190 69 3c 64 62 4c 65 6e 20 26 26 20 28 69 2b 6c 65  i<dbLen && (i+le
261a0 6e 2b 37 29 3c 6d 61 78 4c 65 6e 3b 20 69 2b 2b  n+7)<maxLen; i++
261b0 29 7b 0a 20 20 20 20 63 68 61 72 20 63 20 3d 20  ){.    char c = 
261c0 64 62 50 61 74 68 5b 69 5d 3b 0a 20 20 20 20 6c  dbPath[i];.    l
261d0 50 61 74 68 5b 69 2b 6c 65 6e 5d 20 3d 20 28 63  Path[i+len] = (c
261e0 3d 3d 27 2f 27 29 3f 27 5f 27 3a 63 3b 0a 20 20  =='/')?'_':c;.  
261f0 7d 0a 20 20 6c 50 61 74 68 5b 69 2b 6c 65 6e 5d  }.  lPath[i+len]
26200 3d 27 5c 30 27 3b 0a 20 20 73 74 72 6c 63 61 74  ='\0';.  strlcat
26210 28 6c 50 61 74 68 2c 20 22 3a 61 75 74 6f 3a 22  (lPath, ":auto:"
26220 2c 20 6d 61 78 4c 65 6e 29 3b 0a 20 20 72 65 74  , maxLen);.  ret
26230 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
26240 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
26250 20 6e 65 77 20 56 46 53 20 66 69 6c 65 20 64 65   new VFS file de
26260 73 63 72 69 70 74 6f 72 20 28 73 74 6f 72 65 64  scriptor (stored
26270 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69   in memory obtai
26280 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69  ned from.** sqli
26290 74 65 33 5f 6d 61 6c 6c 6f 63 29 20 61 6e 64 20  te3_malloc) and 
262a0 6f 70 65 6e 20 74 68 65 20 66 69 6c 65 20 6e 61  open the file na
262b0 6d 65 64 20 22 70 61 74 68 22 20 69 6e 20 74 68  med "path" in th
262c0 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
262d0 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c  r..**.** The cal
262e0 6c 65 72 20 69 73 20 72 65 73 70 6f 6e 73 69 62  ler is responsib
262f0 6c 65 20 6e 6f 74 20 6f 6e 6c 79 20 66 6f 72 20  le not only for 
26300 63 6c 6f 73 69 6e 67 20 74 68 65 20 66 69 6c 65  closing the file
26310 20 64 65 73 63 72 69 70 74 6f 72 0a 2a 2a 20 62   descriptor.** b
26320 75 74 20 61 6c 73 6f 20 66 6f 72 20 66 72 65 65  ut also for free
26330 69 6e 67 20 74 68 65 20 6d 65 6d 6f 72 79 20 61  ing the memory a
26340 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
26350 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
26360 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  or..*/.static in
26370 74 20 70 72 6f 78 79 43 72 65 61 74 65 55 6e 69  t proxyCreateUni
26380 78 46 69 6c 65 28 63 6f 6e 73 74 20 63 68 61 72  xFile(const char
26390 20 2a 70 61 74 68 2c 20 75 6e 69 78 46 69 6c 65   *path, unixFile
263a0 20 2a 2a 70 70 46 69 6c 65 29 20 7b 0a 20 20 75   **ppFile) {.  u
263b0 6e 69 78 46 69 6c 65 20 2a 70 4e 65 77 3b 0a 20  nixFile *pNew;. 
263c0 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 53 51 4c   int flags = SQL
263d0 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
263e0 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45  |SQLITE_OPEN_CRE
263f0 41 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ATE|SQLITE_OPEN_
26400 52 45 41 44 57 52 49 54 45 3b 0a 20 20 69 6e 74  READWRITE;.  int
26410 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
26420 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 64  .  sqlite3_vfs d
26430 75 6d 6d 79 56 66 73 3b 0a 0a 20 20 70 4e 65 77  ummyVfs;..  pNew
26440 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 73   = (unixFile *)s
26450 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69  qlite3_malloc(si
26460 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65 29 29 3b  zeof(unixFile));
26470 0a 20 20 69 66 28 20 21 70 4e 65 77 20 29 7b 0a  .  if( !pNew ){.
26480 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
26490 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 6d  E_NOMEM;.  }.  m
264a0 65 6d 73 65 74 28 70 4e 65 77 2c 20 30 2c 20 73  emset(pNew, 0, s
264b0 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65 29 29  izeof(unixFile))
264c0 3b 0a 0a 20 20 2f 2a 20 43 61 6c 6c 20 75 6e 69  ;..  /* Call uni
264d0 78 4f 70 65 6e 28 29 20 74 6f 20 6f 70 65 6e 20  xOpen() to open 
264e0 74 68 65 20 70 72 6f 78 79 20 66 69 6c 65 2e 20  the proxy file. 
264f0 54 68 65 20 66 6c 61 67 73 20 70 61 73 73 65 64  The flags passed
26500 20 74 6f 20 75 6e 69 78 4f 70 65 6e 28 29 0a 20   to unixOpen(). 
26510 20 2a 2a 20 73 75 67 67 65 73 74 20 74 68 61 74   ** suggest that
26520 20 74 68 65 20 66 69 6c 65 20 62 65 69 6e 67 20   the file being 
26530 6f 70 65 6e 65 64 20 69 73 20 61 20 22 6d 61 69  opened is a "mai
26540 6e 20 64 61 74 61 62 61 73 65 22 2e 20 54 68 69  n database". Thi
26550 73 20 69 73 0a 20 20 2a 2a 20 6e 65 63 65 73 73  s is.  ** necess
26560 61 72 79 20 61 73 20 6f 74 68 65 72 20 66 69 6c  ary as other fil
26570 65 20 74 79 70 65 73 20 64 6f 20 6e 6f 74 20 6e  e types do not n
26580 65 63 65 73 73 61 72 69 6c 79 20 73 75 70 70 6f  ecessarily suppo
26590 72 74 20 6c 6f 63 6b 69 6e 67 2e 20 49 74 0a 20  rt locking. It. 
265a0 20 2a 2a 20 69 73 20 62 65 74 74 65 72 20 74 6f   ** is better to
265b0 20 75 73 65 20 75 6e 69 78 4f 70 65 6e 28 29 20   use unixOpen() 
265c0 69 6e 73 74 65 61 64 20 6f 66 20 6f 70 65 6e 69  instead of openi
265d0 6e 67 20 74 68 65 20 66 69 6c 65 20 64 69 72 65  ng the file dire
265e0 63 74 6c 79 20 77 69 74 68 0a 20 20 2a 2a 20 6f  ctly with.  ** o
265f0 70 65 6e 28 29 2c 20 61 73 20 75 6e 69 78 4f 70  pen(), as unixOp
26600 65 6e 28 29 20 73 65 74 73 20 75 70 20 74 68 65  en() sets up the
26610 20 76 61 72 69 6f 75 73 20 6d 65 63 68 61 6e 69   various mechani
26620 73 6d 73 20 72 65 71 75 69 72 65 64 20 74 6f 0a  sms required to.
26630 20 20 2a 2a 20 6d 61 6b 65 20 73 75 72 65 20 61    ** make sure a
26640 20 63 61 6c 6c 20 74 6f 20 63 6c 6f 73 65 28 29   call to close()
26650 20 64 6f 65 73 20 6e 6f 74 20 63 61 75 73 65 20   does not cause 
26660 74 68 65 20 73 79 73 74 65 6d 20 74 6f 20 64 69  the system to di
26670 73 63 61 72 64 0a 20 20 2a 2a 20 50 4f 53 49 58  scard.  ** POSIX
26680 20 6c 6f 63 6b 73 20 70 72 65 6d 61 74 75 72 65   locks premature
26690 6c 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 74  ly..  **.  ** It
266a0 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 68   is important th
266b0 61 74 20 74 68 65 20 78 4f 70 65 6e 20 6d 65 6d  at the xOpen mem
266c0 62 65 72 20 6f 66 20 74 68 65 20 56 46 53 20 6f  ber of the VFS o
266d0 62 6a 65 63 74 20 70 61 73 73 65 64 20 74 6f 20  bject passed to 
266e0 0a 20 20 2a 2a 20 75 6e 69 78 4f 70 65 6e 28 29  .  ** unixOpen()
266f0 20 69 73 20 4e 55 4c 4c 2e 20 54 68 69 73 20 74   is NULL. This t
26700 65 6c 6c 73 20 75 6e 69 78 4f 70 65 6e 28 29 20  ells unixOpen() 
26710 6d 61 79 20 74 72 79 20 74 6f 20 6f 70 65 6e 20  may try to open 
26720 61 20 70 72 6f 78 79 2d 66 69 6c 65 20 0a 20 20  a proxy-file .  
26730 2a 2a 20 66 6f 72 20 74 68 65 20 70 72 6f 78 79  ** for the proxy
26740 2d 66 69 6c 65 20 28 63 72 65 61 74 69 6e 67 20  -file (creating 
26750 61 20 70 6f 74 65 6e 74 69 61 6c 20 69 6e 66 69  a potential infi
26760 6e 69 74 65 20 6c 6f 6f 70 29 2e 0a 20 20 2a 2f  nite loop)..  */
26770 0a 20 20 64 75 6d 6d 79 56 66 73 2e 70 41 70 70  .  dummyVfs.pApp
26780 44 61 74 61 20 3d 20 28 76 6f 69 64 2a 29 26 61  Data = (void*)&a
26790 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 3b  utolockIoFinder;
267a0 0a 20 20 64 75 6d 6d 79 56 66 73 2e 78 4f 70 65  .  dummyVfs.xOpe
267b0 6e 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 75 6e  n = 0;.  rc = un
267c0 69 78 4f 70 65 6e 28 26 64 75 6d 6d 79 56 66 73  ixOpen(&dummyVfs
267d0 2c 20 70 61 74 68 2c 20 28 73 71 6c 69 74 65 33  , path, (sqlite3
267e0 5f 66 69 6c 65 20 2a 29 70 4e 65 77 2c 20 66 6c  _file *)pNew, fl
267f0 61 67 73 2c 20 26 66 6c 61 67 73 29 3b 0a 20 20  ags, &flags);.  
26800 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
26810 4b 20 26 26 20 28 66 6c 61 67 73 26 53 51 4c 49  K && (flags&SQLI
26820 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
26830 29 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 70  ) ){.    pNew->p
26840 4d 65 74 68 6f 64 2d 3e 78 43 6c 6f 73 65 28 28  Method->xClose((
26850 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 70  sqlite3_file *)p
26860 4e 65 77 29 3b 0a 20 20 20 20 72 63 20 3d 20 53  New);.    rc = S
26870 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a  QLITE_CANTOPEN;.
26880 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d 53    }..  if( rc!=S
26890 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
268a0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65  sqlite3_free(pNe
268b0 77 29 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 30  w);.    pNew = 0
268c0 3b 0a 20 20 7d 0a 0a 20 20 2a 70 70 46 69 6c 65  ;.  }..  *ppFile
268d0 20 3d 20 70 4e 65 77 3b 0a 20 20 72 65 74 75 72   = pNew;.  retur
268e0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 74 61 6b 65  n rc;.}../* take
268f0 73 20 74 68 65 20 63 6f 6e 63 68 20 62 79 20 74  s the conch by t
26900 61 6b 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c  aking a shared l
26910 6f 63 6b 20 61 6e 64 20 72 65 61 64 20 74 68 65  ock and read the
26920 20 63 6f 6e 74 65 6e 74 73 20 63 6f 6e 63 68 2c   contents conch,
26930 20 69 66 20 0a 2a 2a 20 6c 6f 63 6b 50 61 74 68   if .** lockPath
26940 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74 68   is non-NULL, th
26950 65 20 68 6f 73 74 20 49 44 20 61 6e 64 20 6c 6f  e host ID and lo
26960 63 6b 20 66 69 6c 65 20 70 61 74 68 20 6d 75 73  ck file path mus
26970 74 20 6d 61 74 63 68 2e 20 20 41 20 4e 55 4c 4c  t match.  A NULL
26980 20 0a 2a 2a 20 6c 6f 63 6b 50 61 74 68 20 6d 65   .** lockPath me
26990 61 6e 73 20 74 68 61 74 20 74 68 65 20 6c 6f 63  ans that the loc
269a0 6b 50 61 74 68 20 69 6e 20 74 68 65 20 63 6f 6e  kPath in the con
269b0 63 68 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20  ch file will be 
269c0 75 73 65 64 20 69 66 20 74 68 65 20 0a 2a 2a 20  used if the .** 
269d0 68 6f 73 74 20 49 44 73 20 6d 61 74 63 68 2c 20  host IDs match, 
269e0 6f 72 20 61 20 6e 65 77 20 6c 6f 63 6b 20 70 61  or a new lock pa
269f0 74 68 20 77 69 6c 6c 20 62 65 20 67 65 6e 65 72  th will be gener
26a00 61 74 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c  ated automatical
26a10 6c 79 20 0a 2a 2a 20 61 6e 64 20 77 72 69 74 74  ly .** and writt
26a20 65 6e 20 74 6f 20 74 68 65 20 63 6f 6e 63 68 20  en to the conch 
26a30 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
26a40 69 6e 74 20 70 72 6f 78 79 54 61 6b 65 43 6f 6e  int proxyTakeCon
26a50 63 68 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  ch(unixFile *pFi
26a60 6c 65 29 7b 0a 20 20 70 72 6f 78 79 4c 6f 63 6b  le){.  proxyLock
26a70 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78  ingContext *pCtx
26a80 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67   = (proxyLocking
26a90 43 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d  Context *)pFile-
26aa0 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  >lockingContext;
26ab0 20 0a 20 20 0a 20 20 69 66 28 20 70 43 74 78 2d   .  .  if( pCtx-
26ac0 3e 63 6f 6e 63 68 48 65 6c 64 3e 30 20 29 7b 0a  >conchHeld>0 ){.
26ad0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
26ae0 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  E_OK;.  }else{. 
26af0 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e     unixFile *con
26b00 63 68 46 69 6c 65 20 3d 20 70 43 74 78 2d 3e 63  chFile = pCtx->c
26b10 6f 6e 63 68 46 69 6c 65 3b 0a 20 20 20 20 63 68  onchFile;.    ch
26b20 61 72 20 74 65 73 74 56 61 6c 75 65 5b 43 4f 4e  ar testValue[CON
26b30 43 48 4c 45 4e 5d 3b 0a 20 20 20 20 63 68 61 72  CHLEN];.    char
26b40 20 63 6f 6e 63 68 56 61 6c 75 65 5b 43 4f 4e 43   conchValue[CONC
26b50 48 4c 45 4e 5d 3b 0a 20 20 20 20 63 68 61 72 20  HLEN];.    char 
26b60 6c 6f 63 6b 50 61 74 68 5b 4d 41 58 50 41 54 48  lockPath[MAXPATH
26b70 4c 45 4e 5d 3b 0a 20 20 20 20 63 68 61 72 20 2a  LEN];.    char *
26b80 74 4c 6f 63 6b 50 61 74 68 20 3d 20 4e 55 4c 4c  tLockPath = NULL
26b90 3b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 53  ;.    int rc = S
26ba0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 69 6e  QLITE_OK;.    in
26bb0 74 20 72 65 61 64 52 63 20 3d 20 53 51 4c 49 54  t readRc = SQLIT
26bc0 45 5f 4f 4b 3b 0a 20 20 20 20 69 6e 74 20 73 79  E_OK;.    int sy
26bd0 6e 63 50 65 72 6d 73 20 3d 20 30 3b 0a 0a 20 20  ncPerms = 0;..  
26be0 20 20 4f 53 54 52 41 43 45 34 28 22 54 41 4b 45    OSTRACE4("TAKE
26bf0 43 4f 4e 43 48 20 20 25 64 20 66 6f 72 20 25 73  CONCH  %d for %s
26c00 20 70 69 64 3d 25 64 5c 6e 22 2c 20 63 6f 6e 63   pid=%d\n", conc
26c10 68 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20  hFile->h,.      
26c20 20 20 20 20 20 20 20 28 70 43 74 78 2d 3e 6c 6f         (pCtx->lo
26c30 63 6b 50 72 6f 78 79 50 61 74 68 20 3f 20 70 43  ckProxyPath ? pC
26c40 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74  tx->lockProxyPat
26c50 68 20 3a 20 22 3a 61 75 74 6f 3a 22 29 2c 20 67  h : ":auto:"), g
26c60 65 74 70 69 64 28 29 29 3b 0a 0a 20 20 20 20 72  etpid());..    r
26c70 63 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70  c = conchFile->p
26c80 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28 73  Method->xLock((s
26c90 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e  qlite3_file*)con
26ca0 63 68 46 69 6c 65 2c 20 53 48 41 52 45 44 5f 4c  chFile, SHARED_L
26cb0 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 72 63  OCK);.    if( rc
26cc0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
26cd0 20 20 20 20 20 69 6e 74 20 70 45 72 72 6f 72 20       int pError 
26ce0 3d 20 30 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65  = 0;.      memse
26cf0 74 28 74 65 73 74 56 61 6c 75 65 2c 20 30 2c 20  t(testValue, 0, 
26d00 43 4f 4e 43 48 4c 45 4e 29 3b 20 2f 2a 20 63 6f  CONCHLEN); /* co
26d10 6e 63 68 20 69 73 20 66 69 78 65 64 20 73 69 7a  nch is fixed siz
26d20 65 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20  e */.      rc = 
26d30 70 72 6f 78 79 47 65 74 48 6f 73 74 49 44 28 74  proxyGetHostID(t
26d40 65 73 74 56 61 6c 75 65 2c 20 26 70 45 72 72 6f  estValue, &pErro
26d50 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 72  r);.      if( (r
26d60 63 26 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f  c&0xff)==SQLITE_
26d70 49 4f 45 52 52 20 29 7b 0a 20 20 20 20 20 20 20  IOERR ){.       
26d80 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
26d90 6f 20 3d 20 70 45 72 72 6f 72 3b 0a 20 20 20 20  o = pError;.    
26da0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 43    }.      if( pC
26db0 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74  tx->lockProxyPat
26dc0 68 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74 72  h ){.        str
26dd0 6c 63 70 79 28 26 74 65 73 74 56 61 6c 75 65 5b  lcpy(&testValue[
26de0 48 4f 53 54 49 44 4c 45 4e 5d 2c 20 70 43 74 78  HOSTIDLEN], pCtx
26df0 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 2c  ->lockProxyPath,
26e00 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a 20 20   MAXPATHLEN);.  
26e10 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
26e20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
26e30 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  K ){.      goto 
26e40 65 6e 64 5f 74 61 6b 65 63 6f 6e 63 68 3b 0a 20  end_takeconch;. 
26e50 20 20 20 7d 0a 20 20 20 20 0a 20 20 20 20 72 65     }.    .    re
26e60 61 64 52 63 20 3d 20 75 6e 69 78 52 65 61 64 28  adRc = unixRead(
26e70 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29  (sqlite3_file *)
26e80 63 6f 6e 63 68 46 69 6c 65 2c 20 63 6f 6e 63 68  conchFile, conch
26e90 56 61 6c 75 65 2c 20 43 4f 4e 43 48 4c 45 4e 2c  Value, CONCHLEN,
26ea0 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 65 61   0);.    if( rea
26eb0 64 52 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52  dRc!=SQLITE_IOER
26ec0 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a  R_SHORT_READ ){.
26ed0 20 20 20 20 20 20 69 66 28 20 72 65 61 64 52 63        if( readRc
26ee0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
26ef0 20 20 20 20 20 20 20 69 66 28 20 28 72 63 26 30         if( (rc&0
26f00 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 49 4f 45  xff)==SQLITE_IOE
26f10 52 52 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  RR ){.          
26f20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
26f30 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 6c 61   = conchFile->la
26f40 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20  stErrno;.       
26f50 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20   }.        rc = 
26f60 72 65 61 64 52 63 3b 0a 20 20 20 20 20 20 20 20  readRc;.        
26f70 67 6f 74 6f 20 65 6e 64 5f 74 61 6b 65 63 6f 6e  goto end_takecon
26f80 63 68 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ch;.      }.    
26f90 20 20 2f 2a 20 69 66 20 74 68 65 20 63 6f 6e 63    /* if the conc
26fa0 68 20 68 61 73 20 64 61 74 61 20 63 6f 6d 70 61  h has data compa
26fb0 72 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  re the contents 
26fc0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21 70 43  */.      if( !pC
26fd0 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74  tx->lockProxyPat
26fe0 68 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  h ){.        /* 
26ff0 66 6f 72 20 61 75 74 6f 2d 6e 61 6d 65 64 20 6c  for auto-named l
27000 6f 63 61 6c 20 6c 6f 63 6b 20 66 69 6c 65 2c 20  ocal lock file, 
27010 6a 75 73 74 20 63 68 65 63 6b 20 74 68 65 20 68  just check the h
27020 6f 73 74 20 49 44 20 61 6e 64 20 77 65 27 6c 6c  ost ID and we'll
27030 0a 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73 65  .         ** use
27040 20 74 68 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 20   the local lock 
27050 66 69 6c 65 20 70 61 74 68 20 74 68 61 74 27 73  file path that's
27060 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 72   already in ther
27070 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  e */.        if(
27080 20 21 6d 65 6d 63 6d 70 28 74 65 73 74 56 61 6c   !memcmp(testVal
27090 75 65 2c 20 63 6f 6e 63 68 56 61 6c 75 65 2c 20  ue, conchValue, 
270a0 48 4f 53 54 49 44 4c 45 4e 29 20 29 7b 0a 20 20  HOSTIDLEN) ){.  
270b0 20 20 20 20 20 20 20 20 74 4c 6f 63 6b 50 61 74          tLockPat
270c0 68 20 3d 20 28 63 68 61 72 20 2a 29 26 63 6f 6e  h = (char *)&con
270d0 63 68 56 61 6c 75 65 5b 48 4f 53 54 49 44 4c 45  chValue[HOSTIDLE
270e0 4e 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  N];.          go
270f0 74 6f 20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63 68  to end_takeconch
27100 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
27110 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
27120 20 2f 2a 20 77 65 27 76 65 20 67 6f 74 20 74 68   /* we've got th
27130 65 20 63 6f 6e 63 68 20 69 66 20 63 6f 6e 63 68  e conch if conch
27140 56 61 6c 75 65 20 6d 61 74 63 68 65 73 20 6f 75  Value matches ou
27150 72 20 70 61 74 68 20 61 6e 64 20 68 6f 73 74 20  r path and host 
27160 49 44 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66  ID */.        if
27170 28 20 21 6d 65 6d 63 6d 70 28 74 65 73 74 56 61  ( !memcmp(testVa
27180 6c 75 65 2c 20 63 6f 6e 63 68 56 61 6c 75 65 2c  lue, conchValue,
27190 20 43 4f 4e 43 48 4c 45 4e 29 20 29 7b 0a 20 20   CONCHLEN) ){.  
271a0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
271b0 5f 74 61 6b 65 63 6f 6e 63 68 3b 0a 20 20 20 20  _takeconch;.    
271c0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
271d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
271e0 2a 20 61 20 73 68 6f 72 74 20 72 65 61 64 20 6d  * a short read m
271f0 65 61 6e 73 20 77 65 27 72 65 20 22 63 72 65 61  eans we're "crea
27200 74 69 6e 67 22 20 74 68 65 20 63 6f 6e 63 68 20  ting" the conch 
27210 28 65 76 65 6e 20 74 68 6f 75 67 68 20 69 74 20  (even though it 
27220 63 6f 75 6c 64 20 0a 20 20 20 20 20 20 2a 2a 20  could .      ** 
27230 68 61 76 65 20 62 65 65 6e 20 75 73 65 72 2d 69  have been user-i
27240 6e 74 65 72 76 65 6e 74 69 6f 6e 29 2c 20 69 66  ntervention), if
27250 20 77 65 20 61 63 71 75 69 72 65 20 74 68 65 20   we acquire the 
27260 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2c 0a  exclusive lock,.
27270 20 20 20 20 20 20 2a 2a 20 77 65 27 6c 6c 20 74        ** we'll t
27280 72 79 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20  ry to match the 
27290 63 75 72 72 65 6e 74 20 6f 6e 2d 64 69 73 6b 20  current on-disk 
272a0 70 65 72 6d 69 73 73 69 6f 6e 73 20 6f 66 20 74  permissions of t
272b0 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20  he database.    
272c0 20 20 2a 2f 0a 20 20 20 20 20 20 73 79 6e 63 50    */.      syncP
272d0 65 72 6d 73 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  erms = 1;.    }.
272e0 20 20 20 20 0a 20 20 20 20 2f 2a 20 65 69 74 68      .    /* eith
272f0 65 72 20 63 6f 6e 63 68 20 77 61 73 20 65 6d 74  er conch was emt
27300 70 79 20 6f 72 20 64 69 64 6e 27 74 20 6d 61 74  py or didn't mat
27310 63 68 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70  ch */.    if( !p
27320 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61  Ctx->lockProxyPa
27330 74 68 20 29 7b 0a 20 20 20 20 20 20 70 72 6f 78  th ){.      prox
27340 79 47 65 74 4c 6f 63 6b 50 61 74 68 28 70 43 74  yGetLockPath(pCt
27350 78 2d 3e 64 62 50 61 74 68 2c 20 6c 6f 63 6b 50  x->dbPath, lockP
27360 61 74 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29  ath, MAXPATHLEN)
27370 3b 0a 20 20 20 20 20 20 74 4c 6f 63 6b 50 61 74  ;.      tLockPat
27380 68 20 3d 20 6c 6f 63 6b 50 61 74 68 3b 0a 20 20  h = lockPath;.  
27390 20 20 20 20 73 74 72 6c 63 70 79 28 26 74 65 73      strlcpy(&tes
273a0 74 56 61 6c 75 65 5b 48 4f 53 54 49 44 4c 45 4e  tValue[HOSTIDLEN
273b0 5d 2c 20 6c 6f 63 6b 50 61 74 68 2c 20 4d 41 58  ], lockPath, MAX
273c0 50 41 54 48 4c 45 4e 29 3b 0a 20 20 20 20 7d 0a  PATHLEN);.    }.
273d0 20 20 20 20 0a 20 20 20 20 2f 2a 20 75 70 64 61      .    /* upda
273e0 74 65 20 63 6f 6e 63 68 20 77 69 74 68 20 68 6f  te conch with ho
273f0 73 74 20 61 6e 64 20 70 61 74 68 20 28 74 68 69  st and path (thi
27400 73 20 77 69 6c 6c 20 66 61 69 6c 20 69 66 20 6f  s will fail if o
27410 74 68 65 72 20 70 72 6f 63 65 73 73 0a 20 20 20  ther process.   
27420 20 20 2a 2a 20 68 61 73 20 61 20 73 68 61 72 65    ** has a share
27430 64 20 6c 6f 63 6b 20 61 6c 72 65 61 64 79 29 20  d lock already) 
27440 2a 2f 0a 20 20 20 20 72 63 20 3d 20 63 6f 6e 63  */.    rc = conc
27450 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e  hFile->pMethod->
27460 78 4c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66  xLock((sqlite3_f
27470 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20  ile*)conchFile, 
27480 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b  EXCLUSIVE_LOCK);
27490 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
274a0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
274b0 72 63 20 3d 20 75 6e 69 78 57 72 69 74 65 28 28  rc = unixWrite((
274c0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 63  sqlite3_file *)c
274d0 6f 6e 63 68 46 69 6c 65 2c 20 74 65 73 74 56 61  onchFile, testVa
274e0 6c 75 65 2c 20 43 4f 4e 43 48 4c 45 4e 2c 20 30  lue, CONCHLEN, 0
274f0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
27500 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73 79  =SQLITE_OK && sy
27510 6e 63 50 65 72 6d 73 20 29 7b 0a 20 20 20 20 20  ncPerms ){.     
27520 20 20 20 73 74 72 75 63 74 20 73 74 61 74 20 62     struct stat b
27530 75 66 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  uf;.        int 
27540 65 72 72 20 3d 20 66 73 74 61 74 28 70 46 69 6c  err = fstat(pFil
27550 65 2d 3e 68 2c 20 26 62 75 66 29 3b 0a 20 20 20  e->h, &buf);.   
27560 20 20 20 20 20 69 66 28 20 65 72 72 3d 3d 30 20       if( err==0 
27570 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
27580 74 72 79 20 74 6f 20 6d 61 74 63 68 20 74 68 65  try to match the
27590 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 70   database file p
275a0 65 72 6d 69 73 73 69 6f 6e 73 2c 20 69 67 6e 6f  ermissions, igno
275b0 72 65 20 66 61 69 6c 75 72 65 20 2a 2f 0a 23 69  re failure */.#i
275c0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 50 52 4f  fndef SQLITE_PRO
275d0 58 59 5f 44 45 42 55 47 0a 20 20 20 20 20 20 20  XY_DEBUG.       
275e0 20 20 20 66 63 68 6d 6f 64 28 63 6f 6e 63 68 46     fchmod(conchF
275f0 69 6c 65 2d 3e 68 2c 20 62 75 66 2e 73 74 5f 6d  ile->h, buf.st_m
27600 6f 64 65 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20  ode);.#else.    
27610 20 20 20 20 20 20 69 66 28 20 66 63 68 6d 6f 64        if( fchmod
27620 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 62  (conchFile->h, b
27630 75 66 2e 73 74 5f 6d 6f 64 65 29 21 3d 30 20 29  uf.st_mode)!=0 )
27640 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  {.            in
27650 74 20 63 6f 64 65 20 3d 20 65 72 72 6e 6f 3b 0a  t code = errno;.
27660 20 20 20 20 20 20 20 20 20 20 20 20 66 70 72 69              fpri
27670 6e 74 66 28 73 74 64 65 72 72 2c 20 22 66 63 68  ntf(stderr, "fch
27680 6d 6f 64 20 25 6f 20 46 41 49 4c 45 44 20 77 69  mod %o FAILED wi
27690 74 68 20 25 64 20 25 73 5c 6e 22 2c 0a 20 20 20  th %d %s\n",.   
276a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
276b0 20 20 20 20 20 20 20 20 20 20 62 75 66 2e 73 74            buf.st
276c0 5f 6d 6f 64 65 2c 20 63 6f 64 65 2c 20 73 74 72  _mode, code, str
276d0 65 72 72 6f 72 28 63 6f 64 65 29 29 3b 0a 20 20  error(code));.  
276e0 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
276f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 70 72  .            fpr
27700 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 66 63  intf(stderr, "fc
27710 68 6d 6f 64 20 25 6f 20 53 55 43 43 45 44 45 44  hmod %o SUCCEDED
27720 5c 6e 22 2c 62 75 66 2e 73 74 5f 6d 6f 64 65 29  \n",buf.st_mode)
27730 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
27740 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
27750 20 20 20 20 20 20 20 69 6e 74 20 63 6f 64 65 20         int code 
27760 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20  = errno;.       
27770 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
27780 72 2c 20 22 53 54 41 54 20 46 41 49 4c 45 44 5b  r, "STAT FAILED[
27790 25 64 5d 20 77 69 74 68 20 25 64 20 25 73 5c 6e  %d] with %d %s\n
277a0 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ", .            
277b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65 72                er
277c0 72 2c 20 63 6f 64 65 2c 20 73 74 72 65 72 72 6f  r, code, strerro
277d0 72 28 63 6f 64 65 29 29 3b 0a 23 65 6e 64 69 66  r(code));.#endif
277e0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
277f0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 63 6f 6e   }.    }.    con
27800 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d  chFile->pMethod-
27810 3e 78 55 6e 6c 6f 63 6b 28 28 73 71 6c 69 74 65  >xUnlock((sqlite
27820 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c  3_file*)conchFil
27830 65 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b  e, SHARED_LOCK);
27840 0a 20 20 0a 65 6e 64 5f 74 61 6b 65 63 6f 6e 63  .  .end_takeconc
27850 68 3a 0a 20 20 20 20 4f 53 54 52 41 43 45 32 28  h:.    OSTRACE2(
27860 22 54 52 41 4e 53 50 52 4f 58 59 3a 20 43 4c 4f  "TRANSPROXY: CLO
27870 53 45 20 20 25 64 5c 6e 22 2c 20 70 46 69 6c 65  SE  %d\n", pFile
27880 2d 3e 68 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ->h);.    if( rc
27890 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
278a0 46 69 6c 65 2d 3e 6f 70 65 6e 46 6c 61 67 73 20  File->openFlags 
278b0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 46 69  ){.      if( pFi
278c0 6c 65 2d 3e 68 3e 3d 30 20 29 7b 0a 23 69 66 64  le->h>=0 ){.#ifd
278d0 65 66 20 53 54 52 49 43 54 5f 43 4c 4f 53 45 5f  ef STRICT_CLOSE_
278e0 45 52 52 4f 52 0a 20 20 20 20 20 20 20 20 69 66  ERROR.        if
278f0 28 20 63 6c 6f 73 65 28 70 46 69 6c 65 2d 3e 68  ( close(pFile->h
27900 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  ) ){.          p
27910 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
27920 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20  = errno;.       
27930 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
27940 5f 49 4f 45 52 52 5f 43 4c 4f 53 45 3b 0a 20 20  _IOERR_CLOSE;.  
27950 20 20 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20        }.#else.  
27960 20 20 20 20 20 20 63 6c 6f 73 65 28 70 46 69 6c        close(pFil
27970 65 2d 3e 68 29 3b 20 2f 2a 20 73 69 6c 65 6e 74  e->h); /* silent
27980 6c 79 20 6c 65 61 6b 20 66 64 20 69 66 20 66 61  ly leak fd if fa
27990 69 6c 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 20  il */.#endif.   
279a0 20 20 20 7d 0a 20 20 20 20 20 20 70 46 69 6c 65     }.      pFile
279b0 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  ->h = -1;.      
279c0 69 6e 74 20 66 64 20 3d 20 6f 70 65 6e 28 70 43  int fd = open(pC
279d0 74 78 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  tx->dbPath, pFil
279e0 65 2d 3e 6f 70 65 6e 46 6c 61 67 73 2c 0a 20 20  e->openFlags,.  
279f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27a00 20 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54    SQLITE_DEFAULT
27a10 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e  _FILE_PERMISSION
27a20 53 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43  S);.      OSTRAC
27a30 45 32 28 22 54 52 41 4e 53 50 52 4f 58 59 3a 20  E2("TRANSPROXY: 
27a40 4f 50 45 4e 20 20 25 64 5c 6e 22 2c 20 66 64 29  OPEN  %d\n", fd)
27a50 3b 0a 20 20 20 20 20 20 69 66 28 20 66 64 3e 3d  ;.      if( fd>=
27a60 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69  0 ){.        pFi
27a70 6c 65 2d 3e 68 20 3d 20 66 64 3b 0a 20 20 20 20  le->h = fd;.    
27a80 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
27a90 20 72 63 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f   rc=SQLITE_CANTO
27aa0 50 45 4e 3b 20 2f 2a 20 53 51 4c 49 54 45 5f 42  PEN; /* SQLITE_B
27ab0 55 53 59 3f 20 70 72 6f 78 79 54 61 6b 65 43 6f  USY? proxyTakeCo
27ac0 6e 63 68 20 63 61 6c 6c 65 64 0a 20 20 20 20 20  nch called.     
27ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27ae0 20 20 20 20 20 20 20 20 20 20 64 75 72 69 6e 67            during
27af0 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 20 20 20 20   locking */.    
27b00 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
27b10 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
27b20 26 26 20 21 70 43 74 78 2d 3e 6c 6f 63 6b 50 72  && !pCtx->lockPr
27b30 6f 78 79 20 29 7b 0a 20 20 20 20 20 20 63 68 61  oxy ){.      cha
27b40 72 20 2a 70 61 74 68 20 3d 20 74 4c 6f 63 6b 50  r *path = tLockP
27b50 61 74 68 20 3f 20 74 4c 6f 63 6b 50 61 74 68 20  ath ? tLockPath 
27b60 3a 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78  : pCtx->lockProx
27b70 79 50 61 74 68 3b 0a 20 20 20 20 20 20 2f 2a 20  yPath;.      /* 
27b80 41 43 53 3a 20 4e 65 65 64 20 74 6f 20 6d 61 6b  ACS: Need to mak
27b90 65 20 61 20 63 6f 70 79 20 6f 66 20 70 61 74 68  e a copy of path
27ba0 20 73 6f 6d 65 74 69 6d 65 73 20 2a 2f 0a 20 20   sometimes */.  
27bb0 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79 43 72      rc = proxyCr
27bc0 65 61 74 65 55 6e 69 78 46 69 6c 65 28 70 61 74  eateUnixFile(pat
27bd0 68 2c 20 26 70 43 74 78 2d 3e 6c 6f 63 6b 50 72  h, &pCtx->lockPr
27be0 6f 78 79 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  oxy);.    }.    
27bf0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
27c00 4b 20 29 7b 0a 20 20 20 20 20 20 70 43 74 78 2d  K ){.      pCtx-
27c10 3e 63 6f 6e 63 68 48 65 6c 64 20 3d 20 31 3b 0a  >conchHeld = 1;.
27c20 0a 20 20 20 20 20 20 69 66 28 20 74 4c 6f 63 6b  .      if( tLock
27c30 50 61 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20  Path ){.        
27c40 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50  pCtx->lockProxyP
27c50 61 74 68 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ath = sqlite3DbS
27c60 74 72 44 75 70 28 30 2c 20 74 4c 6f 63 6b 50 61  trDup(0, tLockPa
27c70 74 68 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  th);.        if(
27c80 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79   pCtx->lockProxy
27c90 2d 3e 70 4d 65 74 68 6f 64 20 3d 3d 20 26 61 66  ->pMethod == &af
27ca0 70 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20  pIoMethods ){.  
27cb0 20 20 20 20 20 20 20 20 28 28 61 66 70 4c 6f 63          ((afpLoc
27cc0 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 43  kingContext *)pC
27cd0 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 2d 3e 6c  tx->lockProxy->l
27ce0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 2d 3e  ockingContext)->
27cf0 64 62 50 61 74 68 20 3d 0a 20 20 20 20 20 20 20  dbPath =.       
27d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
27d10 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74  tx->lockProxyPat
27d20 68 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  h;.        }.   
27d30 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20     }.    } else 
27d40 7b 0a 20 20 20 20 20 20 63 6f 6e 63 68 46 69 6c  {.      conchFil
27d50 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c  e->pMethod->xUnl
27d60 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c  ock((sqlite3_fil
27d70 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 4e 4f  e*)conchFile, NO
27d80 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 7d 0a 20 20  _LOCK);.    }.  
27d90 20 20 4f 53 54 52 41 43 45 33 28 22 54 41 4b 45    OSTRACE3("TAKE
27da0 43 4f 4e 43 48 20 20 25 64 20 25 73 5c 6e 22 2c  CONCH  %d %s\n",
27db0 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 72   conchFile->h, r
27dc0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3f 22 6f 6b  c==SQLITE_OK?"ok
27dd0 22 3a 22 66 61 69 6c 65 64 22 29 3b 0a 20 20 20  ":"failed");.   
27de0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
27df0 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 46 69 6c  }../*.** If pFil
27e00 65 20 68 6f 6c 64 73 20 61 20 6c 6f 63 6b 20 6f  e holds a lock o
27e10 6e 20 61 20 63 6f 6e 63 68 20 66 69 6c 65 2c 20  n a conch file, 
27e20 74 68 65 6e 20 72 65 6c 65 61 73 65 20 74 68 61  then release tha
27e30 74 20 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69  t lock..*/.stati
27e40 63 20 69 6e 74 20 70 72 6f 78 79 52 65 6c 65 61  c int proxyRelea
27e50 73 65 43 6f 6e 63 68 28 75 6e 69 78 46 69 6c 65  seConch(unixFile
27e60 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20   *pFile){.  int 
27e70 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
27e80 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62 72 6f          /* Subro
27e90 75 74 69 6e 65 20 72 65 74 75 72 6e 20 63 6f 64  utine return cod
27ea0 65 20 2a 2f 0a 20 20 70 72 6f 78 79 4c 6f 63 6b  e */.  proxyLock
27eb0 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78  ingContext *pCtx
27ec0 3b 20 20 2f 2a 20 54 68 65 20 6c 6f 63 6b 69 6e  ;  /* The lockin
27ed0 67 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 74 68  g context for th
27ee0 65 20 70 72 6f 78 79 20 6c 6f 63 6b 20 2a 2f 0a  e proxy lock */.
27ef0 20 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63    unixFile *conc
27f00 68 46 69 6c 65 3b 20 20 20 20 20 20 20 20 2f 2a  hFile;        /*
27f10 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6e   Name of the con
27f20 63 68 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 70 43  ch file */..  pC
27f30 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69  tx = (proxyLocki
27f40 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c  ngContext *)pFil
27f50 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
27f60 74 3b 0a 20 20 63 6f 6e 63 68 46 69 6c 65 20 3d  t;.  conchFile =
27f70 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65   pCtx->conchFile
27f80 3b 0a 20 20 4f 53 54 52 41 43 45 34 28 22 52 45  ;.  OSTRACE4("RE
27f90 4c 45 41 53 45 43 4f 4e 43 48 20 20 25 64 20 66  LEASECONCH  %d f
27fa0 6f 72 20 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c  or %s pid=%d\n",
27fb0 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 0a 20   conchFile->h,. 
27fc0 20 20 20 20 20 20 20 20 20 20 28 70 43 74 78 2d            (pCtx-
27fd0 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 3f  >lockProxyPath ?
27fe0 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79   pCtx->lockProxy
27ff0 50 61 74 68 20 3a 20 22 3a 61 75 74 6f 3a 22 29  Path : ":auto:")
28000 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 67 65  , .           ge
28010 74 70 69 64 28 29 29 3b 0a 20 20 70 43 74 78 2d  tpid());.  pCtx-
28020 3e 63 6f 6e 63 68 48 65 6c 64 20 3d 20 30 3b 0a  >conchHeld = 0;.
28030 20 20 72 63 20 3d 20 63 6f 6e 63 68 46 69 6c 65    rc = conchFile
28040 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f  ->pMethod->xUnlo
28050 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ck((sqlite3_file
28060 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 4e 4f 5f  *)conchFile, NO_
28070 4c 4f 43 4b 29 3b 0a 20 20 4f 53 54 52 41 43 45  LOCK);.  OSTRACE
28080 33 28 22 52 45 4c 45 41 53 45 43 4f 4e 43 48 20  3("RELEASECONCH 
28090 20 25 64 20 25 73 5c 6e 22 2c 20 63 6f 6e 63 68   %d %s\n", conch
280a0 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20  File->h,.       
280b0 20 20 20 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f      (rc==SQLITE_
280c0 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69  OK ? "ok" : "fai
280d0 6c 65 64 22 29 29 3b 0a 20 20 72 65 74 75 72 6e  led"));.  return
280e0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69   rc;.}../*.** Gi
280f0 76 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ven the name of 
28100 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  a database file,
28110 20 63 6f 6d 70 75 74 65 20 74 68 65 20 6e 61 6d   compute the nam
28120 65 20 6f 66 20 69 74 73 20 63 6f 6e 63 68 20 66  e of its conch f
28130 69 6c 65 2e 0a 2a 2a 20 53 74 6f 72 65 20 74 68  ile..** Store th
28140 65 20 63 6f 6e 63 68 20 66 69 6c 65 6e 61 6d 65  e conch filename
28150 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69   in memory obtai
28160 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  ned from sqlite3
28170 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 4d 61  _malloc()..** Ma
28180 6b 65 20 2a 70 43 6f 6e 63 68 50 61 74 68 20 70  ke *pConchPath p
28190 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e 65 77 20  oint to the new 
281a0 6e 61 6d 65 2e 20 20 52 65 74 75 72 6e 20 53 51  name.  Return SQ
281b0 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
281c0 73 73 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f  ss.** or SQLITE_
281d0 4e 4f 4d 45 4d 20 69 66 20 75 6e 61 62 6c 65 20  NOMEM if unable 
281e0 74 6f 20 6f 62 74 61 69 6e 20 6d 65 6d 6f 72 79  to obtain memory
281f0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c  ..**.** The call
28200 65 72 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  er is responsibl
28210 65 20 66 6f 72 20 65 6e 73 75 72 69 6e 67 20 74  e for ensuring t
28220 68 61 74 20 74 68 65 20 61 6c 6c 6f 63 61 74 65  hat the allocate
28230 64 20 6d 65 6d 6f 72 79 0a 2a 2a 20 73 70 61 63  d memory.** spac
28240 65 20 69 73 20 65 76 65 6e 74 75 61 6c 6c 79 20  e is eventually 
28250 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 2a 70 43  freed..**.** *pC
28260 6f 6e 63 68 50 61 74 68 20 69 73 20 73 65 74 20  onchPath is set 
28270 74 6f 20 4e 55 4c 4c 20 69 66 20 61 20 6d 65 6d  to NULL if a mem
28280 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65  ory allocation e
28290 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a  rror occurs..*/.
282a0 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
282b0 43 72 65 61 74 65 43 6f 6e 63 68 50 61 74 68 6e  CreateConchPathn
282c0 61 6d 65 28 63 68 61 72 20 2a 64 62 50 61 74 68  ame(char *dbPath
282d0 2c 20 63 68 61 72 20 2a 2a 70 43 6f 6e 63 68 50  , char **pConchP
282e0 61 74 68 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20  ath){.  int i;  
282f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28300 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
28310 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6c  unter */.  int l
28320 65 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e  en = (int)strlen
28330 28 64 62 50 61 74 68 29 3b 20 2f 2a 20 4c 65 6e  (dbPath); /* Len
28340 67 74 68 20 6f 66 20 64 61 74 61 62 61 73 65 20  gth of database 
28350 66 69 6c 65 6e 61 6d 65 20 2d 20 64 62 50 61 74  filename - dbPat
28360 68 20 2a 2f 0a 20 20 63 68 61 72 20 2a 63 6f 6e  h */.  char *con
28370 63 68 50 61 74 68 3b 20 20 20 20 20 20 20 20 20  chPath;         
28380 20 20 20 20 20 2f 2a 20 62 75 66 66 65 72 20 69       /* buffer i
28390 6e 20 77 68 69 63 68 20 74 6f 20 63 6f 6e 73 74  n which to const
283a0 72 75 63 74 20 63 6f 6e 63 68 20 6e 61 6d 65 20  ruct conch name 
283b0 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  */..  /* Allocat
283c0 65 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 20  e space for the 
283d0 63 6f 6e 63 68 20 66 69 6c 65 6e 61 6d 65 20 61  conch filename a
283e0 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68  nd initialize th
283f0 65 20 6e 61 6d 65 20 74 6f 0a 20 20 2a 2a 20 74  e name to.  ** t
28400 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 6f  he name of the o
28410 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65  riginal database
28420 20 66 69 6c 65 2e 20 2a 2f 20 20 0a 20 20 2a 70   file. */  .  *p
28430 43 6f 6e 63 68 50 61 74 68 20 3d 20 63 6f 6e 63  ConchPath = conc
28440 68 50 61 74 68 20 3d 20 28 63 68 61 72 20 2a 29  hPath = (char *)
28450 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6c  sqlite3_malloc(l
28460 65 6e 20 2b 20 38 29 3b 0a 20 20 69 66 28 20 63  en + 8);.  if( c
28470 6f 6e 63 68 50 61 74 68 3d 3d 30 20 29 7b 0a 20  onchPath==0 ){. 
28480 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
28490 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 6d 65  _NOMEM;.  }.  me
284a0 6d 63 70 79 28 63 6f 6e 63 68 50 61 74 68 2c 20  mcpy(conchPath, 
284b0 64 62 50 61 74 68 2c 20 6c 65 6e 2b 31 29 3b 0a  dbPath, len+1);.
284c0 20 20 0a 20 20 2f 2a 20 6e 6f 77 20 69 6e 73 65    .  /* now inse
284d0 72 74 20 61 20 22 2e 22 20 62 65 66 6f 72 65 20  rt a "." before 
284e0 74 68 65 20 6c 61 73 74 20 2f 20 63 68 61 72 61  the last / chara
284f0 63 74 65 72 20 2a 2f 0a 20 20 66 6f 72 28 20 69  cter */.  for( i
28500 3d 28 6c 65 6e 2d 31 29 3b 20 69 3e 3d 30 3b 20  =(len-1); i>=0; 
28510 69 2d 2d 20 29 7b 0a 20 20 20 20 69 66 28 20 63  i-- ){.    if( c
28520 6f 6e 63 68 50 61 74 68 5b 69 5d 3d 3d 27 2f 27  onchPath[i]=='/'
28530 20 29 7b 0a 20 20 20 20 20 20 69 2b 2b 3b 0a 20   ){.      i++;. 
28540 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
28550 7d 0a 20 20 7d 0a 20 20 63 6f 6e 63 68 50 61 74  }.  }.  conchPat
28560 68 5b 69 5d 3d 27 2e 27 3b 0a 20 20 77 68 69 6c  h[i]='.';.  whil
28570 65 20 28 20 69 3c 6c 65 6e 20 29 7b 0a 20 20 20  e ( i<len ){.   
28580 20 63 6f 6e 63 68 50 61 74 68 5b 69 2b 31 5d 3d   conchPath[i+1]=
28590 64 62 50 61 74 68 5b 69 5d 3b 0a 20 20 20 20 69  dbPath[i];.    i
285a0 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 61 70  ++;.  }..  /* ap
285b0 70 65 6e 64 20 74 68 65 20 22 2d 63 6f 6e 63 68  pend the "-conch
285c0 22 20 73 75 66 66 69 78 20 74 6f 20 74 68 65 20  " suffix to the 
285d0 66 69 6c 65 20 2a 2f 0a 20 20 6d 65 6d 63 70 79  file */.  memcpy
285e0 28 26 63 6f 6e 63 68 50 61 74 68 5b 69 2b 31 5d  (&conchPath[i+1]
285f0 2c 20 22 2d 63 6f 6e 63 68 22 2c 20 37 29 3b 0a  , "-conch", 7);.
28600 20 20 61 73 73 65 72 74 28 20 28 69 6e 74 29 73    assert( (int)s
28610 74 72 6c 65 6e 28 63 6f 6e 63 68 50 61 74 68 29  trlen(conchPath)
28620 20 3d 3d 20 6c 65 6e 2b 37 20 29 3b 0a 0a 20 20   == len+7 );..  
28630 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
28640 3b 0a 7d 0a 0a 0a 2f 2a 20 54 61 6b 65 73 20 61  ;.}.../* Takes a
28650 20 66 75 6c 6c 79 20 63 6f 6e 66 69 67 75 72 65   fully configure
28660 64 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 2d  d proxy locking-
28670 73 74 79 6c 65 20 75 6e 69 78 20 66 69 6c 65 20  style unix file 
28680 61 6e 64 20 73 77 69 74 63 68 65 73 0a 2a 2a 20  and switches.** 
28690 74 68 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 20 66  the local lock f
286a0 69 6c 65 20 70 61 74 68 20 0a 2a 2f 0a 73 74 61  ile path .*/.sta
286b0 74 69 63 20 69 6e 74 20 73 77 69 74 63 68 4c 6f  tic int switchLo
286c0 63 6b 50 72 6f 78 79 50 61 74 68 28 75 6e 69 78  ckProxyPath(unix
286d0 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 63 6f 6e  File *pFile, con
286e0 73 74 20 63 68 61 72 20 2a 70 61 74 68 29 20 7b  st char *path) {
286f0 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43  .  proxyLockingC
28700 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20 28  ontext *pCtx = (
28710 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
28720 65 78 74 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ext*)pFile->lock
28730 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 63 68  ingContext;.  ch
28740 61 72 20 2a 6f 6c 64 50 61 74 68 20 3d 20 70 43  ar *oldPath = pC
28750 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74  tx->lockProxyPat
28760 68 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  h;.  int rc = SQ
28770 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20  LITE_OK;..  if( 
28780 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 21  pFile->locktype!
28790 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  =NO_LOCK ){.    
287a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
287b0 53 59 3b 0a 20 20 7d 20 20 0a 0a 20 20 2f 2a 20  SY;.  }  ..  /* 
287c0 6e 6f 74 68 69 6e 67 20 74 6f 20 64 6f 20 69 66  nothing to do if
287d0 20 74 68 65 20 70 61 74 68 20 69 73 20 4e 55 4c   the path is NUL
287e0 4c 2c 20 3a 61 75 74 6f 3a 20 6f 72 20 6d 61 74  L, :auto: or mat
287f0 63 68 65 73 20 74 68 65 20 65 78 69 73 74 69 6e  ches the existin
28800 67 20 70 61 74 68 20 2a 2f 0a 20 20 69 66 28 20  g path */.  if( 
28810 21 70 61 74 68 20 7c 7c 20 70 61 74 68 5b 30 5d  !path || path[0]
28820 3d 3d 27 5c 30 27 20 7c 7c 20 21 73 74 72 63 6d  =='\0' || !strcm
28830 70 28 70 61 74 68 2c 20 22 3a 61 75 74 6f 3a 22  p(path, ":auto:"
28840 29 20 7c 7c 0a 20 20 20 20 28 6f 6c 64 50 61 74  ) ||.    (oldPat
28850 68 20 26 26 20 21 73 74 72 6e 63 6d 70 28 6f 6c  h && !strncmp(ol
28860 64 50 61 74 68 2c 20 70 61 74 68 2c 20 4d 41 58  dPath, path, MAX
28870 50 41 54 48 4c 45 4e 29 29 20 29 7b 0a 20 20 20  PATHLEN)) ){.   
28880 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
28890 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  K;.  }else{.    
288a0 75 6e 69 78 46 69 6c 65 20 2a 6c 6f 63 6b 50 72  unixFile *lockPr
288b0 6f 78 79 20 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b  oxy = pCtx->lock
288c0 50 72 6f 78 79 3b 0a 20 20 20 20 70 43 74 78 2d  Proxy;.    pCtx-
288d0 3e 6c 6f 63 6b 50 72 6f 78 79 3d 4e 55 4c 4c 3b  >lockProxy=NULL;
288e0 0a 20 20 20 20 70 43 74 78 2d 3e 63 6f 6e 63 68  .    pCtx->conch
288f0 48 65 6c 64 20 3d 20 30 3b 0a 20 20 20 20 69 66  Held = 0;.    if
28900 28 20 6c 6f 63 6b 50 72 6f 78 79 21 3d 4e 55 4c  ( lockProxy!=NUL
28910 4c 20 29 7b 0a 20 20 20 20 20 20 72 63 3d 6c 6f  L ){.      rc=lo
28920 63 6b 50 72 6f 78 79 2d 3e 70 4d 65 74 68 6f 64  ckProxy->pMethod
28930 2d 3e 78 43 6c 6f 73 65 28 28 73 71 6c 69 74 65  ->xClose((sqlite
28940 33 5f 66 69 6c 65 20 2a 29 6c 6f 63 6b 50 72 6f  3_file *)lockPro
28950 78 79 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  xy);.      if( r
28960 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
28970 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
28980 65 28 6c 6f 63 6b 50 72 6f 78 79 29 3b 0a 20 20  e(lockProxy);.  
28990 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
289a0 66 72 65 65 28 6f 6c 64 50 61 74 68 29 3b 0a 20  free(oldPath);. 
289b0 20 20 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f     pCtx->lockPro
289c0 78 79 50 61 74 68 20 3d 20 73 71 6c 69 74 65 33  xyPath = sqlite3
289d0 44 62 53 74 72 44 75 70 28 30 2c 20 70 61 74 68  DbStrDup(0, path
289e0 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 72 65 74 75  );.  }.  .  retu
289f0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
28a00 70 46 69 6c 65 20 69 73 20 61 20 66 69 6c 65 20  pFile is a file 
28a10 74 68 61 74 20 68 61 73 20 62 65 65 6e 20 6f 70  that has been op
28a20 65 6e 65 64 20 62 79 20 61 20 70 72 69 6f 72 20  ened by a prior 
28a30 78 4f 70 65 6e 20 63 61 6c 6c 2e 20 20 64 62 50  xOpen call.  dbP
28a40 61 74 68 0a 2a 2a 20 69 73 20 61 20 73 74 72 69  ath.** is a stri
28a50 6e 67 20 62 75 66 66 65 72 20 61 74 20 6c 65 61  ng buffer at lea
28a60 73 74 20 4d 41 58 50 41 54 48 4c 45 4e 2b 31 20  st MAXPATHLEN+1 
28a70 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 73 69  characters in si
28a80 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ze..**.** This r
28a90 6f 75 74 69 6e 65 20 66 69 6e 64 20 74 68 65 20  outine find the 
28aa0 66 69 6c 65 6e 61 6d 65 20 61 73 73 6f 63 69 61  filename associa
28ab0 74 65 64 20 77 69 74 68 20 70 46 69 6c 65 20 61  ted with pFile a
28ac0 6e 64 20 77 72 69 74 65 73 20 69 74 0a 2a 2a 20  nd writes it.** 
28ad0 69 6e 74 20 64 62 50 61 74 68 2e 0a 2a 2f 0a 73  int dbPath..*/.s
28ae0 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 47  tatic int proxyG
28af0 65 74 44 62 50 61 74 68 46 6f 72 55 6e 69 78 46  etDbPathForUnixF
28b00 69 6c 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46  ile(unixFile *pF
28b10 69 6c 65 2c 20 63 68 61 72 20 2a 64 62 50 61 74  ile, char *dbPat
28b20 68 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28  h){.#if defined(
28b30 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 69 66 28  __APPLE__).  if(
28b40 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 20   pFile->pMethod 
28b50 3d 3d 20 26 61 66 70 49 6f 4d 65 74 68 6f 64 73  == &afpIoMethods
28b60 20 29 7b 0a 20 20 20 20 2f 2a 20 61 66 70 20 73   ){.    /* afp s
28b70 74 79 6c 65 20 6b 65 65 70 73 20 61 20 72 65 66  tyle keeps a ref
28b80 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 64 62  erence to the db
28b90 20 70 61 74 68 20 69 6e 20 74 68 65 20 66 69 6c   path in the fil
28ba0 65 50 61 74 68 20 66 69 65 6c 64 20 0a 20 20 20  ePath field .   
28bb0 20 2a 2a 20 6f 66 20 74 68 65 20 73 74 72 75 63   ** of the struc
28bc0 74 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  t */.    assert(
28bd0 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 28 63 68   (int)strlen((ch
28be0 61 72 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69  ar*)pFile->locki
28bf0 6e 67 43 6f 6e 74 65 78 74 29 3c 3d 4d 41 58 50  ngContext)<=MAXP
28c00 41 54 48 4c 45 4e 20 29 3b 0a 20 20 20 20 73 74  ATHLEN );.    st
28c10 72 63 70 79 28 64 62 50 61 74 68 2c 20 28 28 61  rcpy(dbPath, ((a
28c20 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
28c30 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e   *)pFile->lockin
28c40 67 43 6f 6e 74 65 78 74 29 2d 3e 64 62 50 61 74  gContext)->dbPat
28c50 68 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64  h);.  }else.#end
28c60 69 66 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  if.  if( pFile->
28c70 70 4d 65 74 68 6f 64 20 3d 3d 20 26 64 6f 74 6c  pMethod == &dotl
28c80 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a  ockIoMethods ){.
28c90 20 20 20 20 2f 2a 20 64 6f 74 20 6c 6f 63 6b 20      /* dot lock 
28ca0 73 74 79 6c 65 20 75 73 65 73 20 74 68 65 20 6c  style uses the l
28cb0 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 74  ocking context t
28cc0 6f 20 73 74 6f 72 65 20 74 68 65 20 64 6f 74 20  o store the dot 
28cd0 6c 6f 63 6b 0a 20 20 20 20 2a 2a 20 66 69 6c 65  lock.    ** file
28ce0 20 70 61 74 68 20 2a 2f 0a 20 20 20 20 69 6e 74   path */.    int
28cf0 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 28 63   len = strlen((c
28d00 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63  har *)pFile->loc
28d10 6b 69 6e 67 43 6f 6e 74 65 78 74 29 20 2d 20 73  kingContext) - s
28d20 74 72 6c 65 6e 28 44 4f 54 4c 4f 43 4b 5f 53 55  trlen(DOTLOCK_SU
28d30 46 46 49 58 29 3b 0a 20 20 20 20 6d 65 6d 63 70  FFIX);.    memcp
28d40 79 28 64 62 50 61 74 68 2c 20 28 63 68 61 72 20  y(dbPath, (char 
28d50 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  *)pFile->locking
28d60 43 6f 6e 74 65 78 74 2c 20 6c 65 6e 20 2b 20 31  Context, len + 1
28d70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
28d80 2f 2a 20 61 6c 6c 20 6f 74 68 65 72 20 73 74 79  /* all other sty
28d90 6c 65 73 20 75 73 65 20 74 68 65 20 6c 6f 63 6b  les use the lock
28da0 69 6e 67 20 63 6f 6e 74 65 78 74 20 74 6f 20 73  ing context to s
28db0 74 6f 72 65 20 74 68 65 20 64 62 20 66 69 6c 65  tore the db file
28dc0 20 70 61 74 68 20 2a 2f 0a 20 20 20 20 61 73 73   path */.    ass
28dd0 65 72 74 28 20 73 74 72 6c 65 6e 28 28 63 68 61  ert( strlen((cha
28de0 72 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e  r*)pFile->lockin
28df0 67 43 6f 6e 74 65 78 74 29 3c 3d 4d 41 58 50 41  gContext)<=MAXPA
28e00 54 48 4c 45 4e 20 29 3b 0a 20 20 20 20 73 74 72  THLEN );.    str
28e10 63 70 79 28 64 62 50 61 74 68 2c 20 28 63 68 61  cpy(dbPath, (cha
28e20 72 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69  r *)pFile->locki
28e30 6e 67 43 6f 6e 74 65 78 74 29 3b 0a 20 20 7d 0a  ngContext);.  }.
28e40 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
28e50 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 61 6b  OK;.}../*.** Tak
28e60 65 73 20 61 6e 20 61 6c 72 65 61 64 79 20 66 69  es an already fi
28e70 6c 6c 65 64 20 69 6e 20 75 6e 69 78 20 66 69 6c  lled in unix fil
28e80 65 20 61 6e 64 20 61 6c 74 65 72 73 20 69 74 20  e and alters it 
28e90 73 6f 20 61 6c 6c 20 66 69 6c 65 20 6c 6f 63 6b  so all file lock
28ea0 69 6e 67 20 0a 2a 2a 20 77 69 6c 6c 20 62 65 20  ing .** will be 
28eb0 70 65 72 66 6f 72 6d 65 64 20 6f 6e 20 74 68 65  performed on the
28ec0 20 6c 6f 63 61 6c 20 70 72 6f 78 79 20 6c 6f 63   local proxy loc
28ed0 6b 20 66 69 6c 65 2e 20 20 54 68 65 20 66 6f 6c  k file.  The fol
28ee0 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 0a 2a 2a  lowing fields.**
28ef0 20 61 72 65 20 70 72 65 73 65 72 76 65 64 20 69   are preserved i
28f00 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f  n the locking co
28f10 6e 74 65 78 74 20 73 6f 20 74 68 61 74 20 74 68  ntext so that th
28f20 65 79 20 63 61 6e 20 62 65 20 72 65 73 74 6f 72  ey can be restor
28f30 65 64 20 61 6e 64 20 0a 2a 2a 20 74 68 65 20 75  ed and .** the u
28f40 6e 69 78 20 73 74 72 75 63 74 75 72 65 20 70 72  nix structure pr
28f50 6f 70 65 72 6c 79 20 63 6c 65 61 6e 65 64 20 75  operly cleaned u
28f60 70 20 61 74 20 63 6c 6f 73 65 20 74 69 6d 65 3a  p at close time:
28f70 0a 2a 2a 20 20 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  .**  ->lockingCo
28f80 6e 74 65 78 74 0a 2a 2a 20 20 2d 3e 70 4d 65 74  ntext.**  ->pMet
28f90 68 6f 64 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  hod.*/.static in
28fa0 74 20 70 72 6f 78 79 54 72 61 6e 73 66 6f 72 6d  t proxyTransform
28fb0 55 6e 69 78 46 69 6c 65 28 75 6e 69 78 46 69 6c  UnixFile(unixFil
28fc0 65 20 2a 70 46 69 6c 65 2c 20 63 6f 6e 73 74 20  e *pFile, const 
28fd0 63 68 61 72 20 2a 70 61 74 68 29 20 7b 0a 20 20  char *path) {.  
28fe0 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
28ff0 65 78 74 20 2a 70 43 74 78 3b 0a 20 20 63 68 61  ext *pCtx;.  cha
29000 72 20 64 62 50 61 74 68 5b 4d 41 58 50 41 54 48  r dbPath[MAXPATH
29010 4c 45 4e 2b 31 5d 3b 20 20 20 20 20 20 20 2f 2a  LEN+1];       /*
29020 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   Name of the dat
29030 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
29040 63 68 61 72 20 2a 6c 6f 63 6b 50 61 74 68 3d 4e  char *lockPath=N
29050 55 4c 4c 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ULL;.  int rc = 
29060 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 0a 20 20  SQLITE_OK;.  .  
29070 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  if( pFile->lockt
29080 79 70 65 21 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a  ype!=NO_LOCK ){.
29090 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
290a0 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 20 20 70 72  E_BUSY;.  }.  pr
290b0 6f 78 79 47 65 74 44 62 50 61 74 68 46 6f 72 55  oxyGetDbPathForU
290c0 6e 69 78 46 69 6c 65 28 70 46 69 6c 65 2c 20 64  nixFile(pFile, d
290d0 62 50 61 74 68 29 3b 0a 20 20 69 66 28 20 21 70  bPath);.  if( !p
290e0 61 74 68 20 7c 7c 20 70 61 74 68 5b 30 5d 3d 3d  ath || path[0]==
290f0 27 5c 30 27 20 7c 7c 20 21 73 74 72 63 6d 70 28  '\0' || !strcmp(
29100 70 61 74 68 2c 20 22 3a 61 75 74 6f 3a 22 29 20  path, ":auto:") 
29110 29 7b 0a 20 20 20 20 6c 6f 63 6b 50 61 74 68 3d  ){.    lockPath=
29120 4e 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  NULL;.  }else{. 
29130 20 20 20 6c 6f 63 6b 50 61 74 68 3d 28 63 68 61     lockPath=(cha
29140 72 20 2a 29 70 61 74 68 3b 0a 20 20 7d 0a 20 20  r *)path;.  }.  
29150 0a 20 20 4f 53 54 52 41 43 45 34 28 22 54 52 41  .  OSTRACE4("TRA
29160 4e 53 50 52 4f 58 59 20 20 25 64 20 66 6f 72 20  NSPROXY  %d for 
29170 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c 20 70 46  %s pid=%d\n", pF
29180 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20  ile->h,.        
29190 20 20 20 28 6c 6f 63 6b 50 61 74 68 20 3f 20 6c     (lockPath ? l
291a0 6f 63 6b 50 61 74 68 20 3a 20 22 3a 61 75 74 6f  ockPath : ":auto
291b0 3a 22 29 2c 20 67 65 74 70 69 64 28 29 29 3b 0a  :"), getpid());.
291c0 0a 20 20 70 43 74 78 20 3d 20 73 71 6c 69 74 65  .  pCtx = sqlite
291d0 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  3_malloc( sizeof
291e0 28 2a 70 43 74 78 29 20 29 3b 0a 20 20 69 66 28  (*pCtx) );.  if(
291f0 20 70 43 74 78 3d 3d 30 20 29 7b 0a 20 20 20 20   pCtx==0 ){.    
29200 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
29210 4d 45 4d 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65  MEM;.  }.  memse
29220 74 28 70 43 74 78 2c 20 30 2c 20 73 69 7a 65 6f  t(pCtx, 0, sizeo
29230 66 28 2a 70 43 74 78 29 29 3b 0a 0a 20 20 72 63  f(*pCtx));..  rc
29240 20 3d 20 70 72 6f 78 79 43 72 65 61 74 65 43 6f   = proxyCreateCo
29250 6e 63 68 50 61 74 68 6e 61 6d 65 28 64 62 50 61  nchPathname(dbPa
29260 74 68 2c 20 26 70 43 74 78 2d 3e 63 6f 6e 63 68  th, &pCtx->conch
29270 46 69 6c 65 50 61 74 68 29 3b 0a 20 20 69 66 28  FilePath);.  if(
29280 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
29290 7b 0a 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79  {.    rc = proxy
292a0 43 72 65 61 74 65 55 6e 69 78 46 69 6c 65 28 70  CreateUnixFile(p
292b0 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 50 61  Ctx->conchFilePa
292c0 74 68 2c 20 26 70 43 74 78 2d 3e 63 6f 6e 63 68  th, &pCtx->conch
292d0 46 69 6c 65 29 3b 0a 20 20 7d 20 20 0a 20 20 69  File);.  }  .  i
292e0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
292f0 20 26 26 20 6c 6f 63 6b 50 61 74 68 20 29 7b 0a   && lockPath ){.
29300 20 20 20 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72      pCtx->lockPr
29310 6f 78 79 50 61 74 68 20 3d 20 73 71 6c 69 74 65  oxyPath = sqlite
29320 33 44 62 53 74 72 44 75 70 28 30 2c 20 6c 6f 63  3DbStrDup(0, loc
29330 6b 50 61 74 68 29 3b 0a 20 20 7d 0a 0a 20 20 69  kPath);.  }..  i
29340 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
29350 20 29 7b 0a 20 20 20 20 2f 2a 20 61 6c 6c 20 6d   ){.    /* all m
29360 65 6d 6f 72 79 20 69 73 20 61 6c 6c 6f 63 61 74  emory is allocat
29370 65 64 2c 20 70 72 6f 78 79 73 20 61 72 65 20 63  ed, proxys are c
29380 72 65 61 74 65 64 20 61 6e 64 20 61 73 73 69 67  reated and assig
29390 6e 65 64 2c 20 0a 20 20 20 20 2a 2a 20 73 77 69  ned, .    ** swi
293a0 74 63 68 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  tch the locking 
293b0 63 6f 6e 74 65 78 74 20 61 6e 64 20 70 4d 65 74  context and pMet
293c0 68 6f 64 20 74 68 65 6e 20 72 65 74 75 72 6e 2e  hod then return.
293d0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 43 74 78  .    */.    pCtx
293e0 2d 3e 64 62 50 61 74 68 20 3d 20 73 71 6c 69 74  ->dbPath = sqlit
293f0 65 33 44 62 53 74 72 44 75 70 28 30 2c 20 64 62  e3DbStrDup(0, db
29400 50 61 74 68 29 3b 0a 20 20 20 20 70 43 74 78 2d  Path);.    pCtx-
29410 3e 6f 6c 64 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  >oldLockingConte
29420 78 74 20 3d 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  xt = pFile->lock
29430 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20  ingContext;.    
29440 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
29450 6e 74 65 78 74 20 3d 20 70 43 74 78 3b 0a 20 20  ntext = pCtx;.  
29460 20 20 70 43 74 78 2d 3e 70 4f 6c 64 4d 65 74 68    pCtx->pOldMeth
29470 6f 64 20 3d 20 70 46 69 6c 65 2d 3e 70 4d 65 74  od = pFile->pMet
29480 68 6f 64 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  hod;.    pFile->
29490 70 4d 65 74 68 6f 64 20 3d 20 26 70 72 6f 78 79  pMethod = &proxy
294a0 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 65 6c  IoMethods;.  }el
294b0 73 65 7b 0a 20 20 20 20 69 66 28 20 70 43 74 78  se{.    if( pCtx
294c0 2d 3e 63 6f 6e 63 68 46 69 6c 65 20 29 7b 20 0a  ->conchFile ){ .
294d0 20 20 20 20 20 20 72 63 20 3d 20 70 43 74 78 2d        rc = pCtx-
294e0 3e 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74  >conchFile->pMet
294f0 68 6f 64 2d 3e 78 43 6c 6f 73 65 28 28 73 71 6c  hod->xClose((sql
29500 69 74 65 33 5f 66 69 6c 65 20 2a 29 70 43 74 78  ite3_file *)pCtx
29510 2d 3e 63 6f 6e 63 68 46 69 6c 65 29 3b 0a 20 20  ->conchFile);.  
29520 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
29530 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 73 71  urn rc;.      sq
29540 6c 69 74 65 33 5f 66 72 65 65 28 70 43 74 78 2d  lite3_free(pCtx-
29550 3e 63 6f 6e 63 68 46 69 6c 65 29 3b 0a 20 20 20  >conchFile);.   
29560 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
29570 72 65 65 28 70 43 74 78 2d 3e 63 6f 6e 63 68 46  ree(pCtx->conchF
29580 69 6c 65 50 61 74 68 29 3b 20 0a 20 20 20 20 73  ilePath); .    s
29590 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 74 78  qlite3_free(pCtx
295a0 29 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45  );.  }.  OSTRACE
295b0 33 28 22 54 52 41 4e 53 50 52 4f 58 59 20 20 25  3("TRANSPROXY  %
295c0 64 20 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  d %s\n", pFile->
295d0 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 28 72  h,.           (r
295e0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22  c==SQLITE_OK ? "
295f0 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29  ok" : "failed"))
29600 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
29610 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  .../*.** This ro
29620 75 74 69 6e 65 20 68 61 6e 64 6c 65 73 20 73 71  utine handles sq
29630 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72  lite3_file_contr
29640 6f 6c 28 29 20 63 61 6c 6c 73 20 74 68 61 74 20  ol() calls that 
29650 61 72 65 20 73 70 65 63 69 66 69 63 0a 2a 2a 20  are specific.** 
29660 74 6f 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67  to proxy locking
29670 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
29680 70 72 6f 78 79 46 69 6c 65 43 6f 6e 74 72 6f 6c  proxyFileControl
29690 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
296a0 64 2c 20 69 6e 74 20 6f 70 2c 20 76 6f 69 64 20  d, int op, void 
296b0 2a 70 41 72 67 29 7b 0a 20 20 73 77 69 74 63 68  *pArg){.  switch
296c0 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ( op ){.    case
296d0 20 53 51 4c 49 54 45 5f 47 45 54 5f 4c 4f 43 4b   SQLITE_GET_LOCK
296e0 50 52 4f 58 59 46 49 4c 45 3a 20 7b 0a 20 20 20  PROXYFILE: {.   
296f0 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69     unixFile *pFi
29700 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
29710 69 64 3b 0a 20 20 20 20 20 20 69 66 28 20 70 46  id;.      if( pF
29720 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 20 3d 3d 20  ile->pMethod == 
29730 26 70 72 6f 78 79 49 6f 4d 65 74 68 6f 64 73 20  &proxyIoMethods 
29740 29 7b 0a 20 20 20 20 20 20 20 20 70 72 6f 78 79  ){.        proxy
29750 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
29760 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63  pCtx = (proxyLoc
29770 6b 69 6e 67 43 6f 6e 74 65 78 74 2a 29 70 46 69  kingContext*)pFi
29780 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
29790 78 74 3b 0a 20 20 20 20 20 20 20 20 70 72 6f 78  xt;.        prox
297a0 79 54 61 6b 65 43 6f 6e 63 68 28 70 46 69 6c 65  yTakeConch(pFile
297b0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
297c0 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61  Ctx->lockProxyPa
297d0 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  th ){.          
297e0 2a 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 29  *(const char **)
297f0 70 41 72 67 20 3d 20 70 43 74 78 2d 3e 6c 6f 63  pArg = pCtx->loc
29800 6b 50 72 6f 78 79 50 61 74 68 3b 0a 20 20 20 20  kProxyPath;.    
29810 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
29820 20 20 20 20 20 2a 28 63 6f 6e 73 74 20 63 68 61       *(const cha
29830 72 20 2a 2a 29 70 41 72 67 20 3d 20 22 3a 61 75  r **)pArg = ":au
29840 74 6f 3a 20 28 6e 6f 74 20 68 65 6c 64 29 22 3b  to: (not held)";
29850 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
29860 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
29870 20 20 2a 28 63 6f 6e 73 74 20 63 68 61 72 20 2a    *(const char *
29880 2a 29 70 41 72 67 20 3d 20 4e 55 4c 4c 3b 0a 20  *)pArg = NULL;. 
29890 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
298a0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
298b0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
298c0 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f  LITE_SET_LOCKPRO
298d0 58 59 46 49 4c 45 3a 20 7b 0a 20 20 20 20 20 20  XYFILE: {.      
298e0 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
298f0 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
29900 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20  .      int rc = 
29910 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
29920 20 69 6e 74 20 69 73 50 72 6f 78 79 53 74 79 6c   int isProxyStyl
29930 65 20 3d 20 28 70 46 69 6c 65 2d 3e 70 4d 65 74  e = (pFile->pMet
29940 68 6f 64 20 3d 3d 20 26 70 72 6f 78 79 49 6f 4d  hod == &proxyIoM
29950 65 74 68 6f 64 73 29 3b 0a 20 20 20 20 20 20 69  ethods);.      i
29960 66 28 20 70 41 72 67 3d 3d 4e 55 4c 4c 20 7c 7c  f( pArg==NULL ||
29970 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70   (const char *)p
29980 41 72 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Arg==0 ){.      
29990 20 20 69 66 28 20 69 73 50 72 6f 78 79 53 74 79    if( isProxySty
299a0 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  le ){.          
299b0 2f 2a 20 74 75 72 6e 20 6f 66 66 20 70 72 6f 78  /* turn off prox
299c0 79 20 6c 6f 63 6b 69 6e 67 20 2d 20 6e 6f 74 20  y locking - not 
299d0 73 75 70 70 6f 72 74 65 64 20 2a 2f 0a 20 20 20  supported */.   
299e0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
299f0 54 45 5f 45 52 52 4f 52 20 2f 2a 53 51 4c 49 54  TE_ERROR /*SQLIT
29a00 45 5f 50 52 4f 54 4f 43 4f 4c 3f 20 53 51 4c 49  E_PROTOCOL? SQLI
29a10 54 45 5f 4d 49 53 55 53 45 3f 2a 2f 3b 0a 20 20  TE_MISUSE?*/;.  
29a20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
29a30 20 20 20 20 20 20 20 2f 2a 20 74 75 72 6e 20 6f         /* turn o
29a40 66 66 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67  ff proxy locking
29a50 20 2d 20 61 6c 72 65 61 64 79 20 6f 66 66 20 2d   - already off -
29a60 20 4e 4f 4f 50 20 2a 2f 0a 20 20 20 20 20 20 20   NOOP */.       
29a70 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
29a80 4b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  K;.        }.   
29a90 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
29aa0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 72    const char *pr
29ab0 6f 78 79 50 61 74 68 20 3d 20 28 63 6f 6e 73 74  oxyPath = (const
29ac0 20 63 68 61 72 20 2a 29 70 41 72 67 3b 0a 20 20   char *)pArg;.  
29ad0 20 20 20 20 20 20 69 66 28 20 69 73 50 72 6f 78        if( isProx
29ae0 79 53 74 79 6c 65 20 29 7b 0a 20 20 20 20 20 20  yStyle ){.      
29af0 20 20 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67      proxyLocking
29b00 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20  Context *pCtx = 
29b10 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 70 72  .            (pr
29b20 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  oxyLockingContex
29b30 74 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e  t*)pFile->lockin
29b40 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 20 20  gContext;.      
29b50 20 20 20 20 69 66 28 20 21 73 74 72 63 6d 70 28      if( !strcmp(
29b60 70 41 72 67 2c 20 22 3a 61 75 74 6f 3a 22 29 20  pArg, ":auto:") 
29b70 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28  .           || (
29b80 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50  pCtx->lockProxyP
29b90 61 74 68 20 26 26 0a 20 20 20 20 20 20 20 20 20  ath &&.         
29ba0 20 20 20 20 20 20 21 73 74 72 6e 63 6d 70 28 70        !strncmp(p
29bb0 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61  Ctx->lockProxyPa
29bc0 74 68 2c 20 70 72 6f 78 79 50 61 74 68 2c 20 4d  th, proxyPath, M
29bd0 41 58 50 41 54 48 4c 45 4e 29 29 0a 20 20 20 20  AXPATHLEN)).    
29be0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
29bf0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
29c00 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  _OK;.          }
29c10 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
29c20 20 20 72 63 20 3d 20 73 77 69 74 63 68 4c 6f 63    rc = switchLoc
29c30 6b 50 72 6f 78 79 50 61 74 68 28 70 46 69 6c 65  kProxyPath(pFile
29c40 2c 20 70 72 6f 78 79 50 61 74 68 29 3b 0a 20 20  , proxyPath);.  
29c50 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
29c60 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
29c70 20 20 20 2f 2a 20 74 75 72 6e 20 6f 6e 20 70 72     /* turn on pr
29c80 6f 78 79 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67  oxy file locking
29c90 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63   */.          rc
29ca0 20 3d 20 70 72 6f 78 79 54 72 61 6e 73 66 6f 72   = proxyTransfor
29cb0 6d 55 6e 69 78 46 69 6c 65 28 70 46 69 6c 65 2c  mUnixFile(pFile,
29cc0 20 70 72 6f 78 79 50 61 74 68 29 3b 0a 20 20 20   proxyPath);.   
29cd0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
29ce0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
29cf0 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c      }.    defaul
29d00 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  t: {.      asser
29d10 74 28 20 30 20 29 3b 20 20 2f 2a 20 54 68 65 20  t( 0 );  /* The 
29d20 63 61 6c 6c 20 61 73 73 75 72 65 73 20 74 68 61  call assures tha
29d30 74 20 6f 6e 6c 79 20 76 61 6c 69 64 20 6f 70 63  t only valid opc
29d40 6f 64 65 73 20 61 72 65 20 73 65 6e 74 20 2a 2f  odes are sent */
29d50 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 4e  .    }.  }.  /*N
29d60 4f 54 52 45 41 43 48 45 44 2a 2f 0a 20 20 72 65  OTREACHED*/.  re
29d70 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
29d80 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 69 74 68  R;.}../*.** With
29d90 69 6e 20 74 68 69 73 20 64 69 76 69 73 69 6f 6e  in this division
29da0 20 28 74 68 65 20 70 72 6f 78 79 69 6e 67 20 6c   (the proxying l
29db0 6f 63 6b 69 6e 67 20 69 6d 70 6c 65 6d 65 6e 74  ocking implement
29dc0 61 74 69 6f 6e 29 20 74 68 65 20 70 72 6f 63 65  ation) the proce
29dd0 64 75 72 65 73 0a 2a 2a 20 61 62 6f 76 65 20 74  dures.** above t
29de0 68 69 73 20 70 6f 69 6e 74 20 61 72 65 20 61 6c  his point are al
29df0 6c 20 75 74 69 6c 69 74 69 65 73 2e 20 20 54 68  l utilities.  Th
29e00 65 20 6c 6f 63 6b 2d 72 65 6c 61 74 65 64 20 6d  e lock-related m
29e10 65 74 68 6f 64 73 20 6f 66 20 74 68 65 0a 2a 2a  ethods of the.**
29e20 20 70 72 6f 78 79 2d 6c 6f 63 6b 69 6e 67 20 73   proxy-locking s
29e30 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
29e40 20 6f 62 6a 65 63 74 20 66 6f 6c 6c 6f 77 2e 0a   object follow..
29e50 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  */.../*.** This 
29e60 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69  routine checks i
29e70 66 20 74 68 65 72 65 20 69 73 20 61 20 52 45 53  f there is a RES
29e80 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20  ERVED lock held 
29e90 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64  on the specified
29ea0 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73  .** file by this
29eb0 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72   or any other pr
29ec0 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68 20 61  ocess. If such a
29ed0 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 73   lock is held, s
29ee0 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74  et *pResOut.** t
29ef0 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c  o a non-zero val
29f00 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70 52  ue otherwise *pR
29f10 65 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20  esOut is set to 
29f20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75 72  zero.  The retur
29f30 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65  n value.** is se
29f40 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75  t to SQLITE_OK u
29f50 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72 72  nless an I/O err
29f60 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  or occurs during
29f70 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a   lock checking..
29f80 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  */.static int pr
29f90 6f 78 79 43 68 65 63 6b 52 65 73 65 72 76 65 64  oxyCheckReserved
29fa0 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
29fb0 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73  e *id, int *pRes
29fc0 4f 75 74 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c  Out) {.  unixFil
29fd0 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
29fe0 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20  File*)id;.  int 
29ff0 72 63 20 3d 20 70 72 6f 78 79 54 61 6b 65 43 6f  rc = proxyTakeCo
2a000 6e 63 68 28 70 46 69 6c 65 29 3b 0a 20 20 69 66  nch(pFile);.  if
2a010 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2a020 29 7b 0a 20 20 20 20 70 72 6f 78 79 4c 6f 63 6b  ){.    proxyLock
2a030 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78  ingContext *pCtx
2a040 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67   = (proxyLocking
2a050 43 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d  Context *)pFile-
2a060 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  >lockingContext;
2a070 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  .    unixFile *p
2a080 72 6f 78 79 20 3d 20 70 43 74 78 2d 3e 6c 6f 63  roxy = pCtx->loc
2a090 6b 50 72 6f 78 79 3b 0a 20 20 20 20 72 65 74 75  kProxy;.    retu
2a0a0 72 6e 20 70 72 6f 78 79 2d 3e 70 4d 65 74 68 6f  rn proxy->pMetho
2a0b0 64 2d 3e 78 43 68 65 63 6b 52 65 73 65 72 76 65  d->xCheckReserve
2a0c0 64 4c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66  dLock((sqlite3_f
2a0d0 69 6c 65 2a 29 70 72 6f 78 79 2c 20 70 52 65 73  ile*)proxy, pRes
2a0e0 4f 75 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Out);.  }.  retu
2a0f0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2a100 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69  Lock the file wi
2a110 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63  th the lock spec
2a120 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74  ified by paramet
2a130 65 72 20 6c 6f 63 6b 74 79 70 65 20 2d 20 6f 6e  er locktype - on
2a140 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c  e.** of the foll
2a150 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  owing:.**.**    
2a160 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b   (1) SHARED_LOCK
2a170 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53 45  .**     (2) RESE
2a180 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  RVED_LOCK.**    
2a190 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43   (3) PENDING_LOC
2a1a0 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43  K.**     (4) EXC
2a1b0 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a  LUSIVE_LOCK.**.*
2a1c0 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e  * Sometimes when
2a1d0 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20   requesting one 
2a1e0 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69  lock state, addi
2a1f0 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74  tional lock stat
2a200 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74  es.** are insert
2a210 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20  ed in between.  
2a220 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68  The locking migh
2a230 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66  t fail on one of
2a240 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72   the later.** tr
2a250 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e  ansitions leavin
2a260 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65  g the lock state
2a270 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20   different from 
2a280 77 68 61 74 20 69 74 20 73 74 61 72 74 65 64 20  what it started 
2a290 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f  but.** still sho
2a2a0 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20  rt of its goal. 
2a2b0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   The following c
2a2c0 68 61 72 74 20 73 68 6f 77 73 20 74 68 65 20 61  hart shows the a
2a2d0 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69  llowed.** transi
2a2e0 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e  tions and the in
2a2f0 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69  serted intermedi
2a300 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a  ate states:.**.*
2a310 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e  *    UNLOCKED ->
2a320 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48   SHARED.**    SH
2a330 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44  ARED -> RESERVED
2a340 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e  .**    SHARED ->
2a350 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58   (PENDING) -> EX
2a360 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45  CLUSIVE.**    RE
2a370 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49  SERVED -> (PENDI
2a380 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  NG) -> EXCLUSIVE
2a390 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d  .**    PENDING -
2a3a0 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a  > EXCLUSIVE.**.*
2a3b0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
2a3c0 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73  ill only increas
2a3d0 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74  e a lock.  Use t
2a3e0 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f  he sqlite3OsUnlo
2a3f0 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  ck().** routine 
2a400 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69  to lower a locki
2a410 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61  ng level..*/.sta
2a420 74 69 63 20 69 6e 74 20 70 72 6f 78 79 4c 6f 63  tic int proxyLoc
2a430 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
2a440 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65  id, int locktype
2a450 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  ) {.  unixFile *
2a460 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
2a470 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20 72 63 20  e*)id;.  int rc 
2a480 3d 20 70 72 6f 78 79 54 61 6b 65 43 6f 6e 63 68  = proxyTakeConch
2a490 28 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 72  (pFile);.  if( r
2a4a0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2a4b0 20 20 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67      proxyLocking
2a4c0 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20  Context *pCtx = 
2a4d0 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e  (proxyLockingCon
2a4e0 74 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f  text *)pFile->lo
2a4f0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20  ckingContext;.  
2a500 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 72 6f 78    unixFile *prox
2a510 79 20 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72  y = pCtx->lockPr
2a520 6f 78 79 3b 0a 20 20 20 20 72 63 20 3d 20 70 72  oxy;.    rc = pr
2a530 6f 78 79 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 4c  oxy->pMethod->xL
2a540 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c  ock((sqlite3_fil
2a550 65 2a 29 70 72 6f 78 79 2c 20 6c 6f 63 6b 74 79  e*)proxy, lockty
2a560 70 65 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  pe);.    pFile->
2a570 6c 6f 63 6b 74 79 70 65 20 3d 20 70 72 6f 78 79  locktype = proxy
2a580 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 7d 0a  ->locktype;.  }.
2a590 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2a5a0 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65  ./*.** Lower the
2a5b0 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
2a5c0 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
2a5d0 72 20 70 46 69 6c 65 20 74 6f 20 6c 6f 63 6b 74  r pFile to lockt
2a5e0 79 70 65 2e 20 20 6c 6f 63 6b 74 79 70 65 0a 2a  ype.  locktype.*
2a5f0 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  * must be either
2a600 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52   NO_LOCK or SHAR
2a610 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49  ED_LOCK..**.** I
2a620 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  f the locking le
2a630 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20  vel of the file 
2a640 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c  descriptor is al
2a650 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f  ready at or belo
2a660 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74  w.** the request
2a670 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  ed locking level
2a680 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
2a690 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
2a6a0 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 55 6e  atic int proxyUn
2a6b0 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  lock(sqlite3_fil
2a6c0 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74  e *id, int lockt
2a6d0 79 70 65 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c  ype) {.  unixFil
2a6e0 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
2a6f0 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20  File*)id;.  int 
2a700 72 63 20 3d 20 70 72 6f 78 79 54 61 6b 65 43 6f  rc = proxyTakeCo
2a710 6e 63 68 28 70 46 69 6c 65 29 3b 0a 20 20 69 66  nch(pFile);.  if
2a720 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2a730 29 7b 0a 20 20 20 20 70 72 6f 78 79 4c 6f 63 6b  ){.    proxyLock
2a740 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78  ingContext *pCtx
2a750 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67   = (proxyLocking
2a760 43 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d  Context *)pFile-
2a770 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  >lockingContext;
2a780 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  .    unixFile *p
2a790 72 6f 78 79 20 3d 20 70 43 74 78 2d 3e 6c 6f 63  roxy = pCtx->loc
2a7a0 6b 50 72 6f 78 79 3b 0a 20 20 20 20 72 63 20 3d  kProxy;.    rc =
2a7b0 20 70 72 6f 78 79 2d 3e 70 4d 65 74 68 6f 64 2d   proxy->pMethod-
2a7c0 3e 78 55 6e 6c 6f 63 6b 28 28 73 71 6c 69 74 65  >xUnlock((sqlite
2a7d0 33 5f 66 69 6c 65 2a 29 70 72 6f 78 79 2c 20 6c  3_file*)proxy, l
2a7e0 6f 63 6b 74 79 70 65 29 3b 0a 20 20 20 20 70 46  ocktype);.    pF
2a7f0 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20  ile->locktype = 
2a800 70 72 6f 78 79 2d 3e 6c 6f 63 6b 74 79 70 65 3b  proxy->locktype;
2a810 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
2a820 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
2a830 20 61 20 66 69 6c 65 20 74 68 61 74 20 75 73 65   a file that use
2a840 73 20 70 72 6f 78 79 20 6c 6f 63 6b 73 2e 0a 2a  s proxy locks..*
2a850 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  /.static int pro
2a860 78 79 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f  xyClose(sqlite3_
2a870 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69 66  file *id) {.  if
2a880 28 20 69 64 20 29 7b 0a 20 20 20 20 75 6e 69 78  ( id ){.    unix
2a890 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
2a8a0 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20  nixFile*)id;.   
2a8b0 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e   proxyLockingCon
2a8c0 74 65 78 74 20 2a 70 43 74 78 20 3d 20 28 70 72  text *pCtx = (pr
2a8d0 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  oxyLockingContex
2a8e0 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69  t *)pFile->locki
2a8f0 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 75  ngContext;.    u
2a900 6e 69 78 46 69 6c 65 20 2a 6c 6f 63 6b 50 72 6f  nixFile *lockPro
2a910 78 79 20 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b 50  xy = pCtx->lockP
2a920 72 6f 78 79 3b 0a 20 20 20 20 75 6e 69 78 46 69  roxy;.    unixFi
2a930 6c 65 20 2a 63 6f 6e 63 68 46 69 6c 65 20 3d 20  le *conchFile = 
2a940 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 3b  pCtx->conchFile;
2a950 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 53 51  .    int rc = SQ
2a960 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 0a 20 20  LITE_OK;.    .  
2a970 20 20 69 66 28 20 6c 6f 63 6b 50 72 6f 78 79 20    if( lockProxy 
2a980 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 6f  ){.      rc = lo
2a990 63 6b 50 72 6f 78 79 2d 3e 70 4d 65 74 68 6f 64  ckProxy->pMethod
2a9a0 2d 3e 78 55 6e 6c 6f 63 6b 28 28 73 71 6c 69 74  ->xUnlock((sqlit
2a9b0 65 33 5f 66 69 6c 65 2a 29 6c 6f 63 6b 50 72 6f  e3_file*)lockPro
2a9c0 78 79 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20  xy, NO_LOCK);.  
2a9d0 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
2a9e0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 72 63  urn rc;.      rc
2a9f0 20 3d 20 6c 6f 63 6b 50 72 6f 78 79 2d 3e 70 4d   = lockProxy->pM
2aa00 65 74 68 6f 64 2d 3e 78 43 6c 6f 73 65 28 28 73  ethod->xClose((s
2aa10 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 6c 6f 63  qlite3_file*)loc
2aa20 6b 50 72 6f 78 79 29 3b 0a 20 20 20 20 20 20 69  kProxy);.      i
2aa30 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
2aa40 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  c;.      sqlite3
2aa50 5f 66 72 65 65 28 6c 6f 63 6b 50 72 6f 78 79 29  _free(lockProxy)
2aa60 3b 0a 20 20 20 20 20 20 70 43 74 78 2d 3e 6c 6f  ;.      pCtx->lo
2aa70 63 6b 50 72 6f 78 79 20 3d 20 30 3b 0a 20 20 20  ckProxy = 0;.   
2aa80 20 7d 0a 20 20 20 20 69 66 28 20 63 6f 6e 63 68   }.    if( conch
2aa90 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 69 66  File ){.      if
2aaa0 28 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c  ( pCtx->conchHel
2aab0 64 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  d ){.        rc 
2aac0 3d 20 70 72 6f 78 79 52 65 6c 65 61 73 65 43 6f  = proxyReleaseCo
2aad0 6e 63 68 28 70 46 69 6c 65 29 3b 0a 20 20 20 20  nch(pFile);.    
2aae0 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
2aaf0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
2ab00 20 20 20 20 20 20 72 63 20 3d 20 63 6f 6e 63 68        rc = conch
2ab10 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78  File->pMethod->x
2ab20 43 6c 6f 73 65 28 28 73 71 6c 69 74 65 33 5f 66  Close((sqlite3_f
2ab30 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65 29 3b  ile*)conchFile);
2ab40 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
2ab50 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
2ab60 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 63 6f   sqlite3_free(co
2ab70 6e 63 68 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a  nchFile);.    }.
2ab80 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
2ab90 28 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79  (pCtx->lockProxy
2aba0 50 61 74 68 29 3b 0a 20 20 20 20 73 71 6c 69 74  Path);.    sqlit
2abb0 65 33 5f 66 72 65 65 28 70 43 74 78 2d 3e 63 6f  e3_free(pCtx->co
2abc0 6e 63 68 46 69 6c 65 50 61 74 68 29 3b 0a 20 20  nchFilePath);.  
2abd0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
2abe0 43 74 78 2d 3e 64 62 50 61 74 68 29 3b 0a 20 20  Ctx->dbPath);.  
2abf0 20 20 2f 2a 20 72 65 73 74 6f 72 65 20 74 68 65    /* restore the
2ac00 20 6f 72 69 67 69 6e 61 6c 20 6c 6f 63 6b 69 6e   original lockin
2ac10 67 20 63 6f 6e 74 65 78 74 20 61 6e 64 20 70 4d  g context and pM
2ac20 65 74 68 6f 64 20 74 68 65 6e 20 63 6c 6f 73 65  ethod then close
2ac30 20 69 74 20 2a 2f 0a 20 20 20 20 70 46 69 6c 65   it */.    pFile
2ac40 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
2ac50 20 3d 20 70 43 74 78 2d 3e 6f 6c 64 4c 6f 63 6b   = pCtx->oldLock
2ac60 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20  ingContext;.    
2ac70 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 20 3d  pFile->pMethod =
2ac80 20 70 43 74 78 2d 3e 70 4f 6c 64 4d 65 74 68 6f   pCtx->pOldMetho
2ac90 64 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  d;.    sqlite3_f
2aca0 72 65 65 28 70 43 74 78 29 3b 0a 20 20 20 20 72  ree(pCtx);.    r
2acb0 65 74 75 72 6e 20 70 46 69 6c 65 2d 3e 70 4d 65  eturn pFile->pMe
2acc0 74 68 6f 64 2d 3e 78 43 6c 6f 73 65 28 69 64 29  thod->xClose(id)
2acd0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
2ace0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 0a 23  QLITE_OK;.}....#
2acf0 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64  endif /* defined
2ad00 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53  (__APPLE__) && S
2ad10 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
2ad20 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 2f 2a  KING_STYLE */./*
2ad30 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79 20 6c 6f  .** The proxy lo
2ad40 63 6b 69 6e 67 20 73 74 79 6c 65 20 69 73 20 69  cking style is i
2ad50 6e 74 65 6e 64 65 64 20 66 6f 72 20 75 73 65 20  ntended for use 
2ad60 77 69 74 68 20 41 46 50 20 66 69 6c 65 73 79 73  with AFP filesys
2ad70 74 65 6d 73 2e 0a 2a 2a 20 41 6e 64 20 73 69 6e  tems..** And sin
2ad80 63 65 20 41 46 50 20 69 73 20 6f 6e 6c 79 20 73  ce AFP is only s
2ad90 75 70 70 6f 72 74 65 64 20 6f 6e 20 4d 61 63 4f  upported on MacO
2ada0 53 58 2c 20 74 68 65 20 70 72 6f 78 79 20 6c 6f  SX, the proxy lo
2adb0 63 6b 69 6e 67 20 69 73 20 61 6c 73 6f 0a 2a 2a  cking is also.**
2adc0 20 72 65 73 74 72 69 63 74 65 64 20 74 6f 20 4d   restricted to M
2add0 61 63 4f 53 58 2e 0a 2a 2a 20 0a 2a 2a 0a 2a 2a  acOSX..** .**.**
2ade0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2adf0 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 70 72 6f  * End of the pro
2ae00 78 79 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e  xy lock implemen
2ae10 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  tation *********
2ae20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
2ae30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ae40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ae50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ae60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ae70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f  ************/../
2ae80 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
2ae90 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  the operating sy
2aea0 73 74 65 6d 20 69 6e 74 65 72 66 61 63 65 2e 0a  stem interface..
2aeb0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
2aec0 6e 65 20 72 65 67 69 73 74 65 72 73 20 61 6c 6c  ne registers all
2aed0 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74 61 74   VFS implementat
2aee0 69 6f 6e 73 20 66 6f 72 20 75 6e 69 78 2d 6c 69  ions for unix-li
2aef0 6b 65 20 6f 70 65 72 61 74 69 6e 67 0a 2a 2a 20  ke operating.** 
2af00 73 79 73 74 65 6d 73 2e 20 20 54 68 69 73 20 72  systems.  This r
2af10 6f 75 74 69 6e 65 2c 20 61 6e 64 20 74 68 65 20  outine, and the 
2af20 73 71 6c 69 74 65 33 5f 6f 73 5f 65 6e 64 28 29  sqlite3_os_end()
2af30 20 72 6f 75 74 69 6e 65 20 74 68 61 74 20 66 6f   routine that fo
2af40 6c 6c 6f 77 73 2c 0a 2a 2a 20 73 68 6f 75 6c 64  llows,.** should
2af50 20 62 65 20 74 68 65 20 6f 6e 6c 79 20 72 6f 75   be the only rou
2af60 74 69 6e 65 73 20 69 6e 20 74 68 69 73 20 66 69  tines in this fi
2af70 6c 65 20 74 68 61 74 20 61 72 65 20 76 69 73 69  le that are visi
2af80 62 6c 65 20 66 72 6f 6d 20 6f 74 68 65 72 0a 2a  ble from other.*
2af90 2a 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54  * files..**.** T
2afa0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
2afb0 61 6c 6c 65 64 20 6f 6e 63 65 20 64 75 72 69 6e  alled once durin
2afc0 67 20 53 51 4c 69 74 65 20 69 6e 69 74 69 61 6c  g SQLite initial
2afd0 69 7a 61 74 69 6f 6e 20 61 6e 64 20 62 79 20 61  ization and by a
2afe0 0a 2a 2a 20 73 69 6e 67 6c 65 20 74 68 72 65 61  .** single threa
2aff0 64 2e 20 20 54 68 65 20 6d 65 6d 6f 72 79 20 61  d.  The memory a
2b000 6c 6c 6f 63 61 74 69 6f 6e 20 61 6e 64 20 6d 75  llocation and mu
2b010 74 65 78 20 73 75 62 73 79 73 74 65 6d 73 20 68  tex subsystems h
2b020 61 76 65 20 6e 6f 74 0a 2a 2a 20 6e 65 63 65 73  ave not.** neces
2b030 73 61 72 69 6c 79 20 62 65 65 6e 20 69 6e 69 74  sarily been init
2b040 69 61 6c 69 7a 65 64 20 77 68 65 6e 20 74 68 69  ialized when thi
2b050 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
2b060 6c 65 64 2c 20 61 6e 64 20 73 6f 20 74 68 65 79  led, and so they
2b070 0a 2a 2a 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62  .** should not b
2b080 65 20 75 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  e used..*/.int s
2b090 71 6c 69 74 65 33 5f 6f 73 5f 69 6e 69 74 28 76  qlite3_os_init(v
2b0a0 6f 69 64 29 7b 20 0a 20 20 2f 2a 20 0a 20 20 2a  oid){ .  /* .  *
2b0b0 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
2b0c0 6d 61 63 72 6f 20 64 65 66 69 6e 65 73 20 61 6e  macro defines an
2b0d0 20 69 6e 69 74 69 61 6c 69 7a 65 72 20 66 6f 72   initializer for
2b0e0 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 66 73 20   an sqlite3_vfs 
2b0f0 6f 62 6a 65 63 74 2e 0a 20 20 2a 2a 20 54 68 65  object..  ** The
2b100 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 56 46 53   name of the VFS
2b110 20 69 73 20 4e 41 4d 45 2e 20 20 54 68 65 20 70   is NAME.  The p
2b120 41 70 70 44 61 74 61 20 69 73 20 61 20 70 6f 69  AppData is a poi
2b130 6e 74 65 72 20 74 6f 20 61 20 70 6f 69 6e 74 65  nter to a pointe
2b140 72 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 22 66  r.  ** to the "f
2b150 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 2e  inder" function.
2b160 20 20 28 70 41 70 70 44 61 74 61 20 69 73 20 61    (pAppData is a
2b170 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 70 6f   pointer to a po
2b180 69 6e 74 65 72 20 62 65 63 61 75 73 65 0a 20 20  inter because.  
2b190 2a 2a 20 73 69 6c 6c 79 20 43 39 30 20 72 75 6c  ** silly C90 rul
2b1a0 65 73 20 70 72 6f 68 69 62 69 74 20 61 20 76 6f  es prohibit a vo
2b1b0 69 64 2a 20 66 72 6f 6d 20 62 65 69 6e 67 20 63  id* from being c
2b1c0 61 73 74 20 74 6f 20 61 20 66 75 6e 63 74 69 6f  ast to a functio
2b1d0 6e 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 61  n pointer.  ** a
2b1e0 6e 64 20 73 6f 20 77 65 20 68 61 76 65 20 74 6f  nd so we have to
2b1f0 20 67 6f 20 74 68 72 6f 75 67 68 20 74 68 65 20   go through the 
2b200 69 6e 74 65 72 6d 65 64 69 61 74 65 20 70 6f 69  intermediate poi
2b210 6e 74 65 72 20 74 6f 20 61 76 6f 69 64 20 70 72  nter to avoid pr
2b220 6f 62 6c 65 6d 73 0a 20 20 2a 2a 20 77 68 65 6e  oblems.  ** when
2b230 20 63 6f 6d 70 69 6c 69 6e 67 20 77 69 74 68 20   compiling with 
2b240 2d 70 65 64 61 6e 74 69 63 2d 65 72 72 6f 72 73  -pedantic-errors
2b250 20 6f 6e 20 47 43 43 2e 29 0a 20 20 2a 2a 0a 20   on GCC.).  **. 
2b260 20 2a 2a 20 54 68 65 20 46 49 4e 44 45 52 20 70   ** The FINDER p
2b270 61 72 61 6d 65 74 65 72 20 74 6f 20 74 68 69 73  arameter to this
2b280 20 6d 61 63 72 6f 20 69 73 20 74 68 65 20 6e 61   macro is the na
2b290 6d 65 20 6f 66 20 74 68 65 20 70 6f 69 6e 74 65  me of the pointe
2b2a0 72 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 66 69  r to the.  ** fi
2b2b0 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 2e 20 20  nder-function.  
2b2c0 54 68 65 20 66 69 6e 64 65 72 2d 66 75 6e 63 74  The finder-funct
2b2d0 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 20 70 6f  ion returns a po
2b2e0 69 6e 74 65 72 20 74 6f 20 74 68 65 0a 20 20 2a  inter to the.  *
2b2f0 2a 20 73 71 6c 69 74 65 5f 69 6f 5f 6d 65 74 68  * sqlite_io_meth
2b300 6f 64 73 20 6f 62 6a 65 63 74 20 74 68 61 74 20  ods object that 
2b310 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 64  implements the d
2b320 65 73 69 72 65 64 20 6c 6f 63 6b 69 6e 67 0a 20  esired locking. 
2b330 20 2a 2a 20 62 65 68 61 76 69 6f 72 73 2e 20 20   ** behaviors.  
2b340 53 65 65 20 74 68 65 20 64 69 76 69 73 69 6f 6e  See the division
2b350 20 61 62 6f 76 65 20 74 68 61 74 20 63 6f 6e 74   above that cont
2b360 61 69 6e 73 20 74 68 65 20 49 4f 4d 45 54 48 4f  ains the IOMETHO
2b370 44 53 0a 20 20 2a 2a 20 6d 61 63 72 6f 20 66 6f  DS.  ** macro fo
2b380 72 20 61 64 64 69 74 69 6f 6e 20 69 6e 66 6f 72  r addition infor
2b390 6d 61 74 69 6f 6e 20 6f 6e 20 66 69 6e 64 65 72  mation on finder
2b3a0 2d 66 75 6e 63 74 69 6f 6e 73 2e 0a 20 20 2a 2a  -functions..  **
2b3b0 0a 20 20 2a 2a 20 4d 6f 73 74 20 66 69 6e 64 65  .  ** Most finde
2b3c0 72 73 20 73 69 6d 70 6c 79 20 72 65 74 75 72 6e  rs simply return
2b3d0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
2b3e0 66 69 78 65 64 20 73 71 6c 69 74 65 33 5f 69 6f  fixed sqlite3_io
2b3f0 5f 6d 65 74 68 6f 64 73 0a 20 20 2a 2a 20 6f 62  _methods.  ** ob
2b400 6a 65 63 74 2e 20 20 42 75 74 20 74 68 65 20 22  ject.  But the "
2b410 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72  autolockIoFinder
2b420 22 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 4d  " available on M
2b430 61 63 4f 53 58 20 64 6f 65 73 20 61 20 6c 69 74  acOSX does a lit
2b440 74 6c 65 0a 20 20 2a 2a 20 6d 6f 72 65 20 74 68  tle.  ** more th
2b450 61 6e 20 74 68 61 74 3b 20 69 74 20 6c 6f 6f 6b  an that; it look
2b460 73 20 61 74 20 74 68 65 20 66 69 6c 65 73 79 73  s at the filesys
2b470 74 65 6d 20 74 79 70 65 20 74 68 61 74 20 68 6f  tem type that ho
2b480 73 74 73 20 74 68 65 20 0a 20 20 2a 2a 20 64 61  sts the .  ** da
2b490 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20  tabase file and 
2b4a0 74 72 69 65 73 20 74 6f 20 63 68 6f 6f 73 65 20  tries to choose 
2b4b0 61 6e 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f  an locking metho
2b4c0 64 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f  d appropriate fo
2b4d0 72 0a 20 20 2a 2a 20 74 68 61 74 20 66 69 6c 65  r.  ** that file
2b4e0 73 79 73 74 65 6d 20 74 69 6d 65 2e 0a 20 20 2a  system time..  *
2b4f0 2f 0a 20 20 23 64 65 66 69 6e 65 20 55 4e 49 58  /.  #define UNIX
2b500 56 46 53 28 56 46 53 4e 41 4d 45 2c 20 46 49 4e  VFS(VFSNAME, FIN
2b510 44 45 52 29 20 7b 20 20 20 20 20 20 20 20 20 20  DER) {          
2b520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
2b530 20 20 20 20 31 2c 20 20 20 20 20 20 20 20 20 20      1,          
2b540 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65            /* iVe
2b550 72 73 69 6f 6e 20 2a 2f 20 20 20 20 20 20 20 20  rsion */        
2b560 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
2b570 20 20 73 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c    sizeof(unixFil
2b580 65 29 2c 20 20 20 20 20 2f 2a 20 73 7a 4f 73 46  e),     /* szOsF
2b590 69 6c 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ile */          
2b5a0 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
2b5b0 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2c 20 20 20  MAX_PATHNAME,   
2b5c0 20 20 20 20 20 20 2f 2a 20 6d 78 50 61 74 68 6e        /* mxPathn
2b5d0 61 6d 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ame */          
2b5e0 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 30 2c          \.    0,
2b5f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b600 20 20 20 20 2f 2a 20 70 4e 65 78 74 20 2a 2f 20      /* pNext */ 
2b610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b620 20 20 20 20 20 20 5c 0a 20 20 20 20 56 46 53 4e        \.    VFSN
2b630 41 4d 45 2c 20 20 20 20 20 20 20 20 20 20 20 20  AME,            
2b640 20 20 2f 2a 20 7a 4e 61 6d 65 20 2a 2f 20 20 20    /* zName */   
2b650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b660 20 20 20 20 5c 0a 20 20 20 20 28 76 6f 69 64 2a      \.    (void*
2b670 29 26 46 49 4e 44 45 52 2c 20 20 20 20 20 20 20  )&FINDER,       
2b680 2f 2a 20 70 41 70 70 44 61 74 61 20 2a 2f 20 20  /* pAppData */  
2b690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b6a0 20 20 5c 0a 20 20 20 20 75 6e 69 78 4f 70 65 6e    \.    unixOpen
2b6b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
2b6c0 20 78 4f 70 65 6e 20 2a 2f 20 20 20 20 20 20 20   xOpen */       
2b6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b6e0 5c 0a 20 20 20 20 75 6e 69 78 44 65 6c 65 74 65  \.    unixDelete
2b6f0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78  ,           /* x
2b700 44 65 6c 65 74 65 20 2a 2f 20 20 20 20 20 20 20  Delete */       
2b710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
2b720 20 20 20 20 75 6e 69 78 41 63 63 65 73 73 2c 20      unixAccess, 
2b730 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 41 63            /* xAc
2b740 63 65 73 73 20 2a 2f 20 20 20 20 20 20 20 20 20  cess */         
2b750 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
2b760 20 20 75 6e 69 78 46 75 6c 6c 50 61 74 68 6e 61    unixFullPathna
2b770 6d 65 2c 20 20 20 20 20 2f 2a 20 78 46 75 6c 6c  me,     /* xFull
2b780 50 61 74 68 6e 61 6d 65 20 2a 2f 20 20 20 20 20  Pathname */     
2b790 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
2b7a0 75 6e 69 78 44 6c 4f 70 65 6e 2c 20 20 20 20 20  unixDlOpen,     
2b7b0 20 20 20 20 20 20 2f 2a 20 78 44 6c 4f 70 65 6e        /* xDlOpen
2b7c0 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
2b7d0 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e          \.    un
2b7e0 69 78 44 6c 45 72 72 6f 72 2c 20 20 20 20 20 20  ixDlError,      
2b7f0 20 20 20 20 2f 2a 20 78 44 6c 45 72 72 6f 72 20      /* xDlError 
2b800 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
2b810 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78        \.    unix
2b820 44 6c 53 79 6d 2c 20 20 20 20 20 20 20 20 20 20  DlSym,          
2b830 20 20 2f 2a 20 78 44 6c 53 79 6d 20 2a 2f 20 20    /* xDlSym */  
2b840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b850 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 44 6c      \.    unixDl
2b860 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20  Close,          
2b870 2f 2a 20 78 44 6c 43 6c 6f 73 65 20 2a 2f 20 20  /* xDlClose */  
2b880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b890 20 20 5c 0a 20 20 20 20 75 6e 69 78 52 61 6e 64    \.    unixRand
2b8a0 6f 6d 6e 65 73 73 2c 20 20 20 20 20 20 20 2f 2a  omness,       /*
2b8b0 20 78 52 61 6e 64 6f 6d 6e 65 73 73 20 2a 2f 20   xRandomness */ 
2b8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b8d0 5c 0a 20 20 20 20 75 6e 69 78 53 6c 65 65 70 2c  \.    unixSleep,
2b8e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
2b8f0 53 6c 65 65 70 20 2a 2f 20 20 20 20 20 20 20 20  Sleep */        
2b900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
2b910 20 20 20 20 75 6e 69 78 43 75 72 72 65 6e 74 54      unixCurrentT
2b920 69 6d 65 2c 20 20 20 20 20 20 2f 2a 20 78 43 75  ime,      /* xCu
2b930 72 72 65 6e 74 54 69 6d 65 20 2a 2f 20 20 20 20  rrentTime */    
2b940 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
2b950 20 20 75 6e 69 78 47 65 74 4c 61 73 74 45 72 72    unixGetLastErr
2b960 6f 72 20 20 20 20 20 20 2f 2a 20 78 47 65 74 4c  or      /* xGetL
2b970 61 73 74 45 72 72 6f 72 20 2a 2f 20 20 20 20 20  astError */     
2b980 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 7d 0a            \.  }.
2b990 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 20 64  .  /*.  ** All d
2b9a0 65 66 61 75 6c 74 20 56 46 53 65 73 20 66 6f 72  efault VFSes for
2b9b0 20 75 6e 69 78 20 61 72 65 20 63 6f 6e 74 61 69   unix are contai
2b9c0 6e 65 64 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f  ned in the follo
2b9d0 77 69 6e 67 20 61 72 72 61 79 2e 0a 20 20 2a 2a  wing array..  **
2b9e0 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  .  ** Note that 
2b9f0 74 68 65 20 73 71 6c 69 74 65 33 5f 76 66 73 2e  the sqlite3_vfs.
2ba00 70 4e 65 78 74 20 66 69 65 6c 64 20 6f 66 20 74  pNext field of t
2ba10 68 65 20 56 46 53 20 6f 62 6a 65 63 74 20 69 73  he VFS object is
2ba20 20 6d 6f 64 69 66 69 65 64 0a 20 20 2a 2a 20 62   modified.  ** b
2ba30 79 20 74 68 65 20 53 51 4c 69 74 65 20 63 6f 72  y the SQLite cor
2ba40 65 20 77 68 65 6e 20 74 68 65 20 56 46 53 20 69  e when the VFS i
2ba50 73 20 72 65 67 69 73 74 65 72 65 64 2e 20 20 53  s registered.  S
2ba60 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a  o the following.
2ba70 20 20 2a 2a 20 61 72 72 61 79 20 63 61 6e 6e 6f    ** array canno
2ba80 74 20 62 65 20 63 6f 6e 73 74 2e 0a 20 20 2a 2f  t be const..  */
2ba90 0a 20 20 73 74 61 74 69 63 20 73 71 6c 69 74 65  .  static sqlite
2baa0 33 5f 76 66 73 20 61 56 66 73 5b 5d 20 3d 20 7b  3_vfs aVfs[] = {
2bab0 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
2bac0 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
2bad0 20 26 26 20 28 4f 53 5f 56 58 57 4f 52 4b 53 20   && (OS_VXWORKS 
2bae0 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  || defined(__APP
2baf0 4c 45 5f 5f 29 29 0a 20 20 20 20 55 4e 49 58 56  LE__)).    UNIXV
2bb00 46 53 28 22 75 6e 69 78 22 2c 20 20 20 20 20 20  FS("unix",      
2bb10 20 20 20 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69      autolockIoFi
2bb20 6e 64 65 72 20 29 2c 0a 23 65 6c 73 65 0a 20 20  nder ),.#else.  
2bb30 20 20 55 4e 49 58 56 46 53 28 22 75 6e 69 78 22    UNIXVFS("unix"
2bb40 2c 20 20 20 20 20 20 20 20 20 20 70 6f 73 69 78  ,          posix
2bb50 49 6f 46 69 6e 64 65 72 20 29 2c 0a 23 65 6e 64  IoFinder ),.#end
2bb60 69 66 0a 20 20 20 20 55 4e 49 58 56 46 53 28 22  if.    UNIXVFS("
2bb70 75 6e 69 78 2d 6e 6f 6e 65 22 2c 20 20 20 20 20  unix-none",     
2bb80 6e 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 20 29  nolockIoFinder )
2bb90 2c 0a 20 20 20 20 55 4e 49 58 56 46 53 28 22 75  ,.    UNIXVFS("u
2bba0 6e 69 78 2d 64 6f 74 66 69 6c 65 22 2c 20 20 64  nix-dotfile",  d
2bbb0 6f 74 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 20 29  otlockIoFinder )
2bbc0 2c 0a 20 20 20 20 55 4e 49 58 56 46 53 28 22 75  ,.    UNIXVFS("u
2bbd0 6e 69 78 2d 77 66 6c 22 2c 20 20 20 20 20 20 70  nix-wfl",      p
2bbe0 6f 73 69 78 57 66 6c 49 6f 46 69 6e 64 65 72 20  osixWflIoFinder 
2bbf0 29 2c 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b  ),.#if OS_VXWORK
2bc00 53 0a 20 20 20 20 55 4e 49 58 56 46 53 28 22 75  S.    UNIXVFS("u
2bc10 6e 69 78 2d 6e 61 6d 65 64 73 65 6d 22 2c 20 73  nix-namedsem", s
2bc20 65 6d 49 6f 46 69 6e 64 65 72 20 29 2c 0a 23 65  emIoFinder ),.#e
2bc30 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
2bc40 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
2bc50 54 59 4c 45 0a 20 20 20 20 55 4e 49 58 56 46 53  TYLE.    UNIXVFS
2bc60 28 22 75 6e 69 78 2d 70 6f 73 69 78 22 2c 20 20  ("unix-posix",  
2bc70 20 20 70 6f 73 69 78 49 6f 46 69 6e 64 65 72 20    posixIoFinder 
2bc80 29 2c 0a 23 69 66 20 21 4f 53 5f 56 58 57 4f 52  ),.#if !OS_VXWOR
2bc90 4b 53 0a 20 20 20 20 55 4e 49 58 56 46 53 28 22  KS.    UNIXVFS("
2bca0 75 6e 69 78 2d 66 6c 6f 63 6b 22 2c 20 20 20 20  unix-flock",    
2bcb0 66 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 20 29 2c  flockIoFinder ),
2bcc0 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 23  .#endif.#endif.#
2bcd0 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
2bce0 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26  _LOCKING_STYLE &
2bcf0 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  & defined(__APPL
2bd00 45 5f 5f 29 0a 20 20 20 20 55 4e 49 58 56 46 53  E__).    UNIXVFS
2bd10 28 22 75 6e 69 78 2d 61 66 70 22 2c 20 20 20 20  ("unix-afp",    
2bd20 20 20 61 66 70 49 6f 46 69 6e 64 65 72 20 29 2c    afpIoFinder ),
2bd30 0a 20 20 20 20 55 4e 49 58 56 46 53 28 22 75 6e  .    UNIXVFS("un
2bd40 69 78 2d 70 72 6f 78 79 22 2c 20 20 20 20 70 72  ix-proxy",    pr
2bd50 6f 78 79 49 6f 46 69 6e 64 65 72 20 29 2c 0a 23  oxyIoFinder ),.#
2bd60 65 6e 64 69 66 0a 20 20 7d 3b 0a 20 20 75 6e 73  endif.  };.  uns
2bd70 69 67 6e 65 64 20 69 6e 74 20 69 3b 20 20 20 20  igned int i;    
2bd80 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
2bd90 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 2f 2a 20 52  unter */..  /* R
2bda0 65 67 69 73 74 65 72 20 61 6c 6c 20 56 46 53 65  egister all VFSe
2bdb0 73 20 64 65 66 69 6e 65 64 20 69 6e 20 74 68 65  s defined in the
2bdc0 20 61 56 66 73 5b 5d 20 61 72 72 61 79 20 2a 2f   aVfs[] array */
2bdd0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 28 73  .  for(i=0; i<(s
2bde0 69 7a 65 6f 66 28 61 56 66 73 29 2f 73 69 7a 65  izeof(aVfs)/size
2bdf0 6f 66 28 73 71 6c 69 74 65 33 5f 76 66 73 29 29  of(sqlite3_vfs))
2be00 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
2be10 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72  te3_vfs_register
2be20 28 26 61 56 66 73 5b 69 5d 2c 20 69 3d 3d 30 29  (&aVfs[i], i==0)
2be30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
2be40 51 4c 49 54 45 5f 4f 4b 3b 20 0a 7d 0a 0a 2f 2a  QLITE_OK; .}../*
2be50 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74 68 65  .** Shutdown the
2be60 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
2be70 6d 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2a 0a  m interface..**.
2be80 2a 2a 20 53 6f 6d 65 20 6f 70 65 72 61 74 69 6e  ** Some operatin
2be90 67 20 73 79 73 74 65 6d 73 20 6d 69 67 68 74 20  g systems might 
2bea0 6e 65 65 64 20 74 6f 20 64 6f 20 73 6f 6d 65 20  need to do some 
2beb0 63 6c 65 61 6e 75 70 20 69 6e 20 74 68 69 73 20  cleanup in this 
2bec0 72 6f 75 74 69 6e 65 2c 0a 2a 2a 20 74 6f 20 72  routine,.** to r
2bed0 65 6c 65 61 73 65 20 64 79 6e 61 6d 69 63 61 6c  elease dynamical
2bee0 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 6f 62 6a  ly allocated obj
2bef0 65 63 74 73 2e 20 20 42 75 74 20 6e 6f 74 20 6f  ects.  But not o
2bf00 6e 20 75 6e 69 78 2e 0a 2a 2a 20 54 68 69 73 20  n unix..** This 
2bf10 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
2bf20 6f 70 20 66 6f 72 20 75 6e 69 78 2e 0a 2a 2f 0a  op for unix..*/.
2bf30 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 73 5f 65  int sqlite3_os_e
2bf40 6e 64 28 76 6f 69 64 29 7b 20 0a 20 20 72 65 74  nd(void){ .  ret
2bf50 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 0a  urn SQLITE_OK; .
2bf60 7d 0a 20 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  }. .#endif /* SQ
2bf70 4c 49 54 45 5f 4f 53 5f 55 4e 49 58 20 2a 2f 0a  LITE_OS_UNIX */.